3. 工作区与数据资产配置

在 Azure 机器学习中,工作区(Workspace)是贯穿整个项目生命周期的顶层资源容器。它本身不存储训练数据,也不直接运行训练代码,而是把计算、数据、模型、环境、实验记录和终结点等资源组织在同一个命名空间下,并通过托管标识与 Azure 存储、密钥保管库、容器注册表等后端服务建立受控连接。理解这一点很关键:配置工作区的过程,本质上是在搭建一条“控制面 + 数据面”的通道,让后续的作业、管道和终结点能够安全地读写数据。

工作区的组成与依赖关系

创建一个工作区时,Azure 会同时创建或关联若干后端资源。默认情况下,工作区自带一个关联的 Azure 存储账户(作为默认数据存储)、一个 Azure Key Vault(保存连接字符串、密钥等机密)、一个 Application Insights(记录指标与日志)以及一个 Azure Container Registry(存放训练环境镜像)。这些资源通过工作区的托管标识互相访问,因此权限配置是否正确,直接决定后续数据资产能否被正常读取。

Azure ML 工作区与数据平台连接关系 Azure Machine Learning 工作区(控制面) 计算资源 Compute / Cluster 数据存储 Datastore 数据资产 Data Asset 环境 Environment 工作区托管标识(Managed Identity) 统一身份 → 访问后端存储与机密 Azure Blob 存储 默认数据存储 Azure Data Lake Gen2 数据源 Azure SQL / 其他 外部数据源 Key Vault 机密与凭据 数据面读写路径(受 RBAC 控制)

创建工作的关键参数与操作

创建工作区可以通过 Azure 门户、Azure CLI 或 Python SDK 完成。无论哪种方式,都需要指定几个核心参数:订阅 ID、资源组、工作区名称、区域,以及是否使用现有存储账户或新建。区域选择需要与数据所在位置尽量一致,以减少跨区域读取延迟和出口流量费用。

使用 Azure CLI 创建时,典型命令如下:

az ml workspace create \
  --name ml-workspace-demo \
  --resource-group rg-ml-demo \
  --location eastasia \
  --storage-account stmldemoeasia \
  --key-vault kv-ml-demo \
  --application-insights ai-ml-demo \
  --container-registry crmldemo

执行成功后,可以用 az ml workspace show 查看工作区详情,确认 storage_account、key_vault 等字段已正确关联。如果使用 Python SDK,则通过 MLClient 的 workspaces.begin_create_or_update() 方法提交一个 Workspace 对象,效果等价。

注册数据存储(Datastore)

数据存储是工作区与底层存储服务之间的“连接别名”。它保存的是连接信息(如账户名、容器名、认证方式),而不是数据本身。工作区创建后会自动生成一个名为 workspaceblobstore 的默认数据存储,指向关联的 Blob 容器。当需要接入外部数据源时,再手动注册新的数据存储。

注册 Azure Data Lake Gen2 数据存储的示例:

from azure.ai.ml import MLClient
from azure.ai.ml.entities import AzureDataLakeGen2Datastore
from azure.identity import DefaultAzureCredential

ml_client = MLClient(
    DefaultAzureCredential(),
    subscription_id="<sub-id>",
    resource_group_name="rg-ml-demo",
    workspace_name="ml-workspace-demo"
)

datastore = AzureDataLakeGen2Datastore(
    name="adls_gen2_raw",
    description="原始数据湖存储",
    account_name="stmldemoeasia",
    filesystem="raw-data",
    credentials={"account_key": "<key>"}
)
ml_client.datastores.create_or_update(datastore)

注册完成后,数据存储会出现在工作区的“数据”页面中。此时它只是一个连接入口,还没有指向具体的数据文件。认证方式建议优先使用基于身份的访问(工作区托管标识 + RBAC 角色),而不是把账户密钥硬编码在代码里。如果必须使用密钥,应将其存放在 Key Vault 中,再通过工作区引用。

注册数据资产(Data Asset)

数据资产是对具体数据集的版本化引用,它指向数据存储中的某个路径、某个文件或某张表。与数据存储不同,数据资产有明确的版本号,可以被实验、管道和作业直接引用,从而实现数据血缘追踪和可复现性。

数据资产分为三种类型:URI 文件(指向单个文件或文件夹)、URI 文件夹(指向目录)和 MLTable(带 schema 和转换定义的表格式数据)。对于结构化训练数据,推荐使用 MLTable,因为它可以声明列类型、分隔符和采样方式。

from azure.ai.ml.entities import Data
from azure.ai.ml.constants import AssetTypes

data_asset = Data(
    path="azureml://datastores/adls_gen2_raw/paths/raw-data/2024/train.csv",
    type=AssetTypes.URI_FILE,
    name="train-data",
    version="1",
    description="2024 年训练集"
)
ml_client.data.create_or_update(data_asset)

注册后,可以在作业中通过 azureml:train-data:1 这样的短路径引用该资产。每次数据更新时递增版本号,旧版本仍然保留,便于回溯和对比。

打通数据平台连接的验证方法

配置完成后,需要验证工作区是否真的能读到数据。最直接的方式是提交一个轻量作业,在计算节点上列出数据资产的内容。例如使用 az ml job create 提交一个只执行 ls 或 pandas.read_csv 的命令作业,观察日志中是否成功输出文件列表或数据行数。如果出现 PermissionDenied 或 AuthenticationFailed,通常说明托管标识缺少存储账户的 Storage Blob Data Reader 角色,需要在存储账户的 IAM 中补充授权。

数据存储负责“连得上”,数据资产负责“找得到、可版本化”。两者配合使用,才能让后续的训练管道稳定地引用数据,而不必在每次运行时重新配置路径和凭据。
不要将存储账户密钥、SAS 令牌直接写入 Notebook 或训练脚本。应使用工作区数据存储的凭据引用或托管标识,避免密钥泄露和轮换带来的维护成本。