すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:コマンドラインによる AI プロファイリングの使用

最終更新日:Nov 09, 2025

大規模言語モデル (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 を使用してデプロイされます。プロシージャは次のとおりです。

  1. 次のコマンドを実行してプラグインをインストールします。この例では、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
  2. 次のコマンドを実行して、プラグインが正常にインストールされたかどうかを確認します。

    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: ターゲットアプリケーションコンテナーを選択し、プロファイリングタスクを作成する

  1. アプリケーション 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
  2. 次のコマンドを実行して、取得したパラメーターでプロファイリングジョブを送信します。プロファイリングする 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: プロファイリングをトリガーする

  1. 次のコマンドを実行して、プロファイリングポッド情報を表示します。

    kubectl get pod

    予想される出力:

    NAME                                                   READY   STATUS    RESTARTS   AGE
    ai-profiler-89bf5b305acf2ec-xxxxx                      2/2     Running   0          1m
  2. 次のコマンドを実行して、プロファイリングポッドに入ります。

    kubectl exec -ti ai-profiler-89bf5b305acf2ec-xxxxx -c debugger -- bash
  3. 次のコマンドを実行して、すべての 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-size

    eBPF データ収集用の CPU バッファーサイズを指定します。デフォルト: 20。

    --probe-file

    CUDA Lib プロファイリングに必要なテンプレートファイルを指定します。書き込み仕様を参照するか、直接デフォルトのテンプレートを使用してください。

    -d

    プロファイリングタスクの期間を秒単位で設定します。プロファイリング期間が長くなると、過剰なデータが生成され、メモリ消費量とストレージ負荷が増加する可能性があるため、この値を 60 秒未満に維持することをお勧めします。

    --delay

    プロファイリングが開始されるまでの遅延時間を秒単位で設定します。CUDA カーネルプロファイリングを有効にする場合、この値を 2 より大きく維持することをお勧めします。

    --enable-cuda-kernel

    CUDA カーネルプロファイリングを有効にするかどうかを指定します。有効にするには、このパラメーターを true に設定します。

    -t cuda--enable-cuda-kernel の違い:

    • -t cuda は eBPF を使用して CUDA ライブラリのシンボル呼び出しを収集します。これには、各 API 関数の呼び出し時間とパラメーターが含まれ、プロセス内の実際の呼び出し状況を分析します。

    • --enable-cuda-kernel は、プロセスインジェクション技術を使用して CUDA カーネル関数の特定の実行情報を収集し、GPU 側のタスクフロー状態の詳細な調査を可能にします。

    より完全なパラメーター情報については、llmtracker profile -h コマンドを実行してください。

  4. 次の例を使用してプロファイリングを実行し、必要に応じて生成されたプロファイリングコマンドを変更します。

    説明

    この例では、すべてのプロファイリング項目 (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
  5. 次のコマンドを実行して、結果ファイルをフォーマットし、エクスポートします。

    説明
    • このステップでは、結果ファイルを TimeLineのための標準フォーマットに変換します。

    • 結果ファイルに CUDA カーネルプロファイリングデータが含まれている場合は、パラメーター --cupti-dir を追加し、固定パス /tmp に設定する必要があります。

    llmtracker export -i /tmp/data.json -o /output/out.json --cupti-dir /tmp

ステップ 4: プロファイリング結果を表示する

TensorBoard を使用した表示と分析

OSSNAS などのストレージを使用する場合、結果データを表示する方法については「TensorBoard の表示」をご参照ください。プロファイリング結果データを含む PVC をマウントするクラスターで TensorBoard Pod を起動し、TensorBoard を開いて関連データを表示します。

Chrome Tracing を使用した表示と分析

ローカルストレージを使用する場合、生成されたプロファイリング結果ファイルをローカルマシンにコピーし、Chrome Tracing (Perfetto) を使用してファイルを表示する必要があります。

表示効果

TensorBoard 表示

TensorBoard を使用して表示されるタイムラインは次のとおりです。

image.png

Chrome Tracing 表示

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

image

AI プロファイリングの付録

CUDA Lib 設定ファイル

  1. ターゲットライブラリの再帰的な依存関係を取得し、さらにライブラリファイルをフィルタリングします。追跡したいライブラリファイルをフィルタリングまたは確認した後、ldd コマンドを使用してターゲットライブラリファイルのリンク依存関係を取得し、それによって有効なデータを収集できるライブラリファイルの範囲を決定できます。

    image

  2. ターゲットライブラリファイルを決定した後、ライブラリ内のテンプレートシンボルを確認する必要があります。このステップでは、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
    ...
  3. 次のフォーマットに類似した JSON ファイルを構築して、プロファイリングに必要な JSON 設定ファイルを組み立てます。この設定ファイルは、UProbe のためのコンテナー内のターゲットライブラリファイルの相対パス、ライブラリファイル内で監視するメソッドのシンボル、および KProbe で監視するシステムメソッドのシンボルなど、Probe に必要な情報を定義する必要があります。デフォルトの参照テンプレートは次のとおりです。

    デフォルトの参照テンプレートを展開して表示

    [
        {
            "category": "cuda",
            "uprobes": [
                {
                    "type": "cuda",
                    "libraries": [
                        {
                            "library": "/usr/lib/x86_64-linux-gnu/libcuda.so.1",
                            "symbols": [
    							"cuStreamSynchronize",
                                "cuMemcpyHtoD_v2",
                                "cuMemcpyDtoH_v2",
                                "cuMemcpyDtoD_v2",
                                "cuMemcpyDtoA_v2",
                                "cuMemcpyAtoD_v2",
                                "cuMemcpyHtoA_v2",
                                "cuMemcpyAtoH_v2",
                                "cuMemcpyAtoA_v2",
                                "cuMemcpyHtoAAsync_v2",
                                "cuMemcpyAtoHAsync_v2",
                                "cuMemcpy2D_v2",
                                "cuMemcpy2DUnaligned_v2",
                                "cuMemcpy3D_v2",
                                "cuMemcpyHtoDAsync_v2",
                                "cuMemcpyDtoHAsync_v2",
                                "cuMemcpyDtoDAsync_v2",
                                "cuMemcpy2DAsync_v2",
                                "cuMemcpy3DAsync_v2"
                            ]
                        },
                        {
                            "library": "/usr/local/lib/python3.10/dist-packages/nvidia/cuda_runtime/lib/libcudart.so.12",
                            "symbols": [
                                "cudaLaunchKernel",
                                "cudaLaunchKernelExC"
                            ]
                        }
                    ]
                },
                {
                    "type": "cuBLAS",
                    "libraries": [
                        {
                            "library": "/usr/local/lib/python3.10/dist-packages/nvidia/cublas/lib/libcublasLt.so.12",
                            "symbols": [
                                "cublasLtMatmul",
                                "cublasLtMatrixTransform"
                            ]
                        },
                        {
                            "library": "/usr/local/lib/python3.10/dist-packages/nvidia/cublas/lib/libcublas.so.12",
                            "symbols": [
                                "cublasGemmEx",
                                "cublasGemmBatchedEx",
                                "cublasGemmStridedBatchedEx",
                                "cublasGemmGroupedBatchedEx",
                                "cublasSgemmEx",
                                "cublasCgemmEx"
                            ]
                        }
                    ]
                },
                {
                    "type": "nccl",
                    "libraries": [
                        {
                            "library": "/usr/local/lib/python3.10/dist-packages/nvidia/nccl/lib/libnccl.so.2",
                            "symbols": [
                                "pncclAllReduce",
                                "pncclAllGather",
                                "pncclReduce",
                                "pncclBroadcast",
                                "pncclBcast",
                                "pncclReduceScatter",
                                "pncclSend",
                                "pncclRecv",
                                "pncclGroupStart",
                                "pncclGroupEnd",
                                "_Z20ncclGroupJobCompleteP12ncclGroupJob",
                                "_Z17ncclGroupJobAbortP12ncclGroupJob",
                                "pncclCommInitRank",
                                "pncclCommInitAll",
                                "pncclCommFinalize",
                                "pncclCommDestroy"
                            ]
                        }
                    ]
                },
                {
                    "type": "torch",
                    "libraries": [
                        {
                            "library": "/usr/local/lib/python3.10/dist-packages/torch/lib/libtorch_python.so",
                            "symbols": [
                                "THPVariable_backward",
                                "at::native::(anonymous namespace)::run_backward"
                            ]
                        }
                    ]
                }
            ]
        }
    ]