Hub Python Library documentation
Các môi trường cách ly
Các môi trường cách ly
API Sandbox mang tính thử nghiệm. API và hành vi của nó có thể thay đổi mà không có thông báo trước. Sandbox dùng chung được thiết kế cho các tác vụ nằm trong cùng một ranh giới tin cậy; hãy sử dụng sandbox riêng cho các tác vụ không tin tưởng lẫn nhau.
Xem hướng dẫn về Sandboxes để tìm hiểu cách sử dụng chúng.
Sandbox
lớp huggingface_hub.Sandbox
< source >( id: strserver: _SandboxServerlocal_id: str | Noneowns_sandbox: boolowns_server: boolsandbox_token: str | None = None )
Một máy cloud độc lập chạy trên Hugging Face Jobs.
API Sandbox mang tính thử nghiệm. API và hành vi của nó có thể thay đổi mà không cần thông báo trước.
Tạo một sandbox riêng bằng Sandbox.create() (một job cho mỗi sandbox), hoặc lấy nhiều sandbox dùng chung giá rẻ từ SandboxPool.
Kết nối lại với một sandbox đang chạy từ bất kỳ đâu bằng Sandbox.connect(). Sử dụng như một context manager để kết thúc nó khi thoát:
>>> from huggingface_hub import Sandbox
>>> with Sandbox.create(image="python:3.12") as sbx:
... print(sbx.run("python --version").stdout)Phóng thích client HTTP cục bộ mà không kết thúc sandbox. Idempotent.
Không thực hiện thao tác nào với các sandbox pool (client thuộc về host của pool).
Kết nối lại với một sandbox đang chạy từ bất kỳ đâu, chỉ cần sử dụng id của nó.
tạo
< 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 )
Tham số
- image (
str, tùy chọn, mặc định là"python --3.12"): Bất kỳ image Docker nào có/bin/sh(Docker Hub hoặchf.co/spaces/...). - flavor (
str, tùy chọn, mặc định là"cpu-basic") — Loại phần cứng, ví dụ"cpu-basic","a10g-small". Xemhf jobs hardware. - idle_timeout (
inthoặcfloathoặcstr, tùy chọn, mặc định là600) — Tự động tắt sau khoảng thời gian không hoạt động này (không có cuộc gọi API, không có tiến trình đang chạy). Mặc định là 10 phút; truyềnNoneđể tắt. Lưu ý rằng lệnh foreground hiện không được tính là hoạt động, do đó một lệnhrun()duy nhất mất nhiều thời gian hơn mức này mà không có lưu lượng API khác có thể khiến sandbox của nó bị tắt — hãy tăng thời gian chờ (hoặc truyềnNone) cho các lệnh đơn lẻ kéo dài. - env (
dict[str, Any], tùy chọn) — Các biến môi trường có sẵn trong sandbox. - secrets (
dict[str, Any], tùy chọn) — Các biến môi trường bí mật (được mã hóa phía máy chủ). - volumes (
List[Volume], tùy chọn) — Các kho/bucket HF để gắn, xem Volume. - namespace (
str, không bắt buộc) — Namespace của người dùng hoặc tổ chức để chạy (mặc định là người dùng hiện tại). - forward_hf_token (
bool, tùy chọn, mặc định làFalse) — Nếu là True, token HF của bạn sẽ được chèn dưới dạngHF_TOKEN(chọn tham gia). - labels (
dict[str, str], tùy chọn) — Nhãn để gắn cho HF Job bên dưới. - start_timeout (
float, tùy chọn, mặc định là120.0) — Số giây tối đa để chờ sandbox sẵn sàng. - token (
str, tùy chọn) — Ghi đè token HF.
Tạo một sandbox riêng (một HF Job) và chặn cho đến khi nó sẵn sàng (~7s trên cpu-basic).
Mỗi sandbox là một VM cách ly hoàn toàn, vì vậy đây là lựa chọn phù hợp cho các tác vụ GPU hoặc mã không đáng tin cậy. Để triển khai nhiều sandbox CPU giá rẻ hơn, hãy sử dụng SandboxPool.
Công việc chạy với thời gian tồn tại tối đa cố định là 24 giờ; idle_timeout mới là yếu tố thực sự quyết định — một sandbox ở trạng thái nhàn rỗi sẽ tự động tắt trước thời điểm đó rất lâu.
Hình ảnh chỉ cần /bin/sh. Máy chủ sandbox sẽ được tải xuống khi khởi động bằng wget/curl nếu có sẵn, nếu không sẽ được đọc từ một server bucket luôn được gắn (điều này
thêm ~2-3s vào thời gian khởi động lạnh, vì vậy việc cung cấp wget/curl giúp giữ tốc độ nhanh).
Liệt kê các tiến trình nền của sandbox này.
Trả về các tiến trình được khởi chạy bằng Sandbox.run()(..., background=True); dừng một tiến trình bằng SandboxProcess.kill(). Các tiến trình vừa hoàn thành vẫn được liệt kê (với running=False và exit_code của chúng); máy chủ chỉ giữ một số lượng có giới hạn các tiến trình này, nên một sandbox đã chạy hàng nghìn lệnh ngắn sẽ không liệt kê tất cả chúng.
proxy_url_for
< source >( port: int | strpath: str = '/'scheme: str = 'https://' ) → str
Tham số
- port (
inthoặcstr) — Cổng (pool:<port>của unix socket) mà server bên trong lắng nghe. - path (
str, tùy chọn, mặc định là"/") — Đường dẫn trên máy chủ bên trong cần trỏ đến, ví dụ"/ws". - scheme (
str, tùy chọn, mặc định là"https --//"): URL scheme để xây dựng liên kết. Mặc định là"https://"; truyền"wss://"cho một WebSocket client (proxy không phụ thuộc giao thức, nên chỉ scheme phía client thay đổi).
Trả về
str
một URL như https://<job_id>--49983.hf.jobs/v1/.../proxy/8000/ws (hoặc
wss://... với scheme="wss://").
URL công khai được proxy đến một máy chủ chạy bên trong sandbox này.
Các yêu cầu đến URL được trả về sẽ được chuyển tiếp bởi máy chủ sandbox trong job đến máy chủ mà bạn đã khởi chạy trong sandbox trên port, bao gồm cả nâng cấp WebSocket (ws(s)://) và các phản hồi dạng luồng. Kết hợp với proxy_headers để xác thực.
Cách sandbox phải lắng nghe trên port:
- Pool / sandbox dùng chung: không thể bind cổng TCP (Landlock), do đó hãy bind một unix socket tại
$SBX_PROXY_DIR/<port>.sock(biến môi trườngSBX_PROXY_DIRđược đặt trong mọi sandbox). Ví dụ:uvicorn app:app --uds $SBX_PROXY_DIR/8000.sock. - Không gian riêng biệt: gắn một cổng TCP thông thường vào
127.0.0.1:<port>. (Bạn cũng có thể phơi bày trực tiếp cổng này qua proxy của job mà không cần đi qua đây.)
chạy
< 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 )
Tham số
- cmd (
strhoặcList[str]) — Chuỗi lệnh shell (chạy với/bin/sh -c) hoặc danh sách argv (được thực thi trực tiếp). - shell (
bool, tùy chọn) — Buộc chế độ thực thi thay vì suy luận từ kiểu củacmd.Truechạy thông qua/bin/sh -cvà yêu cầucmdphải là chuỗi;Falsethực thicmdtrực tiếp và yêu cầu nó phải là danh sách argv.None(mặc định) sẽ suy luận từ kiểu. Hãy đặt giá trị này một cách rõ ràng để tránh các lỗi do kiểu dữ liệu gây ra (ví dụ:["echo hi"]bị thực thi như một chương trình duy nhất có tên là"echo hi"). - env (
dict[str, Any], tùy chọn) — Các biến môi trường bổ sung cho lệnh này. - cwd (
str, tùy chọn) — Thư mục làm việc. - timeout (
float, tùy chọn) — Kết thúc lệnh (toàn bộ nhóm tiến trình) sau số giây này. - stdin (
str, tùy chọn) — Dữ liệu để ghi vào stdin của lệnh. - on_stdout (
Callable[[str], None], tùy chọn) — Callback được gọi với các khối stdout khi chúng đến. - on_stderr (
Callable[[str], None], tùy chọn) — Callback được gọi với các phần stderr khi chúng đến. - check (
bool, tùy chọn, mặc định làTrue) — Nếu là True, sẽ némSandboxCommandErrorkhi mã thoát khác không. - capture_output (
bool, tùy chọn, mặc định làTrue) — Nếu là True, sẽ tích lũy stdout/stderr vào kết quả được trả về. TruyềnFalsekhi bạn chỉ muốn dùngon_stdout/on_stderr: khi đó đầu ra sẽ được chuyển cho các callback và bị bỏ đi, nên một lệnh tạo ra hàng gigabyte dữ liệu không cần phải vừa trong bộ nhớ.result.stdout/result.stderrsẽ trống trong trường hợp đó. - background (
bool, tùy chọn, mặc định làFalse) — Nếu là True, bắt đầu lệnh ở chế độ tách rời và trả về một SandboxProcess ngay lập tức thay vì chờ đợi và trả về một SandboxCommandResult.
Chạy một lệnh trong sandbox và chờ nó, đồng thời phát trực tiếp đầu ra.
Với background=True, lệnh được khởi chạy ở chế độ tách rời và run trả về một SandboxProcess ngay lập tức, không chờ nó hoàn tất — rất tiện cho các server và các tiến trình chạy dài khác. Bạn có thể liệt kê chúng sau đó bằng Sandbox.processes() và dừng một tiến trình bằng SandboxProcess.kill(). Các tùy chọn chỉ dành cho streaming/chờ (timeout, stdin, on_stdout, on_stderr, check) không áp dụng trong chế độ đó.
Trả về: một SandboxCommandResult (với exit_code, stdout, stderr, duration_ms), hoặc một SandboxProcess khi background=True.
SandboxPool
lớp 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 )
Một đội gồm các tác vụ “host” dùng chung, mỗi tác vụ chứa nhiều sandbox được cách ly bằng landlock.
API Sandbox mang tính thử nghiệm. API và hành vi của nó có thể thay đổi mà không cần thông báo trước.
Các sandbox dạng pooled dành cho các tác vụ nằm trong cùng một ranh giới tin cậy. Một sandbox pooled là một uid cùng một bộ quy tắc Landlock bên trong một VM dùng chung — không phải một VM riêng — và mọi sandbox trên một host đều dùng chung token xác thực của host đó cùng mặt phẳng điều khiển có đặc quyền. Hãy dùng một pool để triển khai mã của chính bạn một cách tiết kiệm. Đối với các tác vụ không tin tưởng lẫn nhau, hãy dùng Sandbox.create(), trong đó mỗi tác vụ sẽ có một VM riêng. Các khoảng trống cụ thể được liệt kê dưới mục “Known limitations” trong hướng dẫn khái niệm về sandbox.
Một host là một HF Job được tính phí (một VM); nó chạy sandbox server và multiplex tối đa sandboxes_per_host sandbox nhẹ, được cách ly khỏi nhau bằng uid + Landlock LSM. Điều này giúp các fan-out lớn trở nên rẻ (chi phí VM được chia sẻ giữa tất cả sandbox của nó) và nhanh (việc tạo một sandbox chỉ mất ~một lượt proxy round-trip khi host đã warm). Phù hợp nhất cho nhiều sandbox CPU song song như RL rollouts; đối với GPU hoặc cách ly ở cấp VM mạnh giữa các workload không tin tưởng lẫn nhau, hãy dùng Sandbox.create() thay thế.
Hàm khởi tạo cấp phát trước warm_up máy chủ (mặc định là 1) và chặn cho đến khi chúng sẵn sàng; các máy chủ tiếp theo sẽ được cấp phát theo nhu cầu khi có yêu cầu sandbox, và tất cả
được gỡ bỏ khi close() (hoặc khi nhàn rỗi, thông qua idle_timeout). Người dùng không bao giờ quản lý các tác vụ:
>>> 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() tạo một sandbox mỗi lần: nó tái sử dụng một host vẫn còn dung lượng trống trước khi khởi động một host mới, nhờ đó bạn mở rộng theo nhu cầu khi công việc đến. Để tránh khởi động lạnh trong vài lần gọi đầu tiên, hãy cung cấp trước các host bằng warm_up (hoặc warm). Các host ấm được phát hiện thông qua nhãn công việc, nên việc tái sử dụng cũng hoạt động giữa các tiến trình (một pool mới với cùng image/flavor/name sẽ gắn vào
chứa một lần chạy trước đó để lại):
>>> pool = SandboxPool(image="python:3.12")
>>> sbx = pool.create() # finds a warm host (here or in another process), else boots oneGiải phóng pool. Idempotent.
Đối với pool do chúng ta tạo, thao tác này sẽ kết thúc tất cả các tác vụ host (và do đó là tất cả các sandbox của chúng). Đối với handle đã được connect(), nó chỉ giải phóng các client HTTP cục bộ: các host dùng chung có thể đang phục vụ các client khác, nên — giống như Sandbox.connect() — việc rời khỏi khối with không được phép hủy chúng. Hãy kết thúc các host của pool đã kết nối một cách tường minh bằng hf sandbox pool delete <id>.
Chỉ các host mà chúng ta đã khởi động mới bị hủy. Một host được phát hiện thông qua nhãn có thể đang phục vụ các sandbox của một tiến trình khác, do đó nó được giải phóng thay vì bị kết thúc.
Ném SandboxError nếu một tác vụ trên host không thể bị hủy, kèm theo tên của các tác vụ vẫn đang chạy — chúng tiếp tục bị tính phí và các mục cache của chúng được giữ lại để vẫn có thể tìm thấy. Khi close() được gọi thông qua __exit__ trong khi một ngoại lệ đã đang diễn ra, lỗi sẽ được ghi log thay vì được ném ra, để không che lấp lỗi gốc.
connect
< source >( pool_id: strnamespace: str | None = Noneadopt_hosts: str = 'own'token: str | None = None )
Tham số
- pool_id (
str) — Id được trả về khi pool được tạo lần đầu. - namespace (
str, tùy chọn) — Namespace để tìm kiếm các host của pool (mặc định là của bạn). - adopt_hosts (
str, tùy chọn, mặc định là"own") — Các host nào có thể được gắn vào. Xem SandboxPool. Việc gắn lại vào một pool mà các host của nó được khởi tạo bởi một thành viên khác trong namespace cần"namespace". - token (
str, tùy chọn) — Ghi đè token HF.
Gắn lại vào một pool đang chạy theo id, từ bất kỳ máy nào — không cần trạng thái cục bộ.
Tìm một host đang chạy được gắn nhãn pool_id và xây dựng lại cấu hình của pool (image/flavor/density/host-idle) từ spec và các biến môi trường của job host đó, trả về một SandboxPool sẵn sàng để create() thêm các sandbox — đóng gói lên các host đang chạy, hoặc khởi động một bản sao (cùng cấu hình) khi chúng đã đầy.
Ném SandboxError nếu không tìm thấy host nào đang chạy (một pool sẽ ngừng tồn tại khi tất cả các host của nó biến mất — do hết thời gian chờ nhàn rỗi hoặc bị kết thúc).
tạo
< source >( env: dict[str, typing.Any] | None = Noneidle_timeout: int | float | str | None = 600forward_hf_token: bool = False )
Tham số
- env (
dict[str, Any], tùy chọn) — Các biến môi trường cho sandbox này (mỗi sandbox có bộ biến riêng). - idle_timeout (
inthoặcfloathoặcstr, tùy chọn, mặc định là600) — Thời gian chờ không hoạt động cho từng sandbox — một sandbox sẽ bị loại khỏi host của nó sau khoảng thời gian không hoạt động này (không có cuộc gọi API, không có tiến trình đang chạy). Khác với thời gian chờ không hoạt động của host. TruyềnNoneđể tắt. - forward_hf_token (
bool, tùy chọn, mặc định làFalse) — Nếu là True, sẽ chèn token HF của bạn dưới dạngHF_TOKENtrong sandbox (chọn tham gia). Khác vớisecretscủa một sandbox chuyên dụng, biến môi trường của sandbox dạng pooled được gửi đến máy chủ host khi tạo (không bao giờ được lưu trong job của host), do đó nó không xuất hiện trong metadata của bất kỳ job nào.
Tạo một sandbox, cấp phát một host nếu cần.
Tái sử dụng một host có dung lượng trống (của pool này, hoặc một host ấm được tìm thấy qua nhãn job / bộ nhớ đệm cục bộ) trước khi khởi động một host mới, do đó một lệnh create() trên một host ấm chỉ tốn khoảng một lượt đi-về. Gọi lệnh này nhiều lần để phân tán; sử dụng warm_up (hoặc warm) để cung cấp sẵn các host và tránh khởi động lạnh ở các lần gọi đầu tiên. Nếu một host bị đầy dưới chân chúng ta (một tiến trình khác đã lấp đầy nó) hoặc một host trong bộ nhớ đệm đã biến mất, sandbox sẽ được đặt lại trên một host khác (hoặc một host mới).
Đảm bảo num_hosts host trống đang chạy và giữ cho chúng tiếp tục chạy. Trả về các id job của host trong pool.
Được dùng để “tạo” sẵn một pool: các host mang nhãn và cấu hình của pool (trong các biến môi trường của chúng), do đó một lệnh SandboxPool.connect(pool_id) sau đó (ngay cả từ một máy khác) sẽ tìm thấy chúng và khởi tạo các sandbox mà không cần khởi động lạnh. Các host tiếp tục tính phí cho đến khi bị kết thúc hoặc ở trạng thái nhàn rỗi.
Nhận các host đã đang chạy cho pool này (tìm thấy qua nhãn của job) trước khi khởi động,
do đó một warm() sau connect() — hoặc một warm() lặp lại — sẽ bổ sung lên đến num_hosts thay vì nhân bản các host đang hoạt động và vượt quá max_hosts.
Cấu trúc dữ liệu
SandboxCommandResult
lớp huggingface_hub.SandboxCommandResult
< source >( exit_code: int | Nonestdout: strstderr: strsignal: int | None = Nonetimed_out: bool = Falseduration_ms: int = 0 )
Kết quả của một lệnh được thực thi trong sandbox bằng Sandbox.run().
SandboxProcess
lớp 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 )
Một tiến trình nền được khởi động trong một sandbox bằng Sandbox.run()(..., background=True).
Danh sách các tiến trình của một sandbox bằng Sandbox.processes() và dừng một tiến trình bằng SandboxProcess.kill().
Các tiến trình vừa hoàn thành gần đây vẫn được giữ trong danh sách (máy chủ giữ một số lượng nhất định), do đó running và exit_code cho biết một tiến trình vẫn đang chạy hay đã thoát (tính đến thời điểm nó được liệt kê).
Kết thúc tiến trình nền. Idempotent.
Trả về việc cuộc gọi này có phải là nguyên nhân khiến nó dừng lại hay không: False có nghĩa là nó đã thoát hoặc bị kết thúc trước đó, điều này không phải là lỗi.
Lưu ý rằng một tiến trình con tách ra bằng setsid() sẽ rời khỏi nhóm tiến trình được gửi tín hiệu và tồn tại lâu hơn lệnh gọi này. Hãy xóa sandbox để chắc chắn rằng mọi thứ nó khởi động đã bị xóa sạch.
FileEntry
lớp huggingface_hub._sandbox.FileEntry
< source >( name: strpath: strtype: typing.Literal['file', 'dir', 'symlink']size: intmtime_ms: int | None = Nonemode: str = '' )
Một tệp hoặc thư mục bên trong sandbox.
Lỗi
SandboxError
lớp huggingface_hub.errors.SandboxError
< source >( message: strstatus_code: int | None = None )
Ngoại lệ cơ bản cho các thao tác sandbox (xem huggingface_hub.Sandbox).
SandboxCommandError
lớp huggingface_hub.errors.SandboxCommandError
< source >( cmdresult )
Được kích hoạt khi một lệnh được chạy trong sandbox thoát với mã khác không.