Hub documentation
Webhook kılavuzu: Bir veri seti değiştiğinde modeli yeniden eğitmek için otomatik bir sistem kurma
Webhook kılavuzu: Bir veri seti değiştiğinde modeli yeniden eğitmek için otomatik bir sistem kurma
Bu kılavuz, Hugging Face platformunda HF Datasets, Webhooks, Spaces ve AutoTrain kullanarak otomatik bir eğitim hattı kurulumu konusunda size adım adım rehberlik edecektir.
Bir görüntü sınıflandırma veri setindeki değişiklikleri dinleyen ve AutoTrain kullanarak microsoft/resnet-50 modelinin ince ayarını tetikleyen bir Webhook oluşturacağız.
Ön koşul: Veri setinizi Hub'a yükleyin
Örnek olması açısından basit bir görüntü sınıflandırma veri seti kullanacağız. Verilerinizi Hub'a yükleme hakkında daha fazla bilgi için buraya göz atın.

Veri setindeki değişikliklere tepki vermek için bir Webhook oluşturun
Öncelikle ayarlarınızdan bir Webhook oluşturalım.
- Hedef depo olarak veri setinizi seçin. Bu örnekte hedefimiz huggingface-projects/input-dataset olacak.
- Şimdilik sahte bir Webhook URL'si girebilirsiniz. Webhook'unuzu tanımladığınızda, ona gönderilecek olayları görüntüleyebilirsiniz. Ayrıca bunları yeniden oynatabilirsiniz; bu, hata ayıklama için faydalı olacaktır!
- Daha güvenli hale getirmek için bir gizli anahtar girin.
- Veri değişikliklerine tepki vermek istediğimiz için “Repo update” olaylarına abone olun
Webhook'ünüz şu şekilde görünecektir:

Webhook'unuza yanıt vermek için bir Space oluşturun
Artık Webhook olaylarınıza tepki verecek bir yola ihtiyacımız var. Bunu yapmanın kolay bir yolu bir Space kullanmaktır!
Örnek bir Space'i burada bulabilirsiniz.
Bu Space, basit bir HTTP sunucusu çalıştırmak için Docker, Python, FastAPI ve uvicorn kullanır. Docker Spaces hakkında daha fazla bilgi için buraya bakın.
Giriş noktası src/main.py'dir. Bu dosyayı inceleyelim ve ne yaptığını ayrıntılı olarak açıklayalım:
POSTHTTP isteklerini/webhooküzerinde dinleyecek bir FastAPI uygulaması başlatır:
from fastapi import FastAPI
# [...]
@app.post("/webhook")
async def post_webhook(
# ...
):
# ...- Bu rota,
X-Webhook-Secretbaşlığının mevcut olup olmadığını ve değerinin Webhook ayarlarınızda belirlediğiniz değerle aynı olup olmadığını kontrol eder.WEBHOOK_SECRETgizli değeri, Space ayarlarında tanımlanmış olmalı ve Webhook’ta ayarlanan gizli değerle aynı olmalıdır.
- Bu rota,
# [...]
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)
# [...]- Etkinliğin yükü (payload) JSON olarak kodlanır. Burada, etkinlik yükünü ayrıştırmak için pydantic modellerini kullanacağız. Ayrıca Webhook'umuzun yalnızca şu durumlarda çalışacağını belirtiriz:
- olay, girdi veri setiyle ilgilidir
- olay, repodaki içeriğin güncellenmesidir, yani yeni bir commit yapılmıştır
# 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}
#[...]- Yük geçerliyse, sonraki adım AutoTrain üzerinde bir proje oluşturmak, girdi modelinin (
microsoft/resnet-50örneğimizde) girdi veri seti üzerinde ince ayarını zamanlamak ve tamamlandığında veri setinde bir tartışma oluşturmaktır!
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"])Yorum içindeki bağlantıya giderek eğitim maliyet tahminini inceleyin ve modelin ince ayarını başlatın!

Bu örnekte, modelimizi hızlı bir şekilde ince ayar yapmak için Hugging Face AutoTrain'i kullandık, ancak elbette kendi eğitim altyapınızı da entegre edebilirsiniz!
Space'i kişisel ad alanınıza kopyalayıp üzerinde oynayabilirsiniz. İki gizli değer (secret) sağlamanız gerekecektir:
WEBHOOK_SECRET: Webhook'unuzdaki gizli anahtar.HF_ACCESS_TOKEN:writeyetkisine sahip bir Kullanıcı Erişim Belirteci. Bunu ayarlarınızdan oluşturabilirsiniz.
Ayrıca, seçtiğiniz veri setini ve modeli kullanmak için config.json dosyasını da düzenlemeniz gerekecektir:
{
"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'ünüzü, olayları Space'inize göndermesi için yapılandırın
Son olarak, webhook'ünüzü Space'inize POST istekleri göndermesi için yapılandırmanız gerekecektir.
Önce bağlamsal menüden Space’imizin “direct URL”ini alalım. “Embed this Space” seçeneğine tıklayın ve “Direct URL”i kopyalayın.


Webhook'unuzu o URL'ye istek göndermek üzere güncelleyin:

Ve tamam! Artık girdi veri setine yapılan her commit, ResNet-50'ün AutoTrain ile ince ayarını tetikleyecek 🎉
Update on GitHub