認証を選択する
以下の例は、CKS を指定しているセクションを除き、サーバーレスキャパシティ上で実行されます。サンドボックスを所有するアカウントの認証情報を選択してください。キーまたはトークンを取得するには、認証情報の選択と取得を参照してください。 インストールコマンドは、有効化した Python 仮想環境で実行してください。 使用する認証情報のタブにある Python コードをsandbox_auth.py として、このページで実行する Python スクリプトと同じディレクトリに保存します。このファイルに格納されるのは認証方法の選択のみで、認証情報そのものは含まれません。各例ではこのファイルから AUTH をインポートし、新しいサンドボックスやセッションを作成するたびに明示的に渡します。
- Forge API キー
- CoreWeave API アクセストークン
SDK の W&B 認証方式で Forge APIキーを使用します。
sandbox_auth.py
SandboxDefaults で placement_mode="cks" を設定します。auth=AUTH を指定してセッションを作成すると、そのセッションが所有するサンドボックスも認証されます。サンドボックスへの再接続、一覧表示、クリーンアップを行う際も、同じ認証情報を使用してください。
ライフサイクルの状態
各サンドボックスは、起動、実行、シャットダウンの過程で一連の状態を経ます。SDK では、これらをSandboxStatus 値として表します。
PENDING と CREATING は一時的な状態です。SDK はこれらの状態の間、自動的にポーリングを継続します。
TERMINATING はバックエンドの一時的な状態であり、wait_until_complete() と stop().result()
によって終端状態まで進められます。RUNNING は安定した稼働状態です。
COMPLETED と FAILED は終端状態です。UNSPECIFIED は、ポーリング時に SDK によって
COMPLETED にマッピングされます。
サンドボックスの作成時、完了時、または失敗時にワークフローを開始できます。サンドボックスが属する Weights & Biases project でサンドボックスのステータス変更オートメーションを作成してください。たとえば、Slack チャンネルへの投稿や webhook の呼び出しが可能です。
作成パターン
サンドボックスの作成方法は 2 つあり、起動 RPC が実行されるタイミングが異なります。以下のセクションでは、各パターンとその使い分けについて説明します。Sandbox.run(): 即時開始
Sandbox.run() はサンドボックスを作成したうえで内部的に start().result() を呼び出し、バックエンドがリクエストを受け入れるまでブロックします。
Sandbox.run() は、コマンドとその引数を可変長の位置引数 (文字列) として受け取ります。command や args をキーワード引数として渡すことはできません。
session.sandbox(): 遅延起動
session.sandbox() は、ネットワークコールを行わずにサンドボックスオブジェクトを作成します。起動 RPC は
初回使用時に発火します:
メインコマンドの有効期間
run() または session.sandbox() に渡されるコマンドは、サンドボックスのメインプロセスです。このプロセスが
終了したときの動作は、終了ステータスによって異なります:
- 終了ステータス 0: サンドボックスは
COMPLETEDに遷移します。 - 0 以外の終了ステータス: プラットフォームがメインプロセスのコンテナーを再起動します。すでに
RUNNINGに達しているサンドボックスは 再起動中もRUNNINGのままで、まだ達していないサンドボックスはCREATINGのままです。wait_until_complete()は再起動中も待機を続け、timeoutに達するまで待機します。 - 再起動の上限に到達: メインプロセスが 0 以外のステータスで終了し続けると、
再起動の上限 (現在は 6 回) に達した時点でサンドボックスは
FAILEDに遷移します。
exec() を使用してください。
サンドボックスを起動する
サンドボックス オブジェクトが存在した後、明示的に起動するか、SDK に任せて初回使用時に起動させるかのいずれかを選択できます。以下のセクションでは、両方のアプローチと、コンテキストマネージャーがそれらとどのように相互作用するかについて説明します。明示的な起動
start() は起動 RPC を送信し、OperationRef[None] を返します:
自動起動
ほとんどの操作は、サンドボックスがまだ起動していない場合に自動的に起動します。一般的なケースでは、サンドボックスを作成してすぐに使用を開始できます。コンテキストマネージャーと start
コンテキストマネージャー (with/async with) はエントリ時に start() を呼び出しますが、wait() は呼び出しません。
最初の操作の前に起動ステータスを確認するには、wait() を呼び出してから status を確認してください:
exec() が内部で RUNNING 状態になるまで待機するため、これが問題になることはほとんどありません。明示的な
wait() は、起動時の失敗と操作の失敗を切り分けたい場合に役立ちます。
サンドボックスを待機する
SDK は、起動ステータスを確認したり、メインコマンドの終了を待ったりするための待機メソッドを提供します。以下のセクションでは、各メソッドと、起動および操作のタイムアウトがどのように関連するかを説明します。wait(): 起動ステータスになるまで待機する
wait() は、PENDING や CREATING などの起動中の状態が続く間、ポーリングを行います。たとえば、サンドボックスが
RUNNING または TERMINATING になった時点、あるいは正常に完了した後に戻ります。
wait() はサンドボックスオブジェクトを返します。実行中のサンドボックスを必要とする操作を呼び出す前に、
その status を確認してください。正常に戻った場合でも、RUNNING 状態であるとは限りません。
起動中にサンドボックスが終端状態に達した場合、wait() は次のように処理します。
wait_until_complete(): 終端状態までブロック
wait_until_complete() は、サンドボックスが終端状態に達するまでブロックし、
TERMINATING の間も自動的にポーリングします。メインコマンドが処理を行うサンドボックスで使用してください:
raise_on_termination パラメーター (デフォルトは True) は、このクライアントが stop() を呼び出した後、
またはレガシーバックエンドが TERMINATED を報告した場合に、wait_until_complete() が SandboxTerminatedError を送出するかどうかを制御します。COMPLETED として報告される外部からの停止では、
このエラーは送出されません。これは、応答において外部からの停止と通常の完了が区別されないためです。一方、最大ライフタイムに達したサンドボックスは
FAILED で終了するため、wait_until_complete() は SandboxFailedError を送出します。
タイムアウトのフェーズ
起動時の待機時間と操作のタイムアウトは別々のフェーズですが、どちらもサンドボックスの最大ライフタイム が上限となります:- 起動待機: 起動するか、早期に終端状態に達するまで待機する時間です。
wait()のtimeoutパラメーターで制御します。 - 完了待機: 終端状態に達するまで待機する時間で、残りの起動処理、
実行、再起動、終了処理を含みます。
wait_until_complete()のtimeoutパラメーターで制御します。 - 操作タイムアウト: 個々の exec、read、write にかかる時間です。
exec()のtimeout_seconds、 またはSandboxDefaultsのrequest_timeout_secondsで制御します。起動待機は含まれません。 - 最大ライフタイム: サンドボックスが存在できる合計の実時間で、起動時点から数え、
起動待機も含みます。
max_lifetime_secondsで制御します。設定しない場合、 ランナーポリシーのデフォルトが適用されます。正のデフォルト値が設定されていない場合は、プラットフォームのフォールバック値として 10 分が適用されます。
max_lifetime_seconds は、想定される作業の合計時間を十分に上回る値に設定してください。この値はサンドボックスの起動後に
変更できません。タイムアウト設定とそれらの関係については、
タイムアウトを参照してください。30 日間の上限と
サーバーレス および CKS の設定例については、長時間稼働するサンドボックスを実行するを参照してください。
オペレーションとライフサイクル
exec()、read_file()、write_file() などのオペレーションは、必要に応じてサンドボックスを自動的に起動し、
RUNNING になるまで待機してから処理を続行します。
timeout_seconds) は、サンドボックスが RUNNING になってから適用されます。起動にかかる
時間は含まれません。
サンドボックスの停止とサポート終了
このセクションでは、サンドボックスをシャットダウンする方法、停止後の動作、およびstop() と delete() の使い分けについて説明します。
stop()
stop() は停止リクエストを送信し、OperationRef[None] を返します。サンドボックスは
TERMINATING (猶予期間中のドレイン) を経て、終端状態に遷移します。返された
OperationRef は、停止 RPC が成功した時点ではなく、バックエンドが終端状態を
確認した時点で解決されます。
停止時のスナップショットを使用するには、
file_system_snapshot マウントを指定して起動したサンドボックスと、
File System Snapshots (FSS) が有効化された組織が必要です。取得対象はこのマウントのみで、
サンドボックスのファイルシステム全体は対象外です。セットアップについては、ファイルシステムスナップショット
を参照してください。
stop() は処理中の起動にも対応しています。起動がまだ処理中の場合は、起動の完了を待ってから停止します。通常の stop() を同時に呼び出した場合は 1 つの停止操作が共有されます。通常の停止を繰り返しても、
停止 RPC が重複して発行されることはありません。snapshot_on_stop=True を指定した呼び出しが、スナップショットを取得しない停止に合流する、またはその停止を監視することになる場合は、
SnapshotOnStopConflictError が送出されます。スナップショット付きの停止は、
通常の停止が始まる前にリクエストしてください。
停止後の動作
stop() が呼び出されると、サンドボックスは TERMINATING (猶予期間中の
ドレイン状態) を経て、終端状態 (COMPLETED または FAILED) に遷移します。stop() が
呼び出された後は、サンドボックスを使用できません。それ以降のオペレーションでは SandboxNotRunningError が発生します。
status プロパティは、最後の呼び出しの結果からキャッシュされます。停止前に最新のデータを取得するには、
get_status() を使用します:
コンテキストマネージャーの終了
コンテキストマネージャーは終了時に自動的にstop() を呼び出します:
stop() と delete() の比較
現在使用しているサンドボックスには
stop() を使用します。Sandbox.list() または Sandbox.from_id() で
見つかったサンドボックスのクリーンアップには delete() を使用します:
Under the hood
SDK は、独自の asyncio イベントループを持つバックグラウンドのデーモンスレッド上で、すべての gRPC オペレーションを実行します。 この設計により、以下が実現されます。- 同期 API (
.result()) は、バックグラウンドのループがネットワークコールを処理している間、 呼び出し元のスレッドをブロックします。 - 非同期 API (
await) は同じバックグラウンドのループに橋渡しされるため、どちらのパターンも同じ 基盤実装を使用します。 - バックグラウンドのループは、初回使用時に遅延起動されます。gRPC チャンネルも同様に遅延作成されます。
- 自動起動は、各オペレーションの前に
sandbox_idが None かどうかを確認し、None の場合はstart()をトリガーする仕組みです。 - プロセス終了時には、クリーンアップハンドラ (atexit + シグナルハンドラ) が登録済みセッション内の すべてのサンドボックスを停止します。クリーンアップ中にもう一度 Ctrl+C を押すと、即座に強制終了します。
nest_asyncio を使用しなくても Jupyter ノートブックで動作します。使用パターンについては、同期 API と非同期 API のパターンを比較するガイド を参照してください。
一般的なパターン
以下の例は、上記で説明したライフサイクルステップを組み合わせたエンドツーエンドのパターンを示しています。手軽な単発実行
コマンドを実行して結果を取得します。コンテキストマネージャーがクリーンアップを行います:起動の制御
起動時のエラーと操作中のエラーを区別します:長時間実行するサンドボックス
メインコマンドが完了するまで待ちます:exec() を使用して処理を実行し、サンドボックスを停止する前にファイルを読み取ってください。