2017年7月31日月曜日

GTX1050Ti と Tesla m2050

Deep learningの学習用にGTX1050Tiを購入した。

実はこれより前に、AmazonにTesla m2050の中古品が\3,680という破格値で出てたので購入した。見るからにゴツく、補助電源も2本必要というとっても電力を喰いそうなボードだ。パネルがついていないのでサーバーで使われていたものかも知れない。

PCにセットして動作させてみたところ問題なく動作し、NVIDIAからダウンロードしたCUDAのsampleプログラムも動作した。

…しかし残念ながらdeep learningには使えない。
NVIDIAのGPUにはCompute Capability(CC値)という性能指標のようなものがあり、このm2050は3.0だそうだが、Deep learningにはCC値が3.0以上のものでないと使えないそうだ。
https://www.tensorflow.org/install/install_sources
http://www.arcbrain.jp/support/NVIDIA/Deep_Learning/

そこで、CC値が3.0以上でDeep larningに使える安価なGPUは無いか探したところ、GTX1050Tiが使えることが判り、購入した。(GTX1050TiのCC値は6.1) この他にGTX1080Tiというのもあるが、価格が10万円近いので個人用に買うにはチョト、いや、かなり厳しい。



GTX1080Tiはm2050同様補助電源が必要だが、GTX1050Tiは補助電源不要という点もうれしいところだ。

「TensorFlowで学ぶディープラーニング入門」という書籍の「Chapter05/MNIST double layer CNN classification」を使って、CPUで演算した場合とGPUで演算した場合の性能差を見てみた。
cpuで演算するtensorflowライブラリを使用した場合は67分掛かった。
これに対してgpuで演算するtensorflowライブラリの場合は3分22秒だった。

約20倍の性能差があるということか。
ただし、使用しているCPUはAMDのAMD FX4170なのでXeon等と比べると演算性能は低い。
また、cpu演算版tensorflowライブラリはSSE等の命令を使っていないライブラリなので、それらを使うようにすれば性能は上がるかもしれない。一方GTX1050Tiの方はPCI Expressが3.0だが、使っているPCのマザーボードのPCI Expressは2.0のため2.0として動作している。PCI Express 3.0は2.0に対してスループットが2倍なので、PCI Express 3.0仕様のマザーボードにすればこちらも性能が上がる可能性がある。要するにどちらもまだ伸び代(高速化の余地)はあるということだ。




2017年7月30日日曜日

TE0720 No.2 (petalinux-image-full の build とインストール)

TE0720には出荷時設定でPetalinuxがインストールされているが、これは最小構成のものなので linux が動くということは判るがそれ以上のことはできそうにない。 GCCなどの開発ツールも入ったもっとリッチな環境にしたいし、いい機会なのでPetalinuxのビルドをやってみることにした。
基本的なビルド方法については、TrenzのWikiページを参考にした。

PetaLinux KICKstart
https://wiki.trenz-electronic.de/display/PD/PetaLinux+KICKstart#PetaLinuxKICKstart-PetalinuxProjectCreation-ShortHOWTO

Reference Design
http://www.trenz-electronic.de/fileadmin/docs/Trenz_Electronic/TE0720/Reference_Design/2016.4/test_board/te0720-test_board_noprebuilt-vivado_2016.4-build_08_20170529092723.zip

上記 Wiki にしたがってビルドしてできるPetalinuxはTE0720に入っているのと同じ最小構成のものだ。これをカスタマイズしたいが、 petalinux-config -c rootfs で1項目づつ追加する方法は面倒くさすぎてとてもじゃないがやってられない。 他になにか方法はないかと調べてみたところ、Petalinux-v2017.2-final には petalinux-image-full.bb というレシピファイルが存在することが判った。
※. petalinux-image-full.bbはインストレーションファイルのPetaLinux 2017.2 オープン コンポーネント ソース コード(petalinux-v2017.2-open_components.tar.gz)に含まれているのでpetalinux-v2017.2-final-installer.runと共にこれもインストールする必要がある。 (2018.08.19追記)

その内容を見るとgccの開発環境やX、openCV等、全部入りのレシピのようだ。

で、試行錯誤した結果、なんとかビルドすることが出来、望みのリッチな環境にすることができた。

やり方としてはちょっとダサいが、上記 Petalinux KICKstart に準じて最小構成のビルドをした後、oe-init-build-envをsourceし bitbake コマンドで rootfs のみ、即ち、 petalinux-image-full のみをビルドした。 因みに、oe-init-build-env はPetalinux インストールディレクトリ下のpetalinux-v2017.2-final/components/yocto/source/arm/layers/coreディレクトリにある。

以下、その手順

1. TE0720用最小構成のPetalinuxのビルド
 TE0720用のvivadoのhdfファイルと、device-tree、fsblが必要なので、上記 Reference Designをダウンロードし、_readme.txt に従って vivado 2016.4 でプロジェクトの生成まで実行し終了する。 petalinux-image-full.bb はpetalinux-v2016.4-finalには存在せず、petalinux-v2017.2-finalに存在するので、hdfファイルもvivado 2017.2で生成する必要がある。そのため、vivado 2016.4で生成したプロジェクトをvivado 2017.2で開き直し、そのバージョンでbitstream生成しhardwareのエクスポートをする必要がある。

次に、test_board/os ディレクトリ下に petalinux のプロジェクトを生成する。実際はプロジェクトを生成するディレクトリはどこでも良いが Reference Desginはtest_board/os 下に作成しているのでそれに準じた。


作成したTE0720ディレクトリ下にvivadoでエクスポートしたhdfファイルをコピーし、petalinux-config を実行する。



Configurationメニューが開くのでコンソール用シリアルポートやrootfs関連を設定する。

・ コンソール用シリアルポートは初期状態ではps7_uart_1になっているが、TE0720はps7_uart_0をコンソール用シリアルポートとしているのでps7_uart_0に変更する。
 トップメニューから、Subsystem AUTO Hardware Settings > Serial Settings > Primary stdin/stdout へと進み、ps7_uart_0を選択する。

・ Root filesystemの格納先をINITRAMFSからSDカードに変更する。
 トップメニューから、Image Packaging Configuration > Root filesystem type へと進み、SD cardを選択する。

・ デバイスツリー dtb イメージの格納先をSDカードに変更する。
 トップメニューから、Subsystem AUTO Hardware Settings > Advanced bootable images storage Settings > dtb image settings > image storage media へと進み、primary sdを選択する。

以上の項目を設定したらSaveしてConfiguration画面をExitする。
次に、fsbl等をTE0720用に変更したいところだが、build コマンドを実行しないと変更対象のfsblファイル群が生成されないので、ここで petalinux-build コマンドを実行する。

ビルド終了後、device-tree ファイルとfsblの変更を行う。

・Reference Designのsystem_top.dtsをsystem-user.dtsiにコピー
  test_board/os 下で、
  cp ./petalinux/project-spec/meta-user/recipes-dt/device-tree/files/system-top.dts./TE0720/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
  し、system_user.dtsiの1,3〜10行目を削除する。
変更前

変更後


・ fsblの変更
  Reference Designのfsbl_hooks.c、te_fsbl*.* をTE0720プロジェクトのfsblディレクトリ下にコピーする。
   test_board/os/TE0720 下で、
   cp ../../sw_lib/sw_apps/zynq_fsbl/src/fsbl_hooks.c  ./components/plnx_workspace/fsbl/src/fsbl_hooks.c
   cp ../../sw_lib/sw_apps/zynq_fsbl/src/te_fsbl*.*  ./components/plnx_workspace/fsbl/src/

  fsbl_hooks.cはFsblHookBeforeHandoff()関数からte_FsblHookBeforeHandoff()をコールするように変更されており、te_FsblHookBeforeHandoff()ではイーサネットのMACアドレスの設定やUSB-PHYのリセット等を行っている。USB-PHYのリセットはTE0720のシステムコントローラを介して行うようになっており、このシステムコントローラのI/FはI2Cで、Reference DesignではPSのIIC_1に接続されている。

上記変更後、再度 petalinux_build コマンドを実行する。
ビルドが完了したら、BOOT.BINを作成しておく。
test_boars/os/TE0720/images/linuxディレクトリに移動し、petalinux-packageコマンドでBOOT.binを生成する。

 
…と、ここまでが最小構成のPetalinux作成。ふぅ〜

2. petalinux-image-full のビルド
oe-init-build-envをsourceする。

次にbitbakeコマンドでpetalinux-image-fullをビルドする。

ここで必要なのはrootfsのみであるので -c do_image_cpioを付加する。また、これを付けないと、u-bootやfsblもビルドしにいってエラーになるので必ず付ける。

ビルドが始まった様子

ビルドが始まるとインタネット上のリポジトリからソースファイルを並列的に取得している様子で、ネットワーク負荷が重くなり、他のブラウザ等からのネットアクセスが一時的に出来なくり、暫くすると復旧するが、ビルド完了までにはかなり時間がかかる。特に上記のChecking sstate mirror object availabilityはもしかしてプログラムがハングアップしてんのか?って位に進捗が判りづらい。

ビルド中

ビルド成功


この方法の場合、イメージファイルはimage/linux/下ではなく、build/tmp/work/plnx_arm-xilinx-linux-gnueabi/petalinux-image-full/1.0-r0/deploy-petalinux-image-full-image-complete下に生成される。


これで全部入りのrootfsが出来た。 やったー \(^_^)/

SDカードに焼いて動くかどうかを見てみる。
SDカードにFAT32とext4形式の2つのパーティションを作成する。

FAT32にはimage/linuxディレクトリ下のBOOT.bin、image.ub、system.dtbをコピーする。

ext4パーティションにはrootfsをコピーするが、imageファイルがcpio形式なのでext4ディレクトリ上で以下のように展開する。

cpioファイルへのパスが長過ぎるのでシンボリックリンクを貼ってからcpioにそのファイル名を与えた。展開後は削除する。

展開できた。

syncコマンドを実行後SDカードをアンマウントし、TE0720に装着して起動すると無事Linuxが起動し、ログインプロンプトが表示された。

が、ここで問題発生。rootのパスワードが不明。どうやら root ではないようだ。
そこで、SDカードを開発PCにマウントしなおして、etc/passwdとetc/shadowをsudo vi で開いてrootのパスワードの部分を消去した。

passwdファイルのroot:x:0:0:・・・のx(shadowフアイルは*)を削除


これで、パスワード無しでログインできる。
ログイン後はパスワードを設定しておく。

/bin, /sbin, /usr/bin 等の各ディレクトリ下を見てみた。

/bin


/sbin


/usr/bin


/usr/sbin


/usr/libexec


/usr/include


gcc, pythonのバージョン


X WindowのウィンドウマネージャはMatchboxが入っている。


これだけ入っていれば色々遊べるだろう。


GTX1050Ti と Tesla m2050 No.2 (BNN-PYNQのtrainingをやってみた)

BNN-PYNQのtraining(学習)をやってみた。  手順は https://github.com/Xilinx/BNN-PYNQ/tree/master/bnn/src/training に記載されており、特に判りづらい点はなかった。 ・ mnist.py 実行...