大規模言語モデル (LLM) の台頭により、AI のトレーニングと推論における詳細なパフォーマンス分析と最適化の需要が高まっています。GPU アクセラレーションノードで実行されている組織では、GPU コンテナーのオンラインパフォーマンス分析が必要です。Kubernetes 環境では、AI プロファイリングは、拡張 Berkeley Packet Filter (eBPF) と動的プロセスインジェクションを活用した非侵入型のパフォーマンス分析ツールとして機能します。Python プロセスの実行、CPU 関数の呼び出し、システムコール、CUDA ライブラリの相互作用、CUDA カーネル操作の 5 つの主要な領域を通じて、コンテナー化された GPU タスクのオンライン検出をサポートします。収集されたデータを分析することで、コンテナーアプリケーションのパフォーマンスボトルネックを正確に特定し、リソース使用率のレベルを理解してアプリケーションを最適化できます。オンラインアプリケーションの場合、この動的にマウントおよびアンロード可能なプロファイリングツールにより、コードを変更することなく詳細なリアルタイム分析が可能になります。このトピックでは、コマンドラインを使用して AI プロファイリングを使用する方法について説明します。
準備
現在の AI プロファイリングバージョンの Python プロファイリング機能は、Python インタープリターの User Statically-Defined Tracing (USDT) 機能に依存しています。Python プロファイリングを使用するには、ワークロードコンテナーで次のコマンドを実行して USDT の可用性を確認します。
python -c "import sysconfig; print(sysconfig.get_config_var('WITH_DTRACE'))"Python プロファイリングの場合、出力は 1 である必要があります。そうでない場合、Python プロファイリングは利用できません。
説明プロファイリングタスクは、Elastic Compute Service (ECS) または Lingjun ノードを持つ ACK クラスターでの実行のみをサポートします。
この機能を使用するには、チケットを送信 して Container Service チームに連絡し、最新の kubectl-plugin のダウンロードリンクと最新のプロファイリングイメージのアドレスを入手してください。
手順
ステップ 1: kubectl プラグインをデプロイする
AI プロファイリングは kubectl-plugin を使用してデプロイされます。プロシージャは次のとおりです。
次のコマンドを実行してプラグインをインストールします。この例では、Linux_amd64 を使用します。
wget https://xxxxxxxxxxxxxxxxx.aliyuncs.com/kubectl_prof_linux_amd64 mv kubectl_prof_linux_amd64 /usr/local/bin/kubectl-prof chmod +x /usr/local/bin/kubectl-prof次のコマンドを実行して、プラグインが正常にインストールされたかどうかを確認します。
kubectl prof deploy -h期待される出力:
deploy the profiling tool pod Usage: kubectl-profile deploy [flags] Aliases: deploy, run Flags: --container string Specify the target container name -d, --duration uint Specify the profiling duration in seconds (default 60) -h, --help help for deploy --image string Specify the profiling tool image --kubeconfig string Specify the kubeconfig file --memory-limit string Specify the memory limit (default "1Gi") --memory-request string Specify the memory request (default "128Mi") --namespace string Specify the target pod namespace (default "default") --node string Specify the node name --pod string Specify the target pod name --region-id string Specify the region-id --ttl uint Specify the ttl (default 60)
ステップ 2: ターゲットアプリケーションコンテナーを選択し、プロファイリングタスクを作成する
アプリケーション Pod を選択し、その Namespace、Name、および Node パラメーターを取得します。この例では、PyTorch トレーニングジョブを使用します。
NAME READY STATUS RESTARTS AGE IP NODE pytorch-train-worker-sample 1/1 Running 0 82s 172.23.224.197 cn-beijing.10.0.17.XXX次のコマンドを実行して、取得したパラメーターでプロファイリングジョブを送信します。プロファイリングする Pod とコンテナーを指定します。プロファイリングジョブは、アプリケーション Pod のターゲットコンテナーが配置されているノードにプロファイリング Pod を作成します。
kubectl prof deploy \ --image xxxxxxxxxx \ # Alibaba Cloud から提供されたプロファイリングイメージのアドレスに置き換えます --duration 100000 \ # プロファイリング Pod 環境の期間 --namespace default \ # アプリケーション Pod の名前空間 --region-id cn-beijing \ # 環境の Alibaba Cloud リージョン ID --pod pytorch-train-worker-sample \ # アプリケーション Pod 名 --container pytorch \ # アプリケーション Pod のコンテナー名 --memory-limit 10G \ # プロファイリング Pod のメモリ制限 --memory-request 1G # プロファイリング Pod のメモリリクエスト
ステップ 3: プロファイリングをトリガーする
次のコマンドを実行して、プロファイリングポッド情報を表示します。
kubectl get pod予想される出力:
NAME READY STATUS RESTARTS AGE ai-profiler-89bf5b305acf2ec-xxxxx 2/2 Running 0 1m次のコマンドを実行して、プロファイリングポッドに入ります。
kubectl exec -ti ai-profiler-89bf5b305acf2ec-xxxxx -c debugger -- bash次のコマンドを実行して、すべての GPU プロセスをリストし、プロファイリングコマンドテンプレートを生成します。
llmtracker generateCommand予想される出力:
I0314 11:42:42.389890 2948136 generate.go:51] GPU PIDs in container: I0314 11:42:42.389997 2948136 generate.go:53] PID: xxxxx, Name: {"pid":xxxxx} I0314 11:42:42.390008 2948136 generate.go:69] The profiling command is: llmtracker profile\ -p <ProcessID-To-Profiling>\ -t <Profiling-Type(python,cuda,syscall,cpu or all)>\ -o /tmp/data.json\ -v 5\ --cpu-buffer-size <CPU-Buffer-Size, recommand to 20>\ --probe-file <Enable-CUDA-Lib-Profile-File>\ -d <Duration-To-Profiling>\ --delay <Delay-Time>\ --enable-cuda-kernel <Enable-CUDA-Kenrel-Profile(true or none)> I0314 14:37:12.436071 3083714 generate.go:86] Profiling Python Path is: /usr/bin/python3.10. If you want to profiling Python, please ser the environment variable: export EBPF_USDT_PYTHON_PATH=/usr/bin/python3.10説明Python レベルのプロファイリングを有効にする必要がある場合は、まずプロファイリング環境で出力に示されている環境変数を設定する必要があります。
パラメーターと説明は次のとおりです。
パラメーター
説明
-pプロファイリングする PID を指定します。このパラメーターは、複数の PID をサポートするために複数回使用できます。
-tプロファイリングタイプを指定します。オプションは python、cuda、syscall、cpu です。すべてのプロファイリングタイプを有効にするには
allを使用します。-oプロファイリング出力ファイルのパスと名前を指定します。デフォルト:
/tmp/data.json。-vログ出力レベルを指定します。
--cpu-buffer-sizeeBPF データ収集用の CPU バッファーサイズを指定します。デフォルト: 20。
--probe-fileCUDA Lib プロファイリングに必要なテンプレートファイルを指定します。書き込み仕様を参照するか、直接デフォルトのテンプレートを使用してください。
-dプロファイリングタスクの期間を秒単位で設定します。プロファイリング期間が長くなると、過剰なデータが生成され、メモリ消費量とストレージ負荷が増加する可能性があるため、この値を 60 秒未満に維持することをお勧めします。
--delayプロファイリングが開始されるまでの遅延時間を秒単位で設定します。CUDA カーネルプロファイリングを有効にする場合、この値を 2 より大きく維持することをお勧めします。
--enable-cuda-kernelCUDA カーネルプロファイリングを有効にするかどうかを指定します。有効にするには、このパラメーターを true に設定します。
-t cudaと--enable-cuda-kernelの違い:-t cudaは eBPF を使用して CUDA ライブラリのシンボル呼び出しを収集します。これには、各 API 関数の呼び出し時間とパラメーターが含まれ、プロセス内の実際の呼び出し状況を分析します。--enable-cuda-kernelは、プロセスインジェクション技術を使用して CUDA カーネル関数の特定の実行情報を収集し、GPU 側のタスクフロー状態の詳細な調査を可能にします。
より完全なパラメーター情報については、
llmtracker profile -hコマンドを実行してください。次の例を使用してプロファイリングを実行し、必要に応じて生成されたプロファイリングコマンドを変更します。
説明この例では、すべてのプロファイリング項目 (CUDA カーネルプロファイリングを含む) を有効にし、CUDA Lib を
probe.jsonとして構成し、出力ファイルパスを/tmp/data.jsonに設定し、--delay 3 -d 5を追加して、開始前に 3 秒の遅延と 5 秒のプロファイリング期間を示します。export EBPF_USDT_PYTHON_PATH=/usr/bin/python3.10 llmtracker profile -p xxxxx -t all -o /tmp/data.json -v 5 --enable-cuda-kernel true --cpu-buffer-size 20 --probe-file probe.json --delay 3 -d 5次のコマンドを実行して、結果ファイルをフォーマットし、エクスポートします。
説明このステップでは、結果ファイルを TimeLineのための標準フォーマットに変換します。
結果ファイルに CUDA カーネルプロファイリングデータが含まれている場合は、パラメーター
--cupti-dirを追加し、固定パス/tmpに設定する必要があります。
llmtracker export -i /tmp/data.json -o /output/out.json --cupti-dir /tmp
ステップ 4: プロファイリング結果を表示する
TensorBoard を使用した表示と分析
OSS や NAS などのストレージを使用する場合、結果データを表示する方法については「TensorBoard の表示」をご参照ください。プロファイリング結果データを含む PVC をマウントするクラスターで TensorBoard Pod を起動し、TensorBoard を開いて関連データを表示します。
Chrome Tracing を使用した表示と分析
ローカルストレージを使用する場合、生成されたプロファイリング結果ファイルをローカルマシンにコピーし、Chrome Tracing (Perfetto) を使用してファイルを表示する必要があります。
表示効果
TensorBoard 表示
TensorBoard を使用して表示されるタイムラインは次のとおりです。

Chrome Tracing 表示
Chrome Tracing を使用してローカルに表示されるタイムラインは次のとおりです。

AI プロファイリングの付録
CUDA Lib 設定ファイル
ターゲットライブラリの再帰的な依存関係を取得し、さらにライブラリファイルをフィルタリングします。追跡したいライブラリファイルをフィルタリングまたは確認した後、
lddコマンドを使用してターゲットライブラリファイルのリンク依存関係を取得し、それによって有効なデータを収集できるライブラリファイルの範囲を決定できます。
ターゲットライブラリファイルを決定した後、ライブラリ内のテンプレートシンボルを確認する必要があります。このステップでは、libnccl.so を例として使用します。次のコマンドを実行して、ライブラリ内のすべてのシンボル情報を取得します。
readelf -Ws libnccl.so.2 | grep pnccl予想される出力:
... 223: 00000000000557d0 650 FUNC GLOBAL DEFAULT 11 pncclGroupStart 224: 0000000000050200 243 FUNC GLOBAL DEFAULT 11 pncclRedOpDestroy 225: 0000000000062081 656 FUNC GLOBAL DEFAULT 11 pncclCommAbort 227: 000000000006320c 721 FUNC GLOBAL DEFAULT 11 pncclCommUserRank 228: 0000000000064ee0 20 FUNC GLOBAL DEFAULT 11 pncclGetVersion 231: 0000000000045f60 1778 FUNC GLOBAL DEFAULT 11 pncclAllGather 232: 00000000000604f8 1578 FUNC GLOBAL DEFAULT 11 pncclCommInitAll 233: 000000000004ff20 728 FUNC GLOBAL DEFAULT 11 pncclRedOpCreatePreMulSum 238: 0000000000074520 653 FUNC GLOBAL DEFAULT 11 pncclCommDeregister 240: 00000000000474b0 30 FUNC GLOBAL DEFAULT 11 pncclBcast 243: 000000000006173d 789 FUNC GLOBAL DEFAULT 11 pncclCommFinalize 244: 00000000000483d0 2019 FUNC GLOBAL DEFAULT 11 pncclSend ...次のフォーマットに類似した JSON ファイルを構築して、プロファイリングに必要な JSON 設定ファイルを組み立てます。この設定ファイルは、UProbe のためのコンテナー内のターゲットライブラリファイルの相対パス、ライブラリファイル内で監視するメソッドのシンボル、および KProbe で監視するシステムメソッドのシンボルなど、Probe に必要な情報を定義する必要があります。デフォルトの参照テンプレートは次のとおりです。