Container Service for Kubernetes (ACK) は、複数のモデルが 1 つの GPU を共有し、NVIDIA カーネルモードドライバーに基づく GPU メモリ隔離をサポートする GPU 共有機能を提供します。クラスターに GPU 共有コンポーネントがインストールされているが、ノードの GPU ドライバーバージョンまたはオペレーティングシステムバージョンがクラスター内の既存の cGPU バージョンと互換性がない場合は、GPU 共有コンポーネントを最新バージョンにアップグレードする必要があります。このトピックでは、GPU 高速化ノードで GPU 共有コンポーネントを管理して、GPU スケジューリングと隔離機能を実装する方法について説明します。
前提条件
GPU 共有を使用する前に、クラウドネイティブ AI スイートが有効化されている必要があります。課金情報の詳細については、「クラウドネイティブ AI スイートの課金」をご参照ください。
ACK マネージドクラスターが作成され、インスタンスタイプのアーキテクチャが [Elastic GPU Service] に設定されていること。
制限事項
GPU 共有が有効になっているノードでは、CPU ポリシーを
staticに設定しないでください。KubeConfig ファイルのカスタムパスを指定するには、
export KUBECONFIG=<kubeconfig>コマンドを実行します。kubectl inspect cgpuコマンドは--kubeconfigパラメーターをサポートしていないことにご注意ください。cGPU を使用して GPU リソースを隔離する場合、Unified Virtual Memory (UVM) を使用して GPU メモリをリクエストすることはできません。したがって、Compute Unified Device Architecture (CUDA) API の cudaMallocManaged() を呼び出して GPU メモリをリクエストすることはできません。他のメソッドを使用して GPU メモリをリクエストできます。たとえば、cudaMalloc() を呼び出すことができます。詳細については、「Unified Memory for CUDA Beginners」をご参照ください。
共有 GPU の DaemonSet によって管理される Pod は、最も高い優先度を持ちません。したがって、リソースはより高い優先度の Pod にスケジュールされる可能性があり、ノードは DaemonSet によって管理される Pod を退去させる可能性があります。この問題を回避するには、共有 GPU の実際の DaemonSet を変更します。たとえば、GPU メモリを共有するために使用される
gpushare-device-plugin-dsDaemonSet を変更し、priorityClassName: system-node-criticalを指定して、DaemonSet によって管理される Pod の優先度を確保できます。パフォーマンスの最適化のため、cGPU を使用する場合、GPU ごとに最大 20 個の Pod を作成できます。作成された Pod の数がこの制限を超えると、同じ GPU にスケジュールされた後続の Pod は実行に失敗し、
Error occurs when creating cGPU instance: unknownというエラーが返されます。GPU 共有コンポーネントはリージョンの制限なくインストールできます。ただし、GPU メモリの隔離は、次の表に記載されているリージョンでのみサポートされています。ACK クラスターがこれらのリージョンのいずれかにデプロイされていることを確認してください。
バージョン要件。
構成
バージョン要件
Kubernetes バージョン
ack-ai-installer コンポーネントのバージョンが 1.12.0 未満の場合、Kubernetes 1.18.8 以降がサポートされます。
ack-ai-installer コンポーネントのバージョンが 1.12.0 以降の場合、Kubernetes 1.20 以降のみがサポートされます。
NVIDIA ドライバーバージョン
≥ 418.87.01
コンテナーランタイムバージョン
Docker: ≥ 19.03.5
containerd: ≥ 1.4.3
オペレーティングシステム
Alibaba Cloud Linux 3.x (コンテナー最適化 OS には ack-ai-installer コンポーネントバージョン 1.12.6 以降が必要)、Alibaba Cloud Linux 2.x、CentOS 7.6、CentOS 7.7、CentOS 7.9、Ubuntu 22.04
GPU モデル
NVIDIA P、NVIDIA T、NVIDIA V、NVIDIA A、および NVIDIA H シリーズ
GPU 共有コンポーネントのインストール
ステップ 1: GPU 共有コンポーネントをインストールする
クラウドネイティブ AI スイートがデプロイされていない場合
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[クラウドネイティブ AI スイート] ページで、[デプロイ] をクリックします。
[クラウドネイティブ AI スイートのデプロイ] ページで、[スケジューリングポリシー拡張 (バッチタスクスケジューリング、GPU 共有、トポロジー対応 GPU スケジューリング)] を選択します。
(オプション) [スケジューリングポリシー拡張 (バッチタスクスケジューリング、GPU 共有、トポロジー対応 GPU スケジューリング)] の右側にある [詳細設定] をクリックします。[パラメーター] パネルで、cGPU の
policyパラメーターを変更します。変更が完了したら、[OK] をクリックします。cGPU が提供する計算能力共有機能の要件がない場合は、ネイティブスケジューリングであるデフォルト設定の
policy: 5を使用することをお勧めします。cGPU でサポートされているポリシーの詳細については、「cGPU のインストールと使用」をご参照ください。
[クラウドネイティブ AI スイート] ページの下部で、[クラウドネイティブ AI スイートのデプロイ] をクリックします。
コンポーネントがインストールされると、[クラウドネイティブ AI スイート] ページのコンポーネントリストに、インストールされた GPU 共有コンポーネント [ack-ai-installer] が表示されます。
クラウドネイティブ AI スイートがデプロイされている場合
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ack-ai-installer] コンポーネントを見つけ、[アクション] 列の [デプロイ] をクリックします。
(オプション) [パラメーター] パネルで、cGPU の
policyパラメーターを変更します。cGPU が提供する計算能力共有機能の要件がない場合は、ネイティブスケジューリングであるデフォルト設定の
policy: 5を使用することをお勧めします。cGPU でサポートされているポリシーの詳細については、「cGPU のインストールと使用」をご参照ください。
変更が完了したら、[OK] をクリックします。
コンポーネントがインストールされると、[ack-ai-installer] の [ステータス] が [デプロイ済み] に変わります。
ステップ 2: GPU 共有と GPU メモリ隔離を有効にする
クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ノードプール] ページで、[ノードプールの作成] をクリックします。ノードプールの構成方法の詳細については、「ノードプールの作成と管理」をご参照ください。
[ノードプールの作成] ページで、パラメーターを構成してノードプールを作成し、[確認] をクリックします。次の表に、主要なパラメーターを示します。
パラメーター
説明
期待されるノード数
ノードプール内のノードの初期数。ノードプールにノードを作成したくない場合は、このパラメーターを 0 に設定します。
ノードラベル
ビジネス要件に基づいてラベルを追加します。ノードラベルの詳細については、「GPU ノードモデルの仕様とスケジューリングラベルのガイドライン」をご参照ください。
次の例では、ラベルの値が cgpu に設定されており、ノードで GPU 共有が有効になっていることを示します。ノード上の Pod は GPU メモリのみをリクエストする必要があります。複数の Pod が同じ GPU を共有して、GPU メモリの隔離と計算能力の共有を実装できます。
[ノードラベル] の横にある
アイコンをクリックし、[キー] を ack.node.gpu.scheduleに、[値] をcgpuに設定します。重要cGPU が提供するメモリ隔離機能を使用する際の一般的な問題の詳細については、「cGPU よくある質問」をご参照ください。
GPU 共有を有効にするためのラベルをノードに追加した後、
kubectl label nodesコマンドを実行してラベル値を変更したり、ACK コンソールの [ノード] ページでラベル管理機能を使用してノードラベルを変更したりしないでください。これにより、潜在的な問題を防ぐことができます。これらの潜在的な問題の詳細については、「kubectl label nodes コマンドを使用するか、ラベル管理機能を使用して ACK コンソールでラベル値を変更した場合に発生する可能性のある問題」をご参照ください。ノードプールに基づいて GPU 共有を構成することをお勧めします。
ステップ 3: GPU 高速化ノードを追加する
ノードプールを作成する際にすでに GPU 高速化ノードをノードプールに追加している場合は、このステップをスキップしてください。
ノードプールが作成された後、GPU 高速化ノードをノードプールに追加できます。GPU 高速化ノードを追加するには、インスタンスタイプのアーキテクチャを [Elastic GPU Service] に設定する必要があります。詳細については、「既存の ECS インスタンスの追加」または「ノードプールの作成と管理」をご参照ください。
ステップ 4: GPU 検査ツールをインストールして使用する
kubectl-inspect-cgpu をダウンロードします。実行可能ファイルは、PATH 環境変数に含まれるディレクトリにダウンロードする必要があります。この例では、
/usr/local/bin/が使用されます。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-cgpumacOS を使用している場合は、次のコマンドを実行して 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%)
GPU 共有コンポーネントの更新
ステップ 1: GPU 共有コンポーネントの更新方法を決定する
クラスターに GPU 共有コンポーネント (ack-ai-installer) がどのようにインストールされたかに基づいて、更新方法を選択する必要があります。GPU 共有コンポーネントをインストールするには 2 つの方法があります。
クラウドネイティブ AI スイートの使用 (推奨): [クラウドネイティブ AI スイート] ページで GPU 共有コンポーネント ack-ai-installer をインストールします。
アプリカタログの使用 (この方法は利用できなくなりました): [マーケットプレイス] の [アプリカタログ] ページで GPU 共有コンポーネント ack-ai-installer をインストールします。このインストール方法は利用できなくなりました。ただし、この方法ですでにインストールされているコンポーネントについては、引き続きこの方法で更新できます。
重要この方法でインストールされたコンポーネントをクラスターからアンインストールした場合、コンポーネントを再インストールする際には、クラウドネイティブ AI スイートサービスを有効にしてインストールを完了する必要があります。
ステップ 2: コンポーネントを更新する
クラウドネイティブ AI スイートによる更新
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[コンポーネント] セクションで、[ack-ai-installer] コンポーネントを見つけ、[アクション] 列の [アップグレード] をクリックします。
アプリカタログによる更新
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
Helm リストで ack-ai-installer コンポーネントを見つけ、[アクション] 列の [更新] をクリックします。ページの指示に従って最新のチャートバージョンを選択し、コンポーネントの更新を完了します。
重要チャート構成をカスタマイズする場合は、構成を変更した後にコンポーネントの更新を確認してください。
更新後、Helm リストを確認して、ack-ai-installer コンポーネントのチャートバージョンが最新バージョンであることを確認します。
ステップ 3: 既存のノードを更新する
[ack-ai-installer] コンポーネントが更新された後、既存のノードの cGPU バージョンは自動的に更新されません。ノードで cGPU 隔離が有効になっているかどうかを判断するには、次の手順を参照してください。
クラスターに cGPU 隔離が有効になっている GPU 高速化ノードが含まれている場合は、これらの既存のノードで cGPU バージョンを更新する必要があります。詳細については、「ノード上の cGPU バージョンを更新する」をご参照ください。
クラスターに cGPU 隔離が有効になっているノードが含まれていない場合は、このステップをスキップしてください。
説明ノードに
ack.node.gpu.schedule=cgpuまたはack.node.gpu.schedule=core_memラベルがある場合、そのノードでは cGPU 隔離が有効になっています。既存のノードで cGPU バージョンを更新するには、ノード上のすべてのアプリケーション Pod を停止する必要があります。ビジネスシナリオに基づいて、オフピーク時にこの操作を実行してください。