何をしたいのか?
- PythonでGrADS用のファイルを読み込んで後処理をしたい
- しかし共有計算資源の環境はクリーンでなければならない
- だがしかし、変換ソフト、ライブラリなどなどインストールしたいものがいっぱいある
ということで、コンテナ仮想化を使おうということです。
Docker
Dockerを使うと何がいいかというと、計算資源を汚すことなく、必要な後処理を行う専用の仮想計算機を作り上げることができます。使うときにコンテナを立ち上げ、処理を行った後は破棄してまた必要になったら立ち上げることができます。
Dockerの場合は立ち上げのコストが非常に低いので、気軽に立ち上げて一つの処理をした後また破棄することが気軽にできます。
環境整備手順
Dockerfileを書くと自動化できていいのですが、ここでは単にシェルを立ち上げて整備して、それを単純にコミットしてイメージを作ることにします。
長期的に使いたいなら、バージョンアップも可能になるようにDockerfileを作るべきですが、最初の基本の機能の確認はシェルで行ったほうが理解が深まります。
今回はUbuntuをもとに、cdoとpip3, netcdf4をインストールします。
1. もとになるイメージをpull(拾ってくる)して走らせる
今回はUbuntuを使います。
$ docker pull ubuntu/ubuntu
$ docker images
で、イメージが作れたことが確認できます。
イメージを走らせるためには、
$ docker run -it ubuntu/ubuntu
とします。
2. 必要なソフトウェアのインストール
pip3
とcdo
をインストールします。
pip3
でnetCDF4
もインストールします。
# apt update
# apt install python3 python3-pip cdo
# pip3 install netCDF4
3. 動作確認
きちんとcdoで変換できてnetCDF4もインポートできるか確認します。
# python3
>>> import netCDF4 as nc
>>> ^D
# cdo
....
4. コミットしてimageを作成する
exitコマンドかCtrl+dで抜けて、イメージを作りましょう。
イメージを作るために必要なコンテナIDは、終了したコンテナを確認するために-a
が必要です。
# exit
(host) $ docker ps -a
このような画面になると思います。
CONTAINER IDはコミットの時に指定するコンテナIDになります。
IMAGEのところにimageの名前があって、STATUSのところでexited ** agoとなっているので、大体どれかはそこを見ればわかると思います。
$ docker commit [container id] [author]/[image名]
というようにコミットしてあげましょう。
$ docker images
で、イメージが作れたことが確認できます。
5. 実際に計算させてみる
実際に計算させるとき、2通りあって、runしてからインタラクティブにシェルから実行することもできます。ただ、今回はrunの際にコマンドを指定して実行させてみます。
プログラム、データ群のディレクトリをDockerへとバインドすることで、実際にコンテナから容易にアクセスることができます。また、グラフの確認にXフォワーディングをします。
$ sudo docker run -e DISPLAY=$DISPLAY --net host -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/.Xauthority:/root/.Xauthority -v /home/xxx/:/home/ --shm-size 16g xxx/ubuntu-cdo2 /bin/bash -c "cd /home/speedy-epyc/speedy/python-script; python3 rmse.py"
--shm-size
は、足りなくなるプログラムがあれば必要に応じてつけてください。