Hugging Face's logo
加入 Hugging Face 社区

并获取增强文档体验

开始使用

Webhook 指南:当数据集更改时设置自动重新训练模型的系统

Webhooks 现已公开可用!

本指南将帮助您逐步了解如何在 Hugging Face 平台上使用 HF 数据集、Webhooks、Spaces 和 AutoTrain 设置自动训练管道。

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

先决条件:将您的数据集上传到 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 上