auth を省略している例では、CWSANDBOX_API_KEY に設定された CoreWeave API アクセストークンを使用します。Forge APIキーで認証する場合は、はじめに の手順に従い、取得した AuthHeaders を操作に渡してください。HTTP API の例では、FORGE_API_KEY に設定された Forge APIキーを使用します。代わりに CoreWeave API アクセストークンを使用する場合は、CWSANDBOX_API_KEY にそのトークンを設定し、各リクエストの -H "x-wandb-api-key: $FORGE_API_KEY" を -H "Authorization: Bearer $CWSANDBOX_API_KEY" に置き換えてください。認証情報には、サンドボックスとそのスナップショットを所有するアカウントのものを使用してください。仕組み
FSS を使用したサンドボックスは、選択したパスに書き込み可能なスクラッチファイルシステムをマウントします。ランナーはこのマウントを直接のオブジェクトストレージマウントではなくEmptyDir でバックアップします。スナップショットとリストアの操作では、そのローカルファイルシステムと組織スコープのオブジェクトストレージバケットの間で tarball をコピーします。
各スナップショットは、サーバーによって割り当てられた fileSystemSnapshotId で識別される FileSystemSnapshot リソースです。スナップショットには 3 つの特性があります。
- 不変: スナップショットを作成すると 1 つのアーカイブが書き込まれます。スナップショットをリストアしてもソースのスナップショットは変更されないため、後でリストアしても常に元のバイトが表示されます。
- 組織スコープ: ご自身の組織で作成されたスナップショットのみをリストアできます。他の組織のスナップショット ID は見つからないものとして扱われます。
- 独立したライフサイクル: スナップショットはサンドボックスとは別に管理されます。サンドボックスを削除してもそのスナップショットは削除されず、スナップショットを削除してもそれから実行中のサンドボックスには影響しません。
スナップショットマウントでサンドボックスを起動する
サンドボックスは、2 つのファイルシステムソースのいずれかから起動できます。新しく空のスクラッチファイルシステム、または既存のスナップショットのリストアです。新規スクラッチ
新規スクラッチのファイルシステムは空の状態で開始され、後からスナップショットを作成できます。run の実行中に書き込み可能なローカル状態が必要なワークフローで使用してください。- Python
- HTTP API
スナップショットからリストアする
リストアでは、既存のスナップショットからファイルシステムを起動します。マウントのスナップショットソースにスナップショット ID を設定します。- Python
- HTTP API
READY である必要があります。まだ CREATING のスナップショットをリストアすると失敗します。スナップショットのステータスと失敗を参照してください。
スナップショットを撮る
サンドボックスを停止したとき (on stop) と、実行中のサンドボックスから (mid-life) の2つの方法でスナップショットを取得することができます。停止時のスナップショット
シャットダウン時にサンドボックスのファイルシステムを保持するには、停止時のスナップショットを有効にしてサンドボックスを停止します。一時停止と再開は、このパターンで実現します。スナップショットを取得してサンドボックスを停止し、後でそのスナップショットをリストアする新しいサンドボックスを起動します。- Python
- HTTP API
実行中のスナップショット
実行中のスナップショットは、サンドボックスを停止せずにその状態を取得します。サンドボックスはその後も実行を継続します。- Python
- HTTP API
snapshot() はデフォルトでスナップショットが READY になるまで待機し、スナップショット ID を返します。スナップショットをフォークする
同じスナップショットを複数のサンドボックスにリストアできます。各スナップショットは不変であるため、リストアされたサンドボックスは同一のバイト列から開始し、書き込みに伴ってそれぞれ異なる状態になります。- 停止時のスナップショット、または実行中のスナップショットを使用して、
READY状態のスナップショットを作成します。 fileSystemSnapshotIdにそのスナップショットを設定して、サンドボックス A を起動します。- 同じ
fileSystemSnapshotIdを使用して、サンドボックス B を起動します。 - サンドボックス A とサンドボックス B への書き込みは、それぞれ独立して状態を変化させます。ソースのスナップショットは変更されないため、後から同じ ID を使用してリストアしても、どちらのフォークへの書き込みも反映されず、元のスナップショットが使用されます。
スナップショットを管理する
スナップショットは、作成元のサンドボックスとは独立して一覧表示、取得、削除できます。- Python
- HTTP API
list_snapshots()、get_snapshot()、delete_snapshot() では、auth 引数で AuthHeaders オブジェクトを渡すこともできます。
スナップショットのステータスと失敗
スナップショットは非同期で作成されます。スナップショットリクエストが成功してfileSystemSnapshotId が返された時点でも、アーカイブの書き込みがまだ続いていることがあり、その後にスナップショットが失敗する場合があります。これは主に、waitForReady が false の場合や、ランナーのアーカイブ処理中にクライアント側でタイムアウトが発生した場合に起こります。
進捗を確認するには、スナップショットを取得して次の 2 つのフィールドを確認します。
status: ライフサイクル状態。終了状態の値はREADYとFAILEDです。HTTP API はFILE_SYSTEM_SNAPSHOT_STATUS_READYのような完全修飾形式を返します。statusReason:statusがFAILEDの場合に設定され、失敗の理由を示します。
GetFileSystemSnapshot をポーリングして、スナップショットが READY になるまで待機してください。Python クライアントの snapshot() と get_snapshot() では、結果を待機する場合にこのポーリングが自動で行われます。
次の表は、主な失敗理由とそれぞれの対処法を示しています。
ランナーがアーカイブのアップロードを完了したものの結果を記録できなかった場合、バケット内にオブジェクトが存在していても、スナップショットの行が
FAILED になることがあります。この場合は、スナップショットの作成を再試行してください。
非同期で失敗した場合、プラットフォームは sandbox.file_system_snapshot.async_fail イベントも発行します。これにより、下流の通知システムは、元の呼び出しが返った後に失敗したスナップショットに対応できます。
制限事項
FSS バージョン 1 は、スナップショットを基盤とするローカルのスクラッチストレージを提供します。これは共有ファイルシステムではなく、複数の書き込み元による同時ライブマウントには対応していません。実行中のサンドボックスが互いのファイルシステムを読み書きすることはありません。サンドボックス間で状態を共有するには、スナップショットの作成とリストアを行う必要があります。SDK のサンプル
サンドボックスを起動し、実行中のスナップショットを取得してフォークし、停止時にスナップショットを取得し、スナップショットを管理する、実行可能な完全な Python サンプルについては、cwsandbox-client リポジトリの file_system_snapshots.py を参照してください。
関連リソース
- ファイルシステムスナップショットで Bring your own bucket を使用する: 自身が所有するバケットにスナップショットを保存する方法について説明します。
- Volumes: スクラッチボリュームと、複数のサンドボックスで共有できる登録済み Volume について説明します。
-
サンドボックスのライフサイクル:
stop()の動作とサンドボックスの状態について説明します。 - Python クライアント: SDK のインストール方法と API の詳細について説明します。