Hub Python Library documentation
Песочницы
Песочницы
Sandbox API является экспериментальным. Его API и поведение могут измениться без предварительного уведомления. Общие песочницы предназначены для рабочих нагрузок в пределах одной границы доверия; для рабочих нагрузок, которые не доверяют друг другу, используйте выделенные песочницы.
Ознакомьтесь с руководством по песочницам, чтобы узнать, как их использовать.
Песочница
класс huggingface_hub.Sandbox
< source >( id: strserver: _SandboxServerlocal_id: str | Noneowns_sandbox: boolowns_server: boolsandbox_token: str | None = None )
Изолированная облачная машина, работающая в Hugging Face Jobs.
API Sandbox является экспериментальным. Его API и поведение могут измениться без предварительного уведомления.
Создайте отдельный с помощью Sandbox.create() (одна задача на один песочный контейнер) или получите множество дешёвых общих из 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"): Любой Docker-образ с/bin/sh(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 в настоящее время не учитывается как активность, поэтому одиночный вызовrun(), длящийся дольше этого времени без иного трафика API, может привести к завершению работы песочницы — увеличьте тайм-аут (или передайтеNone) для длительных одиночных команд. - env (
dict[str, Any], необязательный) — Переменные окружения, доступные в песочнице. - secrets (
dict[str, Any], необязательный) — Секретные переменные окружения (шифруются на стороне сервера). - volumes (
List[Volume], необязательный) — репозитории/бакеты HF для монтирования, см. Volume. - namespace (
str, необязательный) — Пространство имён пользователя или организации, от имени которого выполняется запуск (по умолчанию — текущий пользователь). - forward_hf_token (
bool, необязательный, по умолчаниюFalse) — Если True, ваш HF-токен передается какHF_TOKEN(по явному запросу). - labels (
dict[str, str], необязательный) — Метки, которые будут назначены базовой задаче HF. - start_timeout (
float, необязательный, по умолчанию120.0) — Максимальное время ожидания в секундах, пока песочница не станет готовой. - token (
str, необязательный) — Переопределение токена HF.
Создайте отдельную песочницу (один HF Job) и блокируйте выполнение, пока она не будет готова (~7 с на cpu-basic).
Каждый песочница представляет собой полностью изолированную виртуальную машину, поэтому это правильный выбор для GPU-нагрузок или недоверенного кода. Чтобы развернуть множество недорогих CPU-песочниц, используйте SandboxPool.
Задача выполняется с фиксированным максимальным временем жизни 24 часа; idle_timeout — это настоящий «страж»: бездействующий песочный контейнер завершает работу задолго до этого срока.
Для изображения достаточно /bin/sh. Сервер песочницы загружается при запуске с помощью wget/curl, если они доступны, в противном случае он считывается из постоянно смонтированного серверного бакета (что
добавляет ~2-3 секунды к холодному запуску, поэтому наличие wget/curl позволяет сохранить скорость).
Перечислите фоновые процессы этой песочницы.
Возвращает процессы, запущенные с помощью Sandbox.run()(..., background=True); остановить один из них можно с помощью SandboxProcess.kill(). Недавно завершённые процессы остаются в списке (с running=False и их exit_code); сервер хранит ограниченное количество таких процессов, поэтому песочница, в которой было выполнено тысячи коротких команд, не будет перечислять их все.
proxy_url_for
< source >( port: int | strpath: str = '/'scheme: str = 'https://' ) → str
Параметры
- port (
intorstr) — Порт (для пула:<port>unix-сокета), на котором внутренний сервер принимает соединения. - path (
str, необязательный, по умолчанию"/") — Путь на внутреннем сервере, на который нужно указать, например,"/ws". - scheme (
str, необязательный, по умолчанию"https --//"): Схема URL для построения ссылки. По умолчанию"https://"; передайте"wss://"для WebSocket-клиента (прокси не зависит от протокола, поэтому меняется только схема на стороне клиента).
Возвращает
str
URL вида https://<job_id>--49983.hf.jobs/v1/.../proxy/8000/ws (или
wss://... с scheme="wss://").
Публичный URL, который проксирует запросы на сервер, работающий внутри этой песочницы.
Запросы к возвращённому URL пересылаются песочным сервером внутри задания на сервер, запущенный вами в песочнице на port, включая апгрейды WebSocket (ws(s)://) и потоковые ответы. Используйте вместе с proxy_headers для аутентификации.
Как песочница должна слушать port:
- Пул / общая песочница: она не может привязать TCP-порт (Landlock), поэтому привяжите unix-сокет к
$SBX_PROXY_DIR/<port>.sock(переменная окруженияSBX_PROXY_DIRзадана в каждой песочнице). Например,uvicorn app:app --uds $SBX_PROXY_DIR/8000.sock. - Выделенная песочница: привяжите обычный TCP-порт к
127.0.0.1:<port>. (Вы также можете напрямую открыть порт через прокси задачи, минуя этот шаг.)
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 (выполняется напрямую). - shell (
bool, необязательный) — Принудительно задаёт режим выполнения, не выводя его из типаcmd.Trueвыполняет команду через/bin/sh -cи требует, чтобыcmdбыла строкой;Falseвыполняетcmdнапрямую и требует, чтобы это был список argv.None(по умолчанию) определяет режим по типу. Укажите значение явно, чтобы избежать ошибок, связанных с типом (например,["echo hi"]будет выполнен как одна программа с именем"echo hi"). - env (
dict[str, Any], необязательный) — Дополнительные переменные окружения для этой команды. - cwd (
str, необязательный) — Рабочая директория. - timeout (
float, необязательный) — Прервать выполнение команды (всей группы процессов) по истечении указанного количества секунд. - stdin (
str, необязательный) — Данные для записи в stdin команды. - on_stdout (
Callable[[str], None], необязательный) — Обработчик, вызываемый с фрагментами stdout по мере их поступления. - on_stderr (
Callable[[str], None], необязательный) — Обработчик, вызываемый с фрагментами stderr по мере их поступления. - check (
bool, необязательный, по умолчаниюTrue) — Если True, вызываетSandboxCommandErrorпри ненулевом коде завершения. - capture_output (
bool, необязательный, по умолчаниюTrue) — Если True, stdout/stderr накапливаются в возвращаемом результате. ПередайтеFalse, если вам нужны толькоon_stdout/on_stderr: в этом случае вывод передается обработчикам и отбрасывается, поэтому команде, генерирующей гигабайты данных, не нужно помещаться в оперативную память.result.stdout/result.stderrв этом случае будут пустыми. - background (
bool, необязательный, по умолчаниюFalse) — Если True, запускает команду в фоновом режиме и сразу возвращает SandboxProcess, не дожидаясь её завершения и не возвращая SandboxCommandResult.
Выполните команду в песочнице и дождитесь её завершения, получая вывод в реальном времени.
При background=True команда запускается в фоновом режиме, а run сразу возвращает объект SandboxProcess, не дожидаясь завершения процесса, — это удобно для серверов и других долгоживущих процессов. Позже их можно получить списком с помощью Sandbox.processes() и остановить один из них с помощью SandboxProcess.kill(). Опции потоковой передачи и ожидания (timeout, stdin, on_stdout, on_stderr, check) в этом режиме не применяются.
Возвращает: SandboxCommandResult (с exit_code, stdout, stderr, duration_ms) или SandboxProcess, если background=True.
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 песочниц.
API Sandbox является экспериментальным. Его API и поведение могут измениться без предварительного уведомления.
Пул песочниц предназначен для рабочих нагрузок внутри одной границы доверия. Пул песочниц — это uid и набор правил Landlock внутри общей ВМ, а не отдельная ВМ, и все песочницы на хосте разделяют его токен аутентификации и его привилегированную управляющую плоскость. Используйте пул, чтобы дёшево масштабировать ваш собственный код. Для взаимно недоверяющих рабочих нагрузок используйте Sandbox.create(), который выделяет каждой из них отдельную ВМ. Конкретные ограничения перечислены в разделе «Известные ограничения» концептуального руководства по песочницам.
Один хост — это один тарифицируемый HF Job (виртуальная машина); он запускает сервер песочниц и мультиплексирует до sandboxes_per_host лёгких песочниц, изолированных друг от друга с помощью uid и Landlock LSM. Это делает масштабирование на большое количество параллельных задач дешёвым (стоимость виртуальной машины распределяется между всеми её песочницами) и быстрым (создание песочницы занимает около одного запроса к прокси, когда хост уже разогрет). Лучше всего подходит для множества параллельных CPU-песочниц, например для RL rollouts; для GPU или сильной изоляции на уровне виртуальной машины между недоверяющими друг другу нагрузками используйте вместо этого 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() создаёт один песочный контейнер за раз: перед запуском нового хоста он переиспользует тот, на котором ещё есть свободные мощности, поэтому масштабирование происходит по мере поступления задач. Чтобы избежать холодного старта при первых нескольких вызовах, заранее подготовьте хосты с помощью 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, если хостовую задачу не удалось отменить, указывая задачи, которые всё ещё выполняются — они продолжают тарифицироваться, а их записи в кэше сохраняются, чтобы они оставались доступными для поиска. Если close() вызывается через __exit__ при уже возникшем исключении, ошибка логируется, чтобы не маскировать исходную ошибку.
connect
< source >( pool_id: strnamespace: str | None = Noneadopt_hosts: str = 'own'token: str | None = None )
Параметры
- pool_id (
str) — Идентификатор, возвращаемый при первом создании пула. - namespace (
str, необязательный) — Пространство имён, в котором выполняется поиск хостов пула (по умолчанию — ваше). - adopt_hosts (
str, необязательный, по умолчанию"own") — Список хостов, к которым можно подключаться. См. SandboxPool. Для повторного подключения к пулу, хосты которого были запущены другим участником пространства имён, требуется значение"namespace". - token (
str, необязательный) — Переопределение токена HF.
Переподключитесь к работающему пулу по идентификатору с любого компьютера — локальное состояние не требуется.
Находит работающий хост с меткой 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-токен будет передан в песочницу какHF_TOKEN(по желанию). В отличие отsecretsвыделенной песочницы, переменные окружения пуловой песочницы передаются на хост-сервер при создании (никогда не сохраняются в задаче хоста), поэтому они не отображаются в метаданных какой-либо задачи.
Создайте один песочный контейнер, при необходимости развернув хост.
Повторно использует хост со свободной ёмкостью (из этого пула или «тёплый» хост, найденный по меткам задания / в локальном кэше) перед запуском нового, поэтому вызов create() для «тёплого» хоста занимает примерно один round-trip. Вызывайте его многократно для распределения нагрузки; используйте warm_up (или warm), чтобы заранее подготовить хосты и избежать холодного запуска при первых вызовах. Если хост заполняется под нами (другой процесс занял его) или кэшированный хост исчезает, песочница перемещается на другой хост (или на новый).
Убедитесь, что запущены num_hosts пустых хостов, и оставьте их запущенными. Возвращает идентификаторы задач хостов пула.
Используется для предварительного «создания» пула: хосты несут метку и конфигурацию пула (в переменных окружения), поэтому последующий вызов SandboxPool.connect(pool_id) (даже с другой машины) находит их и запускает песочницы без холодного старта. Хосты продолжают тарифицироваться, пока не будут остановлены или не окажутся в режиме простоя.
Перед запуском новых узлов принимает уже работающие хосты для этого пула (находятся по меткам задач), поэтому вызов warm() после connect() — или повторный вызов warm() — доводит количество узлов до num_hosts, а не дублирует активные хосты и не превышает max_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 )
Возникает, когда команда, выполненная в песочнице, завершается с ненулевым кодом.