FPGA開発日記

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

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

TensorFlowに続いて、Microsoft機械学習ツールキットもオープンソースとして公開された。最近は機械学習ツールを公開するのが流行っているのかね? ある意味では、自社の技術力を宣伝するのには良いのかもしれない。クローズに開発しても良いものではないし、逆にこれで各社ハードウェアベンダがツールキットを利用して高速化の検討をしてくれれば、それで良いのかもしれない。

jp.techcrunch.com

CNTKはComputational Network Toolkitの略らしい。ふーん。 特徴としては他の機械学習系のツールと比較して高速であること。ここらへんもホワイトペーパを読んでみないと詳細は分からないなー。

ちなみに、CNTKのマニュアルとチュートリアルはこの辺りにあるよ!めっちゃ長いけどね!

http://research.microsoft.com/pubs/226641/CNTK-Tutorial-NIPS2015.pdf

http://research.microsoft.com/pubs/226641/CNTKBook-20160121.pdf

https://tctechcrunch2011.files.wordpress.com/2016/01/speed-comparison.png?w=626&h=352

このMicrosoftのレポートだけ見ると、TensorFlowであまり速く無いのね。それよか、Caffeの方が高速なのか。

インストールには、TensorFlowとは違い、インストールにはOpenMPIなどが必要になる。また、GPUにも対応しているが、CUDAのツールキットが必要なのはTensorFlowと一緒だ。 Vagrant上でインストールしようとしたが、デフォルトのメモリ(1GB)ではインストールに必要なメモリが全然足りないので増設しておく必要がある。

CNTKのインストール

CNTKのパッケージは、全てGithub上にアップロードされている。

github.com

インストールには、githubからリンクが貼られているセットアップのページを参照すれば良い。

github.com

C++コンパイラのインストール

最初に面倒なのでやらなかったら後で詰まった。どうやら-std=c++11のオプションが付くらしく、それなりに新しいバージョンのGCCが必要になる。 最初はGCC 4.6でやっていたのだが、コンパイルが通らずに詰まった。ちゃんと4.8系などにアップグレードしておくこと。

UbuntuでGCC4.8をインストールするのには以下のWebサイトを参照した。

金星☆ちゃんねる: C++11のためにGCCの最新版をインストールする

ACML のインストール

AMD Core Math Libraryというものをインストールしておく。

developer.amd.com

OpenMPIのインストール

このときに、-std=c++11のオプションに対応したGCCが必要なので、アップグレードしておくこと。

wget https://www.open-mpi.org/software/ompi/v1.10/downloads/openmpi-1.10.1.tar.gz 

tar -xzvf ./openmpi-1.10.1.tar.gz
cd openmpi-1.10.1
./configure --prefix=$HOME/mpi
make -j all
make install

GPU固有のパッケージのインストール

ここは、Vagrantの上でもあるし、とりあえず省略。

CNTKのソースコード取得とビルド

いよいよCNTKのインストールをする。まずはgithubからソースコードをダウンロードした。

git clone https://github.com/Microsoft/CNTK
cd ~/Repos/cntk
mkdir build/release -p
cd build/release
../../configure
make -j all

結構なメモリを必要としている。8GBくらいは必要かも? こんな感じになっちゃうもんなあ。。。

top - 16:20:13 up 2 min,  2 users,  load average: 16.45, 5.97, 2.15
Tasks: 120 total,  17 running, 103 sleeping,   0 stopped,   0 zombie
Cpu(s): 99.0%us,  1.0%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8178728k total,  5563184k used,  2615544k free,    12884k buffers
Swap:        0k total,        0k used,        0k free,    80740k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1615 vagrant   20   0  362m 331m 6980 R  6.7  4.1   0:04.26 cc1plus
 1629 vagrant   20   0  379m 343m  10m R  6.7  4.3   0:04.25 cc1plus
 1670 vagrant   20   0  366m 335m 6976 R  6.7  4.2   0:04.23 cc1plus
 1678 vagrant   20   0  327m 294m  10m R  6.7  3.7   0:04.22 cc1plus
 1550 vagrant   20   0  368m 337m 6436 R  6.3  4.2   0:04.29 cc1plus
 1569 vagrant   20   0  322m 287m  10m R  6.3  3.6   0:04.28 cc1plus
 1606 vagrant   20   0  367m 335m 6996 R  6.3  4.2   0:04.25 cc1plus
 1610 vagrant   20   0  392m 355m 6972 R  6.3  4.4   0:04.26 cc1plus
 1644 vagrant   20   0  366m 333m 5856 R  6.3  4.2   0:04.24 cc1plus
 1654 vagrant   20   0  388m 351m 6976 R  6.3  4.4   0:04.23 cc1plus
 1666 vagrant   20   0  375m 343m 6236 R  6.3  4.3   0:04.22 cc1plus
 1585 vagrant   20   0  322m 287m  10m R  6.0  3.6   0:04.27 cc1plus
 1624 vagrant   20   0  395m 359m 6972 R  6.0  4.5   0:04.24 cc1plus
 1634 vagrant   20   0  408m 377m 6236 R  6.0  4.7   0:04.24 cc1plus
 1642 vagrant   20   0  326m 292m  10m R  6.0  3.7   0:04.24 cc1plus
 1656 vagrant   20   0  362m 331m 5948 R  6.0  4.1   0:04.22 cc1plus
    1 root      20   0 24436 2356 1328 S  0.0  0.0   0:00.39 init
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd
...

結局

上記のメモリバカ食いのところでコンパイルエラーがおきて、うまく行っていない。 Microsoftツールフルスクラッチビルドするとこういうことが多いなあ。。。

...
/usr/include/c++/4.8/type_traits:1317:12:   required from ‘struct std::is_convertible<Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<double>*, Microsoft::MSR::CNTK::ConvolutionEngineFactory<double>*>’
/usr/include/c++/4.8/type_traits:121:12:   required from ‘struct std::__and_<std::is_convertible<Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<double>*, Microsoft::MSR::CNTK::ConvolutionEngineFactory<double>*>, std::__not_<std::is_array<Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<double> > >, std::is_convertible<std::default_delete<Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<double> >, std::default_delete<Microsoft::MSR::CNTK::ConvolutionEngineFactory<double> > > >’
/usr/include/c++/4.8/type_traits:1775:71:   required by substitution of ‘template<class ... _Cond> using _Require = typename std::enable_if<std::__and_< <template-parameter-1-1> >::value>::type [with _Cond = {std::is_convertible<Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<double>*, Microsoft::MSR::CNTK::ConvolutionEngineFactory<double>*>, std::__not_<std::is_array<Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<double> > >, std::conditional<false, std::is_same<std::default_delete<Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<double> >, std::default_delete<Microsoft::MSR::CNTK::ConvolutionEngineFactory<double> > >, std::is_convertible<std::default_delete<Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<double> >, std::default_delete<Microsoft::MSR::CNTK::ConvolutionEngineFactory<double> > > >::type}]’
/usr/include/c++/4.8/bits/unique_ptr.h:163:44:   required from ‘static std::unique_ptr<Microsoft::MSR::CNTK::ConvolutionEngineFactory<ElemType> > Microsoft::MSR::CNTK::ConvolutionEngineFactory<ElemType>::Create(int, Microsoft::MSR::CNTK::ConvolutionEngineFactory<ElemType>::EngineType, Microsoft::MSR::CNTK::ImageLayoutKind) [with ElemType = double]’
Source/Math/ConvolutionEngine.cpp:494:16:   required from here
Source/Math/ConvolutionEngine.cpp:446:17: error: ‘typename Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<ElemType>::Base::PoolDescPtr Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<ElemType>::CreatePoolDescriptor(int, size_t, size_t, size_t, size_t, size_t, size_t) [with ElemType = double; typename Microsoft::MSR::CNTK::DefaultConvolutionEngineFactory<ElemType>::Base::PoolDescPtr = std::unique_ptr<Microsoft::MSR::CNTK::PoolingDescriptor>; size_t = long unsigned int]’ marked override, but does not override
     PoolDescPtr CreatePoolDescriptor(typename PoolDesc::PoolKind kind, size_t w, size_t h, size_t wStride, size_t hStride, size_t wPad, size_t hPad) override

続きのエントリ

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com