2024/12/11 コンテナのボリュームを有効活用するよう一部修正しました
2024/12/13 WindowsはWindows subsystem for LinuxのUbuntu24.04に下記のインストールスクリプトが有効でdockerは不要でした.以下の記事ににわかり易くまとめられています.
作戦
Weather Research & Forecasting Model (WRF) はユーザー登録をすれば誰でも使える最先端の気象モデルだが,自分のような初心者にはインストールが難しい.こちらの記事では,以下のようなワンクリックで完結する神インストールスクリプトが紹介されていて衝撃を受けた.
しかし,debian系Linux専用.最近流行り(?)のdockerという高速な仮想環境(?)でubuntuを構築すればMacでも使えるかも..!
ということで上記インストールスクリプトを利用し,Apple silicon Mac(または非debian系LinuxやWindows)でdockerにUbuntuコンテナを作成しWRFを動かしてみよう,が今回の作戦.
なお,dockerもWRFも初心者なので詳しい&正確な説明は諦めています.dockerの説明は探せば色々出てきますが,サプーさんの説明動画が個人的にはわかりやすかったです(照)
メリット
- OSに関わらずインストール方法を固定できる
- 自力でのライブラリ構築の必要がない
- ほぼ最新版のWRFを使える(スクリプト管理者に感謝)
- (dockerの勉強になる)
デメリット
- Intel fortranはデフォルトでは使えない(gfortran, openmpiが使われる)
- dockerとはいえ仮想環境であることのオーバーヘッドはある
- Apple silicon Macの場合x86_64へエミュレートする分更にオーバーヘッドになる
- Macではコンテナ起動時にGUIの操作が要求されるためSSHに向かない(解決法模索中)
環境
- MacBoock Air (2020, M1)
- macOS Sequoia 15.1.1
- docker desktop Version 4.36.0
- Docker version 27.3.1
- WRF4.6.1
Dockerのインストール
Macの場合は以下を参照.
設定からCPUやメモリの上限を設定できるので,余裕を持たせておくと良いと思う.
LinuxやWindowsの方はすみませんが各々セットアップしてください.
Ubuntuコンテナの作成
こちらを参考にした.以下順次解説する.
ホームディレクトリにdocker
ディレクトリを作成し,基本的にはそこで作業する.
$ cd
$ mkdir docker
$ cd docker
$ mkdir ubuntu_volume
ubuntu_volume
は後ほど使うが,コンテナの一部を格納する場所.
~/docker
内で以下のようにcompose.yaml
を作成する.
services:
ubuntu:
image: ubuntu:24.04
container_name: ubuntu_container
tty: true
platform: linux/amd64
volumes:
- "ubuntu_volume:/home/ubuntu"
volumes:
ubuntu_volume:
driver_opts:
type: none
device: ${PWD}/ubuntu_volume
o: bind
-
services
でubuntu
というサービスを定義. -
image
で利用するイメージを指定する.イメージは初回起動時にダウンロードされる. -
container_name
はコンテナ名.サービス名と異なる扱い. -
tty: true
は端末を利用するために必要. -
platform
の箇所はApple silicon Macで利用するために必要.IntelかAMDのCPUマシンの場合は消す.
Apple siliconはaarch64
というARM系のアーキテクチャ.ここでのWRFはx86_64
を想定しており,そのままだとインストールに失敗する.上記によりx86_64
としてRosetta2がエミュレートしてくれるらしい.アーキテクチャはuname -m
コマンドで確認できる.
-
volumes
は簡単に言えばコンテナの一部(ここでは/home/ubuntu
以下)の保存場所を指定している.その直下にあるもう一つのvolumes
ではubuntu_volume
という「名前付きボリューム」を先ほど作成したubuntu_volume
ディレクトリにマウントするよう指定している.ボリュームに関しては以下の記事が詳しい.
次に以下のコマンドでコンテナを起動する.必ずcompose.yaml
のあるディレクトリで実行すること.
$ docker compose up -d
一度起動した後にcompose.yamlを編集するとコンテナが初期化されてしまうことがあるので注意.--rm
オプションをつけたdockerコマンド操作も同様なので禁物.逆に最初からやり直したい場合はdocker rm ubuntu_container
で削除できる.
コンテナの生成・起動の確認はdocker ps
コマンド.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4edfa990d25 ubuntu:24.04 "/bin/bash" 22 minutes ago Up 22 minutes ubuntu_container
上記の感じなら多分OK.
コンテナの停止と再起動の確認
手順には含まないが,いざという時困るので先に解説.どの方法が最適か理解していないが,ひとまずcompose
を使って安定した方法を紹介.
1. コンテナからログアウト
exitするだけ.コンテナは稼働し続ける.
2. コンテナの停止
$ docker stop ubuntu_container
引数はコンテナ名を与える.
docker ps
でubuntu_container
が消えているか確認.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3. コンテナの再起動
$ docker compose up -d
-d
はバックグラウンドで起動するオプションらしい.
(オフラインだと失敗することがあり要ネット接続.オフラインOKな方法を知ったら追記するかも)
4. コンテナへの再ログイン
compose.yaml
のあるディレクトリへ移動し,以下を実行.
$ docker compose exec ubuntu /bin/bash
ここではコンテナ名ではなくサービス名を与える.
スクリプト実行の準備
$ docker exec ubuntu /bin/bash
により,dockerコンテナにはrootユーザーとしてログインされる.後のライブラリインストールで非ルートユーザーを使う必要がある.自動的にubuntu
というユーザーが生成されていたので用いる.
rootとしてコンテナにログインした後,まずubuntu
ユーザーのパスワードを更新し,sudoユーザーに登録しておく.(結構重要)
root@e4edfa990d25:/# passwd ubuntu
New password:
Retype new password:
passwd: password updated successfully
root@e4edfa990d25:/# gpasswd -a ubuntu sudo
Adding user ubuntu to group sudo
まずはaptを最新にする.
root@e4edfa990d25:/# apt update
aptを使ってsudo
をインストール.他にも必要なものがあればここで.
root@e4edfa990d25:/# apt install sudo
root@e4edfa990d25:/# apt install wget
root@e4edfa990d25:/# apt install vim # エディタ
root@e4edfa990d25:/# apt install less # ビューワ
ubuntu
ユーザーでsudo
が使えるか確認.
root@e4edfa990d25:/# su - ubuntu
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
ubuntu@e4edfa990d25:~$ sudo ls -a
[sudo] password for ubuntu:
. .. .bash_history .bash_logout .bashrc .profile .sudo_as_admin_successful
OK.
WRFインストールスクリプトの実行
例のWRF-Install-Scriptよりお好きなバージョンを選択.今回は4.6.1
Raw
をクリック.
そのページのアドレスをコピー,端末でwgetする.これはコンテナ外からでも良い.
$ cd ~/docker/ubuntu_volume
$ wget https://raw.githubusercontent.com/bakamotokatas/WRF-Install-Script/refs/heads/master/WRF4.6.1_Install.bash
コンテナ内にログインし,ダウンロードしたスクリプトを実行する(ボリュームに保存したものはコンテナ内と完全に同期).WRFとWPS(前処理システム)がインストールされる.容量は約52GB.
ubuntu@e4edfa990d25:~$ bash WRF4.6.1_Install.bash
環境によるが40~60分かかる.終了したら生成物を確認する.
ubuntu@b07cbba8e72e:~/Build_WRF$ ls
LIBRARIES WPS-4.6.0 WPSV4.6.0.TAR.gz WPS_GEOG WRF-4.6.1-ARW WRFV4.6.1.tar.gz geog_high_res_mandatory.tar.gz
ubuntu@b07cbba8e72e:~/Build_WRF$ ls WRF-4.6.1-ARW/run/*exe
WRF-4.6.1-ARW/run/ndown.exe WRF-4.6.1-ARW/run/real.exe WRF-4.6.1-ARW/run/tc.exe WRF-4.6.1-ARW/run/wrf.exe
ubuntu@b07cbba8e72e:~/Build_WRF$ ls WPS-4.6.0/*exe
WPS-4.6.0/geogrid.exe WPS-4.6.0/metgrid.exe WPS-4.6.0/ungrib.exe
きちんと実行ファイルが生成されている(驚嘆)
ARWpostのインストール
使わない人は省略可能.
以下のARWpost(後処理システム)インストールの箇所を参考にする.
先ほどのページを参考にホームディレクトリにARWpost_install.bash
を以下のように作成する.# remove download file
# rename WRF directory
のブロックは除いてある(好みの問題)
#!/bin/bash
# From install_wrf.sh
## Download and install required library and data files for WRF.
## License: LGPL
## Jamal Khan <jamal.khan@legos.obs-mip.fr>
# grads install
sudo apt update
sudo apt -y upgrade
sudo apt -y install grads unzip default-jre
# ARWpost install
cd ~/Build_WRF
wget -c https://www2.mmm.ucar.edu/wrf/src/ARWpost_V3.tar.gz
tar -xvzf ARWpost_V3.tar.gz -C ~/Build_WRF
cd ~/Build_WRF/ARWpost
cd arch
cp Config.pl Config.pl_backup
sed -i '79s/.*/ $response = 3 ;/' Config.pl
cd ..
./clean
sed -i -e 's/-lnetcdf/-lnetcdff -lnetcdf/g' ~/Build_WRF/ARWpost/src/Makefile
./configure #3
sed -i -e 's/-C -P/-P/g' ~/Build_WRF/ARWpost/configure.arwp
sed -i -e 's/-frecord-marker=4/-frecord-marker=4 -fallow-argument-mismatch/' ~/Build_WRF/ARWpost/configure.arwp
./compile
コンテナ内で実行する.
ubuntu@b07cbba8e72e:~$ bash ARWpost_install.bash
実行ファイルを確認.
ubuntu@b07cbba8e72e:~/Build_WRF$ ls ARWpost/*exe
ARWpost/ARWpost.exe
完了
もう.tar.gz
ファイルは不要なので消したい人は消す.(コンテナ内・外どちらからでも消せる)
ubuntu@b07cbba8e72e:~/Build_WRF$ rm *tar.gz *TAR.gz
WRFを使ってみる
あとはお好きなように,,ですが,先ほどのページを参考に動作確認してみる.
1と2は完了しているので3.気象データダウンロード
から実行してゆく.
気象データダウンロード
UCARからNFLダウンロードスクリプトを取得
Mac(以下,コンテナ外)のブラウザでこちらから2024年8月30日(台風10号上陸時)のファイルを選択しcshスクリプトをダウンロード.
cshのダウンロードが完了したら,コンテナ外からubuntu_volume/Build_WRF
にアクセス,FNL_DATA
ディレクトリを作ってcshをコピーする.
$ cd ~/docker/ubuntu_volume/Build_WRF
$ mkdir FNL_DATA
$ cp ~/Downloads/rda-download.csh .
$ csh rda-download.csh
(compose.yaml
でボリュームを設定していない場合はコンテナ外からcshをコンテナ内へ送る必要がある.参考)
WRF実行
以下,単なる動作確認につき,再現性を高めるチューニングは行なっていない.
詳しいことは使い慣れた人に聞く,公式のBest Practices,User's Guideを読む,など.
namelist.wps
を編集
$ cd ../WPS-4.6.0
$ vi namelist.wps # お好きな方法で
max_dom
start_date
end_date
interval_seconds
を修正.1ドメインで計算するので2列目は無視される.
max_dom = 1,
start_date = '2024-08-30_00:00:00','2019-09-04_12:00:00',
end_date = '2024-08-30_18:00:00','2019-09-04_12:00:00',
interval_seconds = 21600
計算や出力を緯度経度格子にしたい場合はmap_proj = 'mercator',
とする.今回はlambert
map_proj = 'lambert',
ref_lat
ref_lon
stand_lon
を修正.気象庁のメソ客観解析が参考になる.
ref_lat = 35.00,
ref_lon = 135.00,
truelat1 = 30.0,
truelat2 = 60.0,
stand_lon = 135.0,
そのほかは弄らず.
geogrid.exe, ungrib.exe, metgrid.exeの実行
NFLデータへのリンクの作成.
$ ./link_grib.csh ../FNL_DATA/*grib2
GRIBFILE.AAA
~ GRIBFILE.AAD
が生成されていればOK.以下,コンテナ内へログインして順次実行.
ubuntu@b07cbba8e72e:~/Build_WRF/WPS-4.6.0$ ./geogrid.exe
ubuntu@b07cbba8e72e:~/Build_WRF/WPS-4.6.0$ ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable
ubuntu@b07cbba8e72e:~/Build_WRF/WPS-4.6.0$ ./ungrib.exe
ubuntu@b07cbba8e72e:~/Build_WRF/WPS-4.6.0$ ./metgrid.exe
namelist.input
の編集
移動とエディタの起動(コンテナ外).
$ cd ../WRF-4.6.1-ARW/run/
$ vi namelist.input # お好きな方法で
run_hours
start_*
end_*
interval_seconds
を編集.
&time_control
run_days = 0,
run_hours = 18,
run_minutes = 0,
run_seconds = 0,
start_year = 2024, 2019,
start_month = 08, 09,
start_day = 30, 04,
start_hour = 0, 12,
end_year = 2024, 2019,
end_month = 08, 09,
end_day = 30, 06,
end_hour = 18, 00,
interval_seconds = 21600
あとは&domains
のmax_dom
を1
に変更するのも忘れずに.その他はひとまずデフォルト.
real.exe, wrf.exeの実行
metgridしたファイルのリンクを貼り,順次実行.
ubuntu@b07cbba8e72e:~/Build_WRF/WRF-4.6.1-ARW/run$ ln -s ~/Build_WRF/WPS-4.6.0/met*nc .
ubuntu@b07cbba8e72e:~/Build_WRF/WRF-4.6.1-ARW/run$ ./real.exe
今回は4並列で計算.
ubuntu@b07cbba8e72e:~/Build_WRF/WRF-4.6.1-ARW/run$ mpirun -np 4 ./wrf.exe
約15分で計算終了
ARWpostによる変換
使わない人は省略可.
ARWpost
ディレクトリへ移動し出力データのリンクを作成.
ubuntu@b07cbba8e72e:~/Build_WRF/WRF-4.6.1-ARW/run$ cd ../../ARWpost
ubuntu@b07cbba8e72e:~/Build_WRF/ARWpost$ ln -s ../WRF-4.6.1-ARW/run/wrfout* .
namelist.ARWpost
を編集.詳細はUser's Guide
オリジナルは保存しておいた方が良い.
ubuntu@b07cbba8e72e:~/Build_WRF/ARWpost$ cp namelist.ARWpost namelist.ARWpost.org
編集した例.
&datetime
start_date = '2024-08-30_00:00:00',
end_date = '2024-08-30_18:00:00',
interval_seconds = 3600,
tacc = 0,
debug_level = 0,
/
&io
input_root_name = './wrfout_d01_*'
output_root_name = './test'
plot = 'list'
fields = 'height,pressure,tk,tc,umet,vmet,u10m,v10m,slp,geopt,max_dbz'
mercator_defs = .true.
/
! Below is a list of all available diagnostics
! fields = 'height,geopt,theta,tc,tk,td,td2,rh,rh2,umet,vmet,pressure,u10m,v10m,wdir,wspd,wd10,ws10,slp,mcape,mcin,lcl,lfc,cape,cin,dbz,max_dbz,clfr'
&interp
interp_method = 1,
interp_levels = 1000.,950.,900.,850.,800.,750.,700.,650.,600.,550.,500.,450.,400.,350.,300.,250.,200.,150.,100.,
/
実行.
ubuntu@b07cbba8e72e:~/Build_WRF/ARWpost$ ./ARWpost.exe
test.dat
test.ctl
が生成されていれば成功.
計算結果の描画
(compose.yaml
でボリュームを設定していない場合はコンテナ内の計算結果をコンテナ外から取り出す参考)
試しにPythonを使って10時間積分した生データ(wrfout_d01_2024-08-30_10:00:00
)の積算降水を作図.投影系に関してはnamelist.wps
で設定した値を使う.stackoverflowを参考にした.
import numpy as np
import xarray as xr
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use("Agg") # 念の為
import cartopy.crs as ccrs
ds = xr.open_dataset("./wrfout_d01_2024-08-30_10:00:00")
da = ds.RAINC[0]+ds.RAINNC[0]
x = da.XLONG.values
y = da.XLAT.values
map_proj = ccrs.LambertConformal(
central_latitude=30,
central_longitude=140,
standard_parallels=(30, 60),
)
# map_proj = ccrs.PlateCarree() # namelist.wpsでmap_proj = 'mercator'の場合こちら
ax=plt.axes(projection=map_proj)
ax.coastlines()
s = ax.contourf(x,y,da,transform=ccrs.PlateCarree())
plt.colorbar(s)
plt.savefig("test.png")
plt.close()
雨が降っていることを確認
終わりに
これでめでたくコンパイル失敗地獄から解放されそうな雰囲気.とはいえ冒頭に書いたようにデメリットもあるので万人にはおすすめできない.
dockerの便利さを実感でき,良い勉強になった.コンテナ外からシームレスにアクセスできるので,例えばコンテナ内環境でいちいちテキストエディタを普段通りにカスタムし直す,など必要なく,普通にいつものエディタで編集でき良い.
エンディアンについては深く考えていなかったが,なぜかうまくいってしまったので未検証.環境によっては注意が必要かも.
ネイティブにIntel FortranでコンパイルしたWRFとどれくらい速度差が出るのか,いつか検証してみたい(やらないやつ).そもそも15kmメッシュでしか計算していないので,高解像度で計算した時に使いものになるかは未知数.こちらは後日試す予定.
WRFに関する電子情報を残してこられた歴々たる先輩方へ感謝申し上げます.