NVDLAの動かし方についてもう少しプログラミングモデルを解き明かしていきたいが、いかんせん内部レジスタの仕様を読み進めながらでは効率が悪くて良くない。
それに実際のニューラルネットワークを使いながらインタフェースを見ていかないと、意味が分からないことになってしまう。 sanityテストと、わずかなConvolutionテストだけを使って内部構成を把握するのはかなり厳しい気がしてきた。
そこで、テストパタンやC言語で書かれたプログラムを用いて、NVDLAを実際に動かして推論を行うコードを見ながら調査を進めていくことにした。 真っ向から解析していっても全く埒が明かないので、少し視点を変えてみようという訳だ。
NVDLAにはハードウェアのデザインだけでなく、ソフトウェアのリポジトリも用意されている。
- NVDLA Open source Hardware 1.0
- NVDLA Open source softwea
- NVDLA Open source Virtual Platform
ソフトウェアのリポジトリの使い方をいろいろと調べていた。nvdla_compiler
とnvdla_runtime
というのが気になっている。
- NVDLA - Test applications
Test applications — NVDLA Documentation
nvdla_compiler
というコマンドを使用すれば、NVDLAに食わすことができるバイナリを生成できそうな気がする。
その時に必要な入力は、prototxt
とcaffemodel
というものらしい。どうやら、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
に食わせてみた。
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.protobuf
とbasic.nvdla
が生成された。
ProtoBufってことは、Protocol Bufferが使われているのかなあ。ということはバイナリを見ただけでは分からないな。
実際にこの生成されたファイルを使用するためには、NVDLAのVirtual Platformの環境を使用しなければならないらしい。 これにはnvdla_vpとnvdla_runtimeを使用しなければならないのだが、これの解析は後日とする。