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

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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.

dataset

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:

webhook-creation

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:

  1. Nó khởi tạo một ứng dụng FastAPI sẽ lắng nghe các yêu cầu HTTP POST tại /webhook:
from fastapi import FastAPI

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

# ...
    1. Tuyến đường này kiểm tra xem tiêu đề X-Webhook-Secret có 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ật WEBHOOK_SECRET phả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.
# [...]

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

community tab notification

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ền write. 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”.

embed this Space

direct URL

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

webhook settings

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