Hub documentation

دليل Webhook: إعداد نظام تلقائي لإعادة تدريب النموذج عند تغيّر مجموعة البيانات

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

دليل Webhook: إعداد نظام تلقائي لإعادة تدريب النموذج عند تغيّر مجموعة البيانات

يساعدك هذا الدليل في إعداد خط أنابيب تدريب تلقائي على منصة Hugging Face باستخدام HF Datasets وWebhooks وSpaces وAutoTrain.

سنقوم ببناء Webhook يستمع إلى التغييرات في مجموعة بيانات تصنيف الصور ويطلق عملية ضبط دقيق لنموذج microsoft/resnet-50 باستخدام AutoTrain.

الشرط المسبق: ارفع مجموعة بياناتك إلى Hub

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

dataset

إنشاء Webhook للاستجابة إلى تغييرات مجموعة البيانات

أولاً، لننشئ Webhook من الإعدادات.

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

سيبدو Webhook الخاص بك على النحو التالي:

webhook-creation

أنشئ مساحة للرد على Webhook الخاص بك

نحتاج الآن إلى طريقة للرد على أحداث Webhook الخاصة بك. طريقة سهلة للقيام بذلك هي استخدام Space!

يمكنك العثور على مثال لمساحة هنا.

تستخدم هذه المساحة Docker وPython وFastAPI وuvicorn لتشغيل خادم HTTP بسيط. اقرأ المزيد حول مساحات Docker هنا.

نقطة الدخول هي src/main.py. دعونا نمرّ على هذا الملف ونفصّل ما يقوم به:

  1. ينشئ تطبيق FastAPI يستمع إلى طلبات POST عبر HTTP على /webhook:
from fastapi import FastAPI

# [...]
@app.post("/webhook")
async def post_webhook(
	# ...
):

# ...
    1. يتحقق هذا المسار من وجود الترويسة 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)
	# [...]
  1. يتم ترميز حمولة الحدث بصيغة 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}
	#[...]
  1. إذا كانت الحمولة صالحة، فإن الخطوة التالية هي إنشاء مشروع على 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"])

قم بزيارة الرابط الموجود داخل التعليق لمراجعة تقدير تكلفة التدريب، وابدأ في ضبط النموذج!

community tab notification

في هذا المثال، استخدمنا 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).

لنبدأ أولاً بالحصول على «الرابط المباشر» الخاص بمساحتنا من القائمة السياقية. انقر على «تضمين هذه المساحة» وانسخ «الرابط المباشر».

embed this Space

direct URL

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

webhook settings

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

Update on GitHub