このページの改善にご協力ください
本ユーザーガイドの改善にご協力いただけませんか? すべてのページの右側のペインにある GitHub リンクで、このページの編集を選択してください。皆さまにご協力いただくことで、あらゆる人々に使いやすいユーザーガイドになります。
重要
TensorWorks による DirectX 用 Kubernetes Device Plugin
TensorWorks の DirectX 用 Kubernetes デバイスプラグインで NVIDIA GPU を使用して、Amazon EKS (Elastic Kubernetes Service) で GPU アクセラレーション Windows コンテナワークロードを実行する方法について説明します。詳細については、「Kubernetes Device Plugin for DirectX
Windows コンテナの GPU アクセラレーションをセットアップするには、主に 2 つの方法があります。
-
オプション 1: 必要な GPU ドライバーがプリインストールされたカスタム EKS Windows 最適化 AMI を構築します。
-
このアプローチは、GPU アクセラレーションされた Windows コンテナをすぐに実行できる、一貫性のある事前設定済みの環境が必要で、カスタム AMI を構築して維持するために追加の労力を費やすことができる場合に使用します。
-
-
オプション 2: インスタンスの起動後に、必要な GPU ドライバーを EKS ワーカーノードにインストールします。
-
このアプローチは、より簡単なセットアッププロセスが必要で、新しいワーカーノードそれぞれに GPU ドライバーをインストールしたくない場合に使用します。GPU アクセラレーションのワークロードを評価またはプロトタイプ化する開発環境により適しています。
-
どちらのアプローチも、本ガイドで説明されているステップで活用することができます。
考慮事項
本ガイドでは、NVIDIA GPU、NVIDIA GRID ドライバー、および TensorWorks による DirectX 用 Kubernetes デバイスプラグイン
-
NVIDIA GRID ドライバーを使用する G ファミリーインスタンスタイプのみが、本ガイドで動作することがテストおよび検証されています。他のインスタンスタイプとドライバーの組み合わせでも GPU アクセラレーション Windows コンテナを実行できる場合がありますが、本ガイドでは説明されていない追加の設定手順が必要になる場合があります。
-
DirectX ベースのワークロードのみが、本ガイドで動作することがテストおよび検証されています。OpenGL、Vulkan、OpenCL などの他の GPU API でも、GPU アクセラレーションされた Windows コンテナの実行と互換性がある可能性がありますが、このガイドでは説明されていない追加の設定手順が必要になる場合があります。
-
GPU アクセラレーション Windows コンテナを実行する前に注意すべき既知の制限がいくつかあります。詳細については、既知の制限事項 のセクションを参照してください。
前提条件
Amazon EKS で Windows コンテナの GPU アクセラレーションを有効にするには、手順を進める前に次の要件を準備する必要があります。
-
Kubernetes v1.27 以降で Amazon EKS クラスターを起動します。
-
Windows Server 2022 以降で Windows ノードをプロビジョニングします。
-
containerd
1.7.x
または2.x.x
でコンテナランタイムを使用して Windows ノードをプロビジョニングします。(Amazon EKS 最適化 AMI 内の containerd バージョンを確認するには、「Windows AMI バージョンに関する情報を取得する」を参照してください。)
各 Windows ノードに GPU ドライバーをインストールする
EKS ワーカーノードに NVIDIA GRID ドライバーをインストールするには、Amazon EC2 インスタンスの NVIDIA ドライバーで説明されているステップに従ってください。インストールオプション - オプション 3: GRID ドライバーに移動し、インストール手順に従ってください。
Windows Server Core のためのインストール
デスクトップエクスペリエンスのない Windows Server Core の場合は、次のコマンドを使用して NVIDIA GRID ドライバーをサイレントインストールします。
$nvidiaInstallerFilePath = nvidia-driver-installer.exe # Replace with path to installer
$installerArguments = "-s -clean -noreboot -noeula"
Start-Process -FilePath $nvidiaInstallerFilePath -ArgumentList $installerArguments -Wait -NoNewWindow -PassThru
インストールを確認する
次の PowerShell コマンドを実行して、インスタンスの GPU に関する診断情報を表示します。
nvidia-smi
このコマンドは、NVIDIA ドライバーのバージョンと GPU ハードウェアに関する情報を表示します。このコマンドの出力が、インストールされると想定している NVIDIA GRID ドライバーのバージョンと一致することを確認します。
各ノードに GPU デバイスプラグインをデプロイする
GPU リソースの検出と Windows ノード上のコンテナへの公開を有効にするには、デバイスプラグインが必要になります。EKS クラスターで DaemonSet として実行することで、各ワーカーノードに Tensorworks による DirectX デバイスプラグイン
-
デバイスプラグインを
kube-system
名前空間にデプロイします。 -
DaemonSet に適切なリソース制限を設定して、ノードでリソースを過剰に消費しないようにします。
注記
デバイスプラグイン DaemonSet は、昇格された権限を持つホストプロセスコンテナとしてすべてのノードで実行されます。この DaemonSet へのアクセスを制限する RBAC コントロールを実装して、権限のあるユーザーのみが特権コマンドを実行できるようにすることをお勧めします。
GPU アクセラレーションコンテナを実行する場合、デバイスプラグインは 2 つのモードをサポートします。
-
シングルテナンシーモード: このモードは、すべての GPU リソースをインスタンス上の 1 つのコンテナ専用にします。次のコマンドを使用して、シングルテナンシーをサポートするデバイスプラグインをインストールします。詳細については、「README.md」を参照してください。
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/default-daemonsets.yml"
-
マルチテナンシーモード: このモードでは、インスタンス上の複数のコンテナ間で GPU リソースを共有できます。次のコマンドを使用して、マルチテナンシーをサポートするデバイスプラグインをインストールします。詳細については、「README.md」を参照してください。
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-inline.yml"
または、ConfigMap を使用してマルチテナンシーを指定します。
kubectl apply -f "https://raw.githubusercontent.com/TensorWorks/directx-device-plugins/main/deployments/multitenancy-configmap.yml"
デバイスプラグインのデプロイの検証
デバイスプラグインをデプロイしたら、次のコマンドを実行して、DirectX Device Plugin がすべての Windows ノードで正しく実行されていることを確認します。
kubectl get ds device-plugin-wddm -n
<namespace>
コンテナをデプロイする準備が整っていることの検証
デバイスプラグイン DaemonSet が GPU 搭載の Windows ワーカーノードで実行されると、次のコマンドを使用して、各ノードに割り当て可能な GPU があることを確認します。対応する番号は、各ノードの DirectX デバイスの番号と一致する必要があります。
kubectl get nodes "-o=custom-columns=NAME:.metadata.name,DirectX:.status.allocatable.directx\.microsoft\.com/display"
GPU アクセラレーションを使用した Windows コンテナの実行
ポッドを起動する前に、.spec.containers[].resources
でリソース名 directx.microsoft.com/display
を指定します。これは、コンテナに GPU が対応している機能が必要であることを示し、kube-scheduler
は使用可能な GPU リソースを持つ事前設定された Windows ノードにポッドを配置しようとします。
例として、pi の値を推定するモンテカルロ・シミュレーションを実行する Job
を起動する以下のサンプル・コマンドをご覧ください。この例は、DirectX 用の Kubernetes Device Plugins
cat <<EOF | kubectl apply -f -
apiVersion: batch/v1
kind: Job
metadata:
name: example-cuda-montecarlo-wddm
spec:
template:
spec:
containers:
- name: example-cuda-montecarlo-wddm
image: "index.docker.io/tensorworks/example-cuda-montecarlo:0.0.1"
resources:
limits:
directx.microsoft.com/display: 1
nodeSelector:
"kubernetes.io/os": windows
restartPolicy: Never
backoffLimit: 0
EOF
既知の制限事項
すべての GPU が使用可能です
インスタンスのすべての GPU は、特定のコンテナに対して特定の数の GPU をリクエストした場合でも、ホストで実行中の各コンテナで使用できるようになります。さらに、デフォルトの動作では、ノードで使用可能な複数の GPU がある場合でも、ホストで実行されているすべてのコンテナがインデックス 0 の GPU を使用します。したがって、マルチ GPU タスクを正しく動作させるには、アプリケーションのコード内で使用される特定の GPU デバイスを明示的に指定する必要があります。
アプリケーションに使用するデバイスを割り当てるための正確な実装は、使用しているプログラミング言語やフレームワークによって変わります。例えば、CUDA プログラミングを使用している場合、特定の GPU を選択するために、関数 cudaSetDevice()
デバイスを明示的に指定する必要があるのは、Windows コンテナに影響する既知の問題があるからです。この問題の解決の進捗状況は、microsoft/Windows-Containers の問題 #333
EC2 インスタンスタイプ g4dn.12xlarge
の Windows ノードが 1 つあり、4 つの GPU が搭載されているというシナリオを考えてみましょう。このインスタンスで起動されるポッドが 3 つあるシナリオを考えてみましょう。この表は、各コンテナがリクエストした GPU の数に関係なく、3 つのポッドすべてがインスタンス上の 4 つの GPU すべてにアクセスできることを示しており、デフォルトではデバイスインデックス 0 の GPU を利用できます。
ポッド | リクエストされた GPU | 実際の GPU アクセス | デフォルトの GPU 使用率 | 使用可能な GPU インデックス | インスタンス GPU の合計 |
---|---|---|---|---|---|
Pod 1 |
1 GPU |
すべての 4 GPU |
インデックス 0 の GPU |
0、1、2、3 |
4 |
Pod 2 |
GPU 2 個 |
すべての 4 GPU |
インデックス 0 の GPU |
0、1、2、3 |
4 |
Pod 3 |
1 GPU |
すべての 4 GPU |
インデックス 0 の GPU |
0、1、2、3 |
4 |
Kubernetes デバイスプラグインのサポート
NVIDIA の Kubernetes デバイスプラグイン
GPU コンピューティングインスタンスの制限
AWS アカウント設定によっては、起動できる Amazon EC2 GPU コンピューティングインスタンスの数とタイプにサービス制限がある場合があります。追加の容量が必要な場合は、クォータの引き上げをリクエストできます。
Windows GPU 最適化 AMI を構築する必要があります
Amazon EKS が提供する EKS Windows GPU 最適化 AMI または EC2 Image Builder マネージドコンポーネントはありません。このガイドの手順に従って、必要な GPU ドライバーがプリインストールされたカスタム EKS Windows 最適化 AMI を構築するか、インスタンスの起動後に必要な GPU ドライバーを EKS ワーカーノードにインストールする必要があります。
Inferentia と Trainium はサポートされていません
AWS Inferentia