ack-kube-queue は、Container Service for Kubernetes (ACK) のジョブキューマネージャーであり、十分なクラスターリソースが利用可能になるまでジョブを管理キューに保持することで、ジョブの開始を制御します。これにより、AI、機械学習 (ML)、およびバッチ処理ワークロードにおけるリソース競合や GPU/CPU アイドル時間の無駄を防ぎます。
このトピックでは、ack-kube-queue のインストール方法、追加のジョブタイプのサポートを有効にする方法、およびジョブをキューに送信する方法について説明します。
仕組み
ack-kube-queue は、Kubernetes のネイティブな suspend メカニズムを使用します。ジョブタイプに応じて、フィールドまたはアノテーションを介して suspend を true に設定してジョブを送信すると、ジョブはキューに入ります。ack-kube-queue はクラスターリソースの可用性を監視し、十分なリソースが解放されると suspend を false に設定して、ジョブの開始を許可します。
サポートされているクラスタータイプ
ack-kube-queue は以下をサポートしています。
Kubernetes 1.18 以降を実行している ACK マネージドクラスター
Kubernetes 1.18 以降を実行している ACK Edge クラスター
Kubernetes 1.18 以降を実行している ACK Lingjun クラスター
ack-kube-queue のインストール
インストール手順はクラスタータイプによって異なります。
ACK マネージドクラスターと ACK Edge クラスター
ご利用のクラスターの現在の状態に一致する手順を選択してください。
クラウドネイティブ AI スイートがまだインストールされていない場合
「ACK コンソール」にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、お使いのクラスターを見つけ、その名前をクリックします。 左側のナビゲーションウィンドウで、[アプリケーション] > [Cloud-native AI Suite] を選択します。
[クラウドネイティブ AI スイート]ページの下部で、[デプロイ]をクリックします。[スケジューリング]セクションで、[Kube-Queue]を選択します。[エコシステムツール]セクションで、[Kubeflow および Arena]を選択します。次に、[クラウドネイティブ AI スイートのデプロイ]をクリックします。
クラウドネイティブ AI スイートがすでにインストールされている場合
「ACK コンソール」にログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
「クラスター」ページで、クラスターを見つけ、その名前をクリックします。左側のナビゲーションウィンドウで、「アプリケーション」>「Cloud-native AI Suite」を選択します。
ack-arena と ack-kube-queue を別々にインストールします。両方のコンポーネントがインストールされると、[コンポーネント] セクションの [ステータス] 列に Deployed と表示されます。
ack-arena を見つけ、[アクション] 列で [デプロイ] をクリックします。[パラメーター] パネルで、[OK] をクリックします。
「ack-kube-queue」を見つけ、[デプロイ] をクリックします([操作] 列内)。表示されるパネルで、[OK] をクリックします。
ACK Lingjun クラスター
「ACK コンソール」にログインします。左側のナビゲーションウィンドウで、[マーケットプレイス] > [マーケットプレイス] を選択します。
[Marketplace] ページで、ack-kube-queue を検索し、検索結果に表示された名前をクリックします。
アプリケーション詳細ページの右上隅で、[デプロイ] をクリックします。 基本情報ステップで、[クラスター]、[名前空間]、リリース名を設定し、[次へ] をクリックします。
「パラメーター」ステップで、[チャート バージョン] を最新バージョンに設定し、[OK] をクリックします。
追加のジョブタイプのサポートを有効化
デフォルトでは、`ack-kube-queue` は TensorFlow ジョブおよび PyTorch ジョブをサポートしています。Message Passing Interface (MPI) ジョブ、Argo ワークフロー、Ray ジョブ、Spark アプリケーション、Kubernetes ネイティブジョブなど、その他のジョブタイプをキューに登録するには、各ジョブタイプを個別に有効化する必要があります。
Kubernetes ネイティブジョブをキューに登録するには、クラスターで Kubernetes 1.22 以降が実行されている必要があります。
ACK コンソールにログインします。左側ナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、対象のクラスターを見つけ、その名前をクリックします。左側ナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択します。
ack-kube-queue を見つけ、[更新] をクリックします([操作] 列)。
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 Workflows | 完全なワークフローのみをキューに登録できます。個々のワークフローステップは登録できません。ワークフローのリソース要件は、kube-queue/min-resources アノテーションを使用して宣言します (「Argo Workflows」セクションをご参照ください)。 |
| 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 Workflows
前提条件: ACK コンソールの [マーケットプレイス] ページから Argo Workflows コンポーネントをインストールします。手順については、「Argo Workflows のインストール」をご参照ください。
kube-queue-suspend という名前の 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: 5G
spec:
suspend: true
entrypoint: <entrypoint-template>
templates:
# Required: add a suspend template named kube-queue-suspend
- name: kube-queue-suspend
suspend: {}
- name: <entrypoint-template>
# ... your workflow stepsSpark アプリケーション
前提条件: ACK コンソールの [マーケットプレイス] ページから ack-spark-operator をインストールします。手順については、「ack-spark-operator のインストール」をご参照ください。
SparkApplication マニフェストにアノテーション scheduling.x-k8s.io/suspend: "true" を追加します。
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 コンソールの [アドオン] ページから Kuberay-Operator をインストールします。詳細については、「コンポーネントの管理」をご参照ください。
spec.suspend を true に設定します。
apiVersion: ray.io/v1
kind: RayJob
metadata:
name: rayjob-sample
spec:
# Suspend specifies whether the RayJob controller should create a RayCluster instance.
# If a job is applied with the suspend field set to true, the RayCluster will not be created and we will wait for the transition to false.
# If the RayCluster is already created, it will be deleted. In the case of transition to false, a new RayCluster will be created.
suspend: true
...