プロファイリングと性能分析

これは何か

プロファイリングは、プログラムの実行時間、CPU/GPU使用率、メモリ使用量、通信時間、I/O待ち時間を計測する作業です。 最適化の前に必ず行い、「どこが遅いのか」を事実で確認します。

コンテストで上位を狙うには、最初からコードや設定を勘で変えるのではなく、まず性能探偵として遅い場所を特定することが重要です。

なぜ重要か

HPCやAI推論では、遅く見える原因が一つとは限りません。

  • CPU計算が重い。
  • GPUが十分に使えていない。
  • GPU間通信が詰まっている。
  • MPI通信待ちが長い。
  • KV cacheやメモリアクセスが帯域不足になっている。
  • I/Oやモデルロードで待っている。
  • CPU側の前処理がGPUを待たせている。

ボトルネックを特定しないまま最適化すると、スコアに効かない場所へ時間を使う危険があります。

キャッチアップすべき技術一覧

技術WhatWhyWhenWhereHow重要度
プロファイリング実行時間やリソース使用状況を計測改善箇所を特定するため最初に必ず実施CPU、GPU、メモリ、通信、I/Operf、VTune、nsyshtopnvidia-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ボトルネック分析最も効果の大きい箇所を見つける
3MPI/NCCL通信解析HPC・AIともに通信が律速になりやすい
4スケーリング分析ノード数やGPU数を増やす価値を判断できる
5メモリ最適化現代CPU/GPUは計算よりメモリ待ちが効くことが多い
6CPU/GPU最適化ボトルネックが計算だった場合に有効
7NUMA/I/O最適化特定環境で大きな効果を発揮する

去年の課題との対応

部門最重要技術次点
NWChem(4 CPU nodes)MPI通信解析スケーリング分析、NUMA最適化
SGLang + DeepSeek-R1(16 H100 GPUs)NCCL通信解析GPUプロファイリング、KV cache解析

2025年AI部門では、単純なCUDA最適化よりも、次の順番で状況を切り分ける力が重要だった可能性があります。

  1. GPUは本当に忙しいのか。
  2. GPU間通信で詰まっていないか。
  3. KV cache参照で帯域不足になっていないか。
  4. CPUがGPUを待たせていないか。

これは要確認の推測ですが、SGLangや大規模LLM推論では、GPU kernel単体の高速化だけでなく、batching、KV cache、GPU間通信、CPU側スケジューリングが全体性能に影響します。

最初に見るべき指標

対象指標見る理由
CPUCPU使用率、hotspot関数、cache miss、context switchCPU計算や前処理が律速か見る
GPUGPU utilization、SM使用率、memory bandwidth、kernel timelineGPUが計算で忙しいか、待っているかを見る
メモリ使用量、帯域、cache miss、page faultメモリ待ちや容量不足を見る
MPIMPI_Wait、通信時間、rank間の負荷差ノード間通信やload imbalanceを見る
NCCLAllReduce/AllGather時間、GPU間転送、topologyマルチGPU通信の詰まりを見る
I/O読み書き時間、ファイル数、ログ量ストレージ待ちを見る
scaling1/2/4/8ノード比較、parallel efficiency並列化が効いているか見る

代表ツール

ツール主な対象用途
perfLinux CPUCPU hotspot、命令、cache missなどの確認
Intel VTune ProfilerCPU、thread、memory、MPIなどCPUボトルネックの詳細分析
NVIDIA Nsight Systems (nsys)CPU/GPU全体timelineCUDA kernel、CPU待ち、GPU待ち、通信の流れを見る
nvidia-smiNVIDIA GPUGPU使用率、メモリ使用量、電力、プロセス確認
htopCPUプロセスCPU core使用状況、プロセス監視
MPI profiling interface / PMPIMPI通信MPI関数ごとの時間や呼び出しを測る
NCCL logs / NsightGPU間通信collective通信の時間やtopology問題を調べる

実験の進め方

  1. 何も変更しないbaselineを測る。
  2. CPU、GPU、通信、I/Oのどこで時間を使っているかを大まかに分ける。
  3. 最も時間割合が大きい箇所を1つ選ぶ。
  4. その箇所に対して1つだけ変更する。
  5. 同じ条件で再測定する。
  6. 速くなった理由、遅くなった理由、変わらなかった理由を記録する。

実験ログテンプレート

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:

参考文献