Container Service for Kubernetes (ACK) は、GPU スケジューリングと運用管理をサポートしています。デフォルトの GPU 使用モードは、Kubernetes コミュニティで採用されている標準的なアプローチと一致しています。このトピックでは、GPU アクセラレーションされた TensorFlow ジョブを使用して、GPU アプリケーションを迅速にデプロイする方法を説明します。
注意事項
Kubernetes クラスターによって管理される GPU ノードの場合、このトピックで説明されている標準的な Kubernetes 拡張リソース要求方法を使用して、アプリケーションの GPU リソースを要求します。アプリケーションの GPU リソースを要求および使用する際は、以下のガイドラインに従ってください。
-
GPU アプリケーションをノードで直接実行しないでください。
-
docker、podman、nerdctlなどのコマンドラインツールを使用して、コンテナーを作成したり、それらの GPU リソースを要求したりしないでください。たとえば、docker run --gpus allまたはdocker run -e NVIDIA_VISIBLE_DEVICES=allコマンドを実行してから GPU プログラムを実行しないでください。 -
NVIDIA_VISIBLE_DEVICES=allやNVIDIA_VISIBLE_DEVICES=<GPU ID>などの環境変数を Pod の YAML ファイルのenvセクションに追加しないでください。NVIDIA_VISIBLE_DEVICES環境変数を使用して、Pod の GPU リソースを直接要求したり、GPU プログラムを実行したりしないでください。 -
Pod のイメージを作成する際、Pod の YAML ファイルで
NVIDIA_VISIBLE_DEVICES環境変数が設定されていない場合でも、そのデフォルト値をNVIDIA_VISIBLE_DEVICES=allに設定して GPU プログラムを実行しないでください。 -
Pod の
securityContextでprivileged: trueを設定して GPU プログラムを実行しないでください。
これらの非標準的な方法で GPU リソースを要求すると、セキュリティリスクが発生する可能性があります。
-
これらの方法で要求された GPU リソースは、スケジューラのデバイスリソース台帳に記録されません。ノード上の実際の GPU リソース割り当てと台帳記録とのこの不一致により、スケジューラが同じノードに追加の GPU ワークロードを割り当てる可能性があります。その結果、同じ GPU カード上で GPU メモリなどのリソース競合によりサービスが失敗する可能性があります。
-
これらの非標準的な操作は、NVIDIA コミュニティによって報告されている既知のエラーなど、その他の不明な問題を引き起こす可能性もあります。
操作手順
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
-
[デプロイメント]ページで、[YAML のリソースの作成]をクリックします。 次のサンプルコードを使用してアプリケーションを作成します。
apiVersion: v1 kind: Pod metadata: name: tensorflow-mnist namespace: default spec: containers: - image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5 name: tensorflow-mnist command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: nvidia.com/gpu: 1 # このコンテナーに GPU カードを 1 枚要求します。 workingDir: /root restartPolicy: Always -
左側のナビゲーションウィンドウで、 を選択します。作成したPodを見つけ、名前をクリックして詳細を表示します。
「ログ」タブをクリックして、TensorFlow ジョブのログデータを表示できます。以下の出力結果により、ジョブが GPU を正しく使用していることが確認されます。
