Webhook 指南:当数据集更改时设置自动重新训练模型的系统
Webhooks 现已公开可用!
本指南将帮助您逐步了解如何在 Hugging Face 平台上使用 HF 数据集、Webhooks、Spaces 和 AutoTrain 设置自动训练管道。
我们将构建一个 Webhook,它监听图像分类数据集的更改并触发 microsoft/resnet-50 使用 AutoTrain 的微调。
先决条件:将您的数据集上传到 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 上