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

(はてなブログから引っ越し '24/8/17)
※※※ '24/8/30 記載漏れを修正しました。また不足している説明を追加しました。

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

HPCとは
https://www.hpe.com/jp/ja/what-is/high-performance-computing.html
TreeFoamとは
http://opencae.gifu-nct.ac.jp/pukiwiki/index.php?AboutTreeFoam

しかし、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を参考にしました。
https://www.eqq.jp/kw/singularityon10.html
i) Linux 用 Windows サブシステム オプション機能を有効にします。

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を起動
スタートメニューから ubuntu22.04.3 LTS を起動します。
(2) ネット環境の必要に応じてProxyを設定
これを読んでいる方は相当な業界人ですから大丈夫だと思いますが念のため。
下記を1行ずつ実行するか、 Shebang (シバン)を先頭行につけた上で(つまり #!/bin/bash をつけた上で)set-proxy.shとでも保存して、source ./set-proxy.shしてください。

export http_proxy=http://(proxyのアドレス: ポート番号)
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
export all_proxy=$http_proxy
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$http_proxy
export FTP_PROXY=$http_proxy
export ALL_PROXY=$http_proxy
export no_proxy="127.0.0.1,localhost"
export NO_PROXY=$no_proxy
git config --global http.proxy $http_proxy
git config --global https.proxy $http_proxy
git config --global url.https://.insteadOf git://

あと、以下でsudoを実行する際は、 sudo -E と -Eオプションをつけるのを忘れずに。


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

sudo apt-get update
sudo 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 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を呼び出せそうもないので、
(もしかするとsingularity起動時に --bind オプションでHPCのを呼び出せるかも。)
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起動 !!

いよいよHPC上でのTreefoamの起動です。

初回だけ、次のコマンドを実行してください。

strip --remove-section=.note.ABI-tag /usr/lib/x86_64-linux-gnu/libQt5Core.so.5

これをやらないと、ImportError: libQt5Core.so.5: cannot open shared object file: No such file or directory というエラーが出てしまいます。
※ 次の記事を参考にしました。
WSL1上でguplotを動作させようとした際に生じたQtのエラー (to-31.blogspot.com)

さあっ!! 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 です。

あ、これはコンテナ内の/opt/TreeFoam です。
コンテナ内からgeditを使っ編集しましょう
( コンテナには vi とか vim はインストールされていないので、geditを使います。)

Singularity> gedit /opt/TreeFoam/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

プロフィール
この記事を書いた人
しょくぶつ (^ ^)

機械系の技術者です。学会発表13、論文掲載6(和・英)。プログラミング歴40年(つまり8bit世代ですね)。ゲーム歴40年(ファミコン世代ですね)。
お問い合わせは下記のメールアドレスにお寄せください。
plantsmilehatena@gmail.com

しょくぶつ (^ ^)をフォローする
OpenFoam
しょくぶつ (^ ^)をフォローする
タイトルとURLをコピーしました