以前にWindowsでLibTorchをC++から使う方法について記事を書いたが、内容が古くなったので書き直す。
基本的な手順は以前と同じだが、リリースビルドとデバッグビルドの使い分けができるようになっている。
最新のLibTorch 1.3は、Release用のバイナリと、Debug用のバイナリが別々に配布されている。
以前は、Release用のバイナリのみだったため、Debugビルドで動かすことができなかった。
LibTorchのインストール
https://pytorch.orgのQUICK START LOCALLYから、Stable/Windows/LibTorch/C++/10.1(CUDAのバージョンが10.1の場合)を選んでlibtorch-win-shared-with-deps-1.3.1.zipをダウンロードする。
適当な場所に解凍する。
以下、C:\に解凍したとして説明する(zipのルートフォルダがlibtorchなので、C:\libtorchが作成される)。
cmakeインストール
cmakeをVisual Studioのインストール時のオプションでインストールする。
最も単純なサンプルをビルドして実行
Installing C++ Distributions of PyTorch — PyTorch master documentation
の説明の通り、適当な場所に
- CMakeLists.txt
- example-app.cpp
を作成して、上記のページの内容の通り内容を記述する。
ビルド
スタートメニューから「x64 Native Tools Command Prompt for VS 2019」※を起動する。
※Visual Studio 2019の場合。Visual Studio 2017でも可。
サンプルコードを配置したディレクトリに移動して、以下のコマンドを実行する。
mkdir build cd build cmake -DCMAKE_PREFIX_PATH=C:\libtorch ..
buildディレクトリに「example-app.sln」が作成されるので、Visual Studioで開いて、スタートアッププロジェクトを「example-app」に設定し、ソリューションの構成を「Release」に設定しビルドする。
ビルド成功し実行すれば、以下のように表示される。
0.3171 0.7950 0.6067 0.1094 0.7421 0.8496 [ Variable[CPUType]{2,3} ]
なお、ソリューションの構成を「Release」以外でビルドした場合、
エラー LNK1104 ファイル 'torch-NOTFOUND.obj' を開くことができません。
というエラーが出力される。対処方法は後述する。
デバッグビルド
上記の方法では、Debugでビルドすることができないため、自作のC++のプログラムをデバッグする際に困る。
cmakeのオプションを
cmake -DCMAKE_PREFIX_PATH=C:\libtorch\debug ..
として、別のプロジェクトを作成することで、Debugでビルドできるようになる。
しかし、Release用とプロジェクトが分かれてしまうので、不便である。
そこで、cmakeで生成された「example-app.vcxproj」を直接編集する。
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
から、対応する閉じタグの
</ItemDefinitionGroup>
までの間の、「C:\libtorch」を「C:\libtorch\debug」に置換する。
また、「torch-NOTFOUND」を「C:\libtorch\debug\lib\torch.lib」に置換する。
これで、Debug構成でもビルドできるようになる。
なお、CMakeLists.txtを編集して、cmakeを再構成した場合は、上書きされてしまうので注意が必要である。
その他のソリューション構成の場合
cmakeが生成するVisual Studioのプロジェクトには、「Release」と「Debug」以外に、「MinSizeRel」と「RelWithDebInfo」が含まれる。
これらの構成でビルドしたい場合は、上記と同様のビルドエラーが発生するため、対応するItemDefinitionGroupタグ内の「torch-NOTFOUND」を「C:\libtorch\lib\torch.lib」に置換すると良い。
デバッグビルドでのCUDAが使用できない問題
現在のバージョンでは、デバッグビルドでのCUDAが使用でいないという問題が発生している。
LibTorch crashes in debug mode: DispatchStub: missing CUDA kernel · Issue #22681 · pytorch/pytorch · GitHub
バグフィックスが行われているようなので、次のバージョンで修正されると思われる。