コンテナ環境 singularity で Treefoam を使おう !!

しょくぶつ(^^) です。 HPC環境でもTreefoamを使いたい!!
という方は多いですよね?

HPCとは
ハイパフォーマンスコンピューティング (HPC) とは | 用語集 | HPE 日本

TreeFoamとは
AboutTreeFoam - OpenCAE Users Wiki

しかし、HPC環境でTeefoamをインストールして使おうとしても、root権限 (sudoなど) が使えないのは勿論、Ubuntu環境ではなく別環境だったりするのが苦労する点です。
いろいろ試みたところ『コンテナ環境さえ使えれば、』Treefoam環境を構築できたので紹介します !!

1. なぜUbuntu環境でなく、また、root権限(sudoなど)を使えない環境だとTreefoamを使えないのか?

いろいろ試したのですが、Ubuntu環境でないとPyGObjectのインストールでつまづくようです。

2. Windows環境にコンテナ環境 "singularity" を用意

コンテナ環境としてはDockerが有名ですが、root権限が使えない環境だと、Dockerも使えないことが多いですよね。
そこで、root権限がない環境でもよく使われる、

singularity

というコンテナ環境を使います。

※ singularityとは、HPC (High Performance Computing) 環境向けに開発されたコンテナプラットフォームとのことです。
Singularity

本記事の前提条件は上記のとおり「コンテナ環境さえ使えれば、」ですので、もし使えない場合はここで諦めてください・・・
コンテナ環境としてSingularityではなくDockerでも可能でした。
しかしDockerのコマンドはメモし忘れたので、すみませんが頑張って変換してください。
 
さて、『Ubuntu環境でなく、また、root権限(sudoなど)を使えない環境』上で作業する前に、まずはローカルのWindows環境でいろいろ準備します。
こうすることで、root権限が使えない関係でいろいろつまづくパッケージのインストールが一気に楽になります。
そこで、まずWindows環境にsingularityをインストールします。

手順1: Windows へ WSL2(Windows Subsystem for Linux 2) をインストール

(1) 事前設定
方法はいろいろあるのですが次の方法だとコマンド2個だけで楽ちんです。
※下記URLを参考にしました。
EQQ.jp - singularityon10.html

i) LinuxWindows サブシステム オプション機能を有効にします。

PS > dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

ii) 仮想マシン プラットフォーム のオプション コンポーネントを有効にします。

PS > dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

(2) ストア版のWSL2をインストール
私はubuntu22.04.3 LTSをインストールしました。
インストール後は再起動が必要でした。

手順2: WSL2内にsingularityをインストール

(1) WSL2を起動

(2) ネット環境の必要に応じてProxyを設定

(3) apt実行前のいつものおまじない

sudo -E apt-get update
sudo -E apt-get upgrade

(4) 作業用のディレクトリ作成

mdkir ~/apps

(5) 作業用ディレクトリに移動

cd ~/apps

(6) Singularity (ver. 3.10.2) の.debファイルをダウンロード

curl -L -O https://github.com/sylabs/singularity/releases/download/v3.10.2/singularity-ce_3.10.2-focal_amd64.deb

(7) Singularity (ver. 3.10.2) のインストール

sudo -E apt install ./singularity-ce_3.10.2-focal_amd64.deb

3. インスタンス(≒コンテナ)作成

いよいよコンテナを作成していきます。
なお、singularityではコンテナではなくインスタンスと呼びます。

(1) インスタンス保管用ディレクトリの作成

インスタンス(≒コンテナ)イメージを保管するためにmy_docker_imgというディレクトリ作成しましょう

(2) その下に temp ディレクトリ作成

my_docker_imgディレクトリの下にtempディレクトリを作成します

(3) イメージをpullして、インスタンスを作成

今回は「u2004-treefoam」という名前で、ubuntuのver. 20.04のインスタンスを作成します。
次のコマンドでDocker Hubにあるubuntuリポジトリからイメージを取得します。

singularity build -s u2004-treefoam docker://ubuntu:20.04

もしこのコマンドでNGならば、dockerのユーザーIDを用意した上で、

singularity build -s --docker-login u2004-treefoam docker://ubuntu:20.04

※ dockerだと docker pull ubuntu:20.04 に相当するコマンドです。 更に-sオプションを付けることで書き込みできようにしています。
※ イメージの参考URL
https://hub.docker.com/_/ubuntu/tags

※ 後でOpenfoamもインストールするので、ubuntuにOpenfoamも入ったイメージをpullしてくれば良さそうですよね。 しかし、私はうまくTreefoamをHPC上で完動させるまでもっていくことができませんでした。

4. インスタンス(≒コンテナ)内に入る

次のコマンドでインスタンス「u2004-treefoam」の中に入ります。

singularity shell -f -w --bind ~/my_docker_imgs/temp/:/tmp/ u2004-treefoam

※ rootとして(-f)、インスタンスに書き込みできる状態で(-w)、入っています。
※ もしsingularityではなくdockerだったら docker run -it <イメージファイル名>:<タグ名> /bin/bashとすることで,コンテナ内のターミナルに入ることができます。その他、特権モードが使えるよう –privileged が必要かもしれません。 --bindに相当する -v はDockerでは使わなくても良かった気がします。
無事にコンテナ内には入れれば、プロンプトが次のように変わります。

Singularity>

この時点で failed to set O_CLOEXEC flags on image というエラーが出た場合。

WSLがWSL2ではなくWSL1なのが原因です。
確認方法は、Powershellにて wsl -l -v です。
WSL2への更新方法は次の通りです。 Powershellにて
 1. wsl.exe --update
 2. wsl --set-version Ubuntu-22.04 2

PS C:\Users\(ユーザー名)> wsl --set-version Ubuntu-22.04 2
WSL 2 との主な違いについては、https://aka.ms/wsl2
を参照してください
変換中です。これには数分かかる場合があります。

   ・・・という画面が出るのですが、数分じゃなくて10分以上かかります。
 
 3. wsl --set-default-version 2

5. インスタンス(≒コンテナ)内(1回目)

まず2つディレクトリを作ってください。

mkdir /bwk
mkdir /work

更に2つディレクトリを作成します。

 mkdir  /tmp/.X11-unix 
 mkdir  /mnt/wslg

※ これは、WSL2でWslgを使ってコンテナ内からGUI表示させる用です。  WSL2上での動作確認しないならば不要です。
※ 次のURL を参考にしました。
WSL2上のコンテナからWSLgを使用する

このあと、いったんインスタンスからexitします。

6. インスタンス(≒コンテナ)内に入り直す

次のコマンドでインスタンス内に入り直します。
(このあとネットからファイルをガンガン引っ張ってくるのでproxyは正しく設定されていることを printenv などで確認しておくと安心です。)

singularity shell -f -w --bind ~/my_docker_imgs/temp/:/tmp/,/tmp/.X11-unix,/mnt/wslg  u2004-treefoam

7. インスタンス(≒コンテナ)内(2回目)

次のように(1)~(8)のコマンドを実行してください。

(1) /tmpに権限付与

chmod 777 /tmp

なぜかわからんがとにかくアクセス権限が不足なので。そうしないとapt-get update時に次のエラー発生。

Couldn't create temporary file /tmp/apt.conf.RZ13su for passing config to apt-key)

(2) apt-get実行前のいつものおまじない

apt-get -y update
apt-get -y upgrade

(3) apt-get の実行 その1

Treefoamの実行に必要な GNOME デスクトップ環境 をインストールします。

apt-get install ubuntu-gnome-desktop

※ 途中で 地域と都市 を聞かれます。

(4) apt-get の実行 その2

pipをはじめ、Treefoamの実行に必要なPyQt5、
その他
 dbus-x11,
 gnuplot,
 xterm,
 packagekit-gtk3-module
をインストールします。

apt-get install -y dbus-x11 pip gnuplot xterm packagekit-gtk3-module python3-pyqt5

(4)参考1 dbus-x11 について

HPCなどでGnome-terminalがうまくいかないとき、次のようにdbus-launchを使って起動をトライできます。
しかし、これでもダメなときはダメです。

dbus-launch gnome-terminal

※ 参考URL
Dockerコンテナ内でgnome-terminalの実行を試みるもエラー(Failed to execute child process “dbus-launch” (No such file or directory)) #Docker - Qiita

(4)参考2 pip について

もしダメな場合は次の方法で。

Singularity> sudo -E curl -kL https://bootstrap.pypa.io/pip/3.4/get-pip.py | python3

※ 参考URL
pipのインストール方法 #Python - Qiita

(4)参考3 gnuplot について

残差グラフの表示に必要。  

(4)参考4 xterm について

HPCではコンテナ内からgnome-terminalを呼び出せないことが多いので、代わりにターミナルとして必要。

(4)参考5 packagekit-gtk3-module について

HPC上での、エラー「Gtk-Message: Failed to load module "pk-gtk-module"」対策として必要。
※ 参考URL
How to fix "Failed to load module "pk-gtk-module" - Ask Ubuntu

(4)参考6 PyQt について

もしダメな場合は次の方法で。

apt-get install python3-pyqt5

インストールがうまくいってもPyQt5が動かない場合、次のも必要みたいです。

apt install libxcb-xinerama0

※ 参考URL
PyQt5をUbuntuで使うときにGUI周りでエラー (WSL2) #Python - Qiita
(やらないと、Treefoamでの境界条件の設定などでこのURLのとおりエラーが出る)

(5) pipの実行

vtk, PyFoamをpipでインストールします。Treefoam実行に必要。 どうせコンテナ内なのでpython仮想環境なんか作らず、ガンガンインストールします。

pip install vtk PyFoam

(6) Openfoamのインストール

ホスト側(HPC側)のOpenfoamを呼び出せそうもないので、Openfoamそのものもインストールしちゃいます。
ただしここは鬼門でして、proxy環境によってはまったく進めません。
うまくproxy環境を切り替えてください。
健闘を祈る !!
※ インストール方法の参考URL
debian · Wiki · Development / openfoam · GitLab

※ ここに載せた方法でどうしてもダメな場合は、windows10用をインストールしてみる手もあります。
OpenFOAM® Installation on Windows 10

wget -q -O - https://dl.openfoam.com/add-debian-repo.sh | sudo bash
apt-get install openfoam2312-default

特に、次のコマンドはsingularityインスタンス特有です。

echo './usr/lib/openfoam/openfoam2312/etc/bashrc' >> $SINGULARITY_ENVIRONMENT

コンテナではないときは .bashrc に書き込むものですが、singularityではコンテナの起動時にbashrcが実行されません。
その代わりに、 $SINGULARITY_ENVIRONMENT に定義されているファイルが実行されます。
( 私の場合、 $SINGULARITY_ENVIRONMENT は /.singularity.d/env/91-environment.sh でした。)
そこで上記の方法で $SINGULARITY_ENVIRONMENT に定義されているファイルに、本来 .bashrcに書くべきものを書き込きました。

(7) いよいよTreefoam本体のインストール

まずファイルを引っ張ってきます。 次の2つのURLのファイルをchromeなどでダウンロードしましょう。
http://opencae.gifu-nct.ac.jp/pukiwiki/index.php?plugin=attach&refer=AboutTreeFoam&openfile=treefoam_3.21.231130_all.deb

http://opencae.gifu-nct.ac.jp/pukiwiki/index.php?plugin=attach&refer=AboutTreeFoam&openfile=treefoam-doc_3.21.231130_all.deb

そして次のコマンドでインストールします。あっという間に終わります。

dpkg -i treefoam_3.21.231130_all.deb
dpkg -i treefoam-doc_3.21.231130_all.deb

さあ!! 動作確認してみましょう !!

/opt/Treefoam/treefoam

うまく起動するでしょうか?

ローカルPC上のsingularityでのTreefoam起動の様子

なお、完全な動作のためにはTreefoamの設定ファイルの修正が必要です。
このWSL2環境で設定してもHPC環境では動作しないので、ここでは修正はしません。

(8) VirtualGLのインストール

Treefoamから呼び出すmesh Viewerとかstlファイル確認ツールを、私が使っているHPC上で高速表示するはVirtualGLが必要でした。
(HPC使用環境によってはなくてもいいかもしれません。また高速表示できなくても動作可能ですが、実用的ではありません。)
このVirtualGLとは、本来はリモート接続環境でOpenGLを使うために用いるものですが、ここではインスタンス(≒コンテナ)内からOpenGLを使うのに利用します。

まず、ここからファイルをダウンロードします。  https://sourceforge.net/projects/virtualgl/files/
私は2.6.5をインストールしました。 ファイル名は virtualgl_2.6.5_amd64.deb です。

インストールは次のコマンドであっという間に終わります。

dpkg -i (ファイル名)

念のため、

apt-get install -f

も実行しましょう。

そして次のコマンドで初期設定します。

vglserver_config

このコマンドを実行して次のように答えてください。

1) Configure server for use with VirtualGL
2) Unconfigure server for use with VirtualGL
X) Exit
 
Choose:
1

WARNING: Configuring this server for use with VirtualGL will disable the
ability to log in locally with a Wayland session.

Continue?
[Y/n]
Y

Restrict 3D X server access to vglusers group (recommended)?
[Y/n]
n

Restrict framebuffer device access to vglusers group (recommended)?
[Y/n]
n

Disable XTEST extension (recommended)?
[Y/n]
y

再度、次の画面が出たら X を選んで終了

1) Configure server for use with VirtualGL
2) Unconfigure server for use with VirtualGL
X) Exit

ローカルPCでのインスタンス (≒コンテナ)の準備はここまでです。 
おつかれさまでした。 
インスタンスからexitしましょう。

8. ローカルPCからHPCへインスタンス (≒コンテナ)を移動

次にローカルPCからHPCにインスタンス (≒コンテナ)を移動します。
ローカルPCで次のコマンドを実行して、インスタンスをファイル名 u2004-treefoam.sif としてまとめます。 ( 「イメージ化」と呼べば良いのかな? )

singularity build u2004-treefoam.sif u2004-treefoam

実行するとWarningだけでなく ERROR も出ますが無視して大丈夫です。
できあがったファイル u2004-treefoam.sif は、WinScpなどのFTPアプリでローカルPCからHPCにを移動します。

Dockerだとファイルやディレクトリとしてイメージなどが見えず、ローカルに保存したコンテナイメージ一覧を表示するのに docker images --all とか実行しないと見えないのですが、singularityだと普通にファイルとして見えるのが楽ですよね。

9. HPC上にてインスタンス(≒コンテナ)を展開

HPC上にて、(必要に応じてsingularityを使う設定をした上で) ファイル u2004-treefoam.sif をsandboxとして展開します。

singularity build -s u2004-treefoam u2004-treefoam.sif

次に xtermを動かすために環境変数を設定します。

setenv SINGULARITY_CONTAINLIBS /lib64/libutempter.so.1.1.6,/lib64/libutempter.so.0

そうそう、インスタンスを展開したディレクトリの下にtempディレクトリも作成しておいてください。

mkdir temp

そしてインスタンス内に入ります。

singularity shell -f -w --bind ~/my_docker_imgs/temp/:/tmp/ u2004-treefoam

もし上記でうまくいかないときは、次のコマンドを試してください。

singularity shell -f -w --bind ~/my_docker_imgs/temp/:/tmp/,/run/user:/run/user u2004-treefoam 

10. いよいよHPC上でTreefoam起動 !!

まずはTreefoamを動作確認してみましょう。

vglrun /opt/TreeFoam/treefoam &

次のように起動したでしょうか ??

HPC上のsingularityでのTreefoam起動の様子

たとえば、stlチェックしたりすると次のwarningが出るのですが、動作には問題なさそうです。

editStlFilesDialog.py:17017): dbind-WARNING **: 18:37:17.559: Couldn't register with accessibility bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.

stlチェック時の様子

また、meshViewer起動時、次のエラーが出ますが、動作に問題ありません。

importing vtk...
  imported vtk version 9.3.0
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast

meshViewer起動時

11. Treefoamの設定ファイルの変更

その1 OpenFOAM環境設定ファイルの修正

この画面の左上のスパナドライバーアイコンをクリック。
OpenFOAM環境設定ファイルを適当なもの、今回はbashrc-FOAM-v1906を選んで修正に使いましょう。

次の3箇所を変更します。

1箇所目 9行目
元 . ~/OpenFOAM/OpenFOAM-v1906/etc/bashrc
修正 . /usr/lib/openfoam/openfoam2312/etc/bashrc
 
2箇所目 10行目
元 export PYTHONPATH=/home/caeuser/OpenFOAM/PyFoam:$PYTHONPATH
修正 export PYTHONPATH=/usr/local/lib/python3.10/dist-packages/PyFoam:$PYTHONPATH
 
3箇所目 18行目
元 echo "OpenFOAM-v1906"
修正 echo "OpenFOAM-v2312"
 
このファイルを名前を修正して、保存し、先ほどの画面でOpenFOAM環境設定ファイルとして選択して設定します。
なお、このファイルは~/.TreeFoamUser/appの下に保存されたはずです。

その2 環境変数 $pyFoamDir の修正

$pyFoamDir という環境変数を変更する必要があります。
これを設定するには、設定ファイル treefoam の修正が必要です。
場所は /opt/TreeFoam です。
 
34行目を修正しましょう。
元 export pyFoamDir=~/OpenFOAM/PyFoam
修正 export pyFoamDir=/usr/local/bin

その3 configTreeFoamの修正

下記画面の「configTreeFoam」をクリックすれば修正できます。

 
45行目
元 Terminal gnome-terminal
修正 Terminal xterm
 
50行目
元 foamTerminal gnome-terminal --geometry=110x24 -- bash --rcfile
修正 foamTerminal xterm -e bash --rcfile
 
60行目
元 TerminalRun gnome-terminal --
修正 TerminalRun xterm -e
 
66行目
元 foamTerminalRun gnome-terminal --geometry=110x24 --
修正 foamTerminalRun xterm -e