用語集 · コンピューティング
プロファイリング
別名:Profiling、profiler、profile、bottleneck、torch profiler、プロファイラ、プロファイル、ボトルネック
プログラムがどこに時間を使っているかを部分ごとに測り、何を速くすべきかを見つけること。
プログラムが遅いのはたいてい1つか2つの部分のせいで、それは推測したものとはまず違います。プロファイラはプログラムを実行し、各関数(GPU なら各カーネル)にどれだけ時間がかかり、何回実行されるかを記録します。出力は時間順に並べたリストです。
役立てるためのルールが2つあります。
- 一番大きな項目から速くする。 ある部分が時間の10%しか占めていなければ、それを無限に速くしても10%しか節約できません。
- 変更のたびに測り直す。 1つのボトルネックを取り除くと次のボトルネックが現れますし、効くはずの変更が効かないこともあります。
GPU の処理は時間を測るのが難しくなります。CPU は処理を先に送り出して、そのまま先へ進むからです。CPU 上のタイマーは、GPU を待つか GPU 自身のタイマーを使わない限り、処理の実行ではなく送り出しを測ってしまいます。
このプロジェクトでは
レンタルGPUで学習する では、RTX 5090 でのプロファイリングで、1つのカーネル、つまり質量行列の分解が、筋肉のある身体の GPU 時間の53%を占めていることがわかりました。それを置き換えると、物理計算が28%速くなりました。後にシンプルな体をプロファイルすると、各ステップのうち物理計算の外で 21 ms かかっており、物理計算の 11 ms より多く、そのうち 8 ms は参照モーションの参照にかかっていました。それ以前には、CPU でパンチの学習ランをプロファイルして、筋肉のある身体の接触のほとんどが、拳の中で触れ合う自分の指どうしだとわかりました(ブロック)。
ブロックの環境(2人のファイターと視覚)では、プロファイリングによって、GPU の1ステップの13,700個のカーネルのうち11,700個が PyTorch の小さな演算だとわかりました。また CPU では、ワーカーの1ステップ 4.4 ms のうち MuJoCo 自体は約 1.6 ms にすぎず、残りはその周りにあるプロジェクト自前の Python と numpy でした。