创建数据资产

已完成

作为数据科学家,你希望专注于训练机器学习模型。 尽管你需要将数据作为机器学习模型的输入进行访问,但你不希望顾虑如何获取访问权限。 若要简化对要使用的数据的访问,可以使用数据资产。

了解数据资产

在 Azure 机器学习中,数据资产是对数据存储位置、如何获取访问权限以及任何其他相关元数据的引用。 可以创建数据资产来访问数据存储、Azure 存储服务、公共 URL 中的数据或存储在本地设备上的数据。

使用数据资产的好处包括:

  • 可以与团队其他成员共享和重复使用数据,这样他们就无需记住文件位置。
  • 可以在模型训练期间(在任何受支持的计算类型上)无缝访问数据,而无需担心连接字符串或数据路径。
  • 可以对数据资产的元数据进行版本控制。

可以使用三种主要类型的数据资产:

Azure 机器学习中不同类型数据资产的示意图。

  • URI 文件:指向特定文件。
  • URI 文件夹:指向文件夹。
  • MLTable:指向文件夹或文件,并包含要读取为表格数据的架构。

注意

URI 代表统一资源标识符,表示本地计算机上的存储位置、Azure Blob 或 Data Lake Storage、公开可用的 https 位置,甚至是附加数据存储。

何时使用数据资产

在将机器学习任务作为 Azure 机器学习作业执行时,数据资产最有用。 作为作业,你可以运行接受输入并生成输出的 Python 脚本。 可将数据资产分析为 Azure 机器学习作业的输入或输出。

让我们看看每种类型的数据资产、它们的创建方式以及如何在作业中使用数据资产。

创建 URI 文件数据资产

URI 文件数据资产指向特定文件。 Azure 机器学习仅存储文件路径,这意味着可以指向任何类型的文件。 使用数据资产时,请指定读取数据的方式,具体取决于要连接到的数据类型。

创建 URI 文件数据资产时可以使用的支持路径包括:

  • 本地:./<path>
  • Azure Blob 存储:wasbs://<account_name>.blob.core.windows.net/<container_name>/<folder>/<file>
  • Azure Data Lake Storage (Gen 2):abfss://<file_system>@<account_name>.dfs.core.windows.net/<folder>/<file>
  • 数据存储:azureml://datastores/<datastore_name>/paths/<folder>/<file>

重要

创建数据资产并指向本地设备上存储的文件或文件夹时,文件或文件夹副本将上传到默认数据存储 workspaceblobstore。 可以在 LocalUpload 文件夹中找到该文件或文件夹。 通过上传副本,即使存储数据的本地设备不可用,你仍能够从 Azure 机器学习工作区访问数据。

若要创建 URI 文件数据资产,可以使用以下代码:

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

my_path = '<supported-path>'

my_data = Data(
    path=my_path,
    type=AssetTypes.URI_FILE,
    description="<description>",
    name="<name>",
    version="<version>"
)

ml_client.data.create_or_update(my_data)

将 URI 文件数据资产分析为 Azure 机器学习作业中的输入时,首先需要读取数据,然后才能使用它。

假设你创建了一个要作为作业运行的 Python 脚本,并将输入参数 input_data 的值设置为 URI 文件数据资产(该资产指向一个 CSV 文件)。 可以通过在 Python 脚本中包含以下代码来读取数据:

import argparse
import pandas as pd

parser = argparse.ArgumentParser()
parser.add_argument("--input_data", type=str)
args = parser.parse_args()

df = pd.read_csv(args.input_data)
print(df.head(10))

如果 URI 文件数据资产指向不同类型的文件,则需要使用适当的 Python 代码来读取数据。 例如,如果使用的是 JSON 文件,而不是 CSV 文件,则改用 pd.read_json()

创建 URI 文件夹数据资产

URI 文件夹数据资产指向特定文件夹。 它的工作方式类似于 URI 文件数据资产,并支持相同路径。

若要使用 Python SDK 创建 URI 文件夹数据资产,可以使用以下代码:

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

my_path = '<supported-path>'

my_data = Data(
    path=my_path,
    type=AssetTypes.URI_FOLDER,
    description="<description>",
    name="<name>",
    version='<version>'
)

ml_client.data.create_or_update(my_data)

将 URI 文件夹数据资产分析为 Azure 机器学习作业中的输入时,首先需要读取数据,然后才能使用它。

假设你创建了一个要作为作业运行的 Python 脚本,并将输入参数 input_data 的值设置为 URI 文件夹数据资产(该资产指向多个 CSV 文件)。 可以读取文件夹中的所有 CSV 文件并连接它们,这可以通过在 Python 脚本中包含以下代码来完成:

import argparse
import glob
import pandas as pd

parser = argparse.ArgumentParser()
parser.add_argument("--input_data", type=str)
args = parser.parse_args()

data_path = args.input_data
all_files = glob.glob(data_path + "/*.csv")
df = pd.concat((pd.read_csv(f) for f in all_files), sort=False)

根据所使用的数据类型,用于读取文件的代码可能会发生变化。

创建 MLTable 数据资产

MLTable 数据资产允许指向表格数据。 创建 MLTable 数据资产时,指定要读取数据的架构定义。 由于架构已定义并随数据资产一起存储,因此无需指定在使用架构时如何读取数据。

因此,当数据架构较为复杂或频繁更改时,需要使用 MLTable 数据资产。 只需在数据资产本身中更改数据,而无需更改每个使用数据的脚本中的数据读取方式。

如果在创建 MLTable 数据资产时定义架构,还可以选择仅指定数据的子集。

对于 Azure 机器学习中的某些功能(如自动化机器学习),需要使用 MLTable 数据资产,因为 Azure 机器学习需要知道如何读取数据。

若要定义架构,可以将 MLTable 文件包含在要读取的数据所在的文件夹中。 MLTable 文件包括指向要读取的数据的路径,以及如何读取数据:

type: mltable

paths:
  - pattern: ./*.txt
transformations:
  - read_delimited:
      delimiter: ','
      encoding: ascii
      header: all_files_same_headers

若要使用 Python SDK 创建 MLTable 数据资产,可以使用以下代码:

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

my_path = '<path-including-mltable-file>'

my_data = Data(
    path=my_path,
    type=AssetTypes.MLTABLE,
    description="<description>",
    name="<name>",
    version='<version>'
)

ml_client.data.create_or_update(my_data)

将 MLTable 数据资产分析为要作为 Azure 机器学习作业运行的 Python 脚本的输入时,可以包含以下代码来读取数据:

import argparse
import mltable
import pandas

parser = argparse.ArgumentParser()
parser.add_argument("--input_data", type=str)
args = parser.parse_args()

tbl = mltable.load(args.input_data)
df = tbl.to_pandas_dataframe()

print(df.head(10))

一种常见方法是将表格数据转换为 Pandas 数据帧。 不过,也可以将数据转换为 Spark 数据帧来更好地满足你的工作负载。