LibTorchの環境を構築して公式サンプルコードを動かす(Windows11)
LibTorchをダウンロード
https://pytorch.org/get-started/locally/
上のURLにアクセスして画像のようにStable, Windows, LibTorch, C++/Java, CUDA 11.7を選択します。
選択後、Run this Command に記載されたURLからReleaseとDebugの2つをダウンロードします。
展開したら適当な場所に配置します。
私は画像のようにC:\Lib\LibTorchにReleaseとDebugディレクトリを作成しその中に展開した中身を入れました。
パスの設定
環境変数のPathに、
C:\Lib\LibTorch\Release\lib
C:\Lib\LibTorch\Debug\lib
を追加します。
さらに環境変数CMAKE_PREFIX_PATHに
C:\Lib\LibTorch\Release\lib
を追加します。(CMakeがfind_packageしたときにLibTorchを見つけられるようにするため。)
この変数がない場合は新規で作ります。
CUDA, cuDNNのインストール
https://developer.nvidia.com/cuda-toolkit-archive
上記URLからCUDA 11.7のインストーラーをダウンロードし、
インストーラーの指示に従ってCUDAをインストールします。
インストールできたらPowerShellに”nvcc -V”と入力しバージョン情報が返ってくることを確認します。
念のため環境変数もチェックします。
画像のように設定されているはずです。
次に、cuDNNのインストールです。
https://developer.nvidia.com/rdp/cudnn-downloadここからダウンロードできますが、nvidiaのアカウントが必要です。
CUDAとバージョンが揃うようにDownload cuDNN ~~~ for CUDA 11.xを選択します。
ダウンロードしたら展開し、その中身全部を”C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.7”にドラッグ&ドロップします。
つまり、
これを、
ここにすべて移動します。
公式サンプルコードとMNISTデータセットの取得
今回はMNISTのサンプルコードを使用します。
https://github.com/pytorch/examples/tree/main/cpp/mnist
ここのmnist.cppを使います。
MNISTデータセットもダウンロードします。
ダウンロードURL:http://yann.lecun.com/exdb/mnist/
4つファイルがあるのですべてダウンロードします。
ダウンロードできたらすべて展開します。(Lhaplusでも7zipでもなんでもいいです。)
展開したファイルはmnist-dataディレクトリを作成してそこに入れておきます。
ここで、ファイル名は
train-labels-idx1-ubyte
t10k-images-idx3-ubyte
t10k-labels-idx1-ubyte
train-images-idx3-ubyte
でないといけません。
しかし、展開されてできたファイル名の一部のハイフンが ”train-labels.idx1-ubyte” のようにドットに置換されています。(少なくとも私の環境では。)
なのでドットをハイフンに変えておいてください。
mnist.cppの10行目でデータセットへのパスを指定しているのでそこをmnist-dataの場所で書き換えます。
// Where to find the MNIST dataset.
const char* kDataRoot = R"(D:\mnist-data)";
LibTorchのコードを少し編集
C:\Lib\LibTorch\Release\include\ATen\Parallel.h
を開いて、30行目あたりのlazy_init_num_threadをコメントアウトして宣言だけ残します。
// ↓こんな感じ
TORCH_API void lazy_init_num_threads();
//inline TORCH_API void lazy_init_num_threads() {
// thread_local bool init = false;
// if (C10_UNLIKELY(!init)) {
// at::init_num_threads();
// init = true;
// }
//}
サンプルコードを動かす
CMakeLists.txtを次のように書いてmnist.cppと同じ場所に置きます。
cmake_minimum_required(VERSION 3.2 FATAL_ERROR)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
project(template)
add_executable(${PROJECT_NAME}
mnist.cpp
)
# LibTorch
find_package(Torch REQUIRED)
target_link_libraries(${PROJECT_NAME} ${TORCH_LIBRARIES})
あとはmnist.cppがある場所で
mkdir build
cd build
cmake ..
cmake --build . --config Release
としてビルドします。
.\Release\template.exeで実行して画像のような出力が得られればOKです。
Visual Sutudio2022で動かす場合
Visual Studioで動かす場合は、Releaseの場合、(Debugでもやることは一緒です。)
プロパティ>C/C++>追加のインクルードディレクトリに
C:\Lib\LibTorch\Release\include
C:\Lib\LibTorch\Release\include\torch\csrc\api\include
この2つを指定します。
また、プロパティ>リンカー>全般>追加のライブラリディレクトリに
C:\Lib\LibTorch\Release\lib
を指定します。
さらに、プロパティ>リンカー>入力>追加の依存ファイルにC:\Lib\LibTorch\Release\libの*.libをとりあえず、すべて追加します。
Powershellでls -name -include *.lib |clipと入力するとクリップボードに*.libがすべてコピーされるのでそれを貼り付けます。
一応結果を貼っておきます。
asmjit.lib
c10.lib
c10_cuda.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
kineto.lib
libprotobuf-lite.lib
libprotobuf.lib
libprotoc.lib
pthreadpool.lib
torch.lib
torch_cpu.lib
torch_cuda.lib
torch_cuda_cpp.lib
torch_cuda_cu.lib
XNNPACK.lib
その他
以前のバージョンでは、
プロジェクト>プロパティ>リンカー>全般>コマンドラインの追加のオプションに
/INCLUDE:?warp_size@cuda@at@@YAHXZ /INCLUDE:?_torch_cuda_cu_linker_symbol_op_cuda@native@at@@YA?AVTensor@2@AEBV32@@Z
を追加しないと動きませんでした。
違うバージョンで環境構築する際はご注意ください。
またその場合、LibTorchのコードを少し編集の項で上げた修正は不要かもしれません。
参考:https://github.com/pytorch/pytorch/issues/72396
以上です。