You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AzureML SDK v1中注册新数据集未触发事件管道的问题咨询

问题根源

你当前创建的调度是基于数据存储文件变化的触发逻辑,而非数据集注册事件。Schedule.create传入datastore参数时,AzureML会轮询指定存储里的文件增删改,但注册数据集本身只是元数据操作,不会直接触发这个监听——除非你注册的数据集对应的存储路径刚好有文件变化,且调度的路径配置正确,但这和你要监听“注册新数据集”事件的需求不匹配。

正确触发机制(监听数据集注册)

要在注册新数据集时触发管道,SDK v1的Schedule类本身不支持直接监听这类事件,需要结合Azure事件网格(Event Grid)和管道REST端点实现,步骤如下:

1. 获取已发布管道的REST端点

先拿到你已发布管道的调用地址和认证所需信息:

from azureml.core import Pipeline

published_pipeline = Pipeline.get(ws, id=pipeline_id)
rest_endpoint = published_pipeline.endpoint

后续调用这个端点需要Azure AD认证令牌,可以用服务主体(SP)或用户令牌获取。

2. 创建Event Grid订阅监听数据集注册事件

在Azure门户操作:

  • 进入你的AzureML工作区,左侧菜单选「事件」
  • 点击「+ 事件订阅」,配置:
    • 事件名称:自定义(比如DatasetRegTrigger)
    • 事件类型:勾选「Microsoft.MachineLearningServices.Workspace/DatasetCreated」(对应新数据集注册事件)
    • 终结点类型:选「Web Hook」
    • 终结点URL:建议用Azure函数作为中间层(直接填管道端点会有认证问题),填入函数的触发URL

3. 用Azure函数处理认证并触发管道

因为管道REST端点需要认证,直接用Event Grid触发会失败,写个简单的Azure函数做中转:

  • 函数接收Event Grid的数据集注册事件
  • 验证事件签名(确保是合法的AzureML事件)
  • 用服务主体获取AzureML的访问令牌
  • 调用管道REST端点启动运行

核心代码示例:

import os
import requests
from azure.identity import ClientSecretCredential

def main(event):
    # 提取事件数据(省略Event Grid签名验证步骤)
    event_data = event.get('data')
    if event_data.get('eventType') == 'Microsoft.MachineLearningServices.Workspace/DatasetCreated':
        # 用服务主体获取认证令牌
        credential = ClientSecretCredential(
            tenant_id=os.environ['TENANT_ID'],
            client_id=os.environ['CLIENT_ID'],
            client_secret=os.environ['CLIENT_SECRET']
        )
        token = credential.get_token("https://ml.azure.com/.default").token
        
        # 触发管道
        pipeline_endpoint = os.environ['PIPELINE_ENDPOINT']
        headers = {
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json"
        }
        resp = requests.post(pipeline_endpoint, headers=headers, json={})
        resp.raise_for_status()
        return f"Pipeline triggered: {resp.status_code}"

把服务主体信息和管道端点配置成函数的环境变量即可。

4. 替代方案:监听数据集文件变化(而非注册事件)

如果你的实际需求是数据集对应的存储文件更新时触发管道,而非注册新数据集,修正原调度代码,指定数据集对应的存储路径:

reactive_schedule = Schedule.create(
    ws,
    name="MyReactiveSchedule",
    description="Trigger on dataset file changes.",
    pipeline_id=pipeline_id,
    experiment_name=experiment_name,
    datastore=datastore,
    path_on_datastore="your/dataset/storage/path",  # 数据集对应的存储路径
    polling_interval=2
)

这样当该路径下的文件有增删改时,调度会触发管道。

原调度未触发的排查点(如果继续用原逻辑)

如果要排查当前调度没触发的问题,检查这些点:

  • 是否指定了path_on_datastore:没指定的话会监听整个数据存储,轮询延迟可能很高
  • 数据存储权限:AzureML服务主体是否有该存储的读取权限
  • 调度日志:在AzureML工作区「调度」页面,点击对应调度的「运行历史」查看错误日志
  • 存储文件是否变化:注册数据集只是元数据操作,若存储文件没改动,调度不会触发

内容的提问来源于stack exchange,提问作者ammar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 18:52:38