OpenFOAMをGraviton2(Arm)インスタンスで動かして計算する

I need more power...
2020.11.28

世間はApple M1(Arm)プロセッサで賑わってますね。新進気鋭なCPUに興味があるのですが手元にはありません。 職業柄AWSはいじれるのでAWSが設計開発したGraviton2(Arm)プロセッサで遊んでみます。 OpenFOAMをGrabiton2インスタンスで動かせるかやってみます。最終的にクラウドHPC環境の演算ノードでGraviton2を利用するための検証です。

  • OpenFOAM v20 06をGrabiton2(Arm)インスタンスへインストール方法を紹介

OpenFOAMとは

オープンソースの流体解析ツールです。このバイクの画像でおなじみ。こちらはre:Inventの資料です。Intelのc5n.18xlarge(vCPU:72)をHyper-Threading無効で16台とEFA使って演算したようです。

画像引用:PowerPoint Presentation

検証環境

OS Ubuntu 20.04 LTS
OpenFOAM v20 06
Architecture Arm(Graviton2)
AMI ubuntu-focal-20.04-arm64-server-20201026
InstanceType c6g.16xlarge(vCPU:64 Mem:128)

OpenFOAMのインストール

ソースからビルドすればArmでもx86と同じように動くということだけはわかりました。これしか情報はないので当たって砕けろの精神ではじめます。

No source code modifications are required to obtain a working OpenFOAM binary. The process for building OpenFOAM on Arm based systems is equivalent to that on x86 systems, by specifying the desired compiler in OpenFOAM bashrc file.

OpenFOAM on Amazon EC2 C6g Arm-based Graviton2 Instances – up to 37% better price/performance | AWS Compute Blog

インストール手順

2020年6月リリースのバージョンを使用します。インストール手順は公式ドキュメントを参考に進めます。

OpenFOAM® Installation From Source

必要なライブラリをインストールします。

sudo apt-get update
sudo apt-get install build-essential autoconf autotools-dev cmake gawk gnuplot -y
sudo apt-get install flex libfl-dev libreadline-dev zlib1g-dev openmpi-bin libopenmpi-dev mpi-default-bin mpi-default-dev -y
sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev -y
sudo apt-get install libscotch-dev libptscotch-dev libfftw3-dev libboost-system-dev libboost-thread-dev libcgal-dev -y

必要なソースコードをダウンロード。

cd /tmp
wget https://sourceforge.net/projects/openfoam/files/v2006/OpenFOAM-v2006.tgz
wget https://sourceforge.net/projects/openfoam/files/v2006/ThirdParty-v2006.tgz

ホームディレクトリ直下にOpenFOAMディレクトリが作成され、ダウンロードしたファイルが展開されます。

mkdir $HOME/OpenFOAM && tar -xzf OpenFOAM-v2006.tgz -C $HOME/OpenFOAM && tar -xzf ThirdParty-v2006.tgz -C $HOME/OpenFOAM

OpenFOAMの環境設定ファイルを読み込みます。

$ source ~/OpenFOAM/OpenFOAM-v2006/etc/bashrc
No completions for /home/ubuntu/OpenFOAM/OpenFOAM-v2006/platforms/linuxARM64GccDPInt32Opt/bin
[ignore if OpenFOAM is not yet compiled]

foamコマンドでOpenFOAMのディレクトリ移動できたらOKです。

foam

結果

$ pwd
/home/ubuntu/OpenFOAM/OpenFOAM-v2006

Allwmakeコマンドでコンパイルします。マシンスペックによりますが数時間はかかります。

オプション 説明
-j 有効なすべてのCPUを利用
-s メッセージ出力を抑える
-l teeアウトプット(標準出力とログファイルに出力)
./Allwmake -j -s -l

コンパイルが完了時の最後の標準出力内容

省略

 2020-11-22 09:11:03 +0000
========================================
  OpenFOAM-v2006
  Gcc system compiler
  linuxARM64GccDPInt32Opt, with SYSTEMOPENMPI openmpi-system

  api   = 2006
  patch = 0
  bin   = 308 entries
  lib   = 157 entries

========================================
Done logging to 'log.linuxARM64GccDPInt32Opt'

c6g.16xlarge(vCPU:64)でコンパイル完了までに1時間かかりました。ちなみにCPUは全然有効に使い切れてなかった様子でマックスでも33%の使用率。

気になったのでc6g.large(vCPU:2)でも試した結果は2時間半かかりました。

インストールテストコマンドで結果確認します。

foamInstallationTest

ok表示なら成功です。

Summary
-------------------------------------------------------------------------------
Base configuration ok.
Critical systems ok.

テスト実行

pitzDailyのチュートリアルをコピーしてテストします。

mkdir ~/test_run
cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily ~/test_run
cd ~/test_run/pitzDaily

六面体構造格子を生成。

blockMesh

実行結果

省略
----------------
Mesh Information
----------------
  boundingBox: (-0.0206 -0.0254 -0.0005) (0.29 0.0254 0.0005)
  nPoints: 25012
  nCells: 12225
  nFaces: 49180
  nInternalFaces: 24170
----------------
Patches
----------------
  patch 0 (start: 24170 size: 30) name: inlet
  patch 1 (start: 24200 size: 57) name: outlet
  patch 2 (start: 24257 size: 223) name: upperWall
  patch 3 (start: 24480 size: 250) name: lowerWall
  patch 4 (start: 24730 size: 24450) name: frontAndBack

End

simpleFoamで演算を実行します。

simpleFoam は SIMPLE 法を用いた非圧縮性流体の定常乱流解析ソルバーです。

PENGUINITIS - simpleFoam

simpleFoam

実行結果

省略
SIMPLE solution converged in 279 iterations

streamLine streamlines write:
    seeded 10 particles
    Tracks:10
    Total samples:10885
    Writing data to "/home/ubuntu/test_run/pitzDaily/postProcessing/sets/streamlines/279"
End

簡単なチュートリアルだったので秒で結果が返ってきました。

演算結果の可視化

計算結果をローカルに落としてParaViewで可視化しました。画像の左から風が流れ右から抜けていきます。物体内での風の流れを白い矢印で表示しています。画像が小さく分かりづらいのですが、実際は3Dのモデルをグリグリ動かせるのでもっと確認しやすいです。ともあれGraviton2でOpenFOAMを動かし演算することに成功しました。

おわりに

Graviton2(Arm)でもソースからビルドすれば問題なくOpenFOAMは動きました。ParaViewの可視化でいい感じに表現できなかったのが残念なのですが...センス不足で時間が溶けていきました。なにかのシュミレーションを勉強のため動かしたいならOpenFOAMのチュートリアルがおすすめです。可視化してグリグリ動かしているとすごいやった感を得られます。

以上、網走の大村でした。

参考

How to Install OpenFOAM v2006 from Source Pack - CEMF.ir
PENGUINITIS - OpenFOAM v1912 を Ubuntu 16.04 LTS にインストールメモ
PENGUINITIS - blockMesh によるメッシュの作成
OpenFOAMLectureCourseSeries2010-5.key
openfoam · Wiki · Arm HPC Users Group / packages · GitLab