通过数据存储连接到 Azure 存储服务

适用于:Python SDK azureml v1

适用于:Azure CLI ml 扩展 v1

在本文中,了解如何使用 Azure 机器学习数据存储和 Azure 机器学习 Python SDK 连接到 Azure 上的数据存储服务。

数据存储可安全地连接到 Azure 上的存储服务,避免对你的身份验证凭据以及原始数据存储的完整性造成风险。 数据存储将连接信息(例如,订阅 ID 和令牌授权)存储在与工作区关联的密钥保管库中。 使用数据存储可以安全地访问存储,因为这样可以避免在脚本中硬编码连接信息。 可以创建连接到这些 Azure 存储解决方案的数据存储。

有关描述数据存储如何适应 Azure 机器学习整体数据访问工作流的信息,请访问安全地访问数据一文。

若要了解如何使用 UI 连接到数据存储资源,请访问使用工作室 UI 连接到数据存储

提示

本文假设你想要使用基于凭据的身份验证凭据(例如服务主体或共享访问签名 (SAS) 令牌)连接到存储服务。 请记住,如果凭据已注册到数据存储中,所有具有工作区“读者”角色的用户都能够检索这些凭据。 有关详细信息,请访问管理工作区中的角色

有关基于标识的数据访问的详细信息,请参阅对存储服务 (v1) 的基于标识的数据访问

先决条件

  • Azure 订阅。 如果没有 Azure 订阅,请在开始前创建一个试用版订阅。 尝试试用版订阅

  • 一个使用支持的存储类型的 Azure 存储帐户

  • 适用于 Python 的 Azure 机器学习 SDK

  • 一个 Azure 机器学习工作区。

    创建 Azure 机器学习工作区或通过 Python SDK 使用现有工作区

    导入 WorkspaceDatastore 类,然后使用函数 from_config()config.json 文件加载订阅信息。 默认情况下,此函数会查找当前目录中的 JSON 文件,但你也可以使用 from_config(path="your/file/path") 指定一个路径参数,使之指向该文件:

    import azureml.core
    from azureml.core import Workspace, Datastore
    
    ws = Workspace.from_config()
    

    创建工作区时,会将 Azure Blob 容器和 Azure 文件共享作为数据存储自动注册到工作区。 它们分别命名为 workspaceblobstoreworkspacefilestoreworkspaceblobstore 存储工作区项目和机器学习试验日志。 它充当默认数据存储,无法从工作区中删除。 workspacefilestore 存储通过计算实例授权的笔记本和 R 脚本。

    注意

    Azure 机器学习设计器会在你打开设计器主页中的示例时自动创建一个名为 azureml_globaldatasets 的数据存储。 此数据存储仅包含示例数据集。 请不要将此数据存储用于任何机密数据访问。

支持的数据存储服务类型

数据存储目前支持将连接信息存储到下表中列出的存储服务:

提示

对于不支持的存储解决方案(下表中未列出的解决方案),连接和使用数据时可能会遇到问题。 建议移动数据到受支持的 Azure 存储解决方案。 这样做也可能有利于其他方案,例如在 ML 试验期间节省数据流出量成本。

存储类型 身份验证类型 Azure 机器学习工作室 Azure 机器学习 Python SDK Azure 机器学习 CLI Azure 机器学习 REST API VS Code
Azure Blob 存储 帐户密钥
SAS 令牌
Azure 文件共享 帐户密钥
SAS 令牌
Azure Data Lake Storage Gen 2 服务主体
Azure SQL 数据库 SQL 身份验证
服务主体
Azure PostgreSQL SQL 身份验证
Azure Database for MySQL SQL 身份验证 ✓* ✓* ✓*
Databricks 文件系统 无身份验证 ✓** ✓ ** ✓**

存储指导原则

建议为 Azure Blob 容器创建数据存储。 标准和高级存储都可用于 Blob。 尽管高级存储开销更高,但它的吞吐量速度更快,可提高训练运行的速度,特别是在针对大型数据集进行训练时。 有关存储帐户费用的信息,请访问 Azure 定价计算器

Azure Data Lake Storage Gen2 是在 Azure Blob 存储的基础之上生成的。 它专为企业大数据分析而设计。 作为 Data Lake Storage Gen2 的一部分,Blob 存储具有分层命名空间。 分层命名空间将对象/文件组织到目录层次结构中,以便进行有效的数据访问。

存储访问和权限

为了确保安全连接到 Azure 存储服务,Azure 机器学习会要求你具有相应数据存储容器的访问权限。 此访问权限依赖用于注册数据存储的身份验证凭据。

虚拟网络

若要与受防火墙保护或虚拟网络中的存储帐户通信,Azure 机器学习需要额外的配置步骤。 如果存储帐户受防火墙保护,则可以通过 Azure 门户将客户端的 IP 地址添加到允许列表

Azure 机器学习可以从虚拟网络外部的客户端接收请求。 为确保从服务请求数据的实体是安全的,并使数据能够显示在工作区中,请对工作区使用专用终结点

对于 Python SDK 用户:若要通过训练脚本访问计算目标上的数据,计算目标必须位于存储的同一虚拟网络和子网中。 可以在同一虚拟网络中使用计算实例/群集

对于 Azure 机器学习工作室用户:有几个功能依赖于从数据集读取数据的能力,例如数据集预览、配置文件和自动化机器学习。 若要使这些功能与虚拟网络后面的存储一起工作,请使用工作室中的工作区托管标识,以允许 Azure 机器学习从虚拟网络外部访问存储帐户。

注意

对于虚拟网络后面的 Azure SQL 数据库中存储的数据,请通过 Azure 门户将“拒绝公共访问”设置为“否”,以允许 Azure 机器学习访问存储帐户

访问验证

警告

不支持跨租户访问存储帐户。 如果方案需要跨租户访问,请联系 Azure 机器学习数据支持团队别名 amldatasupport@microsoft.com,获取自定义代码解决方案的帮助。

在初始的数据存储创建和注册过程中,Azure 机器学习会自动验证基础存储服务是否存在,以及用户提供的主体(用户名、服务主体或 SAS 令牌)是否可以访问指定的存储

创建数据存储后,此验证只针对要求访问基础存储容器的方法执行,而不是每次检索数据存储对象时都执行 。 例如,如果要从数据存储下载文件,则会进行验证。 但是,如果只想更改默认数据存储,则不会进行验证。

若要在访问基础存储服务时进行身份验证,可在要创建的数据存储类型的相应 register_azure_*() 方法中提供帐户密钥、共享访问签名 (SAS) 令牌或服务主体。 存储类型矩阵列出了与各种数据存储类型对应的受支持的身份验证类型。

可在 Azure 门户上查找帐户密钥、SAS 令牌和服务主体信息。

  • 若要使用帐户密钥或 SAS 令牌进行身份验证,请在左窗格中选择“存储帐户”,然后选择要注册的存储帐户

    • “概述”页面提供了帐户名称、文件共享名称和容器等信息
      • 对于帐户密钥,请转到“设置”窗格中的“访问密钥”
      • 对于 SAS 令牌,请转到“设置”窗格中的“共享访问签名”
  • 若要使用服务主体进行身份验证,请转到“应用注册”,然后选择要使用的应用

    • 所选应用的相应“概述”页面包含所需的信息,例如租户 ID 和客户端 ID

重要

若要更改 Azure 存储帐户的访问密钥(帐户密钥或 SAS 令牌),请将新凭据与工作区以及与其连接的数据存储同步。 有关详细信息,请访问同步更新的凭据

权限

对于 Azure Blob 容器和 Azure Data Lake Gen 2 存储,请确保身份验证凭据具有“存储 Blob 数据读取者”访问权限。 有关详细信息,请访问存储 Blob 数据读取者。 帐户 SAS 令牌默认为无权限。

  • 如需进行数据读取访问,你的身份验证凭据必须至少具有容器和对象的“列出”和“读取”权限

  • 数据写入访问还需要“写入”和“添加”权限

创建并注册数据存储

将 Azure 存储解决方案注册为数据存储时,会自动创建数据存储并将其注册到特定的工作区。 请查看本文档中的存储访问和权限,以获取有关虚拟网络方案以及在何处查找所需身份验证凭据的指南。

本部分提供的示例描述了如何通过 Python SDK 为以下存储类型创建和注册数据存储。 这些示例中显示的参数是创建和注册数据存储所必需的

若要为其他受支持的存储服务创建数据存储,请访问适用的 register_azure_* 方法的参考文档

若要了解如何使用 UI 连接到数据存储资源,请访问使用 Azure 机器学习工作室连接到数据

重要

如果你注销了一个数据存储并重新注册一个同名数据存储,但重新注册失败,则表示工作区的 Azure 密钥保管库可能未启用软删除。 默认情况下,将为工作区创建的密钥保管库实例启用软删除,但如果使用的是现有密钥保管库或是在 2020 年 10 月之前创建的工作区,则可能无法启用软删除。 有关描述如何启用软删除的信息,请参阅对现有的密钥保管库启用软删除

注意

数据存储名称应仅包含小写字母、数字和下划线。

Azure blob 容器

若要注册 Azure Blob 容器作为数据存储,请使用 register_azure_blob_container() 方法。

以下代码示例会创建 blob_datastore_name 数据存储并将其注册到 ws 工作区。 此数据存储使用提供的帐户访问密钥访问 my-account-name 存储帐户上的 my-container-name Blob 容器。 请查看存储访问和权限部分,以获取有关虚拟网络方案以及在何处查找所需身份验证凭据的指南。

blob_datastore_name='azblobsdk' # Name of the datastore to workspace
container_name=os.getenv("BLOB_CONTAINER", "<my-container-name>") # Name of Azure blob container
account_name=os.getenv("BLOB_ACCOUNTNAME", "<my-account-name>") # Storage account name
account_key=os.getenv("BLOB_ACCOUNT_KEY", "<my-account-key>") # Storage account access key

blob_datastore = Datastore.register_azure_blob_container(workspace=ws, 
                                                         datastore_name=blob_datastore_name, 
                                                         container_name=container_name, 
                                                         account_name=account_name,
                                                         account_key=account_key)

Azure 文件共享

若要注册 Azure 文件共享作为数据存储,请使用 register_azure_file_share() 方法。

以下代码示例会创建 file_datastore_name 数据存储并将其注册到 ws 工作区。 此数据存储通过提供的帐户访问密钥使用 my-account-name 存储帐户上的 my-fileshare-name 文件共享。 请查看存储访问和权限部分,以获取有关虚拟网络方案以及在何处查找所需身份验证凭据的指南。

file_datastore_name='azfilesharesdk' # Name of the datastore to workspace
file_share_name=os.getenv("FILE_SHARE_CONTAINER", "<my-fileshare-name>") # Name of Azure file share container
account_name=os.getenv("FILE_SHARE_ACCOUNTNAME", "<my-account-name>") # Storage account name
account_key=os.getenv("FILE_SHARE_ACCOUNT_KEY", "<my-account-key>") # Storage account access key

file_datastore = Datastore.register_azure_file_share(workspace=ws,
                                                     datastore_name=file_datastore_name, 
                                                     file_share_name=file_share_name, 
                                                     account_name=account_name,
                                                     account_key=account_key)

Azure Data Lake Storage Gen2

对于 Azure Data Lake Storage 第 2 代 (ADLS Gen 2) 数据存储,请使用 register_azure_data_lake_gen2() 方法通过服务主体权限注册连接到 Azure Data Lake Gen 2 存储的凭据数据存储。

若要使用服务主体,必须注册应用程序,并通过 Azure 基于角色的访问控制 (Azure RBAC) 或访问控制列表 (ACL) 向服务主体授予数据访问权限。 有关详细信息,请访问 ADLS Gen 2 中的访问控制设置

以下代码会创建 adlsgen2_datastore_name 数据存储并将其注册到 ws 工作区。 此数据存储通过使用提供的服务主体凭据访问 account_name 存储帐户中的文件系统 test。 请查看存储访问和权限部分,以获取有关虚拟网络方案以及在何处查找所需身份验证凭据的指南。

adlsgen2_datastore_name = 'adlsgen2datastore'

subscription_id=os.getenv("ADL_SUBSCRIPTION", "<my_subscription_id>") # subscription id of ADLS account
resource_group=os.getenv("ADL_RESOURCE_GROUP", "<my_resource_group>") # resource group of ADLS account

account_name=os.getenv("ADLSGEN2_ACCOUNTNAME", "<my_account_name>") # ADLS Gen2 account name
tenant_id=os.getenv("ADLSGEN2_TENANT", "<my_tenant_id>") # tenant id of service principal
client_id=os.getenv("ADLSGEN2_CLIENTID", "<my_client_id>") # client id of service principal
client_secret=os.getenv("ADLSGEN2_CLIENT_SECRET", "<my_client_secret>") # the secret of service principal

adlsgen2_datastore = Datastore.register_azure_data_lake_gen2(workspace=ws,
                                                             datastore_name=adlsgen2_datastore_name,
                                                             account_name=account_name, # ADLS Gen2 account name
                                                             filesystem='test', # ADLS Gen2 filesystem
                                                             tenant_id=tenant_id, # tenant id of service principal
                                                             client_id=client_id, # client id of service principal
                                                             client_secret=client_secret) # the secret of service principal

使用其他 Azure 工具创建数据存储

除了使用 Python SDK 和工作室创建数据存储外,还可以使用 Azure 资源管理器模板或 Azure 机器学习 VS Code 扩展创建数据存储。

Azure Resource Manager

可以使用 https://github.com/Azure/azure-quickstart-templates/tree/master/quickstarts/microsoft.machinelearningservices 中的多个模板来创建数据存储。 有关这些模板的信息,请访问使用 Azure 资源管理器模板创建 Azure 机器学习的工作区

VS Code 扩展

有关使用 Azure 机器学习 VS Code 扩展创建和管理数据存储的详细信息,请访问 VS Code 资源管理操作指南

使用数据存储中的数据

创建数据存储后,请创建 Azure 机器学习数据集,以便与数据进行交互。 数据集可将数据打包成一个延迟计算的对象,可供机器学习任务(例如,训练)使用。 使用数据集,你可以从 Azure 存储服务下载或装载任何格式的文件,以便在计算目标上进行模型训练。 详细了解如何使用数据集训练 ML 模型

从工作区获取数据存储

若要获取在当前工作区中注册的特定数据存储,请在 Datastore 类上使用 get() 静态方法:

# Get a named datastore from the current workspace
datastore = Datastore.get(ws, datastore_name='your datastore name')

若要获取在给定工作区中注册的数据存储的列表,可对工作区对象使用 datastores 属性:

# List all datastores registered in the current workspace
datastores = ws.datastores
for name, datastore in datastores.items():
    print(name, datastore.datastore_type)

以下代码示例演示如何获取工作区的默认数据存储:

datastore = ws.get_default_datastore()

还可以通过此代码示例更改默认数据存储。 只有 SDK 支持此功能:

 ws.set_default_datastore(new_default_datastore)

在评分过程中访问数据

Azure 机器学习提供多种方法来使用模型进行评分。 其中一些方法不提供对数据存储的访问权限。 下表描述了在评分期间访问数据存储的方法:

方法 数据存储访问 说明
批量预测 以异步方式对大量数据进行预测。
Web 服务   将模型部署为 Web 服务。

当 SDK 无法提供对数据存储的访问权限时,可使用相关的 Azure SDK 创建自定义代码来访问数据。 例如,适用于 Python 的 Azure 存储 SDK 客户端库可访问 Blob 或文件中存储的数据。

将数据移到支持的 Azure 存储解决方案

Azure 机器学习支持访问以下位置的数据

  • Azure Blob 存储
  • Azure 文件
  • Azure Data Lake Storage Gen2
  • Azure SQL 数据库
  • Azure Database for PostgreSQL

如果你使用不受支持的存储,则建议使用 Azure 数据工厂和这些步骤将数据移动到受支持的 Azure 存储解决方案。 将数据移动到受支持的存储可帮助你在机器学习试验期间节省数据传出成本。

Azure 数据工厂具有超过 80 个预生成的连接器,可提供高效且可复原的数据传输,无需额外付费。 这些连接器包括 Azure 数据服务、本地数据源。

后续步骤