Hub documentation
دليل Webhook: إعداد نظام تلقائي لإعادة تدريب النموذج عند تغيّر مجموعة البيانات
دليل Webhook: إعداد نظام تلقائي لإعادة تدريب النموذج عند تغيّر مجموعة البيانات
يساعدك هذا الدليل في إعداد خط أنابيب تدريب تلقائي على منصة Hugging Face باستخدام HF Datasets وWebhooks وSpaces وAutoTrain.
سنقوم ببناء Webhook يستمع إلى التغييرات في مجموعة بيانات تصنيف الصور ويطلق عملية ضبط دقيق لنموذج microsoft/resnet-50 باستخدام AutoTrain.
الشرط المسبق: ارفع مجموعة بياناتك إلى Hub
سنستخدم مجموعة بيانات بسيطة لتصنيف الصور لأغراض المثال. لمعرفة المزيد حول رفع بياناتك إلى Hub، راجع هنا.

إنشاء Webhook للاستجابة إلى تغييرات مجموعة البيانات
أولاً، لننشئ Webhook من الإعدادات.
- اختر مجموعة البيانات الخاصة بك كمستودع مستهدف. سنستهدف huggingface-projects/input-dataset في هذا المثال.
- يمكنك إدخال رابط Webhook وهمي مؤقتًا. عند تعريف Webhook الخاص بك، ستتمكن من الاطلاع على الأحداث التي سيتم إرسالها إليه. كما يمكنك إعادة تشغيلها، وهو ما سيكون مفيدًا لاستكشاف الأخطاء وإصلاحها!
- أدخل كلمة مرور لجعلها أكثر أمانًا.
- اشترك في أحداث “Repo update” حيث نريد الاستجابة لتغييرات البيانات
سيبدو Webhook الخاص بك على النحو التالي:

أنشئ مساحة للرد على Webhook الخاص بك
نحتاج الآن إلى طريقة للرد على أحداث Webhook الخاصة بك. طريقة سهلة للقيام بذلك هي استخدام Space!
يمكنك العثور على مثال لمساحة هنا.
تستخدم هذه المساحة Docker وPython وFastAPI وuvicorn لتشغيل خادم HTTP بسيط. اقرأ المزيد حول مساحات Docker هنا.
نقطة الدخول هي src/main.py. دعونا نمرّ على هذا الملف ونفصّل ما يقوم به:
- ينشئ تطبيق FastAPI يستمع إلى طلبات
POSTعبر HTTP على/webhook:
from fastapi import FastAPI
# [...]
@app.post("/webhook")
async def post_webhook(
# ...
):
# ...- يتحقق هذا المسار من وجود الترويسة
X-Webhook-Secretوأن قيمتها مطابقة للقيمة التي قمت بإعدادها في إعدادات Webhook الخاص بك. يجب أن يكون السرWEBHOOK_SECRETمُعدًا في إعدادات Space وأن يكون مطابقًا للسر المُعد في Webhook الخاص بك.
- يتحقق هذا المسار من وجود الترويسة
# [...]
WEBHOOK_SECRET = os.getenv("WEBHOOK_SECRET")
# [...]
@app.post("/webhook")
async def post_webhook(
# [...]
x_webhook_secret: Optional[str] = Header(default=None),
# ^ checks for the X-Webhook-Secret HTTP header
):
if x_webhook_secret is None:
raise HTTPException(401)
if x_webhook_secret != WEBHOOK_SECRET:
raise HTTPException(403)
# [...]- يتم ترميز حمولة الحدث بصيغة JSON. هنا، سنستخدم نماذج pydantic لتحليل حمولة الحدث. كما نحدد أننا سنشّغل Webhook الخاص بنا فقط عندما:
- يتعلق الحدث بمجموعة البيانات المدخلة
- الحدث هو تحديث على محتوى المستودع، أي أنه تم إنشاء التزام الجديد
# defined in src/models.py
class WebhookPayloadEvent(BaseModel):
action: Literal["create", "update", "delete", "move"]
scope: str
class WebhookPayloadRepo(BaseModel):
type: Literal["dataset", "model", "space"]
name: str
id: str
private: bool
headSha: str
class WebhookPayload(BaseModel):
event: WebhookPayloadEvent
repo: WebhookPayloadRepo
# [...]
@app.post("/webhook")
async def post_webhook(
# [...]
payload: WebhookPayload,
# ^ Pydantic model defining the payload format
):
# [...]
if not (
payload.event.action == "update"
and payload.event.scope.startswith("repo.content")
and payload.repo.name == config.input_dataset
and payload.repo.type == "dataset"
):
# no-op if the payload does not match our expectations
return {"processed": False}
#[...]- إذا كانت الحمولة صالحة، فإن الخطوة التالية هي إنشاء مشروع على AutoTrain، وجدولة ضبط دقيق للنموذج المُدخل (
microsoft/resnet-50في مثالنا) على مجموعة البيانات المُدخلة، وإنشاء نقاش على مجموعة البيانات عند الانتهاء!
def schedule_retrain(payload: WebhookPayload):
# Create the autotrain project
try:
project = AutoTrain.create_project(payload)
AutoTrain.add_data(project_id=project["id"])
AutoTrain.start_processing(project_id=project["id"])
except requests.HTTPError as err:
print("ERROR while requesting AutoTrain API:")
print(f" code: {err.response.status_code}")
print(f" {err.response.json()}")
raise
# Notify in the community tab
notify_success(project["id"])قم بزيارة الرابط الموجود داخل التعليق لمراجعة تقدير تكلفة التدريب، وابدأ في ضبط النموذج!

في هذا المثال، استخدمنا Hugging Face AutoTrain لضبط نموذجنا بدقة وسرعة، لكن يمكنك بالطبع استخدام بنية التدريب الخاصة بك!
لا تتردد في نسخ المساحة إلى مساحة عملك الشخصية والتجربة فيها. ستحتاج إلى توفير سريّين:
WEBHOOK_SECRET: السرية الخاصة بـ Webhook الخاص بك.HF_ACCESS_TOKEN: رمز وصول للمستخدم (User Access Token) يتمتع بصلاحياتwrite. يمكنك إنشاء رمز من إعداداتك.
ستحتاج أيضًا إلى تعديل ملف config.json لاستخدام مجموعة البيانات والنموذج اللذين تختارهما:
{
"target_namespace": "the namespace where the trained model should end up",
"input_dataset": "the dataset on which the model will be trained",
"input_model": "the base model to re-train",
"autotrain_project_prefix": "A prefix for the AutoTrain project"
}قم بإعداد Webhook الخاص بك لإرسال الأحداث إلى Space الخاص بك
وأخيراً وليس آخراً، ستحتاج إلى تكوين خطافك (webhook) لإرسال طلبات POST إلى مساحتك (Space).
لنبدأ أولاً بالحصول على «الرابط المباشر» الخاص بمساحتنا من القائمة السياقية. انقر على «تضمين هذه المساحة» وانسخ «الرابط المباشر».


قم بتحديث Webhook الخاص بك لإرسال الطلبات إلى ذلك العنوان:

وهذا كل شيء! الآن كل التزام (commit) في مجموعة البيانات المدخلة سيُطلق عملية الضبط الدقيق (fine-tuning) لنموذج ResNet-50 باستخدام AutoTrain 🎉
Update on GitHub