less than 1 minute read

pythonで機械学習を行うpytorchやtensorflowは,C++からも利用できる.今回はpytorchに的を絞ってC++で使うための環境構築を行う.pythonの場合はcondaで簡単にインストールできるが,C++版は少し大変だったのでその辺をメモしておきたい.今回の設定はm1 mac,intel mac,Linuxマシンで試していずれも同一手順で大丈夫だった.

公式ページからのインストール(失敗)

まずは公式の配布コードを試したが,私の場合はこれでは動かなかった... 何か間違っているのだと思うが試したことを書いておく. 公式のインストールガイドではまずこれを試せということだ.公式ページから,LanguageでC++/Javaを選択すると,コードのダウンロードが可能だ.追加のインストール作業は必要ない.C++からインクルードするヘッダファイルはincludeディレクトリ以下に存在し,特にtorch/script.hがメインになっているようだ.インストールガイドではtorch/torch.hとなっているがこれは古くtorch/script.hが正しいと思う(実際torch/script.hは存在しない).また,libディレクトリがshared librariesを含んでいる.

libtorch/
  bin/
  include/
  lib/
  share/

以下でちゃんと動くかどうかのテストを実施して,これがちゃんと動くようならそれで問題ないと思う.新しくディレクトリを掘って,C++のコード(example.cpp)とCMakeLists.txtを用意する.別にcmakeは使わなくても良いが公式は推奨している.

.
├── example.cpp
├── CMakeLists.txt

公式でMWEとして提示されているのは以下のようなpytorchのtensorを表示するコードだ.

#include <torch/script.h>
#include <iostream>

int main() {
  torch::Tensor tensor = torch::rand({2, 3});
  std::cout << tensor << std::endl;
}

このコードをcmakeを使ってビルドする.C++17が必要なのでその点に注意が必要.

cmake_minimum_required(VERSION 3.18 FATAL_ERROR)
project(example)

find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")

add_executable(example-app example.cpp)
target_link_libraries(example "${TORCH_LIBRARIES}")
set_property(TARGET example PROPERTY CXX_STANDARD 17)

あとは通常通りcmakeでビルドする.コンパイル時にダウンロードしたlibtorchのディレクトリにpathを通す.パスはCMakeLists.txtでlist(APPEND CMAKE_PREFIX_PATH /absolute/path/to/libtorch )として追加しても良い.

# ビルド用ディレクトリの作成.
mkdir build
cd build
cmake ..  -DCMAKE_PREFIX_PATH=/absolute/path/to/libtorch 
make

これでできたexampleファイルを実行して以下のようにtensorが表示されれば成功だが,自分の場合はmakeで引っかかってしまいこの方法では成功しなかった.

./example-app
0.2063  0.6593  0.0866
0.0796  0.5841  0.1569
[ Variable[CPUFloatType]{2,3} ]

libtorchのビルド

しょうがないのでlibtorchのビルドにトライすることにした.githubのdocsページにCmakeを使ってlibtorchをビルドする方法が書いてあるのでこれに従った.ありがたいことにこれでうまく行った.

git clone -b main --recurse-submodule https://github.com/pytorch/pytorch.git
mkdir pytorch-build
cd pytorch-build
cmake -DBUILD_SHARED_LIBS:BOOL=ON -DCMAKE_BUILD_TYPE:STRING=Release -DPYTHON_EXECUTABLE:PATH=`which python3` -DCMAKE_INSTALL_PREFIX:PATH=../pytorch-install ../pytorch
cmake --build . --target install

この方法だとpytorch-installinclude他のファイルがインストールされる.こちらのtorch/script.hを用いて前述のexampleをコンパイルするとうまく行った.

参考文献

M1 MacでPytorchのc++版、libtorchをインストールして実行する LibTorch(PyTorch C++API)の使い方 PyTorch C++(LibTorch)環境構築

Updated: