Hub 文档

Webhook 指南:设置一个自动化系统,以便在数据集更改时重新训练模型

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

Webhook 指南:设置一个自动化系统,以便在数据集更改时重新训练模型

Webhooks 现已公开可用!

本指南将帮助您逐步完成在 Hugging Face 平台上使用 HF Datasets、Webhooks、Spaces 和 AutoTrain 设置自动训练管道的过程。

我们将构建一个 Webhook,用于监听图像分类数据集的更改,并触发使用 AutoTrainmicrosoft/resnet-50 进行微调。

先决条件:将数据集上传到 Hub

为了便于示例,我们将使用一个简单的图像分类数据集。 了解有关将数据上传到 Hub 的更多信息,请点击此处

dataset

创建一个 Webhook 以响应数据集的更改

首先,让我们从您的设置中创建一个 Webhook。

  • 选择您的数据集作为目标仓库。 在此示例中,我们将以 huggingface-projects/input-dataset 为目标。
  • 您现在可以放置一个虚拟 Webhook URL。 定义您的 Webhook 将使您可以查看将发送给它的事件。 您还可以重放它们,这将对调试很有用!
  • 输入一个密钥以使其更安全。
  • 订阅“仓库更新”事件,因为我们希望对数据更改做出反应

您的 Webhook 将如下所示

webhook-creation

创建一个 Space 以响应您的 Webhook

我们现在需要一种方法来响应您的 Webhook 事件。 一种简单的方法是使用 Space

您可以在此处找到示例 Space。

此 Space 使用 Docker、Python、FastAPIuvicorn 来运行一个简单的 HTTP 服务器。 阅读更多关于 Docker Spaces 的信息,请点击此处

入口点是 src/main.py。 让我们浏览一下此文件,并详细说明它的作用

  1. 它会生成一个 FastAPI 应用程序,该应用程序将监听 /webhook 上的 HTTP POST 请求
from fastapi import FastAPI

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

# ...
    1. 此路由检查 X-Webhook-Secret 标头是否存在,以及其值是否与您在 Webhook 的设置中设置的值相同。 WEBHOOK_SECRET 密钥必须在 Space 的设置中设置,并且与您的 Webhook 中设置的密钥相同。
# [...]

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. 事件的有效负载被编码为 JSON。 在这里,我们将使用 pydantic 模型来解析事件有效负载。 我们还指定仅在以下情况下运行 Webhook
  • 事件与输入数据集有关
  • 事件是对仓库内容的更新,即有新的提交
# defined in src/models.py
class WebhookPayloadEvent(BaseModel):
	action: Literal["create", "update", "delete"]
	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. 如果有效负载有效,则下一步是在 AutoTrain 上创建一个项目,安排在输入数据集上微调输入模型(在我们的示例中为 microsoft/resnet-50),并在完成后在数据集上创建一个讨论!
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"])

访问注释中的链接以查看训练成本估算,并开始微调模型!

community tab notification

在本示例中,我们使用了 Hugging Face AutoTrain 来快速微调我们的模型,但您当然可以插入您的训练基础设施!

随意将 Space 复制到您的个人命名空间并进行试用。 您将需要提供两个密钥

  • WEBHOOK_SECRET:来自您的 Webhook 的密钥。
  • HF_ACCESS_TOKEN:具有 write 权限的用户访问令牌。 您可以从您的设置中创建一个。

您还需要调整 config.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"
}

配置您的 Webhook 以将事件发送到您的 Space

最后但并非最不重要的一点是,您需要配置您的 webhook 以将 POST 请求发送到您的 Space。

让我们首先从上下文菜单中获取您的 Space 的“直接 URL”。 单击“嵌入此 Space”并复制“直接 URL”。

embed this Space

direct URL

更新您的 Webhook 以将请求发送到该 URL

webhook settings

就这样! 现在,每次提交到输入数据集都会触发使用 AutoTrain 对 ResNet-50 进行微调 🎉

< > 更新 在 GitHub 上