Hub documentation

Panduan Webhook: Mengatur sistem otomatis untuk melatih ulang model ketika dataset berubah

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Panduan Webhook: Mengatur sistem otomatis untuk melatih ulang model ketika dataset berubah

Panduan ini akan membantu Anda melalui proses pengaturan pipeline pelatihan otomatis di platform Hugging Face menggunakan HF Datasets, Webhooks, Spaces, dan AutoTrain.

Kami akan membangun Webhook yang mendengarkan perubahan pada dataset klasifikasi gambar dan memicu fine-tuning dari microsoft/resnet-50 menggunakan AutoTrain.

Prasyarat: Unggah dataset Anda ke Hub

Kami akan menggunakan dataset klasifikasi gambar sederhana untuk keperluan contoh. Pelajari lebih lanjut tentang mengunggah data Anda ke Hub di sini.

dataset

Buat Webhook untuk bereaksi terhadap perubahan dataset

Pertama, buatlah Webhook dari pengaturan Anda.

  • Pilih dataset Anda sebagai repositori target. Dalam contoh ini, kami akan menargetkan huggingface-projects/input-dataset.
  • Anda dapat memasukkan URL Webhook dummy untuk saat ini. Mendefinisikan Webhook Anda akan memungkinkan Anda melihat peristiwa yang akan dikirim ke sana. Anda juga dapat memutar ulang (replay) peristiwa tersebut, yang akan berguna untuk debugging!
  • Masukkan kata sandi untuk meningkatkan keamanannya.
  • Berlangganan ke event “Repo update” karena kami ingin bereaksi terhadap perubahan data

Webhook Anda akan terlihat seperti ini:

webhook-creation

Buat Space untuk merespons Webhook Anda

Sekarang kita membutuhkan cara untuk merespons event Webhook Anda. Cara mudah untuk melakukan ini adalah dengan menggunakan Space!

Anda dapat menemukan contoh Space di sini.

Space ini menggunakan Docker, Python, FastAPI, dan uvicorn untuk menjalankan server HTTP sederhana. Baca lebih lanjut tentang Docker Spaces di sini.

Titik masuknya adalah src/main.py. Mari kita telusuri file ini dan jelaskan apa yang dilakukan:

  1. Aplikasi FastAPI akan dibuat untuk mendengarkan permintaan HTTP POST pada /webhook:
from fastapi import FastAPI

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

# ...
    1. Rute ini memeriksa bahwa header X-Webhook-Secret ada dan nilainya sama dengan yang Anda atur di pengaturan Webhook Anda. Secret WEBHOOK_SECRET harus diatur di pengaturan Space dan sama dengan secret yang diatur di Webhook Anda.
# [...]

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. Payload dari event dikodekan sebagai JSON. Di sini, kami akan menggunakan model pydantic untuk mem-parsing payload event. Kami juga menentukan bahwa Webhook kami hanya akan dijalankan ketika:
  • peristiwa tersebut berkaitan dengan dataset input
  • event tersebut adalah pembaruan pada konten repo, yaitu ada commit baru
# 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. Jika payload valid, langkah berikutnya adalah membuat proyek di AutoTrain, menjadwalkan fine-tuning model input (microsoft/resnet-50 dalam contoh kami) pada dataset input, dan membuat diskusi pada dataset saat selesai!
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"])

Kunjungi tautan di dalam komentar untuk meninjau estimasi biaya pelatihan, dan mulai fine-tuning model!

community tab notification

Pada contoh ini, kami menggunakan Hugging Face AutoTrain untuk melakukan fine-tuning model dengan cepat, tetapi Anda tentu dapat menggunakan infrastruktur pelatihan Anda sendiri!

Silakan duplikasi Space ke namespace pribadi Anda dan bereksperimenlah. Anda perlu menyediakan dua rahasia:

  • WEBHOOK_SECRET : rahasia dari Webhook Anda.
  • HF_ACCESS_TOKEN : User Access Token dengan hak write. Anda dapat membuatnya dari pengaturan Anda.

Anda juga perlu menyesuaikan file config.json untuk menggunakan dataset dan model pilihan Anda:

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

Konfigurasi Webhook Anda untuk mengirim event ke Space Anda

Terakhir, Anda perlu mengatur webhook Anda untuk mengirim permintaan POST ke Space Anda.

Pertama, mari kita ambil “direct URL” Space kita dari menu kontekstual. Klik “Embed this Space” dan salin “Direct URL”.

embed this Space

direct URL

Perbarui Webhook Anda untuk mengirim permintaan ke URL tersebut:

webhook settings

Dan selesai! Sekarang setiap commit ke dataset input akan memicu fine-tuning ResNet-50 dengan AutoTrain 🎉

Update on GitHub