Hub 文档
Webhook 指南:设置一个自动化系统,以便在数据集更改时重新训练模型
并获得增强的文档体验
开始使用
Webhook 指南:设置一个自动化系统,以便在数据集更改时重新训练模型
Webhooks 现已公开可用!
本指南将帮助您逐步完成在 Hugging Face 平台上使用 HF Datasets、Webhooks、Spaces 和 AutoTrain 设置自动训练管道的过程。
我们将构建一个 Webhook,用于监听图像分类数据集的更改,并触发使用 AutoTrain 对 microsoft/resnet-50 进行微调。
先决条件:将数据集上传到 Hub
为了便于示例,我们将使用一个简单的图像分类数据集。 了解有关将数据上传到 Hub 的更多信息,请点击此处。
创建一个 Webhook 以响应数据集的更改
首先,让我们从您的设置中创建一个 Webhook。
- 选择您的数据集作为目标仓库。 在此示例中,我们将以 huggingface-projects/input-dataset 为目标。
- 您现在可以放置一个虚拟 Webhook URL。 定义您的 Webhook 将使您可以查看将发送给它的事件。 您还可以重放它们,这将对调试很有用!
- 输入一个密钥以使其更安全。
- 订阅“仓库更新”事件,因为我们希望对数据更改做出反应
您的 Webhook 将如下所示
创建一个 Space 以响应您的 Webhook
我们现在需要一种方法来响应您的 Webhook 事件。 一种简单的方法是使用 Space!
您可以在此处找到示例 Space。
此 Space 使用 Docker、Python、FastAPI 和 uvicorn 来运行一个简单的 HTTP 服务器。 阅读更多关于 Docker Spaces 的信息,请点击此处。
入口点是 src/main.py。 让我们浏览一下此文件,并详细说明它的作用
- 它会生成一个 FastAPI 应用程序,该应用程序将监听
/webhook
上的 HTTPPOST
请求
from fastapi import FastAPI
# [...]
@app.post("/webhook")
async def post_webhook(
# ...
):
# ...
- 此路由检查
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)
# [...]
- 事件的有效负载被编码为 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}
#[...]
- 如果有效负载有效,则下一步是在 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"])
访问注释中的链接以查看训练成本估算,并开始微调模型!
在本示例中,我们使用了 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”。
更新您的 Webhook 以将请求发送到该 URL
就这样! 现在,每次提交到输入数据集都会触发使用 AutoTrain 对 ResNet-50 进行微调 🎉
< > 更新 在 GitHub 上