LibTorch(C++版PyTorch)の使用方法

昨年はPFNがPyTorchへ移行するというビックニュースがありましたが、それもあって、個人的に注目度の増したPyTorch

DeepLearningについては、最終的にはC#から使いたいのですが、C#に正式に対応しているのは、おそらくMicrosoftのCognitive Toolkitだけ?ですが、MicrosoftもCognitive Toolkitは今後、メンテナンスのみ行い、新しくは開発を行わないと言っているので、いつまで続くか?ちょっと不安。

C#がダメなら、ある程度C++で処理を書いて、C#から処理を呼び出す方向にしようと思い、C++に対応しているPyTorchについて調べてみました。

PyTorchのC++版はLibTorchと言うらしい。

ただし、PyTorchのC++のページ

https://pytorch.org/cppdocs/

にも、こんな文言↓が書いてあり、今後、変わる可能性も大な状況です。

LibTorchの使用方法

開発環境

Windows10

Visual Studio 2017

LibTorchバージョン 1.3.1 (2020年1月時点の最新)

となります。

Visual Studio 2015でも試してみましたが、エラーが多発し、VS2017にしました。

LibTorchのダウンロード

ビルド済みのLibTorchは下記、ページよりダウンロードできます。

https://pytorch.org/

今回は使用方法の評価をしたいので、Windows、C++版のCUDAなしのDebug版をダウンロードします。

実際に使う場合はRelease版を入手してください。

LibTorchの使用方法

zipファイル(libtorch-win-shared-with-deps-debug-1.3.1.zip)を解凍すると、ファイル構成は以下のようになっています。

重要な部分を展開して表示しています。

libtorch
├─bin
├─cmake
├─include
│ │ clog.h
│ │ cpuinfo.h
│ │ fp16.h
│ │ psimd.h
│ │
│ ├─ATen
│ ├─c10
│ ├─caffe2
│ ├─fp16
│ ├─google
│ ├─include
│ ├─TH
│ ├─THCUNN
│ ├─THNN
│ └─torch
│ └─csrc
│ ├─api
│ │ ├─include
│ │ │ └─torch
│ │ │ │ all.h
│ │ │ │ arg.h
│ │ │ │ autograd.h
│ │ │ │ cuda.h
│ │ │ │ data.h
│ │ │ │ expanding_array.h
│ │ │ │ jit.h
│ │ │ │ nn.h
│ │ │ │ optim.h
│ │ │ │ ordered_dict.h
│ │ │ │ python.h
│ │ │ │ serialize.h
│ │ │ │ torch.h
│ │ │ │ types.h
│ │ │ │ utils.h
│ │ │ │
│ │ │ ├─data
│ │ │ ├─detail
│ │ │ ├─nn
│ │ │ ├─optim
│ │ │ ├─python
│ │ │ └─serialize
│ │ └─src
│ ├─autograd
│ ├─cuda
│ ├─distributed
│ ├─generic
│ ├─jit
│ ├─multiprocessing
│ ├─onnx
│ ├─tensor
│ └─utils

├─lib
│ c10.dll
│ c10.lib
│ c10.pdb
│ caffe2_detectron_ops.dll
│ caffe2_detectron_ops.lib
│ caffe2_detectron_ops.pdb
│ caffe2_module_test_dynamic.dll
│ caffe2_module_test_dynamic.lib
│ caffe2_module_test_dynamic.pdb
│ clog.lib
│ cpuinfo.lib
│ libiomp5md.dll
│ libiompstubs5md.dll
│ libprotobuf-lited.lib
│ libprotobufd.lib
│ libprotocd.lib
│ torch.dll
│ torch.lib
│ torch.pdb

├─share
└─test

使用方法

使用方法については、こちらのページ↓

https://mc.ai/building-pytorch-c-integration-libtorch-with-ms-visual-studio-2017/

を参考にしながら、少し手をいれました。

1.  C++プロジェクトの作成

今回はC++のコンソールアプリケーションを作成します。

Visual Studio 2017を起動し、 新しいプロジェクトの作成 をクリックします。
LibTorchの使用方法

Visual C++ → Windowsデスクトップ → コンソールアプリ と選択し、名前や場所を指定して、OKボタンをクリックします。
LibTorchの使用方法

すると最小限のコンソールアプリ Hello World! が作成されます。

2.  プラットフォームを64ビット用(x64)に変更

Visual Studioの上部のソリューションプラットフォーム部分を x64 に変更します。

LibTorchの使用方法

3.  インクルードディレクトリの設定

使用するヘッダファイル(*.h)の場所(ディレクトリ)を設定します。

プロジェクトのプロパティより、 C/C++ → 全般 → 追加のインクルードディレクトリ
の編集をクリックします。

LibTorchの使用方法

libtorch\include
libtorch\include\torch\csrc\api\include
の2つのディレクトリを指定します。
下図の D:PyTorch131の部分は各自、解凍したファイルを配置した場所に合わせて下さい。

LibTorchの使用方法

4.  ライブラリディレクトリの設定

使用するライブラリファイル(*.lib)の場所(ディレクトリ)を設定します。

プロジェクトのプロパティより、 C/C++ → 全般 → 追加のライブラリディレクトリ
の編集をクリックします。

LibTorchの使用方法

libtorch\lib

のディレクトリを指定します。
下図の D:PyTorch131の部分は各自、解凍したファイルを配置した場所に合わせて下さい。

LibTorchの使用方法

5.  ライブラリファイルの設定

使用するライブラリファイル(*.lib)を設定します。

プロジェクトのプロパティより、 C/C++ → 入力 → 追加の依存ファイル
の編集をクリックします。

LibTorchの使用方法

ここで、使用するライブラリファイル(*.lib)を設定するのですが、参考にしたページのファイル名が少し違っていたので、とりあえず、下記ファイルを追加しました。

c10.lib
caffe2_detectron_ops.lib
caffe2_module_test_dynamic.lib
torch.lib

LibTorchの使用方法

libファイルを追加したらOKボタンをクリックし、戻ったプロパティページの 適用 をクリックします。

6.  準拠モードの設定

次に、参考にしたページに従って、 C/C++ → 言語 → 準拠モード

はい から いいえ に変更します。

LibTorchの使用方法

プロパティページの 適用、OK をクリックし設定画面を閉じます。

サンプルプログラムの作成

ここでも参考にしたページにしたがって、Hello World! のプログラムにiniclude

#include “torch/torch.h”

を追加してみます。

LibTorchの使用方法

この状態でソリューションをビルドすると、エラーが2つ、警告はたくさん出てきます。

LibTorchの使用方法

警告はあまりに多いので、エラーだけを直します。

E1866 属性はどのエンティティにも適用されません

E1866 属性はどのエンティティにも適用されませんの部分をダブルクリックすると、ArrayRef.hファイルへ飛びます。

LibTorchの使用方法

この C10_DEFINE_DEPRECATED_USING の部分が何をしているか?分からないのですが、ヒントに従って、新しいヒントファイル(cpp.hint)を追加してみたものの、修正できず。

LibTorchの使用方法

とりあえず、コメントに Use IntArrayRef instead! と書いてあったので、コメントアウトして様子見。

LibTorchの使用方法

C4146 符号付きの値を代入する変数は、符号付き型にキャストしなければなりません。

エラーは llvmMathExtras.h ファイルのこの部分↓

LibTorchの使用方法

これに関しては、情報がありました。↓

https://github.com/pytorch/pytorch/commit/b9b9fd4fadc4d4fa0b030941a35011956eafa10b#diff-addba48bf6d5a181865f19c2d862448d

これに従って、そのまま修正します。

LibTorchの使用方法

これで、エラーが出なくなりました! コメントアウトした部分が怪しいけど。。

    シェアする

    • このエントリーをはてなブックマークに追加

    フォローする

    関連記事

    スポンサーリンク