コンテナ環境 singularity で Treefoam を使おう !!
この記事は移転しました。約2秒後に新記事へ移動します。移動しない場合はココをクリックしてください。
しょくぶつ(^^) です。
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) 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を起動
(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
(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
そして次のコマンドでインストールします。あっという間に終わります。
dpkg -i treefoam_3.21.231130_all.deb
dpkg -i treefoam-doc_3.21.231130_all.deb
さあ!! 動作確認してみましょう !!
/opt/Treefoam/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 &
次のように起動したでしょうか ??
たとえば、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.
また、meshViewer起動時、次のエラーが出ますが、動作に問題ありません。
importing vtk... imported vtk version 9.3.0 libGL error: No matching fbConfigs or visuals found libGL error: failed to load driver: swrast
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