関連記事一覧
- NVIDIAのディープラーニングアクセラレータNVDLAをVivadoでシミュレーションする
- NVDLAの勉強 (NVDLA Primerを読んでまとめる: ハードウェア編)
- NVDLAの勉強 (NVDLA Primerを読んでまとめる: ソフトウェア編)>
- NVDLA 1.0 がVerilatorに対応している(が、ビルドできるのは潤沢な資源を持つ金持ちだけ)>
- NVIDIAのオープンソース ディープラーニングアクセラレータを試す(1. NVDLAのビルドとシミュレーション環境構築)>
- NVIDIAのオープンソース ディープラーニングアクセラレータを試す(3. NVDLAの内部ブロック)>
- NVDLA Virtual Platformの試行 (1. ビルド試行 → 失敗)>
- NVDLA Virtual Platformの試行 (2. ビルド成功 → ログイン)>
NVIDIAのリリースしている、ディープラーニングアクセラレーションハードウェアのNVDLAは、実行環境としてはSynopsys社のVCSを前提として構築してあり、VCSを持っていない私のような貧乏人ではなかなかトライすることができない。
Integrator’s Manual — NVDLA Documentation
This target will just generate and execute the VCS compile command line. If test bench code is changed, this target is used to recompile and generated the VCS based simulation executable.
しかし、NVDLAのPull RequestのなかでVivado Simで動かすことができるようにインポートしたものを見つけた。これならば、貧乏人の私でもできそうだ。
NVDLAの内部動作について理解をするのが先だろうが、とりあえず何かしらシミュレーションできるものが欲しい。
Vivado SimulatorでNVDLAを動作させる
この環境はあくまでPull Requestされているもので本家にマージされているわけではないため、試行版であることに注意。 Forkされた環境から、NVDLAをCheckoutしてくる。
git clone https://github.com/nvdla/hw.git nvdla_hw
cd nvdla_hw
git remote add xalogic-linus https://github.com/xalogic-linus/hw.git
git fetch xalogic-linus
git checkout xalogic-linus
NVDLAの環境を構築するのはちょっと面倒くさい。まずは http://nvdla.org/integration_guide.html を参考に、環境を構築する。
CentOS 7.0で実行しているのだが、まずはPerlのパッケージインストールが必要だ。
sudo yum install perl-IO-Tee
cd nvdla_hw
make
ここでいくつかの質問に答える。GCCの場所とか、Javaの場所、Perlの場所などを入力すればよい。 次に、以下でRTL環境をビルドすることができる。
./tools/bin/tmake -build vmod
outdir
というディレクトリができるので、これがおそらくコンフィグレーションを指定しているものと思われる。まだ詳細は不明。
$ tree -L 2 outdir/ outdir/ ├── build.log ├── nv_large │ ├── spec │ └── vmod └── nv_small ├── spec └── vmod 6 directories, 1 file
マニュアルでは次に ./tool/bin/tmake -build verif_sim
を実行すると書いてあるが、これを実行するとVCSが動き始めてしまうので、Vivado Simulator用のディレクトリに移動してシミュレーションを実行する。
cd verif/sim_vivado make run TESTDIR=../traces/traceplayer/googlenet_conv2_3x3_int16
とすると、何やらいろいろアクセスのログを吐き出しながらVivado Simulatorでの実行が始まる。 AXI経由でのアクセスのログが表示されているようだ。
#----------------------------------------------------------- # xsim v2017.2 (64-bit) # SW Build 1909853 on Thu Jun 15 18:39:10 MDT 2017 # IP Build 1909766 on Thu Jun 15 19:58:00 MDT 2017 # Start of session at: Tue Nov 21 17:46:20 2017 # Process ID: 4868 # Current directory: /home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16 # Command line: xsim -log test.log -mode tcl -source {xsim.dir/work.top/xsim_script.tcl} # Log file: /home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16/test.log # Journal file: /home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16/xsim.jou #----------------------------------------------------------- source xsim.dir/work.top/xsim_script.tcl # xsim {work.top} -testplusarg input_file=/home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16/input.txn -testplusarg input_dir=/home/masayuki/others/nvdla_hw/verif/sim_vivado/googlenet_conv2_3x3_int16 -autoloadwcfg -runall Vivado Simulator 2017.2 Time resolution is 1 ps run -all 10570.00ns MSEQ: Backdoor mem_load of file 0.raw2 at address 0x50064080 for length 0x0000b480. 10650.00ns MSEQ: Backdoor mem_load of file 1.raw2 at address 0x5002dfe0 for length 0x00036000. 10730.00ns MSEQ: Backdoor mem_load of file 2.raw2 at address 0x500000e0 for length 0x0002da80. 10810.00ns MSEQ: write_cmd address 0xffff2c01 with data 0x00000000 (command 4294967295) 11610.00ns MSEQ: Write (command 4294967295) completed (addr: 0xffff2c01, data: 0x00000000. 11690.00ns MSEQ: read_cmd address 0xffff2c01 with data 0x00000000 and mask 0x00010001 (command 0) 12490.00ns MSEQ: Read (command 0) matched (addr: 0xffff2c01, received data: 0x00000000, expected data: 0x00000000. ...
シミュレーションが終了するまでに、Vivado Simulatorでは30分以上かかった。VCSだともっと速いのだろうが。。。
GoogleNet 以外にも、 cc_alexnet_conv5_relu5_int16_dtest_cvsram
を指定すればAlexNetを実行するができる、いくつかのSanity Checkも実行できる。
make run TESTDIR=../traces/traceplayer/cc_alexnet_conv5_relu5_int16_dtest_cvsram make run TESTDIR=../traces/traceplayer/sanity
NVDLAの仕組みについては、別エントリでまとめていこう。とりあえず、シミュレーションを実行する環境は整った。