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

Container Service for Kubernetes:Windows コンテナーで DirectX の GPU アクセラレーションを有効にする方法

最終更新日:May 20, 2025

GPU は、Windows ノードのワークロードに対して CPU よりも高い並列計算能力を提供し、処理速度を桁違いに向上させることができます。そのため、GPU のスループットが向上します Windows コンテナーは、Direct eXtension(DirectX)上に構築されたフレームワークの GPU アクセラレーションをサポートしています このトピックでは、Windows ノードに DirectX デバイス プラグインをインストールする方法と、DirectX の GPU アクセラレーションを有効にする方法について説明します

前提条件

概要

DirectX は、Windows ベースのゲームやマルチメディア アプリケーションのパフォーマンスを向上させながら、3D グラフィックスと効果音を強化する API のスイートです。統一されたハードウェアドライバー標準を提供し、インストールとセットアップを簡素化します。DirectX を使用すると、GPU を使用して 並列および 計算量の多いタスクを処理できます。また、CPU 負荷も軽減します。

手順 1:GPU アクセラレーションを有効にしたエラスティック Windows ノードプールを作成する

標準 Windows ノードプールを作成する

  1. ライセンスを使用して GRID ドライバーをアクティブ化します。GRID ドライバーは、次の 2 つの方法でインストールできます。

  2. 次の要件を満たす Windows ノードプールを作成します。詳細については、「Windows ノードプールを作成する」をご参照ください。

エラスティック Windows ノードプールを作成する

ACK は、デフォルトでは ECS パブリックイメージをノードイメージとして使用することのみをサポートしています。エラスティック Windows ノードを作成するには、カスタムイメージを使用する必要があります。プロセスは次のとおりです。

  1. チケットを送信するして、ライセンスがアクティブ化された GRID ドライバーを含む共有 Windows イメージをリクエストします。Windows Server 2019 と Windows Server 2022 のみサポートされています。他の要件がある場合は、チケットに Windows のバージョンを指定してください。

  2. 次の要件を満たす Windows ノードプールを作成します。

    1. インスタンスタイプ:GPU コンピューティング最適化インスタンスタイプまたは GPU 仮想化インスタンスタイプ。サポートされているインスタンスタイプの詳細については、「GPU コンピューティング最適化インスタンスファミリ(gn、ebm、scc シリーズ)」または「GPU 仮想化インスタンスファミリ(vgn および sgn シリーズ)」をご参照ください。

    2. オペレーティング システム:ビジネス要件に基づいて OS を選択します。例:Windows Server 2022。

    3. カスタムイメージ:リクエストしたイメージを選択します。

手順 2:Windows ノードに DirectX デバイス プラグインをインストールする

Windows ノードに DaemonSet として DirectX デバイス プラグインをデプロイします。

  1. directx-device-plugin-windows.yaml という名前のファイルを作成し、次のコードをファイルにコピーします。

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      labels:
        k8s-app: directx-device-plugin-windows
      name: directx-device-plugin-windows
      namespace: kube-system
    spec:
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          k8s-app: directx-device-plugin-windows
      template:
        metadata:
          annotations:
            scheduler.alpha.kubernetes.io/critical-pod: ""
          labels:
            k8s-app: directx-device-plugin-windows
        spec:
          tolerations:
            - operator: Exists
          # 1.18 以降、Windows ワークロードに対して "hostNetwork: true" を指定できるため、NetworkReady なしでアプリケーションをデプロイできます。
          hostNetwork: true
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: type
                        operator: NotIn
                        values:
                          - virtual-kubelet
                      - key: beta.kubernetes.io/os
                        operator: In
                        values:
                          - windows
                      - key: windows.alibabacloud.com/deployment-topology
                        operator: In
                        values:
                          - "2.0"
                      - key: windows.alibabacloud.com/directx-supported
                        operator: In
                        values:
                          - "true"
                  - matchExpressions:
                      - key: type
                        operator: NotIn
                        values:
                          - virtual-kubelet
                      - key: kubernetes.io/os
                        operator: In
                        values:
                          - windows
                      - key: windows.alibabacloud.com/deployment-topology
                        operator: In
                        values:
                          - "2.0"
                      - key: windows.alibabacloud.com/directx-supported
                        operator: In
                        values:
                          - "true"
          containers:
            - name: directx
              command:
                - pwsh.exe
                - -NoLogo
                - -NonInteractive
                - -File
                - entrypoint.ps1
              # 下記のイメージアドレスのリージョン情報を、クラスターのリージョンに合わせて変更してください。
              image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/directx-device-plugin-windows:v1.0.0
              imagePullPolicy: IfNotPresent
              volumeMounts:
                - name: host-binary
                  mountPath: c:/host/opt/bin
                - name: wins-pipe
                  mountPath: \\.\pipe\rancher_wins
          volumes:
            - name: host-binary
              hostPath:
                path: c:/opt/bin
                type: DirectoryOrCreate
            - name: wins-pipe
              hostPath:
                path: \\.\pipe\rancher_wins
  2. 次のコマンドを実行して、directx-device-plugin-windows.yaml ファイルをデプロイし、DirectX デバイス プラグインをインストールします。

    kubectl create -f directx-device-plugin-windows.yaml

ステップ 3:DirectX の GPU アクセラレーションが有効になっている Windows ワークロードをデプロイする

DirectX デバイスプラグインは、Elastic Compute Service(ECS)ホスト上の DirectX サービスへのアクセスを有効にするために、class/<interface class GUID> デバイスを Windows コンテナーに自動的に追加できます。詳細については、「Windows コンテナーのデバイス」をご参照ください。

GPU アクセラレーションを必要とする Windows ワークロードに次の resources パラメーターを追加し、ワークロードを再デプロイします。

spec:
  ...
  template:
    ...
    spec:
      ...
      containers:
        - name: gpu-user
          ...
+         resources:
+           limits:
+             windows.alibabacloud.com/directx: "1"
+           requests:
+             windows.alibabacloud.com/directx: "1"
重要

上記の構成では、ECS ホスト上のすべての GPU リソースをコンテナーに割り当てるわけではなく、他のアプリケーションが ECS ホスト上の GPU にアクセスすることを妨げるわけでもありません。代わりに、GPU リソースは ECS ホストとコンテナー間で動的にスケジュールされます。つまり、ECS ホスト上で複数の Windows コンテナーを実行でき、各コンテナーは DirectX ハードウェアアクセラレーションを使用できます。

Windows コンテナーでの GPU アクセラレーションの詳細については、「Windows コンテナーでの GPU アクセラレーション」をご参照ください。

ステップ 4: Windows ワークロードで GPU アクセラレーションが有効になっていることを確認する

次の方法を使用して、DirectX デバイス プラグインが Windows ノードにデプロイされているかどうかを確認できます。

  1. gpu-job-windows.yaml という名前のファイルを作成し、次のコードをファイルにコピーします。

    apiVersion: batch/v1
    kind: Job
    metadata:
      labels:
        k8s-app: gpu-job-windows
      name: gpu-job-windows
      namespace: default
    spec:
      parallelism: 1
      completions: 1
      backoffLimit: 3
      manualSelector: true
      selector:
        matchLabels:
          k8s-app: gpu-job-windows
      template:
        metadata:
          labels:
            k8s-app: gpu-job-windows
        spec:
          restartPolicy: Never
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: type
                        operator: NotIn
                        values:
                          - virtual-kubelet
                      - key: beta.kubernetes.io/os
                        operator: In
                        values:
                          - windows
                  - matchExpressions:
                      - key: type
                        operator: NotIn
                        values:
                          - virtual-kubelet
                      - key: kubernetes.io/os
                        operator: In
                        values:
                          - windows
          tolerations:
            - key: os
              value: windows
          containers:
            - name: gpu
              # クラスタのリージョンに応じて、以下のイメージアドレスのリージョン情報を変更します。
              image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/sample-gpu-windows:v1.0.0
              imagePullPolicy: IfNotPresent
              resources:
                limits:
                  windows.alibabacloud.com/directx: "1"
                requests:
                  windows.alibabacloud.com/directx: "1"
    説明
    • イメージ registry-{region}-vpc.ack.aliyuncs.com/acs/sample-gpu-windows は、ACK が提供する Windows コンテナでの GPU アクセラレーション用のサンプル イメージです。このイメージは Microsoft Windows 上に構築されています。詳細については、「microsoft-windows」をご参照ください。

    • この例では、WinMLRunner を使用して、シミュレートされた入力データを生成します。gpu-job-windows タスクで GPU アクセラレーションが有効になると、Tiny YOLOv2 モデルに基づいて 100 回の評価が実行され、最終的なパフォーマンス データが出力されます。 実際の結果は、動作環境によって異なる場合があります。

    • イメージ ファイルのサイズは 15.3 GB です。アプリケーションのデプロイに使用する際に、イメージのプルに時間がかかる場合があります。

  2. 次のコマンドを実行して、gpu-job-windows.yaml をデプロイし、サンプル アプリケーションを作成します。

    kubectl create -f gpu-job-windows.yaml
  3. 次のコマンドを実行して、[gpu-job-windows] アプリケーションのログをクエリします。

    kubectl logs -f gpu-job-windows

    予想される出力:

    INFO: Executing model of "tinyyolov2-7" 100 times within GPU driver ...
    
    Created LearningModelDevice with GPU: NVIDIA GRID T4-8Q
    Loading model (path = c:\data\tinyyolov2-7\model.onnx)...
    =================================================================
    Name: Example Model
    Author: OnnxMLTools
    Version: 0
    Domain: onnxconverter-common
    Description: The Tiny YOLO network from the paper 'YOLO9000: Better, Faster, Stronger' (2016), arXiv:1612.08242
    Path: c:\data\tinyyolov2-7\model.onnx
    Support FP16: false
    
    Input Feature Info:
    Name: image
    Feature Kind: Image (Height: 416, Width:  416)
    
    Output Feature Info:
    Name: grid
    Feature Kind: Float

    出力は、[gpu-job-windows] アプリケーションで GPU アクセラレーションが有効になっていることを示しています。