使用 PYNQ 訓(xùn)練和實(shí)現(xiàn) BNN
掃描二維碼
隨時(shí)隨地手機(jī)看文章
使用 PYNQ 可以輕松在 FPGA 上實(shí)現(xiàn)加速 AI/ML,而無(wú)需編寫(xiě)一行 HDL!讓我們看看如何做到這一點(diǎn)...
介紹
機(jī)器學(xué)習(xí)是近幾年的熱門話題,有許多用例和應(yīng)用。Zynq 和 Zynq MPSoC 等異構(gòu) SoC 則更具顯著優(yōu)勢(shì),因?yàn)樗鼈冊(cè)试S在可編程邏輯內(nèi)實(shí)現(xiàn)推理網(wǎng)絡(luò)。
在 PL 中實(shí)現(xiàn)推理網(wǎng)絡(luò)可顯著提高性能。當(dāng)然,對(duì)于那些不熟悉機(jī)器學(xué)習(xí)的人來(lái)說(shuō),很難知道從哪里開(kāi)始,尤其是如果想使用可編程邏輯來(lái)加速性能。
這就是 Pynq 框架的作用所在,它允許我們使用 Python 等更高級(jí)的語(yǔ)言,“訪問(wèn)”可編程邏輯來(lái)執(zhí)行 ML 加速。
對(duì)于今天項(xiàng)目,我們將使用適用于 Pynq Z2、Z1 和 Ultra96 的Quantized / Binary Neural Network(BNN)。
該項(xiàng)目的重點(diǎn)是新參數(shù)的訓(xùn)練和應(yīng)用。
在 PYNQ 上配置 BNN
Pynq 映像啟動(dòng)后,使用 Web 瀏覽器通過(guò)地址http://pynq:9090連接到 Pynq(如果要求輸入密碼,請(qǐng)輸入“xilinx”)
要安裝 BNN,需要使用終端窗口,可以在瀏覽器中通過(guò)選擇新建 -> 終端打開(kāi)一個(gè)新的終端
我們將使用來(lái)自 NTNU 的 Xilinx BNN 存儲(chǔ)庫(kù)的 Fork,此 Fork 可以很好地展示如何訓(xùn)練新網(wǎng)絡(luò)。
sudo pip3.6 install git+https://github.com/maltanar/BNN-PYNQ.git
下載和安裝需要幾秒鐘。
完成后,將看到一個(gè)新的 BNN 文件夾,其中有幾個(gè)新的notebook。
- LFC - 全連接網(wǎng)絡(luò),專為 28 x 28 灰色圖像輸入而設(shè)計(jì)
- CNV - 專為 RGB 運(yùn)算設(shè)計(jì)的卷積網(wǎng)絡(luò),32 x 32 輸入
兩者的結(jié)構(gòu)如下所示。
測(cè)試安裝
安裝 BNN 后,下一步是運(yùn)行一個(gè)(或多個(gè))示例以確保安裝可以正常運(yùn)行。
對(duì)于這個(gè)例子,決定運(yùn)行 Road-Signs-Batch。這個(gè)notebook使用卷積網(wǎng)絡(luò)對(duì)路標(biāo)進(jìn)行分類。
此notebook僅針對(duì)由一個(gè)標(biāo)志組成的小圖像進(jìn)行測(cè)試,之后的測(cè)試將使用包含一個(gè)標(biāo)志和其他圖像的大圖像。在這種情況下,算法會(huì)檢測(cè)標(biāo)志并對(duì)其進(jìn)行分類。
該算法的第一遍測(cè)試會(huì)產(chǎn)生幾個(gè)潛在的符號(hào)候選者,如下所示。
對(duì)該初始圖像應(yīng)用閾值后可正確識(shí)別最終的標(biāo)志上。
當(dāng)然,我們可以在應(yīng)用程序中使用我們自己提供的網(wǎng)絡(luò)。
訓(xùn)練自己的網(wǎng)絡(luò)
要?jiǎng)?chuàng)建我們自己的網(wǎng)絡(luò),我們需要幾樣?xùn)|西,其中首先需要的是一組正確標(biāo)記的訓(xùn)練數(shù)據(jù)。在這個(gè)例子中,我們將使用 fashion mnist 數(shù)據(jù)集訓(xùn)練神經(jīng)網(wǎng)絡(luò),使其能夠識(shí)別服裝。
當(dāng)我們?yōu)楦采w層構(gòu)建新網(wǎng)絡(luò)時(shí),最重要的是確保我們訓(xùn)練的網(wǎng)絡(luò)與我們希望使用的覆蓋層上的網(wǎng)絡(luò)相同。
Xilinx BNN GitHub 提供了一個(gè)訓(xùn)練目錄,其中包含許多可用于創(chuàng)建新網(wǎng)絡(luò)的 Python 腳本,許多腳本可以充當(dāng)模板。
在 BNN github 的 BNN->SRC->Training 目錄下,會(huì)發(fā)現(xiàn)許多可以幫助訓(xùn)練新網(wǎng)絡(luò)的腳本
其中包括
- lfc.py - 描述 LFC 網(wǎng)絡(luò)結(jié)構(gòu)
- cnv.py - 描述 CNV 網(wǎng)絡(luò)結(jié)構(gòu)
- binary_net.py-包含許多有助于訓(xùn)練的函數(shù)
- finnthesizer.py-執(zhí)行二進(jìn)制格式的轉(zhuǎn)換
- mnist.py - 訓(xùn)練 LFC 網(wǎng)絡(luò)進(jìn)行 mnist 字符識(shí)別 - LFC 網(wǎng)絡(luò)的良好模板
- cifar10.py - 為 cifar 圖像表征網(wǎng)絡(luò)訓(xùn)練 CNV 網(wǎng)絡(luò) - CNV 網(wǎng)絡(luò)的良好模板
在這個(gè)例子中,將使用 fashion-mnist.py,它是 mnist.py 的改編版,用于訓(xùn)練 LFC 網(wǎng)絡(luò)來(lái)檢測(cè)和分類服裝。
為了進(jìn)行此訓(xùn)練們需要以下東東:
- AWS 或高端 GPU
- 耐心
一旦決定了訓(xùn)練環(huán)境,需要做的第一件事是設(shè)置 SW 環(huán)境,確保安裝了以下內(nèi)容。
- Python - 包括 NumPy 和 SciPy
- Theano - 用于處理多維數(shù)組的 Python 庫(kù)
- PyLearn2——機(jī)器學(xué)習(xí)的 Python 庫(kù)
- Lasange - 用于構(gòu)建和訓(xùn)練神經(jīng)網(wǎng)絡(luò)的 Python 庫(kù)
在包含 GPU 的宿主機(jī)上使用以下命令:
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
安裝軟件環(huán)境后,下一步就是下載訓(xùn)練圖像和標(biāo)簽
可以使用以下命令下載這些。
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
這樣我們就可以開(kāi)始訓(xùn)練了。
python fashion-mnist.py
訓(xùn)練完成后,我們將擁有經(jīng)過(guò)訓(xùn)練的網(wǎng)絡(luò) npz 文件。
使用 WinSCP 將 npz 文件傳輸?shù)?Pynq。
同時(shí)將 binary_net、fashino-mnist-gen-binary-weights 和 finnthesizer python 腳本一并上傳。
在 PYNQ 上實(shí)現(xiàn)
在 Pynq 上運(yùn)行新網(wǎng)絡(luò)之前,需要將權(quán)重轉(zhuǎn)換為二進(jìn)制格式。
通過(guò)運(yùn)行下面的 Python 腳本來(lái)實(shí)現(xiàn)這一點(diǎn)
python fashion-mnist-gen-binary-weights.py
這將創(chuàng)建一個(gè)包含所有權(quán)重的新目錄。
完成后我們就可以開(kāi)始創(chuàng)建我們自己的notebook。
在 BNN 區(qū)域下創(chuàng)建notebook,執(zhí)行以下操作:
-
設(shè)置根目錄和parameter目錄 - 在parameter目錄中,將找到不同訓(xùn)練網(wǎng)絡(luò)的所有網(wǎng)絡(luò)參數(shù)。
-
將 fashion-mnist 生成的權(quán)重傳輸?shù)?param 目錄中。不過(guò),只需要在第一次運(yùn)行此腳本時(shí)執(zhí)行此操作。
一旦將參數(shù)加載到 params 目錄中后,我們就要檢查它們是否可以通過(guò) LFC 網(wǎng)絡(luò)的 available_params 函數(shù)訪問(wèn)。
如果安裝正確,還應(yīng)顯示 fashion-mnist-lfc 以及最初的兩個(gè)網(wǎng)絡(luò)。
最后階段是使用參數(shù)運(yùn)行推理。為此,我們需要加載圖像,將其轉(zhuǎn)換為 mnist 圖像格式并將其應(yīng)用到網(wǎng)絡(luò)。
然后我們可以輸出推理的結(jié)果并顯示圖像以查看預(yù)測(cè)是否正確。
正如所看到的,它從圖像輸入中正確地識(shí)別出了一條褲子。
為了了解網(wǎng)絡(luò)的總體準(zhǔn)確度,我們可以下載并運(yùn)行 10K 張標(biāo)記圖像。
然后我們可以批量處理圖像并計(jì)算網(wǎng)絡(luò)的整體準(zhǔn)確度。
這相當(dāng)于準(zhǔn)確率略低于 85%,在線搜索時(shí)準(zhǔn)確率為 84.87%,與其他fashion-MNIST 準(zhǔn)確率相比,這略低于其他的,其他實(shí)現(xiàn)的準(zhǔn)確率在 88-92% 范圍內(nèi),具體取決于網(wǎng)絡(luò)。