FC2カウンター FPGAの部屋

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

FPGAの部屋

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

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

DnnWeaverをやってみる2

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

Vengineer さんにDnnWeaver は、TensorFlow をインストールすると make できるというのを教えて頂いたので、VirtualBox 上のUbuntu 16.04 にTensorFlow をインストールすることができた。
今回は、~/dnnweaver.public/fpga ディレクトリで make してみよう。
Vivado 2016.2 は2016.2 と2016.3 の間に壁があるので、インストールすることにして、インストールを行った。

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

途中省略

DnnWeaver_26_170519.png

「Fatal error: can't create arm_software/obj/standalone/standalone.o: そのようなファイルやディレクトリはありません」というエラーが出て止まってしまった。

make 後の全表示を貼っておく。

(tensorflow) masaaki@masaaki-VirtualBox2:~/dnnweaver.public/fpga$ make
Generating instructions for DnnWeaver
Config = 8 PEs, 1 PUs
Initializing DW Network
Network Name:        CIFAR10_full_deploy
Input Dimensions:    32 x 32 x 3
Number of Layers:    13

Layer Name:        conv1
Layer Type:        Convolution 5x5 - s1
Macro Layer Name:        conv1

Layer Name:        pool1
Layer Type:        Pooling 3x3 - s2

Layer Name:        relu1
Layer Type:        ReLU

Layer Name:        norm1
name: "norm1"
type: "LRN"
bottom: "pool1"
top: "norm1"
lrn_param {
  local_size: 3
  alpha: 4.99999987369e-05
  beta: 0.75
  norm_region: WITHIN_CHANNEL
}

Layer Type:        Normalization 3x3

Layer Name:        conv2
Layer Type:        Convolution 5x5 - s1

Layer Name:        relu2
Layer Type:        ReLU

Layer Name:        pool2
Layer Type:        Pooling 3x3 - s2

Layer Name:        norm2
name: "norm2"
type: "LRN"
bottom: "pool2"
top: "norm2"
lrn_param {
  local_size: 3
  alpha: 4.99999987369e-05
  beta: 0.75
  norm_region: WITHIN_CHANNEL
}

Layer Type:        Normalization 3x3

Layer Name:        conv3
Layer Type:        Convolution 5x5 - s1

Layer Name:        relu3
Layer Type:        ReLU

Layer Name:        pool3
Layer Type:        Pooling 3x3 - s2

Layer Name:        ip1
Layer Type:        FullyConnected 

Layer Name:        prob

Connecting Prev:conv1 and Next:pool1
Connecting Prev:pool1 and Next:relu1
Connecting Prev:relu1 and Next:norm1
Connecting Prev:norm1 and Next:conv2
Connecting Prev:conv2 and Next:relu2
Connecting Prev:relu2 and Next:pool2
Connecting Prev:pool2 and Next:norm2
Connecting Prev:norm2 and Next:conv3
Connecting Prev:conv3 and Next:relu3
Connecting Prev:relu3 and Next:pool3
Connecting Prev:pool3 and Next:ip1
Connecting Prev:ip1 and Next:prob
Head: conv1
Curr layer = pool1
Appending: pool1
Curr layer = relu1
Appending: relu1
Curr layer = norm1
New macro node norm1
Macro Layer Name:        norm1
Curr layer = conv2
New macro node conv2
Macro Layer Name:        conv2
Curr layer = relu2
Appending: relu2
Curr layer = pool2
Appending: pool2
Curr layer = norm2
New macro node norm2
Macro Layer Name:        norm2
Curr layer = conv3
New macro node conv3
Macro Layer Name:        conv3
Curr layer = relu3
Appending: relu3
Curr layer = pool3
Appending: pool3
Curr layer = ip1
New macro node ip1
Macro Layer Name:        ip1
Curr layer = prob
PE   : conv1 5x5 s1     |     Pool : pool1 3x3 s2     |     Act  : relu1 ReLU      
PE   : norm1 3x3        |     Pool : None             |     Act  : None            
PE   : conv2 5x5 s1     |     Pool : pool2 3x3 s2     |     Act  : relu2 ReLU      
PE   : norm2 3x3        |     Pool : None             |     Act  : None            
PE   : conv3 5x5 s1     |     Pool : pool3 3x3 s2     |     Act  : relu3 ReLU      
PE   : ip1 64x10        |     Pool : None             |     Act  : None            
**************************************************
Generating Compute Binary : hardware/include/pu_controller_bin.vh
**************************************************
Layer conv1+pool1+relu1 weight size 6144
Layer norm1 weight size 0
Layer conv2+relu2+pool2 weight size 65536
Layer norm2 weight size 0
Layer conv3+relu3+pool3 weight size 131072
Layer ip1 weight size 32800



**************************************************
generating instructions for macro layer conv1+pool1+relu1
Layer name = conv1+pool1+relu1
Layer input  Dim = <google.protobuf.pyext._message.RepeatedScalarContainer object at 0x7fd4a19cc8b8>
Layer output Dim = [1, 32, 16, 16]



**************************************************
generating instructions for macro layer norm1
Layer name = norm1
Layer input  Dim = [1, 32, 16, 16]
Layer output Dim = [1, 32, 16, 16]



**************************************************
generating instructions for macro layer conv2+relu2+pool2
Layer name = conv2+relu2+pool2
Layer input  Dim = [1, 32, 16, 16]
Layer output Dim = [1, 32, 8, 8]



**************************************************
generating instructions for macro layer norm2
Layer name = norm2
Layer input  Dim = [1, 32, 8, 8]
Layer output Dim = [1, 32, 8, 8]



**************************************************
generating instructions for macro layer conv3+relu3+pool3
Layer name = conv3+relu3+pool3
Layer input  Dim = [1, 32, 8, 8]
Layer output Dim = [1, 64, 4, 4]



**************************************************
generating instructions for macro layer ip1
Layer name = ip1
Layer input  Dim = [1, 64, 4, 4]
Layer output Dim = [1, 10, 1, 1]
**************************************************
Generating Memory Read Binary : hardware/include/rd_mem_controller.vh
**************************************************
generating memory instructions
Layer name = conv1+pool1+relu1
Layer input  Dim = <google.protobuf.pyext._message.RepeatedScalarContainer object at 0x7fd4a19cc8b8>
Layer output Dim = [1, 32, 32L, 32L]
generating memory instructions
Layer name = norm1
Layer input  Dim = [1, 32, 16, 16]
Layer output Dim = [1, 32, 16, 16]
generating memory instructions
Layer name = conv2+relu2+pool2
Layer input  Dim = [1, 32, 16, 16]
Layer output Dim = [1, 32, 16, 16]
generating memory instructions
Layer name = norm2
Layer input  Dim = [1, 32, 8, 8]
Layer output Dim = [1, 32, 8, 8]
generating memory instructions
Layer name = conv3+relu3+pool3
Layer input  Dim = [1, 32, 8, 8]
Layer output Dim = [1, 64, 8, 8]
generating memory instructions
Layer name = ip1
Layer input  Dim = [1, 64, 4, 4]
Layer output Dim = [1, 10, 1, 1]
**************************************************
Generating Memory Write Binary : hardware/include/wr_mem_controller.vh
**************************************************
generating memory instructions
Layer name = conv1+pool1+relu1
Layer output Dim = [1, 32, 16, 16]
generating memory instructions
Layer name = norm1
Layer output Dim = [1, 32, 16, 16]
generating memory instructions
Layer name = conv2+relu2+pool2
Layer output Dim = [1, 32, 8, 8]
generating memory instructions
Layer name = norm2
Layer output Dim = [1, 32, 8, 8]
generating memory instructions
Layer name = conv3+relu3+pool3
Layer output Dim = [1, 64, 4, 4]
generating memory instructions
Layer name = ip1
Layer output Dim = [1, 10, 1, 1]
**************************************************
Generating DnnWeaver Parameters : hardware/include/dw_params.vh
**************************************************
**************************************************
Generating DnnWeaver MMAP : hardware/include/mmap.txt
**************************************************
**************************************************
Generating DnnWeaver Testbench MMAP : hardware/include/tb_mmap.vh
**************************************************
#@python ../compiler/compiler.py -prototxt ../compiler/sample_prototxts/cifar10_full.prototxt -b hardware/include -fpga zynq
Synthesizing DnnWeaver
DnnWeaver: Creating Project
DnnWeaver: Top module is : zynq_wrapper
DnnWeaver: Frequency is : 150 MHz
DnnWeaver: Verilog Path is : hardware
DnnWeaver: Generating Zynq block
DnnWeaver: Generating Zynq block - done
DnnWeaver: Running Synthesis
DnnWeaver: Generating utilization report
DnnWeaver: Running Placement
DnnWeaver: Checking for Timing violations after placement
DnnWeaver: No timing violations found
DnnWeaver: Running Routing
DnnWeaver: Generating Bitfile ./synthesis-output/zynq_wrapper
DnnWeaver: Generating HDF
DnnWeaver: Generating utilization report
DnnWeaver: Done!
Compiling arm_software/src/standalone.c ...arm_software/src/standalone.c: In function 'main':
arm_software/src/standalone.c:7:34: warning: initialization from incompatible pointer type
 #define AXI_GP0_MASTER_BASE_ADDR (u16*)0x43C00000
                                  ^
arm_software/src/standalone.c:20:34: note: in expansion of macro 'AXI_GP0_MASTER_BASE_ADDR'
  volatile u32 * control_master = AXI_GP0_MASTER_BASE_ADDR;
                                  ^
arm_software/src/standalone.c:21:32: warning: initialization makes pointer from integer without a cast
  volatile u16 * rd_address   = *(control_master + 2);
                                ^
arm_software/src/standalone.c:22:32: warning: initialization makes pointer from integer without a cast
  volatile u16 * wr_address   = *(control_master + 3);
                                ^
Assembler messages:
Fatal error: can't create arm_software/obj/standalone/standalone.o: そのようなファイルやディレクトリはありません
Makefile:126: ターゲット 'arm_software/obj/standalone/standalone.o' のレシピで失敗しました
make: *** [arm_software/obj/standalone/standalone.o] エラー 1


~/dnnweaver.public/fpga ディレクトリは、Vivado のログを除くと、synthesis-output, vivado ディレクトリが新規作成されて、fsm_encoding.os, get-pip.py が増えている。
DnnWeaver_27_170519.png
  1. 2017年05月19日 05:19 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:1

VirtualBox 上のUbuntu 16.04 にTensorFlow をインストールする

Vengineer さんにDnnWeaver は、TensorFlow をインストールすると make できるというのを教えて頂いたので、VirtualBox 上のUbuntu 16.04 にTensorFlow をインストールすることにした。

Installing TensorFlow on Ubuntu”を参考にした。

まずは、
sudo apt-get update
DnnWeaver_18_170519.png

python-pip python-dev python-virtualenv をインストール。
sudo apt-get install python-pip python-dev python-virtualenv
DnnWeaver_19_170519.png

Python のバージョンを確認すると、2.7.12 だった。
python -V
DnnWeaver_20_170519.png

tensorflow ディレクトリを作成して、virtualenv 環境を生成し、virtualenv 環境をアクティベートした。
mkdir tensorflow
virtualenv --system-site-packages tensorflow/
source ~/tensorflow/bin/activate

DnnWeaver_21_170519.png

Python のバージョンに合ったTensorFlow Python package をこのWeb ページから選んで、pip でインストールする。
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.1.0-cp27-none-linux_x86_64.whl
DnnWeaver_22_170519.png
DnnWeaver_23_170519.png

このWeb ページから「動作確認」のPython コードを引用した。
DnnWeaver_24_170519.png

正常にインストールできたようだ。
  1. 2017年05月19日 04:51 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:0

DnnWeaverをやってみる1

DnnWeaver をやってみようと思う。
DnnWeaver は、「FPGA上でディープニューラルネットワーク(DNN)を加速するための最初のオープンソースのフレームワーク」(Google 翻訳使用)だそうだ。

DnnWeaver のダウンロードページを見ると、git で clone するようなので、Windows 10 上のVirtualBox でインストールしたUbuntu 16.04 を使用することにした。

まずは、Ubuntu 16.04 のホームで git clone を行った。
git clone https://bitbucket.org/hsharma35/dnnweaver.public.git
すると、dnnweaver.public ディレクトリができた。
DnnWeaver_1_170516.png

DnnWeaver のダウンロードページでは、python 2.7 と Vivado 2016.2 が必須だが、Python 2.7.12 がインストールされているし、Vivado も 2016.4 だが、インストールされているので、これでやってみることにする。

DnnWeaver のダウンロードページでは、fpga ディレクトリに行って、「make PROTOTXT=your_prototxt_here」するようにとのことだった。
dnnweaver.public/fpga に行ってみるとMakefile があった。
DnnWeaver_2_170516.png

しかし、Makefile を見ると、すでに PROTOTXT が定義されているようなので、make だけでやってみることにする。
DnnWeaver_3_170516.png

make すると、google.protobuf.internal の enum_type_wrapper が無いと言われてしまった。
caffe_pb2.py を見ると、、google.protobuf.internal や、google.protobuf からのインポートがたくさんある。
DnnWeaver_5_170516.png

これらはどうやら、googleのprotobuf というものらしい?
DnnWeaver_6_170516.png

googleのprotobufから protobuf-python-3.3.0.tar.gz をダウンロードしてホームディレクトリに解凍した。

caffe_pb2.py のインポートするべきファイルがあった。
DnnWeaver_8_170516.png

今回、protobuf のインストールは行わないで、ファイルだけを利用してみようと思う。
ファイルを利用するためにPYTHONPATH にprotobuf-3.3.0/python を追加する。
export PYTHONPATH="/home/masaaki/protobuf-3.3.0/python:$PYTHONPATH"
そして、もう一度、make を行った。
DnnWeaver_9_170516.png

やはり、エラーで今度は six モジュールが無いとのことだった。
six モジュールは pip でインストールするということで、まずは pip をインストールする。
wget https://bootstrap.pypa.io/get-pip.py
get-pip.py が取得できた。
DnnWeaver_10_170516.png

スーパーユーザー・モードで get-pip.py を起動した。
sudo python get-pip.py
DnnWeaver_11_170516.png

six モジュールをインストールする。
sudo pipinstall six
DnnWeaver_12_170516.png

make すると、今度は、descripter_pb2.py が足りないらしい。
DnnWeaver_13_170517.png

descripter_pb2.py はどうやってゲットするのか?調べていたら、「Why do I see “cannot import name descriptor_pb2” error when using Google Protocol Buffers?」がヒット。それによると、descripter_pb2.py はコンパイルして生成するものらしい?
(注:このWebサイトには、protobuf をインストールするように書いてあったが、インストールしないでやっている。結局うまく行っていないので、インストールしてみようと思う)

続きます。
  1. 2017年05月18日 05:38 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:0
»