Pythonが嫌いなのでC++版のPytorchで画像認識をやってみる

**Pythonが嫌い**なのでC++版のPytorchで画像認識をやってみる。
Pythonなんて所詮スクリプト。プログラミング言語とは言えない。実行環境作るの面倒だし、型定義は無いし、ポインタは使えないし、バイナリ作れないし、遅いし、文法は奇妙だし。とにかく昭和のおじさんはコイツがキライなのだ。とはいうものの、C++を触るのは30年ぶり。当時はガンガン使えたけど、今の言語仕様はチンプンカンプン。Visual Studioも初心者。cmakeて何? make.exeは何となく覚えているけど。Pythonも完全に理解しているわけじゃない。途中で挫折するかも。ダラダラ書いていきます。メモ代わりに書いていくので、文章の整理は後。

# 準備
とりあえずVSを最新に更新する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/676f1251-6bfd-b8e8-247d-8cd1a820632d.png)
再起動が要るのか
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/7eb02e22-e080-dafd-54ba-eed92b7bbd28.png)
## CUDAとCUDNNを入れておく
cuda https://developer.nvidia.com/cuda-toolkit-archive
cudnn https://developer.nvidia.com/rdp/cudnn-archive
使うPytorchに合わせて選んでおく必要がある。私はcuda11.3とcuda8.4.0を選択。
GPUドライバは最新にしておけばOK、と思う。
最初に書いておくけどCUDAやCUDNNのパスをシステム環境変数を設定しておかないとVSの拡張機能がちゃんと機能しないと思う。手動でインストールしている人は要注意。ふつうにインストーラで入れておくのが無難。

# Libtorch
pytorchのC++版はlibtorchと言うらしい。

## Pytorchのサイトを読んでみる
「C++14」というのはなんか見覚えがある。C++コンパラのオプションにあったような。
[THE C++ FRONTEND](https://pytorch.org/cppdocs/frontend.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/b3128dc1-1f09-04d4-6774-c6e38cee068a.png)

記事の下の方に何か書いてある。
>Installation
Instructions on how to install the C++ frontend library distribution, including an example for how to build a minimal application depending on LibTorch, may be found by following [this link](https://pytorch.org/cppdocs/installing.html).

リンク先を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/c8d63c6d-4e4c-b15e-8768-ccc8483e9291.png)
配布セットが有りますよ、てことらしい。読み進む。
面倒なのでGoogle翻訳。なにやら魅力的なコメントが
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/1ccffb06-cbd6-b2fd-d4c4-284392c29d5d.png)

## VisualStudio拡張機能
何だろう? とりあえず[ビデオ](https://ossci-windows.s3.us-east-1.amazonaws.com/vsextension/demo.mp4)を見てみよう。 なんか良さそうじゃありませんか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/af4a958d-956d-a843-1a13-4bf461872832.png)

## VisualStudio拡張機能を入れてみる
https://marketplace.visualstudio.com/items?itemName=YiZhang.LibTorch001
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/2b164b03-e018-c254-bba1-883d38784fce.png)

ダウンロードした。このファイルをダブルクリックすればいいらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/f520b49b-946a-672f-0b11-b12f7b2250d8.png)
この段階で意味が有るのか分からないが一応ウィルスチェックかけてから起動。(それにしても開発キットにウィルス紛れ込まされたらどうにもならんな)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/b200892b-02a9-198b-0aa9-9a4f801d59b8.png)
installを押す。何か始まった。時間がかかるようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/a5126c09-4594-2529-c9d4-b28b0dd486a6.png)
30分経っても終わらない。[End Tasks]を押してみる。
上手くいった? 気持ち悪いなあ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/6aa0e952-8399-c8ea-8603-8c1c40ee6fbf.png)

## LibTorchのダウンロード
LibTorchは別途ダウンロードが要るようだ。ReleaseとDebugを両方ダウンロードして展開。
https://pytorch.org/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/50695dae-f67f-9751-f776-6fc943826c37.png)
大きなファイルだこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/5cc83bab-f68c-5b12-8b84-ecc7648d7a72.png)
チュートリアルと同じように、そのままのフォルダ名で展開。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/d422aa39-3f60-0314-5a27-456762bc51ff.png)

# VSを起動
ツールが揃ったようなのでVSを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/e1b6cfcf-b27a-440a-b50a-a142974024e4.png)
「新しいプロジェクトを作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/69d76e8d-aa01-b489-bbf6-49ce3dac876f.png)
おお! 確かに下の方にTorchProjectがある!　選択して次へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/2e7e1b1e-b224-b6ee-e207-49c4bc0cd6df.png)
適当なフォルダを選択。開発用の領域になるのかな。(注2022/8/23 パスにスペースが含まれると実行時に必要ファイル収集に失敗してにコケる。スペースの無いパスを指定しよう。あるあるだね。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/34d70bca-59e3-d746-e17b-1efa52a1c762.png)
libtorchの在るところを入れろ、ということらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/b8c78a26-2826-ceb8-9d9d-ba248e66c3cf.png)
さっき展開したフォルダを入れる。なんかいろいろ自動認識しているようだ。頼もしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/2b0249e9-cbd7-1e22-4846-30c271270003.png)
何か作ってる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/9f343934-c628-9696-b487-eef3a10e3131.png)
お! サンプルコード付きでプロジェクトが出来た。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/803346ff-5b69-af79-aac6-bcf44b5aad74.png)
F5を押してみる。コンパイルしているようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/e0150ef5-903e-24db-375c-a002c864f194.png)
動いたーーー! GPUを使って行列の演算をしたようだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/f4590854-25c1-0503-21a1-c2792b7af92b.png)

exeファイルと必要なDLLも集められている。.pdbてのはデバッグに要るのかな。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464633/da5b0db5-40d3-ed46-dc8e-bcfa4a1bb252.png)

# 感想
Cuda11.3とCUDNNは既にインストールしてあったので思いのほかサクサク行った。コイツラがちゃんと入れてないとここがつまづきポイントになると思う。

# 追記
このプロジェクト構成スクリプト?でプロジェクトを作るとき、プロジェクト作業エリアのパス名にスペースがあると実行時にエラーになる。実行に必要なdllを集めるときにxcopyを使っているらしい。


今日はここまで。
つづく

https://qiita.com/pipimaru1/items/14453a57af1249d1a8eb