コンピューティング集中型ワークロードに GPU を使用する

適用対象: AKS on Azure Stack HCI 22H2、AKS on Windows Server

グラフィカル処理ユニット (GPU) は、機械学習、ディープ ラーニングなどのコンピューティング集中型ワークロードに使用されます。 この記事では、Azure Arc で有効になっている AKS でコンピューティング集中型ワークロードに GPU を使用する方法について説明します。

開始する前に

GPU 対応ノード プールを実行している 2022 年 10 月より前のプレビュー バージョンから AKS を更新する場合は、開始する前に、GPU を実行しているすべてのワークロード クラスターを削除してください。 このセクションの手順に従います。

手順 1: Nvidia ホスト ドライバーをアンインストールする

各ホスト コンピューターで、[プログラムの追加と削除] コントロール パネル>移動し、NVIDIA ホスト ドライバーをアンインストールしてから、コンピューターを再起動します。 マシンが再起動したら、ドライバーが正常にアンインストールされたことを確認します。 管理者特権の PowerShell ターミナルを開き、次のコマンドを実行します。

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video" 

次の出力例に示すように、GPU デバイスがエラー状態で表示されます。

Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Error       3D Video Controller                   PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

手順 2: ホスト ドライバーをホストからマウント解除する

ホスト ドライバーをアンインストールすると、物理 GPU がエラー状態になります。 すべての GPU デバイスをホストからマウント解除する必要があります。

GPU (3D ビデオ コントローラー) デバイスごとに、PowerShell で次のコマンドを実行します。 インスタンス ID をコピーします。たとえば、 PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 前のコマンド出力から次のようになります。

$id1 = "<Copy and paste GPU instance id into this string>"
$lp1 = (Get-PnpDeviceProperty -KeyName DEVPKEY_Device_LocationPaths -InstanceId $id1).Data[0]
Disable-PnpDevice -InstanceId $id1 -Confirm:$false
Dismount-VMHostAssignableDevice -LocationPath $lp1 -Force

GPU がホストから正しくマウント解除されたことを確認するには、次のコマンドを実行します。 GPU は次の状態にする Unknown 必要があります。

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"3d video"
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
Unknown       3D Video Controller               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000 

手順 3: NVIDIA 軽減ドライバーをダウンロードしてインストールする

このソフトウェアには、NVIDIA Corporation またはそのライセンサーによって開発および所有されているコンポーネントが含まれる場合があります。 これらのコンポーネントの使用は、 NVIDIA エンド ユーザー ライセンス契約によって管理されます。

NVIDIA 軽減ドライバーをダウンロードするには、 NVIDIA データ センターのドキュメントを参照してください 。 ドライバーをダウンロードした後、アーカイブを展開し、各ホスト コンピューターに軽減ドライバーをインストールします。

Invoke-WebRequest -Uri "https://docs.nvidia.com/datacenter/tesla/gpu-passthrough/nvidia_azure_stack_inf_v2022.10.13_public.zip" -OutFile "nvidia_azure_stack_inf_v2022.10.13_public.zip"
mkdir nvidia-mitigation-driver
Expand-Archive .\nvidia_azure_stack_inf_v2022.10.13_public.zip .\nvidia-mitigation-driver\

軽減ドライバーをインストールするには、抽出されたファイルを含むフォルダーに移動し、 nvidia_azure_stack_T4_base.inf ファイルを右クリックして、[インストール] を選択 します。 正しいドライバーがあることを確認します。AKS では現在、NVIDIA Tesla T4 GPU のみがサポートされています。

フォルダーに移動し、次のコマンドを実行して軽減ドライバーをインストールすることで、コマンド ラインを使用してインストールすることもできます。

pnputil /add-driver nvidia_azure_stack_T4_base.inf /install 
pnputil /scan-devices 

軽減ドライバーをインストールすると、GPU は [Nvidia T4_base - マウント解除] の下の [OK] 状態に一覧表示されます。

Get-PnpDevice  | select status, class, friendlyname, instanceid | findstr /i /c:"nvidia"
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&32EEF88F&0&0000 
OK       Nvidia T4_base - Dismounted               PCI\VEN_10DE&DEV_1EB8&SUBSYS_12A210DE&REV_A1\4&3569C1D3&0&0000

手順 4: 手順 1 から 3 を繰り返す

フェールオーバー クラスター内のノードごとに手順 1 から 3 を繰り返します。

重要

GPU 対応仮想マシンは、Windows Server 2019、Windows Server 2022、または Azure Stack HCI のフェールオーバー クラスタリングには追加されません。

AKS のインストールまたは更新

PowerShell を使用するか、Windows Admin Centerを使用して Arc で有効になっている AKS をインストールまたは更新する AKS クイック スタートを参照してください。

GPU 対応ノード プールを使用して新しいワークロード クラスターをCreateする

現在、GPU 対応ノード プールの使用は Linux ノード プールでのみ使用できます。

New-AksHciCluster -Name "gpucluster" -nodePoolName "gpunodepool" -nodeCount 2 -osType linux -nodeVmSize Standard_NK6 

ワークロード クラスターをインストールした後、次のコマンドを実行して Kubeconfig を取得します。

Get-AksHciCredential -Name gpucluster

GPU をスケジュールできることを確認する

GPU ノード プールを作成したら、Kubernetes で GPU をスケジュールできることを確認します。 まず、kubectl get nodes コマンドを使用して、クラスター内のノードを一覧表示します。

kubectl get nodes
NAME             STATUS  ROLES                 AGE   VERSION
moc-l9qz36vtxzj  Ready   control-plane,master  6m14s  v1.22.6
moc-lhbkqoncefu  Ready   <none>                3m19s  v1.22.6
moc-li87udi8l9s  Ready   <none>                3m5s  v1.22.6

次に、 kubectl describe node コマンドを使用して、GPU をスケジュールできることを確認します。 [ 容量 ] セクションの下に、GPU は nvidia.com/gpu: 1 として表示されます。

kubectl describe <node> | findstr "gpu" 

出力にはワーカー ノードからの GPU が表示され、次のようになります。

         nvidia.com/gpu.compute.major=7
         nvidia.com/gpu.compute.minor=5
         nvidia.com/gpu.count=1
         nvidia.com/gpu.family=turing
         nvidia.com/gpu.machine=Virtual-Machine
         nvidia.com/gpu.memory=16384
         nvidia.com/gpu.product=Tesla-T4
Annotations:    cluster.x-k8s.io/cluster-name: gpucluster
                cluster.x-k8s.io/machine: gpunodepool-md-58d9b96dd9-vsdbl
                cluster.x-k8s.io/owner-name: gpunodepool-md-58d9b96dd9
         nvidia.com/gpu:   1
         nvidia.com/gpu:   1
ProviderID:         moc://gpunodepool-97d9f5667-49lt4
kube-system         gpu-feature-discovery-gd62h       0 (0%)    0 (0%)   0 (0%)      0 (0%)     7m1s
         nvidia.com/gpu   0     0

GPU 対応ワークロードの実行

前の手順を完了したら、テスト用の新しい YAML ファイルを作成します。たとえば、 gpupod.yaml です。 次の YAML をコピーして gpupod.yaml という名前の新しいファイルに貼り付け、保存します。

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda-vector-add
    image: "k8s.gcr.io/cuda-vector-add:v0.1"
    resources:
      limits:
        nvidia.com/gpu: 1

次のコマンドを実行して、サンプル アプリケーションをデプロイします。

kubectl apply -f gpupod.yaml

ポッドが起動し、実行が完了し、GPU が割り当てられていることを確認します。

kubectl describe pod cuda-vector-add | findstr 'gpu'

前のコマンドには、1 つの GPU が割り当てられていると表示されます。

nvidia.com/gpu: 1
nvidia.com/gpu: 1

ポッドのログ ファイルを調べて、テストが成功したかどうかを確認します。

kubectl logs cuda-vector-add

前のコマンドからの出力例を次に示します。

[Vector addition of 50000 elements]
Copy input data from the host memory to the CUDA device
CUDA kernel launch with 196 blocks of 256 threads
Copy output data from the CUDA device to the host memory
Test PASSED
Done

"CUDA ドライバーのバージョンが CUDA ランタイム バージョンでは不十分です" など、ドライバーを呼び出すときにバージョンの不一致エラーが発生する場合は、 NVIDIA ドライバー マトリックスの互換性グラフを確認してください。

よく寄せられる質問

GPU 対応ノード プールのアップグレード中はどうなりますか?

GPU 対応ノード プールのアップグレードは、通常のノード プールに使用されるのと同じローリング アップグレード パターンに従います。 新しい VM 内の GPU 対応ノード プールを物理ホスト マシンで正常に作成するには、デバイスの割り当てを成功させるために 1 つ以上の物理 GPU を使用できる必要があります。 この可用性により、Kubernetes がこのアップグレードされたノードでポッドをスケジュールするときに、アプリケーションの実行を続行できます。

アップグレードする前に:

  1. アップグレード中のダウンタイムを計画します。
  2. Standard_NK6を実行している場合は物理ホストごとに 1 つの GPU を追加し、Standard_NK12を実行している場合は 2 つの GPU を追加します。 完全な容量で実行していて、追加の GPU がない場合は、アップグレードの前にノード プールを 1 つのノードにスケールダウンしてから、アップグレードが成功した後にスケールアップすることをお勧めします。

アップグレード中に物理マシンに追加の物理 GPU がない場合はどうなりますか?

ローリング アップグレードを容易にするために、追加の GPU リソースがないクラスターでアップグレードがトリガーされた場合、アップグレード プロセスは GPU が使用可能になるまでハングします。 完全な容量で実行し、追加の GPU がない場合は、アップグレードの前にノード プールを 1 つのノードにスケールダウンしてから、アップグレードが成功した後にスケールアップすることをお勧めします。

次の手順