你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

创建和管理数据资产

适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)

本文介绍如何在 Azure 机器学习中创建和管理数据资产。

当你需要以下功能时,可以使用数据资产:

  • 版本控制:数据资产支持数据版本控制。
  • 可再现性:数据资产版本一经创建,便是不可变的, 无法修改或删除。 因此,可再现使用数据资产的训练作业或管道。
  • 可审核性:由于数据资产版本是不可变的,因此可跟踪资产版本以及更新版本的人员/时间。
  • 世系:对于任何给定的数据资产,可查看哪些作业或管道使用了数据。
  • 易于使用:Azure 机器学习数据资产与 Web 浏览器书签(收藏夹)类似。 可以创建数据资产版本,然后使用易记名称(例如 azureml:<my_data_asset_name>:<version>)访问该资产版本,而不必记住引用 Azure 存储上的常用数据的长存储路径 (URI)。

提示

若要在交互式会话(例如 Notebook)或作业中访问数据,无需提前创建数据资产。 可以使用数据存储 URI 来访问数据。 数据存储 URI 为 Azure 机器学习的入门用户提供了一种简单的数据访问方法。

先决条件

若要创建和使用数据资产,需要做好以下准备:

创建数据资产

创建数据资产时,需要设置数据资产类型。 Azure 机器学习支持三种数据资产类型:

类型 API 规范场景
File
引用单个文件
uri_file 读取 Azure 存储上的单个文件(该文件可采用任何格式)。
文件夹
引用文件夹
uri_folder 将 parquet/CSV 文件的文件夹读取到 Pandas/Spark 中。

读取文件夹中的非结构化数据(图像、文本、音频等)。

引用数据表
mltable 架构很复杂,可能会频繁更改,或者需要大型表格数据的一部分。

使用表的 AutoML。

读取分布在多个存储位置的非结构化数据(图像、文本、音频等)。

注意

除非将数据注册为 MLTable,否则请不要在 csv 文件中使用嵌入的换行符。 阅读数据时,csv 文件中嵌入的换行符可能会导致字段值不对齐。 MLTable 在 read_delimited 转换中使用此参数 support_multi_line,以便将带引号的换行符解释为一条记录。

在 Azure 机器学习作业中使用数据资产时,可以将资产装载或下载到计算节点。 有关详细信息,请阅读模式

此外,还必须指定指向数据资产位置的 path 参数。 支持的路径包括:

位置 示例
本地计算机上的路径 ./home/username/data/my_data
数据存储上的路径 azureml://datastores/<data_store_name>/paths/<path>
公共 http (s) 服务器上的路径 https://raw.githubusercontent.com/pandas-dev/pandas/main/doc/data/titanic.csv
Azure 存储上的路径 (Blob) wasbs://<containername>@<accountname>.blob.core.windows.net/<path_to_data>/
(ADLS gen2) abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
(ADLS gen1) adl://<accountname>.azuredatalakestore.net/<path_to_data>/

注意

从本地路径创建数据资产时,它将自动上传到默认的 Azure 机器学习云数据存储。

创建数据资产:文件类型

类型为“文件”(uri_file) 的数据资产指向存储上的单个文件(例如 CSV 文件)。 可使用以下方法创建文件类型的数据资产:

创建 YAML 文件并复制粘贴以下代码。 必须使用数据资产的名称、版本、说明和受支持位置上单个文件的路径更新 <> 占位符。

$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json

# Supported paths include:
# local: './<path>/<file>' (this will be automatically uploaded to cloud storage)
# blob:  'wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>/<file>'
# ADLS gen2: 'abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>/<file>'
# Datastore: 'azureml://datastores/<data_store_name>/paths/<path>/<file>'

type: uri_file
name: <NAME OF DATA ASSET>
version: <VERSION>
description: <DESCRIPTION>
path: <SUPPORTED PATH>

接下来,在 CLI 中执行以下命令(将 <filename> 占位符更新为 YAML 文件名):

az ml data create -f <filename>.yml

创建数据资产:文件夹类型

类型为“文件夹”(uri_folder) 的数据资产指向存储上的文件夹(例如,包含多个图像子文件夹的文件夹)。 可使用以下方法创建文件夹类型的数据资产:

创建 YAML 文件并复制粘贴以下代码。 需要使用数据资产的名称、版本、说明和受支持位置上文件夹的路径更新 <> 占位符。

$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json

# Supported paths include:
# local: './<path>/<folder>' (this will be automatically uploaded to cloud storage)
# blob:  'wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>/<folder>'
# ADLS gen2: 'abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>/<folder>'
# Datastore: 'azureml://datastores/<data_store_name>/paths/<path>/<folder>'

type: uri_folder
name: <NAME OF DATA ASSET>
version: <VERSION>
description: <DESCRIPTION>
path: <SUPPORTED PATH>

接下来,在 CLI 中执行以下命令(将 <filename> 占位符更新为 YAML 文件名):

az ml data create -f <filename>.yml

创建数据资产:表类型

Azure 机器学习表 (MLTable) 具有丰富的功能,更详细信息请参阅在 Azure 机器学习中使用表。 在这里我们提供了一个示例,说明如何使用公开提供的 Azure Blob 存储帐户上的 Titanic 数据创建表类型的数据资产,而不是重复该文档。

首先,创建一个名为 data 的新目录,并创建一个名为“MLTable”的文件:

mkdir data
touch MLTable

接下来,将下面的 YAML 复制粘贴到你在上一步中创建的 MLTable 文件:

注意

不要将 MLTable 文件重命名为 MLTable.yamlMLTable.yml。 Azure 机器学习需要一个 MLTable 文件。

paths:
- file: wasbs://data@azuremlexampledata.blob.core.windows.net/titanic.csv
transformations:
- read_delimited:
    delimiter: ','
    empty_as_string: false
    encoding: utf8
    header: all_files_same_headers
    include_path_column: false
    infer_column_types: true
    partition_size: 20971520
    path_column: Path
    support_multi_line: false
- filter: col('Age') > 0
- drop_columns:
  - PassengerId
- convert_column_types:
  - column_type:
      boolean:
        false_values:
        - 'False'
        - 'false'
        - '0'
        mismatch_as: error
        true_values:
        - 'True'
        - 'true'
        - '1'
    columns: Survived
type: mltable

接下来,在 CLI 中执行以下命令。 确保使用数据资产名称和版本值更新 <> 占位符。

az ml data create --path ./data --name <DATA ASSET NAME> --version <VERSION> --type mltable

重要

path 应是包含有效 MLTable 文件的文件夹。

从作业输出创建数据资产

可以通过在输出中设置 name 参数,从 Azure 机器学习作业创建数据资产。 在此示例中,你将提交一个作业,该作业将数据从公共 Blob 存储复制到默认的 Azure 机器学习数据存储,并创建名为 job_output_titanic_asset 的数据资产。

创建作业规范 YAML 文件 (<file-name>.yml):

$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json

# path: Set the URI path for the data. Supported paths include
# local: `./<path>
# Blob: wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>
# ADLS: abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>
# Datastore: azureml://datastores/<data_store_name>/paths/<path>
# Data Asset: azureml:<my_data>:<version>

# type: What type of data are you pointing to?
# uri_file (a specific file)
# uri_folder (a folder)
# mltable (a table)

# mode: Set INPUT mode:
# ro_mount (read-only mount)
# download (download from storage to node)
# mode: Set the OUTPUT mode
# rw_mount (read-write mount)
# upload (upload data from node to storage)

type: command
command: cp ${{inputs.input_data}} ${{outputs.output_data}}
compute: azureml:cpu-cluster
environment: azureml://registries/azureml/environments/sklearn-1.1/versions/4
inputs:
  input_data:
    mode: ro_mount
    path: azureml:wasbs://data@azuremlexampledata.blob.core.windows.net/titanic.csv
    type: uri_file
outputs:
  output_data:
    mode: rw_mount
    path: azureml://datastores/workspaceblobstore/paths/quickstart-output/titanic.csv
    type: uri_file
    name: job_output_titanic_asset
    

接下来,使用 CLI 提交作业:

az ml job create --file <file-name>.yml

管理数据资产

删除数据资产

重要

根据设计,不支持删除数据资产。

如果 Azure 机器学习允许删除数据资产,会产生以下不利影响:

  • 使用后来删除的数据资产的生产作业将失败。
  • 再现机器学习试验将变得更加困难。
  • 作业世系会中断,因为无法查看已删除的数据资产版本。
  • 由于版本可能缺失,因此无法正确地跟踪和审核。

因此,在创建生产工作负载的团队中工作时,数据资产的不可变性提供了一定程度的保护。

如果错误地创建了数据资产(例如,名称、类型或路径错误),Azure 机器学习会提供解决方案来处理这种情况,不会造成删除操作带来的负面影响:

我想删除此数据资产,因为... 解决方案
名称不正确 存档数据资产
团队不再使用数据资产 存档数据资产
它使数据资产列表变得混乱 存档数据资产
路径不正确 使用正确路径创建(同名)数据资产的新版本。 有关详细信息,请阅读创建数据资产
其类型不正确 目前,Azure 机器学习不允许创建与初始版本类型不同的新版本。
(1) 存档数据资产
(2) 使用正确的类型创建一个不同名的新数据资产

存档数据资产

默认情况下,存档数据资产后,该资产不在列表查询(例如在 CLI az ml data list)中显示,也不在 Studio 用户界面 的数据资产列表中显示。 你仍可继续在工作流中引用和使用已存档的数据资产。 可存档以下任一项:

  • 采用给定名称的数据资产的所有版本,或者
  • 特定数据资产版本

存档数据资产的所有版本

若要存档给定名称下的数据资产的所有版本,请使用:

执行以下命令(将 <> 占位符更新为数据资产的名称):

az ml data archive --name <NAME OF DATA ASSET>

存档特定数据资产版本

若要存档特定数据资产版本,请使用:

执行以下命令(将 <> 占位符更新为数据资产的名称和版本):

az ml data archive --name <NAME OF DATA ASSET> --version <VERSION TO ARCHIVE>

还原已存档的数据资产

可还原已存档的数据资产。 如果已存档数据资产的所有版本,则无法还原数据资产的各个版本 - 必须还原所有版本。

还原数据资产的所有版本

若要还原给定名称下的数据资产的所有版本,请使用:

执行以下命令(将 <> 占位符更新为数据资产的名称):

az ml data restore --name <NAME OF DATA ASSET>

还原特定数据资产版本

重要

如果已存档所有数据资产版本,则无法还原数据资产的各个版本 - 必须还原所有版本。

若要还原特定数据资产版本,请使用:

执行以下命令(将 <> 占位符更新为数据资产的名称和版本):

az ml data restore --name <NAME OF DATA ASSET> --version <VERSION TO ARCHIVE>

数据世系

数据世系被广泛地理解为生命周期,它跨越数据的起源,并随着时间的推移在存储中推进。 不同种类的反向场景都使用它,例如故障排除、跟踪 ML 管道中的根本原因和调试。 数据质量分析、合规性和“what if”场景也使用世系。 世系以可视化的方式表示,以显示从源到目标的数据移动,此外还涵盖数据转换。 考虑到大多数企业数据环境的复杂性,如果不对外围数据点进行整合或过滤,这些视图可能很难理解。

在 Azure 机器学习管道中,数据资产显示了数据的来源和处理方式,例如:

Screenshot showing data lineage in the job details.

可以在工作室 UI 中查看使用数据资产的作业。 首先,从左侧菜单中选择“数据”,然后选择数据资产名称。 可以看到正在使用数据资产的作业:

Screenshot that shows the jobs that consume a data asset.

借助数据资产中的作业视图,可以更轻松地在 ML 管道和调试中查找作业失败情况并执行路由原因分析。

数据资产标记

数据资产支持标记,这是以键值对的形式应用于数据资产的额外元数据。 数据标记提供许多优势:

  • 数据质量说明。 例如,如果你的组织使用奖牌湖屋 (medallion lakehouse) 体系结构,可使用 medallion:bronze(原始)、medallion:silver(已验证)和 medallion:gold(已扩充)来标记资产。
  • 提供对数据的高效搜索和筛选来帮助数据发现。
  • 帮助识别敏感的个人数据,以正确管理和治理数据访问。 例如,sensitivity:PII/sensitivity:nonPII
  • 确认数据是否经过负责任 AI (RAI) 审核的批准。 例如,RAI_audit:approved/RAI_audit:todo

可在数据资产创建流中向数据资产添加标记,也可向现有数据资产添加标记。 此部分同时显示两者。

在数据资产创建流的过程中添加标记

创建 YAML 文件并复制粘贴以下代码。 必须使用数据资产的名称、版本、说明、标记(键值对)和受支持位置上单个文件的路径更新 <> 占位符。

$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json

# Supported paths include:
# local: './<path>/<file>' (this will be automatically uploaded to cloud storage)
# blob:  'wasbs://<container_name>@<account_name>.blob.core.windows.net/<path>/<file>'
# ADLS gen2: 'abfss://<file_system>@<account_name>.dfs.core.windows.net/<path>/<file>'
# Datastore: 'azureml://datastores/<data_store_name>/paths/<path>/<file>'

# Data asset types, use one of:
# uri_file, uri_folder, mltable

type: uri_file
name: <NAME OF DATA ASSET>
version: <VERSION>
description: <DESCRIPTION>
tags:
    <KEY1>: <VALUE>
    <KEY2>: <VALUE>
path: <SUPPORTED PATH>

接下来,在 CLI 中执行以下命令(将 <filename> 占位符更新为 YAML 文件名):

az ml data create -f <filename>.yml

向现有数据资产添加标记

在 Azure CLI 中执行以下命令,并使用数据资产名称、版本和标记键值对更新 <> 占位符。

az ml data update --name <DATA ASSET NAME> --version <VERSION> --set tags.<KEY>=<VALUE>

版本管理最佳实践

通常,ETL 进程在 Azure 存储上按时间整理文件夹结构,例如:

/
└── 📁 mydata
    ├── 📁 year=2022
    │   ├── 📁 month=11
    │   │   └── 📄 file1
    │   │   └── 📄 file2
    │   └── 📁 month=12
    │       └── 📄 file1
    │   │   └── 📄 file2
    └── 📁 year=2023
        └── 📁 month=1
            └── 📄 file1
    │   │   └── 📄 file2

借助时间/版本结构化文件夹与 Azure 机器学习表 (MLTable) 的组合,你能够构造经过版本控制的数据集。 为了说明如何使用 Azure 机器学习表存档经过版本控制的数据,我们使用了一个假设示例。 假设你有一个进程,每周将相机图像上传到 Azure Blob 存储中,其结构如下:

/myimages
└── 📁 year=2022
    ├── 📁 week52
    │   ├── 📁 camera1
    │   │   └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg
    │   └── 📁 camera2
    │       └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg
└── 📁 year=2023
    ├── 📁 week1
    │   ├── 📁 camera1
    │   │   └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg
    │   └── 📁 camera2
    │       └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg

注意

虽然我们演示的是如何对图像 (jpeg) 数据进行版本控制,但这种方法可应用于任何文件类型(例如 Parquet、CSV)。

使用 Azure 机器学习表 (mltable) 构造一个路径表,其中包含截至 2023 年第一周结束时的数据,然后创建一个数据资产:

import mltable
from mltable import MLTableHeaders, MLTableFileEncoding, DataType
from azure.ai.ml import MLClient
from azure.ai.ml.entities import Data
from azure.ai.ml.constants import AssetTypes
from azure.identity import DefaultAzureCredential

# The ** in the pattern below will glob all sub-folders (camera1, ..., camera2)
paths = [
    {
        "pattern": "abfss://<file_system>@<account_name>.dfs.core.windows.net/myimages/year=2022/week=52/**/*.jpeg"
    },
    {
        "pattern": "abfss://<file_system>@<account_name>.dfs.core.windows.net/myimages/year=2023/week=1/**/*.jpeg"
    },
]

tbl = mltable.from_paths(paths)
tbl.save("./myimages")

# Connect to the AzureML workspace
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace = "<AML_WORKSPACE_NAME>"

ml_client = MLClient(
    DefaultAzureCredential(), subscription_id, resource_group, workspace
)

# Define the Data asset object
my_data = Data(
    path=mltable_folder,
    type=AssetTypes.MLTABLE,
    description="My images. Version includes data through to 2023-Jan-08.",
    name="myimages",
    version="20230108",
)

# Create the data asset in the workspace
ml_client.data.create_or_update(my_data)

在下一周结束时,ETL 已更新数据以包含更多数据:

/myimages
└── 📁 year=2022
    ├── 📁 week52
    │   ├── 📁 camera1
    │   │   └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg
    │   └── 📁 camera2
    │   │   └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg
└── 📁 year=2023
    ├── 📁 week1
    │   ├── 📁 camera1
    │   │   └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg
    │   └── 📁 camera2
    │   │   └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg
    ├── 📁 week2
    │   ├── 📁 camera1
    │   │   └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg
    │   └── 📁 camera2
    │   │   └── 🖼️ file1.jpeg
    │   │   └── 🖼️ file2.jpeg

第一个版本 (20230108) 继续仅从 year=2022/week=52year=2023/week=1 装载/下载文件,因为路径是在 MLTable 文件中声明的。 这确保了试验的“可再现性”。 若要创建包含 year=2023/week2 的新版本的数据资产,可使用:

import mltable
from mltable import MLTableHeaders, MLTableFileEncoding, DataType
from azure.ai.ml import MLClient
from azure.ai.ml.entities import Data
from azure.ai.ml.constants import AssetTypes
from azure.identity import DefaultAzureCredential

# The ** in the pattern below will glob all sub-folders (camera1, ..., camera2)
paths = [
    {
        "pattern": "abfss://<file_system>@<account_name>.dfs.core.windows.net/myimages/year=2022/week=52/**/*.jpeg"
    },
    {
        "pattern": "abfss://<file_system>@<account_name>.dfs.core.windows.net/myimages/year=2023/week=1/**/*.jpeg"
    },
    {
        "pattern": "abfss://<file_system>@<account_name>.dfs.core.windows.net/myimages/year=2023/week=2/**/*.jpeg"
    },
]

# Save to an MLTable file on local storage
tbl = mltable.from_paths(paths)
tbl.save("./myimages")

# Next, you create a data asset - the MLTable file will automatically be uploaded

# Connect to the AzureML workspace
subscription_id = "<SUBSCRIPTION_ID>"
resource_group = "<RESOURCE_GROUP>"
workspace = "<AML_WORKSPACE_NAME>"

ml_client = MLClient(
    DefaultAzureCredential(), subscription_id, resource_group, workspace
)

# Define the Data asset object
my_data = Data(
    path=mltable_folder,
    type=AssetTypes.MLTABLE,
    description="My images. Version includes data through to 2023-Jan-15.",
    name="myimages",
    version="20230115", # update version to the date
)

# Create the data asset in the workspace
ml_client.data.create_or_update(my_data)

现在你有两个版本的数据,其中版本的名称与图像上传到存储的日期相对应:

  1. 20230108:截至 2023 年 1 月 8 日的图像。
  2. 20230115:截至 2023 年 1 月 15 日的图像。

在这两种情况下,MLTable 都构造一个路径表,其中仅包含截至这些日期的图像。

在 Azure 机器学习作业中,可以使用 eval_downloadeval_mount 模式将经过版本控制的 MLTable 中的这些路径装载或下载到计算目标:

from azure.ai.ml import MLClient, command, Input
from azure.ai.ml.entities import Environment
from azure.identity import DefaultAzureCredential
from azure.ai.ml.constants import InputOutputModes

# connect to the AzureML workspace
ml_client = MLClient.from_config(
    DefaultAzureCredential()
)

# Get the 20230115 version of the data
data_asset = ml_client.data.get(name="myimages", version="20230115")

input = {
    "images": Input(type="mltable",
                   path=data_asset.id,
                   mode=InputOutputModes.EVAL_MOUNT
            )
}

cmd = """
ls ${{inputs.images}}/**
"""

job = command(
    command=cmd,
    inputs=input,
    compute="cpu-cluster",
    environment="azureml://registries/azureml/environments/sklearn-1.1/versions/4"
)

ml_client.jobs.create_or_update(job)

注意

eval_mounteval_download 模式对 MLTable 来说是唯一的。 在这种情况下,AzureML 数据运行时功能会评估 MLTable 文件并将路径装载到计算目标上。

后续步骤