# AIFS-Single を Windows + GPU でローカル推論する手順 ECMWF(欧州中期予報センター)が公開しているAI気象予報モデル `ecmwf/aifs-single-1.0` を、Windows + NVIDIA GPU でローカル実行するための手順とスクリプト一式です。RTX3080(10GB VRAM)で動作確認済み(VRAM使用率ほぼ100%)。 対応記事: [無料の気象AIをゲーミングPCで動かしてみた](/articles/aifs-weather-forecast/) --- ## 必要なもの - Windows + NVIDIA GPU(VRAM 10GB以上を推奨) - [Miniconda](https://docs.conda.io/en/latest/miniconda.html) または Anaconda - Python 3.11 - ディスク空き容量: モデル重み約1GB、全球予報データ約625MB/回 ### 必要なライブラリ ```bash conda create -n aifs python=3.11 -y # PyTorch(GPUドライバのCUDAバージョンに合わせる。例はcu124) "/envs/aifs/python.exe" -m pip install --index-url https://download.pytorch.org/whl/cu124 torch # 推論本体(バージョン指定に理由あり。下記「はまりどころ」参照) "/envs/aifs/python.exe" -m pip install "anemoi-inference==0.4.10" "anemoi-models==0.3.1" ecmwf-opendata huggingface_hub "/envs/aifs/python.exe" -m pip install anemoi-datasets anemoi-graphs anemoi-utils # healpy はpipだとWindowsでビルド失敗するのでconda-forge版を使う conda install -n aifs -c conda-forge healpy -y # 全球データの取得・GUI表示・天気図描画に使う "/envs/aifs/python.exe" -m pip install earthkit-data earthkit-regrid streamlit plotly requests cartopy matplotlib ``` ### モデル重みのダウンロード(HuggingFace、約948MB) ```python from huggingface_hub import hf_hub_download hf_hub_download( repo_id="ecmwf/aifs-single-1.0", filename="aifs-single-mse-1.0.ckpt", local_dir="<保存先フォルダ>", ) ``` --- ## 使い方 1. `aifs_run_global.py` — AIFS-Singleを1回実行し、全球分の予報を`.npz`に保存(GPU使用、15〜20分) ```bash python aifs_run_global.py --lead-hours 360 --out global_forecast.npz ``` 2. `extract_city_from_global.py` — 保存済みデータから任意の地点の時系列をCSVに抽出(GPU不要、1秒未満) ```bash python extract_city_from_global.py --npz global_forecast.npz --lat 34.3853 --lon 132.4553 --out hiroshima.csv ``` 3. `draw_weather_map.py` — 保存済みデータから天気図PNGを生成(GPU不要) ```bash python draw_weather_map.py --hours 24 --out map_24h.png ``` 4. `aifs_weather_app.py` — 上記をまとめたStreamlit GUI ```bash python -m streamlit run aifs_weather_app.py ``` 各スクリプト冒頭の `` は、モデル重み・保存先データを置いているフォルダに書き換えてください。 --- ## Windows特有のはまりどころ このモデルは元々Linux + FlashAttention前提で学習・配布されており、Windows実行にはいくつかの回避策が必要でした。 ### 1. ライブラリのバージョンを学習時に合わせる チェックポイントは学習時の `anemoi-models==0.3.1`, `anemoi-inference` 0.4系(2025年2月頃のリリース)で作られています。最新版を入れると内部API変更で `ModuleNotFoundError` や `TypeError` が連鎖します。`anemoi-utils` / `anemoi-datasets` / `anemoi-graphs` は最新版で問題ありません。 ### 2. flash_attn の代替実装が必要 チェックポイントには `flash_attn_func` への直接参照がpickleされており、`flash_attn` パッケージが無いとモデルの読み込み自体が失敗します。Windowsでは正規のビルドが困難なため、`torch.nn.functional.scaled_dot_product_attention` を同じシグネチャでラップした互換パッケージを自作すると回避できます(計算結果は数学的に同一)。 ### 3. チェックポイントのパスがLinux形式 スクリプトの先頭で以下を実行しておく必要があります(他のimportより前)。 ```python import pathlib pathlib.PosixPath = pathlib.WindowsPath ``` ### 4. 初期値データの変数名(ECMWF Open Data特有の落とし穴) | 項目 | 誤りやすい書き方 | 正解 | |---|---|---| | 解析値の取得 | `type=an` を指定 | ECMWF Open Dataに`an`は無い。`type=fc, step=0` で代用 | | 土壌温度 | `stl1`/`stl2` を直接リクエスト | `sot`を`levelist=[1,2]`で取得し`sot_1→stl1, sot_2→stl2`にリネーム | | 土壌水分 | `swvl1`/`swvl2` を直接リクエスト | `vsw`を`levelist=[1,2]`で取得し`vsw_1→swvl1, vsw_2→swvl2`にリネーム | | 気圧面のジオポテンシャル | `z` を直接リクエスト | `gh`(ジオポテンシャル高度)を取得し `z = gh × 9.80665` | | 格子 | 0.25度格子のまま渡す | AIFSの内部格子は`N320`。`earthkit.regrid.interpolate()`で変換必須 | ### 5. matplotlib/cartopyがネイティブクラッシュする場合 conda環境のpython.exeを直接実行していると、matplotlib(Agg backend)の描画がWindows例外で無言クラッシュすることがあります(`conda activate`を経由しないとDLL検索パスに`/Library/bin`が入らないため)。天気図を描く前に、環境変数PATHの先頭に対象envの`Library/bin`等を追加してください。 ```python import os, pathlib env_dir = pathlib.Path(python_exe).parent extra = [str(env_dir), str(env_dir/"Library"/"bin"), str(env_dir/"Scripts")] os.environ["PATH"] = os.pathsep.join(extra) + os.pathsep + os.environ["PATH"] ``` --- ## 精度についての注意 実際の天気予報と比較したところ、2〜3日目以降で気温が10℃以上乖離するケースを確認しています(詳細は[記事本文](/articles/aifs-weather-forecast/)参照)。実用の天気予報としては使わないでください。 ## 参考 - 公式ノートブック: https://huggingface.co/ecmwf/aifs-single-1.0/blob/main/run_AIFS_v1.ipynb - モデルカード: https://huggingface.co/ecmwf/aifs-single-1.0 - ECMWF Open Data: https://github.com/ecmwf/ecmwf-opendata