TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

WindowsでPyTorchをC++(Visual C++)で動かす【更新】

以前に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が作成される)。

デバッグ用モジュール

デバッグビルドを行う場合は、「Download here (Debug version):」のリンクからlibtorch-win-shared-with-deps-debug-1.3.1.zipをダウンロードする。

リリース用モジュールとは別の場所に展開する。
以下、C:\libtorch\debugに、zipの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' を開くことができません。

というエラーが出力される。対処方法は後述する。

コマンドラインからビルドする場合

コマンドラインからビルドする場合、以下のコマンドでビルドする。

cmake --build . --config Release

デバッグビルド

上記の方法では、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

バグフィックスが行われているようなので、次のバージョンで修正されると思われる。