Hub Python Library documentation
Sandboxes
Sandboxes
A Sandbox API é experimental. Sua API e comportamento podem mudar sem aviso prévio. Os sandboxes compartilhados são destinados a cargas de trabalho dentro do mesmo limite de confiança; use sandboxes dedicados para cargas de trabalho que não confiam umas nas outras.
Confira o guia de Sandboxes para aprender a usá-los.
Sandbox
classe huggingface_hub.Sandbox
< source >( id: strserver: _SandboxServerlocal_id: str | Noneowns_sandbox: boolowns_server: boolsandbox_token: str | None = None )
Uma máquina de nuvem isolada executada em Hugging Face Jobs.
A API do Sandbox é experimental. Sua API e comportamento podem mudar sem aviso prévio.
Crie uma dedicada com Sandbox.create() (um job por sandbox) ou obtenha muitas compartilhadas e baratas de um SandboxPool.
Reconecte-se a um sandbox em execução de qualquer lugar com Sandbox.connect(). Use como um gerenciador de contexto para encerrá-lo ao sair:
>>> from huggingface_hub import Sandbox
>>> with Sandbox.create(image="python:3.12") as sbx:
... print(sbx.run("python --version").stdout)Libere o cliente HTTP local sem encerrar o sandbox. Idempotente.
Sem efeito para sandboxes de pool (o cliente pertence ao host da pool).
Reconecte-se a um sandbox em execução de qualquer lugar, usando apenas seu id.
criar
< 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 )
Parâmetros
- image (
str, opcional, padrão"python --3.12"): Qualquer imagem Docker com/bin/sh(Docker Hub ouhf.co/spaces/...). - flavor (
str, opcional, padrão"cpu-basic") — Flavor de hardware, por exemplo,"cpu-basic","a10g-small". Consultehf jobs hardware. - idle_timeout (
intoufloatoustr, opcional, padrão600) — Desligamento automático após esse período de inatividade (sem chamadas de API, sem processos em execução). O padrão é 10 minutos; passeNonepara desativar. Observe que um comando em foreground não é atualmente contado como atividade, então um únicorun()que demore mais que isso sem outro tráfego de API pode ter seu sandbox desligado — aumente o timeout (ou passeNone) para comandos únicos longos. - env (
dict[str, Any], opcional) — Variáveis de ambiente disponíveis no sandbox. - secrets (
dict[str, Any], opcional) — Variáveis de ambiente secretas (criptografadas no servidor). - volumes (
List[Volume], opcional) — Repositórios/buckets do HF para montar, veja Volume. - namespace (
str, opcional) — Namespace de usuário ou organização para executar (padrão: usuário atual). - forward_hf_token (
bool, opcional, padrãoFalse) — Se True, seu token do HF é injetado comoHF_TOKEN(opt-in). - labels (
dict[str, str], opcional) — Rótulos a serem anexados ao Job do HF subjacente. - start_timeout (
float, opcional, padrão120.0) — Segundos máximos para aguardar que o sandbox esteja pronto. - token (
str, opcional) — Substituição do token do HF.
Crie um sandbox dedicado (um HF Job) e bloqueie até que ele esteja pronto (~7s em cpu-basic).
Cada sandbox é uma VM isolada completa, portanto, esta é a escolha correta para cargas de trabalho de GPU ou código não confiável. Para distribuir muitos sandboxes de CPU de baixo custo, use SandboxPool.
O job é executado com uma vida útil máxima fixa de 24h; idle_timeout é o verdadeiro responsável — um sandbox ocioso se desliga muito antes disso.
A imagem precisa apenas de /bin/sh. O servidor sandbox é baixado na inicialização com wget/curl, se disponível; caso contrário, é lido de um bucket de servidor sempre montado (o que adiciona ~2-3s ao cold start, então incluir wget/curl mantém o processo rápido).
Liste os processos em segundo plano deste sandbox.
Retorna os processos iniciados com Sandbox.run()(..., background=True); encerre um deles com SandboxProcess.kill(). Processos concluídos recentemente permanecem listados (com running=False e seu exit_code); o servidor mantém um número limitado deles, de modo que um sandbox que executou milhares de comandos curtos não os listará todos.
proxy_url_for
< source >( port: int | strpath: str = '/'scheme: str = 'https://' ) → str
Parâmetros
- port (
intoustr) — A porta (pool: o<port>do socket unix) na qual o servidor interno escuta. - path (
str, opcional, padrão"/") — Caminho no servidor interno para o qual apontar, por exemplo,"/ws". - scheme (
str, opcional, padrão"https --//"): Esquema de URL para construir o link. O padrão é"https://"; passe"wss://"para um cliente WebSocket (o proxy é agnóstico em relação ao protocolo, então apenas o esquema do lado do cliente muda).
Retorna
str
uma URL como https://<job_id>--49983.hf.jobs/v1/.../proxy/8000/ws (ou
wss://... com scheme="wss://").
URL pública que faz proxy para um servidor executado dentro deste sandbox.
As solicitações à URL retornada são encaminhadas pelo servidor de sandbox do job para um servidor que você iniciou na sandbox na port, incluindo upgrades de WebSocket (ws(s)://) e respostas em streaming. Combine-o com proxy_headers para autenticação.
Como o sandbox deve escutar na port:
- Pool / sandbox compartilhado: não é possível vincular uma porta TCP (Landlock), portanto vincule um socket unix em
$SBX_PROXY_DIR/<port>.sock(a variável de ambienteSBX_PROXY_DIRé definida em todos os sandboxes). Por exemplo,uvicorn app:app --uds $SBX_PROXY_DIR/8000.sock. - Sandbox dedicado: vincule uma porta TCP normal em
127.0.0.1:<port>. (Você também pode expor a porta diretamente via o proxy do job, sem passar por aqui.)
executar
< 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 )
Parâmetros
- cmd (
strouList[str]) — Uma string de comando de shell (executada com/bin/sh -c) ou uma lista argv (executada diretamente). - shell (
bool, opcional) — Força o modo de execução em vez de inferi-lo a partir do tipo decmd.Trueexecuta através de/bin/sh -ce exige quecmdseja uma string;Falseexecutacmddiretamente e exige que seja uma lista argv.None(padrão) infere a partir do tipo. Defina-o explicitamente para evitar o problema causado pelo tipo (por exemplo,["echo hi"]sendo executado como um único programa chamado"echo hi"). - env (
dict[str, Any], opcional) — Variáveis de ambiente extras para este comando. - cwd (
str, opcional) — Diretório de trabalho. - timeout (
float, opcional) — Encerra o comando (todo o grupo de processos) após esse número de segundos. - stdin (
str, opcional) — Dados a serem gravados no stdin do comando. - on_stdout (
Callable[[str], None], opcional) — Callback chamado com os blocos de stdout à medida que chegam. - on_stderr (
Callable[[str], None], opcional) — Callback chamado com os blocos de stderr à medida que chegam. - check (
bool, opcional, padrãoTrue) — Se True, levantaSandboxCommandErrorem caso de saída não nula. - capture_output (
bool, opcional, padrãoTrue) — Se True, acumula stdout/stderr no resultado retornado. PasseFalsequando você quiser apenason_stdout/on_stderr: a saída é então entregue aos callbacks e descartada, de modo que um comando que gera gigabytes não precisa caber na memória.result.stdout/result.stderrficam vazios nesse caso. - background (
bool, opcional, padrãoFalse) — Se True, inicia o comando em segundo plano e retorna um SandboxProcess imediatamente, em vez de aguardá-lo e retornar um SandboxCommandResult.
Execute um comando no sandbox e aguarde por ele, transmitindo a saída ao vivo.
Com background=True, o comando é iniciado de forma destacada e run retorna um SandboxProcess imediatamente, sem aguardar a conclusão — útil para servidores e outros processos de longa duração. Liste-os posteriormente com Sandbox.processes() e encerre um deles com SandboxProcess.kill(). As opções de streaming/apenas espera (timeout, stdin, on_stdout, on_stderr, check) não se aplicam nesse modo.
Retorna: um SandboxCommandResult (com exit_code, stdout, stderr, duration_ms), ou um SandboxProcess quando background=True.
SandboxPool
classe 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 )
Uma frota de jobs compartilhados de “host”, cada um contendo muitos sandboxes isolados por landlock.
A API do Sandbox é experimental. Sua API e comportamento podem mudar sem aviso prévio.
Sandboxes em pool são para workloads dentro de uma única fronteira de confiança. Um sandbox em pool é um uid mais um conjunto de regras Landlock dentro de uma VM compartilhada — não uma VM própria — e todos os sandboxes em um host compartilham o token de autenticação e o plano de controle privilegiado desse host. Use um pool para distribuir seu próprio código de forma econômica. Para workloads que não confiam uns nos outros, use Sandbox.create(), que fornece uma VM própria para cada um. As lacunas específicas estão listadas em “Limitações conhecidas” no guia conceitual de sandboxes.
Um host é um Job da HF faturado (uma VM); ele executa o servidor de sandbox e multiplexa até sandboxes_per_host sandboxes leves, isolados uns dos outros por uid + o Landlock LSM. Isso torna grandes expansões paralelas baratas (o custo da VM é compartilhado entre todos os seus sandboxes) e rápidas (criar um sandbox é ~uma ida e volta de proxy uma vez que o host está quente). Ideal para muitos sandboxes CPU paralelos, como rollouts de RL; para GPU ou isolamento forte no nível da VM entre cargas de trabalho que se desconfiam mutuamente, use Sandbox.create() em vez disso.
O construtor provisiona previamente warm_up hosts (padrão 1) e bloqueia até que estejam
prontos; os hosts adicionais são provisionados sob demanda conforme os sandboxes são solicitados, e todos
são desmontados no close() (ou quando ociosos, via idle_timeout). O usuário nunca gerencia os jobs:
>>> 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() cria um sandbox por vez: ele reutiliza um host que ainda tem capacidade livre antes de iniciar um novo, para que a escala aumente sob demanda conforme o trabalho chega. Para evitar um início frio nas primeiras chamadas, provisione hosts antecipadamente com warm_up (ou warm). Hosts quentes são descobertos por meio de rótulos de job, então a reutilização funciona entre
processos também (um novo pool com a mesma image/flavor/name se conecta a
deixa para trás uma execução anterior):
>>> pool = SandboxPool(image="python:3.12")
>>> sbx = pool.create() # finds a warm host (here or in another process), else boots oneLibere o pool. Idempotente.
Para um pool que criamos, isso encerra todos os jobs do host (e, portanto, todos os seus sandboxes). Para um handle conectado via connect(), ele apenas libera os clientes HTTP locais: os hosts compartilhados podem estar atendendo a outros clientes, então — assim como Sandbox.connect() — sair de um bloco with não deve encerrá-los. Encerre explicitamente os hosts de um pool conectado com hf sandbox pool delete <id>.
Apenas hosts que iniciaram este handle são cancelados. Um host descoberto por meio de rótulos pode estar servindo sandboxes de outro processo, portanto, ele é liberado em vez de ser encerrado.
Gera SandboxError se um job do host não puder ser cancelado, indicando os jobs que
ainda estão em execução — eles continuam gerando cobrança e suas entradas de cache são mantidas para que permaneçam
descobertas. Quando close() é alcançado por meio de __exit__ com uma exceção já
em andamento, a falha é registrada em log, para que não possa mascarar o erro original.
connect
< source >( pool_id: strnamespace: str | None = Noneadopt_hosts: str = 'own'token: str | None = None )
Parâmetros
- pool_id (
str) — O id retornado quando o pool foi criado pela primeira vez. - namespace (
str, opcional) — Namespace para pesquisar os hosts do pool (padrão: o seu). - adopt_hosts (
str, opcional, padrão"own") — Quais hosts podem ser anexados. Consulte SandboxPool. Reanexar a um pool cujos hosts foram iniciados por outro membro do namespace requer"namespace". - token (
str, opcional) — Substituição do token do HF.
Reconecte-se a um pool em execução pelo id, de qualquer máquina — sem necessidade de estado local.
Encontra um host em execução rotulado com pool_id e reconstrói a configuração do pool (image/flavor/density/host-idle) a partir da especificação e das variáveis de ambiente do job desse host, retornando um SandboxPool pronto para create() mais sandboxes — empacotando nos hosts em execução ou iniciando um duplicado (mesma configuração) quando eles estiverem cheios.
Gera SandboxError se nenhum host em execução for encontrado (um pool deixa de existir quando todos os seus hosts são removidos — por tempo limite de inatividade ou por serem encerrados).
criar
< source >( env: dict[str, typing.Any] | None = Noneidle_timeout: int | float | str | None = 600forward_hf_token: bool = False )
Parâmetros
- env (
dict[str, Any], opcional) — Variáveis de ambiente para este sandbox (cada sandbox possui as suas). - idle_timeout (
intoufloatoustr, opcional, padrão600) — Tempo limite de inatividade por sandbox — uma sandbox é removida do host após esse período de inatividade (sem chamadas de API, sem processo em execução). Diferente do tempo limite de inatividade do host. PasseNonepara desativar. - forward_hf_token (
bool, opcional, padrãoFalse) — Se True, injeta seu token do HF comoHF_TOKENno sandbox (opcional). Diferentemente dossecretsde um sandbox dedicado, o env de um sandbox em pool é entregue ao servidor host na criação (nunca armazenado no job do host), portanto não aparece nos metadados de nenhum job.
Crie um sandbox, provisionando um host, se necessário.
Reutiliza um host com capacidade livre (deste pool, ou um host quente encontrado via rótulos de job / o cache local) antes de iniciar um novo, de modo que um create() em um host quente custa ~uma ida e volta. Chame-o repetidamente para distribuir as chamadas; use warm_up (ou warm) para provisionar hosts antecipadamente e evitar um início frio nas primeiras chamadas. Se um host encher sob nós (outro processo o ocupou) ou um host em cache desaparecer, o sandbox é realocado em outro host (ou em um novo).
Garanta que num_hosts host(s) vazio(s) estejam em execução e mantenha-os em execução. Retorna os ids dos jobs dos hosts do pool.
Usado para “criar” um pool antecipadamente: os hosts carregam o rótulo e a configuração do pool (em suas variáveis de ambiente), de modo que uma chamada posterior a SandboxPool.connect(pool_id) (mesmo de outra máquina) os encontra e inicia sandboxes sem um cold start. Os hosts continuam sendo cobrados até serem encerrados ou ficarem ociosos.
Adota hosts já em execução para este pool (encontrados via rótulos de job) antes de iniciar novos,
de modo que um warm() após connect() — ou um warm() repetido — complete até num_hosts em vez de duplicar hosts ativos e ultrapassar max_hosts.
Estruturas de dados
SandboxCommandResult
classe huggingface_hub.SandboxCommandResult
< source >( exit_code: int | Nonestdout: strstderr: strsignal: int | None = Nonetimed_out: bool = Falseduration_ms: int = 0 )
Resultado de um comando executado em um sandbox com Sandbox.run().
SandboxProcess
classe 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 )
Um processo em segundo plano iniciado em um sandbox com Sandbox.run()(..., background=True).
Liste os processos de um sandbox com Sandbox.processes() e encerre um deles com SandboxProcess.kill().
Processos concluídos recentemente permanecem na listagem (o servidor mantém um número limitado
deles), portanto running e exit_code indicam se um processo ainda está ativo ou já foi
encerrado (no momento em que foi listado).
Encerre o processo em segundo plano. Idempotente.
Indica se esta chamada é o que a interrompeu: False significa que ela já havia saído ou sido encerrada, o que não é um erro.
Observe que um descendente que se desconecta com setsid() deixa o grupo de processos sinalizado e sobrevive a esta chamada. Exclua o sandbox para ter certeza de que tudo o que ele iniciou foi removido.
FileEntry
classe huggingface_hub._sandbox.FileEntry
< source >( name: strpath: strtype: typing.Literal['file', 'dir', 'symlink']size: intmtime_ms: int | None = Nonemode: str = '' )
Um arquivo ou diretório dentro de um sandbox.
Erros
SandboxError
classe huggingface_hub.errors.SandboxError
< source >( message: strstatus_code: int | None = None )
Exceção base para operações de sandbox (veja huggingface_hub.Sandbox).
SandboxCommandError
classe huggingface_hub.errors.SandboxCommandError
< source >( cmdresult )
Ocorrido quando um comando executado em um sandbox termina com um código diferente de zero.