3. 工作区与数据资产配置
在 Azure 机器学习中,工作区(Workspace)是贯穿整个项目生命周期的顶层资源容器。它本身不存储训练数据,也不直接运行训练代码,而是把计算、数据、模型、环境、实验记录和终结点等资源组织在同一个命名空间下,并通过托管标识与 Azure 存储、密钥保管库、容器注册表等后端服务建立受控连接。理解这一点很关键:配置工作区的过程,本质上是在搭建一条“控制面 + 数据面”的通道,让后续的作业、管道和终结点能够安全地读写数据。
工作区的组成与依赖关系
创建一个工作区时,Azure 会同时创建或关联若干后端资源。默认情况下,工作区自带一个关联的 Azure 存储账户(作为默认数据存储)、一个 Azure Key Vault(保存连接字符串、密钥等机密)、一个 Application Insights(记录指标与日志)以及一个 Azure Container Registry(存放训练环境镜像)。这些资源通过工作区的托管标识互相访问,因此权限配置是否正确,直接决定后续数据资产能否被正常读取。
创建工作的关键参数与操作
创建工作区可以通过 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 中补充授权。