# 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](https://huggingface.co/microsoft/resnet-50) menggunakan [AutoTrain](https://huggingface.co/autotrain).

## Prasyarat: Unggah dataset Anda ke Hub

Kami akan menggunakan [dataset klasifikasi gambar sederhana](https://huggingface.co/datasets/huggingface-projects/auto-retrain-input-dataset) untuk keperluan contoh. Pelajari lebih lanjut tentang mengunggah data Anda ke Hub [di sini](https://huggingface.co/docs/datasets/upload_dataset).

![dataset](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hub/webhooks-guides/002-auto-retrain/dataset.png)

## Buat Webhook untuk bereaksi terhadap perubahan dataset

Pertama, buatlah Webhook dari [pengaturan]( https://huggingface.co/settings/webhooks) Anda.

- Pilih dataset Anda sebagai repositori target. Dalam contoh ini, kami akan menargetkan [huggingface-projects/input-dataset](https://huggingface.co/datasets/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](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hub/webhooks-guides/002-auto-retrain/webhook-creation.png)

## Buat Space untuk merespons Webhook Anda

Sekarang kita membutuhkan cara untuk merespons event Webhook Anda. Cara mudah untuk melakukan ini adalah dengan menggunakan [Space](https://huggingface.co/docs/hub/spaces-overview)!

Anda dapat menemukan contoh Space [di sini](https://huggingface.co/spaces/huggingface-projects/auto-retrain/tree/main).

Space ini menggunakan Docker, Python, [FastAPI](https://fastapi.tiangolo.com/), dan [uvicorn](https://uvicorn.dev) untuk menjalankan server HTTP sederhana. Baca lebih lanjut tentang Docker Spaces [di sini](https://huggingface.co/docs/hub/spaces-sdks-docker).

Titik masuknya adalah [src/main.py](https://huggingface.co/spaces/huggingface-projects/auto-retrain/blob/main/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`:

```python
from fastapi import FastAPI

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

# ...
```

2.  2. 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.

```python
# [...]

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)
	# [...]
```

3. 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

```python
# 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}
	#[...]
```

4. 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!

```python
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](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hub/webhooks-guides/002-auto-retrain/notification.png)

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](https://huggingface.co/settings/tokens).

Anda juga perlu menyesuaikan [file `config.json`](https://huggingface.co/spaces/huggingface-projects/auto-retrain/blob/main/config.json) untuk menggunakan dataset dan model pilihan Anda:

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

## 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](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hub/webhooks-guides/002-auto-retrain/duplicate-space.png)

![direct URL](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hub/webhooks-guides/002-auto-retrain/direct-url.png)

Perbarui Webhook Anda untuk mengirim permintaan ke URL tersebut:

![webhook settings](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/hub/webhooks-guides/002-auto-retrain/update-webhook.png)

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

