GPUは、Windowsノードのワークロードに対してCPUよりも高い並列計算能力を提供し、操作を数桁高速化できます。 これにより、コストが削減され、スループットが向上します。 Windowsコンテナーは、Direct eXtension (DirectX) およびDirectX上に構築されたすべてのフレームワークのGPUアクセラレーションをサポートしています。 このトピックでは、DirectXデバイスプラグインをWindowsノードにインストールする方法と、DirectXのGPUアクセラレーションを有効にする方法について説明します。
前提条件
Container Service for Kubernetes (ACK) マネージドクラスターが作成され、Kubernetesのバージョンは1.20.4以降です。 詳細については、「ACK管理クラスターの作成」をご参照ください。
kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
概要
DirectXは、Windowsベースのゲームやマルチメディアプログラムの実行効率を向上させ、3Dグラフィックスとサウンドエフェクトを強化するAPIの一種です。 デザイナーに共通のハードウェアドライバー標準を提供し、インストールとセットアップを簡素化します。 DirectXを使用すると、GPUを使用して並列およびコンピューティング集約型のタスクを処理できます。 また、過負荷を軽減し、並列プロセッサとしてのGPUの使用を最適化します。
ステップ1: GPUアクセラレーションを使用したエラスティックWindowsノードプールの作成
標準のWindowsノードプールを作成する
ライセンスでGRIDドライバーを有効にします。 GRIDドライバーは、次の2つの方法でインストールできます。
NVIDIAのエンタープライズユーザーの場合は、NVIDIAエンタープライズライセンスサイトからGRIDドライバーをダウンロードしてインストールできます。
NVIDIAのエンタープライズユーザーでない場合は、Alibaba Cloudが提供する「ドライバーにプリインストールされたコミュニティイメージを使用してGRIDドライバーを読み込む」を使用できます。
次の要件を満たすWindowsノードプールを作成します。 詳細については、「Windowsノードプールの作成」をご参照ください。
インスタンスタイプ: GPU高速化コンピューティング最適化インスタンスタイプまたはvGPU高速化インスタンスタイプ。 サポートされているインスタンスタイプの詳細については、「GPU高速化コンピューティング最適化インスタンスファミリー」または「vGPU高速化インスタンスファミリー」をご参照ください。
オペレーティングシステム: ビジネス要件に基づいてOSを選択します。 例: Windows Server 2022
エラスティックなWindowsノードプールを作成する
ACKは、デフォルトでECSパブリックイメージのみをノードイメージとして使用できます。 エラスティックなWindowsノードを作成するには、カスタムイメージを使用する必要があります。 プロセスは次のとおりです。
チケットを起票し、ライセンスが有効化されたGRIDドライバーで共有Windowsイメージをリクエストします。 Windows Server 2019とWindows Server 2022のみがサポートされます。 他の要件がある場合は、チケットでWindowsのバージョンを指定します。
次の要件を満たすWindowsノードプールを作成します。 詳細については、「Windowsノードプールの作成」をご参照ください。
インスタンスタイプ: GPU高速化コンピューティング最適化インスタンスタイプまたはvGPU高速化インスタンスタイプ。 サポートされているインスタンスタイプの詳細については、「GPU高速化コンピューティング最適化インスタンスファミリー」または「vGPU高速化インスタンスファミリー」をご参照ください。
オペレーティングシステム: ビジネス要件に基づいてOSを選択します。 例: Windows Server 2022
カスタムイメージ: 要求したイメージを選択します。
ステップ2: DirectXデバイスのプラグインをWindowsノードにインストールする
DirectXデバイスプラグインをDaemonSetとしてWindowsノードにデプロイします。
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
次のコマンドを実行して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ノードに展開されているかどうかを確認できます。
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であり、アプリケーションのデプロイに使用する場合、イメージのプルに時間がかかる場合があります。
次のコマンドを実行してgpu-job-windows.yamlをデプロイし、サンプルアプリケーションを作成します。
kubectl create -f gpu-job-windows.yaml
次のコマンドを実行して、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アクセラレーションが有効になっていることを示しています。