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とすれば良い。