Hub documentation

Webhook kılavuzu: Bir veri seti değiştiğinde modeli yeniden eğitmek için otomatik bir sistem kurma

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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.

dataset

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-creation

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:

  1. POST HTTP isteklerini /webhook üzerinde dinleyecek bir FastAPI uygulaması başlatır:
from fastapi import FastAPI

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

# ...
    1. Bu rota, X-Webhook-Secret baş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_SECRET gizli değeri, Space ayarlarında tanımlanmış olmalı ve Webhook’ta ayarlanan gizli değerle aynı olmalıdır.
# [...]

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. 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}
	#[...]
  1. 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!

community tab notification

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 : write yetkisine 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.

embed this Space

direct URL

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

webhook settings

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

Update on GitHub