物理法則から自然現象をシミュレーションするPINNsの使い方

はじめに

こんにちは、AITCの飯干です。前回まではPINNsのご紹介と応用事例を説明してきました。これからは、実際にどのようにしてPINNsによるシミュレーションを実行するのかについてご説明します。

aitc.dentsusoken.com

aitc.dentsusoken.com

物理シミュレーションのためのAIモデルを作成するわけですから、PINNsの実行にはTensorFlowやPytorchなどの機械学習ライブラリが必要です。それらを統合したNVIDIA ModulusというSDKがNVIDIA社から提供されていますので、こちらを使ってPINNsによるシミュレーションを実行する方法を説明していきます。

NVIDIA Modulusの環境設定

まず、GPUを搭載したマシンかクラウドのインスタンスを用意します。GPUの種類はA100、A30、A4000、V100、T4、RTX 30xx以上、Titan V,、Quadro GV100とシミュレーションの規模に合わせて選べるようになっています。規模にもよりますが、学習時はなるべく高速なGPUマシンをお勧めします。

OSは、Ubuntu 20.04もしくはLinux 5.13 kernelを使用し、予めNVIDIA ドライバーをインストールします。使用するバージョンはNVIDIA Driver release 520以降のバージョンを使用します。

ModulusはDockerコンテナ上で使用することにします。CUDA 11.8に対応したModulusのコンテナをダウンロードしてください。また、実行環境ではPython 3.8以降のバージョンのPythonが動く必要があります。

こちらの手順でDockerコンテナをダウンロードすると、一括して環境が構築できるようになっています。以下の手順でインストールと動作確認をします。

以下は、実行環境のターミナル上で実行する環境構築のためのコマンド例です。

  1. NVIDIA docker2をインストールします
    sudo apt-get install nvidia-docker2
  2. Modulusのコンテナをダウンロードします
    docker pull nvcr.io/nvidia/modulus/modulus:
  3. 例題集をgithubのNVIDIA公式のレポジトリからダウンロードします
    git clone https://github.com/NVIDIA/modulus.git
  4. Dockerコンテナ内でModulusを起動します
    docker run --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --runtime nvidia -v ${PWD}/examples:/examples -it --rm modulus:xx.xx bash
  5. コンテナ内で引き続き動作確認用スクリプトを実行します
    cd helmholtz
    python helmholtz.py

ここまで実行して正常に動作すればOKです。

ちなみに、helmholtzは定常共鳴振動をシミュレーションする例題です。これが動作すれば環境の設定は成功したことになります。

詳細手順は下記のURLにあります。更新されることもありますので、最新の情報を確認してください。

docs.nvidia.com

NVIDIA Modulusの例題をいくつか動かしてみる

例えば、例題のCavity Flowでは上面のみが開いている矩形(四角の上面を左から右へ流体が移動していて、矩形の中は空洞)の様子をシミュレーションします。

上端が開いた空洞の上面を左から右への流れ

図は、正方形の矩形を横から見た図になっていて、開いている上面を流体が流れているわけですが、最初は空洞になっている矩形の内部にどのように流体が流れてくるのか頭の中で想像してみましょう。

最初はなにも入ってない矩形の上面を左から右に流体が移動するのですが、次第に矩形の上面から右下に向かって流体が流れ込んでくると予想できますよね?

では、PINNsのシミュレーションでも同じような結果が得られるのでしょうか?

ということで、Modulusの例題でPINNsを実行してみましょう。

この例題では、Navier Stokesの流れ式を呼び出し、壁の境界条件と上端の流れ速度、空洞内の速度と圧力を求めるための関数が記述されています。

dockerの中で、Python ldc_2d.pyと入力して起動します。実行中の様子を機械学習結果の可視化でよく使われるTensorBoardで確認します。

キャビティ流れの学習中の様子をTensorBoardで確認しています(左: 圧力分布、中央: x方向の流速、右: y方向の流速)

以下のように実行できました。

この例題で結果はoutputs/validatorの下に、true,predict,diffの.png画像ファイルが生成されます。


上の図はx方向(u)の流速です。図中、左が数値シミュレーションの結果、中央がPINNs(Modulus)の結果、右が両者の差異です。


上の図はy方向(v)の流速です。図中、左が数値シミュレーションの結果、中央がPINNs(Modulus)の結果、右が両者の差異です。

両者とも左上から右下に向かって、黄色で表された流れが発生していることがわかります。

上端角に微小な差がありますがそれ以外はほぼ0に近い差異となっています。

その他、Modulusでは数多くの例題が容易されていて、基礎、応用、発展のカテゴリーに分けられていますのでお試しください。

基礎の例題:1次元の波の伝搬、2次元の波の伝搬、1次元ばねマス振動モデル
応用の例題:STLファイルを読み込んだ動脈瘤シミュレーション(医療)、時間発展流体シミュレーション、電磁気学応用(3D導波管)、2次元チャネル内の乱流シミュレーション
発展の例題:共役熱伝導問題、パラメトリックな放熱フィンの熱流体シミュレーション、固体流体の熱流体シミュレーション、FPGAの冷却、産業用のヒートシンク

PINNsのシミュレーションを作成して、ご自身でオリジナルの物理現象をシミュレーションすることができるようにするためのコンサルティング等、様々なPINNsに関するコンサルティングを実施していますので、相談を希望される方は、お気軽にこちらのお問い合わせフォームからご連絡ください。

AITCお問い合わせフォーム

筆者
AIコンサルティンググループ コンサルタント
飯干 茂義
JSAE正会員、JDLA 2020#1