3. Azure机器学习数据资产与数据工程

在Azure机器学习中,数据工程的核心不是“把文件传上去”,而是把散落在不同存储系统中的原始数据,转化为可被训练作业稳定引用、可追溯、可版本化、可监控的数据资产。理解这一层抽象,是后续所有训练、部署与监控工作的基础。

数据存储、数据资产与URI的关系

Azure机器学习把“数据在哪里”和“数据是什么”拆成两个概念。数据存储(Datastore)是对底层存储服务的引用与凭据封装,例如Azure Blob Storage、Azure Data Lake Storage Gen2、Azure SQL Database、Azure Files,甚至Git仓库。它保存的是连接信息,而不是数据本身。创建数据存储时,你提供存储账户名、容器名、凭据方式(账户密钥、SAS令牌或工作区托管标识),之后工作区内的作业就可以通过数据存储名称访问数据,而不必在每份代码里硬编码密钥。

数据资产(Data Asset)则是在数据存储之上建立的一层“可命名、可版本化、可被引用”的抽象。它指向具体的数据路径或查询,并带有类型、版本和元数据。训练脚本引用的是数据资产,而不是某个易变的物理路径。这样当底层文件被替换或迁移时,只要资产定义更新,引用它的作业无需改动。

两者通过URI连接。Azure机器学习支持多种URI方案,常见的有:

  • azureml://datastores/<datastore_name>/paths/<relative_path>:引用数据存储中的路径,凭据由工作区自动解析,最推荐在作业中使用。
  • wasbs://、abfss://:直接指向Blob或ADLS Gen2,需要额外凭据配置。
  • https://:公开可访问的HTTP资源。
  • sql://或通过数据存储封装的数据库连接。

使用azureml://方案的最大好处是凭据与路径解耦:作业运行时由工作区注入身份,代码里不出现密钥,也便于审计。

数据资产的类型:File、Folder与MLTable

创建数据资产时需要选择类型。File指向单个文件,Folder指向一个目录,二者适合结构简单、读取逻辑由脚本自行处理的场景。而MLTable是Azure机器学习为表格型训练数据提供的声明式格式,它用一个MLTable文件描述数据的读取方式、schema和转换步骤,支持从多个路径合并、指定列类型、做轻量转换。

一个典型的MLTable定义如下:

# MLTable 文件示例
paths:
  - file: ./data/2024-01/*.parquet
transformations:
  - read_parquet:
      include_path_column: false
  - convert_column_types:
      - column: label
        to: int64
      - column: timestamp
        to: datetime

MLTable的价值在于:数据读取逻辑随资产一起版本化,训练脚本只需mltable加载即可获得确定性的DataFrame,避免每个脚本重复写解析代码,也减少“同一份数据不同人读出不同结果”的问题。

数据版本控制

数据资产支持版本。每次创建或更新资产时,可以指定版本号(如1、2)或让系统自动递增。版本化的意义在于:训练作业可以固定引用version=3的数据,即使后续数据被更新,复现实验时仍能拿到当时的那份数据。这与代码的Git版本控制形成互补——代码版本加数据版本,才构成完整的实验可复现性。

实践中建议:原始数据保持只读并按日期分区;派生特征数据每次生成新版本;训练配置中显式写死数据版本,而不是用latest,除非是在探索阶段。

从Blob、Data Lake、SQL、Git接入训练数据

不同来源的接入方式略有差异:

  • Blob Storage:注册为AzureBlobDatastore,适合存放图片、文本、通用文件。URI形如azureml://datastores/blob_ds/paths/images/train/。
  • ADLS Gen2:注册为AzureDataLakeGen2Datastore,支持层级命名空间,适合大规模分区表数据,配合MLTable读取Parquet效率较高。
  • Azure SQL Database:注册为AzureSqlDatabaseDatastore,资产类型通常为MLTable,通过SQL查询或表名读取,适合结构化业务数据。
  • Git仓库:注册为GitDatastore,适合版本化的小型配置、词典或代码化数据集,引用时需指定分支或提交。

接入后,统一通过数据资产引用,训练脚本无需关心底层是哪种存储。

数据漂移监控基础

数据漂移指生产环境输入数据的统计分布偏离训练数据。Azure机器学习的数据漂移监控基于数据集监控器(Dataset Monitor):你指定基线数据集(通常是训练数据资产)和目标数据集(近期生产数据),选择监控指标,系统按计划计算并告警。

常用指标包括:数值特征的均值、标准差、最小值、最大值;分类特征的出现频率;以及分布距离度量,如Population Stability Index(PSI)和Jensen-Shannon距离。以PSI为例,经验判断阈值常取:PSI < 0.1 表示分布稳定,0.1~0.25 表示有中等偏移需关注,> 0.25 表示显著漂移应触发告警。这些阈值是行业常用参考,具体项目应结合业务容忍度调整。

监控器可以设置时间窗口(如过去7天)、频率(每天)和告警邮箱。当指标超阈值时,你会收到通知,并可回溯到具体特征,判断是数据采集问题还是真实分布变化。

Azure ML 数据资产与数据工程关系图 数据来源层 Blob Storage ADLS Gen2 Azure SQL Git 仓库 数据存储层(Datastore) 封装连接信息与凭据 · 统一通过 azureml:// 引用 · 作业运行时由工作区注入身份 数据资产层(Data Asset) File / Folder MLTable 版本 v1 / v2 / v3 URI 引用与元数据 训练作业消费 固定引用数据版本 · 保证实验可复现 数据漂移监控 基线 vs 目标 · PSI / JS 距离 · 阈值告警

实践建议与常见判断

在真实项目中,建议按以下顺序推进:先把所有数据源注册为数据存储并验证凭据可用;再为训练数据创建带版本的资产,表格数据优先用MLTable;训练配置中显式引用版本号;最后为关键特征建立漂移监控器,设置合理的基线与阈值。

判断数据接入是否成功,可以观察三点:作业日志中能否通过azureml://路径正常读取;MLTable加载后的行数与schema是否符合预期;监控器首次运行后指标是否在合理范围内。若PSI突然升高,先检查上游数据采集是否中断或字段格式变化,再判断是否为真实业务分布变化。

数据资产版本与代码版本应成对记录。推荐在训练配置或实验记录中同时保存数据资产名称、版本号和代码提交哈希,这样任何一次实验都能被完整复现。