AWSでIsaac Simの動作・開発環境を構築する(Windows編)

# 1. はじめに
[NVIDIA Isaac Sim](https://developer.nvidia.com/ja-jp/isaac/sim)は, [NVIDIA Omniverse](https://www.nvidia.com/ja-jp/omniverse/)プラットフォーム上で構築された, 物理演算エンジンを搭載したロボティクスシミュレーションプラットフォームです。本記事では、クラウド環境での動作検証として、AWS上にIsaac Simの開発環境を構築する手順を詳細に解説します。
NVIDIAのGPUドライバーがインストール済みのAMIもありますが、今回はNVIDIAのGPUドライバーのインストールも手動でインストールしてみます。

# 2. ISaac Simのシステム要件の確認

[公式ドキュメント](https://docs.omniverse.nvidia.com/isaacsim/latest/installation/requirements.html#isaac-sim-short-driver-requirements)に記載されている要件は次の通りです。GPUは、Ampereアーキテクチャ以降の世代がサポートされています。

| Element   | Minimum Spec                     | Good                           | Ideal                                  |
| :-------- | :------------------------------- | :----------------------------- | :------------------------------------- |
| OS        | Ubuntu 20.04/22.04, Windows 10/11 | Ubuntu 20.04/22.04, Windows 10/11 | Ubuntu 20.04/22.04, Windows 10/11     |
| CPU       | Intel Core i7 (7th Generation), AMD Ryzen 5 | Intel Core i7 (9th Generation), AMD Ryzen 7 | Intel Core i9, X-series or higher, AMD Ryzen 9, Threadripper or higher |
| Cores     | 4                                | 8                              | 16                                     |
| RAM       | 32GB [1]                         | 64GB [1]                       | 64GB [1]                               |
| Storage   | 50GB SSD                         | 500GB SSD                      | 1TB NVMe SSD                           |
| GPU       | GeForce RTX 3070                 | GeForce RTX 4080               | RTX Ada 6000                           |
| VRAM      | 8GB [1] [2]                      | 16GB                           | 48GB                                   |

# 3.AWSインスタンスの選定
Isaac Simが動きそうなGPUを利用可能かつ、 CPU/メモリのスペックがIsaac Simの要件に近いインスタンスは以下の通りです。

g6eは利用料が高額というのと、ISaac SimはCPUリソースを多く消費するため, CPU数が4では力不足と思われたため、g5.2xlargeをチョイスしました。

| インスタンスサイズ | GPU      | VRAM | CPU | メモリ(GB) | オンデマンド料金/時間(東京リージョン) |
| :--------------- | :------- | :--- | :-- | :--------- | :------------------------------------ |
| g5.xlarge        | A10G x 1 | 24   | 4   | 16         | 1.643 USD                             |
| g5.2xlarge       | A10G x 1 | 24   | 8   | 32         | 2.12576 USD                           |
| g5.4xlarge       | A10G x 1 | 24   | 16  | 64         | 3.09128 USD                           |
| g6e.xlarge       | L40s x 1 | 48   | 4   | 32         | 2.883 USD                             |
| g6e.2xlarge      | L40s x 1 | 48   | 8   | 64         | 3.61968 USD                           |
| g6e.4xlarge      | L40s x 1 | 48   | 16  | 128        | 5.09303 USD                           |

# 4. クォータの引き上げ申請を行う
AWSのデフォルトの状態では, GシリーズインスタンスはクォータのvCPU上限が0となっており、Gシリーズのインスタンスは起動できません。上限が0の状態で、インスタンスの起動を試みると、次のメッセージが表示されます。

>インスタンスを起動できませんでした
You have requested more vCPU capacity than your current vCPU limit of 0 allows for the instance bucket that the specified instance type belongs to. Please visit http://aws.amazon.com/contact-us/ec2-request to request an adjustment to this limit.

このため、サービスクォータの引き上げ申請が必要になります。
今回は, g5.2xlargeを最大2台起動できるように16を指定して申請を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/55defb92-407b-4821-83bc-803b9af1eda5.png)

申請から3時間ほどでクォータ引き上げ申請が承認されました。
ただし、個人ユースのためか,、16個のvCPUは承認されず、8個のvCPUのみが承認されました。

# 5. GPUインスタンス(g5.2xlarge)を起動する
東京リージョンでg5.2xlargeを起動します。設定は以下としました。

- OS：Windows Server 2022
- インスタンスタイプ：g5.2xlarge
- ストレージ：80GB（デフォルト30GBでは不足）
- セキュリティグループ：RDP接続許可
※ ルートボリュームのサイズですが、デフォルトの30GBではディスク容量不足で、GPUのドライバのインストールが失敗したため、80GBに増量しました。(キャンプがとれていなかったため、 キャプチャは30GBのままです。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/13f25b5e-afd4-4359-958b-2bf262b53918.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/f06fc7ba-1b62-44d4-b291-d1c51c976471.png)

# 6. GPUドライバのインストール
EC2インスタンス起動後のデフォルト状態では、GPUドライバはインストールされていません。このため、手動でインストールが必要となります。

[Amazon EC2 インスタンス用の NVIDIA ドライバー](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-nvidia-driver.html)を見ると, ドライバーのインストールには複数のオプションが用意されています。

- オプション 1: NVIDIA ドライバーがインストールされた AMI
- オプション 2: パブリック NVIDIA ドライバー
- オプション 3: GRID ドライバー (G6、Gr6、G6e、G5、G4dn、および G3 インスタンス)
- オプション 4: NVIDIA ゲームドライバー (G5 および G4dn インスタンス)

今回は、オプション3のGRIDドライバーのインストールをチョイスしました。

>ユーザーまたはロールは、[AmazonS3ReadOnlyAccess] ポリシーを含む許可を持っている必要があります。

GRID ドライバーのインストールに際しては、EC2に[AmazonS3ReadOnlyAccess] ポリシーを含むロールを割り当てる必要があります。 EC2用に[AmazonS3ReadOnlyAccess]を持ったロールを作成し, EC2インスタンスに割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/c18e3339-81e5-4fdc-8080-5eb09f3d9a28.png)

[Amazon EC2 インスタンス用の NVIDIA ドライバー](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-nvidia-driver.html)に記載されているPowerShellスクリプトを実行し、最新版ドライバを取得します。

```
$Bucket = "ec2-windows-nvidia-drivers"
$KeyPrefix = "latest"
$LocalPath = "$home\Desktop\NVIDIA"
$Objects = Get-S3Object -BucketName $Bucket -KeyPrefix $KeyPrefix -Region us-east-1
foreach ($Object in $Objects) {
$LocalFileName = $Object.Key
if ($LocalFileName -ne '' -and $Object.Size -ne 0) {
    $LocalFilePath = Join-Path $LocalPath $LocalFileName
    Copy-S3Object -BucketName $Bucket -Key $Object.Key -LocalFile $LocalFilePath -Region us-east-1
}
}
```

ダウンロードが完了すると、デスクトップにドライバーのインストーラーが配置されるので、インストーラーを実行し、ドライバーをインストールします。インストール完了後, nvidia-smiコマンドを実行すると以下のような出力が得られます。バージョン572.83がインストールされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/62d455b2-676e-4793-85a2-a33e459c78c1.png)

[Isaac Sim Driver Requirements](https://docs.omniverse.nvidia.com/isaacsim/latest/installation/requirements.html#isaac-sim-short-driver-requirements)によると、推奨ドライバは537となっており、インストールしたドライバと異なりますが、おそらく動くだろうということでこのまま行きました。

# 7. ISaac Simを起動する
[isaacsim-app-template](https://github.com/isaac-sim/isaacsim-app-template)をクローンして、ビルドして起動します。

```
git clone https://github.com/isaac-sim/isaacsim-app-template.git
cd isaacsim-app-template
.\repo.bat build
.\_build\windows-x86_64\release\isaacsim.exp.full.kit.bat
```

初回起動時は、何かのコンパイル処理を行っているのか、CPUの使用率が100%に張り付き、画面の操作ができなくなるが、しばらく待っているとCPUの使用率が落ち着き操作できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/667299f8-d445-40a1-bf7a-ffbe201f2dd4.png)

PhysXのサンプルも問題なく動作しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/c89d26a9-3a0d-4969-8f47-1484a70011a1.png)

# 8. ISaac Simをブラウザでストリーミング表示する
ISaac Simは, 公式にはサポートしていないようですが[AppStreamer](https://docs.omniverse.nvidia.com/services/latest/services/web-streaming-library/classes/appstreamer.html)を使って、ブラウザでのストリーミング表示が可能です。

補足：
NVIDIA Omniverseの[kit-app-template](https://github.com/NVIDIA-Omniverse/kit-app-template)は,  [AppStreamer](https://docs.omniverse.nvidia.com/services/latest/services/web-streaming-library/classes/appstreamer.html)を使った ブラウザでのストリーミング表示はサポートされていますが、なぜか[isaacsim-app-template](https://github.com/isaac-sim/isaacsim-app-template)では, サポートされていません。ただ、サポートされいないだけで動作するようです。


ISaac Simをストリーミングモードで起動します。


```
.\_build\windows-x86_64\release\isaacsim.exp.full.streaming.kit.bat
```

次に[web-viewer-sample](https://github.com/NVIDIA-Omniverse/web-viewer-sample)を起動します。web-viewer-sampleはNVIDIA提供の[AppStreamer](https://docs.omniverse.nvidia.com/services/latest/services/web-streaming-library/classes/appstreamer.html)を使ったストリーミング表示のサンプル実装です。これを使用することで簡単にISaac Simの画面をブラウザでストリーミング表示できます。

```
git clone https://github.com/NVIDIA-Omniverse/web-viewer-sample.git
cd web-viewer-sample
npm install
npm run dev
※別途Node.jsの最新版を[Node.js](https://nodejs.org/ja/download)からダウンロードしてインストールした。
```

web-viewer-sampleの起動に成功すると、次の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/3b5318a0-24e9-4a41-9441-781a3ffb3040.png)

上記のコンソール中に出力されているURLにブラウザでアクセスし、「UI for any streaming app」を選択してNextボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/c125acb4-9256-4d84-9637-de83e5ef6a2d.png)

すると、ブラウザでISaac Simの画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4072158/026e4fd4-4439-496f-aa85-c9f1e2e139a6.png)


# 9. まとめ
AWS g5.2xlargeインスタンス(Windows)でIsaac Simの基本動作を確認できました。次回は、UbuntuでのISaac Simの基本動作を確認したいと思います。