NVIDIA Modulusを試す 〜 PINNsことはじめ

はじめに

1ヶ月以上前に、受講した「AIサロゲートモデルでシミュレーションを高速化する方法とは?」セミナーで、NVIDIA Modulusに興味を持ったので、書籍を買って勉強を始めた。 Modulusを今後勉強する前提として、自分の環境にModulusをインストールしたので、「PINNsことはじめ」としてインストール回りのことをまとめた。

情報源

  1. はじめてのNVIDIA Modulus - Modulusを使ってPINNsを学習を進める上での参考書としての書籍。7末に発注したのだが、届いたのは8末だった。以下、この書籍のことを「はじめてのModulus」と呼ぶ。
  2. NVIDIA Moduls - NVIDIA DEVELOPPER内のModulusのページ。
  3. Modulusダウンロードページ - 上記ページ内「今すぐダウンロード」でリンクされているNGCカタログのModulusのページ。

実行

Dockerインストール

「はじめてのModulus」に従って、既にModulusが組み込まれているDockerコンテナをpullして、コンテナを使用する。Dockerに関しては以下の過去の投稿記事を参考のこと。

また、上記インストールページの「Tags」をクリックして開かれるページ(ダウンロードできるコンテナの一覧が掲載されている)から最新版の一つ前の版である23.05をインストールすることにした。

コンテナをダウンロード(docker pull)

「はじめてのModulus」の50ページ。

$ docker pull nvcr.io/nvidia/modulus/modulus:23.05

インストール後に動作確認するためのサンプルをダウンロード

「はじめてのModulus」の51〜52ページの手順に沿って、Githubからサンプル(modulus-sym-1.1.0.zip)をダウンロードする。

zipファイルをunzipし、$HOME/NVIDIA-Modulus-2305ディレクト配下にコピーする。NVIDIA -Modulus-2305ディレクトリは事前に作成しておく。

コンテナを起動(docker run)

$ cd ~/NVIDIA-Modulus-2305/modulus-sym-1.1.0
$ docker run --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -v ${PWD}/examples:/examples -it nvcr.io/nvidia/modulus/modulus:23.05 bash

上記のコマンドラインでコンテナを起動すると、次のようなエラーとなった。

ocker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error setting rlimits for ready process: error setting rlimit type 8: operation not permitted: unknown.
ERRO[0000] error waiting for container:

コンテナ起動時のエラー対応

Modulusのバージョンは違うが、このドキュメントによると、CUDA 11.7、NVIDIA Driver 515以降の上で動作すると記載されている。ただその後に、例えばT4等データセンターGPUで動作させる場合、各々450.51、470.57、510.45以降のNVIDIA Driverを使える、とあった。465より以前のdriverは、SDFライブラリをサポートしていない。

自分の環境は、NVIDIA-SMIの結果から、Driver Versionが470.199.02、CUDA Versionが11.4であり、上記の記述からは、大丈夫と思う。

一応、Modulus 22.09、22.07、22.03.1でも試したが、同じ結果であった。

色々と考えて、docker runのパラメータで自分の環境には合わない設定があるのでは無いかと、色々と試してみた。

結論から言うと、理由は分からないが、「–ulimit memlock=-1」を外するとModulusコンテナが起動できた。

$ docker run --gpus all --shm-size=1g --ulimit stack=67108864 -v ${PWD}/example\
s:/examples -it nvcr.io/nvidia/modulus/modulus:23.05 bash

サンプルプログラムの実行

コンテナのコマンドラインからサンプルプログラムを実行する。

# cd /examples
# cd helmholtz
# python helmholtz.py
 ・・(略)・・
    raise DeferredCudaCallError(msg) from e
torch.cuda.DeferredCudaCallError: CUDA call failed lazily at initialization wit\
h error: device >= 0 && device < num_gpus INTERNAL ASSERT FAILED at "/opt/pytor\
ch/pytorch/aten/src/ATen/cuda/CUDAContext.cpp":50, please report a bug to PyTor\
ch.

上記のエラーは、rinna 3.6bをdockerから使うでも遭遇したエラーだ!

次のとおり、CUDAから使用するGPUを指定する。

# export CUDA_VISIBLE_DEVICES="0"
# python helmholtz.py

実行結果

# python helmholtz.py
/usr/local/lib/python3.8/dist-packages/hydra/_internal/hydra.py:119: 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.
  ret = run_job(
[03:34:53] - JIT using the NVFuser TorchScript backend
[03:34:53] - JitManager: {'_enabled': True, '_arch_mode': <JitArchMode.ONLY_ACTIVATION: 1>, '_use_nvfuser': True, '_autograd_nodes': False}
[03:34:53] - GraphManager: {'_func_arch': False, '_debug': False, '_func_arch_allow_partial_hessian': True}
helmholtz.py:106: UserWarning: Directory validation/helmholtz.csv does not exist. Will skip adding validators. Please download the additional files from NGC https://catalog.ngc.nvidia.com/orgs/nvidia/teams/modulus/resources/modulus_sym_examples_supplemental_materials
  warnings.warn(
[03:34:55] - attempting to restore from: outputs/helmholtz
[03:34:55] - optimizer checkpoint not found
[03:34:55] - model wave_network.0.pth not found
[03:34:57] - [step:          0] record constraint batch time:  1.409e+00s
[03:34:57] - [step:          0] saved checkpoint to outputs/helmholtz
[03:34:57] - [step:          0] loss:  1.026e+04
[03:35:06] - Attempting cuda graph building, this may take a bit...
[03:35:10] - [step:        100] loss:  1.007e+04, time/iteration:  1.248e+02 ms
[03:35:14] - [step:        200] loss:  9.981e+01, time/iteration:  4.279e+01 ms
・・(略)・・
[03:49:45] - [step:      19800] loss:  5.507e-03, time/iteration:  4.338e+01 ms
[03:49:49] - [step:      19900] loss:  5.341e-03, time/iteration:  4.340e+01 ms
[03:49:55] - [step:      20000] record constraint batch time:  4.922e-02s
[03:49:55] - [step:      20000] saved checkpoint to outputs/helmholtz
[03:49:55] - [step:      20000] loss:  5.092e-03, time/iteration:  5.431e+01 ms
[03:49:55] - [step:      20000] reached maximum training steps, finished training!

helmholtzディレクトリにoutputディレクトリが作成され、モデル(pth)、3Dグラフィックスデータ(vtp)が格納されていた。

まとめ

Dockerコンテナを使って、Modulusを使用することができたが、実行結果(上記)が正しいのか、検証はできていない。

「はじめてのModulus」第2章以降を読み進めようとしているが、例題の物理がよく理解できないので、中々進まない。