Ubuntu に NVIDIA Modulus 環境をサクッと構築！ Docker/NGC コンテナ活用備忘録

## はじめに
こんにちは！ 最近、物理シミュレーションと深層学習を組み合わせた Physics-Informed Neural Networks (PINNs) が注目されていますね。NVIDIA が提供する Modulus は、この PINNs を効率的に実装・実行するためのフレームワークです。

今回、手元の Ubuntu マシンに Modulus を導入しようとしたのですが、特に Docker と NGC (NVIDIA GPU Cloud) のコンテナを利用した環境構築について、Web 上で具体的な手順やトラブルシューティングを詳細にまとめた日本語の記事があまり見当たらず、実際に試行錯誤することがありました。

そこで、同じように Modulus の環境構築を目指す方や、Docker/NGC でのセットアップに関心がある方の参考になればと思い、その過程と解決策を Qiita に備忘録としてまとめることにしました。

この記事では、Docker/NGC コンテナを使って Ubuntu 上に Modulus の実行環境を構築した際の具体的な手順や注意点、そして実際に遭遇したバージョン関連の問題とその対処法を中心に紹介します。

**補足**: NVIDIA Modulus は、現時点では主に Linux 環境での利用が公式にサポートされています。Windows 環境では WSL2 を介した Docker 上などで動作する可能性はありますが、導入や安定性の観点から Linux が推奨されます。そのため、この記事でも Ubuntu 上での Docker を利用した環境構築を紹介しています。

## なぜ Docker/NGC コンテナか？
Modulus を使うために必要な CUDA Toolkit, cuDNN, PyTorch, Modulus 本体、その他依存ライブラリのバージョンを一つ一つ手動で合わせてインストールするのは大変です。NGC で提供されている Modulus 用の Docker コンテナには、これらのソフトウェア一式が 動作検証済み の状態で含まれています。

ホストマシンには NVIDIA ドライバ と Docker (+ NVIDIA Container Toolkit) があれば、コマンド一つで Modulus 環境を起動できるため、環境構築の手間を大幅に削減できます。

## 環境構築手順
### Step 1: 前提ソフトウェアのインストール (ホスト OS)
まず、ホストマシン (Ubuntu) に以下のソフトウェアがインストールされていることを確認します。

最新の NVIDIA ドライバ: ご使用の GPU に対応したドライバが必要です。
Docker Engine: 公式サイトの手順に従ってインストールします。
参考: https://docs.docker.com/engine/install/ubuntu/
インストール後、docker --version で確認。
sudo なしで docker コマンドを使えるように設定しておくと便利です (Docker post-installation steps)。

NVIDIA Container Toolkit: Docker コンテナから GPU を利用するために必須です。公式サイトの手順でインストールします。
参考: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
インストール後、Docker サービスを再起動 (sudo systemctl restart docker) し、以下のテストコマンドでコンテナから GPU が認識されるか確認します（CUDA バージョンは適宜読み替えてください）。

**Bash**
`sudo docker run --rm --gpus all nvidia/cuda:12.3.2-base-ubuntu22.04 nvidia-smi`

nvidia-smi の出力が表示されれば OK です。

### Step 2: Modulus Docker イメージの取得 (Pull)
NGC カタログ (https://catalog.ngc.nvidia.com/) で "Modulus" を検索し、利用したいバージョンのタグを確認します。ここでは最新版に近い 24.01 を使用します。

ホストマシンのターミナルで以下のコマンドを実行し、Docker イメージをダウンロードします。

**Bash**
`docker pull nvcr.io/nvidia/modulus/modulus:24.01`
（イメージサイズが大きいので時間がかかる場合があります）

### Step 3: Modulus コンテナの起動
イメージのダウンロードが完了したら、コンテナを起動します。

**Bash**

1. Modulus のプロジェクトファイルを置きたいディレクトリに移動
    (例: ホームディレクトリに my_modulus_project を作成)
`mkdir ~/my_modulus_project`
`cd ~/my_modulus_project`

2. コンテナを起動
`docker run --gpus all -it --rm \
  -v $(pwd):/workspace \
  --shm-size=1g \
  nvcr.io/nvidia/modulus/modulus:24.01 bash`
`--gpus all`: ホストの GPU をコンテナから利用可能にします。
`-it`: インタラクティブなターミナル（シェル）を起動します。
`--rm`: コンテナ終了時に自動でコンテナを削除します。
`-v $(pwd):/workspace`: **非常に重要**です。 ホストの現在のディレクトリ ($(pwd)) を、コンテナ内の /workspace ディレクトリとしてアクセスできるようにします。ここに Python スクリプトや設定ファイルを置くことで、コンテナ内から利用できます。また、コンテナ内で /workspace 以下に生成されたファイルはホスト側にも残ります。
`--shm-size=1g`: 共有メモリサイズ。念のため指定しておきます。
`nvcr.io/nvidia/modulus/modulus:24.01`: 使用するイメージ名とタグ。
`bash`: コンテナ起動後に bash シェルを起動します。
成功すると、コンテナ内のシェルプロンプト (`root@<コンテナID>:/workspace#` のような表示) に切り替わります。

### Step 4: 環境の確認
コンテナ起動時に、以下のような Modulus のバージョン情報が表示されるはずです。

`====================`
`== NVIDIA Modulus ==`
`====================`

`NVIDIA Release 24.01 (build ...)`
`Modulus PyPi Version 0.5.0 (...)`
`Modulus Sym PyPi Version 1.4.0 (...)  # <<< これが重要！`

`Container image Copyright ...`
`...`

特に `Modulus Sym PyPi Version 1.4.0` の部分が、`modulus.sym` 以下のシンボリック機能のバージョンを表しており、比較的新しいことを確認できます。

念のため、pip コマンドでも確認できます。

`Bash`
`コンテナ内で実行`
`pip show nvidia-modulus-sym`
`PVersion: 1.4.0 `と表示されれば OK です。（`pip show nvidia-modulus` だと異なるバージョンが表示されることがありますが、`nvidia-modulus-sym` の方が重要です）。

**(補足) 以前遭遇したバージョン問題**
実は最初、少し前のタグ (23.09) を試したところ、コンテナ起動時の表示は 23.09 でも、`pip show nvidia-modulus` で確認すると非常に古いバージョン (0.3.0) が表示され、新しい Modulus の機能（特定の Constraint クラスなど）が ImportError になる問題に直面しました。もし同様の問題に遭遇した場合は、より新しいコンテナタグ (24.01 など) を試すことを強くお勧めします。

基本的な使い方と次のステップ
これで Modulus の実行環境が整いました！

ホストマシンのプロジェクトディレクトリ（`docker run` を実行した場所）に、自作の Modulus Python スクリプト (`your_script.py`) や設定ファイル (`conf/config.yaml` など）を置きます。
コンテナ内の `/workspace` ディレクトリには、これらのファイルがマウントされて見えているはずです (`ls -l` で確認)。
コンテナ内で Python スクリプトを実行します。
`Bash`

`コンテナ内で実行`
`python your_script.py`
計算結果（ログ、.npz ファイル、VTK ファイルなど）は、`Hydra` の設定に従い `/workspace/outputs/... `以下に保存され、それはホスト側からも確認・利用できます。

## まとめ
NVIDIA NGC の Modulus Docker コンテナを利用することで、依存関係の解決に悩むことなく、Ubuntu 上に比較的簡単に Modulus の実行環境を構築できました。特に、-v オプションによるホストとのディレクトリ共有は、開発を進める上で非常に便利です。

バージョン間の差異や設定のクセで少しデバッグが必要な場面もありましたが、最新の安定版コンテナを使うことで多くの問題が回避できると思われます。

これから Modulus を始める方の参考になれば幸いです。