2019年4月11日木曜日

Windowsでlibtorchをビルドする。

おじさん、OpenCVのことばっかりブログに書いていたら古いといわれました。
いつもgcc hoge.cのように1時間程度で簡単にビルドして実行して試せる記事を書いていたのに。
しかも勝手にC/C++縛りです。

くやしいので本日は最近はやっている、PyTorch。
ついにPythonの記事か!いや、そうではありません。
PythonのPytorchの記事はみんな書いてるしね。

PyTorchってPythonで書かれているように見えますが、ほとんどはC++で書かれているのでC++から使えます。C++で書かれている部分をlibtorchというようで、以下に使い方が書かれています。
https://pytorch.org/cppdocs/

また、ライブラリのバイナリーも以下の場所から入手できます。
https://pytorch.org/cppdocs/installing.html

だけど、おじさんの使っているWindsows版のlibtorchがない。
しかも<pytorch_root>/docs/libtorch.rstに書かれている、libtorchのビルド方法は全然更新されてないらしく、全然違うし。
ドキュメント整備されてないし、ソースコード汚いし、ドキュメント通りにやってもビルドどおらないし。。どうすりゃいいんだよ。

というわけで本日はPyTorchのコア部分であるlibtorchのビルドをしてみます。


まず、必要なツールですが、VisualStudio2017、Python3.7、CMake、PyYamlがいります。
PyYamlはPythonをインストールしたあとにコマンドプロンプトから以下のように入力するとインストールすることができます。

--------------------
pip3.7 install pyyaml
--------------------

cmakeはCygwinのものを使うと、Windowsビルド用のモジュールが入っていないので、本家のcmakeをダウンロードしてインストールします。
インストールがおわり、pythonとcmakeのパスを設定し、コマンドプロンプトから次のように入力するとcmakeによるビルドが開始されるようです。

--------------------
cd <pytorch_root>\tools
mkdir build
cd build
python ..\build_libtorch.py
--------------------

ビルドにはいろいろな外部ライブラリが必要です。おじさんのようにgithubからzipファイルをダウンロードしてそれを展開してビルドすると外部ライブラリうがないため、ビルド時に以下のようなエラーになります。

--------------------
CMake Error at cmake/Dependencies.cmake:1005 (add_subdirectory):
  The source directory

    D:/trash/pytorch-master/third_party/foxi

  does not contain a CMakeLists.txt file.
Call Stack (most recent call first):
  CMakeLists.txt:236 (include)
--------------------

外部ライブラリは、<pytorch_root>/third_party/<ライブラリ名>のところに足りない外部ライブラリをどんどん突っ込んでいきます。
ソースコードは、<pytorch_root>/third_party/<ライブラリ名>のところに、CmakeLists.txtがくるように配置しないとだめです。

外部ライブラリのソースコードはpytorchのgithubのthird_partyからリンクをたどって取ってきたほうがバージョンが一致するのでよいです。

protobuf、cpuinfo、googletest、benchmark、FP16、foxi、onnx、psimdなどの外部ライブラリがいるようです。
しかしここで一つ問題が、ベクトル演算ライブラリは、なんらかのBLASまたはEigenが必要です。なぜかベクトル演算ライブラリがなくてもビルドが開始されてしまいます。
なので、eigenもgithubからとってきます。

JavaのJVMとかのビルドもそうなのですが、Windows版のビルドはCドライブ以外でビルドを行うとよくファイルのコピーでビルドエラーになります。
libtorchもCドライブ以外でビルドを行うと、psimdのコピーができないようなので、
<pytorch_root>/tools/build/confu-srcs/psimdにthird_partyにある同じファイルをコピーします。
大規模なソースコードのビルドを行うときは絶対Cドライブでやったほうがいいです。Dドライブでは本当になぜかビルドが通りません。

これでやっとビルドが開始されます。
1時間くらいでビルドができ、<pytorch_root>/tools/build/bin/Releaseにtorch.dllが出来上がります。

これでC++からpytorchが使えるようになります。

PyTorchのexample/cppフォルダにはc++のサンプルがあります。
このなかに定番の文字認識「MNIST」のlibtorch版、mnist.cppがあります。
ファイル一つしかないんですね。なのでビルド簡単。
mnistのビルド方法やドキュメントもあるので、これをつかってPyTorchのlibtorch使い方を学ぶことができます。

めでたしめでたし。

0 件のコメント:

コメントを投稿