Hub Python Library documentation

Chạy và quản lý Jobs

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Chạy và quản lý Jobs

Hugging Face Hub cung cấp tài nguyên tính toán cho các quy trình làm việc AI và dữ liệu thông qua Jobs.

Để có cái nhìn tổng quan về Jobs và bảng giá, hãy xem tài liệu Hub Jobs.

Một job chạy trên hạ tầng của Hugging Face và được định nghĩa bằng một lệnh để thực thi (ví dụ: lệnh python), một Docker Image từ Hugging Face Spaces hoặc Docker Hub, và một loại phần cứng (CPU, GPU, TPU). Hướng dẫn này sẽ cho bạn thấy cách tương tác với Jobs trên Hub, đặc biệt là:

  • Chạy một tác vụ.
  • Kiểm tra trạng thái công việc.
  • Chọn phần cứng.
  • Cấu hình các biến môi trường và thông tin bí mật.
  • Chạy các script UV.

Nếu bạn muốn chạy và quản lý một tác vụ trên Hub, máy của bạn phải đã đăng nhập. Nếu chưa, vui lòng tham khảo mục này. Trong phần còn lại của hướng dẫn này, chúng tôi giả định rằng máy của bạn đã đăng nhập.

Hugging Face Jobs có sẵn cho bất kỳ người dùng hoặc tổ chức nào có số dư tín dụng dương. Xem Giá và thanh toán cho Jobs để biết thêm chi tiết.

Giao diện dòng lệnh Jobs

Sử dụng hf jobs CLI để chạy Jobs từ dòng lệnh, và truyền --flavor để chỉ định phần cứng của bạn.

hf jobs run chạy Jobs với một ảnh Docker và một lệnh theo giao diện tương tự Docker quen thuộc. Hãy nghĩ đến docker run, nhưng dành cho việc chạy mã trên bất kỳ phần cứng nào:

>>> hf jobs run --name hello-world python:3.12 python -c "print('Hello world')"
>>> hf jobs run --name gpu-check --flavor a10g-small pytorch/pytorch:2.6.0-cuda12.4-cudnn9-devel python -c "import torch; print(torch.cuda.get_device_name())"

Sử dụng hf jobs uv run để chạy các script UV cục bộ hoặc từ xa:

>>> hf jobs uv run --name my-script my_script.py
>>> hf jobs uv run --name sft-training --flavor a10g-small "https://raw.githubusercontent.com/huggingface/trl/main/trl/scripts/sft.py"

UV scripts là các script Python bao gồm các phụ thuộc trực tiếp trong tệp bằng cách sử dụng cú pháp chú thích đặc biệt được định nghĩa trong tài liệu UV.

Phần còn lại của hướng dẫn này sẽ giới thiệu cho bạn API python. Nếu bạn muốn xem tất cả các lệnh và tùy chọn hf jobs có sẵn, hãy xem hướng dẫn về giao diện dòng lệnh hf jobs.

Bạn cần một máy tương tác thay vì một tác vụ chạy xong là bỏ — ví dụ để chạy mã do AI tạo ra, kèm theo thực thi lệnh và chuyển tệp? Hãy xem Sandboxes, được xây dựng dựa trên Jobs.

Chạy một Job

Chạy các compute Jobs được định nghĩa bằng một command và một Docker Image trên hạ tầng của Hugging Face (bao gồm GPU và TPU).

Bạn chỉ có thể quản lý các Job do bạn sở hữu (trong namespace tên người dùng của bạn) hoặc từ các tổ chức mà bạn có quyền ghi. Tính năng này tính phí theo mức sử dụng: bạn chỉ trả tiền cho số giây bạn sử dụng.

run_job() cho phép bạn chạy bất kỳ lệnh nào trên hạ tầng của Hugging Face:

# Directly run Python code
>>> from huggingface_hub import run_job
>>> run_job(
...     image="python:3.12",
...     command=["python", "-c", "print('Hello from the cloud!')"],
... )

# Use GPUs without any setup
>>> run_job(
...     image="pytorch/pytorch:2.6.0-cuda12.4-cudnn9-devel",
...     command=["python", "-c", "import torch; print(torch.cuda.get_device_name())"],
...     flavor="a10g-small",
... )

# Run in an organization account
>>> run_job(
...     image="python:3.12",
...     command=["python", "-c", "print('Running in an org account')"],
...     namespace="my-org-name",
... )

# Run from Hugging Face Spaces
>>> run_job(
...     image="hf.co/spaces/lhoestq/duckdb",
...     command=["duckdb", "-c", "select 'hello world'"],
... )

# Run a Python script with `uv` (experimental)
>>> from huggingface_hub import run_uv_job
>>> run_uv_job("my_script.py")

Quan trọng: Các tác vụ có thời gian chờ mặc định (30 phút), sau đó chúng sẽ tự động dừng. Đối với các tác vụ chạy lâu như huấn luyện mô hình, hãy đảm bảo đặt thời gian chờ tùy chỉnh bằng tham số timeout. Xem Cấu hình thời gian chờ của tác vụ để biết chi tiết.

run_job() trả về JobInfo chứa URL của Job trên Hugging Face, nơi bạn có thể xem trạng thái và log của Job. Lưu Job ID từ JobInfo để quản lý job:

>>> from huggingface_hub import run_job
>>> job = run_job(
...     image="python:3.12",
...     command=["python", "-c", "print('Hello from the cloud!')"]
... )
>>> job.url
https://huggingface.co/jobs/lhoestq/687f911eaea852de79c4a50a
>>> job.id
687f911eaea852de79c4a50a

Jobs chạy ở chế độ nền. Phần tiếp theo sẽ hướng dẫn bạn sử dụng inspect_job() để biết trạng thái của job, fetch_job_logs() để xem logs và fetch_job_metrics() để theo dõi mức sử dụng tài nguyên.

Thử lại và chạy lại một Job

Sử dụng attempts để thử lại một Job thất bại. Số lượng này bao gồm lần thử ban đầu, do đó attempts=3 cho phép tối đa hai lần thử lại. Tham số này cũng hoạt động với run_uv_job, create_scheduled_job và create_scheduled_uv_job.

>>> from huggingface_hub import rerun_job, run_job
>>> job = run_job(image="python:3.12", command=["python", "train.py"], attempts=3)
>>> job.retry
2

# Start a new Job with the same spec, including its retry setting
>>> new_job = rerun_job(job_id=job.id)

rerun_job khởi động một Job riêng biệt với ID mới. Nó hoạt động với các Job đã hoàn thành hoặc thất bại và tái sử dụng spec đã lưu, bao gồm secrets và cài đặt phần cứng. Bạn cũng có thể chạy hf jobs rerun <job_id>.

Kiểm tra trạng thái Job

# List your jobs (results are paginated and returned as an iterator)
>>> from huggingface_hub import list_jobs
>>> jobs = list_jobs()
>>> next(iter(jobs))
JobInfo(id='687f911eaea852de79c4a50a', created_at=datetime.datetime(2025, 7, 22, 13, 24, 46, 909000, tzinfo=datetime.timezone.utc), docker_image='python:3.12', space_id=None, command=['python', '-c', "print('Hello from the cloud!')"], arguments=[], environment={}, secrets={}, flavor='cpu-basic', status=JobStatus(stage='COMPLETED', message=None), owner=JobOwner(id='5e9ecfc04957053f60648a3e', name='lhoestq'), endpoint='https://huggingface.co', url='https://huggingface.co/jobs/lhoestq/687f911eaea852de79c4a50a')

# Materialize the iterator into a list
>>> all_jobs = [job for job in list_jobs()]

# List your running jobs
>>> running_jobs = list_jobs(status="RUNNING")

# Filter by one or more statuses and/or labels
>>> list_jobs(status=["RUNNING", "SCHEDULING"], labels={"env": "prod"})

# Inspect the status of a job
>>> from huggingface_hub import inspect_job
>>> inspect_job(job_id=job_id)
JobInfo(id='687f911eaea852de79c4a50a', created_at=datetime.datetime(2025, 7, 22, 13, 24, 46, 909000, tzinfo=datetime.timezone.utc), docker_image='python:3.12', space_id=None, command=['python', '-c', "print('Hello from the cloud!')"], arguments=[], environment={}, secrets={}, flavor='cpu-basic', status=JobStatus(stage='COMPLETED', message=None), owner=JobOwner(id='5e9ecfc04957053f60648a3e', name='lhoestq'), endpoint='https://huggingface.co', url='https://huggingface.co/jobs/lhoestq/687f911eaea852de79c4a50a')

# View logs from a job
>>> from huggingface_hub import fetch_job_logs
>>> for log in fetch_job_logs(job_id=job_id):
...     print(log)
Hello from the cloud!

# View resources usage metrics from a job
>>> from huggingface_hub import fetch_job_metrics
>>> for metrics in fetch_job_metrics(job_id=job_id):
...     print(metrics)
{
    "cpu_usage_pct": 0,
    "cpu_millicores": 2000,
    "memory_used_bytes": 929792,
    "memory_total_bytes": 17179869184,
    "rx_bps": 0,
    "tx_bps": 0,
    "gpus": {},
    "replica": "4dzsh"
}

# Cancel a job
>>> from huggingface_hub import cancel_job
>>> cancel_job(job_id=job_id)

Chờ cho đến khi các Job hoàn thành

Sử dụng wait_for_job() để chặn cho đến khi một Job đạt đến giai đoạn cuối (COMPLETED, CANCELED, ERROR hoặc DELETED). JobInfo cuối cùng luôn được trả về — một Job thất bại sẽ không gây ra ngoại lệ — vì vậy hãy kiểm tra job.status.stage để xử lý kết quả. Truyền một danh sách các ID Job để chờ cho cả một lô cùng lúc.

>>> from huggingface_hub import run_job, wait_for_job
>>> job = run_job(image="python:3.12", command=["python", "-c", "print('hello')"])
>>> wait_for_job(job_id=job.id).status.stage
'COMPLETED'

# Run multiple jobs in parallel and wait for all of them to finish
>>> jobs = [run_job(image=image, command=command) for command in commands]
>>> finished_jobs = wait_for_job(job_id=[job.id for job in jobs], timeout=3600)

Cùng tính năng này có sẵn trong CLI với hf jobs wait, lệnh này chỉ thoát với mã 0 nếu tất cả Job hoàn tất thành công — rất tiện lợi để nối các lệnh trong shell scripts hoặc CI:

# Chain on success
hf jobs wait <job_id> && hf jobs run --detach python:3.12 python eval.py

# Wait for all currently running jobs
hf jobs ls -q | xargs hf jobs wait

Lưu ý rằng một lệnh hf jobs run (hoặc hf jobs uv run) không tách rời cũng sẽ thoát với mã khác không nếu Job thất bại, do đó hf jobs run ... && next-step sẽ được thực hiện nối tiếp chính xác mà không cần lệnh chờ tường minh.

Chọn phần cứng

Có rất nhiều trường hợp mà việc chạy Jobs trên GPU là hữu ích:

  • Đào tạo mô hình: Tinh chỉnh hoặc đào tạo mô hình trên GPU (T4, A10G, A100) mà không cần quản lý hạ tầng
  • Tạo dữ liệu tổng hợp: Tạo các bộ dữ liệu quy mô lớn bằng cách sử dụng LLM trên phần cứng mạnh
  • Xử lý dữ liệu: Xử lý các bộ dữ liệu lớn với cấu hình CPU cao cho các tác vụ song song
  • Suy luận theo lô: Chạy suy luận ngoại tuyến trên hàng nghìn mẫu bằng cách sử dụng các cấu hình GPU được tối ưu hóa
  • Thí nghiệm & Đánh giá hiệu năng: Chạy các thí nghiệm ML trên phần cứng nhất quán để có kết quả tái lập được
  • Phát triển & gỡ lỗi: Kiểm tra mã GPU mà không cần cài đặt CUDA cục bộ

Chạy các tác vụ trên GPU hoặc TPU bằng đối số flavor. Ví dụ, để chạy một tác vụ PyTorch trên GPU A10G:

# Use an A10G GPU to check PyTorch CUDA
>>> from huggingface_hub import run_job
>>> run_job(
...     image="pytorch/pytorch:2.6.0-cuda12.4-cudnn9-devel",
...     command=["python", "-c", "import torch; print(f'This code ran with the following GPU: {torch.cuda.get_device_name()}')"],
...     flavor="a10g-small",
... )

Chạy lệnh này sẽ hiển thị kết quả sau!

This code ran with the following GPU: NVIDIA A10G

Sử dụng điều này để chạy một script tinh chỉnh như trl/scripts/sft.py với UV:

>>> from huggingface_hub import run_uv_job
>>> run_uv_job(
...     "sft.py",
...     script_args=["--model_name_or_path", "Qwen/Qwen2-0.5B", ...],
...     dependencies=["trl"],
...     env={"HF_TOKEN": ...},
...     flavor="a10g-small",
... )

Để có hướng dẫn chi tiết về việc chạy các tác vụ huấn luyện mô hình bằng TRL trên hạ tầng của Hugging Face, hãy xem tài liệu Huấn luyện TRL Jobs. Tài liệu này bao gồm các công thức tinh chỉnh, lựa chọn phần cứng và các thực hành tốt nhất để huấn luyện mô hình một cách hiệu quả.

Dưới đây là danh sách đầy đủ các phần cứng có sẵn để chạy Jobs:

nameTên hiển thịcpurambộ nhớacceleratorchi phí/phútchi phí/giờ
cpu-basicCPU cơ bản2 vCPU16 GB50 GB-$0.0002$0.01
cpu-upgradeNâng cấp CPU8 vCPU32 GB50 GB-$0.0005$0.03
cpu-performanceHiệu năng CPU32 vCPU256 GB1024 GB-$0.0317$1.90
cpu-xlCPU XL16 vCPU124 GB1000 GB-$0.0167$1.00
t4-smallNvidia T4 - nhỏ4 vCPU15 GB50 GB1x T4 (16 GB)$0.0067$0.40
t4-mediumNvidia T4 - trung bình8 vCPU30 GB100 GB1x T4 (16 GB)$0.0100$0.60
a10g-smallNvidia A10G - nhỏ4 vCPU15 GB110 GB1x A10G (24 GB)$0.0167$1.00
a10g-largeNvidia A10G - lớn12 vCPU46 GB200 GB1x A10G (24 GB)$0.0250$1.50
a10g-largex22x Nvidia A10G - lớn24 vCPU92 GB1000 GB2x A10G (48 GB)$0.0500$3.00
a10g-largex44x Nvidia A10G - lớn48 vCPU184 GB2000 GB4x A10G (96 GB)$0.0833$5.00
a100-largeNvidia A100 - lớn12 vCPU142 GB1000 GB1x A100 (80 GB)$0.0417$2.50
a100x44x Nvidia A10048 vCPU568 GB4000 GB4x A100 (320 GB)$0.1667$10.00
a100x88x Nvidia A10096 vCPU1136 GB8000 GB8x A100 (640 GB)$0.3333$20.00
h200Nvidia H20023 vCPU256 GB3000 GB1x H200 (141 GB)$0.0833$5.00
h200x2Nvidia H20046 vCPU512 GB6000 GB2x H200 (282 GB)$0.1667$10.00
h200x4Nvidia H20092 vCPU1024 GB12000 GB4x H200 (564 GB)$0.3333$20.00
h200x8Nvidia H200184 vCPU2048 GB24000 GB8x H200 (1128 GB)$0.6667$40.00
rtx-pro-6000Nvidia RTX PRO 600023 vCPU256 GB475 GB1x RTX PRO 6000 (96 GB)$0.0458$2.75
rtx-pro-6000x2Nvidia RTX PRO 600046 vCPU512 GB950 GB2x RTX PRO 6000 (192 GB)$0.0917$5.50
rtx-pro-6000x4Nvidia RTX PRO 600092 vCPU1024 GB1900 GB4x RTX PRO 6000 (384 GB)$0.1833$11.00
rtx-pro-6000x8Nvidia RTX PRO 6000184 vCPU2048 GB3800 GB8x RTX PRO 6000 (768 GB)$0.3667$22.00
l4x11x Nvidia L48 vCPU30 GB400 GB1x L4 (24 GB)$0.0133$0.80
l4x44x Nvidia L448 vCPU186 GB3200 GB4x L4 (96 GB)$0.0633$3.80
l40sx11x Nvidia L40S8 vCPU62 GB380 GB1x L40S (48 GB)$0.0300$1.80
l40sx44x Nvidia L40S48 vCPU382 GB3200 GB4x L40S (192 GB)$0.1383$8.30
l40sx88x Nvidia L40S192 vCPU1534 GB6500 GB8x L40S (384 GB)$0.3917$23.50

Bạn có thể lấy danh sách này một cách tự động bằng cách chạy:

>>> hf jobs hardware

Hoặc sử dụng API Python:

>>> from huggingface_hub import list_jobs_hardware
>>> list_jobs_hardware()

Xong rồi! Bạn đã chạy mã trên hạ tầng của Hugging Face.

Gắn một volume

Gắn một volume lên đĩa của Jobs bằng cách sử dụng một danh sách Volume.

Bạn có thể gắn bất kỳ kho Hugging Face (mô hình/dataset/space) hoặc Storage Bucket. Ví dụ:

  • gắn một kho lưu trữ mô hình: Volume(type="model", source="openai/gpt-oss-120b", mount_path="/model")
  • gắn một kho dữ liệu: Volume(type="dataset", source="HuggingFaceFW/fineweb", mount_path="/data")
  • gắn một bucket lưu trữ: Volume(type="bucket", source="username/my-bucket", mount_path="/mnt")

Sau đó, bạn có thể sử dụng volume đã gắn như một thư mục cục bộ:

>>> from huggingface_hub import run_job, Volume
>>> job = run_job(
...     image="duckdb/duckdb",
...     command=["duckdb", "-c", "SELECT * FROM '/data/**/*.parquet' LIMIT 5"],
...     volumes=[Volume(type="dataset", source="HuggingFaceFW/fineweb", mount_path="/data")],
... )

Bạn cũng có thể ghi vào một bucket đã được gắn, chẳng hạn như để lưu các checkpoint khi huấn luyện một mô hình:

>>> from huggingface_hub import run_uv_job, Volume
>>> script = "my_sft.py"
>>> script_args = ["--output_dir", "/training-outputs/training-v3-final", ...]
>>> checkpoints_bucket = Volume(type="bucket", source="username/my-bucket", mount_path="/training-outputs")
>>> run_uv_job(script, script_args=script_args, volumes=[checkpoints_bucket])

Mặc định, các bucket lưu trữ được gắn có khả năng đọc + ghi. Điều này đặc biệt hữu ích cho các bucket lưu trữ, cung cấp bộ nhớ lưu trữ nhanh, có thể thay đổi cho dữ liệu thay đổi thường xuyên — các tệp có thể được ghi đè hoặc xóa tại chỗ.

Sử dụng read_only=True để bật chế độ chỉ đọc: Volume(type="bucket", read_only=True, ...).

Gắn dữ liệu cục bộ

Để chạy một Job với dữ liệu trên máy của bạn, hãy sử dụng sync_job_volume(): nó đồng bộ hóa một thư mục cục bộ vào Storage Bucket jobs-artifacts (được tạo tự động nếu cần) và trả về một Volume sẵn sàng để gắn:

>>> from huggingface_hub import run_uv_job, sync_job_volume

# Upload ./training-data once...
>>> volume = sync_job_volume("./training-data", "/data")

# ...then run as many Jobs as you want against it
>>> run_uv_job("train.py", script_args=["--learning-rate", "0.01"], volumes=[volume])
>>> run_uv_job("train.py", script_args=["--learning-rate", "0.05"], volumes=[volume])

Mỗi thư mục có một thư mục con ổn định riêng trong bucket: chạy lại sync_job_volume() trên cùng một thư mục chỉ tải lên các tệp mới hoặc đã sửa đổi. Volume được gắn ở chế độ chỉ đọc theo mặc định.

Để lấy các tệp được ghi bởi một Job, hãy gắn một volume đọc-ghi (một thư mục đầu ra trống cũng được) và đồng bộ nó trở lại khi Job kết thúc:

>>> from huggingface_hub import run_uv_job, sync_bucket, sync_job_volume

>>> outputs = sync_job_volume("./outputs", "/outputs", read_only=False)
>>> job = run_uv_job("process.py", volumes=[outputs])

# ...once the Job completes, pull back the data:
>>> sync_bucket(f"hf://buckets/{outputs.source}/{outputs.path}", "./outputs")

Trong CLI, chỉ cần truyền một thư mục cục bộ làm phía nguồn của -v:

>>> hf jobs uv run -v ./pdfs:/input -v ./md-out:/output:rw ocr.py

Tiết lộ các cổng của Job

Truyền expose để cho phép truy cập vào cổng của container thông qua Jobs proxy. Việc truy cập yêu cầu một HF token có quyền đọc trong namespace của Job. Thay vào đó, hãy sử dụng expose_public để cho phép truy cập mà không cần xác thực:

>>> from huggingface_hub import run_job, update_job_expose
>>> job = run_job(
...     image="python:3.12",
...     command=["python", "-m", "http.server", "8000"],
...     expose_public=[8000],
... )
>>> job.expose_public
[8000]

# Keep the port exposed, but require an HF token from now on
>>> job = update_job_expose(job_id=job.id, expose=[8000])

# Close all exposed ports
>>> job = update_job_expose(job_id=job.id)

expose và expose_public có thể được kết hợp. update_job_expose thay thế toàn bộ cấu hình cổng trên một Job đang chạy mà không cần khởi động lại: các cổng không có trong danh sách nào sẽ bị đóng. Cả hai tùy chọn cũng khả dụng khi tạo Job UV và Job được lên lịch.

Truy cập Job qua SSH

Truyền ssh=True vào run_job() (hoặc run_uv_job()) để container của Job có thể được truy cập qua SSH. Điểm cuối SSH có sẵn trong trạng thái của Job:

>>> from huggingface_hub import run_job
>>> job = run_job(
...     image="python:3.12",
...     command=["sleep", "infinity"],
...     ssh=True,
... )
>>> job.status.ssh_url
'ssh://68498e23210b3a4f4e6e2a23@ssh.hf.jobs'

Kết nối từ terminal bằng hf jobs ssh <job_id> (hoặc trực tiếp bằng ssh <job_id>@ssh.hf.jobs):

>>> hf jobs ssh 68498e23210b3a4f4e6e2a23

Chỉ những người dùng có quyền ghi vào namespace của Job (người tạo Job, hoặc các thành viên của tổ chức sở hữu) mới được phép truy cập, xác thực bằng khóa công khai SSH đã đăng ký tại https://huggingface.co/settings/keys.

Các nhóm mạng

Truyền network_group="<name>" vào run_job() (hoặc run_uv_job()) để các Jobs trong cùng namespace và resource group có thể liên lạc với nhau trên mọi port. Bên trong mỗi thành viên, HF_NETWORK_GROUP_HOSTNAME sẽ phân giải thành mọi Job trong nhóm, và ${HF_NETWORK_GROUP_PREFIX}<alias> sẽ phân giải thành các thành viên đã khai báo alias bằng network_aliases=[...]:

>>> from huggingface_hub import run_job
>>> server = run_job(
...     image="python:3.12",
...     command=["python", "-m", "http.server", "8000"],
...     network_group="train",
...     network_aliases=["master"],
... )
>>> client = run_job(
...     image="python:3.12",
...     command=["sh", "-c", 'curl --retry 10 --retry-connrefused "http://${HF_NETWORK_GROUP_PREFIX}master:8000/"'],
...     network_group="train",
... )
>>> server.network
JobNetwork(group='train', aliases=['master'])

Các thành viên có thể được phân giải trước khi chúng sẵn sàng, vì vậy hãy kết nối với các lần thử lại. Tên nhóm và các alias là các ký tự alphanumerics chữ thường và gạch nối, tối đa 46 và 34 ký tự.

Cấu hình Thời gian chờ của Job

Jobs có thời gian chờ mặc định (30 phút), sau đó chúng sẽ tự động dừng. Điều này rất quan trọng cần biết khi chạy các tác vụ kéo dài như huấn luyện mô hình.

Đặt thời gian chờ tùy chỉnh

Bạn có thể chỉ định giá trị timeout tùy chỉnh bằng cách sử dụng tham số timeout khi chạy một job. Timeout có thể được chỉ định theo hai cách:

  1. Dưới dạng số (được hiểu là giây):
>>> from huggingface_hub import run_job
>>> job = run_job(
...     image="pytorch/pytorch:2.6.0-cuda12.4-cudnn9-devel",
...     command=["python", "train_model.py"],
...     flavor="a10g-large",
...     timeout=7200,  # 2 hours in seconds
... )
  1. Dưới dạng chuỗi có đơn vị thời gian:
>>> # Using different time units
>>> job = run_job(
...     image="pytorch/pytorch:2.6.0-cuda12.4-cudnn9-devel",
...     command=["python", "train_model.py"],
...     flavor="a10g-large",
...     timeout="2h",  # 2 hours
... )

>>> # Other examples:
>>> # timeout="30m"    # 30 minutes
>>> # timeout="1.5h"   # 1.5 hours
>>> # timeout="1d"     # 1 day
>>> # timeout="3600s"  # 3600 seconds

Các đơn vị thời gian được hỗ trợ:

  • s - giây
  • m - phút
  • h - giờ
  • d - ngày

Sử dụng timeout với các tác vụ UV

Đối với các tác vụ UV, bạn cũng có thể chỉ định thời gian chờ:

>>> from huggingface_hub import run_uv_job
>>> job = run_uv_job(
...     "training_script.py",
...     flavor="a10g-large",
...     timeout="90m",  # 90 minutes
... )

Nếu bạn không chỉ định thời gian chờ, một thời gian chờ mặc định sẽ được áp dụng cho tác vụ của bạn. Đối với các tác vụ chạy lâu như huấn luyện mô hình có thể mất nhiều giờ, hãy đảm bảo thiết lập thời gian chờ phù hợp để tránh việc tác vụ bị kết thúc bất ngờ.

Theo dõi thời lượng công việc

Khi chạy các tác vụ dài, tốt nhất nên:

  • Ước tính thời gian dự kiến của công việc và đặt thời gian chờ với một khoảng đệm
  • Theo dõi tiến độ công việc của bạn thông qua các nhật ký
  • Kiểm tra trạng thái công việc để đảm bảo nó không bị hết thời gian
>>> from huggingface_hub import inspect_job, fetch_job_logs
>>> # Check job status
>>> job_info = inspect_job(job_id=job.id)
>>> if job_info.status.stage == "ERROR":
...     print(f"Job failed: {job_info.status.message}")
...     # Check logs for more details
...     for log in fetch_job_logs(job_id=job.id):
...         print(log)

Để biết thêm chi tiết về tham số timeout, hãy xem tham chiếu API run_job.

Truyền biến môi trường và Mật khẩu

Bạn có thể truyền các biến môi trường cho tác vụ của mình bằng cách sử dụng env và secrets:

# Pass environment variables
>>> from huggingface_hub import run_job
>>> run_job(
...     image="python:3.12",
...     command=["python", "-c", "import os; print(os.environ['FOO'], os.environ['BAR'])"],
...     env={"FOO": "foo", "BAR": "bar"},
... )
# Pass secrets - they will be encrypted server side
>>> from huggingface_hub import run_job
>>> run_job(
...     image="python:3.12",
...     command=["python", "-c", "import os; print(os.environ['MY_SECRET'])"],
...     secrets={"MY_SECRET": "psswrd"},
... )

Biến Môi Trường Tích Hợp

Bên trong container của job, các biến môi trường sau được tự động khả dụng:

BiếnMô tả
JOB_IDĐịnh danh duy nhất của tác vụ hiện tại. Sử dụng định danh này để tham chiếu tác vụ một cách lập trình, chẳng hạn như để lưu trữ kết quả đầu ra trong một tập dữ liệu với tên duy nhất.
ACCELERATORLoại bộ tăng tốc khả dụng (ví dụ: t4-medium, a10g-small, a100x4). Để trống nếu không có bộ tăng tốc.
CPU_CORESSố lượng lõi CPU có sẵn cho tác vụ (ví dụ: 2, 4, 8).
MEMORYLượng bộ nhớ khả dụng cho công việc (ví dụ: 16Gi, 32Gi).
# Access job environment information
>>> from huggingface_hub import run_job
>>> run_job(
...     image="python:3.12",
...     command=["python", "-c", """
... import os
... print(f"Job ID: {os.environ.get('JOB_ID')}")
... print(f"Accelerator: {os.environ.get('ACCELERATOR', 'none')}")
... print(f"CPU cores: {os.environ.get('CPU_CORES')}")
... print(f"Memory: {os.environ.get('MEMORY')}")
... """],
... )

Các biến này hữu ích khi bạn cần tạo các định danh duy nhất cho đầu ra, điều chỉnh mã của mình dựa trên phần cứng khả dụng, hoặc ghi log thông tin tài nguyên.

Nhãn

Labels là các cặp key=value gắn metadata vào một Job:

Sử dụng name để dễ dàng tìm kiếm và nhận diện các Job trong giao diện người dùng. Tên là tùy chọn và không nhất thiết phải duy nhất:

>>> from huggingface_hub import run_job
>>> run_job(name="daily-report", image="python:3.12", command=["python", "report.py"])

Từ CLI, truyền --name khi tạo một Job, hoặc đặt tên cho một Job hiện có thông qua lệnh labels:

>>> hf jobs run --name daily-report python:3.12 python report.py
>>> hf jobs labels <job_id> --name daily-report

hf jobs ls hiển thị cột NAME và có thể lọc theo tên (đường tắt cho --label name=NAME):

>>> hf jobs ls -a --name daily-report
# Pass extra metadata with Labels
>>> from huggingface_hub import run_job
>>> run_job(
...     image="python:3.12",
...     command=["python", "-c", "import os; print(os.environ['MY_SECRET'])"],
...     labels={"my-label": "my-value", "foo": "bar"},
... )

Nếu bạn không truyền tên, một tên sẽ được suy ra tự động từ ảnh Docker hoặc script, kèm theo một hash ngắn (ví dụ: python:3.12 foo --truc → python-3-12-1a2b3c4d). Từ CLI, hash đó bao gồm cả lệnh và các cài đặt runtime đã được phân giải (flavor, timeout, giá trị môi trường, …), do đó cùng một cấu hình luôn tạo ra cùng một tên, và việc thay đổi một cài đặt — kể cả cài đặt đến từ header [tool.hf-jobs] của script — sẽ làm thay đổi tên đó. Từ Python API, hash chỉ bao gồm lệnh.

Cập nhật nhãn

Sử dụng update_job_labels() để thay thế các nhãn trên một tác vụ hiện có. Thao tác này sẽ thay thế tất cả các nhãn do người dùng cung cấp trước đó:

>>> from huggingface_hub import update_job_labels
>>> update_job_labels(job_id=job_id, labels={"env": "prod", "team": "ml"})

Điều này cũng hoạt động với các công việc được lên lịch bằng update_scheduled_job_labels():

>>> from huggingface_hub import update_scheduled_job_labels
>>> update_scheduled_job_labels(scheduled_job_id=scheduled_job_id, labels={"env": "staging"})

Từ CLI:

>>> hf jobs labels <job_id> --label env=prod --label team=ml
>>> hf jobs scheduled labels <scheduled_job_id> --label env=staging

Để xóa tất cả các nhãn, hãy truyền --clear:

>>> hf jobs labels <job_id> --clear

UV Scripts (Thử nghiệm)

Bạn đang tìm kiếm các script UV có sẵn? Hãy xem tổ chức uv-scripts trên Hugging Face Hub, nơi cung cấp bộ sưu tập script UV từ cộng đồng cho các tác vụ như huấn luyện mô hình, tạo dữ liệu tổng hợp, xử lý dữ liệu và nhiều hơn nữa.

Chạy các kịch bản UV (các kịch bản Python có các phụ thuộc được khai báo trực tiếp) trên hạ tầng HF:

# Run a UV script (creates temporary repo)
>>> from huggingface_hub import run_uv_job
>>> run_uv_job("my_script.py")

# Run with GPU
>>> run_uv_job("ml_training.py", flavor="gpu-t4-small")

# Run with dependencies
>>> run_uv_job("inference.py", dependencies=["transformers", "torch"])

# Run a script directly from a URL
>>> run_uv_job("https://huggingface.co/datasets/username/scripts/resolve/main/example.py")

# Run a command
>>> run_uv_job("python", script_args=["-c", "import lighteval"], dependencies=["lighteval"])

UV scripts là các script Python bao gồm trực tiếp các phụ thuộc của chúng ngay trong tệp bằng cú pháp chú thích đặc biệt. Điều này khiến chúng trở nên hoàn hảo cho các tác vụ tự chứa không yêu cầu cấu hình dự án phức tạp. Tìm hiểu thêm về UV scripts trong tài liệu UV.

Đóng gói cấu hình khởi chạy cùng với script

Một script chỉ chạy đúng trên một runtime cụ thể có thể mang theo runtime đó, trong bảng tùy chọn [tool.hf-jobs] của phần header PEP 723 của nó:

# /// script
# requires-python = ">=3.11"
# dependencies = ["vllm", "datasets"]
#
# [tool.hf-jobs]
# image   = "vllm/vllm-openai:unlimited-ocr"
# flavor  = "l4x1"
# python  = "/usr/bin/python3"
# secrets = ["HF_TOKEN"]
# ///

hf jobs uv run ocr.py sau đó khởi chạy với image, phần cứng và trình diễn dịch phù hợp, và --flavor, -e, … vẫn ghi đè lên những gì script khai báo. Xem hướng dẫn CLI để biết danh sách đầy đủ các key và các quy tắc hợp nhất.

Bảng chỉ được đọc bởi CLI hf: run_uv_job() và create_scheduled_uv_job() bỏ qua bảng này và sử dụng chính xác các đối số được truyền vào. Nói cách khác, run_uv_job("ocr.py") và hf jobs uv run ocr.py không chạy cùng một Job — API Python cần truyền image=, flavor=, … một cách tường minh.

Hình ảnh Docker cho các kịch bản UV

Mặc dù các script UV có thể chỉ định các phụ thuộc trực tiếp trong mã, các tác vụ ML thường có các phụ thuộc phức tạp. Việc sử dụng các hình ảnh Docker đã được xây dựng sẵn với các thư viện này được cài đặt sẵn có thể giúp tăng tốc đáng kể quá trình khởi động tác vụ và tránh các vấn đề về phụ thuộc.

Mặc định, khi bạn chạy hf jobs uv run, hình ảnh astral-sh/uv:python3.12-bookworm sẽ được sử dụng. Hình ảnh này dựa trên phân phối Python 3.12 Bookworm với uv được cài đặt sẵn.

Bạn có thể chỉ định một hình ảnh khác bằng cách sử dụng cờ --image:

hf jobs uv run \
 --flavor a10g-large \
 --image vllm/vllm-openai:latest \
...

Lệnh trên sẽ chạy bằng image vllm/vllm-openai:latest. Cách tiếp cận này có thể hữu ích nếu bạn đang sử dụng vLLM để tạo dữ liệu tổng hợp.

Nhiều framework suy luận cung cấp các hình ảnh docker đã được tối ưu hóa. Vì uv ngày càng được áp dụng rộng rãi trong hệ sinh thái Python, nhiều framework trong số đó cũng sẽ có uv được cài đặt sẵn, nghĩa là chúng sẽ hoạt động khi sử dụng hf jobs uv run.

Công việc được lên lịch

Lập lịch và quản lý các công việc sẽ chạy trên hạ tầng của HF.

Sử dụng create_scheduled_job() hoặc create_scheduled_uv_job() với lịch là @annually, @yearly, @monthly, @weekly, @daily, @hourly, hoặc một biểu thức lịch CRON (ví dụ: "0 9 * * 1" cho 9 giờ sáng mỗi thứ Hai):

# Schedule a job that runs every hour
>>> from huggingface_hub import create_scheduled_job
>>> create_scheduled_job(
...     image="python:3.12",
...     command=["python",  "-c", "print('This runs every hour!')"],
...     schedule="@hourly"
... )

# Use the CRON syntax
>>> create_scheduled_job(
...     image="python:3.12",
...     command=["python",  "-c", "print('This runs every 5 minutes!')"],
...     schedule="*/5 * * * *"
... )

# Schedule with GPU
>>> create_scheduled_job(
...     image="pytorch/pytorch:2.6.0-cuda12.4-cudnn9-devel",
...     command=["python",  "-c", 'import torch; print(f"This code ran with the following GPU: {torch.cuda.get_device_name()}")'],
...     schedule="@hourly",
...     flavor="a10g-small",
... )

# Schedule a UV script
>>> from huggingface_hub import create_scheduled_uv_job
>>> create_scheduled_uv_job("my_script.py", schedule="@hourly")

Sử dụng các tham số giống như run_job() và run_uv_job() để truyền các biến môi trường, secrets, timeout, v.v.

Quản lý các công việc được lên lịch bằng list_scheduled_jobs(), inspect_scheduled_job(), suspend_scheduled_job(), resume_scheduled_job(), update_scheduled_job_schedule(), trigger_scheduled_job() và delete_scheduled_job():

# List your active scheduled jobs
>>> from huggingface_hub import list_scheduled_jobs
>>> list_scheduled_jobs()

# Only list scheduled jobs with the given labels
>>> list_scheduled_jobs(labels={"env": "prod"})

# Inspect the status of a job
>>> from huggingface_hub import inspect_scheduled_job
>>> inspect_scheduled_job(scheduled_job_id=scheduled_job_id)

# Suspend (pause) a scheduled job
>>> from huggingface_hub import suspend_scheduled_job
>>> suspend_scheduled_job(scheduled_job_id=scheduled_job_id)

# Resume a scheduled job
>>> from huggingface_hub import resume_scheduled_job
>>> resume_scheduled_job(scheduled_job_id=scheduled_job_id)

# Change future run times without recreating the scheduled job
>>> from huggingface_hub import update_scheduled_job_schedule
>>> updated = update_scheduled_job_schedule(scheduled_job_id=scheduled_job_id, schedule="0 9 * * 1")
>>> updated.schedule
'0 9 * * 1'

# Trigger a scheduled job to run right now (does not change the schedule)
>>> from huggingface_hub import trigger_scheduled_job
>>> job = trigger_scheduled_job(scheduled_job_id=scheduled_job_id)
>>> job.url

# Delete a scheduled job
>>> from huggingface_hub import delete_scheduled_job
>>> delete_scheduled_job(scheduled_job_id=scheduled_job_id)

Kích hoạt Jobs bằng webhooks

Webhooks cho phép bạn theo dõi các thay đổi mới trên các kho cụ thể hoặc trên tất cả các kho thuộc một nhóm người dùng/tổ chức nhất định (không chỉ các kho của bạn, mà là bất kỳ kho nào).

Sử dụng create_webhook() để tạo một webhook kích hoạt một Job khi có thay đổi xảy ra trong một kho Hugging Face:

from huggingface_hub import create_webhook

# Example: Creating a webhook that triggers a Job
webhook = create_webhook(
    job_id=job_id,
    watched=[{"type": "user", "name": "your-username"}, {"type": "org", "name": "your-org-name"}],
    domains=["repo", "discussion"],
    secret="your-secret"
)

Webhook kích hoạt Job với webhook payload trong biến môi trường WEBHOOK_PAYLOAD. Bạn có thể tìm thêm thông tin về webhook trong tài liệu Webhooks.

Update on GitHub