FPGA開発日記

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

Microsoftの機械学習ツールキットCMTKが公開されたので使ってみる(CPUオプションのみでインストール)

前回、CMTKを頑張ってソースコードからインストールしようとして、途中で大量のエラーが出て失敗してしまった。いったい何が駄目だったのだろう?

msyksphinz.hatenablog.com

良く見てみると、僕の環境はUbuntu-12.10を使っていた。これが古すぎるのかもしれない。Ubuntu-15.10のVagrantの環境を再構築して、再度やってみよう。 さらに、面倒なGPUオプションは全部省略してみる。

github.com

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時間近くビルドに時間がかかってしまった。 いきなりはオススメしないなあ。

過去のエントリ

msyksphinz.hatenablog.com

続きのエントリ

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com