APAC HPC-AI 2026 キャッチアップ議事録
2026 APAC HPC-AI Competition への参加に向けたチームの学習記録・技術ドキュメントです。競技中はチーム内の知識共有に、終了後はポートフォリオおよび後輩向け参考資料として活用します。
HPCやAI推論最適化の初心者が、議論に参加できる最低限の背景をそろえることを目的にしています。
読み方
最初に読む順番は次の通りです。
各ページでは、情報の確証度を次のように分けます。
| 表記 | 意味 |
|---|---|
| 確定 | 公式サイト、公式ドキュメント、モデルカード、論文、公式リポジトリで確認できた情報 |
| 要確認 | メモ、Discord/Slack上の議論、リンク先のREADME、実装断片から推測できるが、最終ルールではない情報 |
| 経験談 | 参加記やチーム内メモに基づく実践知。再現性は環境に依存する |
まず押さえる結論
- 2026年大会の公式スケジュールは公開済みだが、課題の細部、計測方法、制約は今後確定する可能性がある。
- メモ上では、HPC側はOpenFOAM、AI側はQwen系LLM推論、PD disaggregation、Dynamo/SGLang周辺が議論対象になっている。
- 2025年大会では、HPC側がNWChem、AI側がDeepSeek-R1 671B + SGLangだったことは公式発表と参加記で整合する。
- 最適化の本体は「速そうなフラグを試す」ではなく、計測、ボトルネック特定、1変更1実験、記録、比較を繰り返すこと。
大会概要
| 項目 | 内容 |
|---|---|
| 主催 | HPC Advisory Council / NSCC Singapore / NCI Australia |
| テーマ① | OpenFOAM 流体力学シミュレーション実行時間の最小化(CPU マルチノード) |
| テーマ② | Qwen LLM 推論スループットの最大化(GPU) |
| トレーニング開始 | 2026年6月8日〜 |
| 競技マシンアクセス | 2026年8月3日〜 |
| 提出期限 | 2026年10月9日 |
| プレゼン面接 | 2026年10月19日〜 |
| 最終結果発表 | 2026年11月(Supercomputing Conference 2026) |
優勝チームは 2027 ISC 国際学生クラスタコンペティション APAC 代表枠を獲得できます。
ドキュメントを読む
公開サイト: https://<your-github-username>.github.io/APAC-HPC-AI/
ローカルでプレビューする場合:
# mdBook のインストール(初回のみ)
cargo install mdbook
# ライブプレビュー(ブラウザで http://localhost:3000 が開く)
mdbook serve --open
リポジトリ構成
src/ # 記事ソース(Markdown)
SUMMARY.md # 目次・章構成
book/ # ビルド成果物(Git 管理外)
book.toml # mdBook 設定
.github/
workflows/
deploy.yml # GitHub Pages 自動デプロイ
コントリビュート
src/配下に.mdファイルを作成するsrc/SUMMARY.mdに章のリンクを追加するmdbook serveでローカル確認するmainブランチへ push すると GitHub Pages に自動デプロイされる
参考文献の方針
本文中の主張には、できる限り該当ページへのリンクを付けています。まとめて確認する場合は参考文献一覧を見てください。
調査ステータス
このページは、殴り書き.txtに含まれるリンクと議論を、どこまで裏取りできたかを管理するためのページです。
元メモから抽出した主要リンク
| 対象 | URL | 現時点の扱い |
|---|---|---|
| 木更津高専チームの参加記 | https://zenn.dev/chizuchizu/articles/7e77fe8d44244b | 経験談。2025年AI課題の実験方針、困りごと、運用知の参考にする |
| 2026年大会公式ページ | https://www.hpcadvisorycouncil.com/events/2026/APAC-AI-HPC/ | 確定。スケジュール、表彰、主催情報の一次情報 |
| 2025年日本チーム入賞プレスリリース | https://www.tuat.ac.jp/documents/tuat/outline/disclosure/pressrelease/2025/20251209_01.pdf | 確定。日本チーム受賞、理研R-CCS支援の一次情報 |
| 2025年大会結果公式PDF | https://www.hpcadvisorycouncil.com/pdf/8th-apac-hpc-ai-competition.pdf | 確定。2025年の課題と結果の一次情報 |
| OpenFOAM HPC Committee repo | https://develop.openfoam.com/committees/hpc | 確定。OpenFOAMベンチマーク候補の一次情報。ただし2026年大会で使うケースは未確定 |
| Dynamo benchmarks | https://github.com/ai-dynamo/dynamo/tree/main/benchmarks | 要確認。ベンチマーク候補・参考実装。大会ルールそのものではない |
| Dynamo Qwen3 recipe | https://github.com/ai-dynamo/dynamo/tree/main/recipes/qwen3-235b-a22b-fp8 | 要確認。TensorRT-LLM向けrecipeであり、SGLang課題との関係は大会側確認が必要 |
| 既存mdBook公開先 | https://namacha411.github.io/hpcai-meeting-minutes/ | チーム内成果物。公式情報ではない |
確定情報と未確定情報
確定
- 2026年大会はHPC-AI Advisory Council、NSCC Singapore、NCI Australia、Firmus Technologiesなどが関係するAPAC HPC-AI Competitionである。
- 2026年大会の主要日程は公式ページで公開されている。
- 2025年大会は、HPC側でNWChem、AI側でDeepSeek-R1 671B + SGLangが課題だった。
- 2025年大会では、理研R-CCSが支援した日本チームが複数入賞した。
- Qwen3-235B-A22Bは、Qwen公式モデルカード上で総235B、活性化22BのMoEモデルとして説明されている。
要確認
- 2026年HPC課題の正確なOpenFOAMケース、メッシュサイズ、評価コマンド、許可される変更範囲。
- 2026年AI課題がSGLang固定なのか、Dynamo/TensorRT-LLM recipeをどの範囲で参照するのか。
- Qwen3.5など、メモ上の提案が大会設計に反映されるかどうか。
- ランダム重みで測るのか、実モデル重みで測るのか。
- 評価指標が総スループットだけなのか、TTFT、TPOT、p95 latency、request success rateなども含むのか。
- 2026年大会の実機。チームは
富岳(A64FX)を前提に最適化を調査しているが、運営メモでは「4ノード・100+コアのCPUクラスタ」とされ、2025年は玄界が使われたとの情報もある。実機は未確定。 -Ofast系の許容範囲。演算順序変更・近似・精度劣化を伴うため、大会でどこまで許可されるか。昨年は精度低下・収束条件変更が禁止だった。- system-level tuning(CPU周波数スケーリング、NUMAトポロジ最適化、ファイルシステム/ストレージアクセス)が今年も許可されるか。昨年ルールには記載あり。
- scratch領域の利用可否。重みや中間ファイルをscratchに置けるか。
玄界では不可だった可能性あり。 - 利用可能なプロファイリングツール(
mpiP/Score-P/Scalasca/nsys等)が実機で使えるか。
調査で見えた論点
- OpenFOAMはMPIによる領域分割、I/O形式、decomposeParDict、ソルバ設定が性能に影響する。
- LLM推論はprefillとdecodeで計算特性が違う。PD disaggregationはこの差を利用する設計。
- 高い総スループットだけを追うと、1リクエストあたりの体感速度が悪化する場合がある。評価指標の定義確認が重要。
- 大会ではルール違反になり得る最適化がある。量子化、モデル品質を落とす変更、実験的機能の扱いは必ずルールで確認する。
議事録
チーム定例・作業会の議事録を日付順に管理します。
運用ルール
- ファイル名は
YYYY-MM-DD.mdにする。 - 1回の議事録には、実施日時、参加目的、決定事項、共有内容、TODO、次回方針を残す。
- 調査した技術情報の詳細は各技術ページに分け、議事録には「何を調べたか」「何が決まったか」「次に誰が何を見るか」を中心に書く。
- 参考文献がある場合は、本文中または末尾にリンクを置く。
一覧
- 2026-05-29 キャッチアップ方針決め
- 2026-06-05 最適化テーマ共有とタスク整理
- 2026-06-12 環境構築の進捗と過去問学習方針
- 2026-06-19 perf学習・AI動作確認・ダッシュボード方針
- 2026-06-26 AI実験環境・SGLangベンチ・OpenFOAMプロファイリング方針
- 2026-07-05 ポイント運用・strace I/O調査・神戸勉強会の段取り
- 2026-07-26 2MPIプロファイリング・prefill/decode分析・Nsight Systems導入
- 2026-08-09 競技マシン環境構築(NCI/NSCC)・ベースライン測定・分報導入
テンプレート
# YYYY-MM-DD 議事録
## 実施日時
- YYYY-MM-DD(曜日) HH:MM-
## 目的
-
## 決定事項
-
## 共有内容
-
## TODO
| 項目 | 内容 | 期限 |
|---|---|---|
| | | |
## 次回方針
-
## 参考リンク
-
2026-05-29 議事録
実施日時
- 2026-05-29(金)
目的
- APAC HPC-AI 2026に向けて、チーム内で知識共有するための土台を決める。
- HPC、OpenFOAM、AI推論最適化の初心者でも後から追える形で、調査内容をmdBookにまとめ始める。
決定事項
- チームの知識共有にはmdBookを使う。
- 今後の調査内容、体験談、議事録、用語辞書、参考文献をmdBook上で管理する。
- 議事録は日付別に
src/minutes/配下へ追加し、src/SUMMARY.mdから辿れるようにする。 - 情報の確証度を区別する。公式サイト、公式ドキュメント、論文、公式リポジトリで確認できたものを優先し、体験談やチャット上の情報はその旨を明示する。
共有内容
- 去年までの大会問題、参加体験談、今年の課題候補に関する情報を集めた。
- 2025年大会では、HPC側がNWChem、AI側がDeepSeek-R1 671B + SGLang推論ベンチマークだったことを確認した。
- 2026年大会では、メモ上の議論としてHPC側にOpenFOAM、AI側にQwen系LLM推論、PD disaggregation、Dynamo/SGLang周辺が出ている。
- ただし、2026年の正確なOpenFOAMケース、AI側のモデル構成、評価指標、禁止事項は最終ルールで確認する必要がある。
- 初心者向けに、HPC/OpenFOAM/LLM推論/ベンチマーク指標の用語辞書を作成した。
TODO
| 項目 | 内容 | 目的 |
|---|---|---|
| Qwenモデルの勉強 | Qwen3-235B-A22B、MoE、active parameters、context length、推論時のメモリ要件を理解する | AI課題のモデル特性を説明できるようにする |
| OpenFOAMの勉強 | case構成、solver、mesh、domain decomposition、MPI並列実行を理解する | HPC課題で何を変更すると性能が変わるか把握する |
| プロファイリングの勉強 | perf、VTune、nsys、nvidia-smiなどでCPU/GPU/通信/I/Oを測る流れを理解する | 勘ではなく計測に基づいて改善箇所を決める |
| ベンチマーク指標の理解 | throughput、TTFT、TPOT、latency、concurrency、ISL/OSLを整理する | 「速い」の意味をチーム内で揃える |
| 変更禁止設定の理解 | 量子化、モデル精度に影響する変更、実験的機能、収束条件変更などの扱いを確認する | ルール違反を避ける |
今後の方針
- 毎週金曜日18:00から情報共有と目標確認を行う。
- 各自が調べたこと、試したこと、詰まったことを共有する。
- 次の1週間で何を調べるか、何を実験するかを決める。
- 調査内容は議事録だけに閉じず、再利用できる内容は該当する技術ページへ反映する。
次回までの確認ポイント
- 公式ルール更新がないか確認する。
- Qwen、OpenFOAM、プロファイリング、ベンチマーク指標、禁止事項の担当を決める。
- 調査したリンクは必ず参考文献として残す。
関連ページ
2026-06-05 議事録
実施日時
- 2026-06-05(金)18:00-
目的
- HPC/AI最適化に関する勉強会・MTGの内容を共有する。
- 各自の調査内容をすり合わせ、今後の方針と次回までのタスクを整理する。
決定事項
- 10月11〜12日のイベントは、とりあえず全員エントリーしておき、都合が変わった人はオンライン参加に切り替える。(対面/オンラインの最終判断は各自の授業・ゼミ次第)
- プロファイリングは、まず
perf+mpiPの組み合わせで着手する。 - コンパイラ最適化はコストが低いので、早い段階で試す。
- CPUアーキテクチャの深掘り(アセンブリレベルの最適化など)は学習コストが高いため、当面は優先度を下げる。
- 来週の発表形式はスライドベースにする(図・画像を載せやすいため)。
- 計測データの保管場所とフォーマットは、来週のMTGで決める(今回は保留)。
共有内容
各自が担当した最適化テーマを発表した。詳細は下記の技術ページに分けて整理した。
調査テーマ
- ボトルネック分析の全体像: 計算・通信・I/Oの割合を把握する(ボトルネック分析)。
- コンパイラ最適化・ライブラリ選定:
GCCの最適化オプション、BLASライブラリの選定など(CPU最適化)。 - MPI通信最適化: 通信がボトルネックになりやすい点、ロードインバランス(rank間の負荷の偏り)への対処(MPI通信最適化、領域分割)。
- NUMA最適化: メモリの局所性、スレッド配置の工夫(NUMA最適化)。
- GPU/NCCL最適化: GPU間通信(
NCCL)の最適化(NCCL通信最適化)。 - I/O最適化: スクラッチ領域の活用など(I/O最適化)。
- スケーリング分析: ノード数・スレッド数を変えたときの性能変化を測定する(スケーリング分析)。
注: 上記の発表は
富岳(A64FX)を前提に調査されている。2026年大会の実機は未確定のため、富岳前提の内容は調査ステータスの要確認項目として扱う(富岳アーキテクチャ)。
方針議論
- CPU演算性能は富岳では比較的強いため、通信(MPI)がボトルネックになる可能性が高いという認識で一致した。
- ※ ただし、これは富岳を前提とした認識。2026年大会で使う実機(メモ上は「4ノード・100+コアのCPUクラスタ」)は最終ルールで要確認。
- コンパイラ最適化は低コストなので、早めに試す価値がある。
- 大規模LLMのモデルロード時間が競技で課題になりうる。スクラッチ領域への配置が有効な可能性がある(要確認)。
プロファイリングツールの整理
| ツール | 用途 |
|---|---|
perf | CPUプロファイリング(軽量) |
mpiP / Vampir | MPI通信の可視化・タイムライン分析 |
nvidia-smi | GPU状態の確認 |
IPM | MPI通信の概要把握 |
→ まずperf + mpiPの組み合わせで着手するのが現実的、との結論。
データ管理・議事録の運用
- 計測データの保管場所は来週決める。
- 発表はスライドベースで行う。
- スパコンの共有ストレージの活用も検討する(メモ上は「限界」と記載。名称・利用可否は要確認)。
TODO
| 項目 | 内容 | 目的 |
|---|---|---|
| 環境構築 | 各自の担当問題(HPC / AI)を動かせる状態にする | これ以降の計測・実験の前提を揃える |
| ベースライン計測 | 何も工夫しない状態での実行時間を記録する | 最適化の効果を比較する基準を作る |
| プロファイリング初挑戦 | perfなどのツールを1つ使い、結果を持ち寄る | 勘ではなく計測でボトルネックを特定する |
| 来週の発表準備 | 計測結果・使ったツール・分析方法をスライドにまとめる | チーム内で知見を共有・再利用できるようにする |
| データ管理方針の決定 | 来週のMTGで保管場所・フォーマットを決める | 計測データを散逸させず蓄積する |
今後の方針
- 次回までの達成ラインを以下とする。
- 最低ライン: モデル(担当問題)を動かす + プロファイリングツールを1つ使ってみる。
- できれば: プロファイリング結果の分析・コードの理解まで進める。
- 1回の実験で変更する条件は1つにし、「なぜ速くなったか」も記録する(プロファイリングと性能分析の基本方針に従う)。
関連ページ
- プロファイリングと性能分析
- ボトルネック分析
- プロファイリングツール実践ガイド
- スケーリング分析
- I/O最適化
- CPU最適化(コンパイラ・ライブラリ)
- MPI通信最適化
- 領域分割(decomposePar)
- NUMA最適化
- 富岳(A64FX)アーキテクチャ
- NCCL通信最適化
- 2026年大会の現時点まとめ
- 調査ステータス
- 用語辞書
2026-06-12 議事録
実施日時
- 2026-06-12(金)
目的
- 環境構築の進捗を共有する。
- 問題が未公開の期間に何を進めるか(過去問・プロファイリング学習)を決める。
決定事項
- 問題が未公開のうちは、環境をたくさん触ることとプロファイリングを学ぶことに注力する。
- 過去問を解いて、プロファイリングを学び、最適化を試して理解を深める。
- 6月中に過去問のプロファイリング&最適化を行う(過去問は6月中に解きたい)。
- 来週までに、各自プロファイリングツールを複数試し、結果をスライドにまとめる。
- 来週はTeams会議で実施する(松村は不在)。
共有内容
進捗(環境構築)
| 担当 | 進捗 |
|---|---|
| 松村・渡邉 | SSHと仮想環境の構築 |
| 田中・小林・久保田 | OpenFOAMの構築と実行、基本的なperf実行まで完了 |
共有された知見
- Pythonの
Package Managerはuvがおすすめ。 perfのcache-referenceイベントはハードウェア依存らしい(要確認)。計測値の比較時は環境差に注意する。- ベンチマーク抽出ツールは大会側から指定されるらしい(未確定)。詳細は不明だが、現時点でも分析の練習はできそう。
TODO
| 項目 | 内容 | 目的 |
|---|---|---|
| プロファイリングツールを試す | 各自perfなどのツールを複数使い、結果を持ち寄る | 来週のスライドの材料にする |
| 結果のスライド化 | 使ったツール・計測結果・分析方法をスライドにまとめる | チームで知見を共有する |
| 過去問に着手 | 過去問を入手し、実行・プロファイリング・最適化を試す | 本番の問題公開前に手を動かして理解を深める |
今後の方針
- 6月中: 過去問を解き、プロファイリングと最適化を試して理解を深める。
- 7月: 問題が公開されることを期待する。公開後は、その問題に対する取り組みへ移行する。
- 来週: プロファイリングツールをたくさん試し、その結果をスライドにまとめて共有する(Teams、松村不在)。
未確定事項
- 2026年大会の問題(HPC/AI課題)はまだ公開されていない。
- ベンチマーク抽出ツールは大会側指定。内容は未確定。
cache-referenceなどHWイベントの扱いは環境依存のため要確認。
関連ページ
2026-06-19 議事録
実施日時
- 2026-06-19(金)Teams(オンライン)
目的
- 各自の進捗共有(プロファイリング学習、環境構築、AI推論の動作確認)。
- 計測結果の共有方法(ダッシュボード)と今後の方針を確認する。
決定事項
- プロファイリングは
perfを中心に進める。まずperf statで全体像を掴み、perf record/perf reportで詳細を見る(詳細はプロファイリングツール実践ガイド)。 - ビルドは用途別(Debug / Profile / Release / Optimize など)に切り替えられるよう整備する。分析しやすさと速度はトレードオフのため。
- 計測結果・グラフはダッシュボードに集約して共有する方向で進める。ツールはOSSを調査しつつ、AIを使った自作も検討する。
- 環境は再現性を重視する。リポジトリ/コンテナを整備し、他メンバーがコマンド一つで同じ環境を再現できるようにする。
- Pythonのパッケージ管理は
uvを使う(動作が速く扱いやすい)。 - AI推論は最終的に
SGLangを使う想定で進める。
共有内容
プロファイリング学習(perf)— 田中
perfは日本語情報が少なく、man、Archwiki、ライブコーディング動画(impl Rust: One Billion Row Challenge)が学習に役立った。
実践的な使い方・注意点・ビルドオプションは技術ページへ分離した(プロファイリングツール実践ガイド)。要点:
- まず
perf stat -r <n> -d -d -dで詳細イベント+複数回実行の統計を取る。perf record/perf reportがcall graph・アセンブリ分析まででき、最も使いやすい。 perf recordはイベント数が多すぎると解析不能・ストレージ圧迫になる。実行中プロセスへ短時間アタッチ(perf record -F 999 -g --call-graph fp -p <PID> -- sleep 30)が有効。- 可視化に
flamegraphが便利。
AI推論の動作確認
- まず
transformersで小さめのモデルを動かし、モデルロード・KVキャッシュ確保まで確認した。 - ベンチマークは昨年使われた
ShareGPTデータセットを利用して試行。token生成・読み込みの速度を計測した(メモ上の数値: 約512 tokens/s 処理・約128 tokens/s 出力。対照実験はこれから。要確認)。 vLLMとSGLangを比較。vLLMは起動が速い一方でドライバ依存により不安定だったため、SGLangに切り替えて進めている(要確認:環境依存)。- 目標はプロファイリングだが、現状は環境構築とモデル動作確認まで。次は大きめのモデルでベンチを取得する。
環境構築・再現性
- ローカルで構築したものをコンテナ等で他メンバーが再現できるようにする方針。スパコン側でSSH先をクローンすれば全員が同じ環境を再現でき、効率が上がる。
- 管理担当を置き、リポジトリ/環境を整備する。
データ共有・ダッシュボード
- 計測結果をダッシュボードに集約する案。あるメンバーが自分の研究で使っている仕組み(データ投入 → Pythonで自動グラフ生成 → Webページ表示)を流用できそう。
- OSSのダッシュボードツールの調査、またはAIでの自作を検討する。
TODO
| 項目 | 内容 | 目的 |
|---|---|---|
| ダッシュボード調査 | 計測結果共有用のダッシュボード(OSS or 自作)を調べる | 各自の結果をチームで見られるようにする |
| 環境の再現性整備 | コンテナ/リポジトリを整え、コマンド一つで再現できるようにする | 担当者間で環境差をなくす |
| AIモデルのベンチ取得 | 大きめのモデルを動かし、SGLangでベンチマークを取る | 推論性能の基準を作る |
| MPI環境でのperf | MPI環境でのperf等の使い方を実際に動かして確認する | 並列実行のプロファイリングに備える(今後の課題) |
| プロファイリング継続 | 各自ツールを使い、結果を持ち寄る | 計測に基づく改善のため |
今後の方針
- 来週も各自のプロファイリング・環境整備を継続する(次回はHPC側のプロファイリング共有を予定)。
- 7月の問題公開を見込み、それまでは過去問・環境・計測の練度を上げる。
関連ページ
- プロファイリングツール実践ガイド
- プロファイリングと性能分析
- CPU最適化(コンパイラ・ライブラリ)
- NCCL通信最適化
- LLM推論課題の入口
- 2026-06-12 環境構築の進捗と過去問学習方針
- 調査ステータス
2026-06-26 議事録
実施日時
- 2026-06-26(金)Teams(オンライン)
目的
- AI推論の実験環境、MLflowダッシュボード、SGLangベンチマークの初期結果を共有する。
- HPC/OpenFOAM側のプロファイリングツール検証とI/O周りの論点を確認する。
- 競技ルールが未確定な範囲を整理し、次に確認すべきことを決める。
決定事項
- AI推論の実験結果は、当面はMLflowに集約して管理する。重要なrun IDを控え、比較に使わない結果は整理する。
- MLflowは
玄界上で動かせる可能性があるため、ローカルへ結果をダウンロードする形ではなく、共有ストレージへ保存・コピーする形を検討する。 - AI推論環境は、現時点で動作している
SGLang中心に揃える。vLLMは引き続き不安定なため、必要になった段階で再検証する。 - AIチームの実行スクリプトやプロファイリング設定は、Git経由で変更案を出し、共有リポジトリへ反映してから各自がpullして使う。
- モデル候補は、現時点では
Qwen3系に揃えて練習する。Qwen3.5系も候補として見たが、最終課題として使われるかは未確定。 - ベンチマークは、baselineを取ったうえで1回に1条件だけ変える。まず
concurrencyの飽和点を探し、その後に入力長、出力長、ランタイム、パラメータを順番に見る。 - 精度評価、固定すべき生成パラメータ、モデル構造変更の可否、モデルロード時間を測定に含めるか、scratch領域の使い方は大会ルール依存のため
要確認として扱う。 - 次回定例は2026-07-05(日)18:00予定。2026-07-11から2026-07-12は神戸での勉強会予定を前提に調整する。
共有内容
AI推論の評価とルール確認
- 共有されたデータセットには、会話プロンプトはあるが明示的な正解ラベルは見当たらない。速度と処理量を中心に見るベンチマークと考えられるが、精度評価の扱いは
要確認。 - 「精度を落とさない」という制約は、固定された生成パラメータを守ること、モデル構造や品質に影響する変更を避けることに関係しそうだが、どこまでが許可されるかは未確定。
- 速度だけでなく、なぜその変更で速くなったか、品質や制約をどう守ったかを説明できることがプレゼン評価にも関係する。
MLflowダッシュボード
- OSSのMLflowでAI実験用ダッシュボードを構築した。Quick Startの手順でstack起動までは可能。
- 現状の手順はMac前提になっている可能性がある。今後、
玄界上で起動できるかを確認する。 - MLflow UIではタグや比較機能を使ってrunを横並びで見られるが、操作方法やパラメータ設計はまだ整理が必要。
- 実験結果は一旦MLflowに貯め、後から重要なrun IDを控えて比較する運用がよさそう。
SGLang実行環境
SGLang向けの環境構築は一通り完了した。profile系の実行で、実験パラメータ、summary、GPU metricsなどを出せる状態。- 実行結果はMLflow側と連動させる想定。
vLLMも候補にしていたが、現時点では動作が安定していない。まずはSGLangで進める。- 別メンバーが作った環境との差分を確認し、どちらかに統一する。
SGLangを使うなら、基本的には同じ環境に揃える方針。
SGLangベンチマークとconcurrency
- AIチーム共有スライド
Qwen3-30Bプロファイリング.pptxで、Qwen3-30Bの初期プロファイリング結果が共有された。 concurrencyを変えた軽いベンチマークを実施した。concurrencyは単純な物理並列数ではなく、SGLang内部のschedulerが複数リクエストをどう並行処理するかに関係する。concurrency1から8までは、総トークン生成速度が伸びた。output TPSは168.1から864.3へ約5.14倍、QPSは1.313から6.753へ増加した。concurrency4まではTTFT p50への悪影響が小さく、速度向上のメリットが大きそう。concurrency8では総スループットは上がるが、TTFT p50が102ms、E2E latency p99が1,091msまで悪化した。- 成功率は各条件100%だった。
concurrency8では160/160 success。 - GPU平均使用率は89.6%、GPUメモリ使用量は86.2GiB/95.8GiB(約90%)、平均消費電力は250W、最大温度は27度というメモがあった。ただし、モデル、入力長、出力長、測定条件に依存するため
要確認。 - 次は
concurrency12、16、24、32などを試し、速度向上が鈍る飽和点とレイテンシ悪化の境目を探す。 - 理論上の8倍にならない要因として、schedulerの管理コスト、KV cacheアクセス、メモリ帯域、decodeの逐次性、prefill/decodeの干渉、リクエスト長のばらつき、GPU kernelの効率限界が挙がった。
HPC/OpenFOAMとプロファイリング
玄界上でプロジェクトを持ってくるところまでは確認した。ビルドは再実行・再確認中。lscpuの出力から、ログインノードと計算ノードでCPU数、thread per core、周波数、NUMA構成などが違う可能性がある。重い計測は計算ノードで行い、ログインノードでは軽い確認に留める。- MPIのプロファイリングとして
mpiPを試した。ローカルでも仮想的に複数rankを立てて通信時間を確認できる。 perf statはハードウェアイベントの概要確認に使いやすい。一方、perf recordのcall graphは階層が深すぎると読みづらいため、表示階層を絞るなどの工夫が必要。- 並列プログラムでは、1スレッド単位のcall graphだけでなく、複数スレッドやrankを横並びで見て待ち時間を確認できる可視化が重要。
- OpenFOAMは手元で動かせる状態。小さい
blockMesh実行に対してstrace等でI/Oプロファイルを取り、ファイル読み込み、ファイル存在確認、失敗回数、実行時間などを見た。 - OpenFOAMのI/O最適化は、本番環境のscratch領域、共有ストレージ、ファイル配置、許可されるファイルパス変更に強く依存する。現時点では
要確認。
scratch領域とモデルロード
- AI側では、モデル重みをscratch領域へ置くべきかが論点になった。
- モデルロード時間が測定に含まれるか、モデルがGPUメモリに収まるか、ロード後に重みへ再アクセスするかによって、scratch領域の重要度が変わる。
- HPC側でも、scratch領域の容量や利用ルールがI/O最適化に影響する。
- 2026年本番環境の構成、scratch容量、測定開始点は未確定。
TODO
| 項目 | 内容 | 目的 |
|---|---|---|
| MLflowの共有運用 | 玄界上でMLflowを起動できるか確認し、結果を共有ストレージへ保存する方式を検討する | チーム全員が同じ実験結果を見られるようにする |
| AI環境の統一 | 既存のSGLang環境と別メンバー環境を比較し、Git経由で共通設定へ寄せる | 実験条件のずれを減らす |
| 全データセット実行 | 小さいモデルでもよいので、共有データセット全体を通して実行する | 本番に近いベンチマーク手順を確認する |
| concurrency sweep | concurrency 16、32などを試し、throughput、TTFT、E2E latency、GPU使用率、GPUメモリを記録する | 飽和点とレイテンシ悪化の境目を見つける |
| SGLang内部理解 | scheduler、continuous batching、KV cache、prefill/decodeの流れを調べる | パラメータ変更の意味を説明できるようにする |
| モデル候補確認 | Qwen3系とQwen3.5系のモデルサイズ・用途・公式情報を整理する | 練習対象モデルをブレさせない |
| OpenFOAMビルド確認 | 玄界上でOpenFOAM関連のビルドと実行を再確認する | HPC側のbaseline測定に入る |
| MPI/perf可視化 | mpiP、perf record、複数スレッド・rankを横並びで見られる可視化ツールを比較する | 待ち時間と通信ボトルネックを見つけやすくする |
| OpenFOAM I/O調査 | strace等でファイルアクセス、ファイル存在確認、失敗回数、scratch利用を調べる | I/O由来の改善余地を見つける |
| 大会ルール確認 | 精度評価、固定パラメータ、モデル変更、ロード時間、scratch容量、ファイルパス変更可否を確認する | ルール違反になる最適化を避ける |
今後の方針
- 公式ルールが出るまでは、競技固有の断定を避ける。
- AI側は
SGLang、MLflow、concurrencyを中心に、baselineから1条件ずつ変えて記録する。 - HPC側はOpenFOAMを動かし、
perf、mpiP、straceなどでCPU、通信、I/Oの見方を固める。 - 実験結果は「速くなった」だけでなく、どの指標がどう変わったか、なぜその変更を固定するのかを残す。
関連ページ
- 2026年大会の現時点まとめ
- 調査ステータス
- AI推論課題の入口
- AI推論ベンチマーク指標
- AI推論最適化の論点
- プロファイリングツール実践ガイド
- I/O最適化
- MPI通信最適化
- OpenFOAM最適化の考え方
- 2026-06-19 perf学習・AI動作確認・ダッシュボード方針
2026-07-05 議事録
実施日時
- 2026-07-05(日)Teams(一部オンライン参加)
目的
- 各自の進捗(計算ポイント運用、ダッシュボード、OpenFOAMのI/Oプロファイリング)を共有する。
- 2026-07-10から2026-07-12の神戸勉強会に向けて、宿泊・移動の段取りを決める。
- トークン(計算ポイント)復活までの当面の進め方を確認する。
決定事項
- 計算ポイントは不足しそうなため、Slack経由で権利者へ追加購入を依頼する。単価は研究施設が1ポイント2円、民間が1ポイント3円で、追加分は概ね3,000円規模の見込み。
- ポイントの浪費を防ぐため、ジョブの
elapsed time(実行時間上限)を1〜2時間に設定し、不要なジョブは適宜打ち切る運用にする。1回に投げるジョブは絞る。 - ダッシュボードは
玄界上で構築する方針。共有リポジトリ内に作っても、OpenFOAMチーム用に別途作って隣に並べてもよい。結果がすぐ反映される形を優先し、具体的な作り方は担当者に任せる。 - AIチームのGitHub連携は、学生プランでは想定機能が使えない可能性が高い。原因の切り分けは難しいため、当面はアカウント種別の問題として扱う。
- OpenFOAMの動作確認は
玄界へトンネルを張って行う。表示されない場合は接続をやり直す(2回試すと通ることがある)挙動を共有した。 - 神戸勉強会はメリケンパーク近くのホテルを2泊(2026-07-10チェックイン、2026-07-12チェックアウト)で予約する。4名1部屋(シングルベッド4台、オーシャンビュー、エアコンあり)で一人あたり約8,742円/泊。
- 移動は新幹線を基本とし、山梨・静岡からの参加者は静岡駅まで車で出て静岡から新幹線に乗る案を採用する。関東からの参加者は新横浜からのぞみで合流する。
- トークン復活までは新規の重い作業ができないため、次にやることは復活後に改めて検討する。復活後の作業結果は次回にまとめて共有する。
共有内容
計算ポイントの運用
- 現状ポイントが不足しそうなので、権利者へ追加購入を依頼する。研究施設単価2円/民間単価3円で、追加は数千円規模。
- ジョブの
elapsed timeを1〜2時間に制限し、無駄なジョブを止めてポイント消費を抑える。1回に投げるジョブ数も絞る方針。 - 現時点では、各自まだ本格的な実行までは進めておらず、投げたジョブも限定的。
ダッシュボードとGitHub
- ダッシュボードは
玄界上に構築し、結果がその場で反映される形を目指す。共有リポジトリ内でも、OpenFOAMチーム用に別立てでもよい。 - AIチームのGitHub連携は学生プランでは目的の機能が使えない可能性が高く、原因を切り分けきれないため、当面はアカウント種別の問題として整理する。
OpenFOAMのI/Oプロファイリング(strace)
- 昨年の
LVK資料を参照しつつ、strace系のツールでOpenFOAMの動作を追い、どのシステムコールが何回呼ばれ、どれが失敗しているかを確認した。 - ファイルのオープン・読み込み・書き込み・削除といったI/O系イベントを、重要そうなものに絞って一覧化して見られる。例として
openの失敗回数が多いことが確認できた。失敗の一因は、存在しないライブラリを探しに行って時間がかかっているケースと考えられる。 - コマンドのオプションを変えると詳細一覧が出力され、読み込みに何マイクロ秒かかったかなどを見られる。メモリ配分の情報も確認できるとの記載があった。
blockMeshの実行を題材に、入力ファイル(blockMeshDictなど)を読み込み、結果を書き込む流れをstraceで観察した。
スタック/ヒープとメモリ指定
- 昨年資料に「スタック領域を使う(ヒープを使わない)ことで高速化する」旨の記述があり、
stack/heap/globalのメモリ指定を増やす設定が候補として挙がった。 - ただし、実際にどう入力するか、どの程度効果が出るかはまだ明らかになっておらず
要確認。単純に増やせばメモリを食うだけになる懸念もあり、スクラッチ領域への書き込みなどとの関係も含めて検証が必要。
神戸勉強会の段取り
- 2026-07-10から2026-07-12の2泊で、メリケンパーク近くのホテルを予約。4名1部屋(シングル4台、オーシャンビュー、エアコンあり)で一人約8,742円/泊、2泊で約1万6〜7千円。
- 移動は新幹線が基本。山梨・静岡側の参加者は静岡駅まで車で出て静岡から新幹線に乗る案を採用(高速利用で車移動は1.5〜2時間、駐車場は静岡駅周辺で1日約900円)。車を使うと約5,000円安くなる見込み。
- 関東からの参加者は新横浜からのぞみで合流する想定。往路初日はホテル直行、時間があれば神戸観光も検討する。学割の証明書が間に合わなかったため、切符は各自で手配し精算する。
TODO
| 項目 | 内容 | 目的 |
|---|---|---|
| ポイント追加購入 | Slackで権利者へ計算ポイントの追加購入を依頼する | 実行に必要なポイントを確保する |
| ジョブ運用ルール | elapsed timeを1〜2時間に設定し、不要ジョブを打ち切る運用を徹底する | ポイントの浪費を防ぐ |
| ダッシュボード構築 | 玄界上に結果が即反映されるダッシュボードを用意する(配置は担当者判断) | 実験・計測結果を素早く確認できるようにする |
| strace結果の整理 | OpenFOAMのI/Oイベント(open/read/write/失敗回数)を整理し、失敗の原因を切り分ける | I/O由来のボトルネックと無駄を見つける |
| メモリ指定の検証 | stack/heap/globalのメモリ指定変更が高速化に効くかを玄界で確認する | 昨年資料の高速化案の効果を確かめる |
| 玄界アクセス手順共有 | トンネル経由での接続手順(再接続で通る挙動を含む)をまとめる | チーム全員が同じ手順で確認できるようにする |
| 神戸勉強会の予約 | ホテル予約を確定し、各自の新幹線切符を手配・精算する | 2026-07-10〜12の勉強会の段取りを固める |
次回方針
- トークン(計算ポイント)復活までは新規の重い作業を止め、復活後に次のタスクを決める。
- 復活後は、ポイント制約の中で
elapsed timeと投げるジョブ数を管理しながら計測を進める。 - OpenFOAM側は
straceのI/O観察とメモリ指定の検証を続け、失敗回数や無駄なI/Oを減らす余地を探す。 - 神戸勉強会(2026-07-10〜12)で、現地作業と情報共有を進める。
参考リンク
2026-07-26 議事録
実施日時
- 2026-07-26(日)Teams(オンライン)
目的
- 各自の進捗を共有する(OpenFOAMの2MPIプロファイリング、LLM推論のprefill/decode分析、Nsight Systems導入)。
- 小規模問題での分析の限界を踏まえ、本番環境・マルチGPU検証に向けた優先順位を整理する。
- 計算ポイント(ジョブ予約)の使い方と、週末のまとめ実験の進め方を決める。
決定事項
- マルチGPU/NCCL通信の検証を最優先にする。スケジューラやハイパーパラメータの細かいチューニングは優先度を下げ、公式ドキュメントで決まる範囲やAI探索に任せる。
- 週末に実験をまとめて実施する。全タスクを洗い出し、一括で投下する。
- ジョブ予約は最小単位が1時間なので、1時間枠に複数実験をまとめて投げる運用にする。制限時間は2時間程度に設定してもポイントは大きく減らない見込み。
- 「機械的に決められる項目」を2人でリストアップし、リストの項目ごとにGoogle スライドを作って共有する。あわせて本番環境の構築を進める。
- Nsight Systems(
nsys)をGPU側の共通プロファイラとして使う方向で進める。使い方は各自で一度確認する。 - 大会運営から提供された資料をWiki化・公開する場合は、著作権に配慮してパスワード保護や限定公開を検討する。
- 本番モデルは
Qwen 3.5系(LLM Foundation)とみられるが、正式には要確認。大会ルールは2026-08-01頃に公開予定で、その後にクラスタマシンへアクセスできる見込み。
共有内容
OpenFOAM 2MPIプロファイリング(小林)
OpenFOAM-devのfoamRunを1MPIと2MPIで実行し、実行時間を計測した。ウォームアップとして1回実行した後、5回ずつ実行して平均を算出した。- 1MPI:
2.710 [s] - 2MPI:
6.168 [s] - 今回の問題は小規模なため、2MPIの方が遅い(通信オーバーヘッドが計算削減量を上回る)。
- 1MPI:
- プロファイラには
PMPI(MPIのプロファイリングインターフェース)を使用した。LLMにPMPIラッパを作成させ、MPI関数の呼び出し回数・時間・メッセージサイズを記録した。 - rank1の
MPI_Waitall(約2.24 [s]、rank0は約0.21 [s])とMPI_Recv(約0.49 [s]、rank0は約0.01 [s])が大きく、rank1の通信待ち時間が長い。 - メッセージサイズは小さい通信がほとんど(
Allreduceは0〜8Bが大多数、point-to-pointも65〜256B中心)。問題が小規模なため小さいメッセージが多数発生している。 - 小さいメッセージほど帯域を十分に使えず、
message rate(1秒間に処理できる通信メッセージ数)の制約の影響を強く受ける。 - ボトルネックは「小さいメッセージの通信が多いこと」と「rank1の通信待ちが発生していること」。
- 改善案:小さいメッセージを集約する。複数データを
packして集約バッファにまとめ、MPI_Isend/MPI_Irecvを1回にしてunpackする。通信する合計データ量は変わらないが、Isend/Irecvの呼び出し回数を減らせる。
LLM推論のprefill/decode分析(松村)
-
vLLM/SGLangのエンジン構成(scheduler、KV cache manager、block_pool、paged KV cache memory)を整理した。 -
昨年のデータセット
ShareGPT_V3_unfiltered_cleaned_split.jsonを確認した。リクエスト数2000、総入力トークン626,729、総生成トークン388,685。2025年の平均は入力約313/出力約194トークン。 -
入力順は
seed=2026で固定とみられ(要確認)、順番はいじれない。2000リクエストを同時にエンジンへ渡す(bench_offline_throughput.py)と、スケジューラが並び替える。Continuous batching/Dynamic batchingにより、実行時は自然と近い長さ・近いタイミングのリクエストが同じバッチに入る。 -
SGLangのハイパーパラメータを整理した。
--mem-fraction-static:KV Cache用に確保するGPUメモリ割合。OOMにならない範囲で大きくする。--schedule-conservativeness:スケジューラがどれだけ積極的にリクエストを投入するか。--max-running-requests:同時実行できる最大リクエスト数。--chunked-prefill-size:Prefillを分割するトークン数。長文Promptで有効。
-
評価指標は
TTFT(最初の1トークンまでの時間)、ITL(トークン間隔)、TPS(システム全体の毎秒生成トークン数)。TPSが高くても1回答あたりが高速とは限らない。 -
計測結果(長い質問は最初の読み込みだけでなく生成中にも影響する)。
条件 TPS ITL 短い質問・短い回答 1,812 6.96 ms 長い質問・短い回答 1,372 9.60 ms 短い質問・長い回答 1,239 11.52 ms -
結論:スケジューラ改変などは実際の問題(来週判明予定)が分かってから。固定できるものは固定し、優先度の低い項目は後回しにして、マルチGPU検証(
Qwen 3.5)を急ぐ。
Nsight Systems導入(渡邊)
Matsumura-CODEの導入とShareGPTのスモークテストを完了した。Nsight Systems(nsys、NVIDIA提供のGPUシステムプロファイラ)を導入した。perfのようにCUDAカーネル実行時間、CPU⇔GPU同期、メモリ転送、ストリーム並列性、アイドル時間をGUIで可視化できる。nsysはCUDAツールキットに同梱されている(玄界上でnsys 2023.2.3を確認)。nsys profile --trace=cuda,nvtx,osrt ...のように起動する(cuda=CUDA kernel/memcpy/stream、nvtx=PyTorch/SGLangの区間マーカー、osrt=CPUスレッド/mutex/同期)。sleep 1の動作確認は成功。生成した.nsys-repをローカルに落としてNsight Systemsで解析する流れ。- ShareGPTを使ったスモークテスト(
Qwen3-30B、num-prompts 4、bfloat16、tensor-parallel-size 1、context-length 2048、disable-cuda-graph)のプロファイリングは失敗中。単体のスモークテストではモデルが動くが、nsysで挟むと途中で止まる。エラーコードやログが出ておらず、どこで止まったか切り分け中。サーバ/クライアント分離型で起動しており、サーバ側の終了を検知できずに詰まっている可能性がある。
全体の議論・方針
- 小規模問題では推測ベースの議論に限界がある。本番モデル・本番に近い環境での検証を優先する。
- 確定している要素は固定し、不確定要素(
NCCL通信など)にリソースを集中する。それ以外はAIで探索する。 - 待ち時間が依然として長い。渡邊のジョブは3日経っても実行されていない。制限時間を1〜2時間にしてもポイントは減っていないため、まとめて実行する方向。
- パラメータ探索の自動化案:実行時間を目的関数にし、シェルスクリプト経由でパラメータを振って最適値を探す(
Optuna/ベイズ最適化のイメージ)。2次元パラメータなら結果を可視化して次の探索点を決められる。根拠を明示したい場面ではAIより可視化が有効。 - Wiki化:今週分の各自のスライドをスクショ・PDF化し、翻訳と解説を付けてMarkdownでWikiに取り込む方針。公開時は著作権に配慮する。
TODO
| 項目 | 内容 | 目的 |
|---|---|---|
| メッセージ集約の検証 | 小さいメッセージをpackして集約バッファで一括Isend/Irecvしunpackする実装を試す | message rate制約とrank1の通信待ちを緩和する |
| nsysプロファイル修復 | ShareGPTスモークテストがnsysで止まる原因(サーバ/クライアント終了検知)を切り分ける | GPU側プロファイルを取得できるようにする |
| マルチGPU検証 | 本番モデル(Qwen 3.5系)でマルチGPU・NCCL通信を検証する | 本番環境に近い条件で効果を測る |
| 機械的項目のリスト化 | 機械的に決められる項目を2人で洗い出し、項目ごとにGoogle スライドを作る | 本番環境構築の作業を分担・共有する |
| 週末まとめ実験 | 全タスクを1時間枠にまとめてジョブ投下する | ポイントと待ち時間を節約して結果を一括取得する |
| 本番環境構築 | 本番モデル・本番に近い実験環境を1式構築する | 推測ではなく実測で議論できるようにする |
次回方針
- 本番環境の構築とマルチGPU/
NCCL検証を主軸に進める。スケジューラやハイパラ探索はAI/自動探索に寄せる。 - 週末にまとめて実験し、結果を次回共有する。ジョブは1時間枠に複数実験を詰めて投げる。
- 大会ルール公開(2026-08-01頃)後に、本番課題・使用モデル・評価条件を確認し、方針を見直す。
- 各自のスライドをWiki化し、公開範囲(限定公開・パスワード)を決める。
参考リンク
- 2026-07-05 ポイント運用・strace I/O調査・神戸勉強会の段取り
- MPI 特別講義まとめ
- MPI通信最適化
- AI推論ベンチマーク指標
- PD Disaggregation
- NCCL通信最適化
- プロファイリングツール実践ガイド
2026-08-09 議事録
実施日時
- 2026-08-09(日)Teams(オンライン)
目的
- 2026 HPC課題の確定ルールと評価方法(FVOPS)を共有する。
- 競技マシン(NCI
Gadi、NSCCASPIRE-2A)へのアクセス環境(VPN・アカウント)を整える。 - OpenFOAMのベースライン測定の進め方と
玄界での実測結果を確認する。 - チーム内の情報共有方法として「分報(Times)」の導入を決める。
決定事項
- HPC側は主に
Gadiを使う方針とする。ASPIRE-2Aは結果のばらつき(spread)が大きく、ルール上「改善率がspreadを下回るとscore評価されない」可能性があるため(要確認)、安定して結果が出るGadiを優先する。 - 大きな高速化は
data layout/cache locality/memory trafficの削減方向で狙う。compiler/MPI設定・process bindingは重要だが改善幅は数%程度と割り切る。source modificationはルール上許可されている。 - ベースラインは同一条件で4〜5回実行してばらつきを把握する。
process bindingが正常に動作していることを必ず確認する(解除すると約3.7倍遅くなる)。 - 情報共有用に「分報(Times)」チャンネルをTeams上に作る。各自が思ったこと・悩みどころ・判断・決定をその場で書き溜めていく。通知で全員が疲れないよう、非表示(ミュート)チャンネルとして作る。
- 環境構築の手順(VPN接続、アカウント作成、ログイン方法)を、画像付きで後からまとめてWiki化する。九州大学側の知見も参照する。
Iris(講習会で使ったスパコン)は練習用として使う。本番では使わない旨をルール・手順に明記する。
共有内容
2026 HPC課題の確定ルール(小林)
-
固定されているもの(変更不可)。
OpenFOAM v2506以降を使用する。- 計算量、出力結果の精度。
- 使用ノード数は
1,2,4。
-
評価指標
FVOPS(高いほどよい)。FVOPS_trim = (64,000,000 × 4) / (ExecutionTime_step5 − ExecutionTime_step1)- solverが出力する
ExecutionTimeを結果として使う。 - Step1〜5を実行し、Step1の結果は除外する(ウォームアップ相当)。
- solverが出力する
-
評価対象は「4ノードでベースラインからどれだけ高速化したか」。
報告・提出するもの(小林)
- 1/2/4ノードそれぞれの結果(
Log.icoFoamとparse_result.shのRESULT)。 - 最適化内容(何を変更したか。1つの変更につき1行)。
- 最適化の仮説(なぜ高速化すると考えたか)とボトルネックの根拠(なぜボトルネックと判断したか)。この2つは重要な評価項目。
FVOPSbefore / after / Delta(変化量)。MPIrank数(ranks per node)、Decomposition(分割法)、Subdomain数(rank数との関係も明示)、Ordering/renumbering(未実施ならその旨)。- 総run数(実験期間中の全run)と総core-hours / SU(消費した計算資源)。
競技マシン:Gadi と ASPIRE-2A(小林)
-
昨年の資料を見た限り、HPC部門では
Gadiを選ぶチームが多い。 -
gitで公開されていたベースラインログでは、
ASPIRE-2Aは結果のばらつきが大きい。ルール上、改善率がspreadを下回るとscore評価されない可能性がある(要確認)。 -
公開ベースラインログの要約(Best FVOPSは高いほど良い)。
Cluster Nodes Runs 平均 [s/step] Spread Best FVOPS Gadi 1 3 31.881 1.22% 2.0161 M Gadi 2 3 15.467 0.29% 4.1457 M Gadi 4 8 6.592 1.87% 9.7785 M ASPIRE-2A 1 3 55.286 4.03% 1.1793 M ASPIRE-2A 2 8 27.261 23.91% 2.6003 M ASPIRE-2A 4 8 12.001 13.73% 5.7168 M -
ポイント(core-hours / SU)には上限があり、消費量は報告義務がある(報告項目に含まれる)。
主催者が推奨していること(小林)
- ベースラインを再現する。同一条件で4〜5回実行し、結果のばらつきを把握する。
process bindingが正常に動作することを確認する(解除すると約3.7倍遅くなる)。compiler/MPI設定の変更は試して記録する価値はあるが、大幅な高速化は期待しない。主催者の測定ではMVAPICH/UCX設定・binding・compiler flagsはいずれも改善幅が数%程度だった。- 大きな改善を狙うなら
data layout・cache locality・memory traffic。solverはachievable memory bandwidthのかなり高い割合をすでに使っており、命令の高速化よりDRAMとのデータ移動量そのものを減らす方に余地が大きい。source modificationも許可されており、公式ルールは許可例としてcache blocking、SpMV vectorization、通信と計算のoverlap、PCGglobal reductionsの融合などを挙げている。
玄界上でのベースライン(小林)
-
条件:
OpenFOAM-v2606、MPIはMVAPICH 3.0-gcc8.5.0、decompositionはscotch、各ノード数3回ずつ実行。ノード数 平均実行時間 [s/step] Best実行時間 ばらつき Best FVOPS 1 32.384 31.869 4.84% 2.0082 M 2 17.929 17.312 9.42% 3.6968 M 4 6.816 6.678 3.18% 9.5844 M -
Gadiの公開ベースライン(4ノードBest FVOPS 9.7785 M)と近い水準まで再現できている。2ノードのばらつき(9.42%)はやや大きく、測定回数を増やす余地がある。
アカウント・VPN・環境構築
- NSCCのアカウントは各メンバーに1つずつ付与される(
ASPIRE内では個人アカウント)。 - 接続には
Endpoint Security VPNのソフトをインストールする。ユーザー名APACSC15でログインに失敗する事例があったが、原因はI(大文字アイ)とl(小文字エル)の取り違え。画像共有で解決した。VPN接続時は毎回、端末側で認証(QRコード等の二段階認証)が必要。 - NCI(
Gadi)はASPIREとは別のマシン。利用にはプロジェクトのメンバーシップ申請(join)が必要で、プロジェクトコードで検索して参加リクエストを送る。各自のアカウント名でログインする。 - 接続手順は各自で一度確認し、後で画像付きにまとめてWiki(限定公開の想定)に残す。
情報共有:分報(Times)の導入
- リーダーの提案。会社で導入している経験から、効率的だったとのこと(経験談)。
- 「思ったこと・気づき・判断・決定」を時系列で書き溜め、チームで共有する。ドキュメントに残すほどでもないが後から見返したい内容の受け皿にする。
- リアルタイム性と相性が良い。夏休み期間は出社・発表がまばらになるため、記録として特に有用。
- チャンネルの粒度(個人ごと/チームごと/全体)は今後調整する。まずはTeamsに作成し、HPC/AIそれぞれの気づきを記録として残す。通知は非表示(ミュート)運用にする。
TODO
| 項目 | 内容 | 目的 |
|---|---|---|
| 提出物テンプレの整備 | 報告項目(仮説・ボトルネック根拠・FVOPS before/after・decomposition・総SU等)を実験ログに組み込む | 提出要件を満たしつつ最適化を記録する |
| ベースライン測定 | Gadi(本番)で同一条件4〜5回実行し、spreadとprocess binding(解除で約3.7倍遅)を確認する | 4ノードの評価基準(baseline)を固める |
| data layout最適化の検討 | cache blocking・SpMV vectorization・通信計算overlap等、許可されたsource modificationを洗い出す | 数%止まりでなく大きな改善余地を狙う |
| 環境構築手順のWiki化 | VPN接続・アカウント作成・ログイン手順を画像付きでまとめる | 全員が同じ手順で競技マシンへアクセスできるようにする |
| 分報チャンネル作成 | Teamsに分報(Times)チャンネルを非表示で作る | 判断・気づきを記録して共有する |
| spread評価ルールの確認 | 「改善率がspreadを下回るとscore対象外」の可否を公式ルールで確認する | Gadi優先の判断根拠を確定する |
次回方針
- HPCは
Gadiを主軸に、4ノードのベースラインを固めてから最適化に入る。まずはdata layout/cache locality方向の候補を検討する。 - VPN・アカウントの環境が整い次第、各自が小林の測定を後追いで再現し、spreadを確認する。
- 分報を実際に運用し始め、判断や気づきを蓄積する。
参考リンク
- 2026-07-26 2MPIプロファイリング・prefill/decode分析・Nsight Systems導入
- 2026-07-05 ポイント運用・strace I/O調査・神戸勉強会の段取り
- MPI通信最適化
- 領域分割(decomposePar)
- NUMA最適化
- プロファイリングツール実践ガイド
2026年大会の現時点まとめ
公式に確認できたこと
2026年大会の公式ページは、2026 APAC HPC-AI Competitionです。
公式ページに掲載されている主要日程は次の通りです。
| 日程 | 内容 |
|---|---|
| 2026-05-22 | 競技チーム一覧の確定 |
| 2026-05-29 | training planの発表 |
| 2026-06-08以降 | training lecture開始 |
| 2026-08-03以降 | 競技マシンへのアクセス開始 |
| 2026-10-09以前 | スライドとコード提出 |
| 2026-10-16 | presentation interview agenda発表 |
| 2026-10-19以降 | presentation interview |
| 2026-11 | Supercomputing Conference 2026で最終結果発表 |
| 2027年 | SupercomputingAsia 2027で授賞式 |
表彰には、First Place、Second Place、Third Place、Merit Prize、HPC Special Prize、AI Special Prizeなどがあると公式ページに書かれています。
メモ上の2026年課題候補
殴り書き.txtには、主催側の説明として次の内容が含まれています。
- HPC側: OpenFOAM HPC Committee repositoryからOpenFOAMベンチマークケースと入力ファイルを使う予定。
- HPC側: 4ノード、100コア超の現代的CPUクラスタで短時間に終わる問題サイズを選ぶ予定。
- AI側: Qwen inference / PD disaggregation inference workloadsを更新中。
- AI側: Dynamoの
benchmarksとrecipes/qwen3-235b-a22b-fp8をPBS/Slurmに適用する計画。 - ただし、正確なOpenFOAMケース、パラメータ、SGLangで使うモデル構成、測定方法は未確定。
これは重要な手がかりですが、公式ページに最終ルールとして掲載されたものではありません。現時点では「要確認」として扱います。
今年の質問リスト
大会運営に確認すべき質問です。
| 質問 | 理由 |
|---|---|
| OpenFOAMのケース名、ソルバ、メッシュサイズは何か | 最適化対象がケース依存だから |
| 変更可能範囲はどこまでか | ソルバ改変、decomposeParDict、I/O、コンパイルオプションの扱いが異なる |
| AI側はSGLang固定か、Dynamo必須か、TensorRT-LLM recipeは参考だけか | 実装戦略が大きく変わる |
| モデル重みは実重みかランダム重みか | speculative decodingやMTPの有効性が変わる |
| 評価指標は総throughputだけか | 実サービスらしさ、fairness、latency trade-offが変わる |
| 量子化、torch.compile、実験的機能、モデル品質を下げる変更は禁止か | 2025年はこの種の制約があったため |
| ジョブスケジューラはPBSかSlurmか | 実行スクリプトと自動実験基盤が変わる |
当面の動き方
最終ルールが出るまでは、競技固有の数値チューニングではなく、次を優先します。
- OpenFOAMの並列実行、領域分割、ログの読み方を理解する。
- LLM推論のprefill、decode、KV cache、throughput、latencyの意味を理解する。
- 実験ログのフォーマットを先に決める。
- 1回の実験で1つの変更だけを入れ、差分を説明できるようにする。
参考文献
- 2026 APAC HPC-AI Competition
- OpenFOAM HPC Committee repository
- Dynamo benchmarks
- Dynamo Qwen3-235B-A22B-FP8 recipe
2025年大会の振り返り
公式発表で確認できる2025年課題
HPC-AI Advisory Councilの2025年結果PDFでは、2025年大会の課題が次のように説明されています。
| 部門 | 課題 |
|---|---|
| HPC Track | NWChemによる計算化学シミュレーションの実行時間最小化 |
| AI Track | SGLangを使ったDeepSeek-R1 671B推論スループット最大化 |
公式PDFでは、参加者がprofiling、algorithmic refinements、architecture-specific tuningを使ってHPC/AI性能を改善したことも説明されています。
日本チームの結果
東京農工大学などのプレスリリースでは、理研R-CCSが支援した4チームの入賞が確認できます。
| チーム | 賞 |
|---|---|
| T0M0K4ZU w/ RIKEN | 総合部門 Merit Award |
| Moralistars w/ RIKEN | HPC部門 Best HPC Performance賞 |
| SQUID w/ RIKEN | HPC部門 Excellent HPC Performance賞 |
| Kisarazu Big Branch team w/ RIKEN | AI部門 Excellent AI Performance賞 |
このプレスリリースでは、理研R-CCSが2025年大会から学生出場支援事業を開始し、練習用計算資源として九州大学のスーパーコンピュータ「玄界」の利用支援などを行ったことも説明されています。
参加記から得られる実践知
木更津高専チームの参加記は公式ルールではありませんが、初心者チームが何に詰まるかを知るうえで有用です。
主な学びは次の通りです。
- 最初の数週間は、最適化以前にクラスタ、VPN、2FA、ジョブスケジューラ、モデルロードに慣れる時間になる。
- 2025年のAI側では、SGLang公式ドキュメントとブログを読み、parallelism、batch size、network、attention、MoE/MTPなどを調べている。
- 実験は300回規模になり得るため、実験前に仮説を書き、実験後に設定、結果、ログ、解釈を残す仕組みが必要。
- 成功例だけでなく、期待した高速化が出なかった例も重要。例えばDP Attentionは文献上よく見えても、実環境ではスループットが落ちる可能性がある。
2026年に引き継ぐべき教訓
- ベースラインをまず動かす。
- 実行時間、ロード時間、I/O、ネットワーク、GPU使用率、CPU使用率を分けて見る。
- 「速くなった」ではなく、「どのメトリクスが、どの条件で、どれだけ変わったか」を記録する。
- 大会ルール上禁止される可能性がある変更を、早い段階でリストアップする。
- プレゼン評価もあるため、最終スコアだけでなく実験設計と説明可能性を残す。
参考文献
- HPC-AI Advisory Council Announces Results of the 8th APAC HPC-AI Competition
- 学生向け計算科学分野国際コンペティションで上位入賞
- The 8th APAC HPC-AI Competition参加記
プロファイリングと性能分析
これは何か
プロファイリングは、プログラムの実行時間、CPU/GPU使用率、メモリ使用量、通信時間、I/O待ち時間を計測する作業です。 最適化の前に必ず行い、「どこが遅いのか」を事実で確認します。
コンテストで上位を狙うには、最初からコードや設定を勘で変えるのではなく、まず性能探偵として遅い場所を特定することが重要です。
なぜ重要か
HPCやAI推論では、遅く見える原因が一つとは限りません。
- CPU計算が重い。
- GPUが十分に使えていない。
- GPU間通信が詰まっている。
- MPI通信待ちが長い。
- KV cacheやメモリアクセスが帯域不足になっている。
- I/Oやモデルロードで待っている。
- CPU側の前処理がGPUを待たせている。
ボトルネックを特定しないまま最適化すると、スコアに効かない場所へ時間を使う危険があります。
キャッチアップすべき技術一覧
| 技術 | What | Why | When | Where | How | 重要度 |
|---|---|---|---|---|---|---|
| プロファイリング | 実行時間やリソース使用状況を計測 | 改善箇所を特定するため | 最初に必ず実施 | CPU、GPU、メモリ、通信、I/O | perf、VTune、nsys、htop、nvidia-smi | ★★★★★ |
| ボトルネック分析 | 最も遅い部分を特定 | 効果の大きい改善を行うため | プロファイリング後 | システム全体 | 時間割合分析、待ち時間分析 | ★★★★★ |
| CPU最適化 | CPU計算を高速化 | CPUが律速の場合に有効 | CPU使用率が高い時 | HPC計算、前処理 | SIMD、OpenMP、コンパイラ最適化 | ★★★★☆ |
| GPU最適化 | GPU利用率を上げる | GPUの遊び時間を減らす | GPU utilizationが低い時 | AI推論、学習 | batch調整、kernel融合 | ★★★★☆ |
| メモリ最適化 | メモリアクセスを改善 | メモリ待ちを減らす | cache missや帯域待ちが多い時 | LLM、科学計算 | cache活用、データ配置改善 | ★★★★☆ |
| MPI通信最適化 | ノード間通信を減らす | HPCでは通信が支配的になりやすい | MPI_Waitなどが長い時 | CPUクラスタ | 通信回数削減、通信隠蔽 | ★★★★★ |
| NCCL通信最適化 | GPU間通信を高速化 | マルチGPU効率を上げる | AllReduceなどが長い時 | 分散推論、分散学習 | topology確認、通信設定確認 | ★★★★★ |
| NUMA最適化 | CPUとメモリ配置を最適化 | リモートメモリアクセスを減らす | マルチソケット環境 | 大型CPUサーバ | numactl、CPU pinning | ★★★☆☆ |
| I/O最適化 | データ読み書きを高速化 | ストレージ待ちを減らす | 大量データ利用時 | 学習、シミュレーション | cache、並列I/O、出力頻度調整 | ★★★☆☆ |
| スケーリング分析 | 並列効率を測る | ノードやGPUを増やす価値を判断する | 最適化評価時 | 分散システム全般 | 1→2→4→8台比較 | ★★★★★ |
HPCコンテストでの優先順位
| 順位 | 技術 | 理由 |
|---|---|---|
| 1 | プロファイリング | 何が遅いか分からないと改善できない |
| 2 | ボトルネック分析 | 最も効果の大きい箇所を見つける |
| 3 | MPI/NCCL通信解析 | HPC・AIともに通信が律速になりやすい |
| 4 | スケーリング分析 | ノード数やGPU数を増やす価値を判断できる |
| 5 | メモリ最適化 | 現代CPU/GPUは計算よりメモリ待ちが効くことが多い |
| 6 | CPU/GPU最適化 | ボトルネックが計算だった場合に有効 |
| 7 | NUMA/I/O最適化 | 特定環境で大きな効果を発揮する |
去年の課題との対応
| 部門 | 最重要技術 | 次点 |
|---|---|---|
| NWChem(4 CPU nodes) | MPI通信解析 | スケーリング分析、NUMA最適化 |
| SGLang + DeepSeek-R1(16 H100 GPUs) | NCCL通信解析 | GPUプロファイリング、KV cache解析 |
2025年AI部門では、単純なCUDA最適化よりも、次の順番で状況を切り分ける力が重要だった可能性があります。
- GPUは本当に忙しいのか。
- GPU間通信で詰まっていないか。
- KV cache参照で帯域不足になっていないか。
- CPUがGPUを待たせていないか。
これは要確認の推測ですが、SGLangや大規模LLM推論では、GPU kernel単体の高速化だけでなく、batching、KV cache、GPU間通信、CPU側スケジューリングが全体性能に影響します。
最初に見るべき指標
| 対象 | 指標 | 見る理由 |
|---|---|---|
| CPU | CPU使用率、hotspot関数、cache miss、context switch | CPU計算や前処理が律速か見る |
| GPU | GPU utilization、SM使用率、memory bandwidth、kernel timeline | GPUが計算で忙しいか、待っているかを見る |
| メモリ | 使用量、帯域、cache miss、page fault | メモリ待ちや容量不足を見る |
| MPI | MPI_Wait、通信時間、rank間の負荷差 | ノード間通信やload imbalanceを見る |
| NCCL | AllReduce/AllGather時間、GPU間転送、topology | マルチGPU通信の詰まりを見る |
| I/O | 読み書き時間、ファイル数、ログ量 | ストレージ待ちを見る |
| scaling | 1/2/4/8ノード比較、parallel efficiency | 並列化が効いているか見る |
代表ツール
| ツール | 主な対象 | 用途 |
|---|---|---|
perf | Linux CPU | CPU hotspot、命令、cache missなどの確認 |
| Intel VTune Profiler | CPU、thread、memory、MPIなど | CPUボトルネックの詳細分析 |
NVIDIA Nsight Systems (nsys) | CPU/GPU全体timeline | CUDA kernel、CPU待ち、GPU待ち、通信の流れを見る |
nvidia-smi | NVIDIA GPU | GPU使用率、メモリ使用量、電力、プロセス確認 |
htop | CPUプロセス | CPU core使用状況、プロセス監視 |
| MPI profiling interface / PMPI | MPI通信 | MPI関数ごとの時間や呼び出しを測る |
| NCCL logs / Nsight | GPU間通信 | collective通信の時間やtopology問題を調べる |
実験の進め方
- 何も変更しないbaselineを測る。
- CPU、GPU、通信、I/Oのどこで時間を使っているかを大まかに分ける。
- 最も時間割合が大きい箇所を1つ選ぶ。
- その箇所に対して1つだけ変更する。
- 同じ条件で再測定する。
- 速くなった理由、遅くなった理由、変わらなかった理由を記録する。
実験ログテンプレート
experiment_id:
date:
target:
baseline_command:
changed_setting:
nodes:
cpus:
gpus:
input_size:
profiling_tool:
wall_time:
cpu_summary:
gpu_summary:
memory_summary:
communication_summary:
io_summary:
bottleneck_hypothesis:
result:
next_action:
参考文献
- Linux perf tools documentation
- Intel VTune Profiler Documentation
- NVIDIA Nsight Systems User Guide
- NVIDIA nvidia-smi Documentation
- NVIDIA NCCL Documentation
- Open MPI Profiling Interface
ボトルネック分析
このページは、2026-06-05の勉強会でチームが共有したボトルネック分析の基礎をまとめたものです。 担当: 渡邉。
これは何か
ボトルネック分析とは、プログラム全体の実行時間のうち、どこが最も時間を使っているかを切り分ける作業です。 最適化の前に必ず行い、「速くすべき場所」を事実で決めます。
なぜ重要か
HPCでは、「CPUが遅いからCPUを速くする」という発想は的外れになりやすいです。 実際には、次の場所がボトルネックになることが多いです。
- メモリアクセス(帯域待ち)
- ノード間通信(MPI)
- 同期待ち(待機・idle)
つまり、計算そのものより「待ち時間」が支配的になりやすい、という認識が出発点です。
基本フロー
最初に、全体時間を次の観点で分解します。
| 見るもの | 何が分かるか |
|---|---|
| 計算・通信・I/Oの時間割合 | どのカテゴリが支配的か |
| 関数・プロセス・スレッドごとの時間 | どの処理が重いか(hotspot) |
| CPU使用率 | 計算で忙しいのか、待っているのか |
| MPI通信時間 | ノード間通信が律速か |
マクロからミクロへ:最適化の定石
いきなりソースコードの行を見てはいけません。 ボトルネックの「種別」を大局から絞り込みます。
| フェーズ | 粒度 | やること | 代表ツール例 |
|---|---|---|---|
| Phase 1 | マクロ(低負荷) | CPU/GPU/メモリ/通信のどこが遅いか切り分け | Linaro MAP、Nsight Systems、perf、mpiP、IPM |
| Phase 2 | ミドル(中負荷) | 関数特定、並列インバランス・待機状態の定量化 | Score-P、TAU、HPCToolkit |
| Phase 3 | ミクロ(高負荷) | 行レベルの原因(cache miss、依存関係)解明 | Scalasca、Nsight Compute、Callgrind、ftrace |
合言葉は「推測するな、計測せよ」。低負荷ツールで「当たり」をつけ、高負荷ツールで「原因」を特定します。
ツールの詳細はプロファイリングツール実践ガイドにまとめています。
注意点
- 計測ツール自体にオーバーヘッドがあります。マクロ→ミクロの順で、必要なときだけ重いツールを使います。
- 1回の実験で変える条件は1つにします。
- 「速くなった」だけでなく、なぜ速くなったかを記録します。
関連ページ
参考文献
プロファイリングツール実践ガイド
このページは、2026-06-05の勉強会でチームが整理した「用途別プロファイラ・トレースツールの全体像」をまとめたものです。 個々のツールの公式情報は参考文献を参照してください。
これは何か
性能解析ツールは、何をどの粒度で測りたいかによって使い分けます。 ここでは、抽象度(マクロ/ミドル/ミクロ)と対象レイヤ(CPU/MPI/OpenMP/GPU/メモリ)で整理します。
大局から局所へ:3つの抽象度
| 抽象度 | 計測オーバーヘッド | 手法 | 用途 | ツール例 |
|---|---|---|---|---|
| 高(マクロ) | 低 | サンプリング、全体傾向の俯瞰 | CPU/GPU/通信の「どこ」が遅いか切り分け | Linaro MAP、Nsight Systems、mpiP、IPM |
| 中(ミドル) | 中 | 関数単位のコールグラフ、MPI待機時間、メモリ推移 | 関数特定、並列インバランスの発見 | Score-P、TAU、HPCToolkit、Massif |
| 低(ミクロ) | 高 | インストルメンテーション、詳細トレース、HWイベント | 行レベルの原因解明(cache miss、依存関係) | Scalasca(trace)、Nsight Compute、Valgrind、ftrace |
レイヤ別の代表ツール
CPU(計算密度・メモリアクセス)
| アプローチ | ツール | 特徴 |
|---|---|---|
| サンプリング(低負荷・推奨) | perf | Linux標準。HWカウンタ(PMU)を読む。perf c2cでfalse sharing(偽共有)も検出 |
| サンプリング | Intel VTune Profiler | EBSでcache missをソース行へ直接マッピング |
| サンプリング | Linux ftrace | カーネルレベルの挙動(スケジューリング遅延・割り込み)を追跡 |
| インストルメンテーション(高負荷) | Callgrind(Valgrind) | 正確な命令数とコールグラフを生成。Cachegrindでcacheも模擬 |
gprofは関数プローブのオーバーヘッドが大きく、現代のHPCでは非推奨とされています。
MPI(通信・同期のオーバーヘッド)
アプリが「計算」しているのか「待機」しているのかを切り分けます。
| ツール | 特徴 |
|---|---|
mpiP | 極めて軽量。関数ごとの時間・通信量をテキストサマリで出力。最初の一手 |
| IPM | メッセージサイズごとの通信量・通信トポロジを低負荷で把握 |
| Score-P | HPC標準の計測インフラ。CUBE4形式で出力し後続解析へ繋ぐハブ |
| Scalasca | 待機状態(wait states)を定量化し、通信ボトルネックを特定 |
| TAU | MPI + OpenMP + GPUのハイブリッド環境を統合プロファイル |
| HPCToolkit | MPIとCPU HWカウンタを紐づけた統計プロファイル |
MPIトレース・タイムライン可視化
「なぜ・いつ・誰のせいで待機したか」を時系列で追います。
| ツール | 特徴 |
|---|---|
| Vampir | Score-PのOTF2トレースを読み、大規模ノードのタイムラインを可視化 |
| Cube | メトリクス・コールツリー・システムの3軸で階層的にボトルネック特定 |
| Intel Trace Analyzer (ITAC) | 「理想化(無限に速いネットワーク)」機能で通信オーバーヘッドを分離 |
| Paraver / Jumpshot | Extraeベース/レガシーMPICH向けのトレース可視化 |
GPU(ホスト連携→カーネル深掘り)
最大の罠は「いきなりGPUカーネル内部を見ること」。まずCPU-GPU間のデータ転送(PCIe)を疑います。
| 視点 | ツール | 特徴 |
|---|---|---|
| マクロ(システム全体) | Nsight Systems | CPUスレッド、GPUへのデータ転送、kernel dispatchの非効率を特定 |
| ミクロ(カーネル内部) | Nsight Compute | レジスタ使用量、メモリ帯域、命令レベルのstall原因を解析 |
| AMD ROCm環境 | rocprof (v3) | Roofline分析でHW理論限界に対する位置を可視化 |
OpenMP(並列インバランスと同期)
「CPU使用率が100%か」ではなく「有意義な計算をしているか」を問います。
| ツール | 特徴 |
|---|---|
| Intel VTune (OpenMP Wait Analysis) | アクティブ時間と待機/アイドル時間を厳密に分離 |
| Linaro MAP | 適応型サンプリングで極小ファイルサイズ。ソース改変なしで行レベルの待機を特定 |
| TAU (OMPT) | ハイブリッド実行時のタイムラインを可視化 |
メモリ(安全性検証とヒープ最適化)
| 目的 | ツール | 特徴 |
|---|---|---|
| エラー検出(安全性) | AddressSanitizer (ASan) | コンパイラベース。低負荷でCI/CDに組み込める |
| エラー検出(深掘り) | Valgrind Memcheck | 再コンパイル不要だが負荷は数十倍 |
| 使用量・ヒープ最適化 | Heaptrack | 低負荷でヒープ確保/解放をトレース。リークや無駄を特定 |
| 使用量・ヒープ最適化 | Massif (Valgrind) | メモリ使用量の推移をスナップショットで記録 |
富岳・HPCコンテストでよく使う組み合わせ
チームの調査では、富岳環境で次のツールが定番として挙がりました(実機・利用可否は要確認)。
- 必須:
mpiP/ Score-P / Cube /perf/nsys(GPU使用時) - 発展: Scalasca / Vampir / HPCToolkit / VTune
OpenFOAMのMPI最適化なら、次の流れが強力とされています。
mpiP → Score-P → Cube → Scalasca
まず何から使うか(チームの結論)
- 最初の一手は
perf+mpiP。低負荷で「当たり」をつけられる。 - 必要に応じてScore-P/Cube/Scalascaへ深掘りする。
perf の実践的な使い方(チーム調査メモ)
2026-06-19の勉強会で田中が共有した内容。perfは日本語情報が少なく、man、Archwiki、ライブコーディング動画(impl Rust: One Billion Row Challenge)が学習に役立った。
よく使うコマンド
| コマンド | 用途 |
|---|---|
perf stat -r <n> -d -d -d <cmd> | 詳細イベントを取得し、n回実行の平均±標準偏差まで出す。まず全体像を掴むのに良い |
perf record → perf report | プロファイルをperf.dataに記録し、call graph・アセンブリレベルで分析。最も使いやすい |
perf stat -a -A -I <msecs> -e <event> <cmd> | インターバルごとに全CPUの情報を出力。用途は限定的 |
注意点
perf recordはイベント数が多すぎると問題になる(長時間実行・並列実行)。perf report等で解析できなくなり、ストレージも圧迫する。- 対策として、実行中のプロセスへ短時間だけアタッチする:
perf record -F 999 -g --call-graph fp -p <PID> -- sleep 30。 - 可視化の補助ツールとして
flamegraphが便利。 - 今後の課題: MPI環境での
perf等の使い方を実際に動かして確認する。
ビルドオプション(分析しやすさ vs 速度)
分析しやすさと高速化はトレードオフ。用途別(Debug / Profile / Release / Optimize など)に切り替えられるよう環境を整備する。
- 性能に影響しない:
-g(デバッグ情報。無いとソース対応・シンボルが分からず、アセンブリ/ポインタ表示になる) - 性能に影響する(最適化を抑制して分析しやすくする):
-fno-omit-frame-pointer… call graphが見やすくなる-fno-inline… 関数ごとの性能が見やすくなる-foptimize-sibling-calls(を無効化)… 末尾呼び出しのジャンプ化を抑え、関数ごとの性能が見やすくなる
注意点
- 富岳前提のツール構成です。2026年大会の実機は未確定なので、利用可能なツールは要確認です(調査ステータス)。
- ツールはオーバーヘッドが大きいものほど後段で使います。
関連ページ
参考文献
- Linux perf tools documentation
- Intel VTune Profiler Documentation
- NVIDIA Nsight Systems User Guide
- NVIDIA Nsight Compute Documentation
- Score-P Documentation
- Scalasca
- Vampir
- mpiP: Lightweight, Scalable MPI Profiling
- Linaro Forge (MAP)
- Arch Wiki: デバッグ/プロファイリング
- Arch Wiki: パフォーマンスの向上
- One Billion Row Challenge
- impl Rust: One Billion Row Challenge (YouTube)
- flamegraph-rs/flamegraph
スケーリング分析
このページは、2026-06-05の勉強会でチームが共有したスケーリング分析の基礎をまとめたものです。 担当: 田中。
これは何か
スケーリング分析とは、ノード数・コア数・MPIランク数・OpenMPスレッド数などの計算資源を変えたときに、実行時間や並列効率がどう変化するかを測り、並列化の限界やボトルネックを特定する分析です。
CPU計算を単純に速くする方法として「CPUの数を増やす」「クロック周波数を上げる」が考えられますが、資源を増やした分だけ速くなるとは限りません。それを確かめるのがスケーリング分析です。
基本概念
| 用語 | 説明 |
|---|---|
| strong scaling | 問題サイズを固定し、ノード/コア数を増やしてどれだけ速くなるかを測る |
| weak scaling | 1ノードあたりの問題サイズを固定し、資源と問題サイズを同時に増やす |
| parallel efficiency | 理想的な速度向上に対して、実際にどれだけ効率が出ているか |
理想的には、CPU/nodeを 1, 2, 4, … と増やすと実行時間が 1/1, 1/2, 1/4, … と減るはずですが、実際にはきれいに比例しません。
なぜ理想どおりにならないか
| 要因 | 内容 |
|---|---|
| 逐次部分(アムダールの法則) | 並列化できない処理が残ると、資源を増やしても頭打ちになる |
| MPI通信・collective・同期 | 資源を増やすほど通信・同期のコストが増える |
| load imbalance(負荷の偏り) | rank間で計算量が偏ると、速いrankが遅いrankを待つ |
特にload imbalanceは重要です。一部のrankが先に終わっても、最も遅いrankが終わるまで全体は終わりません。追加したnodeの効果が「待ち」で失われます。
大会との関係
- 「ノードを増やせば勝てる」ではなく、どこまで増やすと効率が落ちるかを把握することが重要です。
- 領域分割の手法(
scotchなど)やrank数の調整で、スケーリングが改善することがあります(領域分割)。
最初に見るべき指標
| 観点 | 見るもの | なぜ重要か |
|---|---|---|
| 速度向上 | 1/2/4/8ノードのspeedupカーブ | 理想直線からどれだけ離れるか |
| 並列効率 | parallel efficiency | どの規模で効率が落ちるか |
| 負荷の偏り | rankごとの計算時間のばらつき(CV) | load imbalanceの有無 |
改善の進め方
実行時間だけを見るのではなく、計算資源を変えながら対照実験を行い、プロファイリングで原因を特定します。
- 入力を固定し、node/rank/thread数を変えて測る(strong scaling)。
- speedupと並列効率を出し、頭打ちになる点を探す。
- その点でプロファイルを取り、逐次部分・通信・load imbalanceのどれが原因か切り分ける。
- 原因に応じて対策(分割手法変更、rank数調整、通信削減など)を1つずつ試す。
代表的なプロファイリングツールはperfです。詳しくはプロファイリングツール実践ガイドを参照してください。
実験ログテンプレート
experiment_id:
date:
case:
nodes:
ranks:
threads:
wall_time:
speedup_vs_1node:
parallel_efficiency:
rank_time_imbalance:
bottleneck_hypothesis:
notes:
関連ページ
参考文献
I/O最適化
このページは、2026-06-05の勉強会でチームが共有したI/O最適化の基礎をまとめたものです。 担当: 小林。HPCとAIの両方にまたがるため、性能分析章に置きます。
これは何か
I/O最適化とは、システムやストレージにおけるデータ読み書きの処理効率を高め、待ち時間を減らす手法です。 計算が速くても、ファイルの読み書きで待っていると全体は遅くなります。
HPC(OpenFOAM)でのI/O
OpenFOAMでは計算中に次のI/Oが発生します。
- モデルロード、初期メッシュ読み込み
- 境界条件・物性値ファイルの読み込み
- 各時刻ディレクトリへの結果出力、ログ出力
- 並列実行時の
processor*/以下への読み書き - post-processing用データ出力
対策の方向性
| 対策 | 内容 |
|---|---|
| scratch領域の活用 | 一時ファイル・中間ファイルを高速なローカル/作業用ストレージに置く |
| 出力頻度の調整 | 書き出す時刻ステップ・ログ量を減らす |
| 並列I/O形式の検討 | collated形式など、ファイル数と書き込み方式を見直す |
scratch領域とは、マシンから高速にアクセスできる作業用ディレクトリのこと。計算中に一時的に使います。
富岳でのI/Oプロファイリング(要確認)
富岳の利用手引書には、I/Oプロファイリング・I/O最適化の項目があり、DarshanやLLIO情報でI/O待ちを確認できるとされています。
ただし2026年大会の実機・利用可否は未確定です(調査ステータス)。
AI(Qwen multi-GPU推論)でのI/O
Qwenのmulti-GPU推論では、次のデータ移動が性能に影響します。
- モデル重みの読み込み
- 入力リクエストの読み込み
- CPU → GPU 転送
- GPU間通信(NCCL)
- KV cacheの読み書き
- prefill worker → decode worker のデータ受け渡し
- ログ出力
対策の方向性
| 対策 | 内容 |
|---|---|
| パイプライン化 | GPUが計算している間に、次の入力をCPU側で準備する |
| モデルロード時間の短縮 | 大規模LLMの重みロードが競技の課題になりうる。配置の工夫 |
| 重みの配置 | scratch領域に重みを置けるかは環境依存(昨年は議論あり、要確認) |
昨年のI/O最適化(経験談)
- 昨年のHPCでは、一時ファイル・中間ファイルの置き場所をscratch領域に変えて高速化していた、との情報があります(要確認)。
- AI課題でも、本番でDeepSeekの重みをscratch領域に置けたとの話がありますが、
玄界では不可だった可能性も指摘されています(要確認)。
出典: 木更津高専チームの参加記(経験談)。
最初に見るべき指標
| 観点 | 見るもの | なぜ重要か |
|---|---|---|
| I/O待ち時間 | 読み書きにかかった時間、I/O待ち割合 | ストレージが律速か判断する |
| ファイル数・出力頻度 | 時刻ディレクトリ数、ログ量 | 小さな書き込みの多発を防ぐ |
| モデルロード時間 | 重みロードにかかる時間 | 大規模LLMで支配的になりうる |
注意点
- scratch領域の利用可否・容量は環境ごとに違います。大会の実機ルールで要確認です。
- I/Oを減らすために結果出力を削りすぎると、解析・検証ができなくなります。
関連ページ
参考文献
OpenFOAM課題の入口
OpenFOAMとは
OpenFOAMは、CFD、つまり数値流体力学のためのオープンソースソフトウェア群です。2026年大会のHPC側では、メモ上、OpenFOAM HPC Committee repositoryのケースが使われる可能性があります。
現時点では、どのケースが大会本番で使われるかは未確定です。
OpenFOAM HPC Committee repository
OpenFOAM HPC Benchmark SuiteのREADMEでは、このリポジトリの目的が次のように説明されています。
- HPCアーキテクチャ上でデータセットをセットアップして実行するためのガイドや初期スクリプトを提供する。
- ハードウェア、ソフトウェア環境、設定を比較するための共通基準を提供する。
- 性能を測るためのKPIを定義する。
README上では、Grand Challenges、Industrial Applications、Microbenchmarks、Other Benchmarksに分かれ、DrivAer、cavity、motorbike、combustion、wind farmなど複数のケースが整理されています。
OpenFOAMの並列実行の基本
OpenFOAM v13 User Guide: Running applications in parallelでは、OpenFOAMの並列実行はdomain decomposition、つまり計算領域を複数の部分に分割して各プロセスに割り当てる方式だと説明されています。
基本の流れは次の通りです。
decomposeParDictで分割数と分割方法を決める。decomposeParでメッシュと初期場を分割する。mpirunなどでソルバを-parallel付きで実行する。- 必要なら
reconstructParで結果を再構成する。
よく出る分割方法は次の通りです。
| 方法 | 意味 |
|---|---|
simple | x/y/z方向に単純分割する |
hierarchical | 分割順序を指定できる幾何分割 |
scotch | プロセッサ境界を減らすことを狙うグラフ分割 |
ptscotch | 並列実行向けのSCOTCH系分割 |
性能に効きそうな場所
初心者が最初に見るべき観点です。
| 観点 | 見るもの | なぜ重要か |
|---|---|---|
| 領域分割 | decomposeParDict、各rankのセル数、境界面 | MPI通信量とロードバランスに直結する |
| 線形ソルバ | fvSolution、反復回数、残差 | OpenFOAM実行時間の大部分を占めやすい |
| I/O | writeInterval、fileHandler、ログ出力 | 並列ファイル数が多いとファイルシステムが詰まる |
| コンパイル | MPI、最適化フラグ、OpenFOAM版 | CPU命令、通信ライブラリ、数学ライブラリで差が出る |
| ノード配置 | rank mapping、core binding、NUMA | CPUメモリ帯域とネットワーク利用に影響する |
最初の実験テンプレート
本番ケースが出たら、まず次を固定してベースラインを作ります。
| 項目 | 記録内容 |
|---|---|
| Git commit / OpenFOAM version | 再現性のため |
| ケース名、メッシュサイズ | 問題規模の確認 |
| ノード数、rank数、threads | 並列条件 |
decomposeParDict | 分割条件 |
| 実行コマンド | PBS/Slurmスクリプト含む |
| wall time | 大会指標の中心 |
| 反復回数、残差 | 速いが解が悪い変更を見抜く |
| I/O時間、ログサイズ | ボトルネック確認 |
参考文献
- OpenFOAM HPC Committee repository
- OpenFOAM v13 User Guide: Running applications in parallel
- High Performance Computing Technical Committee - OpenFOAM Wiki
- The First OpenFOAM HPC Challenge (OHC-1)
OpenFOAM最適化の考え方
最適化の単位
OpenFOAMの高速化は、少なくとも次の層に分けて考えます。
| 層 | 例 | リスク |
|---|---|---|
| 実行設定 | rank数、ノード数、binding、I/O設定 | 低い |
| 分割設定 | simple、hierarchical、scotch、分割方向 | 低から中 |
| ソルバ設定 | tolerance、relTol、preconditioner、反復上限 | 中。精度や収束性が変わる |
| コンパイル設定 | compiler、MPI、最適化フラグ | 中。環境差が出る |
| コード変更 | ソルバ改変、行列計算、通信削減 | 高い。ルール確認が必須 |
大会では「どこまで変更してよいか」が最重要です。最終ルールが出るまでは、設定変更と計測基盤の準備に寄せるのが安全です。
ボトルネックの探し方
最初に見るべき症状と対応です。
| 症状 | 疑う場所 | 次に見るログ・指標 |
|---|---|---|
| rank数を増やしても速くならない | MPI通信、分割不均衡 | 各rankのセル数、境界数、MPI時間 |
| solver反復が多い | 線形ソルバ設定、メッシュ品質 | residual、iteration count |
| 計算開始前後が遅い | I/O、decompose、reconstruct | ログの時刻、ファイル数、scratch配置 |
| ノードを増やすと不安定 | network、MPI、filesystem | PBS/Slurmログ、MPIエラー |
| 一部rankだけ遅い | load imbalance、NUMA、binding | rank別時間、CPU affinity |
OpenFOAMで特に注意すること
I/O
OpenFOAMの並列実行では、rankごとにprocessor*ディレクトリが作られます。大規模並列ではファイル数が増え、I/Oが詰まることがあります。
OpenFOAM user guideでは、collated file handlerにより、分割されたfieldやmeshをまとめた形式で扱えると説明されています。ただしMPIのthreading supportなど環境条件があります。
領域分割
分割は「セル数を均等にする」だけでは不十分です。境界面が増えると通信が増えます。乱暴にrankを増やすと、計算より通信の割合が増えて遅くなることがあります。
収束条件
toleranceやrelTolを緩めると速くなる場合がありますが、結果の正当性が変わります。大会で許されるか、評価がwall timeだけか、物理結果の検証があるかを確認する必要があります。
実験ログの最小項目
experiment_id:
date:
author:
case:
openfoam_version:
git_commit:
nodes:
ranks:
threads:
decomposition:
solver_settings_changed:
io_settings_changed:
command:
wall_time:
iteration_count:
residual_summary:
stdout_log:
stderr_log:
notes:
next_action:
参考文献
- OpenFOAM v13 User Guide: Running applications in parallel
- OpenFOAM HPC Benchmark Suite
- The First OpenFOAM HPC Challenge (OHC-1)
CPU最適化(コンパイラ・ライブラリ)
このページは、2026-06-05の勉強会でチームが共有したCPU最適化の基礎をまとめたものです。 担当: 田中。
これは何か
ここでのCPU最適化とは、コンパイラ・ライブラリとそれらの設定を適切に行うことでCPU計算部分を高速化し、実行時間を短縮することとします。 アルゴリズム自体を書き換えるのではなく、「ビルドの仕方」と「使うライブラリ」で速くするアプローチです。
なぜ重要か
- 実装をほとんど変えずに高速化できる可能性があり、コストが低い。
- ハードウェアの性能を引き出せる。
- 一方で、検証コストが大きく、ハードウェアへの理解が必要です。
2025年大会(NWChem)のルールでは、次が許可された最適化として挙げられていました(昨年のルール。今年は要確認)。
- Compiler optimizations: 異なるコンパイラ(Intel、GCC、AOCC)と最適化フラグ
- Mathematical libraries: 最適化されたBLAS/LAPACK(Intel MKL、OpenBLAS、AOCL)の利用
- Parallel strategies: MPI設定、hybrid並列、プロセス配置・affinity、スレッド管理
コンパイラ最適化フラグ
コンパイルオプションを、マシン/プログラムに合わせて組み合わせると、実装を変えずに高速化できる可能性があります。
gccの代表的な最適化オプション:
| オプション | 内容 |
|---|---|
-O2 / -O3 / -Ofast | 一般的な最適化レベル設定 |
-march=<target cpu> | CPU固有命令を使う最適化 |
競技プログラミングで知られるQCFium法のように、pragmaで局所的に指定する例もあります。
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
参考実験では、これらの指定で約29%(×1.2〜1.5程度)速くなったケースが報告されています(経験談・環境依存)。
-Ofastの注意(重要・要確認)
-Ofastなどの一部の最適化は、次のように数値の振る舞いを変えます。
- 演算の結合順序の変更
- 近似的な数学関数・命令の利用
- NaNや無限大が発生しないと仮定する
+0.0と-0.0を区別しない- 動的な丸めモードを無視する
これにより、数値・分岐条件・収束過程の変更、計算精度の劣化が起こりえます。
2025年大会の禁止事項(昨年のルール)には次がありました。今年も同様かは要確認です。
- Algorithm alteration(基本アルゴリズムの変更)
- Precision reduction(計算精度・データ精度の低下)
- Input modification(分子構造、basis set、収束条件の変更)
→ -Ofast系が大会でどこまで許容されるかは、必ずルールで確認し、結果が変わらないか検証すべきです。
検証手段:サニタイザー
望ましくない動作・未定義動作をピンポイントで検出するために、サニタイザーを使います。
-fsanitize=address,undefined
-fno-omit-frame-pointer
ライブラリ選定
数値ライブラリと並列ランタイムにも複数の実装があり、組み合わせで高速化を狙えます。 適切に選ばないと、むしろ並列計算効率が落ちることがあります。
| 種類 | 例 | 補足 |
|---|---|---|
| 数値計算ライブラリ BLAS/LAPACK | OpenBLAS、Intel MKL | numpyのバックエンドとしても有名 |
| 派生実装 | ScaLAPACK、Sparse BLAS など | 用途特化 |
| ライブラリ設定 | Threaded / Sequential / MPI / 精度 | 設定でも性能が変わる |
BLASは行列・ベクトル演算の標準API、LAPACKはそれを使う線形代数ライブラリです。
さらに調べるべきキーワード(チームの宿題)
| 用語 | 一言 |
|---|---|
LTO | 複数の翻訳単位を横断した最適化(Link Time Optimization) |
PGO | 実行プロファイルを利用した最適化(Profile-Guided Optimization) |
lddコマンド | 実行ファイルが依存する共有ライブラリを確認する |
| NUMA | NUMA最適化を参照 |
まとめ
- 利点: 実装コストを抑えつつ大幅な高速化が期待でき、ハード性能を引き出せる。
- 欠点: 検証コストが大きく、ハードウェア理解が必須。
-Ofast系は精度に影響するため、大会での許容範囲を要確認。
関連ページ
参考文献
MPI通信最適化
このページは、2026-06-05の勉強会でチームが共有したMPI通信最適化の基礎をまとめたものです。 担当: 松村。OpenFOAM最適化の中心テーマです。
これは何か
MPI(Message Passing Interface)は、複数プロセス間でデータをやり取りするプロセス間通信ライブラリです。
例: MPI_Send()、MPI_Recv()。
HPCクラスタでは、Node1〜Node4のように数百〜数万のCPUコアが協調して計算します。 そのため、プロセス間の通信が性能を大きく左右します。
なぜMPI通信が必要か
100万セルの流体解析を例にすると、1つのCPUで全部解く代わりに、領域を複数のrank(Rank0〜Rank3)に分割して並列計算します。
- 分割すると、各rankの**境界セル(Boundary Cells)**の情報を隣のrankと交換する必要があります。
- この交換(通信)がないと計算を進められません。
なぜMPI通信が「遅い」か
| 処理 | おおよその時間スケール |
|---|---|
| CPU演算 | ns(ナノ秒) |
| 通信 | μs〜ms(マイクロ〜ミリ秒) |
その差は1000倍以上です。人間サイズに換算すると「1秒 vs 約11日」というイメージです。 だからこそ、通信削減 = 高速化になります。
富岳で見るべき典型的ボトルネック
注: チームは
富岳(A64FX)を前提に調査しています。2026年大会の実機は未確定です(富岳アーキテクチャ、調査ステータス)。
① MPI通信
「ノード数を増やしたのに速くならない」典型です。
対策:
- 通信回数の削減
- 通信と計算のオーバーラップ(重ね合わせ)
- MPIランク配置の改善
② メモリ帯域律速
富岳のCPUはA64FX。メモリ帯域がボトルネックになりやすいです。 詳細は富岳アーキテクチャを参照。
Load Imbalance(最重要ボトルネック)
rank間で計算量が偏ると、全体は最も遅いrankに引っ張られます。
| rank | 計算時間 |
|---|---|
| Rank0 | 10秒 |
| Rank1〜3 | 5秒(残り5秒は待機/idle) |
→ 全体 = 10秒。速いrankが遊んでいる分、追加した計算資源が無駄になります。 対策は領域分割の改善です(領域分割)。
OpenFOAMの典型的ボトルネック
OpenFOAMはCFD(速度・圧力・温度を解く)で、最終的に巨大な連立一次方程式 Ax = b を解きます。
計算の流れ:
メッシュ生成 → 行列構築 → Pressure Solver → 結果出力
実行時間の多くはPressure Solver(圧力ソルバ)が占めます。
反復法とMPI_Allreduce
Pressure SolverはCG系の反復法(CG、PCG、BiCGStab、GAMGなど)で、正解に少しずつ近づきます。
各反復で残差を計算し、全rankで合わせるためにMPI_Allreduceを使います。
MPI_Allreduceとは: 各rankの値(局所誤差)を集約して全体の値(全体誤差)を計算し、全rankへ配り直す collective通信です(Gather → 合算 → Broadcast)。
Pressure Solver → 残差計算 → MPI_Allreduce → 全員同期 → Pressure Solver → ...
このループが本当のボトルネックになりがちです。
なぜAllreduceが大量発生するのか
CG反復は、反復ごとにMPI_Allreduceを繰り返します。
例えば300 iterationなら、300回以上の通信が発生します。
Pressure Solver 起動 → MPI_Allreduce 頻発 → 通信待ち(Idle) → (繰り返し)
→ 結論: 通信最適化が重要。研究者は次を頑張ります。
- ソルバ変更(
PCG→GAMG) - 通信回数の削減
- rank数の調整
- メッシュ分割の改善(領域分割)
最初に見るべき指標・設定
| 観点 | 見るもの | なぜ重要か |
|---|---|---|
| 通信時間 | MPI_Allreduce・MPI_Waitの時間 | 通信・同期待ちが律速か |
| 負荷の偏り | rankごとの計算時間のばらつき | load imbalanceの有無 |
| ソルバ | fvSolutionのsolver/precondition設定 | PCG/GAMGの選択で通信特性が変わる |
| 分割 | decomposeParDictのmethod | 通信量・負荷分散に直結 |
注意点
- ソルバや収束条件(tolerance/relTol)の変更は、物理結果や収束性に影響します。大会で変更可能か要確認です。
- 富岳前提の議論です。実機の通信特性(InfiniBand/Tofu等)は環境依存です。
関連ページ
参考文献
- Open MPI Documentation
- OpenFOAM v13 User Guide: Running applications in parallel
- The First OpenFOAM HPC Challenge (OHC-1)
領域分割(decomposePar)
このページは、2026-06-05の勉強会でチームが共有した領域分割(OpenFOAMのdecomposePar)の基礎をまとめたものです。
担当: 松村。
これは何か
decomposeParは、OpenFOAMのメッシュを複数のrank(プロセス)へ分割するコマンドです。
分割方法はdecomposeParDictのmethodで指定します。
ポイントは、分割の断面 = 通信が発生する面ということ。分割の仕方で通信量と負荷分散(load imbalance)が決まります。
なぜ重要か
- 分割の断面積が大きいほど、隣接rankとのMPI通信が増えます。
- rank間で計算量が偏ると、速いrankが遅いrankを待ち、並列効率が落ちます。
- つまり、領域分割は通信量とロードバランスの両方に効く重要な設定です。
主な分割手法
| method | 種類 | 長所 | 短所 |
|---|---|---|---|
simple | 単純分割 | 実装・設定が簡単 | 通信が多い(断面の表面積が大きくなりやすい) |
hierarchical | 階層型分割 | ノード構造を考慮、通信削減。速くて設定簡単 | 軸の指定が必要 |
scotch | グラフ分割 | 通信量を最小化。最も一般的で高品質 | ライブラリ依存 |
ptscotch | scotchの並列版 | 巨大メッシュ(100万セル以上)向け。MPI版Scotch | セットアップがやや複雑 |
コンテスト視点:試す順番
チームのおすすめの順番です(経験談)。
hierarchical… 速い・設定簡単scotch… まず比較対象にするptscotch… 超大規模メッシュ向け
実際のHPCコンテストでは、
decomposeParDictのmethodをscotchに変えただけで10〜30%高速化するケースも珍しくありません(経験談・環境依存)。
設定例:
// decomposeParDict
method scotch;
最初に見るべき指標・設定
| 観点 | 見るもの | なぜ重要か |
|---|---|---|
| 分割手法 | decomposeParDictのmethod | 通信量・負荷分散に直結 |
| rank数 | numberOfSubdomains | 多すぎると通信・同期が増える |
| 負荷の偏り | rankごとのcell数・計算時間のばらつき | load imbalanceの有無 |
注意点
ptscotchは巨大メッシュで効果的ですが、小さいメッシュでは恩恵が小さいことがあります。- 分割を変えたら、必ずbaselineと同じ条件で再測定し、効果をプロファイルで確認します。
- 大会で変更可能な設定範囲は要確認です。
関連ページ
参考文献
NUMA最適化
このページは、2026-06-05の勉強会でチームが共有したNUMA最適化の基礎をまとめたものです。 担当: 渡邉。
これは何か
NUMA(Non-Uniform Memory Access)は、マルチプロセッサ・システムにおけるメモリ配置のアーキテクチャです。
各プロセッサが個別のローカルメモリを持ち、それに直接アクセスします。
| 方式 | 特徴 |
|---|---|
| UMA(Uniform Memory Access) | 全プロセッサが共通のメモリに同じ距離でアクセス |
| NUMA | プロセッサごとにローカルメモリがあり、アクセス距離が異なる |
なぜ重要か
- 近いメモリ(ローカル)にアクセスすれば速い。別ノードのメモリ(リモート)にアクセスすると遅い。
- そのため、ローカルメモリを有効に使えるようにスレッドを配置することが重要です。
- 配置を誤ると、リモートメモリアクセスが増えて遅くなります。
基本概念
ローカルメモリ・リモートメモリ
スレッドが使うメモリを、できるだけそのスレッドが動くプロセッサのローカル側に置くのが理想です。 同じメモリにアクセスするスレッドは、同じノードにまとめます。
プロセッサ・アフィニティ
特定のプロセッサ・コアへのスレッド/プロセスの割り当てを保持し続けることです。
- スレッドが使うメモリをローカルに保てる。
- ただし、OSの効率的なリソース管理を妨げる可能性があるため、慎重に設定します。
numactlコマンドで、NUMAポリシーを制御し、特定ノードでプロセスを動かせます。
ファーストタッチポリシー
OSが、そのメモリ領域に最初にアクセスしたプロセスにメモリを紐付ける仕組みです。
- NUMAを有効に使うには、初期化スレッドと実行スレッドを一致させる必要があります。
- つまり、データを使う実行スレッド自身に初期化させると、ローカルメモリに割り当たります。
大会との関係
- 2025年大会のルールでは「System-level tuning: NUMA topology optimization」が許可項目として挙げられていました(昨年のルール。今年は要確認)。
- マルチソケット/マルチNUMAノード環境では、CPU pinningとファーストタッチでメモリ局所性を上げられます。
最初に見るべき指標・設定
| 観点 | 見るもの | なぜ重要か |
|---|---|---|
| メモリ局所性 | ローカル/リモートアクセス比率 | リモートアクセスが多いと遅い |
| スレッド配置 | numactl、CPU affinity設定 | スレッドとメモリの距離を縮める |
| 初期化 | 初期化スレッドと実行スレッドの一致 | ファーストタッチで局所配置になるか |
注意点
- アフィニティ固定はOSのスケジューリングと衝突することがあるため、効果を測りながら設定します。
- NUMA最適化は環境構造(ソケット数・NUMAノード数)に強く依存します。
関連ページ
参考文献
富岳(A64FX)アーキテクチャ
このページは、2026-06-05の勉強会でチームが共有した富岳/A64FXに関する基礎をまとめたものです。
重要(要確認): チームは
富岳(A64FX)を前提に最適化を調査していますが、2026年大会で使う実機は未確定です。 運営メモでは「4ノード・100+コアのCPUクラスタ」とされ、2025年大会では玄界が使われたとの情報もあります。 このページの内容は「富岳前提の調査」として扱い、最終ルールで実機を確認してください(調査ステータス)。
これは何か
富岳は理化学研究所のスーパーコンピュータで、CPUにA64FXを採用しています。
| 特徴 | 内容 |
|---|---|
| CPU | A64FX(Armベース) |
| コア数 | 48 Core(計算コア) |
| メモリ | HBM2(広帯域メモリ) |
| ベクトル拡張 | SVE512(Scalable Vector Extension、512bit幅) |
なぜ重要か
A64FXはCPU演算性能が比較的強い一方で、**メモリ帯域がボトルネック(メモリ帯域律速)**になりやすい特性があります。 つまり「CPUを速くする」より「メモリアクセスと通信を改善する」方が効くことが多い、という前提で最適化を考えます。
メモリ帯域律速への対策
| 対策 | 内容 |
|---|---|
| データ局所性改善 | 使うデータをまとめ、キャッシュに乗せる |
| キャッシュ利用改善 | アクセスパターンを連続的にする |
| 配列配置変更(SVE活用) | ベクトル化しやすいデータ配置にする |
SVE(Scalable Vector Extension)は、ベクトル長に依存しないArmのSIMD拡張です。富岳では512bit幅(SVE512)です。
大会との関係
- もし実機が富岳系なら、A64FX/SVE/HBM2の特性を踏まえた最適化が有効になります。
- ただし前述のとおり実機は未確定です。実機が異なる場合、
-marchやSVE前提の最適化は効果が変わります。
注意点
- 「A64FXは強いらしい」という認識はあくまで一般論で、実アプリ(OpenFOAM等)では帯域・通信が律速になりがちです。
- 実機・コンパイラ・利用可能ツールは大会のルール公開後に必ず見直します。
関連ページ
参考文献
LLM推論課題の入口
今年のAI側で出ている名前
メモ上では、2026年AI側の議論に次の名前が出ています。
| 名前 | 何か | 現時点の扱い |
|---|---|---|
| Qwen | Alibaba/QwenチームのLLMシリーズ | 公式モデルカードあり |
| Qwen3-235B-A22B | 総235B、活性化22BのMoEモデル | 公式モデルカードあり |
| SGLang | 高スループット・低レイテンシ向けLLM serving framework | 公式ドキュメントあり |
| Dynamo | NVIDIAの分散推論serving framework | 公式ドキュメントとGitHubあり |
| PD disaggregation | prefillとdecodeを別workerに分ける推論構成 | SGLang/Dynamoに公式説明あり |
Qwen3-235B-A22B
Qwen3-235B-A22BのHugging Faceモデルカードでは、主な仕様が次のように説明されています。
| 項目 | 内容 |
|---|---|
| 種類 | Causal Language Model |
| パラメータ数 | 総235B、活性化22B |
| 層数 | 94 |
| Attention heads | Q: 64、KV: 4 |
| Experts | 128 |
| Activated experts | 8 |
| Context length | native 32,768 tokens、YaRNで131,072 tokens |
| ライセンス | Apache-2.0 |
MoEなので、全パラメータを毎token使うわけではありません。ただし、重みはGPUメモリ上に載せる必要があるため、active parametersだけで必要VRAMを見積もると失敗します。
SGLang
SGLang公式ドキュメントでは、SGLangは大規模言語モデルとマルチモーダルモデル向けの高性能serving frameworkと説明されています。特徴として、RadixAttention、prefix caching、multi-GPU parallelismなどが挙げられています。
2025年大会のAI側では、DeepSeek-R1 671BをSGLangで推論する課題だったことが公式発表で確認できます。
Dynamo
NVIDIA Dynamoは、分散LLM servingのためのframeworkです。メモ上では、Dynamoのbenchmarksとrecipes/qwen3-235b-a22b-fp8が2026年AI側の参考として示されています。
ただし、該当recipeのREADMEはTensorRT-LLM向けと説明しているため、SGLang課題とどう関係するのかは大会運営への確認が必要です。
推論の2段階: prefillとdecode
LLM推論は大きく2段階に分かれます。
| 段階 | 何をするか | 性能特性 |
|---|---|---|
| prefill | 入力prompt全体を処理し、KV cacheを作る | 計算量が大きい。長い入力で重くなる |
| decode | 1 tokenずつ次tokenを生成する | メモリ帯域、KV cacheアクセス、batchingが効く |
SGLangのPD Disaggregationドキュメントも、prefillは計算集約、decodeはKV cache管理を伴うメモリ集約と説明しています。
continuous batchingとKV cache
concurrencyを上げるとは、複数requestを同時に投げ、serving engine側で並行処理させることです。ただし、GPU上で完全に別々の処理を8本走らせるという意味ではありません。
SGLangやvLLMのようなserving engineでは、schedulerがrequest queueから実行対象を選び、prefill/decode単位でbatch化し、GPUへまとめてforwardします。このときrequestごとの途中状態はKV cacheとして管理されます。
押さえる語彙:
| 用語 | 意味 |
|---|---|
| request queue | まだ処理待ちのrequestを置く場所 |
| scheduler | 次にどのrequestを処理するか決める部分 |
| continuous batching | decode中でも新しいrequestを取り込み、GPUを空けにくくする処理方式 |
| KV cache manager | requestごとのKV cache領域を管理する部分 |
| paged attention | KV cacheをblock単位で管理し、メモリを効率よく使う考え方 |
concurrencyを上げると総throughputは伸びやすい一方、TTFTやtail latencyが悪化することがあります。チームのQwen3-30B初期測定でも、concurrency 8ではoutput TPSが伸びる一方でTTFT p50とP99 latencyが悪化しました。
参考文献
- Qwen/Qwen3-235B-A22B model card
- Qwen3 blog
- SGLang Documentation
- SGLang PD Disaggregation
- SGLang Benchmark and Profiling
- Inside vLLM: Anatomy of a High-Throughput LLM Inference System
- NVIDIA Dynamo GitHub
- Dynamo Qwen3-235B-A22B-FP8 recipe
PD Disaggregation
何を分けるのか
PD disaggregationは、LLM推論のprefillとdecodeを別々のworker poolに分ける構成です。
SGLangの説明では、従来の統合engineではprefill batchとdecode batchが同じengineで処理され、decode遅延やDP attentionの不均衡が起きると説明されています。
Dynamoのdesign docでは、disaggregated executionを次の3段階として説明しています。
- prefill engineがprefillを計算し、KV cacheを生成する。
- prefill engineがKV cacheをdecode engineへ転送する。
- decode engineがdecodeを実行する。
なぜ速くなる可能性があるのか
prefillとdecodeは得意なGPU配置・並列化が違います。
| 段階 | 重いもの | 向きやすい最適化 |
|---|---|---|
| prefill | 長い入力列の一括計算 | 大きめbatch、計算資源、chunked prefill |
| decode | KV cache読み書き、1 tokenずつの生成 | 高concurrency、KV cache効率、メモリ帯域 |
この2つを同じworkerで雑に混ぜると、長いprefillがdecodeを邪魔し、ユーザーから見たtoken生成が遅くなることがあります。
RDMAとKV転送
Dynamoのdisaggregated servingドキュメントでは、KV cacheをprefill側GPU memoryからdecode側GPU memoryへ転送するため、RDMAが重要だと説明されています。Dynamo docsでは、RDMAなしではKV cache transferが大きなボトルネックになり得るとも説明されています。
大会環境でInfiniBand、RoCE、UCX、NIXL、Mooncakeなどが使えるかは、必ず確認します。
SGLangとDynamoの関係
DynamoのSGLang backend docsでは、SGLang単体のdisaggregationとDynamo統合時の流れが少し違うと説明されています。
大まかには次の理解でよいです。
| 構成 | 役割 |
|---|---|
| SGLang単体 | SGLang router/load balancerがprefill/decodeを扱う |
| Dynamo + SGLang | Dynamoのdiscoveryやrouterがworker選択やrequest flowを管理し、SGLang側のbootstrapを使ってKV転送する |
最初に見るメトリクス
PD disaggregationの評価では、総throughputだけでは不十分です。
| メトリクス | 意味 |
|---|---|
| TTFT | requestを送ってから最初のtokenが出るまでの時間 |
| TPOT / ITL | 出力token間の平均時間 |
| Output tokens/s | 全体で何token/s出るか |
| Requests/s | requestを何件/s処理できるか |
| p95 latency | 遅いrequestを含めた体感の悪さ |
| GPU memory usage | KV cacheや重みでどれだけVRAMを使うか |
| KV transfer time | prefillからdecodeへのKV cache転送時間 |
注意点
- PD disaggregationは常に速いとは限らない。短いprompt中心なら転送コストが勝つ可能性がある。
- RDMAが弱い環境では、KV transferがボトルネックになる。
- prefill/decode worker数の比率を間違えると、片方が詰まる。
- 競技評価が総throughputだけの場合、実サービスらしいlatency最適化と衝突する可能性がある。
参考文献
- SGLang PD Disaggregation
- NVIDIA Dynamo: Disaggregated Serving design doc
- NVIDIA Dynamo: Disaggregated Serving user guide
- Dynamo SGLang disaggregation docs
AI推論ベンチマーク指標
なぜ指標が重要か
LLM推論の最適化では、「速い」の意味が複数あります。大会のスコアが総throughputだけなら高concurrencyに寄せる戦略が強くなります。一方で、実サービスの会話体験ではTTFTやTPOTが重要になります。
メモ上の議論でも、「高concurrencyで総throughputは上がるが、1リクエストあたりのtoken生成速度が落ちる」という懸念が出ています。
基本指標
| 指標 | 読み方 | 意味 |
|---|---|---|
| Throughput | スループット | 単位時間あたりの処理量。tokens/sやrequests/sで表す |
| TTFT | Time To First Token | request開始から最初のtokenが返るまでの時間 |
| TPOT | Time Per Output Token | 出力token 1個あたりにかかる時間 |
| ITL | Inter-Token Latency | token間の待ち時間。TPOTと近い意味で使われることがある |
| Latency | レイテンシ | request全体の応答時間 |
| p50/p95/p99 | percentile | 中央値、遅い5%、遅い1%を見る指標 |
| ISL | Input Sequence Length | 入力token数 |
| OSL | Output Sequence Length | 出力token数 |
| Concurrency | 並行数 | 同時に処理するrequest数 |
ベンチマークで固定すべき条件
| 条件 | 理由 |
|---|---|
| ISL/OSL分布 | prefill/decodeの負荷比が変わる |
| concurrency | throughputとlatencyのtrade-offが変わる |
| request count | 少なすぎると揺らぎが大きい |
| warmup | CUDA graph、cache、JITなどの初回コストを分離する |
| streaming有無 | TTFTやITLの測り方が変わる |
| sampling設定 | 出力長やEOSで結果が変わる |
| ignore_eos | 固定長出力ベンチでは便利だが、現実の出力分布から外れる可能性がある |
Dynamo/AIPerf
Dynamoのbenchmarks/README.mdでは、Dynamo deploymentの測定にAIPerfを使う例が示されています。例では、--concurrency、--request-count、--streamingなどを指定してprofileし、concurrency sweepでPareto分析を行う流れです。
大会でDynamo/AIPerfがそのまま使われるかは未確定ですが、指標の考え方としては有用です。
チーム測定メモ: Qwen3-30B concurrency sweep
2026-06-26のAIチーム共有スライドQwen3-30Bプロファイリング.pptxでは、Qwen3-30Bに対してconcurrencyを1、2、4、8に変えた初期結果が共有されました。
| concurrency | output TPS | QPS | TTFT p50 | E2E latency p99 | success |
|---|---|---|---|---|---|
| 1 | 168.1 | 1.313 | 54 ms | 764 ms | 100% |
| 2 | 308.7 | 2.412 | 56 ms | 879 ms | 100% |
| 4 | 557.6 | 4.357 | 57 ms | 992 ms | 100% |
| 8 | 864.3 | 6.753 | 102 ms | 1,091 ms | 100% |
読み取り:
concurrency8でoutput TPSは約5.14倍になったが、理想的な8倍には届いていない。concurrency4まではTTFT p50が54msから57msでほぼ横ばい。concurrency8では102msまで悪化した。- P99 latencyは
concurrencyを上げるほど増加した。総throughputとtail latencyのtrade-offを見る必要がある。 - GPU平均使用率は89.6%、GPUメモリ使用量は86.2GiB/95.8GiB(約90%)だった。次のsweepではOOMやKV cache不足に注意する。
この結果は初期測定メモであり、モデル、データセット、入力長、出力長、request count、warmup、生成パラメータを揃えて再測定する必要があります。
最小の比較表
実験結果は最低限この形で残します。
| experiment | change | concurrency | ISL | OSL | TTFT p50 | TPOT p50 | output tok/s | req/s | error rate | notes |
|---|---|---|---|---|---|---|---|---|---|---|
| baseline | none |
参考文献
- Dynamo benchmarks README
- NVIDIA Dynamo: Disaggregated Serving user guide
- SGLang Benchmark and Profiling
- SGLang PD Disaggregation
AI推論最適化の論点
まず分類する
AI推論最適化は、次の層に分けて考えます。
| 層 | 例 | ルール違反リスク |
|---|---|---|
| ベンチ条件 | concurrency、request count、ISL/OSL | 低。ただし指定条件は守る |
| serving設定 | max running requests、CUDA graph batch、memory fraction | 低から中 |
| 並列化 | TP、PP、DP、EP、DP attention | 中。モデル・実装依存 |
| cache | KV cache、prefix cache、RadixAttention | 中 |
| disaggregation | prefill/decode分離、worker比率、KV transfer | 中から高 |
| 推測系 | speculative decoding、MTP、draft model | 高。モデル品質・重み・評価条件に依存 |
| 量子化 | FP8、INT8、INT4、KV quantization | 高。2025年はモデル性能低下変更が禁止された |
| 実験的機能 | torch.compileなど | 高。2025年は実験的機能が禁止されたという参加記情報あり |
Qwen3-235B-A22Bで重要そうなこと
Qwen3-235B-A22BはMoEモデルです。総235Bの重みを扱いつつ、1 tokenあたりは一部expertを使います。
重要な論点は次の通りです。
- 重みロード時間とストレージ配置。
- GPUメモリ上に重みとKV cacheをどう載せるか。
- Expert Parallelismでexpert計算をどう分散するか。
- TP/PP/EPの組み合わせ。
- 長いcontextを扱う場合のprefillコスト。
- thinking mode / non-thinking modeと出力長の扱い。
SGLangで出てくる設定
参加記では、--max-running-requestsや--cuda-graph-max-bsをバッチサイズ相当の調整として扱ったと書かれています。SGLangのserver argumentsにもこれらの引数が存在します。
ただし、最適値はモデル、GPU、VRAM、context長、concurrency、CUDA graphの有無で変わります。固定値を丸写ししないで、sweepする必要があります。
SGLang concurrency調査の進め方
2026-06-26のAIチーム共有スライドでは、Qwen3-30Bでconcurrencyを1、2、4、8に変え、output TPS、QPS、TTFT p50、E2E latency p99、GPU使用率、GPUメモリ使用量を比較しました。
次の順番で進める方針です。
concurrencyの飽和点を探す。次は12、16、24、32などを試す。- 短文、長文、長出力でボトルネックを分ける。
- SGLangのscheduler系パラメータを触る。
- 最後にモデル、Tensor Parallel、別ランタイムを比較する。
理論上の8倍に届かない要因として、次が挙がっています。
- schedulerの管理コスト。
- KV cacheアクセスとメモリ帯域。
- decodeの逐次性。
- prefillとdecodeの干渉。
- リクエスト長のばらつき。
- GPU kernelの効率限界。
SGLang公式のBenchmark and Profilingでは、bench_servingは実運用に近いonline serving測定に使え、TTFT、TPOT、ITL、throughputを測れると説明されています。チームの測定でも、concurrencyだけでなくrequest countとwarmupを揃えます。
次に見るSGLang設定候補:
| 設定 | 見る理由 | 注意点 |
|---|---|---|
--max-running-requests | 同時に走るrequest上限を変える | 高すぎるとKV cacheやVRAMが詰まる |
--chunked-prefill-size | 長いpromptのprefillを小分けにする | 小さくするとメモリは節約できるがprefillが遅くなる可能性 |
--max-prefill-tokens | prefill batchのtoken上限を決める | 長文入力の挙動に影響する |
--schedule-policy | requestの選び方を変える | cache hitやtail latencyに影響する可能性 |
--cuda-graph-max-bs / --cuda-graph-max-bs-decode / --cuda-graph-max-bs-prefill | CUDA graphを使うbatchサイズ範囲を広げる | SGLangのバージョンで引数名が変わる可能性がある。CUDA graphはメモリを使うためVRAM残量とセットで見る |
--mem-fraction-static | 重みとKV cache poolに割り当てるGPUメモリ比率を変える | 高すぎるとactivationやCUDA graph用の余裕がなくなり、低すぎると最大concurrencyが下がる |
--num-continuous-decode-steps | scheduler overheadを減らす可能性がある | throughput向上とTTFT悪化のtrade-offがある |
speculative decoding / MTP
SGLangのSpeculative Decoding docsでは、EAGLE、Multi Token Prediction、draft model、NGRAMなど複数の推測デコード手法が説明されています。
メモ上の議論では、ランダム重みでベンチマークすると、MTPやspeculative decodingの有効性が実運用の分布を反映しないのではないかという懸念があります。これは妥当な論点です。推測デコードは「予測したtokenがどれだけ採用されるか」に依存するため、実重み・実データ分布でないと評価が歪み得ます。
DP Attention
2025年参加記では、DeepSeekモデル向けのDP Attentionを試したものの、KV cache削減は確認できてもスループットは大きく下がったと書かれています。
この教訓は、公式ブログや論文上の高速化率をそのまま信じないことです。最適化は次の条件が揃ったときだけ意味があります。
- 同じモデルか。
- 同じGPU世代か。
- 同じbatch/concurrencyか。
- 同じ入力長・出力長か。
- 同じnetworkか。
- 同じ評価指標か。
実験の優先順位
最終ルール前にやるなら、リスクが低い順に進めます。
- ベンチマークの測り方を固定する。
- concurrency sweepを作る。
- TP/PP/DP/EPの意味をチームで説明できるようにする。
- SGLangの主要server argumentsを読む。
- PD disaggregationの構成図を描けるようにする。
- ルール確定後に、禁止されていない範囲で最適化候補を絞る。
参考文献
- SGLang Documentation
- SGLang Server Arguments
- SGLang Benchmark and Profiling
- SGLang Hyperparameter Tuning
- SGLang Speculative Decoding
- SGLang Pipeline Parallelism for Long Context
- SGLang v0.4 blog
- Inside vLLM: Anatomy of a High-Throughput LLM Inference System
- Qwen/Qwen3-235B-A22B model card
NCCL通信最適化
このページは、2026-06-05の勉強会でチームが共有したNCCL通信最適化の基礎をまとめたものです。 担当: 小林。
これは何か
NCCL(NVIDIA Collective Communications Library、読み: ニッケル)は、複数GPU間の通信ボトルネックを軽減するためのライブラリです。
AI課題(Qwen推論)では、Tensor Parallelやprefill-decode間の処理などでGPU間通信が発生します。
NCCLはこのGPU間のcollective通信を担います。
なぜ重要か
Qwenのような大規模LLMを複数GPUで動かすとき、モデルをGPUに分割して実行します。 このとき通信(AllReduceなど)が遅いと、GPUが計算せずに**待つ時間(idle)**が増えます。
つまりHPC-AIでは、NCCLでQwen推論中のGPU間通信を高速化し、
tokens/secを上げることが目標になります。
基本概念:NCCLの主な通信
| 通信 | 内容 | 使用場面 |
|---|---|---|
| AllReduce | 全GPUの計算結果を集約して全GPUへ戻す | 分散学習、Tensor Parallel |
| AllGather | 各GPUのデータを集める | モデル分割、並列推論 |
| ReduceScatter | 集約しながら分割して配る | 大規模モデル並列 |
| Broadcast | 1つのGPUのデータを全GPUへ配る | 重み・設定の共有 |
| Send/Recv | GPU間で個別に送受信 | Pipeline処理、KV cache転送 |
AI TrackでNCCLが使われる流れ
Tensor Parallelでは、各GPUがモデルの一部を計算します。
GPU0/1/2/3: それぞれモデルの一部を計算
↓
計算結果を NCCL で集約(AllReduce / AllGather)
↓
次の層へ進む
ここで通信が遅いと、GPUの待ち時間が増えて全体が遅くなります。
最適化手順
1. 測定する
Qwen推論を実行し、Nsight SystemsやNCCLログで次を確認します(例)。
- Prefill計算時間 / Decode計算時間
- NCCL通信時間
- GPU idle(GPU待ち時間)
- KV cache転送時間
- どのGPU間で通信しているか(通信経路)
2. ボトルネックを分類して対策する
| 計測結果 | 原因 | 対策 |
|---|---|---|
| NCCL通信時間が長い | GPU間通信が遅い | NIC指定、NCCL設定変更(パラメータ調整) |
| GPU idleが多い | 通信待ちが発生 | 通信と計算の重なり(オーバーラップ)を改善 |
| KV cache転送時間が長い | KV cache転送が遅い | prefill / decode の配置を見直す |
| rankごとに時間が違う | 負荷分散が悪い | batch分割やworker比率を調整 |
大会との関係
- 2025年AI課題(16 H100 GPUs)でも、GPU kernel単体よりGPU間通信が律速になりやすいと考えられます(要確認)。
- prefill/decodeの配置はPD Disaggregationと関係します。
注意点
- NCCLパラメータやNIC指定は環境依存です。大会の実機・設定可否は要確認です。
- GPUプロファイリングは「いきなりカーネル内部」ではなく、まずCPU-GPU転送と通信を疑います(プロファイリングツール実践ガイド)。
関連ページ
参考文献
MPI 特別講義まとめ
これは何か
2026-07-11 の特別講義(MPI 入門)の記録です。当日の殴り書きメモを、後から読み返せる形に整理しました。
内容は MPI の仕様(specification)レベルの基礎知識が中心です。特記がない限り、ここに書いたことは MPI 標準として定まっている情報です。実装(Open MPI など)に依存する挙動は、その旨を明記します。
- MPI(Message Passing Interface): 分散メモリ並列プログラミングの API を定めた国際標準仕様。
1. 並列計算と分散計算
| 用語 | 意味 |
|---|---|
| Parallel Computing | 1 つのタスクを小さいタスクに分割して同時に処理する |
| Distributed Computing | 複数の計算機を使って 1 つの問題を解く。多数のノードが互いに接続し、同じ問題を協調して解く |
メモリモデルによる分類
| モデル | 代表的な技術 | 特徴 |
|---|---|---|
| Shared Memory(共有メモリ) | pthreads、OpenMP、SHMEM | 同一メモリ空間を複数スレッドで共有 |
| Distributed Memory(分散メモリ) | MPI | プロセスごとに独立したメモリ。通信でデータをやり取り |
| Data Parallel(データ並列) | PGAS | データを分散配置し、グローバルアドレス空間として扱う |
補足:理論値を超える Speedup
理論上の上限を超える速度向上(super-linear speedup)が観測されることがあります。主な要因は次の通りです。
- メモリとキャッシュの効果(データが分割されて各ノードのキャッシュに載りやすくなる)
- 並列探索アルゴリズムで早く解が見つかる場合
- 単なる測定上のばらつき(偶然)
2. MPI:仕様と実装の関係
「MPI は specification(仕様)」であり、実際に動くのはその実装です。ここは混同しやすいので分けて整理します。
MPI 仕様の実装(MPI 標準に準拠したライブラリ)
| 実装 | 位置づけ |
|---|---|
| Open MPI | 代表的なオープンソース実装 |
| MPICH | 歴史の古いオープンソースの代表実装 |
| MVAPICH | MPICH ベース。InfiniBand / HPC ネットワーク向けに最適化 |
| Intel MPI | Intel 提供。Intel CPU / Omni-Path 向けに最適化 |
いずれも mpirun / mpiexec を提供し、MPI プログラムを動かすランタイム兼ライブラリです。
GPU 向けコレクティブ通信ライブラリ(MPI 実装ではない)
NCCL / RCCL / HCCL は MPI の実装ではありません。ベンダーごとの GPU/アクセラレータ向け高速コレクティブ通信ライブラリで、allreduce、broadcast、allgather などの集合通信に特化しています。
| ライブラリ | ベンダー / 対象 |
|---|---|
| NCCL | NVIDIA Collective Communications Library(NVIDIA GPU 向け) |
| RCCL | Radeon Collective Communications Library(AMD GPU 向け、NCCL クローン的) |
| HCCL | Huawei Collective Communication Library(Ascend など向け) |
階層イメージ
- MPI(汎用メッセージパッシングの標準仕様)
- Open MPI / MPICH / MVAPICH / Intel MPI(仕様に沿った実装)
- NCCL / RCCL / HCCL(各社が GPU 向けに出す高速集合通信エンジン。規格ではなくプロダクト)
3. MPI Hello World
MPI 入門で最初に出てくる最小プログラムです。mpirun -np N ./a.out で起動すると、同じ実行ファイルが N プロセス立ち上がり、それぞれが自分の rank・ノード名・全体プロセス数を表示します。
int main(int argc, char** argv) {
int world_size, world_rank, name_len;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
MPI_Get_processor_name(processor_name, &name_len);
printf("Hello world from %s, rank %d/%d\n",
processor_name, world_rank, world_size);
MPI_Finalize();
}
各要素の意味
| 要素 | 役割 |
|---|---|
MPI_Init | MPI ランタイムを初期化。「このプロセスは MPI の一員」と登録する開始宣言 |
MPI_Comm_size | コミュニケータ内の全プロセス数を取得(-np 4 なら 4) |
MPI_Comm_rank | 自分のランク番号(0 〜 world_size-1)を取得。条件分岐(例: rank 0 だけがファイルを読む)に使う |
MPI_Get_processor_name | 動作中の物理マシン名(ホスト名)を取得 |
MPI_COMM_WORLD | 全プロセスが所属する、MPI が用意済みのコミュニケータ |
MPI_MAX_PROCESSOR_NAME | ノード名の最大長を表す MPI 定義の定数 |
MPI_Finalize | MPI の終了処理。以降は原則 MPI 関数を呼べない |
覚え方: MPI プログラムの本編は「MPI_Init 〜 MPI_Finalize の間」。
スライドの色分け: 赤 = MPI 関数、緑 = MPI 定義の定数・ハンドル、黒 = 通常の C 要素。
mpicc hello.c -o hello
mpirun -np 4 ./hello
出力例(どのノードにどの rank が割り当てられたか目視で確認できる):
Hello world from node01, rank 0/4
Hello world from node02, rank 1/4
Hello world from node02, rank 2/4
Hello world from node03, rank 3/4
4. 通信パターンと基本オブジェクト
MPI でできる通信の「地図」です。
通信パターン
| パターン | 代表 API | 概要 |
|---|---|---|
| Two-sided(両側通信) | MPI_Send / MPI_Recv | 送信側と受信側の両方が MPI 関数を呼ぶ。相手が Recv しないと Send が完了しない。ブロッキング/ノンブロッキング(MPI_Isend / MPI_Irecv)を含む |
| One-sided(片側通信) | MPI_Put / MPI_Get | RMA(リモートメモリアクセス)。相手が公開したメモリ領域(MPI_Win_create で作る window)に直接読み書きする。相手は毎回 Recv を書かなくてよい |
| Collective(集合通信) | MPI_Barrier、MPI_Bcast ほか | コミュニケータに属する全員(または一部)が同じ関数を呼んで同期・データ共有する |
| MPI I/O(並列 I/O) | MPI_File_read / MPI_File_write / MPI_File_set_view | 複数プロセスで協調して巨大ファイルを読み書きする。大規模 HPC では I/O がネックになりやすく重要 |
基本オブジェクト
| オブジェクト | 役割 |
|---|---|
| Communicators | プロセスの「グループ」とその中のランク対応をまとめる。MPI_COMM_WORLD が代表。MPI_Comm_split などで部分グループを作れる。「どのグループ内の会話か」を決める部屋番号 |
| Data Types | MPI が理解するデータの並び。基本型(MPI_INT、MPI_DOUBLE など)と派生型(構造体やストライド配列を 1 つの型として定義)。異なるアーキテクチャ間の変換(エンディアン差など)も吸収 |
| Requests | ノンブロッキング通信で使う「未完了操作」を表すハンドル。MPI_Wait / MPI_Test で完了確認。通信と計算のオーバーラップを可能にする |
MPI プログラムは「どのコミュニケータ内で」「どのデータ型のバッファを」「どの通信パターンで」やり取りするか、の 3 つを組み合わせて設計します。
5. Tag-Matching(タグマッチング)
MPI_Send と MPI_Recv は同時に呼ぶ必要はありません。MPI ランタイムが送信キュー・受信キューを管理し、条件が合った瞬間にデータを受信バッファへ渡します。この対応付けが Tag-Matching です。
マッチングに使うパラメータ
| パラメータ | 送信側 | 受信側 | ワイルドカード |
|---|---|---|---|
| 相手ランク | dest | source | MPI_ANY_SOURCE |
| タグ(メッセージ種別のラベル、int 値) | tag | tag | MPI_ANY_TAG |
| コミュニケータ | comm | comm | — |
順序が入れ替わっても正しくつながる
- Recv が先: 受信側が先に
MPI_Recvを呼ぶと「未完了の受信」としてキューに登録され、データ到着時に即バッファへコピーされる。 - Send(データ)が先: データが先に届くと内部バッファにストックされ、後から
MPI_Recvが呼ばれた瞬間にコピーされる。
正しい source, tag, comm さえ指定すれば、送受信のタイミングをぴったり合わせる必要はありません。
マッチングのルール
- マッチング条件(
source,dest,comm,tag)は一意である必要はない。同じ条件のメッセージが複数流れてよい。 - Matching in the order posted: 複数がマッチしうる場合、先にポストされた
Recvから順に、先にポストされたSendとマッチする(FIFO)。これにより「送った順=受け取った順」が保たれ、追い越し(overtaking)が起きない。
アプリからのヒント(info オブジェクト)
コミュニケータに info を付けて「自分はこういうことをしない」と宣言すると、実装がマッチング処理を最適化しやすくなります(実際のキー名・サポート状況は実装依存)。
| ヒント | 宣言する内容 |
|---|---|
mpi_assert_no_any_tag | MPI_ANY_TAG を使わない |
mpi_assert_no_any_source | MPI_ANY_SOURCE を使わない |
mpi_assert_exact_length | 受信 count を常にメッセージ長ぴったりにする |
mpi_assert_no_allow_overtaking | メッセージの追い越しを許さない |
6. ブロッキング Send/Recv の完了条件と引数
ブロッキングな MPI_Send / MPI_Recv は、安全なタイミングまで戻ってこない設計です。
| 関数 | 戻ってきたとき保証されること |
|---|---|
MPI_Recv | 送られてきたデータが受信バッファ(buf)に安全にコピー済み。バッファを読んでよい |
MPI_Send | 送信バッファ(buf)を上書きしても、送信中メッセージが壊れない状態。相手にすでに届いたか、MPI 内部にコピー済み |
注意: 関数が戻る前に、Send は送信バッファを書き換えない、Recv は受信バッファを読まないこと。
引数の役割(3 分割)
int MPI_Send(void* buf, int count, MPI_Datatype datatype,
int dest, int tag, MPI_Comm comm)
int MPI_Recv(void* buf, int count, MPI_Datatype datatype,
int source, int tag, MPI_Comm comm,
MPI_Status* status)
| 分類 | 引数 | 意味 |
|---|---|---|
| データ内容(何を送る/受け取るか) | buf, count, datatype | バッファ先頭、要素数、要素 1 個の型 |
| 相手とグループ(誰と通信するか) | dest / source, comm | 相手ランク、そのランクが意味を持つコミュニケータ |
| タグ(メッセージ種別) | tag | 同じ相手でもタグで別種のメッセージとして区別 |
7. 送信モード(communication modes)
同じ「送る」でも、何をもって送信完了とみなすかがモードで違います。各モードにブロッキング版とノンブロッキング版があります。
| モード | 完了条件 | 特徴・用途 |
|---|---|---|
| Standard(標準) | 実装・メッセージサイズに依存。小さいメッセージは内部バッファにコピーして即完了(eager)、大きいメッセージは受信待ちでブロックすることも | 一番よく使うデフォルト。「本当に届いたか」は保証しない |
| Buffered(バッファ付き) | データがローカルの登録済みバッファ(MPI_Buffer_attach)にコピーされた時点で完了。受信の有無に依存しない | ユーザーが送信用バッファを用意する必要がある |
| Synchronous(同期) | マッチする Recv がポストされ、受信が始まって初めて完了 | 相手の受信開始を確認できる。順序制御やデッドロック発見に有用。遅くなることがある |
| Ready(レディー) | マッチする Recv がすでにポスト済みのときだけ開始してよい。未ポストなら undefined behavior | 特殊・高度な最適化用。一般アプリではほぼ使わない |
モード × ブロッキング / ノンブロッキング
| Standard | Buffered | Synchronous | Ready | |
|---|---|---|---|---|
| Blocking | MPI_Send | MPI_Bsend | MPI_Ssend | MPI_Rsend |
| Nonblocking | MPI_Isend | MPI_Ibsend | MPI_Issend | MPI_Irsend |
8. Point-to-Point 通信の保証
MPI 標準がどこまで保証し、どこから実装依存かを整理します。キーワードは Order / Progress / Fairness / Resource limitations。
| 観点 | 標準の保証 | 実務上のポイント |
|---|---|---|
| Order(順序) | 同じ (source, dest, comm) かつ同種の通信では non-overtaking(送った順に届く) | 「送信順=意味的な順序」として設計してよい |
| Progress(進行性) | MPI 関数を呼んでいるとき以外は通信進行を保証しない | ノンブロッキング通信を投げた後ずっと自前計算だけしていると、背景で転送が進むとは限らない。定期的に MPI_Test / MPI_Wait などで進行のきっかけを与える |
| Fairness(公平性) | 公平性は保証しない | 実装は best effort で公平に動くが、「絶対に公平」と仮定して設計しない |
| Resource limitations(リソース) | 厳密な規定なし(best effort) | 大量の未完了通信を一度に投げるとバッファ不足でエラーや性能劣化。リソースを意識した設計を |
Quality implementation: MPI 標準の保証は最小限(Order 以外はかなり緩い)。実際の良い実装(Open MPI、MPICH、Intel MPI など)は、高速・公平・安定・良い進行性といった望ましい性質を最適化で提供している。「標準の最低ライン」と「実装が提供する挙動」にはギャップがある点に注意。
HPC コンペでチューニングまで踏み込むなら、実装ごとの Progress 性・背景進行の有無はかなり効いてくる。
9. ノンブロッキング通信の完了確認
MPI_Isend / MPI_Irecv は即戻り、MPI_Request を返します。実際の完了は以下のルーティンで確認します。
完了の意味
- 送信(Isend)の完了 → 送信バッファを安全に上書きできる。
- 受信(Irecv)の完了 → 受信バッファにメッセージが入っている。
単一操作の完了
| 関数 | 挙動 |
|---|---|
MPI_Wait(request, status) | その通信 1 個が完了するまでブロック |
MPI_Test(request, flag, status) | ノンブロッキング。flag != 0 なら完了、flag == 0 ならまだ。計算とオーバーラップさせるときに使う |
複数のうちどれか 1 個の完了(ANY)
MPI_Request の配列を渡し、そのうち 1 つが完了したら教えてくれます。
| 関数 | 挙動 |
|---|---|
MPI_Waitany(count, array_of_requests, index, status) | 配列内で最初に完了したものが出るまでブロック。完了した要素の位置が index に入る |
MPI_Testany(count, array_of_requests, index, flag, status) | MPI_Waitany のノンブロッキング版 |
典型パターン: 多数の Isend / Irecv を投げておき、Waitany / Testany で「終わった順」に処理して通信と計算を重ねる。
MPI_Request reqs[N];
/* Isend / Irecv をセットアップして reqs に入れる */
for (int finished = 0; finished < N; ++finished) {
int index;
MPI_Status status;
MPI_Waitany(N, reqs, &index, &status);
/* index 番目の通信の後処理 */
}
10. 集団通信(Collective)
集団通信はコミュニケータ単位で定義されます(defined in the context of a communicator)。そのコミュニケータに属するランクが、全員または特定パターンで同じ collective 関数を呼ぶのが前提です。
10-1. 3 つの分類軸
| 軸 | 種類 | 内容 |
|---|---|---|
| Completion semantics(完了) | Blocking | 1 コミュニケータにつき同時アクティブは 1 つだけ。完了までブロック(MPI_Bcast、MPI_Allreduce、MPI_Barrier) |
| Nonblocking | 同じコミュニケータ上でも複数を同時進行可(MPI_Ibcast、MPI_Iallreduce、MPI_Ibarrier)。計算と通信のオーバーラップに有用 | |
| Scope(スコープ) | Non-persistent | 毎回一から呼ぶ従来型。各操作は一度きり |
| Persistent | テンプレート(persistent object)を一度作り、start / wait を繰り返す。毎回の準備処理を再利用でき、オーバーヘッドを削減 | |
| Participating ranks(参加ランク) | regular | 全ランクが参加(MPI_Bcast、MPI_Gather など)。誰か一人でも呼ばないとデッドロック |
| Neighborhood | トポロジ情報を持つコミュニケータ(MPI_Cart_create など)に紐づき、近傍とだけ通信(MPI_Neighbor_allgather など)。格子状・グラフ状パターンで効率的 |
「nonblocking + persistent + neighborhood」を組み合わせると強力な性能チューニングができる、という布石。
10-2. 入出力パターンによる 4 分類
「誰がデータを出し、誰が結果を受け取るか」で分類します。
| クラス | パターン | 代表 API |
|---|---|---|
| One-To-All | 1 プロセスが情報源 → 全員が受け取る | MPI_Bcast、MPI_Scatter / MPI_Scatterv |
| All-To-One | 全員が出す → 1 プロセスが集約 | MPI_Gather / MPI_Gatherv、MPI_Reduce |
| All-To-All | 全員が出し、全員が受け取る(双方向) | MPI_Allgather / MPI_Allgatherv、MPI_Alltoall / MPI_Alltoallv / MPI_Alltoallw、MPI_Allreduce、MPI_Reduce_scatter |
| Other | 上記に当てはまらないもの | MPI_Scan(prefix 演算 = 部分和)、MPI_Barrier(同期のみ) |
グラフでのイメージ
- One-To-All: ルート 1 個 → 全ノードへ広がる木(Bcast, Scatter)
- All-To-One: 全ノード → ルート 1 個へ集まる木(Gather, Reduce)
- All-To-All: 全ノード間の多重エッジ(Allgather, Alltoall, Allreduce)
- Other: 部分和や同期など、単純な送受図で表しづらいもの(Scan, Barrier)
この型を頭に入れておくと、「Allreduce を Allgather + Reduce に分解できるか」「Bcast の木構造はどうか」といった議論が整理しやすくなる。
大会との関係(メモ)
- OpenFOAM 課題(テーマ①)は分散メモリ並列 = MPI が中核。領域分割・ランク配置・通信量・MPI I/O が性能に直結する。
- 実装ごとの Progress 性・背景進行・コレクティブアルゴリズムの違いは、チューニング時の検討対象になりうる。
- 関連ページ: MPI通信最適化、領域分割(decomposePar)、NCCL通信最適化
参考文献
用語辞書
大会・HPC一般
| 用語 | 説明 |
|---|---|
| HPC | High Performance Computing。多数のCPU/GPU、メモリ、ネットワークを使って大規模計算を高速に行う分野 |
| ノード | クラスタを構成する1台の計算機。CPU、GPU、メモリ、NICを持つ |
| rank | MPIプロセスの番号。OpenFOAMではrankごとに計算領域の一部を担当する |
| MPI | Message Passing Interface。複数プロセス間で通信する標準API |
| PBS / Slurm | HPCクラスタでジョブを投入・管理するジョブスケジューラ |
| wall time | 実際に時計で測った経過時間。大会の実行時間評価で重要 |
| strong scaling | 問題サイズを固定し、ノード数を増やしてどれだけ速くなるか |
| weak scaling | 1ノードあたりの問題サイズを固定し、ノード数と問題サイズを同時に増やす評価 |
| NUMA | CPUソケットごとにメモリアクセス距離が違う構造。bindingを誤ると遅くなる |
| CPU affinity / binding | プロセスやスレッドを特定CPU coreに固定すること |
| InfiniBand | HPCでよく使われる低レイテンシ・高帯域ネットワーク |
| RDMA | Remote Direct Memory Access。CPUをあまり介さずリモートメモリへ直接転送する仕組み |
| UCX | HPC通信で使われる通信framework。InfiniBand/RDMAなどを抽象化する |
| profiling | 実行時間やCPU/GPU/メモリ/通信/I/Oの使用状況を計測し、性能問題を調べること |
| bottleneck | 全体性能を制限している最も遅い部分。最適化ではまずここを特定する |
| hotspot | 実行時間の多くを占める関数や処理箇所 |
| scaling analysis | ノード数やGPU数を増やしたとき、性能がどれだけ伸びるかを測る分析 |
| parallel efficiency | 並列化したときに、理想的な速度向上に対してどれだけ効率が出ているか |
| PMPI | MPIのprofiling interface。MPI関数の呼び出し時間などを測るツール実装に使われる |
| NCCL | NVIDIA Collective Communications Library。複数GPU間のAllReduceなどのcollective通信に使われる |
| load imbalance | rank/スレッド間で計算量が偏ること。最も遅いrankに全体が引っ張られる |
| Amdahl’s law | 並列化できない逐次部分があると、資源を増やしても速度向上が頭打ちになる法則 |
| MPI_Allreduce | 各rankの値を集約し結果を全rankへ配るcollective通信。反復ソルバで多発する |
| collective通信 | 全rank/全GPUが参加する通信(AllReduce、AllGather、Broadcastなど) |
| memory bandwidth | メモリ帯域。単位時間に転送できるデータ量。律速になると計算が待たされる |
| false sharing(偽共有) | 別スレッドが同一cache lineを更新し合い、無駄なcache同期で遅くなる現象 |
| first-touch | 最初にアクセスしたスレッドのローカルメモリに割り当てるNUMAの仕組み |
numactl | NUMAポリシーを制御し、特定ノードでプロセスを動かすコマンド |
| A64FX | 富岳のArmベースCPU。48コア、HBM2、SVE512が特徴 |
| SVE | Scalable Vector Extension。ベクトル長非依存のArm SIMD拡張(富岳は512bit) |
| HBM2 | 広帯域メモリ。A64FXが採用 |
| LTO | Link Time Optimization。複数の翻訳単位を横断した最適化 |
| PGO | Profile-Guided Optimization。実行プロファイルを利用した最適化 |
-Ofast | 精度を犠牲にしうる積極的なコンパイラ最適化。大会での許容範囲は要確認 |
-march | 対象CPU固有の命令を使うコンパイラ最適化オプション |
| サニタイザー | 未定義動作やメモリエラーを検出するビルド機能(ASan、UBSanなど) |
| scratch領域 | マシンから高速にアクセスできる一時作業用ストレージ |
OpenFOAM / CFD
| 用語 | 説明 |
|---|---|
| CFD | Computational Fluid Dynamics。流体の運動を数値計算で解く分野 |
| OpenFOAM | CFD向けのオープンソースソフトウェア群 |
| case | OpenFOAMでの計算問題一式。0/、constant/、system/などを含む |
| solver | 方程式を解く実行プログラム。例: simpleFoam、pimpleFoam |
| mesh | 計算領域を小さなcellに分割したもの |
| cell | meshの最小単位 |
| domain decomposition | 計算領域を複数プロセスに分けること |
decomposeParDict | 領域分割方法を指定するOpenFOAM設定ファイル |
decomposePar | caseを並列実行用に分割するコマンド |
reconstructPar | 並列実行後の分割結果を結合するコマンド |
| residual | 数値解が方程式をどれだけ満たしていないかの指標 |
| tolerance / relTol | 線形ソルバの収束判定条件 |
| RANS | Reynolds-Averaged Navier-Stokes。乱流を平均化して扱う手法 |
| LES | Large Eddy Simulation。大きな渦を直接解き、小さな渦をモデル化する手法 |
| KPI | Key Performance Indicator。TTSFなど性能評価用の指標 |
| TTS | Time To Solution。解を得るまでの時間 |
| Pressure Solver | 圧力の連立方程式を解くソルバ。OpenFOAMの実行時間の多くを占める |
| 反復法 | 正解に少しずつ近づけて解く方法。CG/PCG/BiCGStab/GAMGなど |
| PCG | Preconditioned Conjugate Gradient。前処理付き共役勾配法 |
| GAMG | Geometric-Algebraic Multi-Grid。マルチグリッド系ソルバ。通信特性が異なる |
decomposeParDictのmethod | simple/hierarchical/scotch/ptscotchなど領域分割の手法 |
| Boundary Cells(境界セル) | 分割した領域の境界にあるcell。隣rankと情報交換が必要 |
AI推論
| 用語 | 説明 |
|---|---|
| LLM | Large Language Model。大規模言語モデル |
| inference | 学習済みモデルを使って出力を生成すること |
| serving | APIとして推論を受け付け、複数requestを処理する運用形態 |
| token | LLMが処理するテキストの単位 |
| prefill | 入力prompt全体を処理してKV cacheを作る段階 |
| decode | KV cacheを使って1 tokenずつ出力を生成する段階 |
| KV cache | Attention計算で使うKey/Valueを保存し、過去tokenの再計算を避けるcache |
| TTFT | Time To First Token。最初のtokenが返るまでの時間 |
| TPOT | Time Per Output Token。出力token 1個あたりの時間 |
| ITL | Inter-Token Latency。token間の待ち時間 |
| throughput | 単位時間あたりの処理量。tokens/sやrequests/s |
| concurrency | 同時に処理するrequest数 |
| ISL | Input Sequence Length。入力token数 |
| OSL | Output Sequence Length。出力token数 |
| p95 latency | 遅い側5%を含めた応答時間。体感品質を見るのに重要 |
モデル・並列化
| 用語 | 説明 |
|---|---|
| Qwen | Alibaba/QwenチームのLLMシリーズ |
| DeepSeek-R1 | reasoning向けLLM。2025年大会AI課題で使われた |
| MoE | Mixture of Experts。複数expertのうち一部だけをtokenごとに使うモデル構造 |
| expert | MoE内の専門サブネットワーク |
| active parameters | 1 tokenの計算で実際に使われるパラメータ数 |
| total parameters | モデル全体のパラメータ数。VRAM見積もりではこちらも重要 |
| TP | Tensor Parallelism。1層内の行列計算を複数GPUに分ける |
| PP | Pipeline Parallelism。層を複数GPU/ノードに分ける |
| DP | Data Parallelism。同じモデル複製で別request/batchを処理する |
| EP | Expert Parallelism。MoEのexpertを複数GPUに分ける |
| DP Attention | Attention部分をdata-parallel寄りに扱う最適化。モデル・実装依存 |
| CUDA Graph | CUDA kernel実行列をgraph化し、起動 overheadを減らす仕組み |
| prefix cache | 同じprefixを持つrequestでKV cacheを再利用する仕組み |
| RadixAttention | SGLangのprefix sharing/cache管理に関係する仕組み |
| speculative decoding | 小さいモデルや補助headで先のtokenを予測し、採用できた分だけ高速化する手法 |
| MTP | Multi Token Prediction。複数tokenを先読み予測する手法 |
| quantization | 重みやKV cacheを低精度化してメモリや計算を減らす手法 |
| FP8 / BF16 | 数値形式。FP8は低精度で軽い、BF16は学習・推論でよく使われる16bit形式 |
Framework / Tool
| 用語 | 説明 |
|---|---|
| SGLang | 高性能LLM serving framework |
| Dynamo | NVIDIAの分散推論serving framework |
| TensorRT-LLM | NVIDIA GPU向けLLM推論最適化ライブラリ |
| vLLM | LLM serving framework。PagedAttentionなどで知られる |
| AIPerf | AI推論性能測定ツール。Dynamo docsで利用例がある |
| NIXL | NVIDIAのKV転送などで使われる通信/転送ライブラリ |
| Mooncake | SGLangのPD disaggregationで使えるKV transfer engineの一つ |
参考文献一覧
大会
- 2026 APAC HPC-AI Competition
- 2025 APAC HPC-AI Competition
- HPC-AI Advisory Council Announces Results of the 8th APAC HPC-AI Competition
- 学生向け計算科学分野国際コンペティションで上位入賞
- The 8th APAC HPC-AI Competition参加記
OpenFOAM / HPC
- OpenFOAM HPC Committee repository
- OpenFOAM HPC Benchmark Suite GitLab tree
- High Performance Computing Technical Committee - OpenFOAM Wiki
- OpenFOAM v13 User Guide: Running applications in parallel
- The First OpenFOAM HPC Challenge (OHC-1)
HPC最適化・プロファイリング
- Linux perf tools documentation
- Intel VTune Profiler Documentation
- Score-P Documentation
- Scalasca
- Vampir
- mpiP: Lightweight, Scalable MPI Profiling
- Linaro Forge (MAP)
- Darshan HPC I/O characterization tool
- GCC Optimize Options
- QCFium法 (Codeforces blog)
- OpenBLAS
- Intel oneMKL Documentation
- Scotch and PT-Scotch
- Arch Wiki: デバッグ/プロファイリング
- Arch Wiki: パフォーマンスの向上
- One Billion Row Challenge
- flamegraph-rs/flamegraph
- iSUS: NUMA 向けの最適化
- iSUS: Understanding NUMA for 3D finite difference (PDF)
- A64FX / SVE 入門記事(Qiita)
- 富岳 公式サイト(理研R-CCS)
- 富岳 利用手引書(利用及びジョブ実行編)
GPU / NCCL
Qwen / LLM
SGLang
- SGLang Documentation
- SGLang Server Arguments
- SGLang Benchmark and Profiling
- SGLang Hyperparameter Tuning
- SGLang PD Disaggregation
- SGLang Speculative Decoding
- SGLang Pipeline Parallelism for Long Context
- SGLang v0.4 blog
vLLM / 推論システム
Dynamo / NVIDIA
- NVIDIA Dynamo GitHub
- Dynamo benchmarks
- Dynamo Qwen3-235B-A22B-FP8 recipe
- NVIDIA Dynamo: Disaggregated Serving design doc
- NVIDIA Dynamo: Disaggregated Serving user guide
- NVIDIA Dynamo: Tuning Disaggregated Performance
- AIPerf
共有リンク集
チーム内で共有された外部URLを保存するページです。 参考文献一覧とは分けて、共同編集資料、スライド、作業用ドキュメント、外部ノートなどを管理します。
運用方針
- 新しい外部URLを共有したら、このページに追加する。
- 何のためのリンクか、後から見て分かる説明を書く。
- 公式資料や技術的根拠として本文で引用するURLは、必要に応じて参考文献一覧にも追加する。
- Google Drive、Google Docs、Google Slidesなどの共有資料は、アクセス権限も確認する。
チーム作業資料
| 名称 | URL | 用途 | 追加日 | 備考 |
|---|---|---|---|---|
| 技術キャッチアップ共有スライド | https://docs.google.com/presentation/d/1PG013sviaa7bvxlbhFgblGv6lIDH3wrcjRO3Jo5qB94/edit?usp=sharing | Qwen、OpenFOAM、ベンチマーク指標、禁止事項などの技術キャッチアップをチームでまとめる | 2026-05-29 | Google Slides。閲覧・編集権限を確認する |
| mdBook公開サイト(Cloudflare Pages) | https://meeting-minutes-e4o.pages.dev/ | このmdBookの公開先。議事録・技術ページの共有 | 2026-06-19 | 公開URL |
追加テンプレート
| 名称 | URL | 用途 | 追加日 | 備考 |
|---|---|---|---|---|
| | <https://example.com> | | YYYY-MM-DD | |
mdBook の使い方
mdBook は Rust 製の静的サイトジェネレーターで、Markdown ファイルからドキュメントサイト(HTML)を生成します。このリポジトリで使っているツールです。
インストール
Rust がある場合(推奨)
cargo install mdbook
バイナリを直接取得する場合
GitHub Releases から OS に合ったバイナリをダウンロードして PATH の通ったディレクトリに置きます。
Windows(winget)
winget install -e --id Rust.Rust
cargo install mdbook
プロジェクト構造
book.toml # プロジェクト設定
src/
SUMMARY.md # 目次(章の順序と構成を定義)
chapter_1.md # 記事ファイル
book/ # ビルド出力(自動生成・編集不要)
book.toml の主要設定
[book]
title = "APAC-HPC-AI"
authors = ["Typewriter"]
language = "ja" # サイトの言語コード
[build]
build-dir = "book" # 出力先ディレクトリ(デフォルト: book)
SUMMARY.md — 目次の書き方
src/SUMMARY.md が本全体の構成を決定します。ここに書いたリンクのみがサイドバーに表示されます。
# Summary
- [はじめに](./introduction.md)
# 第1部:ツールガイド
- [mdBook の使い方](./mdbook-usage.md)
- [GitHub Pages への公開](./github-pages.md)
# 第2部:OpenFOAM
- [OpenFOAM 入門](./openfoam/intro.md)
- [メッシュ生成](./openfoam/meshing.md) ← インデントでサブ章
ルール:
- リストアイテム
- [タイトル](./ファイルパス)が章になる - インデント(2スペース or タブ)でサブ章を作れる
# 見出しはセクション区切り(リンクなし)- SUMMARY.md に書かれていないファイルはサイトに含まれない
記事の書き方
src/ 以下に .md ファイルを作成します。通常の Markdown がそのまま使えます。
# 章タイトル
## セクション
本文テキスト。**太字**、*斜体*、`コード` が使えます。
コードブロック(シンタックスハイライト付き):
```bash
mpirun -np 4 openfoam
```
数式(KaTeX):
\\( E = mc^2 \\) ← インライン数式
\\[
\nabla \cdot \mathbf{u} = 0
\\] ← ブロック数式
ディレクトリで章をまとめる
src/
openfoam/
intro.md
meshing.md
SUMMARY.md でのパス指定: ./openfoam/intro.md
ビルドとプレビュー
| コマンド | 説明 |
|---|---|
mdbook build | book/ に HTML を生成 |
mdbook serve | ローカルサーバーを起動(http://localhost:3000) |
mdbook serve --open | ブラウザも自動で開く |
mdbook watch | ファイル変更を監視して自動ビルド(サーバーなし) |
mdbook clean | book/ を削除 |
mdbook serve 実行中はファイルを保存するたびにブラウザが自動更新されます。
新しい章を追加する手順
src/にファイルを作成する
# 例: OpenFOAM 入門記事
# (Windowsの場合)
New-Item src/openfoam-intro.md
src/SUMMARY.mdにリンクを追加する
- [OpenFOAM 入門](./openfoam-intro.md)
mdbook serveで確認する
この 2 ステップを忘れると、ファイルを作ってもサイトに表示されないので注意。
カスタマイズ(book.toml)
[book]
title = "APAC-HPC-AI"
description = "APAC HPC-AI Competition 2026 チーム知識ベース"
[output.html]
theme = "navy" # デフォルトテーマ: default, rust, coal, navy, ayu
git-repository-url = "https://github.com/<username>/APAC-HPC-AI"
edit-url-template = "https://github.com/<username>/APAC-HPC-AI/edit/main/{path}"
[output.html.search]
enable = true # 全文検索(デフォルトで有効)
edit-url-template を設定すると各ページに「ページを編集」リンクが表示され、共同執筆がしやすくなります。
GitHub Pages への公開(GitHub Actions)
main ブランチに push するたびに mdBook を自動ビルドして https://<username>.github.io/<repo>/ に公開する仕組みを作ります。
全体の流れ
git push → GitHub Actions が起動
→ mdbook build を実行
→ book/ を GitHub Pages にデプロイ
→ https://<username>.github.io/<repo>/ が更新される
Step 1: GitHub Actions ワークフローを追加
リポジトリに .github/workflows/deploy.yml を作成します(このリポジトリには既に含まれています)。
name: Deploy mdBook to GitHub Pages
on:
push:
branches: [main]
workflow_dispatch: # 手動実行ボタンも有効にする
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install mdBook
env:
MDBOOK_VERSION: "0.4.40"
run: |
curl -sSL "https://github.com/rust-lang/mdBook/releases/download/v${MDBOOK_VERSION}/mdbook-v${MDBOOK_VERSION}-x86_64-unknown-linux-gnu.tar.gz" \
| tar -xz
sudo mv mdbook /usr/local/bin/
- name: Setup Pages
uses: actions/configure-pages@v5
- name: Build
run: mdbook build
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:
path: ./book
deploy:
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
Step 2: GitHub リポジトリの設定
ワークフローを push する前に、GitHub 側で Pages のソースを「GitHub Actions」に変更します。
- リポジトリページを開く
- Settings タブ → 左サイドバー Pages
- Source を
Deploy from a branchからGitHub Actionsに変更して Save
![Pages設定の場所: Settings > Pages > Source > GitHub Actions]
この設定をしないとデプロイジョブが
Error: HttpError: Not Foundで失敗します。
Step 3: 初回デプロイ
# ワークフローファイルを push する
git add .github/workflows/deploy.yml
git commit -m "ci: add GitHub Pages deployment workflow"
git push origin main
push 後、リポジトリの Actions タブでジョブの進行状況を確認できます。緑のチェックマークが付けば成功です。
公開 URL: https://<username>.github.io/<repository-name>/
動作確認チェックリスト
-
.github/workflows/deploy.ymlがmainブランチに存在する - Settings → Pages → Source が GitHub Actions になっている
- Actions タブで
Deploy mdBook to GitHub Pagesジョブが成功している - 公開 URL にアクセスしてサイトが表示される
トラブルシューティング
| 症状 | 原因と対処 |
|---|---|
Error: HttpError: Not Found | Pages の Source が GitHub Actions になっていない |
mdbook: command not found | MDBOOK_VERSION の値が古い → Releases で最新バージョンを確認 |
| ページが真っ白 | book.toml の build-dir と upload-pages-artifact の path が一致しているか確認 |
| CSS/JS が 404 | book.toml の [output.html] に site-url の設定が必要な場合あり(サブディレクトリ公開時) |
手動デプロイ(ローカルから)
CI を使わずに手動でデプロイしたい場合は gh-pages ブランチに push する方法もあります。
mdbook build
cd book
git init
git add .
git commit -m "deploy"
git push -f https://github.com/<username>/<repo>.git HEAD:gh-pages
ただし、ワークフローによる自動デプロイの方が手間がなくミスも少ないため、通常は CI を推奨します。