クラスターリソースが解放されるまでジョブをキューに入れ、リソースの競合や GPU/CPU のアイドルによる無駄を防ぎます。
ack-kube-queue をインストールし、必要に応じて追加のジョブタイプを有効にしてから、ジョブをキューに投入します。
仕組み
ack-kube-queue は、Kubernetes ネイティブの suspend メカニズムを使用します。フィールドまたはアノテーションで suspend を true に設定してジョブを投入すると、そのジョブはキューに入ります。ack-kube-queue はリソースの可用性を監視し、リソースが十分になると suspend を false に設定してジョブを開始します。
サポートされるクラスタータイプ
ack-kube-queue は以下をサポートします。
-
Kubernetes 1.22 以降を実行している ACK マネージドクラスター
-
Kubernetes 1.22 以降を実行している ACK Edge クラスター
-
Kubernetes 1.22 以降を実行している ACK Lingjun クラスター
ack-kube-queue のインストール
インストール手順はクラスタータイプによって異なります。
ACK マネージドクラスターと ACK Edge クラスター
クラスターの現在の状態に応じた手順を選択します。
クラウドネイティブ AI スイートがまだインストールされていない場合
-
ACK コンソールにログインします。左側メニューで、[Clusters] をクリックします。
-
[Clusters] ページで、対象クラスターの名前をクリックします。左側メニューで、[Applications] > [Cloud-native AI Suite] を選択します。
-
[Cloud-native AI Suite] ページの下部で、[Deploy] をクリックします。[Scheduling] セクションで [Kube-Queue] を選択します。[Ecosystem Tools] セクションで [Kubeflow and Arena] を選択します。次に、[Deploy Cloud-native AI Suite] をクリックします。
クラウドネイティブ AI スイートがすでにインストールされている場合
-
ACK コンソールにログインします。左側メニューで、[Clusters] をクリックします。
-
[Clusters] ページで、対象クラスターの名前をクリックします。左側メニューで、[Applications] > [Cloud-native AI Suite] を選択します。
-
ack-arena と ack-kube-queue を個別にインストールします。インストールが完了すると、[Components] の [Status] に [Deployed] と表示されます。
-
ack-arena を見つけ、[操作] 列の [Deploy] をクリックします。[Parameters] パネルで、[OK] をクリックします。
-
ack-kube-queue を見つけ、[操作] 列の [Deploy] をクリックします。パネルで、[OK] をクリックします。
-
ACK Lingjun クラスター
-
ACK コンソールにログインします。左側メニューで、[Marketplace] > [Marketplace] を選択します。
-
[Marketplace] ページで ack-kube-queue を検索し、その名前をクリックします。
-
アプリケーション詳細ページで、[Deploy] をクリックします。[Basic Information] ステップで、[Cluster]、[Namespace]、および [Release Name] を設定し、[Next] をクリックします。
-
[Parameters] ステップで、[Chart Version] を最新バージョンに設定し、[OK] をクリックします。
追加のジョブタイプの有効化
デフォルトでは、ack-kube-queue は Kubernetes ネイティブのジョブのキューイングのみを有効にします。TensorFlow ジョブ、PyTorch ジョブ、MPI ジョブ、Argo ワークフロー、Ray ジョブ、または Spark アプリケーションをキューに入れるには、各タイプを個別に有効にする必要があります。
Kubernetes ネイティブのジョブをキューに入れるには、クラスターで Kubernetes 1.22 以降が実行されている必要があります。
-
ACK コンソールにログインします。左側メニューで、[Clusters] をクリックします。
-
[Clusters] ページで、対象クラスターの名前をクリックします。左側メニューで、[Applications] > [Helm] を選択します。
-
ack-kube-queue を見つけ、[操作] 列の [Update] をクリックします。
-
YAML テンプレートで、有効にするジョブタイプのパラメーターを設定します。
パラメーター 効果 extension.argo.enable: trueArgo ワークフローの有効化 extension.mpi.enable: trueMPI ジョブの有効化 extension.ray.enable: trueRay ジョブの有効化 extension.spark.enable: trueSpark アプリケーションの有効化 extension.tf.enable: trueTensorFlow ジョブの有効化 extension.pytorch.enable: truePyTorch ジョブの有効化 -
[OK] をクリックします。
ジョブの投入
サポートされている各ジョブタイプをキューに投入し、キューイングされていることを確認します。
制約事項
| ジョブタイプ | 制約 |
|---|---|
| TensorFlow、PyTorch、MPI | ack-arena が提供するオペレーターを使用する必要があります |
| MPI | Arena 経由でのみ投入できます |
| Argo ワークフロー | 完全なワークフローのみをキューに入れることができます。個々のワークフローステップはキューに入れることはできません。kube-queue/min-resources アノテーションでリソース要件を宣言します (「Argo ワークフロー」をご参照ください)。 |
| Kubernetes ネイティブジョブ | クラスターで Kubernetes 1.22 以降が実行されている必要があります |
TensorFlow ジョブ、PyTorch ジョブ、MPI ジョブ
アノテーション scheduling.x-k8s.io/suspend: "true" をジョブマニフェストに追加します。
TensorFlow ジョブの例:
apiVersion: "kubeflow.org/v1"
kind: "TFJob"
metadata:
name: "job1"
annotations:
scheduling.x-k8s.io/suspend: "true"
spec:
...
ジョブがキューイングされていることを確認します。
kubectl describe tfjob job1
キューイングされたジョブには Suspended 条件が表示されます。
Kubernetes ネイティブジョブ
spec.suspend を true に設定します。デキューされると、ack-kube-queue はこのフィールドを false に設定し、ジョブが開始されます。
apiVersion: batch/v1
kind: Job
metadata:
generateName: pi-
spec:
suspend: true
...
ジョブがキューイングされていることを確認します。
kubectl get job <job-name>
キューイングされたジョブには SUSPENDED と表示されます。ack-kube-queue がジョブを許可すると、SUSPENDED がクリアされ、ジョブが開始されます。
Argo ワークフロー
前提条件:ACK コンソールの [Marketplace] から Argo Workflows をインストールしておく必要があります。
suspend タイプの kube-queue-suspend という名前のカスタムテンプレートを追加し、spec.suspend を true に設定します。kube-queue/min-resources アノテーションでリソース要件を宣言します。
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: <workflow-name>-
annotations:
kube-queue/min-resources: |
cpu: 5
memory: 5 G
spec:
suspend: true
entrypoint: <entrypoint-template>
templates:
# 必須:kube-queue-suspend という名前の一時停止テンプレートを追加
- name: kube-queue-suspend
suspend: {}
- name: <entrypoint-template>
# ... ワークフローステップ
Spark アプリケーション
前提条件:ACK コンソールの [Marketplace] から ack-spark-operator をインストールしておく必要があります。
アノテーション scheduling.x-k8s.io/suspend: "true" を SparkApplication マニフェストに追加します。
apiVersion: sparkoperator.k8s.io/v1beta2
kind: SparkApplication
metadata:
generateName: spark-pi-suspend-
namespace: spark-operator
annotations:
scheduling.x-k8s.io/suspend: "true"
spec:
...
Ray ジョブ
前提条件:ACK コンソールの [Add-ons] ページから Kuberay-Operator をインストールしておく必要があります。詳細については、「コンポーネントの管理」をご参照ください。
spec.suspend を true に設定します。
apiVersion: ray.io/v1
kind: RayJob
metadata:
name: rayjob-sample
spec:
# Suspend は、RayJob コントローラーが RayCluster インスタンスを作成するかどうかを指定します。
# suspend フィールドを true に設定してジョブが適用された場合、RayCluster は作成されず、false への移行を待ちます。
# RayCluster がすでに作成されている場合は削除されます。false に移行した場合、新しい RayCluster が作成されます。
suspend: true
...