FC2カウンター FPGAの部屋

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado HLS の符号付 C++の任意精度固定小数点型について

Vivado HLS の符号付 C++の任意精度固定小数点型について疑問があったので調べてみた。
Vivado HLS の C++の任意精度固定小数点型は、C++のテンプレートを使用して、ap_[u]fixed で宣言される。(Xilinx社のUser Guide 高位合成 UG902 (v2016.4) 2016年11月30日 192 ページ「C++ の任意精度固定小数点型」参照)

W :ワード長(ビット数)
I :整数部のビット長
Q :量子化モード
O :オーバーフローモード
N :折り返しモードでの飽和ビット数


符号なしC++の任意精度固定小数点型 ap_ufixed<> は問題ないが、符号付C++の任意精度固定小数点型 ap_fixed<>で整数部を1ビットにした場合は符号ビットを含むのか含まないのか?が疑問だった。
そこで、Vivado HLS 2017.1 で ap_fixed_test プロジェクトを作成して、テストしてみた。
ap_fixed_test プロジェクトを示す。
ap_fixed_test_1_170529.png

テストベンチの ap_fixed_test_tb.cpp を示す。

// ap_fixed_test_tb.cpp
// 2017/04/29
//

#include <stdio.h>
#include <ap_fixed.h>

int main(){
    ap_fixed<91, AP_TRN_ZERO, AP_SAT> a;
    float f;

    a = 0.5;
    f = a;
    printf("0.5: %f\n", f);
    a = 1.0;
    f = a;
    printf("1.0: %f\n", f);
    a = -1.0;
    f = a;
    printf("-1.0: %f\n", f);
    a = -0.5;
    f = a;
    printf("-0.5: %f\n", f);
    a = 2.0;
    f = a;
    printf("2.0: %f\n", f);
    a = -1.5;
    f = a;
    printf("-1.5: %f\n", f);
    a = -0.9;
    f = a;
    printf("-0.9: %f\n", f);
}


このテストベンチのC シミュレーション結果はすでにVivado HLS のプロジェクトの図に表示されているが、下に示す。

0.5: 0.500000
1.0: 0.996094
-1.0: -1.000000
-0.5: -0.500000
2.0: 0.996094
-1.5: -1.000000
-0.9: -0.898438


この結果から、整数部のビット長を 1 とすると、1.0 - 量子化ステップ値 ~ -1.0 までの値を取れるようだ。つまり整数部は符号を表すビットのみの 1 ビットだけということになる。
  1. 2017年05月29日 15:05 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

BNN-PYNQ のトレーニングを試してみる2

BNN-PYNQ のトレーニングを試してみる1”の続き。

前回は、Theano やpylearn2 をインストールして、mnist のトレーニングを行った。33時間20分かかってトレーニングが終了した。
今回は、その結果を見ていこう。

~/BNN-PYNQ/bnn/src/training ディレクトリに mnist_parameters.npz ができていた。

トレーニングされたmnist の重みをバイナリにしてみよう。
python DATASET-gen-binary-weights.py
を実行した。
BNN-PYNQ_58_170528.png
BNN-PYNQ_59_170528.png

表示出力の全文を示す。

masaaki@masaaki-VirtualBox2:~/BNN-PYNQ/bnn/src/training$ python mnist-gen-binary-weights.py
Extracting FCBN complex, ins = 784 outs = 1024
Layer 0: 1024 x 832, SIMD = 64, PE = 32
WMem = 416 TMem = 32
Extracting FCBN complex, ins = 1024 outs = 1024
Layer 1: 1024 x 1024, SIMD = 32, PE = 64
WMem = 512 TMem = 16
Extracting FCBN complex, ins = 1024 outs = 1024
Layer 2: 1024 x 1024, SIMD = 64, PE = 32
WMem = 512 TMem = 32
Extracting FCBN complex, ins = 1024 outs = 10
Layer 3: 16 x 1024, SIMD = 8, PE = 16
WMem = 128 TMem = 1
Config header file:



#define L0_SIMD 64
#define L0_PE 32
#define L0_WMEM 416
#define L0_TMEM 32
#define L0_MW 832
#define L0_MH 1024

#define L1_SIMD 32
#define L1_PE 64
#define L1_WMEM 512
#define L1_TMEM 16
#define L1_MW 1024
#define L1_MH 1024

#define L2_SIMD 64
#define L2_PE 32
#define L2_WMEM 512
#define L2_TMEM 32
#define L2_MW 1024
#define L2_MH 1024

#define L3_SIMD 8
#define L3_PE 16
#define L3_WMEM 128
#define L3_TMEM 1
#define L3_MW 1024
#define L3_MH 16

masaaki@masaaki-VirtualBox2:~/


すると、binparam-lfc-pynq ディレクトリができていた。
BNN-PYNQ_60_170528.png

binparam-lfc-pynq ディレクトリの中身を示す。
BNN-PYNQ_61_170528.png

これはちょうど ~/BNN-PYNQ/bnn/params/mnist ディレクトリと同じだ。
BNN-PYNQ_62_170529.png

CIFAR-10 ConvNet は、どれだけ時間がかかるか恐ろしい。今、GPU のGTX1060を購入したので、Ubuntu とWindowsのデュアルブートにして、Ubuntu でどのくらいトレーニングに時間がかかるか?調べてみたいと思う。
  1. 2017年05月29日 04:47 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:0

BNN-PYNQ のトレーニングを試してみる1

BNN-PYNQ以前もやったのだが、今回はトレーニングを試してみることにした。

BNN-PYNQ/bnn/src/training/ を参考にしてやってみることにした。
ただし、GPU は持っていないので、CPU のみでやってみる。
早速、やってみよう。
とりあえず、Installing the Training Environment: からやってみた。
VirtualBox 上のUbuntu 16.04 でやっているので、Install Nvidia Drivers, CUDA and cuDNN はやらなかった。

Install Python Packages から行った。
まずは、必要なツールをインストールした。
sudo apt-get install git python-dev libopenblas-dev liblapack-dev gfortran -y
BNN-PYNQ_40_170526.png

pip は既にインストールしていあるので省略

Theano をインストール。
pip install --user git+https://github.com/Theano/Theano.git@rel-0.9.0beta1
BNN-PYNQ_41_170526.png

Lasagne をインストール。
pip install --user https://github.com/Lasagne/Lasagne/archive/master.zip
BNN-PYNQ_42_170526.png

./theanorc を作成した。GPUの代わりにCPUを使用するように変更した。
echo "[global]" >> ~/.theanorc
echo "floatX = float32" >> ~/.theanorc
echo "device = cpu" >> ~/.theanorc
echo "openmp = True" >> ~/.theanorc
echo "openmp_elemwise_minsize = 200000" >> ~/.theanorc
echo "" >> ~/.theanorc
echo "[nvcc]" >> ~/.theanorc
echo "fastmath = True" >> ~/.theanorc
echo "" >> ~/.theanorc
echo "[blas]" >> ~/.theanorc
echo "ldflags = -lopenblas" >> ~/.theanorc

BNN-PYNQ_43_170526.png

.theanorc ができた。
BNN-PYNQ_44_170527.png
BNN-PYNQ_45_170527.png

pylearn2 のインストール。
pip install --user numpy==1.11.0 # Pylearn2 seems to not work with the latest version of numpy
git clone https://github.com/lisa-lab/pylearn2
cd pylearn2

BNN-PYNQ_46_170527.png

python setup.py develop --user

BNN-PYNQ_47_170527.png

cd ..

Download Datasets を実行した。
export PYLEARN2_DATA_PATH=~/.pylearn2
mkdir -p ~/.pylearn2
cd pylearn2/pylearn2/scripts/datasets

BNN-PYNQ_48_170527.png

mnist と cifar10 をダウンロード。
python download_mnist.py
./download_cifar10.sh

BNN-PYNQ_49_170527.png

BNN-PYNQ_50_170527.png

”export PYLEARN2_DATA_PATH=~/.pylearn2”を.bashrc に追加。
BNN-PYNQ_51_170527.png

BNN-PYNQ が古くなっていたので、消去して、git clone しなおした。
BNN-PYNQ_52_170527.png

BNN-PYNQ/bnn/src/training/ ディレクトリに移動した。
cd BNN-PYNQ/bnn/src/training/
BNN-PYNQ_53_170527.png

mnist のトレーニングをスタートした。
python mnist.py
BNN-PYNQ_54_170527.png

スタートしたのが、2017/05/27 5時10分頃だ。
現在、8時13分だが Epoch 92 だ。
BNN-PYNQ_55_170527.png

1 つのEpoch を実行するのに、約 125 秒かかっているので、1000 Epoch では、34時間43分くらいかかることになる。
ネイティブのUbuntu とGPU がとっても欲しくなった。。。

(追記)
次の日の14時30分頃、Epoch 1000 が終了しました。約33時間20分かかりました。
BNN-PYNQ_56_170528.png

best epoch: は 824 でした。それを示します。
BNN-PYNQ_57_170528.png
  1. 2017年05月27日 08:18 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:0

DnnWeaverをやってみる6(Windows 10 のVivado 2016.2でやってみた2)

DnnWeaverをやってみる5(Windows 10 のVivado 2016.2でやってみた1)”の続き。

前回は、ZYNQ7 Processing System を含むブロックデザインをPYNQボード用に変更した。今回は、ビットファイルを生成して、SDKでPYNQボードにビットファイルを書き込んで、アプリケーションソフトをコンパイルして試してみたい。

Generate Bitstream をクリックして、ビットファイルの生成を行う。
DnnWeaver_65_170523.png

論理合成、インプリメント、ビットファイルの生成を行った。Project Summary を示す。
DnnWeaver_66_170523.png

critical warning が 1 個ある。これを表示してみよう。
ROM.v で読んでいる norm_lut.vh が無いという critical warning だった。
DnnWeaver_67_170523.png

norm_lut.vh は、dnnweaver.public/fpga/hardware/include にあった。
DnnWeaver_68_170523.png

norm_lut.vh を持ってきて、Vivado のプロジェクトに追加した。
DnnWeaver_69_170523.png

論理合成、インプリメント、ビットファイルの生成を行ったところ、critical warning は無くなった。
DnnWeaver_70_170523.png

ビットファイル付きで、ハードウェアをエクスポートして、SDK を立ち上げた。
DnnWeaver_72_170524.png

standalone アプリケーション・プロジェクトを作成した。
DnnWeaver_75_170524.png

DnnWeaver_74_170524.png

dnnweaver.public/fpga/aram_software/src から platform.c と standalone.c を standalone アプリケーション・プロジェクトの src フォルダにコピーした。
DnnWeaver_75_170524.png

DnnWeaver_76_170524.png

同様に、dnnweaver.public/fpga/aram_software/lib から platform.h と platform_config.h を standalone アプリケーション・プロジェクトの src フォルダにコピーした。
DnnWeaver_77_170524.png

DnnWeaver_76_170524.png

standalone.elf ができた。
DnnWeaver_78_170524.png

PYNQボードの電源を入れて、JTAG モードにし、SDK でビットファイルをダウンロードした。(Xilinx Tools メニューからProgram FPGA を選択)
standalone.elf をデバックモードで起動して、ステップオーバーでアプリケーションソフトを実行していった。
wr_address にアドレスを読み込むところで 0xdeadbeef が読み込まれている。
DnnWeaver_79_170524.png

そのため、次にステップオーバーすると、DataAbortHandler に飛んでしまう。
DnnWeaver_80_170524.png

と言う訳で、PYNQボード用のDnnWeaver を動作させることができなかった。
  1. 2017年05月25日 05:05 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:0

DnnWeaverをやってみる5(Windows 10 のVivado 2016.2でやってみた1)

DnnWeaverをやってみる4(「PYNQ祭り」延長戦の成果)”の続き。

今まで、DnnWeaver のVivado 2016.2 のGUI では、トップレベルにいろいろなソースコードが入っていたので、これをスクリプトでまとめてビットファイルを生成していたのかと思っていた。しかしよく見てみると、zynq_wrapper.v の下に階層構造ができている。
DnnWeaver_71_170524.png

これで、ビットファイルを作ればOKじゃないか?ということで、Vivado 2016.2 単体でやってみた。
Windows 10 でやってみたいということで、Ubuntu から移行することにした。
Ubuntu 16.04 上で、File メニューからArchive Project ... を選択する。
Archive Project ダイアログが表示された。今回のコンパイル結果は、ZC702 のものなので、include run results のチェックを外してOK ボタンをクリックする。
DnnWeaver_42_170523.png

すると、dnnwever.xpr.zip が生成された。
DnnWeaver_43_170523.png

USB メモリ経由でWindows 10 に持ってきて見ているが、dnnwever.xpr.zip の中には、dnnweaver フォルダがある。
DnnWeaver_44_170523.png

dnnweaver フォルダを dnnweaver_162 として、PYNQ フォルダにコピーした。
DnnWeaver_45_170523.png

Windows 10 上のVivado 2016.2 で開いてみた。
DnnWeaver_46_170523.png

トップの zynq_wrapper.v を開いてみると、DDR とFIXED_IO だけの配線で、これだと配線位置が決まっているので、制約ファイルも要らない。
DnnWeaver_47_170523.png

さて、ZC702 からPYNQ ボード用に変更しよう。Project part のZYNQ-7 ZC702 Evaluation Board (xc7z020clg484-1) をクリックする。
DnnWeaver_48_170523.png

Project device: の… ボタンをクリックして、FPGAを変更しよう。
DnnWeaver_49_170523.png

Select Device ダイアログで、Select: を Parts にして、下の図のようにFilter を選択し、xc7z020clg400-1 を選択した。
DnnWeaver_50_170523.png

Project Settings のProject device にxc7z020clg400-1 が入った。
DnnWeaver_51_170523.png

Project Summary を見ても、Project part にxc7z020clg400-1 が入っているのが分かる。
DnnWeaver_52_170523.png

これで、ブロックデザインのzc702.bd を開くと、FPGA パーツを変更したので、IP をアップグレードする必要がある。Upgrade Selected ボタンをクリックして、IP をアップグレードする。
DnnWeaver_53_170523.png

IP をアップグレードしても、ZYNQ7 Processing System はZC702 用のままなので、いったん削除する。
DnnWeaver_54_170523.png

削除した状態を示す。
DnnWeaver_55_170523.png

新しくZYNQ7 Processing System をAdd IP した。
DnnWeaver_56_170523.png

ZYNQ7 Processing System をダブルクリックして、設定画面を開く。
Presets をクリックして、Apply Configuration を選択する。
DnnWeaver_57_170523.png

Digilent 社のPYNQ サイトのZynq Presets をダウンロードして解凍した pynq_revC.tcl を選択する。
DnnWeaver_58_170523.png

すると、PYNQ の設定がZynq Block Design に反映されているのが分かる。
DnnWeaver_59_170523.png

ついでに設定を行う。
PS-PL Configuration で、M AXI GP0 interface と S AXI HP0 interface にチェックを入れた。
DnnWeaver_60_170523.png

Clock Configuration で PL Fabric Clocks の FCLK_CLK0 を 150 MHz に設定した。
DnnWeaver_61_170523.png

配線をやり直して、ブロックデザインが完成した。
DnnWeaver_62_170523.png

次に、Address Editor で、M_AXI_GP0 を右クリックして、Assign Address を選択して、アドレスをマップした。
S_AXI_HP0 も同様にアドレスをマップした。
DnnWeaver_63_170523.png

アドレス・マップ後。
DnnWeaver_64_170523.png

これで、zc702.bd (PYNQボード用に変更はしたが名前はそのまま)は、PYNQボード用になった。
  1. 2017年05月24日 04:54 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:0

DnnWeaverをやってみる4(「PYNQ祭り」延長戦の成果)

DnnWeaverをやってみる3”の続き。

「PYNQ祭り」延長戦 : FPGAディープラーニング実践懇親会”では、DnnWeaver のARTY-Z7-20 への実装をやってみるというお題でやってみた。6 時間という時間の制限があったので、五里霧中だったときは苦しかったが、徐々に気が楽になり、気分が乗ってきた。それでも家でリラックスしてやっているときより気が付かない。やはり、私はハッカソンよりも家で家事をやりながら、やったほうがひらめくようだ。しかし、いろいろな方とお知り合いになれて、いろいろなお話ができたし、実りは多かったと思う。そうそれに、研究室の卒業生が来ていて、同じ班で、以前と同じように協力して課題に取り組めたのは良かった。昔を思い出した。彼がソフトウェアで、私がハードウェア担当でいろいろと実験コードを書いてもらいながら、協力してバグフィックスしていたのを思い出した。

そうそう、彼が、私のノートパソコンがarm-xilinx-eabi-gcc が動作しなかったので、直してくれた。64 ビットLinux から 32 ビットのアプリケーションが動作しない問題だと言っていたので、”64bit-Linuxで32bitバイナリ実行環境を構築”の辺りの解決策を試してくれたのだと思う。

さて、PYNQ祭り延長戦で分かったDnnWeaver の構成とその後、私が解明した事実を書いておく。

まずは、~/dnnweaver.public/fpga ディレクトリにある Makefile について。

Makefile
オプションについて書いておく。
test : iverilog でシミュレーションを行う。
ELF : ソフトウェアのコンパイルを行う。
launch : XMD でZynq に standalone.elf をダウンロードし、起動する。
つまり、DnnWeaver を動かすときは、make launch を実行すると動作させられるはずだったが、どこが悪かったのか?PYNQ祭り延長戦では、Arty-Z7-20 で動作しなかった。
Vivado での処理は、tcl/vivado_2016_2.tcl を呼び出して処理を行っている。

vivado_2016_2.tcl
PYNQ祭り延長戦では、DnnWeaver はXilinx 社のZC702 ボード用なので、Arty-Z7-20 に移行することを考えてみた。
vivado_2016_2.tcl の最初の部分で、FPGAの型番とボード・ファイルを指定している。Arty-Z7-20 に移行するには、ここを書き換える必要がある。
更に、ここを書き換えただけではだめで、その下で、

source tcl/zynq_1AXIHP0_1AXIGP0.tcl

でzynq_1AXIHP0_1AXIGP0.tcl を実行している。
これは、ブロックデザインを開いて、File メニューから Export -> Export Block Design... を選択したときに、出力される tcl ファイルそのものなので、ここで、Zynq のProcessing System がそのまま入ってしまう。よって、ここも書き換える必要があった。
DnnWeaver の tcl/vivado_2016_2.tcl を引用する。
DnnWeaver_34_170522.png

上の vivado_2016_2.tcl から下へ書き換えた。
まずは、FPGA はZC702 の484 ピンから 400 ピンに書き換える必要がある。
次に、Arty-Z7-20 のボード・ファイルをDigilent から持ってきて、Vivado 2016.2 にインストールした。それで、ボード・ファイルの行を書き換えている。ポイントは xilinx.com から digilentinc.com に書き換えて、バージョン番号を 1.0 にすることだった。
次に、zynq_1AXIHP0_1AXIGP0.tcl の代わりに、Arty-Z7-20 用の zc702.tcl を作ったので、それを実行するように書き換えた。zc702.tcl の出力方法については後述する。
DnnWeaver の tcl/vivado_2016_2.tcl を引用してArty-Z7-20 用に書き換えた。
DnnWeaver_35_170522.png

zc702.bd
zc702.bd を Arty-Z7-20 用に変更する。すでにDigilent 社のボード・ファイルをVivado 2016.2 に入れてあるものする。
Vivado 2016.2 を起動して、~/dnnweaver.public/fpga/vivado/dnnweaver.xpr を読み込ませる。
Vivado のGUI 画面を示す。ZC702 用に設定されている。
DnnWeaver_36_170522.png

Preject part の ZYNQ-7 ZC702 をクリックして、Arty-Z7-20 に変更しよう。
クリックすると、Project Settings ダイアログが表示される。右の・・・ボタンをクリックして、Arty-Z7-20 に変更した。これでOK ボタンをクリックする。
DnnWeaver_37_170522.png

これでボード・ファイルをArty-Z7-20 に変更できた。IP のアップグレードを求められるので、行う。
それでもZynq のProcessing System は更新されていない。更新するためには、いったん削除して、もう一度、Add IP する必要がある。
DnnWeaver_38_170522.png

Arty-Z7-20 用のZynq のProcessing System を追加したら、S_AXI_HP0 interface のチェックボックスにチェックを入れる。
DnnWeaver_39_170522.png

次に、PL Fabric Clocks の FCLK_CLK0 にチェックを入れる。
DnnWeaver_40_170522.png

これでブロックデザインが完成した。
次に、このブロックデザインを生成するためのTCL スクリプトを生成しよう。
File メニューから Export -> Export Block Design... を選択すると、Export Block Design ダイアログが表示される。この際に、ブロックデザイン名の TCL スクリプトが生成される。名前が気に入らなければ、名前を変更する。
DnnWeaver_41_170522.png

このように、Arty-Z7-20 用に変更されたブロックデザイン生成用 tcl ファイルを得ることができた。
tcl/vivado_2016_2.tcl はすでに zc702.tcl が動作するように書き換えてある。

これで、もう一度、make を行うと Arty-Z7-20 用に変更されてビルドを行うことができた。
PYNQ祭り延長戦では、VirtualBox 上のUbuntu 16.04 から make launch を行って、接続されたArty-Z7-20 を動作させようとしたが、うまく動作しなかった。
そこで、/fpga/synthesis-output ディレクトリをUSB メモリにコピーして、Windows 10 のVivado SDK でプロジェクトを作成した。
.hdf ファイルを読み込むと SDK のハードウェア・プラットフォームが生成できる。詳しくは、FPGAプログラミング大全 Xilinx編の巻末の説明を参照のこと。
SDK のプラットフォームに standalone プロジェクトを作成して、~/dnnweaver.public/fpga/arm_software/src/standalone.c, platform.c と ~/dnnweaver.public/fpga/arm_software/lib の platform.h, platform_config.h などをコピー & ペーストをしてアプリケーション・プロジェクトを作成した。それをデバックモードで動作させたが、どこかのレジスタが 0xdeadbeef で動作しなかった。残念。
SDK は他の人に任せたので、詳しい説明になっていない。
次は、Vivado のGUI でインプリメントできたので、それをブログに書いておこうと思う。
  1. 2017年05月22日 05:28 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:0

DnnWeaverをやってみる3

DnnWeaverをやってみる2”の続き。

前回は、エラーで終了してしまったので、今回はそのエラーの解消を図る。

実は、コメント欄で解決方法を教えてもらったのだ。管理人のみ閲覧できますコメントだったのでお名前は書かないがありがとうございます。
教えてもらったことをやってみよう。それは、ディレクトリを作ろうということだった。
~/dnnweaver.public/fpga/arm_software ディレクトリの下に、obj ディレクトリを作って、その下に、standalone 、linux ディレクトリを作る。
cd ~/dnnweaver.public/fpga/arm_software
ls
mkdir obj
ls
cd obj
mkdir standalone
mkdir linux
ls

DnnWeaver_28_170520.png

次に、~/dnnweaver.public/fpga ディレクトリに戻って、make を行った。
cd ~/dnnweaver.public/fpga
make

DnnWeaver_29_170520.png
DnnWeaver_30_170520.png

成功した。
synthesis-output ディレクトリを見てみよう。
DnnWeaver_31_170520.png

zynq_wrapper.bit、 zynq_wapper.hdf、 standalone.elf、 linux.elf がある。

vivado ディレクトリに行ってみた。dnnweaver.xpr がある。
DnnWeaver_32_170520.png

vivado 2016.2 を起動してdnnweaver.xpr を開いてみたが、トップのファイルがないな。。。GUIはこのままでは使えないね。
DnnWeaver_33_170520.png

今日は、「PYNQ祭り」延長戦 : FPGAディープラーニング実践懇親会に行くのでこれまでとします。
  1. 2017年05月20日 04:39 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:0
»