FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

NVDLAの内部構成調査(4. NVDLA_compiler と Caffeデータの変換)

NVDLAの動かし方についてもう少しプログラミングモデルを解き明かしていきたいが、いかんせん内部レジスタの仕様を読み進めながらでは効率が悪くて良くない。

それに実際のニューラルネットワークを使いながらインタフェースを見ていかないと、意味が分からないことになってしまう。 sanityテストと、わずかなConvolutionテストだけを使って内部構成を把握するのはかなり厳しい気がしてきた。

そこで、テストパタンやC言語で書かれたプログラムを用いて、NVDLAを実際に動かして推論を行うコードを見ながら調査を進めていくことにした。 真っ向から解析していっても全く埒が明かないので、少し視点を変えてみようという訳だ。

NVDLAにはハードウェアのデザインだけでなく、ソフトウェアのリポジトリも用意されている。

  • NVDLA Open source Hardware 1.0

github.com

  • NVDLA Open source softwea

github.com

  • NVDLA Open source Virtual Platform

github.com

ソフトウェアのリポジトリの使い方をいろいろと調べていた。nvdla_compilernvdla_runtimeというのが気になっている。

  • NVDLA - Test applications

Test applications — NVDLA Documentation

nvdla_compilerというコマンドを使用すれば、NVDLAに食わすことができるバイナリを生成できそうな気がする。 その時に必要な入力は、prototxtcaffemodelというものらしい。どうやら、Caffeで生成されるもののようだ。

CaffeどころかTensorFlowもろくに使いこなせていないが、バイナリだけ作ってCaffeのモデルを入力するだけでバイナリが作られるのならば、やりようがあるのかもしれない。

./nvdla_compiler [-options] –prototxt <prototxt_file> –caffemodel <caffemodel_file> -o <outputpath>

Caffeの構築

まずはCaffeをダウンロードして手元の環境でモデルを作ることができる環境を整えた。

環境の構築は、 https://gist.github.com/nikitametha/c54e1abecff7ab53896270509da80215 を参考にした。OpenCVやら各種ライブラリのインストールに時間がかかってしまった。

make all -j8

CaffeのLenetサンプルプログラムのビルド

Caffeのサンプルプログラムである、MNISTをLeNetで動かすプログラムは以下でコンパイルできるらしい。

./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
./examples/mnist/train_lenet.sh

すると、examples/mnistに目的のファイルが生成される。これをnvdla_compilerに食わせてみた。

f:id:msyksphinz:20180902235659p:plain
nvdla_compiler --caffemodel lenet_iter_10000.caffemodel --prototxt lenet.prototxt
creating new wisdom context...
opening wisdom context...
parsing caffe network...
libnvdla<3> mark prob
Marking total 1 outputs
attaching parsed network to the wisdom...
compiling profile "basic"...
libnvdla<3> compile network
libnvdla<3> compile349
libnvdla<2> Prototxt input batch size (N = 64) != Profile batch size (N = 1). Preferring N from profile for compiling.
profile compiled "basic"...
closing wisdom context...

output.protobufbasic.nvdlaが生成された。 ProtoBufってことは、Protocol Bufferが使われているのかなあ。ということはバイナリを見ただけでは分からないな。

実際にこの生成されたファイルを使用するためには、NVDLAのVirtual Platformの環境を使用しなければならないらしい。 これにはnvdla_vpとnvdla_runtimeを使用しなければならないのだが、これの解析は後日とする。