Hub documentation

الإعداد

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

الإعداد

المصادقة

يجب أن تكون مسجلاً الدخول باستخدام hf auth login لتشغيل Jobs، مع استخدام رمز (token) يحمل صلاحية بدء وإدارة Jobs.

بديلًا عن ذلك، يمكنك تمرير رمز Hugging Face يدويًا باستخدام --token في سطر الأوامر، أو باستخدام معامل token في Python.

تمرير الحُجج

استخدم -- لفصل خيارات Jobs عن الأمر أو السكربت الخاص بك وحوامله. الخيارات التي تأتي بعد --، مثل --help أو --timeout، تُمرَّر كما هي دون أن يفسرها Jobs. ينطبق هذا على كل من UV وDocker Jobs.

hf jobs uv run --flavor t4-small -- script.py --early-stopping-patience 3
               └─ Jobs option ┘    └─ script + arguments ─────────────┘

وظائف UV

حدد سكربت UV أو أمر python الذي تريد تشغيله كما تفعل مع UV:

>>> hf jobs uv run train.py
>>> hf jobs uv run python -c 'print("Hello from the cloud!")'

يقبل الأمر hf jobs uv run حجة UV مثل --with و--python. يتيح لك الحجة --with تحديد تبعيات بايثون، بينما يتيح لك --python اختيار إصدار بايثون الذي تريد استخدامه:

>>> hf jobs uv run --with trl train.py
>>> hf jobs uv run --python 3.12 train.py

على سبيل المثال، مرر الحُجج إلى أمر باستخدام --:

>>> hf jobs uv run --with trl-jobs -- trl-jobs sft --model_name Qwen/Qwen3-0.6B --dataset_name trl-lib/Capybara

ابحث عن قائمة بجميع الحُجج في توثيق سطر الأوامر وتوثيق أوامر UV.

تعمل مهام UV افتراضيًا مع صورة Docker ghcr.io/astral-sh/uv:python3.12-bookworm، لكن يمكنك استخدام صورة أخرى طالما تم تثبيت UV فيها، وذلك باستخدام --image <docker-image>.

راجع استخدام صور Docker للاختيار بين الصور وفهم كيفية تفاعل بيئة الصورة مع تبعيات UV.

تعريف إعدادات الإقلاع في السكربت

يمكن لنص برمجي يعمل بشكل صحيح فقط على بيئة تشغيل محددة (صورة معينة، أو نوع معيّن من وحدات معالجة الرسوميات، أو مُفسِّر نظام) أن يحمل معه ذلك الإعداد، في جدول اختياري [tool.hf-jobs] ضمن ترويسة PEP 723 الخاصة به:

# /// 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 ثم يُشغَّل على ذلك الصورة والعتاد. أما uv run العادي فيتجاهل الجدول، لأن جداول [tool.*] جزء من PEP 723 والأدوات تتخطى تلك التي لا تملكها.

المفاتيح المدعومة، وكلها اختيارية: image، flavor، python، timeout، name، namespace، env، secrets، labels، volumes، network_group وnetwork_aliases. تتطابق هذه المفاتيح مع الأعلام (flags) التي تحمل نفس الأسماء. القيم الواردة من السكربت هي قيم افتراضية: فالعلم الصريح يفوز دائمًا، وتتم دمج env وsecrets وlabels وvolumes عنصرًا بعنصر، بحيث يضيف -e و-v إلى ما يصرّح به السكربت. يُعدّ المفتاح غير المعروف خطأً، وقائمة secrets تحوي الأسماء فقط: فالقيم تأتي من بيئة من يشغّل السكربت، ويُعدّ أي سر غير مُعيَّن محليًا خطأً أيضًا.

استخدم --dry-run لطباعة الإعدادات المُحلّة دون إرسالها؛ حيث تُوسم القيم القادمة من السكربت بـ (from script). راجع دليل سطر أوامر hf لمعرفة قواعد الدمج الكاملة.

تُقرأ الجدولة بواسطة سطر الأوامر hf فقط. وتتجاهل الدالتان run_uv_job() وcreate_scheduled_uv_job() هذه الجدولة، لذا مرّر image= وflavor= و… بشكل صريح من بايثون.

مهام Docker

حدد صورة Docker والأمر الذي تريد تشغيله كما تفعل مع docker:

>>> hf jobs run ubuntu echo "Hello from the cloud!"

هنا، --help يصل إلى Python بدلاً من عرض مساعدة Jobs:

>>> hf jobs run --flavor cpu-basic python:3.12 -- python --help

ابحث عن قائمة بجميع الحُجج في توثيق سطر الأوامر.

راجع استخدام صور Docker للحصول على أمثلة باستخدام الصور الموجودة مسبقًا والصور التي تم بناؤها بواسطة Docker Spaces.

متغيرات البيئة والأسرار

متغيرات البيئة المدمجة

وبنفس الطريقة التي توفر بها متغيرات البيئة المدمجة في Spaces، توفر Jobs تلقائيًا متغيرات البيئة التالية داخل الحاوية:

متغيرالوصف
JOB_IDالمعرّف الفريد للوظيفة الحالية (مثل 699d874f1aad19adb8aaeadc). هذا هو المعرّف نفسه المعروض في واجهة المستخدم وفي عنوان URL الخاص بالوظيفة.
ACCELERATORنوع المُسرِّع المتاح (مثل t4-medium، a10g-small، a100x4)، أو none للمهام التي تعمل على وحدة المعالجة المركزية فقط.
CPU_CORESعدد أنوية وحدة المعالجة المركزية المخصصة للمهمة.
MEMORYالكمية من الذاكرة المخصصة للعمل (مثل 8Gi).
HF_NETWORK_GROUP_HOSTNAMEاسم المضيف الذي يُحلّ إلى كل مهمة ضمن مجموعة الشبكة الخاصة بالمهمة. يُعيَّن فقط عندما تعلن المهمة عن مجموعة.
HF_NETWORK_GROUP_PREFIXبادئة تُضاف قبل الاسم المستعار للحصول على اسم مضيف أعضاء المجموعة الذين يدّعون امتلاكه (على سبيل المثال، ${HF_NETWORK_GROUP_PREFIX}master). يتم ضبطها فقط عندما يعلن عن مجموعة شبكة.

يمكنك استخدام هذه المتغيرات لتتبع المخرجات، أو تكييف كودك مع الموارد المتاحة، أو الإشارة إلى المهمة الحالية برمجياً:

# Access job environment information
>>> hf jobs run python:3.12 python -c "import os; print(f'Job: {os.environ.get(\"JOB_ID\")}, CPU: {os.environ.get(\"CPU_CORES\")}, Mem: {os.environ.get(\"MEMORY\")}')"

متغيرات البيئة المعرفة من قبل المستخدم

يمكنك تمرير متغيرات البيئة إلى مهمتك باستخدام

# Pass environment variables
>>> hf jobs uv run -e FOO=foo -e BAR=bar python -c 'import os; print(os.environ["FOO"], os.environ["BAR"])'
# Pass an environment from a local .env file
>>> hf jobs uv run --env-file .env python -c 'import os; print(os.environ["FOO"], os.environ["BAR"])'
# Pass secrets - they will be encrypted server side
>>> hf jobs uv run -s MY_SECRET=psswrd python -c 'import os; print(os.environ["MY_SECRET"])'
# Pass secrets from a local .env.secrets file - they will be encrypted server side
>>> hf jobs uv run --secrets-file .env.secrets python -c 'import os; print(os.environ["MY_SECRET"])'

استخدم --secrets HF_TOKEN لتسليم رمز Hugging Face المحلي بشكل ضمني. مع هذه الصياغة، يتم استرجاع السر من متغير البيئة. بالنسبة إلى HF_TOKEN، قد يقرأ ملف الرمز الموجود في مجلد Hugging Face الرئيسي إذا لم يتم تعيين متغير البيئة.

الأحجام

اربط مستودعات Hugging Face (النماذج، مجموعات البيانات)، أو Storage Buckets، أو المجلدات المحلية كمجلدات في حاوية مهمتك باستخدام -v أو --volume. تستخدم مصادر Hub مخطط عنوان hf://: hf://[TYPE/]SOURCE:/MOUNT_PATH[:ro]؛ بينما يُمرر المجلد المحلي مباشرةً كمصدر.

بما أن الملفات المرفقة تُجلب بشكل كسول، يتيح التثبيت للعمل Job التعامل مع مجموعات بيانات أكبر بكثير من القرص المحلي الخاص به. راجع معالجة مجموعات البيانات الكبيرة للتثبيت والبث ومعالجة البيانات الضخمة على Jobs.

أنواع الأحجام:

النوعمثال
مستودع النموذج-v hf://openai/gpt-oss-120b:/model
مستودع مجموعة البيانات-v hf://datasets/stanfordnlp/imdb:/data
دلو التخزين-v hf://buckets/username/my-bucket:/mnt
مجلد فرعي-v hf://datasets/org/my-dataset/train:/data
المجلد المحلي-v ./training-data:/data

ثم استخدم المجلد المُثبَّت كمجلد محلي داخل الحاوية:

# Mount a dataset and query it with DuckDB
>>> hf jobs run -v hf://datasets/stanfordnlp/imdb:/dataset \
...     duckdb/duckdb duckdb -c "SELECT * FROM '/dataset/**/*.parquet' LIMIT 5"

# Mount a bucket to save training checkpoints
>>> hf jobs uv run -v hf://buckets/username/my-bucket:/training-outputs \
...     sft.py --output-dir /training-outputs/training-v3-final

يمكن تركيب عدة أحجام عن طريق تكرار علم -v:

>>> hf jobs run -v hf://datasets/username/my-dataset:/data -v hf://buckets/username/my-bucket:/output \
...     python:3.12 python script.py

تُركَّب النماذج ومجموعات البيانات دائمًا للقراءة فقط. أما دلاء التخزين فتكون للقراءة والكتابة افتراضيًا، وهو ما يفيد في حفظ المخرجات أو نقاط التفتيش أو النتائج الوسيطة. استخدم :ro لتركيب دلو في وضع القراءة فقط:

>>> hf jobs run -v hf://buckets/username/my-bucket:/mnt:ro python:3.12 ls /mnt

المجلدات المحلية

عند تمرير مجلد محلي كمصدر، يتم مزامنته مع Storage Bucket الخاص بك jobs-artifacts (يُنشأ تلقائيًا) قبل بدء المهمة، ثم يُركَّب داخل الحاوية. تُركَّب المجلدات المحلية للقراءة فقط افتراضيًا؛ استخدم :rw لكتابة المخرجات:

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

إعادة مزامنة نفس المجلد ترفع الملفات الجديدة أو المعدّلة فقط. لاسترجاع الملفات التي كتبها Job إلى مجلد قابل للقراءة والكتابة، قم بمزامنة مجلد bucket الخاص به مرة أخرى بعد انتهاء الـ Job — حيث يطبع CLI الأمر الدقيق hf buckets sync عند بدء الـ Job. تعمل المهام المجدولة أيضًا: يتم مزامنة المجلد مرة واحدة عند إنشاء الجدولة، وكل محفّز يركّب نفس المجلد. في Python، استخدم sync_job_volume.

في Python، استخدم فئة Volume:

from huggingface_hub import Volume, run_job

job = run_job(
    image="python:3.12",
    command=["python", "-c", "import os; print(os.listdir('/data'))"],
    volumes=[
        Volume(type="dataset", source="username/my-dataset", mount_path="/data"),
        Volume(type="bucket", source="username/my-bucket", mount_path="/output"),
    ],
)

يتطلب تركيب المجلدات huggingface_hub >= 1.8.0. راجع توثيق عميل بايثون ودليل التثبيت لمزيد من التفاصيل.

نوع العتاد

شغّل المهام على وحدات معالجة الرسوميات (GPUs) أو وحدات المعالجة المخصصة (TPUs) باستخدام الحجة flavor. على سبيل المثال، لتشغيل مهمة PyTorch على وحدة معالجة رسومات A10G:

>>> hf jobs uv run --with torch --flavor a10g-small python -c "import torch; print(f'This code ran with the following GPU: {torch.cuda.get_device_name()}')"

عند تشغيل هذا، ستظهر المخرجات التالية!

This code ran with the following GPU: NVIDIA A10G

فيما يلي مثال آخر لتشغيل سكربت الضبط الدقيق مثل trl/scripts/sft.py:

>>> hf jobs uv run --with trl --flavor a10g-small -s HF_TOKEN -- sft.py --model_name_or_path Qwen/Qwen2-0.5B ...

للحصول على إرشادات شاملة حول تشغيل مهام تدريب النماذج باستخدام TRL على بنية Hugging Face التحتية، راجع توثيق تدريب مهام TRL. يتناول هذا التوثيق وصفات الضبط الدقيق، واختيار الأجهزة، وأفضل الممارسات لتدريب النماذج بكفاءة.

شاهد قائمة خيارات --flavor المتاحة باستخدام الأمر hf jobs hardware (الافتراضي هو cpu-basic):

>>> hf jobs hardware
name             pretty name             cpu       ram      storage   accelerator               cost/min  cost/hour
cpu-basic        CPU Basic               2 vCPU    16 GB    50 GB                               $0.0002   $0.01
cpu-upgrade      CPU Upgrade             8 vCPU    32 GB    50 GB                               $0.0005   $0.03
cpu-performance  CPU Performance         32 vCPU   256 GB   1024 GB                             $0.0317   $1.90
cpu-xl           CPU XL                  16 vCPU   124 GB   1000 GB                             $0.0167   $1.00
t4-small         Nvidia T4 - small       4 vCPU    15 GB    50 GB     1x T4 (16 GB)             $0.0067   $0.40
t4-medium        Nvidia T4 - medium      8 vCPU    30 GB    100 GB    1x T4 (16 GB)             $0.0100   $0.60
a10g-small       Nvidia A10G - small     4 vCPU    15 GB    110 GB    1x A10G (24 GB)           $0.0167   $1.00
a10g-large       Nvidia A10G - large     12 vCPU   46 GB    200 GB    1x A10G (24 GB)           $0.0250   $1.50
a10g-largex2     2x Nvidia A10G - large  24 vCPU   92 GB    1000 GB   2x A10G (48 GB)           $0.0500   $3.00
a10g-largex4     4x Nvidia A10G - large  48 vCPU   184 GB   2000 GB   4x A10G (96 GB)           $0.0833   $5.00
a100-large       Nvidia A100 - large     12 vCPU   142 GB   1000 GB   1x A100 (80 GB)           $0.0417   $2.50
a100x4           4x Nvidia A100          48 vCPU   568 GB   4000 GB   4x A100 (320 GB)          $0.1667   $10.00
a100x8           8x Nvidia A100          96 vCPU   1136 GB  8000 GB   8x A100 (640 GB)          $0.3333   $20.00
h200             Nvidia H200             23 vCPU   256 GB   3000 GB   1x H200 (141 GB)          $0.0833   $5.00
h200x2           Nvidia H200             46 vCPU   512 GB   6000 GB   2x H200 (282 GB)          $0.1667   $10.00
h200x4           Nvidia H200             92 vCPU   1024 GB  12000 GB  4x H200 (564 GB)          $0.3333   $20.00
h200x8           Nvidia H200             184 vCPU  2048 GB  24000 GB  8x H200 (1128 GB)         $0.6667   $40.00
rtx-pro-6000     Nvidia RTX PRO 6000     23 vCPU   256 GB   475 GB    1x RTX PRO 6000 (96 GB)   $0.0458   $2.75
rtx-pro-6000x2   Nvidia RTX PRO 6000     46 vCPU   512 GB   950 GB    2x RTX PRO 6000 (192 GB)  $0.0917   $5.50
rtx-pro-6000x4   Nvidia RTX PRO 6000     92 vCPU   1024 GB  1900 GB   4x RTX PRO 6000 (384 GB)  $0.1833   $11.00
rtx-pro-6000x8   Nvidia RTX PRO 6000     184 vCPU  2048 GB  3800 GB   8x RTX PRO 6000 (768 GB)  $0.3667   $22.00
l4x1             1x Nvidia L4            8 vCPU    30 GB    400 GB    1x L4 (24 GB)             $0.0133   $0.80
l4x4             4x Nvidia L4            48 vCPU   186 GB   3200 GB   4x L4 (96 GB)             $0.0633   $3.80
l40sx1           1x Nvidia L40S          8 vCPU    62 GB    380 GB    1x L40S (48 GB)           $0.0300   $1.80
l40sx4           4x Nvidia L40S          48 vCPU   382 GB   3200 GB   4x L40S (192 GB)          $0.1383   $8.30
l40sx8           8x Nvidia L40S          192 vCPU  1534 GB  6500 GB   8x L40S (384 GB)          $0.3917   $23.50

تفعيل المنافذ

يمكن للمهام كشف منافذ الحاويات عبر وكيل المهام العام باستخدام --expose <port> (سطر الأوامر) أو expose=[<port>] (واجهة برمجة التطبيقات بلغة بايثون). يمكن الوصول إلى كل منفذ مكشوف عبر https://<job_id>--<port>.hf.jobs ويتطلب ذلك رمز HF مع صلاحية read على مساحة أسماء المهمة:

curl -H "Authorization: Bearer $HF_TOKEN" https://<job_id>--<port>.hf.jobs/

يعمل هذا مع hf jobs run وhf jobs uv run وأنواعهما المجدولة. كرر العلم لعرض عدة منافذ (--expose 8000 --expose 8001)، أو مرر عدة منافذ في القائمة (expose=[8000, 8001]).

لجعل منفذ قابلًا للوصول دون الحاجة إلى رمز HF، استخدم --expose-public <port> (سطر الأوامر) أو expose_public=[<port>] (واجهة برمجة التطبيقات بلغة بايثون) بدلاً من ذلك. يمكن لأي شخص لديه الرابط الوصول إلى المنفذ، لذا استخدمه فقط لخدمة آمنة للمشاركة. يمكنك دمج الخيارين معًا: بعض المنافذ تتطلب رمز HF بينما تكون الأخرى عامة.

تُحتسب رسوم المنافذ المكشوفة بسعر ثابت منخفض لكل ساعة، يُضاف إلى سعر العتاد الخاص بالمهمة، وذلك فقط أثناء تشغيل المهمة. راجع صفحة التسعير للاطلاع على التفاصيل.

سطر الأوامر

# Expose a web server running on port 8000
>>> hf jobs run --expose 8000 python:3.12 python -m http.server 8000
✓ Job started
  id: 6a2aa7cec4f53f9fc5aa4cff
  url: https://huggingface.co/jobs/Wauplin/6a2aa7cec4f53f9fc5aa4cff
Hint: Exposed ports are reachable at (requires an HF token with read access to the job):
  https://6a2aa7cec4f53f9fc5aa4cff--8000.hf.jobs
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

Python

>>> from huggingface_hub import run_job
>>> job = run_job(image="python:3.12", command=["python", "-m", "http.server", "8000"], expose=[8000])
>>> job.status.expose_urls
['https://6a2ab384c4f53f9fc5aa4d4f--8000.hf.jobs']

تغيير المنافذ (Ports) لوظيفة (Job) قيد التشغيل

استخدم hf jobs expose لتغيير المنافذ المكشوفة دون إعادة تشغيل المهمة:

# Expose port 8000 (requires an HF token)
>>> hf jobs expose <job_id> 8000

# Expose port 8000 (requires an HF token) and port 9000 publicly
>>> hf jobs expose <job_id> 8000 --public 9000

# Close all exposed ports
>>> hf jobs expose <job_id> --clear

يستبدل الأمر القائمة الكاملة للموانئ المكشوفة، لذا فإن أي منفذ لا تدرجه سيُغلق. في بايثون، استخدم update_job_expose.

SSH

يمكنك فتح جلسة SSH تفاعلية إلى مهمة قيد التشغيل للتصحيح أو الفحص أو العمل مباشرة داخل الحاوية. فعّلها عند إنشاء المهمة باستخدام --ssh (سطر الأوامر) أو ssh=True (واجهة برمجة التطبيقات بلغة بايثون)، ثم اتصل باستخدام hf jobs ssh <job_id>.

يُسمح فقط للمستخدمين الذين لديهم صلاحية الكتابة (Write) في مساحة الاسم (namespace) الخاصة بالمهمة (Job) (أي منشئ المهمة، أو أعضاء المنظمة المالكة الذين لديهم صلاحيات كتابة). يتم تنفيذ المصادقة عبر مفاتيح SSH العامة المسجلة في https://huggingface.co/settings/keys.

يتوفر SSH في hf jobs run وhf jobs uv run. ولا يُدعم في المهام المجدولة.

سطر الأوامر

# Start a job with SSH enabled
>>> hf jobs run --ssh --detach --timeout 10m python:3.12 sleep infinity
✓ Job started
  id: 6a2bd1f1871c005b5352ad31
  url: https://huggingface.co/jobs/Wauplin/6a2bd1f1871c005b5352ad31
Hint: Use `hf jobs ssh 6a2bd1f1871c005b5352ad31` to open an SSH session into the job.

# Open an SSH session into the job
>>> hf jobs ssh 6a2bd1f1871c005b5352ad31

يمكنك أيضًا طباعة أمر SSH دون تنفيذه (--dry-run)، أو تمرير ملف هوية محدد (-i/--identity-file):

>>> hf jobs ssh 6a2bd1f1871c005b5352ad31 --dry-run
ssh 6a2bd1f1871c005b5352ad31@ssh.hf.jobs

>>> hf jobs ssh 6a2bd1f1871c005b5352ad31 -i ~/.ssh/id_ed25519

Python

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

ثم اتصل من الطرفية باستخدام hf jobs ssh <job_id>، أو مباشرةً باستخدام ssh <job_id>@ssh.hf.jobs.

إعادة توجيه المنافذ

بما أن هذا اتصال SSH عادي، يمكنك استخدام علمي -L و-R في SSH لتحويل المنافذ بين جهازك والمهمة. اتصل مباشرة باستخدام ssh (استخدم hf jobs ssh <job_id> --dry-run للحصول على الوجهة الدقيقة) وأضف أعلام التحويل.

استخدم -L (إعادة التوجيه المحلية) للوصول إلى خدمة تعمل داخل المهمة من جهازك. على سبيل المثال، للوصول إلى TensorBoard الذي تم تشغيله في مهمة تدريب:

# Forward local port 6006 to the Job's TensorBoard on port 6006
>>> ssh -L 6006:localhost:6006 6a2bd1f1871c005b5352ad31@ssh.hf.jobs

ثم افتح http://localhost:6006 في متصفحك.

استخدم -R (إعادة التوجيه عن بُعد) للسماح للوظيفة بالوصول إلى خدمة تعمل على جهازك. على سبيل المثال، لتعريض قاعدة بيانات محلية أو واجهة برمجة تطبيقات للوظيفة:

# Make your local port 8080 reachable from inside the Job on port 8080
>>> ssh -R 8080:localhost:8080 6a2bd1f1871c005b5352ad31@ssh.hf.jobs

مجموعات الشبكات

يمكن للمهام الانضمام إلى مجموعة شبكة باستخدام --network-group <name> (سطر الأوامر) أو network_group="<name>" (واجهة برمجة التطبيقات بلغة بايثون). يمكن للمهام الموجودة في نفس مساحة الأسماء ومجموعة الموارد والتي تتشارك في مجموعة واحدة الوصول إلى بعضها البعض على كل منفذ: يحل HF_NETWORK_GROUP_HOSTNAME إلى كل عضو، بينما يحل ${HF_NETWORK_GROUP_PREFIX}<alias> إلى الأعضاء الذين ادّعوا مستعارًا باستخدام --network-alias <alias> (سطر الأوامر) أو network_aliases=[<alias>] (واجهة برمجة التطبيقات بلغة بايثون).

يعمل هذا مع hf jobs run وhf jobs uv run. يمكن تحديد الأعضاء قبل أن يصبحوا جاهزين، لذا اتصل بإعادة المحاولة. أسماء المجموعات والرموز المستعارة أحرف صغيرة وأرقام وشرطات، بحد أقصى 46 و34 حرفًا على التوالي؛ ويجب أن تكون رموز المستعرات الخاصة بالوظيفة فريدة.

سطر الأوامر

# Start a server, reachable by the other members of the group as "master"
>>> hf jobs run --detach --network-group train --network-alias master python:3.12 python -m http.server 8000

# Start a client in the same group
>>> hf jobs run --detach --network-group train python:3.12 sh -c 'curl --retry 10 --retry-connrefused "http://${HF_NETWORK_GROUP_PREFIX}master:8000/"'

Python

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

يمكن لأطر عمل التدريب متعددة العقد استخدام اسم مستعار كمضيف للقاء، على سبيل المثال torchrun --master_addr "${HF_NETWORK_GROUP_PREFIX}master".

مهلة

تتمتع المهلات بوقت انقضاء افتراضي (30 دقيقة)، وبعد انقضائه تتوقف تلقائيًا. من المهم معرفة ذلك عند تشغيل مهام طويلة الأمد مثل تدريب النماذج.

يمكنك تحديد قيمة مهلة مخصصة باستخدام معامل --timeout عند تشغيل مهمة. يمكن تحديد المهلة بطريقتين:

  1. كعدد (يُفسَّر على أنه ثوانٍ):

استخدم --timeout وقم بتمرير العدد بالثواني (هنا ساعتان = 7200 ثانية):

>>> hf jobs uv run --timeout 7200 --with torch --flavor a10g-large train.py
  1. كسلسلة نصية مع وحدات زمنية:

أو استخدم --timeout واستخدم وحدات زمنية مختلفة:

>>> hf jobs uv run --timeout 2h --with torch --flavor a10g-large train.py

أمثلة أخرى:

--timeout 30m    # 30 minutes
--timeout 1.5h   # 1.5 hours
--timeout 1d     # 1 day
--timeout 3600s  # 3600 seconds

وحدات الوقت المدعومة:

  • s - ثوانٍ
  • m - دقائق
  • h - ساعات
  • d - أيام

إذا لم تحدد مهلة زمنية، فسيتم تطبيق مهلة زمنية افتراضية على مهمتك. بالنسبة للمهام طويلة الأمد مثل تدريب النماذج التي قد تستغرق ساعات، تأكد من تحديد مهلة زمنية مناسبة لتجنب إنهاء المهمة بشكل غير متوقع.

المحاولات المتكررة

بشكل افتراضي، يُنفَّذ Job مرة واحدة. استخدم --attempts <n> (CLI) أو attempts=<n> (Python API) لإعادة محاولة Job يفشل. يشمل العدد التنفيذ الأول، لذا يسمح --attempts 3 بإجراء محاولتين لإعادة المحاولة كحد أقصى:

>>> hf jobs uv run --attempts 3 --flavor a10g-large train.py

يعمل هذا مع hf jobs run وhf jobs uv run وأنواعهما المجدولة.

تُعيد محاولة إعادة التشغيل تشغيل الأمر مرة أخرى من البداية، تحت معرّف المهمة (Job ID) نفسه. للسماح للمحاولة الجديدة بمواصلة العمل من حيث توقفت المحاولة السابقة، اكتب نقاط التفتيش (checkpoints) إلى دلو (bucket) مُثبّت، واجعل سكربتك يستأنف من تلك النقاط. راجع بعد انتهائها في تدريب النماذج على المهام (Jobs).

المجال

شغّل المهام تحت حساب مؤسستك باستخدام الحجة --namespace. تأكد من تسجيل الدخول برمز وصول (token) يمنحك صلاحية بدء المهام وإدارتها تحت حساب مؤسستك.

>>> hf jobs uv run --namespace my-org-name python -c "print('Running in an org account')"

لاحظ أنه يمكنك تمرير رمز (token) يدويًا مع الإذن المناسب:

>>> hf jobs uv run --namespace my-org-name --token hf_xxx python -c "print('Running in an org account')"

التسميات

أضِف واحدة أو أكثر من التسميات إلى مهمة لإضافة بعض البيانات الوصفية باستخدام -l أو --label. يمكنك استخدام هذه البيانات الوصفية لاحقًا لتصفية المهام على الموقع أو في سطر الأوامر.

أضِف تسميات باستخدام --label my-label أو تسميات بمفتاح وقيمة باستخدام --label key=value. يمكن أن تحتوي المفاتيح والقيم على أحرف وأرقام و- و_. على سبيل المثال:

hf jobs uv run --label fine-tuning --label model=Qwen3-06B --label dataset=Capybara ...

لاحظ أن استخدام نفس key عدة مرات يؤدي إلى أن key=value الأخير يتجاوز ويلغي أي تسمية سابقة تحمل key.

تسمية مهمة

امنح المهمة اسمًا ليسهل العثور عليها وتحديد هويتها في واجهة المستخدم. يُخزَّن الاسم كوسم name ولا يشترط أن يكون فريدًا. في واجهة المستخدم، تُجمَّع المهام حسب الاسم.

hf jobs run --name daily-report python:3.12 python report.py

إذا لم تُمرّر --name، يُسمّى Job باسم صورة Docker أو السكربت الخاص به بالإضافة إلى تجزئة قصيرة للأمر، بحيث تتشارك إعادة تشغيلات نفس الأمر الاسم نفسه بينما تحصل الأوامر المختلفة على أسماء مختلفة (مثل python-3-12-6b9d662c لـ Job يعمل على python:3.12).

تحديث التسميات

حدّث التسميات على مهمة موجودة مسبقًا باستخدام hf jobs labels. عند تمرير --label يتم استبدال جميع التسميات الموجودة؛ أما عند تمرير --name وحده فتبقى التسميات كما هي:

# Replace the labels on a Job
hf jobs labels <job_id> --label env=prod --label team=ml

# Name an existing Job (keeps its other labels)
hf jobs labels <job_id> --name daily-report

# Remove all labels from a Job
hf jobs labels <job_id> --clear
Update on GitHub