Hub Python Library documentation

ジョブの実行と管理

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

ジョブの実行と管理

Hugging Face Hubは、Jobsを通じてAIおよびデータワークフロー用の計算リソースを提供します。

Jobsと料金体系の概要については、Hub Jobsのドキュメントを参照してください。

ジョブは Hugging Face のインフラ上で実行され、実行するコマンド(例: Python コマンド)、Hugging Face Spaces または Docker Hub からの Docker イメージ、ハードウェアのタイプ(CPU、GPU、TPU)によって定義されます。このガイドでは、Hub 上でジョブを操作する方法、特に以下の点について説明します。

  • ジョブを実行します。
  • ジョブのステータスを確認します。
  • ハードウェアを選択します。
  • 環境変数とシークレットを設定します。
  • UVスクリプトを実行します。

Hub上でジョブを実行・管理するには、マシンがログインしている必要があります。ログインしていない場合は、このセクションを参照してください。本ガイドの残りの部分では、マシンがログイン済みであることを前提とします。

Hugging Face Jobsは、クレジット残高がプラスのすべてのユーザーまたは組織で利用できます。詳細については、Jobsの料金と請求を参照してください。

Jobs コマンドラインインターフェース

hf jobs CLI を使用してコマンドラインから Jobs を実行し、--flavor を渡してハードウェアを指定します。

hf jobs run は、Docker イメージとコマンドを、Docker に似た馴染みのあるインターフェースで指定して Jobs を実行します。docker run のようなものですが、任意のハードウェア上でコードを実行するためのものです:

>>> 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())"

hf jobs uv run を使用して、ローカルまたはリモートの UV スクリプトを実行します:

>>> 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スクリプトは、UVのドキュメントで定義されている特別なコメント構文を使用して、依存関係をファイル内に直接記述するPythonスクリプトです。

このガイドの残りの部分では、Python API を紹介します。 代わりに、利用可能なすべての hf jobs コマンドとオプションを確認したい場合は、hf jobs コマンドラインインターフェースのガイドを参照してください。

Need an interactive machine instead of a fire-and-forget job — e.g. to run AI-generated code, with command execution and file transfer? Check out Sandboxes, built on top of Jobs.

ジョブの実行

Hugging Face のインフラストラクチャ(GPU および TPU を含む)上で、コマンドと Docker Image を用いて定義された compute Jobs を実行します。

Jobs の管理は、自分の所有するもの(ユーザー名ネームスペース配下)または、書き込み権限を持つ組織のもののみに限定されます。 この機能は従量課金制です。使用した秒数分のみ課金されます。

run_job() を使用すると、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")

重要: ジョブにはデフォルトのタイムアウト(30分)が設定されており、これを過ぎると自動的に停止します。モデルの学習のような長時間実行されるタスクの場合、timeout パラメータを使用してカスタムのタイムアウトを設定してください。詳細は ジョブのタイムアウト設定 を参照してください。

run_job() は、Hugging Face 上のジョブの URL を持つ JobInfo を返します。この URL からジョブのステータスやログを確認できます。 ジョブを管理するために、JobInfo からジョブ ID を保存してください:

>>> 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

ジョブはバックグラウンドで実行されます。次のセクションでは、inspect_job() を用いてジョブのステータスを把握し、fetch_job_logs() でログを表示し、fetch_job_metrics() でリソースの使用状況を監視する方法を説明します。

Jobの再試行と再実行

attempts を使用して、失敗した Job を再試行できます。この数値には最初の試行が含まれるため、attempts=3 の場合、最大 2 回の再試行が可能です。run_uv_job、create_scheduled_job、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 は、新しい ID を持つ別の Job を開始します。完了した Job や失敗した Job にも適用でき、保存された spec(シークレットやハードウェア設定を含む)を再利用します。hf jobs rerun <job_id> を実行することもできます。

ジョブのステータスを確認する

# 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)

Jobsが完了するまで待機します

wait_for_job() を使用すると、Job が終端ステージ(COMPLETED、CANCELED、ERROR または DELETED)に到達するまでブロックできます。最終的な JobInfo は常に返されます。失敗した Job でも例外は発生しないため、結果に基づいて処理を行うには job.status.stage を確認してください。Job ID のリストを渡すことで、バッチ全体を一度に待機できます。

>>> 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)

CLIでもhf jobs waitで同様の機能を利用できます。すべてのJobが正常に完了した場合のみ終了コード0を返すため、シェルスクリプトや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

デタッチされていないhf jobs run(またはhf jobs uv run)は、Job が失敗した場合にも非ゼロの終了コードで終了するため、明示的な待機なしでhf jobs run ... && next-stepが正しくチェーンされます。

ハードウェアを選択

GPU上でJobsを実行することが有用なケースは多数あります:

  • モデルの学習: インフラストラクチャの管理なしで、GPU(T4、A10G、A100)上でモデルのファインチューニングや学習を実行
  • 合成データ生成: 高性能ハードウェア上でLLMを使用して大規模なデータセットを生成します
  • データ処理: 並列ワークロード向けに、高CPU構成で大規模なデータセットを処理します
  • バッチ推論: 最適化されたGPU構成を使用して、数千のサンプルに対してオフライン推論を実行します
  • 実験とベンチマーク: 再現可能な結果を得るために、一貫したハードウェア上でML実験を実行します
  • 開発 & デバッグ: ローカルにCUDA環境を設定せずにGPUコードをテスト

flavor 引数を使用して、GPU または TPU でジョブを実行できます。例えば、A10G GPU で PyTorch ジョブを実行するには:

# 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",
... )

これを実行すると、以下の出力が表示されます!

This code ran with the following GPU: NVIDIA A10G

UVでtrl/scripts/sft.pyのようなファインチューニングスクリプトを実行するには、これを使用します:

>>> 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",
... )

Hugging Face のインフラストラクチャ上で TRL を使用してモデルの学習ジョブを実行するための包括的なガイドについては、TRL Jobs Training のドキュメントを参照してください。ファインチューニングのレシピ、ハードウェアの選択、モデルを効率的に学習するためのベストプラクティスについて解説しています。

Jobsを実行するために利用可能なハードウェアの完全なリストは以下の通りです:

名前表示名cpuramストレージacceleratorコスト/分コスト/時間
cpu-basicCPU 基本2 vCPU16 GB50 GB-$0.0002$0.01
cpu-upgradeCPU アップグレード8 vCPU32 GB50 GB-$0.0005$0.03
cpu-performanceCPUのパフォーマンス32 vCPU256 GB1024 GB-$0.0317$1.90
cpu-xlCPU XL16 vCPU124 GB1000 GB-$0.0167$1.00
t4-smallNvidia T4 - 小型4 vCPU15 GB50 GB1x T4 (16 GB)$0.0067$0.40
t4-mediumNvidia T4 - 中8 vCPU30 GB100 GB1x T4 (16 GB)$0.0100$0.60
a10g-smallNvidia A10G - 小型4 vCPU15 GB110 GBA10G (24 GB) x 1$0.0167$1.00
a10g-largeNvidia A10G - 大12 vCPU46 GB200 GBA10G (24 GB) x 1$0.0250$1.50
a10g-largex22x Nvidia A10G - large24 vCPU92 GB1000 GB2x A10G (48 GB)$0.0500$3.00
a10g-largex44x Nvidia A10G - 大48 vCPU184 GB2000 GB4x A10G (96 GB)$0.0833$5.00
a100-largeNvidia A100 - 大12 vCPU142 GB1000 GBA100 (80 GB) x 1$0.0417$2.50
a100x4Nvidia A100 4枚48 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
l4x1Nvidia L4 1枚8 vCPU30 GB400 GBL4 1枚 (24 GB)$0.0133$0.80
l4x4Nvidia L4 4枚48 vCPU186 GB3200 GB4x L4 (96 GB)$0.0633$3.80
l40sx1Nvidia L40S 1台8 vCPU62 GB380 GB1x L40S (48 GB)$0.0300$1.80
l40sx4Nvidia L40S 4台48 vCPU382 GB3200 GB4x L40S (192 GB)$0.1383$8.30
l40sx88x Nvidia L40S192 vCPU1534 GB6500 GB8x L40S (384 GB)$0.3917$23.50

このリストは、以下を実行することでプログラム的に取得できます。

>>> hf jobs hardware

または、Python API を使用します:

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

以上です!これで Hugging Face のインフラ上でコードを実行できるようになりました。

ボリュームのマウント

Volumeのリストを使用して、Jobsのディスクにボリュームをマウントします。

Hugging Face リポジトリ(モデル/データセット/スペース)やStorage Bucketをマウントできます。例:

  • モデルリポジトリのマウント: Volume(type="model", source="openai/gpt-oss-120b", mount_path="/model")
  • データセットリポジトリのマウント: Volume(type="dataset", source="HuggingFaceFW/fineweb", mount_path="/data")
  • ストレージバケットのマウント: Volume(type="bucket", source="username/my-bucket", mount_path="/mnt")

その後、マウントされたボリュームをローカルディレクトリとして使用できます:

>>> 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")],
... )

マウントされたバケットに書き込むこともできます。例えば、モデルの学習中にチェックポイントを保存する場合などです。

>>> 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])

デフォルトでは、マウントされたストレージバケットには読み書きの権限が付与されます。 これは、頻繁に変更されるデータに対して高速かつ変更可能なストレージを提供するストレージバケットにとって特に有用です。ファイルはインプレースで上書きまたは削除できます。

read_only=True を使用して読み取り専用を有効にします: Volume(type="bucket", read_only=True, ...)。

ローカルデータのマウント

マシン上のデータに対してJobを実行するには、sync_job_volume()を使用します。この関数は、ローカルのディレクトリをjobs-artifacts Storage Bucket(必要に応じて自動的に作成されます)に同期し、マウント可能な状態のVolumeを返します。

>>> 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])

各ディレクトリには、バケット内に独自の安定したフォルダが割り当てられます。同じディレクトリに対してsync_job_volume()を再実行しても、新規または変更されたファイルのみがアップロードされます。ボリュームはデフォルトで読み取り専用としてマウントされます。

Jobによって書き込まれたファイルを取得するには、読み書き可能なボリューム(空の出力ディレクトリでも構いません)をマウントし、Jobが終了したらそれを同期してください。

>>> 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")

CLIでは、-vのソース側としてローカルディレクトリを渡すだけです:

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

Jobのポートを公開する

expose を渡すことで、Jobs プロキシ経由でコンテナのポートにアクセスできるようにします。アクセスには、Job の namespace への読み取りアクセス権限を持つ HF トークンが必要です。認証なしでアクセスを許可する場合は、代わりに expose_public を使用します:

>>> 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とexpose_publicは組み合わせることができます。update_job_exposeは、実行中のJobを再起動せずにポート設定全体を置き換えます。どちらのリストにも存在しないポートは閉じられます。両方のオプションは、UVおよびスケジュールされたJobの作成時にも利用できます。

ジョブにSSH接続する

ssh=True を run_job()(または run_uv_job())に渡すことで、Job のコンテナを SSH 経由でアクセス可能にします。SSH エンドポイントは 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'

ターミナルからhf jobs ssh <job_id>(またはssh <job_id>@ssh.hf.jobsで直接)接続します:

>>> hf jobs ssh 68498e23210b3a4f4e6e2a23

Job の namespace への書き込みアクセス権を持つユーザーのみ(Job の作成者、またはオーナー組織のメンバー)が、https://huggingface.co/settings/keys に登録された SSH 公開鍵による認証を経て、アクセスを許可されます。

ネットワークグループ

network_group="<name>" を run_job()(または run_uv_job())に渡すことで、同じ namespace と resource group 内の Jobs がすべてのポートで相互に到達できるようになります。各メンバー内で、HF_NETWORK_GROUP_HOSTNAME はグループ内のすべての Job に解決され、${HF_NETWORK_GROUP_PREFIX}<alias> は 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'])

メンバーは準備が整う前に解決可能になるため、リトライを伴って接続してください。グループ名とエイリアスは小文字の英数字とダッシュのみで、最大46文字および34文字です。

ジョブのタイムアウトを設定

ジョブにはデフォルトのタイムアウト(30分)が設定されており、これを過ぎると自動的に停止します。モデルの学習など、長時間実行されるタスクを実行する際には、この点を理解しておくことが重要です。

カスタムタイムアウトの設定

ジョブの実行時にtimeoutパラメータを指定することで、カスタムのタイムアウト値を設定できます。タイムアウトは2つの方法で指定できます。

  1. 数値として(秒として解釈されます):
>>> 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. 時間単位付きの文字列として:
>>> # 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

サポートされている時間単位:

  • s - 秒
  • m - 分
  • h - 時間
  • d - 日

UVジョブでのtimeoutの使用

UVジョブの場合、タイムアウトも指定できます:

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

タイムアウトを指定しない場合、ジョブにはデフォルトのタイムアウトが適用されます。数時間かかる可能性のあるモデルの学習などの長時間実行タスクでは、予期しないジョブの終了を避けるために、適切なタイムアウトを設定してください。

ジョブの所要時間の監視

長時間のタスクを実行する際は、次のようにするのが良い習慣です:

  • ジョブの予想される実行時間を推定し、バッファを確保したタイムアウトを設定します
  • ログを通じてジョブの進捗を監視します
  • ジョブのステータスを確認し、タイムアウトしていないことを確認します
>>> 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)

タイムアウトパラメータの詳細については、run_job APIリファレンスを参照してください。

環境変数とシークレットを渡す

envと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"},
... )

組み込みの環境変数

ジョブコンテナ内では、以下の環境変数が自動的に利用できます:

変数説明
JOB_ID現在のジョブの一意の識別子です。これをプログラム内でジョブを参照するために使用します。例えば、一意の名前を付けて出力をデータセットに保存する場合などです。
ACCELERATOR利用可能なアクセラレータの種類(例: t4-medium、a10g-small、a100x4)。アクセラレータがない場合は空です。
CPU_CORESジョブで利用可能なCPUコアの数(例: 2、4、8)。
MEMORYジョブに割り当てられるメモリ量(例: 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')}")
... """],
... )

これらの変数は、出力に一意の識別子を作成する必要がある場合、利用可能なハードウェアに基づいてコードを適応させる場合、またはリソース情報をログに記録する場合に役立ちます。

ラベル

Labels は key=value のペアで、Job にメタデータを付与します。

UI上でJobを簡単に検索・識別できるようにするには、nameを使用します。名前は任意であり、一意である必要はありません:

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

CLIから、--nameを渡してJobを作成するか、labelsコマンドで既存のJobに名前を付けます:

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

hf jobs ls は NAME 列を表示し、名前によるフィルタリング(--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"},
... )

名前を指定しない場合、Docker イメージまたはスクリプトから自動的に名前が導出され、短いハッシュが追加されます(例: python:3.12 foo --truc → python-3-12-1a2b3c4d)。CLI から実行する場合、このハッシュはコマンドと解決されたランタイム設定(flavor、タイムアウト、環境変数の値など)をカバーするため、同じ設定であれば常に同じ名前が生成されます。設定を変更すると(スクリプトの [tool.hf-jobs] ヘッダーから由来する設定を含む)名前も変更されます。Python API から実行する場合、ハッシュはコマンドのみをカバーします。

ラベルを更新

既存のジョブのラベルを置き換えるには、update_job_labels()を使用します。これにより、ユーザーが指定した既存のラベルはすべて置き換えられます。

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

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"})

CLIから:

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

すべてのラベルを削除するには、--clearを渡します:

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

UV Scripts(実験的)

すぐに使えるUVスクリプトをお探しですか? Hugging Face Hub上のuv-scripts組織をチェックしてください。モデルの学習、合成データ生成、データ処理などのタスク向けのコミュニティによるUVスクリプトのコレクションが提供されています。

HFインフラ上でUVスクリプト(インライン依存関係を持つPythonスクリプト)を実行します:

# 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スクリプトは、特別なコメント構文を使用して依存関係をファイル内に直接記述するPythonスクリプトです。複雑なプロジェクト設定を必要としない自己完結型のタスクに最適です。UVスクリプトの詳細については、UVドキュメントを参照してください。

スクリプトにlaunch configを添えて

特定のランタイムでのみ正しく実行されるスクリプトは、PEP 723 ヘッダーの任意の [tool.hf-jobs] テーブルにそのランタイムを記述できます。

# /// 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を実行すると、適切なイメージ、ハードウェア、インタープリターで起動し、--flavor、-e、…は引き続きスクリプトが宣言する値を上書きします。キーの完全なリストとマージルールについては、CLIガイドを参照してください。

このテーブルはhf CLIによってのみ読み取られます。run_uv_job()およびcreate_scheduled_uv_job()はこれを無視し、渡された引数をそのまま使用します。つまり、run_uv_job("ocr.py")とhf jobs uv run ocr.pyは同じJobを実行するわけではありません。Python APIでは、image=、flavor=…を明示的に渡す必要があります。

UVスクリプト用のDockerイメージ

UVスクリプトは依存関係をインラインで指定できますが、MLワークロードでは複雑な依存関係を持つことがよくあります。これらのライブラリがすでにインストール済みの事前構築済みDockerイメージを使用することで、ジョブの起動を大幅に高速化し、依存関係の問題を回避できます。

デフォルトでは、hf jobs uv run を実行すると、astral-sh/uv:python3.12-bookworm イメージが使用されます。このイメージは、uv がプリインストールされた Python 3.12 Bookworm ディストリビューションをベースとしています。

--image フラグを使用して、別の画像を指定できます:

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

上記のコマンドはvllm/vllm-openai:latestイメージを使用して実行されます。vLLMを合成データ生成に使用している場合、このアプローチが有用になる可能性があります。

多くの推論フレームワークは、最適化されたDockerイメージを提供しています。Pythonエコシステムにおいてuvの採用が拡大しているため、これらのイメージにもuvがプリインストールされるようになり、hf jobs uv run を使用して動作するようになります。

スケジュールされたジョブ

HFインフラストラクチャ上で実行されるジョブをスケジュールおよび管理します。

@annually、@yearly、@monthly、@weekly、@daily、@hourly、または CRON スケジュール式(例: 毎週月曜日の午前 9 時は "0 9 * * 1")をスケジュールとして指定し、create_scheduled_job() または create_scheduled_uv_job() を使用します:

# 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")

環境変数、シークレット、タイムアウトなどを渡すには、run_job()およびrun_uv_job()と同じパラメータを使用します。

list_scheduled_jobs()、inspect_scheduled_job()、suspend_scheduled_job()、resume_scheduled_job()、update_scheduled_job_schedule()、trigger_scheduled_job()、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)

Webhookでジョブをトリガーする

Webhooksを使用すると、特定のリポジトリ、または特定のユーザー/組織に属するすべてのリポジトリ(自分のリポジトリだけでなく、任意のリポジトリ)に対する新しい変更を監視できます。

create_webhook() を使用して、Hugging Face リポジトリに変更が発生したときに Job をトリガーする Webhook を作成します:

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は、環境変数WEBHOOK_PAYLOADにWebhookペイロードを設定してJobをトリガーします。 Webhookに関する詳細は、Webhooksのドキュメントを参照してください。

Update on GitHub