Hub Python Library documentation
تشغيل وإدارة المهام
تشغيل وإدارة المهام
توفّر منصة Hugging Face Hub قدرات حوسبة لعمليات الذكاء الاصطناعي وبياناتها عبر Jobs.
لمراجعة عامة حول الوظائف والأسعار، راجع توثيق وظائف Hub.
تُنفَّذ المهمة على بنية Hugging Face التحتية، وتُعرَّف بأمر تشغيل (مثل أمر python)، وصور Docker من Hugging Face Spaces أو Docker Hub، ونوع من العتاد (CPU أو GPU أو TPU). سيوضح لك هذا الدليل كيفية التفاعل مع المهام على Hub، لا سيما:
- تشغيل مهمة.
- تحقق من حالة المهمة.
- اختر العتاد.
- اضبط متغيرات البيئة والأسرار.
- شغّل سكربتات UV.
إذا كنت ترغب في تشغيل مهمة على Hub وإدارتها، فيجب أن تكون جهازك مسجلاً الدخول. إذا لم يكن كذلك، فيرجى الرجوع إلى هذا القسم. في بقية هذا الدليل، سنفترض أن جهازك مسجّل الدخول.
يتوفر وظائف Hugging Face لأي مستخدم أو منظمة لديها رصيد ائتماني موجب. راجع أسعار وفوترة الوظائف للاطلاع على التفاصيل.
واجهة سطر الأوامر للمهام
استخدم واجهة سطر الأوامر hf jobs لتشغيل المهام من سطر الأوامر، ومرّر --flavor لتحديد العتاد الخاص بك.
hf jobs run يشغّل مهام (Jobs) باستخدام صورة Docker وأمر بواجهة تشبه واجهة Docker المألوفة. فكّر في الأمر 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.
ستوضح لك بقية هذا الدليل واجهة برمجة التطبيقات بلغة بايثون.
إذا كنت تفضل الاطلاع على جميع أوامر hf jobs وخياراتها المتاحة بدلاً من ذلك، فتفضل بالاطلاع على الدليل الخاص بواجهة سطر الأوامر hf jobs.
هل تحتاج إلى جهاز تفاعلي بدلاً من مهمة تُنفَّذ مرة واحدة فقط — على سبيل المثال، لتشغيل أكواد مولّدة بالذكاء الاصطناعي، مع تنفيذ الأوامر ونقل الملفات؟ اطّلع على Sandboxes، المبنية على أساس Jobs.
تشغيل مهمة
شغّل مهام الحوسبة المُعرَّفة بأمر وصورة Docker على بنية Hugging Face التحتية (بما في ذلك وحدات GPU و TPU).
يمكنك إدارة المهام التي تملكها فقط (ضمن نطاق اسم المستخدم الخاص بك) أو المهام التابعة للمنظمات التي تملك فيها صلاحيات كتابة. هذه الميزة تعمل بنظام الدفع حسب الاستخدام: تدفع فقط مقابل الثواني التي تستخدمها.
تتيح لك 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() كائن JobInfo الذي يحتوي على رابط المهمة على Hugging Face، حيث يمكنك الاطلاع على حالة المهمة والسجلات. احفظ معرّف المهمة من JobInfo لإدارة المهمة:
>>> 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() لمراقبة استخدام الموارد.
إعادة المحاولة وإعادة تشغيل مهمة
استخدم attempts لإعادة محاولة مهمة (Job) فشلت. يشمل العدد المحاولة الأولى، لذا يسمح attempts=3 بإجراء محاولتين لإعادة المحاولة كحد أقصى. كما يعمل مع 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 يبدأ مهمة (Job) مستقلة بمعرّف جديد. يعمل هذا الأمر مع المهام المكتملة أو الفاشلة ويعيد استخدام المواصفات المحفوظة، بما في ذلك الأسرار وإعدادات العتاد. يمكنك أيضًا تشغيل 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)انتظر حتى تنتهي المهام
استخدم wait_for_job() لحجب التنفيذ حتى يصل Job إلى مرحلة نهائية (COMPLETED أو CANCELED أو ERROR أو DELETED). يُعاد JobInfo النهائي دائمًا — ففشل Job لا يثير استثناءً — لذا افحص job.status.stage للتعامل مع النتيجة. مرر قائمة من معرّفات Job للانتظار على دفعة كاملة دفعة واحدة.
>>> 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)يتوفر الأمر نفسه في سطر الأوامر عبر hf jobs wait، حيث ينتهي برمز 0 فقط إذا اكتملت جميع المهام بنجاح — وهو أمر مفيد لربط الأوامر في سكربتات shell أو في بيئات 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) ينتهي أيضًا برمز غير صفري إذا فشل المهمة، لذا تتسلسل hf jobs run ... && next-step بشكل صحيح دون انتظار صريح.
اختر العتاد
توجد حالات عديدة يكون فيها تشغيل المهام على وحدات معالجة الرسومات مفيداً:
- تدريب النماذج: ضبط النماذج الدقيقة أو تدريبها على وحدات معالجة الرسوميات (T4، A10G، A100) دون الحاجة إلى إدارة البنية التحتية
- توليد البيانات الاصطناعية: توليد مجموعات بيانات واسعة النطاق باستخدام نماذج اللغة الكبيرة على أجهزة قوية
- معالجة البيانات: معالجة مجموعات بيانات ضخمة باستخدام تكوينات عالية المعالجة المركزية للأحمال المتوازية
- الاستدلال الدُفعي: تشغيل الاستدلال دون اتصال على آلاف العينات باستخدام إعدادات وحدات معالجة الرسوميات المُحسّنة
- التجارب والمعايير: تشغيل تجارب تعلم الآلة على أجهزة متسقة للحصول على نتائج قابلة للتكرار
- التطوير والتصحيح: اختبار كود GPU دون الحاجة إلى إعداد CUDA محلي
شغّل المهام على وحدات معالجة الرسوميات (GPUs) أو وحدات المعالجة المخصصة (TPUs) باستخدام الحجة flavor. على سبيل المثال، لتشغيل مهمة PyTorch على وحدة معالجة رسومات 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",
... )عند تشغيل هذا، ستظهر المخرجات التالية!
This code ran with the following GPU: NVIDIA A10G
استخدم هذا لتشغيل سكربت ضبط دقيق مثل trl/scripts/sft.py باستخدام 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",
... )للحصول على إرشادات شاملة حول تشغيل مهام تدريب النماذج باستخدام TRL على بنية Hugging Face التحتية، راجع توثيق تدريب مهام TRL. يتناول هذا التوثيق وصفات الضبط الدقيق، واختيار الأجهزة، وأفضل الممارسات لتدريب النماذج بكفاءة.
فيما يلي القائمة الكاملة للأجهزة المتاحة لتشغيل المهام:
| الاسم | الاسم الجميل | cpu | الذاكرة | التخزين | accelerator | التكلفة/الدقيقة | التكلفة/ساعة |
|---|---|---|---|---|---|---|---|
cpu-basic | أساسيات المعالج | 2 وحدة معالجة مركزية | 16 GB | 50 جيجابايت | - | $0.0002 | $0.01 |
cpu-upgrade | ترقية وحدة المعالجة المركزية | 8 vCPU | 32 GB | 50 جيجابايت | - | $0.0005 | $0.03 |
cpu-performance | أداء المعالج | 32 وحدة معالجة مركزية افتراضية | 256 GB | 1024 جيجابايت | - | $0.0317 | $1.90 |
cpu-xl | CPU XL | 16 وحدة معالجة مركزية | 124 GB | 1000 جيجابايت | - | $0.0167 | $1.00 |
t4-small | Nvidia T4 - صغير | 4 vCPU | 15 جيجابايت | 50 جيجابايت | 1x T4 (16 جيجابايت) | $0.0067 | $0.40 |
t4-medium | Nvidia T4 - متوسط | 8 vCPU | 30 جيجابايت | 100 جيجابايت | 1x T4 (16 جيجابايت) | $0.0100 | $0.60 |
a10g-small | Nvidia A10G - صغير | 4 vCPU | 15 جيجابايت | 110 جيجابايت | 1x A10G (24 GB) | $0.0167 | $1.00 |
a10g-large | Nvidia A10G - كبير | 12 وحدة معالجة مركزية | 46 جيجابايت | 200 جيجابايت | 1x A10G (24 GB) | $0.0250 | $1.50 |
a10g-largex2 | 2x Nvidia A10G - كبير | 24 وحدة معالجة مركزية | 92 جيجابايت | 1000 جيجابايت | 2x A10G (48 GB) | $0.0500 | $3.00 |
a10g-largex4 | 4x Nvidia A10G - كبير | 48 وحدة معالجة مركزية | 184 جيجابايت | 2000 جيجابايت | 4x A10G (96 GB) | $0.0833 | $5.00 |
a100-large | Nvidia A100 - كبير | 12 وحدة معالجة مركزية | 142 جيجابايت | 1000 جيجابايت | 1x A100 (80 GB) | $0.0417 | $2.50 |
a100x4 | 4x Nvidia A100 | 48 وحدة معالجة مركزية | 568 جيجابايت | 4000 جيجابايت | 4x A100 (320 GB) | $0.1667 | $10.00 |
a100x8 | 8x Nvidia A100 | 96 vCPU | 1136 جيجابايت | 8000 جيجابايت | 8x A100 (640 GB) | $0.3333 | $20.00 |
h200 | Nvidia H200 | 23 وحدة معالجة مركزية افتراضية | 256 GB | 3000 جيجابايت | 1x H200 (141 GB) | $0.0833 | $5.00 |
h200x2 | Nvidia H200 | 46 وحدة معالجة مركزية افتراضية | 512 جيجابايت | 6000 جيجابايت | 2x H200 (282 GB) | $0.1667 | $10.00 |
h200x4 | Nvidia H200 | 92 وحدة معالجة مركزية | 1024 جيجابايت | 12000 جيجابايت | 4x H200 (564 GB) | $0.3333 | $20.00 |
h200x8 | Nvidia H200 | 184 وحدة معالجة مركزية افتراضية | 2048 جيجابايت | 24000 جيجابايت | 8x H200 (1128 جيجابايت) | $0.6667 | $40.00 |
rtx-pro-6000 | Nvidia RTX PRO 6000 | 23 وحدة معالجة مركزية افتراضية | 256 GB | 475 جيجابايت | 1x RTX PRO 6000 (96 GB) | $0.0458 | $2.75 |
rtx-pro-6000x2 | Nvidia RTX PRO 6000 | 46 وحدة معالجة مركزية افتراضية | 512 جيجابايت | 950 غيغابايت | 2x RTX PRO 6000 (192 جيجابايت) | $0.0917 | $5.50 |
rtx-pro-6000x4 | Nvidia RTX PRO 6000 | 92 وحدة معالجة مركزية | 1024 جيجابايت | 1900 جيجابايت | 4x RTX PRO 6000 (384 GB) | $0.1833 | $11.00 |
rtx-pro-6000x8 | Nvidia RTX PRO 6000 | 184 وحدة معالجة مركزية افتراضية | 2048 جيجابايت | 3800 جيجابايت | 8x RTX PRO 6000 (768 جيجابايت) | $0.3667 | $22.00 |
l4x1 | 1x Nvidia L4 | 8 vCPU | 30 جيجابايت | 400 جيجابايت | 1x L4 (24 GB) | $0.0133 | $0.80 |
l4x4 | 4x Nvidia L4 | 48 وحدة معالجة مركزية | 186 جيجابايت | 3200 جيجابايت | 4x L4 (96 جيجابايت) | $0.0633 | $3.80 |
l40sx1 | 1x Nvidia L40S | 8 vCPU | 62 جيجابايت | 380 جيجابايت | 1x L40S (48 GB) | $0.0300 | $1.80 |
l40sx4 | 4x Nvidia L40S | 48 وحدة معالجة مركزية | 382 جيجابايت | 3200 جيجابايت | 4x L40S (192 GB) | $0.1383 | $8.30 |
l40sx8 | 8x Nvidia L40S | 192 وحدة معالجة مركزية | 1534 GB | 6500 جيجابايت | 8x L40S (384 GB) | $0.3917 | $23.50 |
يمكنك الحصول على هذه القائمة برمجياً من خلال تنفيذ الأمر التالي:
>>> hf jobs hardwareأو باستخدام واجهة برمجة تطبيقات بايثون:
>>> from huggingface_hub import list_jobs_hardware
>>> list_jobs_hardware()هذا كل شيء! أنت الآن تشغّل الكود على بنية Hugging Face التحتية.
تثبيت وحدة تخزين
قم بتركيب وحدة تخزين على قرص Jobs باستخدام قائمة من Volume.
يمكنك إرفاق أي مستودع على 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, ...).
تثبيت البيانات المحلية
لتشغيل مهمة على بيانات موجودة على جهازك، استخدم sync_job_volume(): فهو يزامن مجلدًا محليًا مع Storage Bucket الخاص بـ jobs-artifacts (يُنشأ تلقائيًا عند الحاجة) ويعيد 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")في سطر الأوامر، مرر مجلدًا محليًا ببساطة كطرف المصدر لـ -v:
>>> hf jobs uv run -v ./pdfs:/input -v ./md-out:/output:rw ocr.pyتفعيل منافذ المهمة
مرّر expose لجعل منفذ الحاوية قابلاً للوصول عبر وكيل Jobs. يتطلب الوصول رمز HF مع صلاحية القراءة في مساحة أسماء Job. استخدم 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 إعداد المنفذ الكامل على مهمة قيد التشغيل دون إعادة تشغيلها: تُغلق المنافذ غير الموجودة في أيٍّ من القائمتين. تتوفر كلا الخيارين أيضًا عند إنشاء مهام UV والمهام المجدولة.
الدخول إلى مهمة عبر SSH
مرّر ssh=True إلى run_job() (أو run_uv_job()) لجعل حاوية المهمة قابلة للوصول عبر SSH. يتوفر نقطة نهاية SSH في حالة المهمة:
>>> 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يُسمح فقط للمستخدمين الذين لديهم صلاحية الكتابة في مساحة الاسم الخاصة بالمهمة (صاحب المهمة، أو أعضاء المنظمة المالكة) بالدخول، وذلك عبر المصادقة بمفتاح SSH عام مسجّل في https://huggingface.co/settings/keys.
مجموعات الشبكات
مرّر network_group="<name>" إلى run_job() (أو run_uv_job()) للسماح للمهام (Jobs) الموجودة في نفس مساحة الاسم ومجموعة الموارد بالتواصل مع بعضها البعض على جميع المنافذ. داخل كل عضو، يُحلّ HF_NETWORK_GROUP_HOSTNAME إلى كل مهمة في المجموعة، بينما يُحلّ ${HF_NETWORK_GROUP_PREFIX}<alias> إلى الأعضاء الذين ادّعوا مستعاراً (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 عند تشغيل مهمة. يمكن تحديد المهلة بطريقتين:
- كعدد (يُفسَّر على أنه ثوانٍ):
>>> 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
... )- كسلسلة نصية مع وحدات زمنية:
>>> # 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
بالنسبة إلى مهام 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.
تمرير متغيرات البيئة والأسرار
يمكنك تمرير متغيرات البيئة إلى مهمتك باستخدام 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 | عدد أنوية وحدة المعالجة المركزية المتاحة للعمل (مثلًا 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')}")
... """],
... )تُعد هذه المتغيرات مفيدة عندما تحتاج إلى إنشاء معرّفات فريدة للمخرجات، أو تكييف كودك بناءً على العتاد المتاح، أو تسجيل معلومات الموارد.
التسميات
المُعرِّفات هي أزواج من المفتاح والقيمة تُرفق بيانات وصفية بـ Job:
استخدم name لتسهيل العثور على المهام وتحديد هويتها في واجهة المستخدم. الأسماء اختيارية ولا يجب أن تكون فريدة:
>>> from huggingface_hub import run_job
>>> run_job(name="daily-report", image="python:3.12", command=["python", "report.py"])من سطر الأوامر، مرّر --name عند إنشاء مهمة، أو سمِّ مهمة موجودة مسبقًا عبر أمر التسميات:
>>> 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). من سطر الأوامر، تغطي هذه التجزئة الأمر و أيضًا إعدادات وقت التشغيل المُحلّة (النوع، مهلة الانتهاء، قيم البيئة، …)، لذا فإنّ نفس الإعدادات تنتج دائمًا نفس الاسم، وتغيير أيّ إعداد — بما في ذلك إعداد يأتي من ترويسة [tool.hf-jobs] في السكربت — يغيّر الاسم. من واجهة Python البرمجية، تغطي التجزئة الأمر فقط.
تحديث التسميات
استخدم 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"})من سطر الأوامر:
>>> 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> --clearUV السكربتات (تجريبي)
هل تبحث عن سكربتات UV جاهزة للاستخدام؟ اطّلع على منظمة uv-scripts على Hugging Face Hub، التي تقدم مجموعة مجتمعية من سكربتات UV لمهام مثل تدريب النماذج، وتوليد البيانات الاصطناعية، ومعالجة البيانات، وغيرها.
تشغيل سكربتات UV (سكربتات بايثون مع تبعيات مضمّنة) على بنية 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 سكربتات بلغة بايثون تتضمن تبعياتها مباشرةً داخل الملف باستخدام صيغة تعليق خاصة. وهذا يجعلها مثالية للمهام المستقلة التي لا تتطلب إعدادات مشاريع معقدة. لمعرفة المزيد حول سكربتات UV، راجع وثائق 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 ثم يُشغَّل بالصورة والأجهزة والمفسّر المناسبين، ولا يزال --flavor و-e و… تتجاوز ما يصرّح به السكربت. راجع دليل سطر الأوامر للحصول على القائمة الكاملة للمفاتيح وقواعد الدمج.
تُقرأ الجدولة بواسطة واجهة
hfالسطرية فقط: يتجاهل run_uv_job() وcreate_scheduled_uv_job() الجدولة ويستخدمان بالضبط الحُجج المُمرَّرة إليهما. بكلمات أخرى،run_uv_job("ocr.py")وhf jobs uv run ocr.pyلا تنفّذ نفس المهمة — إذ يتطلب واجهة Python البرمجية تمريرimage=وflavor=و… بشكل صريح.
صور Docker لسكربتات UV
على الرغم من أن سكربتات UV يمكنها تحديد تبعياتها بشكل مضمّن، فإن أعباء العمل في مجال التعلم الآلي غالبًا ما تتضمن تبعيات معقدة. يمكن أن يؤدي استخدام صور Docker جاهزة سبق تثبيت هذه المكتبات فيها إلى تسريع بدء تشغيل المهمة بشكل كبير وتجنب مشاكل التبعيات.
بشكل افتراضي، عند تشغيل hf jobs uv run يتم استخدام صورة astral-sh/uv:python3.12-bookworm. هذه الصورة مبنية على توزيع Python 3.12 Bookworm مع تثبيت uv مسبقاً.
يمكنك تحديد صورة مختلفة باستخدام علم --image:
hf jobs uv run \
--flavor a10g-large \
--image vllm/vllm-openai:latest \
...سيتم تنفيذ الأمر أعلاه باستخدام صورة vllm/vllm-openai:latest. قد يكون هذا النهج مفيدًا إذا كنت تستخدم vLLM لتوليد بيانات اصطناعية.
توفر العديد من أطر الاستدلال صور Docker مُحسّنة. ومع تزايد اعتماد uv في منظومة Python، ستصبح المزيد من هذه الصور مزوّدة مسبقًا بـ uv، مما يعني أنها ستعمل عند استخدام hf jobs uv run.
المهام المجدولة
جدولة وإدارة المهام التي ستُنفَّذ على بنية HF التحتية.
استخدم create_scheduled_job() أو create_scheduled_uv_job() مع جدول زمني @annually، @yearly، @monthly، @weekly، @daily، @hourly، أو تعبير جدول CRON (مثل "0 9 * * 1" للساعة 9 صباحاً كل يوم اثنين):
# 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)تشغيل المهام عبر webhooks
تتيح لك Webhooks الاستماع إلى التغييرات الجديدة على مستودعات محددة أو على جميع المستودعات التابعة لمجموعة معينة من المستخدمين/المنظمات (وليس مستودعاتك فقط، بل أي مستودع).
استخدم create_webhook() لإنشاء webhook يُطلق مهمة (Job) عند حدوث تغيير في مستودع 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_PAYLOAD.
يمكنك العثور على مزيد من المعلومات حول الويب هوك في توثيق الويب هوك.