マルチコアCPUを備えたマシンでは、メッセージパッシングインタフェース (MPI) プロセスは、通常、並列処理を容易にするために異なるCPUコアにわたって分散される。 ただし、これらのプロセスが計算の高速化のためにCompute Unified Device Architecture (CUDA) カーネルを使用すると、GPUアクセスと競合し、不適切な割り当てやGPUリソースの非効率的な使用につながります。 マルチプロセスサービス (MPS) は、NVIDIA GPU上の複数のCUDAアプリケーションまたはMPIプロセスからの要求を管理するために使用でき、AIアプリケーションの効率的なGPU共有とメモリ分離を可能にします。 これは、MPSパターンに基づいてContainer Service for Kubernetes (ACK) コンソールでノードプールの特定のラベルを設定することによって実現されます。
特集紹介
MPIに基づくCPUコアの並列化により、CPU集約型タスク間のバランスの取れたリソース割り当てが可能になり、複数の計算タスクを同時に実行できるようになり、計算プロセス全体が高速化されます。 ただし、CUDAカーネルを使用してMPIプロセスを高速化すると、各MPIプロセスに割り当てられたワークロードがGPUを完全に使用しない場合があります。 これにより、各MPIプロセスの速度が向上する可能性がありますが、GPU全体の使用量は低くなります。 アイドルリソースは、アプリケーションがGPUに十分なタスクを送信しない場合に存在します。 この場合、NVIDIA GPUで複数のCUDAアプリケーションを実行するために設計されたテクノロジであるMPSを使用することを推奨します。
MPSを使用すると、同じGPUデバイス上で異なるアプリケーションを同時に実行できるため、クラスターGPUリソースの使用率が向上します。 クライアント-サーバーアーキテクチャで動作し、バイナリ互換性を保証し、既存のCUDAアプリケーションに大幅な変更を加える必要はありません。 MPSコンポーネントは次のとおりです。
コントロールデーモンプロセス: MPSサーバの起動とシャットダウンを管理します。 また、クライアントとMPSサーバー間の接続を調整して、GPUリソースのスムーズな要求と使用を保証します。
クライアントランタイム: CUDAドライバーライブラリ内に埋め込まれています。 これにより、開発者はCUDAアプリケーションコードを大幅に変更することなくMPSを使用できます。 GPU操作中、MPSサーバーとのやり取りを自動的に管理し、アプリケーション間で安全で効率的なGPU共有を実現します。
サーバープロセス: 複数のクライアントからの要求を処理し、GPUデバイス上で効率的にスケジュールして、クライアント間の同時実行を実現します。
前提条件
1.20以降のバージョンのKubernetesを実行するACK Proクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」および「クラスターの手動アップグレード」をご参照ください。
GPU共有コンポーネントバージョン1.9.13以降がインストールされています。 詳細については、「GPU共有コンポーネントの設定」をご参照ください。
制限事項
ノードでMPSモードのメモリ分離が有効になっている場合、Control Daemon Processは排他的GPUモードを使用して、ノード全体のGPUを独占します。 MPSのクライアント-サーバーアーキテクチャでは、クライアントはMPSサーバーからGPUリソースを要求します。
MPSモードでのGPUスケジューリングは、共有メモリモードのみをサポートします。 共有計算能力モードはサポートされていません。
手順
コンソールでノードプールを作成し、プール内のノードにack.node.gpu.schedule:mps
ラベルを追加し、MPSモードでGPU共有とメモリ分離を有効にします。 この設定は、プール内のすべてのノードに適用されます。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[ノードプールの作成] をクリックし、ノードラベルおよびその他の必要な設定を設定し、[注文の確認] をクリックします。
次の表に、主要なパラメーターを示します。 パラメーターの完全なリストの詳細については、「ノードプールの作成」をご参照ください。
パラメーター
説明
期待されるノード
ノードプール内の初期ノード数。 ノードプールにノードを作成しない場合は、このパラメーターを0に設定します。
ノードラベル
Keyをack.node.gpu.scheduleとして、Valueをmpsとして割り当てます。
設定が完了したら、[GPU共有を使用してGPUを共有する例] の手順に従って、アプリケーションを実行するポッドで必要なメモリリソース (
aliyun.com/gpu-mem
) を宣言できます。
関連ドキュメント
GPU共有が有効になっているコンテナーを作成するようにYAMLファイルを設定する方法の詳細については、「GPU共有を使用してGPUを共有する例」をご参照ください。