Hub Python Library documentation
サンドボックス
サンドボックス
Sandbox API は実験的な機能です。API および動作は、事前の通知なしに変更される場合があります。共有サンドボックスは、同じ信頼境界内のワークロード用に設計されています。互いに信頼し合わないワークロードには、専用サンドボックスを使用してください。
使い方を学ぶには、Sandboxesガイドをご覧ください。
Sandbox
クラス huggingface_hub.Sandbox
< source >( id: strserver: _SandboxServerlocal_id: str | Noneowns_sandbox: boolowns_server: boolsandbox_token: str | None = None )
Hugging Face Jobs上で実行される、隔離されたクラウドマシン。
Sandbox APIは実験的なものです。APIや動作は、事前の通知なしに変更される場合があります。
Sandbox.create() を使用して専用のサンドボックスを作成します(1つのサンドボックスにつき1つのジョブ)。または、SandboxPool から多数の低コストな共有サンドボックスを取得します。
どこからでもSandbox.connect()を使用して、実行中のサンドボックスに再接続できます。コンテキストマネージャーとして使用すると、終了時にサンドボックスを終了できます:
>>> from huggingface_hub import Sandbox
>>> with Sandbox.create(image="python:3.12") as sbx:
... print(sbx.run("python --version").stdout)サンドボックスを終了せずに、ローカルHTTPクライアントを解放します。冪等です。
プールサンドボックスでは何もしません(クライアントはプールのホストに属しているため)。
idのみを使用して、どこからでも実行中のサンドボックスに再接続します。
create
< source >( image: str = 'python:3.12'flavor: str = 'cpu-basic'idle_timeout: int | float | str | None = 600env: dict[str, typing.Any] | None = Nonesecrets: dict[str, typing.Any] | None = Nonevolumes: typing.Optional[typing.List[huggingface_hub._space_api.Volume]] = Nonenamespace: str | None = Noneforward_hf_token: bool = Falselabels: dict[str, str] | None = Nonestart_timeout: float = 120.0token: str | None = None )
パラメータ
- image (
str、任意、デフォルトは"python --3.12"):/bin/shを備えた任意の Docker イメージ (Docker Hub またはhf.co/spaces/...)。 - flavor (
str、任意、デフォルトは"cpu-basic") — ハードウェアのバリエーション。例:"cpu-basic"、"a10g-small"。hf jobs hardwareを参照してください。 - idle_timeout (
intまたはfloatまたはstr、省略可能、デフォルトは600) — この時間だけアクティビティ(API 呼び出しなし、実行中のプロセスなし)が続くと、自動的にシャットダウンします。デフォルトは 10 分です。Noneを渡すと無効になります。なお、foreground コマンドは現在アクティビティとしてカウントされないため、他の API トラフィックがない状態で、この時間より長くかかる単一のrun()の実行中に、その下のサンドボックスがシャットダウンされる可能性があります。長時間かかる単一のコマンドには、タイムアウトを延長するか(またはNoneを渡す)してください。 - env (
dict[str, Any]、省略可) — サンドボックス内で利用可能な環境変数です。 - secrets (
dict[str, Any]、省略可) — シークレット環境変数(サーバー側で暗号化されます)。 - volumes (
List[Volume]、任意) — マウントする HF リポジトリ/バケット。詳細は Volume を参照してください。 - namespace (
str, 省略可) — 実行に使用するユーザーまたは組織の namespace(デフォルトは現在のユーザー)。 - forward_hf_token (
bool、省略可能、デフォルトはFalse) — True の場合、HF トークンがHF_TOKENとして注入されます(オプトイン方式)。 - labels (
dict[str, str], 省略可) — 基盤となる HF Job に付与するラベル。 - start_timeout (
float、任意、デフォルトは120.0) — サンドボックスが準備完了になるまで待機する最大秒数。 - token (
str, 省略可) — HFトークンの上書き。
専用のサンドボックス(1つの HF Job)を作成し、準備が完了するまでブロックします(cpu-basic では約 7 秒)。
各サンドボックスは完全に分離されたVMであるため、GPUワークロードや信頼できないコードの実行には適切な選択です。代わりに、多数の低コストなCPUサンドボックスを分散して実行する場合は、SandboxPoolを使用してください。
ジョブは最大24時間の固定の生存期間で実行されます。idle_timeoutが実際の管理役であり、アイドル状態のサンドボックスはそれよりずっと前に自動的にシャットダウンされます。
イメージには/bin/shのみが必要です。サンドボックスサーバーは、利用可能な場合はwget/curlで起動時にダウンロードされ、利用できない場合は常にマウントされているサーバーバケットから読み込まれます(これによりコールドスタートに約2〜3秒追加されるため、wget/curlを同梱することで高速に保たれます)。
このサンドボックスのバックグラウンドプロセスをリスト表示します。
Sandbox.run()(..., background=True)で開始されたプロセスを返します。SandboxProcess.kill()で1つを停止できます。最近完了したプロセスはリストに保持されます(running=Falseおよびexit_code付き)。サーバーは保持するプロセス数に上限を設けているため、数千の短いコマンドを実行したサンドボックスでも、すべてがリストに表示されることはありません。
proxy_url_for
< source >( port: int | strpath: str = '/'scheme: str = 'https://' ) → str
パラメータ
- port (
intまたはstr) — 内部サーバーがリッスンするポート(プール: unix ソケットの<port>)です。 - path (
str、任意、デフォルトは"/") — 内部サーバー内で指すパス。例:"/ws"。 - scheme (
str、任意、デフォルトは"https --//"): リンクを構築するために使用する URL スキームです。デフォルトは"https://"です。WebSocket クライアントの場合は"wss://"を指定してください(プロキシはプロトコルに依存しないため、変更されるのはクライアント側のスキームのみです)。
戻り値
str
https://<job_id>--49983.hf.jobs/v1/.../proxy/8000/ws のような URL(または scheme="wss://" を指定した wss://...)。
このサンドボックス内部で実行されているサーバーをプロキシするパブリックURL。
返されたURLへのリクエストは、ジョブ内のサンドボックスサーバーによって、サンドボックス内でportで起動したサーバーに転送されます。WebSocket(ws(s)://)のアップグレードやストリーミングレスポンスも含まれます。認証にはproxy_headersと組み合わせて使用してください。
サンドボックスがportでリッスンする必要がある方法:
- プール / 共有サンドボックス: TCPポートをバインドできません(Landlock)。そのため、
$SBX_PROXY_DIR/<port>.sockに unixソケット をバインドしてください(SBX_PROXY_DIR環境変数はすべてのサンドボックスで設定されています)。例:uvicorn app:app --uds $SBX_PROXY_DIR/8000.sock。 - 専用サンドボックス:
127.0.0.1:<port>上で通常の TCP ポートをバインドします。(ここで経由せずに、ジョブプロキシ経由でポートを直接公開することもできます。)
run
< source >( cmd: typing.Union[str, typing.List[str]]shell: bool | None = Noneenv: dict[str, typing.Any] | None = Nonecwd: str | None = Nonetimeout: float | None = Nonestdin: str | None = Noneon_stdout: typing.Optional[typing.Callable[[str], NoneType]] = Noneon_stderr: typing.Optional[typing.Callable[[str], NoneType]] = Nonecheck: bool = Truecapture_output: bool = Truebackground: bool = False )
パラメータ
- cmd (
strまたはList[str]) — シェルコマンド文字列(/bin/sh -cで実行)または argv リスト(直接 exec される)。 - shell (
bool, 省略可能) —cmdの型から実行モードを推測するのではなく、実行モードを強制します。Trueの場合は/bin/sh -cを介して実行され、cmdが文字列である必要があります。Falseの場合はcmdを直接 exec し、argv リストである必要があります。None(デフォルト) の場合は型から推測します。型に依存する落とし穴 (例:["echo hi"]が"echo hi"という単一のプログラム名として exec されてしまうこと) を避けるために、明示的に設定してください。 - env (
dict[str, Any]、省略可) — このコマンド用の追加の環境変数。 - cwd (
str, 省略可) — 作業ディレクトリ。 - timeout (
float, 任意) — この秒数を超えた時点で、コマンド(プロセスグループ全体)を強制終了します。 - stdin (
str, 省略可) — コマンドの stdin に書き込むデータ。 - on_stdout (
Callable[[str], None]、省略可) — 標準出力のチャンクが届くたびに呼び出されるコールバック。 - on_stderr (
Callable[[str], None]、省略可) — stderr のチャンクが届くたびに呼び出されるコールバック。 - check (
bool、省略可能、デフォルトはTrue) — True の場合、終了コードがゼロ以外の場合にSandboxCommandErrorを発生させます。 - capture_output (
bool、省略可能、デフォルトはTrue) — True の場合、stdout/stderr を返される結果に蓄積します。on_stdout/on_stderrだけを使用したい場合はFalseを渡してください。この場合、出力はコールバックに渡されて破棄されるため、数 GB の出力を生成するコマンドでもメモリに収まる必要はありません。その場合、result.stdout/result.stderrは空になります。 - background (
bool、省略可能、デフォルトはFalse) — True の場合、コマンドをデタッチして開始し、待機して SandboxCommandResult を返す代わりに、すぐに SandboxProcess を返します。
サンドボックス内でコマンドを実行し、その完了を待機しながら、出力をライブでストリーミングします。
background=True を指定すると、コマンドはデタッチ状態で開始され、run は完了を待たずに即座に SandboxProcess を返します。これはサーバーやその他の長時間実行されるプロセスに便利です。後で Sandbox.processes() を使用して一覧を表示し、SandboxProcess.kill() を使用して1つを停止できます。ストリーミング/待機専用のオプション(timeout、stdin、on_stdout、on_stderr、check)はこのモードでは適用されません。
戻り値: background=True の場合は SandboxProcess、それ以外の場合は SandboxCommandResult(exit_code、stdout、stderr、duration_ms を含む)。
SandboxPool
クラス huggingface_hub.SandboxPool
< source >( image: str = 'python:3.12'flavor: str = 'cpu-basic'sandboxes_per_host: int = 50warm_up: int = 1max_hosts: int | None = Nonename: str | None = Noneidle_timeout: int | float | str | None = 600namespace: str | None = Nonestart_timeout: float = 120.0adopt_hosts: str = 'own'token: str | None = None_connect_mode: bool = False )
hostジョブのフロート。各ジョブには、多くのlandlock分離されたサンドボックスが詰め込まれています。
Sandbox APIは実験的なものです。APIや動作は、事前の通知なしに変更される場合があります。
プールされたサンドボックスは、1つの信頼境界内のワークロード向けです。 プールされたサンドボックスは、共有 VM 内の uid と Landlock ルールセットの組み合わせであり、専用の VM ではありません。ホスト上のすべてのサンドボックスは、そのホストの認証トークンと特権付きコントロールプレーンを共有します。プールを使用すると、ご自身の コードを低コストで扇出し展開できます。相互に信頼し合わないワークロードには、Sandbox.create() を使用してください。これにより、各ワークロードに専用の VM が割り当てられます。具体的な制約事項は、サンドボックスの概念ガイドの「既知の制限」セクションに記載されています。
1つのホストは1つの課金対象となるHF Job(VM)です。サンドボックスサーバーを実行し、sandboxes_per_host個までの軽量サンドボックスを多重化して実行します。これらはuidとLandlock LSMによって相互に分離されます。これにより、大規模なファンアウトが安価(VMのコストはそのホスト上のすべてのサンドボックスで共有されるため)かつ高速(ホストがウォーム状態になると、サンドボックスの作成はプロキシの往復1回程度で済むため)になります。RLのロールアウトなど、多数の並列CPUサンドボックスに最適です。GPUを使用する場合、または相互に信頼し合わないワークロード間で強力なVMレベルの分離が必要な場合は、代わりにSandbox.create()を使用してください。
コンストラクタはwarm_up台のホスト(デフォルトは1台)を事前プロビジョニングし、それらが準備完了するまでブロックします。その後、サンドボックスの要求に応じて追加のホストがオンデマンドでプロビジョニングされ、すべて
close()(または idle_timeout によるアイドル状態)で破棄されます。ユーザーはジョブを管理する必要はありません。
>>> from huggingface_hub import SandboxPool
>>> with SandboxPool(image="python:3.12", flavor="cpu-basic", warm_up=2) as pool:
... boxes = [pool.create() for _ in range(100)] # packed across the warm hosts
... print(boxes[0].run("echo hi").stdout)
hicreate() は一度に1 つのサンドボックスを作成します。新しいホストを起動する前に、まだ空き容量があるホストを再利用するため、ワークが到着するにつれてオンデマンドでスケールアウトします。最初の数回の呼び出しでのコールドスタートを避けるには、warm_up(または warm)でホストを事前プロビジョニングしてください。ウォームホストはジョブログによって検出されるため、再利用はプロセス間でも機能します(同じ image/flavor/name を持つ新しいプールは、
以前のランが残したものをホストします):
>>> pool = SandboxPool(image="python:3.12")
>>> sbx = pool.create() # finds a warm host (here or in another process), else boots oneプールを解放します。冪等です。
作成したプールに対しては、すべてのホストジョブ(したがって、それらのすべてのサンドボックス)を終了します。connect() されたハンドルに対しては、ローカル HTTP クライアントのみを解放します。共有ホストは他のクライアントにサービスを提供している可能性があるため、Sandbox.connect() と同様に、with ブロックを抜けてもそれらを停止してはいけません。接続されたプールのホストは、hf sandbox pool delete <id> を使用して明示的に終了してください。
ホストのこの処理が開始したもののみがキャンセルされます。ラベル経由で検出されたホストは、別のプロセスのサンドボックスを提供している可能性があるため、終了させるのではなく解放されます。
ホストジョブのキャンセルに失敗した場合、SandboxError が発生し、まだ実行中のジョブが特定されます。これらのジョブは課金が継続され、キャッシュエントリが保持されるため、引き続き検出可能になります。__exit__ 経由で例外が既に発生している状態で close() に到達した場合、その失敗はログに記録されるのみであり、元のエラーを隠蔽することはありません。
connect
< source >( pool_id: strnamespace: str | None = Noneadopt_hosts: str = 'own'token: str | None = None )
パラメータ
- pool_id (
str) — プールが最初に作成された際に返されるIDです。 - namespace (
str, 省略可) — プール内のホストを検索する名前空間(デフォルトは自分の名前空間)。 - adopt_hosts (
str、省略可能、デフォルトは"own") — アタッチ可能なホストを指定します。SandboxPoolを参照してください。同じネームスペース内の他のメンバーが開始したホストを持つプールに再接続するには、"namespace"が必要です。 - token (
str, 省略可) — HFトークンの上書き。
IDを指定して実行中のプールに再接続します。どのマシンからでも実行でき、ローカル状態は不要です。
pool_id でラベル付けされた実行中のホストを検索し、そのホストジョブのスペックと環境変数からプールの設定(image/flavor/density/host-idle)を再構築します。これにより、SandboxPool が返され、実行中のホストにサンドボックスを詰め込むか、ホストが満杯の場合は複製(同じ設定)を起動して、create() によりさらに多くのサンドボックスを作成する準備が整います。
実行中のホストが見つからない場合、SandboxError を発生させます(プールは、そのホストがすべて消滅した時点で存在しなくなります。アイドルタイムアウトまたは強制終了された場合です)。
create
< source >( env: dict[str, typing.Any] | None = Noneidle_timeout: int | float | str | None = 600forward_hf_token: bool = False )
パラメータ
- env (
dict[str, Any]、省略可) — このサンドボックス用の環境変数(各サンドボックスは個別に割り当てられます)。 - idle_timeout (
intまたはfloatまたはstr、省略可能、デフォルトは600) — サンドボックスごとのアイドルタイムアウトです。この時間だけアクティビティ(API 呼び出しや実行中のプロセス)がない場合、サンドボックスはホストから退避されます。ホストのアイドルタイムアウトとは異なります。Noneを渡すと無効になります。 - forward_hf_token (
bool、省略可能、デフォルトはFalse) — True の場合、サンドボックスにHF_TOKENとして HF トークンを注入します(オプトイン方式)。専用のサンドボックスのsecretsとは異なり、プールされたサンドボックスの環境変数は作成時にホストサーバーに配信されるため(ホストジョブには保存されません)、どのジョブのメタデータにも表示されません。
必要に応じてホストをプロビジョニングし、1つのサンドボックスを作成します。
空き容量のあるホスト(このプールのもの、またはジョブラベル/ローカルキャッシュ経由で発見されたウォームホスト)を再利用してから新しいホストを起動するため、ウォームホストに対するcreate()のコストは往復1回程度です。ファンアウトのために繰り返し呼び出してください。最初の呼び出しでのコールドスタートを避けるには、warm_up(またはwarm)を使用してホストを事前プロビジョニングしてください。ホストが私たちの下で満杯になった場合(別のプロセスが詰め込んだ場合)や、キャッシュされたホストが存在しなくなった場合、サンドボックスは別のホスト(または新しいホスト)に再配置されます。
num_hosts 個の空のホストが実行されていることを確認し、その状態を維持します。プールのホストのジョブ ID を返します。
プールを事前に「作成」するために使用されます。ホストはプールラベルと設定(環境変数に格納)を保持しているため、後から別のマシンからでもSandboxPool.connect(pool_id)を呼び出すと、それらのホストを見つけ出し、コールドスタートなしでサンドボックスを起動できます。ホストは、停止されるかアイドル状態になるまで課金され続けます。
このプール用にすでに稼働中のホスト(ジョブラベルで特定)を起動前に採用するため、connect() の後の warm()、または warm() の繰り返し呼び出しは、稼働中のホストを重複させたり max_hosts を超えたりするのではなく、num_hosts までホスト数を補完します。
データ構造
SandboxCommandResult
クラス huggingface_hub.SandboxCommandResult
< source >( exit_code: int | Nonestdout: strstderr: strsignal: int | None = Nonetimed_out: bool = Falseduration_ms: int = 0 )
Sandbox.run()でサンドボックス内で実行されたコマンドの結果。
SandboxProcess
クラス huggingface_hub.SandboxProcess
< source >( id: str | Nonepid: intcmd: typing.Union[str, typing.List[str]]_sandbox: Sandboxtag: str | None = Nonestarted_at_ms: int | None = Nonerunning: bool = Trueexit_code: int | None = None )
Sandbox.run()(..., background=True)でサンドボックス内で開始されたバックグラウンドプロセス。
Sandbox.processes() でサンドボックスのプロセスをリスト表示し、SandboxProcess.kill() でプロセスを停止できます。
最近完了したプロセスはリストに保持されます(サーバーは一定数のみを保持します)。そのため、running と exit_code を確認することで、プロセスがまだ実行中か、それとも既に終了しているか(リスト表示時点での状態)を判断できます。
バックグラウンドプロセスを終了します。冪等です。
この呼び出しが停止の原因かどうかを返します: False は、すでに終了または終了処理が行われたことを意味し、これはエラーではありません。
setsid() を呼び出して分離した子プロセスは、シグナルが送信されたプロセスグループから離脱し、この呼び出しよりも長く存続します。起動したすべてのプロセスが終了していることを確実にするためには、サンドボックスを削除してください。
FileEntry
クラス huggingface_hub._sandbox.FileEntry
< source >( name: strpath: strtype: typing.Literal['file', 'dir', 'symlink']size: intmtime_ms: int | None = Nonemode: str = '' )
サンドボックス内のファイルまたはディレクトリ。
エラー
SandboxError
クラス huggingface_hub.errors.SandboxError
< source >( message: strstatus_code: int | None = None )
サンドボックス操作の基底例外(huggingface_hub.Sandboxを参照)。
SandboxCommandError
クラス huggingface_hub.errors.SandboxCommandError
< source >( cmdresult )
サンドボックス内で実行されたコマンドがゼロ以外の終了コードで終了した場合に発生します。