Container Service for Kubernetes (ACK) は、複数のモデルが1つのGPUを共有できるようにするGPU共有機能を提供し、NVIDIAカーネルモードドライバーに基づくGPUメモリの分離をサポートします。 このトピックでは、GPU共有コンポーネントとGPU検査ツールをGPU高速化ノードにインストールして、GPU共有とGPUメモリの分離をサポートする方法について説明します。
前提条件
GPU共有を使用する前に、クラウドネイティブAIスイートがアクティブ化されます。 クラウドネイティブAIスイートとその課金方法の詳細については、「クラウドネイティブAIスイートの概要」および「クラウドネイティブAIスイートの課金」をご参照ください。
ACK Proクラスターが作成されました。 ACK Proクラスターを作成するときは、[ノードプールの設定] の [インスタンスタイプ] の [GPUアクセラレーション] アーキテクチャを選択します。 詳細については、「ACK管理クラスターの作成」をご参照ください。
制限事項
GPU共有が有効になっているノードでは、CPUポリシーを
静的
に設定しないでください。cGPUは
CUDA API cudaMallocManaged()
をサポートしていません。 これは、cGPUでは、Unified Virtual memory (UVM) メソッドを使用してGPUメモリを要求できないことを示しています。 GPUメモリを要求するには、cudaMalloc()
などの別のメソッドを使用する必要があります。 詳細については、NVIDIA公式Webサイトをご覧ください。共有GPUのDaemonSetによって管理されるポッドは、最高の優先順位を享受しません。 したがって、リソースは、より高い優先度を有するポッドにスケジュールされ得、ノードは、DaemonSetによって管理されるポッドを追い出し得る。 この問題を防ぐには、共有GPUの実際のDaemonSetを変更します。 たとえば、GPUメモリの共有に使用する
gpushare-device-plugin-ds
DaemonSetを変更し、priorityClassName: system-node-critical
を指定して、DaemonSetによって管理されるポッドの優先度を確保できます。リージョン制限なしでGPU共有コンポーネントをインストールできます。 ただし、GPUメモリ分離は、次の表に示すリージョンでのみサポートされます。 ACKクラスターがいずれかのリージョンにデプロイされていることを確認します。
バージョン要件
項目
バージョン要件
Kubernetes バージョン
1.18.8以降
NVIDIAドライバーのバージョン
418.87.01以降
Container runtimeバージョン
Docker: 19.03.5以降
containerd: 1.4.3またはそれ以降
オペレーティングシステム
Alibaba Cloud Linux 3.x、Alibaba Cloud Linux 2.x、CentOS 7.6、CentOS 7.7、およびCentOS 7.9
GPUモデル
NVIDIA P、NVIDIA T、NVIDIA V、NVIDIA A、およびNVIDIA Hシリーズ
ステップ1: GPU共有コンポーネントのインストール
クラウドネイティブAIスイートがデプロイされていません
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
[クラウドネイティブAI Suite] ページで、[デプロイ] をクリックします。
クラウドネイティブAI Suiteページで、[スケジューリングコンポーネント (バッチタスクスケジューリング、GPU共有、トポロジ対応GPUスケジューリング、およびNPUスケジューリング) を選択します。
必要に応じて、 [スケジューリングコンポーネント (バッチタスクスケジューリング、GPU共有、トポロジ対応GPUスケジューリング、およびNPUスケジューリング) の右側にある [詳細設定] をクリックします。 [パラメーター] パネルで、cGPUの
policy
パラメーターを変更します。 [OK] をクリックします。cGPUが提供するコンピューティング能力共有機能に関する要件がない場合は、デフォルトの設定
policy: 5
を使用することを推奨します。 cGPUでサポートされているポリシーの詳細については、「DockerコンテナーへのcGPUのインストールと使用」をご参照ください。[クラウドネイティブAIスイート] ページの下部で、[クラウドネイティブAIスイートのデプロイ] をクリックします。
クラウドネイティブAIスイートがインストールされた後、[クラウドネイティブaiスイート] ページでack-AI-installerが [デプロイ済み] 状態になっていることがわかります。
クラウドネイティブAIスイートがデプロイされました
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、 を選択します。
ack-ai-installerを見つけ、[操作] 列の [デプロイ] をクリックします。
必要に応じて、 [パラメーター] パネルで、cGPUの
policy
パラメーターを変更します。cGPUが提供するコンピューティング能力共有機能に関する要件がない場合は、デフォルトの設定
policy: 5
を使用することを推奨します。 cGPUでサポートされているポリシーの詳細については、「DockerコンテナーへのcGPUのインストールと使用」をご参照ください。構成を完了すると、OK をクリックします。
ack-ai-installerをインストールすると、コンポーネントの状態がデプロイ済みに変わります。
ステップ2: GPU共有とGPUメモリの分離を有効にする
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
右上隅のノードプールページでノードプールの作成をクリックします。
[ノードプールの作成] ダイアログボックスで、ノードプールを作成するパラメーターを設定し、[注文の確認] をクリックします。
次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「ノードプールの作成」をご参照ください。
パラメーター
説明
期待されるノード
ノードプール内の初期ノード数。 ノードプールにノードを作成しない場合は、このパラメーターを0に設定します。
ノードラベル
ビジネス要件に基づいてノードプールに追加するラベル。 ノードラベルの詳細については、「GPUスケジューリングポリシーを有効にするためのラベルとラベル値の変更方法」をご参照ください。
この例では、ラベルの値はcgpuに設定されています。これは、ノードに対してGPU共有が有効になっていることを示します。 ノード上のポッドはGPUメモリのみを要求する必要があります。 複数のポッドが同じGPUを共有して、GPUのメモリ分離とコンピューティング能力の共有を実装できます。
[Node Label] パラメーターの横にあるアイコンをクリックし、[Key] フィールドをack.node.gpu.scheduleに設定し、[Value] フィールドをcgpuに設定します。
重要GPU共有を有効にするためのラベルをノードに追加した後、
kubectl label nodes
コマンドを実行してラベル値を変更したり、ラベル管理機能を使用してACKコンソールの [ノード] ページでノードラベルを変更したりしないでください。 これは潜在的な問題を防ぎます。 詳細については、「GPUスケジューリングポリシーを有効にするためのラベル」トピックの「kubectl label nodesコマンドを使用するか、ACKコンソールでラベル管理機能を使用してラベル値を変更する場合に発生する可能性のある問題」をご参照ください。 ノードプールに基づいてGPU共有を設定することを推奨します。 詳細については、「GPUスケジューリングポリシーを有効にするためのラベル」トピックの「ノードプールのGPUスケジューリングポリシーの設定」セクションをご参照ください。
ステップ3: GPU高速化ノードの追加
ノードプールの作成時に、GPUアクセラレーションノードをノードプールに既に追加している場合は、この手順をスキップしてください。
ノードプールが作成されたら、GPUアクセラレーションノードをノードプールに追加できます。 GPU高速化ノードを追加するには、GPU高速化アーキテクチャを使用するECSインスタンスを選択する必要があります。 詳細については、「既存のECSインスタンスをACKクラスターに追加する」または「ノードプールの作成」をご参照ください。
ステップ4: GPUインスペクションツールをインストールして使用する
kubectl-inspect-cgpuのダウンロード.
Linuxを使用している場合は、次のコマンドを実行してkubectl-inspect-cgpuをダウンロードします。
wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-linux -O /usr/local/bin/kubectl-inspect-cgpu
macOSを使用している場合は、次のコマンドを実行してkubectl-inspect-cgpuをダウンロードします。
wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-darwin -O /usr/local/bin/kubectl-inspect-cgpu
次のコマンドを実行して、kubectl-inspect-cgpuに実行権限を付与します。
chmod +x /usr/local/bin/kubectl-inspect-cgpu
次のコマンドを実行して、クラスターのGPU使用状況を照会します。
kubectl inspect cgpu
期待される出力:
NAME IPADDRESS GPU0(Allocated/Total) GPU Memory(GiB) cn-shanghai.192.168.6.104 192.168.6.104 0/15 0/15 ---------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 0/15 (0%)