前回、CMTKを頑張ってソースコードからインストールしようとして、途中で大量のエラーが出て失敗してしまった。いったい何が駄目だったのだろう?
良く見てみると、僕の環境はUbuntu-12.10を使っていた。これが古すぎるのかもしれない。Ubuntu-15.10のVagrantの環境を再構築して、再度やってみよう。 さらに、面倒なGPUオプションは全部省略してみる。
If you do NOT intent to use any GPUs with CNTK and will rely on the CPU only, you may skip directly to the next general section. Otherwise proceed further. なーんだ。じゃあGPUのところはとりあえず全部省略。一度GPU向けの専用マシンを立ち上げてみたいなあ。
ソースコードからのインストール(Ubuntu15.10 + CPUオプションのみでリトライ)
基本的には上記のインストールのサイトに従って進めていった。途中で.bashrcにいろいろ追記してsourceし直さなければならない所があるので注意すること。
gccのインストール
これは他環境でもハマりそうなので注意だが、GCC は4.8以上を利用すること。-std=c++11オプションが出てきてハマる。
ACMLのインストール
これもWikiに書いてあるバージョンをそのままインストールするのがベター。Microsoftのツールはバージョンを変えるとハマりやすい?
Setup CNTK on Linux · Microsoft/CNTK Wiki · GitHub
OpenMPIのインストール
これはコピペのままいける。
Setup CNTK on Linux · Microsoft/CNTK Wiki · GitHub
GPU特有のパッケージ
今回は省略。
Setup CNTK on Linux · Microsoft/CNTK Wiki · GitHub
OpenCVのインストール
これは前回の環境が古かったからかもしれないがかなりハマった。OpenCV-3.0のバグに引っ掛かりビルドできない状況が発生する。 OpenCV-3.1.0でも問題なくインストールできるので、バージョンを上げてもOK。
Setup CNTK on Linux · Microsoft/CNTK Wiki · GitHub
wget https://github.com/Itseez/opencv/archive/3.1.0.zip unzip 3.1.0.zip cd opencv-3.1.0 mkdir release cd release cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv-3.1.0 .. make all sudo make install
CNTKのリポジトリ取得とインストール
Setup CNTK on Linux · Microsoft/CNTK Wiki · GitHub
インストールとは言え、ビルドにはかなりの演算パワーを必要とした。全部ビルドするのに20分くらいはかかっただろうか? これも上記のOpenMPIのパスをしっかり通しておかないとハマる。
ビルド終了。テストコードを走らせる
ビルドは完了した。いよいよ動かしてみよう!
Setup CNTK on Linux · Microsoft/CNTK Wiki · GitHub
何やら簡単にチェックできるプログラムがあるらしいので、正しくビルドできたかどうか確認する。
export PATH=$HOME/Repos/cntk/build/release/bin:$PATH # パスは各々の環境で変えること cd ~/Repos/cntk/Examples/Other/Simple2d/Data cntk configFile=../Config/Simple.config
何やら大量のログが出てきた。とりあえず最後にCOMPLETEDって書いてあるのでうまくいったのだろう。 何をやっているのかは、おいおい確認していく。とりあえずは環境構築終了!あとはAnsibleで構築できるようにしておこうっと。
... Validating --> HLast = Plus(W2*H1[2 x *], B2[2 x 1]) -> [2 x 1 x *] Validating --> labels = InputValue -> [2 x *] Validating --> Prior = Mean(labels[2 x *]) -> [2 x 1] Validating --> LogOfPrior = Log(Prior[2 x 1]) -> [2 x 1] Validating --> ScaledLogLikelihood = Minus(HLast[2 x 1 x *], LogOfPrior[2 x 1]) -> [2 x 1 x *] Validating for node ScaledLogLikelihood, final verification. Validating --> W2 = LearnableParameter -> [2 x 50] Validating --> W1 = LearnableParameter -> [50 x 50] Validating --> W0 = LearnableParameter -> [50 x 2] Validating --> features = InputValue -> [2 x *] Validating --> MeanOfFeatures = Mean(features[2 x *]) -> [2 x 1] Validating --> InvStdOfFeatures = InvStdDev(features[2 x *]) -> [2 x 1] Validating --> MVNormalizedFeatures = PerDimMeanVarNormalization(features[2 x *], MeanOfFeatures[2 x 1], InvStdOfFeatures[2 x 1]) -> [2 x *] Validating --> W0*features = Times(W0[50 x 2], MVNormalizedFeatures[2 x *]) -> [50 x *] Validating --> B0 = LearnableParameter -> [50 x 1] Validating --> W0*features+B0 = Plus(W0*features[50 x *], B0[50 x 1]) -> [50 x 1 x *] Validating --> H1 = Sigmoid(W0*features+B0[50 x 1 x *]) -> [50 x 1 x *] Validating --> W1*H1 = Times(W1[50 x 50], H1[50 x 1 x *]) -> [50 x *] Validating --> B1 = LearnableParameter -> [50 x 1] Validating --> W1*H1+B1 = Plus(W1*H1[50 x *], B1[50 x 1]) -> [50 x 1 x *] Validating --> H2 = Sigmoid(W1*H1+B1[50 x 1 x *]) -> [50 x 1 x *] Validating --> W2*H1 = Times(W2[2 x 50], H2[50 x 1 x *]) -> [2 x *] Validating --> B2 = LearnableParameter -> [2 x 1] Validating --> HLast = Plus(W2*H1[2 x *], B2[2 x 1]) -> [2 x 1 x *] Validating --> labels = InputValue -> [2 x *] Validating --> Prior = Mean(labels[2 x *]) -> [2 x 1] Validating --> LogOfPrior = Log(Prior[2 x 1]) -> [2 x 1] Validating --> ScaledLogLikelihood = Minus(HLast[2 x 1 x *], LogOfPrior[2 x 1]) -> [2 x 1 x *] 10 out of 22 nodes do not share the minibatch layout with the input data. Post-processing network complete. evalNodeNames are not specified, using all the default evalnodes and training criterion nodes. Allocating matrices for forward and/or backward propagation. UCIFastReader: Starting at epoch 0, counting lines to determine record count... 603 records found. starting epoch 0 at record count 0, and file position 0 already there from last epoch Minibatch[1-1]: Samples Seen = 603 EvalErrorPrediction: ErrorPrediction/Sample = 0.044776119 CrossEntropyWithSoftmax: CrossEntropyWithSoftmax/Sample = 0.09849747 Final Results: Minibatch[1-1]: Samples Seen = 603 EvalErrorPrediction: ErrorPrediction/Sample = 0.044776119 CrossEntropyWithSoftmax: CrossEntropyWithSoftmax/Sample = 0.09849747 Perplexity = 1.1035116 COMPLETED $
ちなみに、Vagrantの環境でもとりあえずGPU付きで構築することはできる
ただし、CUDAの構築などで非常に時間がかかる。Core-i7 3.5GHz, 8GBのメモリを投入して仮想マシンをフル稼働させても、1時間近くビルドに時間がかかってしまった。 いきなりはオススメしないなあ。