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ディレクトリを作成しその中に展開した中身を入れました。

C:\Lib\LibTorchにReleaseとDebug
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”と入力しバージョン情報が返ってくることを確認します。

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-dataの中に4つのファイルを入れておく

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;
//  }
//}

参考:https://stackoverflow.com/questions/74366357/updating-to-visual-studio-17-4-0-yields-linker-errors-related-to-tls

サンプルコードを動かす

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

こんな感じ

以上です。

いいなと思ったら応援しよう!