TensorFlowに続いて、Microsoftの機械学習ツールキットもオープンソースとして公開された。最近は機械学習のツールを公開するのが流行っているのかね? ある意味では、自社の技術力を宣伝するのには良いのかもしれない。クローズに開発しても良いものではないし、逆にこれで各社ハードウェアベンダがツールキットを利用して高速化の検討をしてくれれば、それで良いのかもしれない。
CNTKはComputational Network Toolkitの略らしい。ふーん。 特徴としては他の機械学習系のツールと比較して高速であること。ここらへんもホワイトペーパを読んでみないと詳細は分からないなー。
ちなみに、CNTKのマニュアルとチュートリアルはこの辺りにあるよ!めっちゃ長いけどね!
http://research.microsoft.com/pubs/226641/CNTK-Tutorial-NIPS2015.pdf
http://research.microsoft.com/pubs/226641/CNTKBook-20160121.pdf
このMicrosoftのレポートだけ見ると、TensorFlowであまり速く無いのね。それよか、Caffeの方が高速なのか。
インストールには、TensorFlowとは違い、インストールにはOpenMPIなどが必要になる。また、GPUにも対応しているが、CUDAのツールキットが必要なのはTensorFlowと一緒だ。 Vagrant上でインストールしようとしたが、デフォルトのメモリ(1GB)ではインストールに必要なメモリが全然足りないので増設しておく必要がある。
CNTKのインストール
CNTKのパッケージは、全てGithub上にアップロードされている。
インストールには、githubからリンクが貼られているセットアップのページを参照すれば良い。
C++コンパイラのインストール
最初に面倒なのでやらなかったら後で詰まった。どうやら-std=c++11のオプションが付くらしく、それなりに新しいバージョンのGCCが必要になる。 最初はGCC 4.6でやっていたのだが、コンパイルが通らずに詰まった。ちゃんと4.8系などにアップグレードしておくこと。
UbuntuでGCC4.8をインストールするのには以下のWebサイトを参照した。
金星☆ちゃんねる: C++11のためにGCCの最新版をインストールする
ACML のインストール
AMD Core Math Libraryというものをインストールしておく。
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