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

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

最終更新日:Dec 06, 2024

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

前提条件

概要

DirectXは、Windowsベースのゲームやマルチメディアプログラムの実行効率を向上させ、3Dグラフィックスとサウンドエフェクトを強化するAPIの一種です。 デザイナーに共通のハードウェアドライバー標準を提供し、インストールとセットアップを簡素化します。 DirectXを使用すると、GPUを使用して並列およびコンピューティング集約型のタスクを処理できます。 また、過負荷を軽減し、並列プロセッサとしてのGPUの使用を最適化します。

ステップ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ノードプールを作成します。 詳細については、「Windowsノードプールの作成」をご参照ください。

    1. インスタンスタイプ: GPU高速化コンピューティング最適化インスタンスタイプまたはvGPU高速化インスタンスタイプ。 サポートされているインスタンスタイプの詳細については、「GPU高速化コンピューティング最適化インスタンスファミリー」または「vGPU高速化インスタンスファミリー」をご参照ください。

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

    3. カスタムイメージ: 要求したイメージを選択します。

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

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

  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
          # since 1.18, we can specify "hostNetwork: true" for Windows workloads, so we can deploy an application without 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
              # Modify the region information in the image address below according to the region of your cluster.
              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デバイスプラグインは、class/<interface class GUID> デバイスをWindowsコンテナに自動的に追加して、Elastic Compute Service (ECS) ホスト上のDirectXサービスにアクセスできるようにします。 詳細については、「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
              # Modify the region information in the image address below according to the region of your cluster.
              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"
    説明
    • イメージレジストリ-{regio n}-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アクセラレーションが有効になっていることを示しています。