使用 PYNQ 可以轻松在 FPGA 上实现加速 AI/ML,而无需编写一行 HDL!让我们看看如何做到这一点...
介绍
机器学习是近几年的热门话题,有许多用例和应用。Zynq 和 Zynq MPSoC 等异构 SoC 则更具显著优势,因为它们允许在可编程逻辑内实现推理网络。
在 PL 中实现推理网络可显著提高性能。当然,对于那些不熟悉机器学习的人来说,很难知道从哪里开始,尤其是如果想使用可编程逻辑来加速性能。
这就是 Pynq 框架的作用所在,它允许我们使用 Python 等更高级的语言,“访问”可编程逻辑来执行 ML 加速。
对于今天项目,我们将使用适用于 Pynq Z2、Z1 和 Ultra96 的Quantized / Binary Neural Network(BNN)。
该项目的重点是新参数的训练和应用。
在 PYNQ 上配置 BNN
Pynq 映像启动后,使用 Web 浏览器通过地址http://pynq:9090连接到 Pynq(如果要求输入密码,请输入“xilinx”)
要安装 BNN,需要使用终端窗口,可以在浏览器中通过选择新建 -> 终端打开一个新的终端
我们将使用来自 NTNU 的 Xilinx BNN 存储库的 Fork,此 Fork 可以很好地展示如何训练新网络。
sudo pip3.6 install git+https://github.com/maltanar/BNN-PYNQ.git
下载和安装需要几秒钟。
完成后,将看到一个新的 BNN 文件夹,其中有几个新的notebook。
- LFC - 全连接网络,专为 28 x 28 灰色图像输入而设计
- CNV - 专为 RGB 运算设计的卷积网络,32 x 32 输入
两者的结构如下所示。
测试安装
安装 BNN 后,下一步是运行一个(或多个)示例以确保安装可以正常运行。
对于这个例子,决定运行 Road-Signs-Batch。这个notebook使用卷积网络对路标进行分类。
此notebook仅针对由一个标志组成的小图像进行测试,之后的测试将使用包含一个标志和其他图像的大图像。在这种情况下,算法会检测标志并对其进行分类。
该算法的第一遍测试会产生几个潜在的符号候选者,如下所示。
对该初始图像应用阈值后可正确识别最终的标志上。
当然,我们可以在应用程序中使用我们自己提供的网络。
训练自己的网络
要创建我们自己的网络,我们需要几样东西,其中首先需要的是一组正确标记的训练数据。在这个例子中,我们将使用 fashion mnist 数据集训练神经网络,使其能够识别服装。
当我们为覆盖层构建新网络时,最重要的是确保我们训练的网络与我们希望使用的覆盖层上的网络相同。
Xilinx BNN GitHub 提供了一个训练目录,其中包含许多可用于创建新网络的 Python 脚本,许多脚本可以充当模板。
在 BNN github 的 BNN->SRC->Training 目录下,会发现许多可以帮助训练新网络的脚本
其中包括
- lfc.py - 描述 LFC 网络结构
- cnv.py - 描述 CNV 网络结构
- binary_net.py-包含许多有助于训练的函数
- finnthesizer.py-执行二进制格式的转换
- mnist.py - 训练 LFC 网络进行 mnist 字符识别 - LFC 网络的良好模板
- cifar10.py - 为 cifar 图像表征网络训练 CNV 网络 - CNV 网络的良好模板
在这个例子中,将使用 fashion-mnist.py,它是 mnist.py 的改编版,用于训练 LFC 网络来检测和分类服装。
为了进行此训练们需要以下东东:
- AWS 或高端 GPU
- 耐心
一旦决定了训练环境,需要做的第一件事是设置 SW 环境,确保安装了以下内容。
- Python - 包括 NumPy 和 SciPy
- Theano - 用于处理多维数组的 Python 库
- PyLearn2——机器学习的 Python 库
- Lasange - 用于构建和训练神经网络的 Python 库
在包含 GPU 的宿主机上使用以下命令:
sudo apt-get install git python-dev libopenblas-devliblapack-dev gfortran -y wget https://bootstrap.pypa.io/get-pip.py && python get-pip.py --user pip install --usergit+https://github.com/Theano/Theano.git@rel-0.9.0beta1 pip install --user https://github.com/Lasagne/Lasagne/archive/master.zip pip install --user numpy==1.11.0 git clone https://github.com/lisa-lab/pylearn2$ cd pylearn2 python setup.py develop --user
安装软件环境后,下一步就是下载训练图像和标签
可以使用以下命令下载这些。
wget -nc http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz; gunzip -f train-images-idx3-ubyte.gz wget -nc http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz; gunzip -f train-labels-idx1-ubyte.gz wget -nc http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz; gunzip -f t10k-images-idx3-ubyte.gz wget -nc http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz; gunzip -f t10k-labels-idx1-ubyte.gz
这样我们就可以开始训练了。
python fashion-mnist.py
训练完成后,我们将拥有经过训练的网络 npz 文件。
使用 WinSCP 将 npz 文件传输到 Pynq。
同时将 binary_net、fashino-mnist-gen-binary-weights 和 finnthesizer python 脚本一并上传。
在 PYNQ 上实现
在 Pynq 上运行新网络之前,需要将权重转换为二进制格式。
通过运行下面的 Python 脚本来实现这一点
python fashion-mnist-gen-binary-weights.py
这将创建一个包含所有权重的新目录。
完成后我们就可以开始创建我们自己的notebook。
在 BNN 区域下创建notebook,执行以下操作:
-
设置根目录和parameter目录 - 在parameter目录中,将找到不同训练网络的所有网络参数。
-
将 fashion-mnist 生成的权重传输到 param 目录中。不过,只需要在第一次运行此脚本时执行此操作。
一旦将参数加载到 params 目录中后,我们就要检查它们是否可以通过 LFC 网络的 available_params 函数访问。
如果安装正确,还应显示 fashion-mnist-lfc 以及最初的两个网络。
最后阶段是使用参数运行推理。为此,我们需要加载图像,将其转换为 mnist 图像格式并将其应用到网络。
然后我们可以输出推理的结果并显示图像以查看预测是否正确。
正如所看到的,它从图像输入中正确地识别出了一条裤子。
为了了解网络的总体准确度,我们可以下载并运行 10K 张标记图像。
然后我们可以批量处理图像并计算网络的整体准确度。
这相当于准确率略低于 85%,在线搜索时准确率为 84.87%,与其他fashion-MNIST 准确率相比,这略低于其他的,其他实现的准确率在 88-92% 范围内,具体取决于网络。
相关文章