libtorchをビルドする方法

 libtorchの公開されているバイナリは互換性の維持のため(?)、他のライブラリもリンクしようとするとABIのバージョンがどうたらでエラーになってしまうらしい(どういうことなのだかよくわからない)。実際に手元でやってみてもそうなったため、古いコンパイラを使って開発を行うか、開発で使うコンパイラでlibtorchを自前でビルドするかのどちらかにする必要があるようだ。今回は自前でビルドすることにした。

 結論から言えばlibtorchをビルドするときはpytorchのリポジトリ内にあるtools/build_libtorch.pyを使えば終わり。以下は細かいやったこと。

 環境はdockerを用いて作ることにする。dockerhubにあるpytorchのイメージは使ってみたが、cmakeのバージョンが古かったりどういうディレクトリ構造になっているのかよくわからなかったのでnvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 から導入し始める。

 dockerやnvidia_docker2とかはすでに入っているものとして、コンテナを起動。

docker run --runtime=nvidia -it nvidia/cuda:10.0-cudnn7-devel-ubuntu18.04 bash

 gitやcmake(および導入自体には関係ないが気分としてsudo)を入れる。

apt update
apt install sudo
sudo apt install git -y
sudo apt install cmake -y

 pytorchをgithubからサブモジュールも含めてダウンロードする

git clone --recursive https://github.com/pytorch/pytorch

 ビルド時に使うことになるのでpythonおよびdistutils、pyyamlを入れておく。とりあえずビルドしてみてエラーが出たらメッセージを読んで足りないと言われたものを入れるということを繰り返していけばなんとかなる。

sudo apt install python3
sudo apt install python3-distutils
sudo apt install python3-pip
pip3 install pyyaml

 メインの部分はpytorch/toolsに移動してbuild_libtorch.pyを実行するだけ。本当にただこれだけ。無駄にCMakeLists.txtを覗いて中のフラグどれ立てればいいのか……とか考える必要はなかった。

cd pytorch/tools
python3 build_libtorch.py

 そこそこ時間はかかるがちゃんと複数コア使って並列ビルドをやってくれる。

 使うときはどうもpytorchのディレクトリへのパスを通せば良いっぽい? よくわかっていない。CMakeLitst.txt内で

set(APPEND CMAKE_PREFIX_PATH /path/to/pytorch)
find_package(Torch REQUIRE)

 みたいに書けばなんかコンパイルできた。実行するときにライブラリが見つからないとか言われるのでpytorch/torch/libを.bashrcに書いたり、CLion使っていると特定ユーザーだけでなくシステム全体にパスを通さないといけないようなのでここに書いてあるように/etc/ld.so.confへpytorch/torch/libを追加してsudo ldconfigとすれば良い。