Hub documentation
Hướng dẫn Webhook: Thiết lập hệ thống tự động huấn luyện lại mô hình khi bộ dữ liệu thay đổi
Hướng dẫn Webhook: Thiết lập hệ thống tự động huấn luyện lại mô hình khi bộ dữ liệu thay đổi
Hướng dẫn này sẽ giúp bạn thực hiện việc thiết lập một quy trình huấn luyện tự động trên nền tảng Hugging Face sử dụng HF Datasets, Webhooks, Spaces và AutoTrain.
Chúng ta sẽ xây dựng một Webhook để theo dõi các thay đổi trên bộ dữ liệu phân loại ảnh và kích hoạt quá trình tinh chỉnh microsoft/resnet-50 bằng AutoTrain.
Điều kiện tiên quyết: Tải bộ dữ liệu của bạn lên Hub
Chúng ta sẽ sử dụng một dataset phân loại ảnh đơn giản cho mục đích minh họa. Tìm hiểu thêm về việc tải dữ liệu của bạn lên Hub tại đây.

Tạo một Webhook để phản hồi với các thay đổi của bộ dữ liệu
Đầu tiên, hãy tạo một Webhook từ cài đặt của bạn.
- Chọn bộ dữ liệu của bạn làm kho lưu trữ đích. Trong ví dụ này, chúng ta sẽ nhắm đến huggingface-projects/input-dataset.
- Bạn có thể đặt một URL Webhook giả cho trước. Việc định nghĩa Webhook của bạn sẽ cho phép bạn xem các sự kiện sẽ được gửi đến nó. Bạn cũng có thể phát lại chúng, điều này sẽ hữu ích cho việc gỡ lỗi!
- Nhập một mật khẩu bí mật để tăng cường bảo mật.
- Đăng ký các sự kiện “Repo update” vì chúng ta muốn phản hồi với các thay đổi dữ liệu
Webhook của bạn sẽ có dạng như sau:

Tạo một Space để phản hồi với Webhook của bạn
Bây giờ chúng ta cần một cách để phản hồi với các sự kiện Webhook của bạn. Một cách đơn giản để làm điều này là sử dụng một Space!
Bạn có thể tìm thấy một ví dụ Space tại đây.
Space này sử dụng Docker, Python, FastAPI và uvicorn để chạy một máy chủ HTTP đơn giản. Đọc thêm về Docker Spaces tại đây.
Điểm vào là src/main.py. Hãy cùng xem qua tệp này và chi tiết những gì nó thực hiện:
- Nó khởi tạo một ứng dụng FastAPI sẽ lắng nghe các yêu cầu HTTP
POSTtại/webhook:
from fastapi import FastAPI
# [...]
@app.post("/webhook")
async def post_webhook(
# ...
):
# ...- Tuyến đường này kiểm tra xem tiêu đề
X-Webhook-Secretcó tồn tại và giá trị của nó có giống với giá trị bạn đã đặt trong cài đặt Webhook hay không. Bí mậtWEBHOOK_SECRETphải được đặt trong cài đặt của Space và phải giống với bí mật đã đặt trong Webhook của bạn.
- Tuyến đường này kiểm tra xem tiêu đề
# [...]
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)
# [...]- Payload của sự kiện được mã hóa dưới dạng JSON. Ở đây, chúng ta sẽ sử dụng các mô hình pydantic để phân tích payload của sự kiện. Chúng ta cũng chỉ định rằng Webhook của chúng ta chỉ được chạy khi:
- sự kiện liên quan đến bộ dữ liệu đầu vào
- sự kiện là một bản cập nhật về nội dung của kho, tức là đã có một commit mới
# 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}
#[...]- Nếu payload hợp lệ, bước tiếp theo là tạo một dự án trên AutoTrain, lên lịch fine-tuning mô hình đầu vào (
microsoft/resnet-50trong ví dụ của chúng ta) trên bộ dữ liệu đầu vào, và tạo một cuộc thảo luận trên bộ dữ liệu khi hoàn tất!
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"])Truy cập liên kết trong phần bình luận để xem ước tính chi phí huấn luyện và bắt đầu tinh chỉnh mô hình!

Trong ví dụ này, chúng ta đã sử dụng Hugging Face AutoTrain để tinh chỉnh mô hình một cách nhanh chóng, nhưng bạn当然 có thể tích hợp hạ tầng huấn luyện của riêng mình!
Hãy tự do sao chép Space này vào không gian tên cá nhân của bạn và thử nghiệm. Bạn sẽ cần cung cấp hai bí mật:
WEBHOOK_SECRET: bí mật từ Webhook của bạn.HF_ACCESS_TOKEN: một User Access Token có quyềnwrite. Bạn có thể tạo một token từ cài đặt của bạn.
Bạn cũng sẽ cần chỉnh sửa tệp config.json để sử dụng bộ dữ liệu và mô hình theo lựa chọn của bạn:
{
"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"
}Cấu hình Webhook của bạn để gửi các sự kiện đến Space của bạn
Cuối cùng nhưng không kém phần quan trọng, bạn cần cấu hình webhook của mình để gửi các yêu cầu POST đến Space của bạn.
Trước tiên, hãy lấy “direct URL” của Space từ menu ngữ cảnh. Nhấp vào “Embed this Space” và sao chép “Direct URL”.


Cập nhật Webhook của bạn để gửi yêu cầu đến URL đó:

Và như vậy là xong! Giờ đây, mọi commit vào tập dữ liệu đầu vào sẽ kích hoạt quá trình fine-tuning ResNet-50 với AutoTrain 🎉
Update on GitHub