はじめに
1ヶ月以上前に、受講した「AIサロゲートモデルでシミュレーションを高速化する方法とは?」セミナーで、NVIDIA Modulusに興味を持ったので、書籍を買って勉強を始めた。 Modulusを今後勉強する前提として、自分の環境にModulusをインストールしたので、「PINNsことはじめ」としてインストール回りのことをまとめた。
情報源
- はじめてのNVIDIA Modulus - Modulusを使ってPINNsを学習を進める上での参考書としての書籍。7末に発注したのだが、届いたのは8末だった。以下、この書籍のことを「はじめてのModulus」と呼ぶ。
- NVIDIA Moduls - NVIDIA DEVELOPPER内のModulusのページ。
- Modulusダウンロードページ - 上記ページ内「今すぐダウンロード」でリンクされているNGCカタログのModulusのページ。
実行
Dockerインストール
「はじめてのModulus」に従って、既にModulusが組み込まれているDockerコンテナをpullして、コンテナを使用する。Dockerに関しては以下の過去の投稿記事を参考のこと。
- Dockerインストール - 少し古いが、流れは参考になると思う。最新については、本家のこちらのページで確認してほしい。
- Rootless Dockerを構築 - ユーザモード(rootless)で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章以降を読み進めようとしているが、例題の物理がよく理解できないので、中々進まない。