GPU は、Windows ノードのワークロードに対して CPU よりも高い並列計算能力を提供し、処理速度を桁違いに向上させることができます。そのため、GPU のスループットが向上します。 Windows コンテナーは、Direct eXtension(DirectX)上に構築されたフレームワークの GPU アクセラレーションをサポートしています。 このトピックでは、Windows ノードに DirectX デバイス プラグインをインストールする方法と、DirectX の GPU アクセラレーションを有効にする方法について説明します。
前提条件
Container Service for Kubernetes(ACK)マネージドクラスターが作成済みであり、クラスターの Kubernetes バージョンが 1.20.4 以降である。
概要
DirectX は、Windows ベースのゲームやマルチメディア アプリケーションのパフォーマンスを向上させながら、3D グラフィックスと効果音を強化する API のスイートです。統一されたハードウェアドライバー標準を提供し、インストールとセットアップを簡素化します。DirectX を使用すると、GPU を使用して 並列および 計算量の多いタスクを処理できます。また、CPU 負荷も軽減します。
手順 1:GPU アクセラレーションを有効にしたエラスティック Windows ノードプールを作成する
標準 Windows ノードプールを作成する
ライセンスを使用して GRID ドライバーをアクティブ化します。GRID ドライバーは、次の 2 つの方法でインストールできます。
NVIDIA のエンタープライズ ユーザーの場合は、NVIDIA エンタープライズ ライセンス サイトから GRID ドライバーをダウンロードしてインストールできます。
NVIDIA のエンタープライズ ユーザーでない場合は、Alibaba Cloud が提供する ドライバーがプリインストールされているコミュニティ イメージを使用して GRID ドライバーを読み込むことができます。
次の要件を満たす Windows ノードプールを作成します。詳細については、「Windows ノードプールを作成する」をご参照ください。
インスタンスタイプ:GPU コンピューティング最適化インスタンスタイプまたは GPU 仮想化インスタンスタイプ。サポートされているインスタンスタイプの詳細については、「GPU コンピューティング最適化インスタンスファミリ(gn、ebm、scc シリーズ)」または「GPU 仮想化インスタンスファミリ(vgn および sgn シリーズ)」をご参照ください。
オペレーティング システム:Windows Server 2019 のみ。
エラスティック Windows ノードプールを作成する
ACK は、デフォルトでは ECS パブリックイメージをノードイメージとして使用することのみをサポートしています。エラスティック Windows ノードを作成するには、カスタムイメージを使用する必要があります。プロセスは次のとおりです。
チケットを送信するして、ライセンスがアクティブ化された GRID ドライバーを含む共有 Windows イメージをリクエストします。Windows Server 2019 と Windows Server 2022 のみサポートされています。他の要件がある場合は、チケットに Windows のバージョンを指定してください。
次の要件を満たす Windows ノードプールを作成します。
インスタンスタイプ:GPU コンピューティング最適化インスタンスタイプまたは GPU 仮想化インスタンスタイプ。サポートされているインスタンスタイプの詳細については、「GPU コンピューティング最適化インスタンスファミリ(gn、ebm、scc シリーズ)」または「GPU 仮想化インスタンスファミリ(vgn および sgn シリーズ)」をご参照ください。
オペレーティング システム:ビジネス要件に基づいて OS を選択します。例:Windows Server 2022。
カスタムイメージ:リクエストしたイメージを選択します。
手順 2:Windows ノードに DirectX デバイス プラグインをインストールする
Windows ノードに DaemonSet として DirectX デバイス プラグインをデプロイします。
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次のコマンドを実行して、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 ノードにデプロイされているかどうかを確認できます。
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 です。アプリケーションのデプロイに使用する際に、イメージのプルに時間がかかる場合があります。
次のコマンドを実行して、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 アクセラレーションが有効になっていることを示しています。