VisualStudioCodeでPytorchのRustバインディングの実行環境を構築する(Ubuntu編)

# はじめに
本記事はPytorchのRustバインディングをUbuntu版VisualStudioCode上で試してみました。
真っ更な状態のUbuntuからRustバインディングを実行する方法までを初学者向けに極力丁寧に書いています。

# 対象者
PythonからRustに乗り換えたいなーと考えているRust初学者


# 環境情報
|                  |バージョン     |備考                                |
|------------------|-------------|------------------------------------|
|Ubuntu            |20.04.3 LTS  |                                    |
|Rustc             |1.56.1       | Rustコンパイラ<br><font color="Silver">※下記Rustインストール手順にて自動的にインストールされる</font>                       |
|Rustup            |1.24.3       | Rustインストーラおよびバージョン管理ツール<br><font color="Silver">※下記Rustインストール手順にて自動的にインストールされる</font>|
|Cargo             |1.56.0       | Rustビルドツール　<br><font color="Silver">※下記Rustインストール手順にて自動的にインストールされる</font>|
|VisualStudioCode  |1.62.3       |                                    |
|Rust support for VisualStudioCode |0.7.8       |  VSCode拡張機能Rustツール                                  |
|CodeLLDB          |1.6.10       | VSCode拡張機能Rustデバッガー|

# Pytorch/Rustバインディング
今回実行するPytorch/Rustバインディングはこちら
tch-rs

https://github.com/LaurentMazare/tch-rs.git





# Rust実行環境を構築する
### Rustをインストールする
下記URLに表示されているコマンドをターミナル上から実行してRustをインストールする
https://www.rust-lang.org/ja/tools/install
![Rustダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/8857e053-8afa-39eb-07a6-b60df7555d0c.png)
下記画面が表示されるので1を入力する(未入力のままでも可)
![Rustインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/ebb6c0a7-7de4-3e9b-d84e-47134e5e35c5.png)
下記画面が表示されたら完了
![Rustインストール2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/c3ebf93d-c7e4-3a8e-e7c1-76a15e8bd8c5.png)

Rustがインストールされたか確認するために下記コマンドをする

```bash
rustc -V
rustup -V
cargo --version
```

### VisualStudioCodeをインストールする
下記URLの「.deb」よりdebファイルをダウンロードしVisualStudioCodeをインストールする
https://code.visualstudio.com/Download
![VSCodeダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/acd03e7a-7a87-0ee6-2460-3f1d4675a582.png)
![VSCodeインストール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/5915ebc8-d5c9-025e-fa20-5683c6238bc0.png)

### VisualStudioCodeの拡張機能をインストールする
アプリケーションからVisualStudioCodeを実行する
![VisualStudioCode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/8561fd45-4797-883e-7931-c4a450a7d8c2.png)
左のメニューより拡張機能を選択する
![VisualStudioCode2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/c32b77c4-f001-fbbc-3f9a-455535a8bee3.png)
Rust support for VisualStudioCode(拡張機能の名称はRustとなっている)をインストールする
![RustforVisualStudioCode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/3147ac69-a841-297e-d0b0-c0a8433515f0.png)
CodeLLDBをインストールする
![CodeLLDB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/29c9e629-e33a-2356-50e3-0b71424f97c0.png)
※おまけ
VisualStudioCodeはデフォルトでは英語表記だが
JapaneseLanguagePack for VisualStudioCodeをインストールすることで日本語化できる
![Screenshot from 2021-11-20 01-00-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/c2e98a49-3c5b-01f5-4036-886c28ef4601.png)

### GitリポジトリのクローンおよびMNISTのダウンロードを行う
「エクスプローラー」⇒「Gitリポジトリのクローン」の順に選択し、
検索窓に「https://github.com/LaurentMazare/tch-rs.git 」を入力してEnterを押下する
![VSCode_Gitクローン2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/986ad87d-cee5-5000-4422-6c0ef9d97dc5.png)

複製先となる任意のパスを選択し「リポジトリの場所を選択」を選択する
![VSCode_Gitクローン3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/3cd93450-81e3-ee66-812b-488286313499.png)

複製したプロジェクトを開く
![VSCode_Gitクローン4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/fefa225f-96e5-5ad3-f1f0-f6323f7b5f58.png)

下記URLよりMNISTのデータセットをダウンロードする
http://yann.lecun.com/exdb/mnist/
![MNIST.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/ef11c5e0-f4cc-509d-f31e-8267a1b921b7.png)

tch-rs直下にdataフォルダを作成し、先程ダウンロードした.gzファイルを解凍して配置する
![MNISTダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/0bb5903f-6cd8-ce95-d55e-c01cc80bb342.png)

### CodeLLDBの設定を行う
tch-rs/examples/mnist/main.rsを開く
※拡張子が.rsとなっているファイルならば何でも問題ないが、後続の作業のためこのファイルを選択する
![VSCode_torch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/4e21f752-c6c8-cbfd-77ff-9f9607853b01.png)

「実行」⇒「デバッグの開始」を選択する
![VSCode_デバッグ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/4fc2b8fd-26d3-7074-dfa9-34e97e16f558.png)
初回起動時はデバッグ構成ファイルが存在しないため作成ダイアログが表示される
画像のように「OK」⇒「はい(Y)」を選択することで自動的にCodeLLDBが構成ファイルを作成する
※CodeLLDBをインストールする前に同様の操作をした場合は全く別の構成ファイルが生成されてしまうため削除すること
![VSCodeデバッグ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/260f0798-fb32-ce51-bef9-cff4c3d545cc.png)
![VSCodeデバッグ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/326a4f68-2bdc-1059-809b-5354d2878603.png)
![VSCodeデバッグ4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/ab135108-56fa-74ad-61c0-c94f57198475.png)

出力されたlaunch.jsonはプロジェクト全体をビルドしてしまう設定となるため、tch-rs/examples/mnist配下のビルド設定のみを残して他の設定を削除する
![VSCodeデバッグ5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/d63deb4b-08a6-6e65-6dca-6b5751ac8614.png)
下記は書き換えた例
※CodeLLDBのバージョンによって内容が変わる可能性があるため異なるバージョンを利用する場合は
自動出力されたファイルからtch-rs/examples/mnist配下のビルド設定のみを残して他の設定を削除することを推奨


```json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug example 'mnist'",
            "cargo": {
                "args": [
                    "build",
                    "--example=mnist",
                    "--package=tch"
                ],
                "filter": {
                    "name": "mnist",
                    "kind": "example"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}"
        },
        {
            "type": "lldb",
            "request": "launch",
            "name": "Debug unit tests in example 'mnist'",
            "cargo": {
                "args": [
                    "test",
                    "--no-run",
                    "--example=mnist",
                    "--package=tch"
                ],
                "filter": {
                    "name": "mnist",
                    "kind": "example"
                }
            },
            "args": [],
            "cwd": "${workspaceFolder}"
        }
    ]
}
```

赤枠内の任意の行をクリックしブレークポイントを設定する
※MNISTの学習を実行するだけならば不要
![VSCodeデバッグ6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/0e4bfb11-1d67-0424-9b76-0bf4d911c913.png)

### Pytorch/Rustバインディングを実行する
再度「実行」⇒「デバッグの開始」を選択する
![VSCodeデバッグ7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/388c5e46-964f-faff-e71d-516295a1d3b7.png)

![VSCodeデバッグ8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/9e4432ed-f999-0da9-5347-eafe99a73305.png)
### 実行結果
![VSCodeデバッグ9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704655/9ea2d12c-aac8-5090-3d5a-eb3dd320cd05.png)


以上です