Isaac Gymを1から環境構築

## Isaac Gymとは？
NVidia社が提供する深層学習向けの物理シミュレーションのこと。従来の深層学習ソフトウェアと異なり、**GPUのみで計算を行うことができる**ので、CPUとGPUの間の通信を行わずに済み、その分のボトルネックが解消されて高速で動作するということのようだ。
（ちなみにこれらは正確にはIsaac Simというツールキットの特徴で、Isaac GymはIsaac Simを簡単に使えるようにするインターフェイスを提供する拡張機能である。）

また、Isaac Gymでは、
+ ROS/ROS2のコマンドを使った操作ができる
+ gazeboなどと同様にURDFファイルを用いてロボットモデルをインポートできる
など、ROSを強く意識したアプリケーションとなっている。

今回の環境構築では、主に

https://docs.omniverse.nvidia.com/isaacsim/latest/index.html

ここから情報を得ている。
## コンピュータの最小要件
https://docs.omniverse.nvidia.com/isaacsim/latest/installation/requirements.html

![スクリーンショット 2024-05-10 11.35.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3446213/b49672dd-7285-b8ba-79ec-7a91d7962df8.png)
上の表を見てもらえればわかるように、VRAM8GB以上のGPUと、それなりの性能のCPUが必要になっている。また、表の下に記述があるように、**WindowsではIsaac Simの一部機能が利用できない**ので、ROSを使うことも考慮するとOSは大人しくUbuntu20.04あたりにしておくのが無難。（22.04でない理由は後述)。
<table>
<thead>
<tr><th><th>
  <tr>
    <td><b>CPU</td>
    <td>AMD Ryzen™ 9 7950X3D プロセッサ</td>
  </tr>
  <tr>
    <td><b>GPU</b></td>
    <td>GeForce RTX™ 4080 Super ZOTAC製</td>
  </tr>
  <tr>
    <td><b>ストレージ</b></td>
    <td>1TB SSD NVMe Gen.4対応 WD製</td>
  </tr>
  <tr>
    <td><b>OS</b></td>
    <td>Ubuntu20.04</td>
  </tr>
</table>

以上のような環境を用いた。
## アカウント登録
まず、Isaac gymをインストールするには、NVidia社にメールアドレスを登録する必要がある。

https://developer.nvidia.com/isaac-gym

上のURLをクリックして「**Join now**」をクリックすると、下のような画像が出てくる。
![スクリーンショット 2024-05-10 12.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3446213/51524272-1a33-5177-db78-5f21fa9c18b5.png)
ここに登録したいメールアドレスを書いて「**Next**」に進むと、
![スクリーンショット 2024-05-10 12.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3446213/95599532-4236-15de-ce07-f39d48ded84a.png)
このような画面に移るので、メールアドレスとパスワードを記入して、NVidiaの個人情報についてのポリシーに同意すれば登録完了。
##  Isaac Gymのダウンロード
再び「**Join now**」を押すと、今度はIsaac Gymのダウンロード画面に遷移する。ここでアンケートに答えたのち、 

![スクリーンショット 2024-05-10 12.56.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3446213/343d8ed4-8184-2eb7-f6c8-b61a0f1d3ae2.png)
緑色のボタンからダウンロードが可能。
この時、Ubuntu Linux18.04/20.04と、上で説明したものとは異なる環境が推奨されているが、多分古いだけだと思われる。とはいえ不安なので、どちらでも問題ないようUbuntuのバージョンは20.04を選択しよう。
## 環境構築
isaacgym/docs/index.htmlに大体のことが書いてあるから、まずはその通りに進めよう。
Prerequisitesは一旦後回し。
一つだけ注意として、NVidiaはanacondaを用いた環境構築を推奨しているので、
「**Install in a new conda environment**」　=> 「**Install Example RL Envionments**」の順に行おう。conda(もしこだわりがあるならdocker)を使うことで、**環境構築を間違えてもその環境を捨てて簡単にやり直すことができる。**

ここで、まずAnacondaをinstallしてくる。

https://www.python.jp/install/anaconda/unix/install.html

この通りにやれば問題ない。また、仮想環境内でpython3.6~3.8になっていればよいので、**install後のpythonのバージョンが3.11.x(and more)でも問題ない。**

以降はindex.htmlの指示通りに進もう。またここで注意点として、ubuntu20.04を使っているため、必ず
```
ImportError: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory
```
というエラーを吐くはず。これを解決するために、

```
export LD_LIBRARY_PATH=/home/xyz/anaconda3/envs/rlgpu/lib
```
というふうに環境変数を定義してやる。(xyzは自分のディレクトリの名前。ImportErrorの後ろに書いてあるはずなのでそこをコピペするのが良い)

ここまででjoint_monkey.pyは動く。（もし動かないなら、次の項に一旦進んでから戻ってくる）。**しかし、（少なくとも今回の環境では）このままではGPUを使うことができなかった。**
## NVidia Driverのインストール
Prerequisitesは、
+ Ubuntu 18.04 or 20.04
+ Python 3.6~3.8
+ Minimum NVidia driver version:
    + Linux: 470

(今回の動作環境)

<table>
<thead>
<tr><th><th>
  <tr>
    <td><b>Nvidia driver</td>
    <td>535.171.04</td>
  </tr>
  <tr>
    <td><b>Cuda toolkit</b></td>
    <td>12.2</td>
  </tr>
  <tr>
    <td><b>python</b></td>
    <td>3.8.19</td>
  </tr>
  <tr>
    <td><b>anaconda</b></td>
    <td>24.1.2</td>
  </tr>
  <tr>
    <td><b>pytorch</b></td>
    <td>2.2.2</td>
  </tr>
  <tr>
    <td><b>torchvision</b></td>
    <td>0.17.2</td>
  </tr>
  <tr>
      <td><b>torchaudio</b></td>
      <td>2.2.2</td>
</table>

先程後回しにしたのは、　**このdriver周りがすごく面倒だから。**
一旦ドライバのインストール法についてだが、

https://qiita.com/muramasa2/items/47b337b6e0e808d8a719

このようにしてドライバをインストールするのが良い。

ドライバのバージョンについては、環境によってまちまちだが、今回は**535.171.04**を使用している。多分新しくても問題はないと思うが、Isaac Gymの基となるIsaac Simが525.xx.xxを推奨しているため、新しすぎると動かないかもしれない。

https://docs.nvidia.com/deploy/cuda-compatibility/index.html#faq

詳しくはここを参照。
ドライバのバージョンが大事な理由は二段階に分かれていて、
+ NVidiaドライバのバージョンに応じて、使えるcuda toolkit（nvidiaのGPUを数値計算に使うためのライブラリ）のバージョンが異なる
+ cuda toolkitのバージョンに応じて、使用するpytorch(pythonの提供する深層学習ライブラリ)のバージョンが異なる

つまり、**pytorchが動くように逆算してnvidia driverを入れる必要がある。**

同時にあんまり古いドライバだと入れられなかったりもするので、場合によってはトライアンドエラーする必要があるが、入れ直す場合も上のリンクを参考にしてやれば良い。


https://pytorch.org/get-started/previous-versions/

https://pytorch.org/

pytorchはこのリンクを参考にして入れる。あまりpipとcondaを併用するのは良くないらしいので、自分はpip->condaと置き換えて利用した。(index.htmlで pip install -e .をするやつだけは仕方なくpipを利用した)

自分の環境では、二つ目のリンクのようにやるとpytorch2.2.2が入らなかったので、previousのようにpytorchのバージョンも指定してinstallしている。

```
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=12.1 -c pytorch -c nvidia
```
を使用。

また、**cuda-12の後方互換性から**、cuda-12.2でもcuda-12.1用のpytorchは問題なく動いた。（cuda-12.4,5で12.1のバージョンのものが動くかどうかは未確認。12.4用のpytorchはプレリリース版しかない。(2024/5/24現在)）

ここでの注意点だが、
+ rlpguは最初python3.7系が入っている。pytorchは3.8以降でしか動かないので、必ず更新すること。3.9以降ではisaacgymの要件から外れるので**必ず3.8**
```
conda install python=3.8
```

とすれば3.8をインストール可能。
+ 環境を作り直したい時は、
```
#仮想環境から一旦抜ける
conda deactivate 
#rlgpuを削除
conda remove -name rlgpu --all
```
としてから、再びroot directoryに戻って
```
./create_conda_env_rlgpu.sh
conda activate rlgpu
```
とする。この時、IsaacGymEnvsのレポジトリに戻って
```
pip install -e .
```
としないと、
```
ImportError: No module named "hydra"
```
のようなエラーが出てしまうので注意。

+ LD_LIBRARY_PATHをいちいちexportするのが面倒なら、~/.bashrcに記述すれば以降書かなくて良くなる
+ pytorchが正常に入れられているかは、
```
python
touch.__version__
touch.cuda.is_available()
```
として
```
(バージョン)
True
```
となっているかで確認可能。

もしこれで動くならOKだが、自分の環境では他にも様々なエラーを吐いた。

## Ninja build
自分の環境では、
```
RuntimeError: Ninja is required to load C++ extension
```
というエラーを吐いた。どうやら「**Ninja build**」というmakeに近いビルドツールが必要らしい。

https://installati.one/install-ninja-build-ubuntu-20-04/

このリンク先の言う通りにやったらうまくいった。

## Numpy

numpy>=1.24の場合、np.intやnp.floatが非推奨となるので、代わりにnp.int64やnp.float64(or np.float32)に書き換えてやる必要がある。幸いisaacgym以下のコードを書き換えるだけで済んだので、該当箇所を書き換えて対応。

もしくは
```
conda install numpy=1.19.3
```
のようにダウングレードしても良い。


## 参考

https://docs.omniverse.nvidia.com/

https://developer.nvidia.com/isaac-gym

https://pytorch.org/

https://installati.one/install-ninja-build-ubuntu-20-04/

https://qiita.com/muramasa2/items/47b337b6e0e808d8a719