Isaac Gymの環境構築

# 初めに

### そもそもIsaac Gymとは？

Isaac GymはNVIDIAが出してるロボット開発向けの強化学習シミュレーション環境になります

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

最近サポート対応外になってしまったのですが代わりに出たIsaac Labは参考文献が無さすぎる上にインストール時のトラブルシューティングがめちゃくちゃ多くて複雑なのでユーザーの参考文献が出回るまではIsaac Gymを使うことを勧めます

https://isaac-sim.github.io/IsaacLab/

### Isaac Gymのここがすごい

1. GPUベースシミュレーション
    - 従来のCPUベースシミュレーション（MuJoCoなど）に比べてかなり高速化
2. 高精度な物理エンジン
    - NVIDIA PhysXというUnreal EngineやUnityにも使われてる強力な物理エンジンを積んでます
3. 並列処理
    - 複数のエージェント（ロボット）を同時に動かして学習させれます

![54f5f2bb-345e-482b-a8b0-36f9a4b3b233.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569952/3fbbfaa7-6b50-c88a-8998-a506f756275f.jpeg)

> ANYmal Parkour: Learning Agile Navigation for Quadrupedal Robots, Robotic Systems Lab: legged Robotics at ETH Zurich より引用

# 環境構築

### 環境

| OS | Ubuntu 20.04 LTS |
| --- | --- |
| Python Version | 3.7 |
| GPU | RTX4070 12GB VRAM |
| CUDA Version | 12.1 |

## インストール

[Isaac Gym](https://developer.nvidia.com/isaac-gym)から圧縮ファイルをダウンロード：

![Screenshot from 2024-06-14 15-53-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569952/9c6d8c04-c56e-a8aa-f2b8-19e48c88054e.png)

圧縮ファイルを解凍：

```bash
tar xf IsaacGym_Preview_4_Package.tar.gz
```

Isaac Gymのインストール (conda環境もrlgpuって名前で作ってくれます)：

```bash
cd isaacgym
./create_conda_env_rlgpu.sh 
```

インストールは以上になります（超シンプル）

## サンプルで検証

まずは仮想環境を起動：

```bash
conda activate rlgpu
```

関節のアニメーションを再生するサンプル(joints_monkey.py)を実行：

```bash
cd python/examples
python3 joints_monkey.py
```

![Screenshot from 2024-06-15 17-34-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569952/4feef2e6-58ea-695f-3255-08ca03f22188.png)

ついでに同じディレクトリ内にあるFrankaのサンプルも試してみました：

![Screenshot from 2024-06-15 17-33-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569952/0b4000ca-2c3b-50f2-c95d-be426927ba0b.png)

次は実際に学習させていきます

学習サンプルリポジトリをgit clone：

```bash
git clone https://github.com/NVIDIA-Omniverse/IsaacGymEnvs.git
```

インストール：

```bash
cd IsaacGymEnvs
pip install -e .
```

倒立振子のサンプルを実行：

```bash
cd isaacgymenvs
python3 train.py task=Cartpole
```

![Screenshot from 2024-06-15 17-36-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569952/d3a38293-7cb3-9476-96c7-3a999f6034ab.png)

初めはすぐに倒れますが、並列処理のおかげでめちゃくちゃ早く学習できてるのが分かりますね。

## トラブルシューティング

### libpythonのimportエラー

エラー文：

```bash
ImportError: libpython3.7m.so.1.0: cannot open shared object file: No such file or directory
```

**解決策** - 対応するlibpythonライブラリ（今回の場合はlibpython3.7）をインストール

```bash
sudo apt install libpython3.7
```

libpython3.Xが見つからない場合：

```bash
E: Unable to locate package libpython3.7
E: Couldn't find any package by glob 'libpython3.7'
```

**解決策** - deadsnakes PPAを追加：

```bash
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
```

### iJIT (intel Just-In-Time) コンパイラ関連の問題でPyTorchがimportできない

エラー文：

```bash
UserWarning: Future Hydra versions will no longer change working directory at job runtime by default.
See https://hydra.cc/docs/1.2/upgrades/1.1_to_1.2/changes_to_job_working_dir/ for more information.
...
from torch._C import *
ImportError: /home/user/miniforge3/envs/rlgpu/lib/python3.7/site-packages/torch/lib/libtorch_cpu.so: undefined symbol: iJIT_NotifyEvent

Set the environment variable HYDRA_FULL_ERROR=1 for a complete stack trace.
```

**解決策** - Intel MKL (math Kernal Library)をダウングレード：

```bash
pip install mkl==2024.0.0
```

### TorchScriptのnvrtcに無効なGPUアーキテクチャが渡される

エラー文：

```bash
RuntimeError: The following operation failed in the TorchScript interpreter.
Traceback of TorchScript (most recent call last):
RuntimeError: nvrtc: error: invalid value for --gpu-architecture (-arch)
```

**解決策** - デバイスに入ってるCUDAに対応したPyTorchバージョンに変更

```bash
nvidia-smi # CUDAバージョンの確認
pip install torch==1.13.1 # 自分の場合CUDA 12.1なのでtorch 1.8.1 -> 1.13.1にアップグレード
```

# 参考文献

https://www.youtube.com/watch?v=PjWvf90l4cg
https://valinux.hatenablog.com/entry/20231122
https://github.com/pytorch/pytorch/issues/123097?source=post_page-----8ebf4b86e6f7--------------------------------#issuecomment-2095228569