CPUのみのサポートGPUサンドボックスはプライベートプレビュー中であり、SUNK Pod Schedulerインテグレーションではまだサポートされていません。サポートされる配置オプションとアクセスをリクエストする方法については、GPUサンドボックスを参照してください。CPUのみのサンドボックスは、アイドル状態のCPU Nodeに配置したり、他のサンドボックスやSlurmジョブとCPU Nodeを共有したり、他のワークロードが実行中のGPU Node上でCPUリソースを共有したりできます。詳細については、既知の制限事項を参照してください。
前提条件
- SUNK がデプロイされ、SUNK Pod Scheduler が有効になっている CKS クラスター。
- 同じクラスターにデプロイされた CoreWeave サンドボックス ランナー。
- インストールおよび認証済みの CoreWeave Intelligent CLI (
cwic) v1.44.0 以降。セットアップの詳細については、ランナーのデプロイと管理 を参照してください。 - ランナーのポリシーを読み取りおよび更新するための
sandbox_adminロール、および Slurm デプロイメントを更新する権限。 - v1 サンドボックス API 用の、インストールおよび認証済みの
cwsandbox >= 1.0.0。 - クラスター検査用の
kubectlおよびyq。HTTP の例ではcurl、jq、および$TOKEN内の CoreWeave API トークンも使用します。
[RUNNER-ID] を、SUNK クラスター上のランナーの ID に置き換えてください。
ステップ 1: SUNK Pod Scheduler の検証
SUNK デプロイメントが CoreWeave Sandboxes で動作するように設定されていることを検証します。-
スケジューラーが実行中であることを検証します:
Pod が返されない場合は、Slurm Helm values で
scheduler.enabled: trueを設定してスケジューラーを有効にしてください。詳細は Enable the scheduler を参照してください。 -
スケジューラー名を確認します。この名前はステップ 2 でランナーのポリシーに設定します。SUNK 8.0 以降では、スケジューラーは ConfigMap から名前を読み取ります:
SUNK 7.x では、代わりにスケジューラー Pod の
--scheduler-name引数で名前が指定されます。内部の動作については Look up the scheduler configuration を参照してください。 -
KillWaitの値を確認します。この値は Pod の終了を確認する際に使用します:出力で--slurm-kill-waitを確認します: -
サンドボックス Pod 向けに Slurm の終了ウィンドウを設定します。SUNK では、
terminationGracePeriodSecondsが--slurm-kill-waitから 5 秒を引いた値より厳密に小さい必要があります。 ポリシーではbase.spec.terminationGracePeriodSecondsを指定できません。Kubernetes のデフォルトである 30 秒の猶予期間を持つ Pod の場合は、KillWaitを 35 秒より大きい値に設定してください。たとえば、次の内容を Slurm Helm values にマージし、通常の SUNK デプロイ手順で更新を適用します:この変更は、クラスター全体のジョブに対する Slurm の終了ウィンドウに影響します。前述のコマンドを実行し、スケジューラーが--slurm-kill-wait=60sを報告していることを検証してください。詳細は Slurm configuration parameters および Set the termination grace period を参照してください。 -
スケジューラーのスコープがサンドボックスの namespace を対象に含んでいることを確認します。namespace の選択はランナーが管理するもので、ポリシーのフィールドではありません。新規ユーザー用に作成されるものも含め、すべてのサンドボックス namespace を監視するには、
scheduler.scope.type: clusterを設定してください。scheduler.scope.type: namespaceを使用する場合は、各サンドボックス namespace をscheduler.scope.namespacesに追加し、新しい namespace が作成されるたびにリストを更新してください。スコープの変更は Helm で適用してください。これにより、スケジューラーにそれらの namespace で必要な RBAC 権限も付与されます。詳細は Enable the scheduler を参照してください。 -
サンドボックスと共有する NodeSet で、
slurmdのリソースリクエストを引き下げます。これはサンドボックスの設定ではなく、Slurm 側 (Slurm Helm values) で行う変更です。デフォルトの NodeSet リソースリクエストは Kubernetes のノードの割り当て可能キャパシティの大部分を占有するため、サンドボックス Pod を配置する余地が残りません。この変更を行わないと、サンドボックス Pod はOutOfMemoryまたはOutOfcpuエラーで拒否されます。設定の詳細は SUNK Pod Scheduler を使用したリソースの管理 を参照してください。
ステップ 2: ランナーのポリシーを設定する
各ランナーには 1 つのポリシーが付属しています。そのポリシー内でbase.spec.schedulerName を設定すると、サンドボックスの Pod が SUNK を経由するようにルーティングできます。別途ポリシーリソースを作成したりバインドしたりする必要はありません。
次のフラグメントをランナーの既存のポリシーにマージしてください。slurm-scheduler はステップ 1 で取得したスケジューラー名に置き換えてください:
- CLI
- curl
現在のポリシーを読み取り、
$EDITOR で開きます:base.spec の下に schedulerName を追加し、ドキュメントの残りの部分はそのままにします。変更を保存してエディターを閉じると、ポリシーが適用されます。完全なポリシーをファイルで管理している場合は、そのファイルを検証して適用します:constraints.network フィールドとサンドボックスで宣言された外向き通信の設定が、ネットワークアクセスを制御します。SUNK スケジューリングを追加する際は、ランナーの既存のネットワーク制約を保持してください。サンドボックスポリシーを設定する を参照してください。
ポリシーの変更がサンドボックス作成に反映されるまで時間がかかる場合があります。新しいスケジューラーや固定アノテーションを前提に運用する前に、サンドボックスを作成し、Pod が Pending のままになる の説明に従って Pod のフィールドを確認してください。ポリシーを読み取った際に新しい値が表示されても、新しいサンドボックスにはまだ反映されていない場合があります。
完全なスキーマについては ポリシーリファレンス を参照してください。ランナーのセットアップについては ランナーのデプロイと管理 を参照してください。
ステップ 3: サンドボックスを作成する
placement_mode="cks" と runner_ids を設定して、ポリシーを設定したランナーを選択します。ランナーのポリシーによって、スケジューラーが自動的に指定されます。
SandboxDefaults の配置フィールドを設定します。
リソースリクエストと Slurm アカウンティング
SUNK は Pod のリソース リクエスト (制限ではなく) を読み取り、Slurm ジョブパラメーターに変換します。
Slurm はこれらの値をスケジューリングの判断と
sacct アカウンティングに使用します。SUNK は特定のサービス品質クラスを必要としません。Guaranteed (リクエストと制限が等しい) と Burstable (リクエストが制限より小さい) の両方が動作します。
ResourceOptions でリクエストを制限より低く設定した場合、キャパシティに空きがあるときに Pod は制限までバーストできますが、Slurm が見るのはリクエストのみです。たとえば、次のように設定されたサンドボックスでは:
sacct では 500m CPU、512Mi メモリ のジョブとして表示されますが、ノードに余裕がある場合、サンドボックスは最大 2 CPU と 2Gi まで使用できます。完全な ResourceOptions のリファレンスについては、リソース を参照してください。
サンドボックスのワークロードが必要とするものに合わせてリクエストのサイズを調整し、ステップ 1 で下げた slurmd のリクエスト分、ターゲットノードに十分な余裕を残してください。基本的なルールについては、リソースリクエストの設定 と SUNK Pod Scheduler を使用したリソースの管理 を参照してください。
ステップ 4: Slurm アノテーションで配置を制御する
サンドボックスの配置を制御するには、起動時にサンドボックスに SUNK アノテーションを設定します。次の例では、サンドボックスをhpc-prod パーティションに固定します:
共通のアノテーション
すべてのアノテーションはsunk.coreweave.com/ 接頭辞を共有します。サンドボックスの配置を制御するために一般的に使用されるアノテーションは次のとおりです:
user-id アノテーションに数値 UID の代わりにユーザー名を渡すと、Slurm がサンドボックスをスケジューリングするのを妨げるブロックエラーが発生します。Slurm ログインノードから数値 UID を検索するには、検索する Linux ユーザー名で [USERNAME] を置き換えます:
ポリシーでアノテーションを強制する
ランナー上のすべてのサンドボックスに Slurm ジョブのパラメーターを設定するには、そのアノテーションをbase.metadata.annotations に追加します。たとえば、sandboxes パーティションを使用するには、この断片を既存のポリシーにマージします。
base.metadata.annotations からそのキーを省略し、constraints.metadata.denied_annotation_prefixes で許可されていることを確認してください。たとえば、クライアントがトレーニング ジョブのユーザーと一致させる必要がある場合は、sunk.coreweave.com/user-id を固定しないでください。
トレーニング ジョブの Slurm ユーザーに合わせる
トレーニング ジョブは、ノード全体を単一のユーザーで占有するために--exclusive=user を指定して実行されることがよくあります。これにより、他のユーザーのジョブがそのノードのリソースを奪い合うことを防ぎつつ、同じユーザーであれば、GPU トレーニングと並行して空き CPU を使用するサンドボックスなど、追加のジョブをそのノードで実行できます。
デフォルトでは、SUNK のプレースホルダー ジョブは root (UID 0) として実行されます。root はトレーニング ジョブを送信したユーザーとは別のユーザーであるため、Slurm はサンドボックスのプレースホルダーを排他ノードに配置しません。
トレーニング コードが実行中の Slurm ジョブ内から cwsandbox Python クライアントを使用してサンドボックスを作成する場合、環境からジョブの Slurm ユーザー ID を読み取り、アノテーションとして渡すことができます。これにより、サンドボックスのプレースホルダー ジョブがトレーニング ジョブと同じ Slurm ユーザーで送信されるため、Slurm はそれらを同じ排他ノードに配置できます。
user-id アノテーションには、ユーザー名ではなく数値の Linux UID を指定する必要があります。これを設定すると、SUNK は group-id にもデフォルトで同じ値を設定します。グループ ID が異なる場合は、sunk.coreweave.com/group-id を別途設定してください。
トラブルシューティング
SUNK Pod Scheduler を通じてサンドボックスを実行する際のよくある問題を診断するには、以下のセクションを使用します。Pod が Pending のままになる
サンドボックス Pod を検査して、ランナーがスケジューラー名を適用したことを確認し、終了猶予期間をチェックします:SCHEDULER が SUNK スケジューラーと一致し、そのスコープに NAMESPACE が含まれ、GRACE がスケジューラーの kill wait から 5 秒を引いた値より厳密に小さいことを確認してください。30 秒の猶予期間は、デフォルトの 30 秒の kill wait で失敗します。ポリシーがパーティションをピン留めしている場合は、PARTITION がそれと一致することを確認してください。
スケジューラー名または固定アノテーションが欠落しているか不正な場合は、ランナーのポリシーを読み戻して、クライアントが意図したランナーを選択したことを確認してください。新しく作成された Pod が以前の値を使用している場合は、ポリシーの伝播にさらに時間をかけ、別のサンドボックスで再試行してください。
プレースホルダージョブが一時的に completing 状態になる
サンドボックスが停止すると、その Slurm プレースホルダージョブは、クリーンアップスクリプトが実行されノードがプールに戻される間、30 から 60 秒間CG (completing) 状態になります。これは通常の Slurm 動作であり、同じノードで実行中の他のジョブには影響しません。完全な状態リファレンスについては Slurm job states を参照してください。
サンドボックスが想定した場所に配置されない場合
Slurm は、ポリシーが設定するか、クライアントが渡すアノテーションに基づいてサンドボックスの配置を決定します。サンドボックスが想定したノードに配置されない場合は、Slurm ジョブのパラメーターを確認してください。 SUNK は、各サンドボックス Pod に対して、<namespace>/<pod-name> という名のプレースホルダー Slurm ジョブを作成します。Pod 名にはサンドボックス ID が含まれます。この ID はクライアントから sb.sandbox_id として取得できます。サンドボックス ID でプレースホルダージョブを検索し、そのパラメーターを確認してください:
[SANDBOX-ID] を Python クライアントの sb.sandbox_id の値に置き換えます。