通过将基于标识的数据访问与 SDK v1 配合使用来连接到存储

本文介绍如何通过 Azure 机器学习 Python SDK,使用基于标识的数据访问和 Azure 机器学习数据存储连接到 Azure 上的存储服务。

通常,数据存储使用基于凭据的身份验证来确认你有权访问存储服务。 它们将连接信息(例如,订阅 ID 和令牌授权)存储在与工作区关联的密钥保管库中。 当创建使用基于标识的数据访问的数据存储时,系统会使用你的 Azure 帐户(Azure Active Directory 令牌)来确认是否有权访问存储服务。 在基于身份的数据访问场景中,不会保存任何身份验证凭据。 只会将存储帐户信息存储在数据存储中。

若要通过 Azure 机器学习工作室用户界面创建具有基于身份的数据访问的数据存储,请参阅使用 Azure 机器学习工作室连接到数据

若要创建使用基于凭据的身份验证(例如,访问密钥或服务主体)的数据存储,请参阅连接到 Azure 上的存储服务

Azure 机器学习中基于标识的数据访问

在以下两种情况下,你可以在 Azure 机器学习中应用基于标识的数据访问。 当使用机密数据且需要更精细的数据访问管理时,这些方案非常适合基于标识的访问:

警告

自动化 ML 试验不支持基于标识的数据访问。

  • 访问存储服务
  • 使用专用数据训练机器学习模型

访问存储服务

可以使用 Azure 机器学习数据存储库或 Azure 机器学习数据集通过基于标识的数据访问连接到存储服务。

通常,身份验证凭据保存在数据存储中,该数据存储用于确保你有权访问存储服务。 如果通过数据存储注册这些凭据,则具有工作区读取者角色的任何用户都可以检索这些凭据。 对于某些组织,这种访问规模可能会成为一个安全问题。 详细了解工作区读取者角色

使用基于标识的数据访问时,Azure 机器学习会提示你输入用于数据访问身份验证的 Azure Active Directory 令牌,而不是将凭据保存在数据存储中。 这样,你就可以在存储级别进行数据访问管理,并让凭据保密。

这一行为也适用以下情况:

注意

使用基于凭据的身份验证来存储的凭据包括:订阅 ID、共享访问签名 (SAS) 令牌、存储访问密钥和服务主体信息,例如,客户端 ID 和租户 ID。

针对专用数据的模型训练

某些机器学习方案涉及使用专用数据训练模型。 在这种情况下,数据科学家需要在不泄露机密输入数据的前提下运行训练工作流。 在此方案中,训练计算的托管标识用于数据访问身份验证。 这样,存储管理员就可以将存储 Blob 数据读取者访问权限授予训练计算用于运行训练作业的托管标识。 不需要为各个数据科学家分别授予访问权限。 有关详细信息,请参阅在计算群集上设置托管标识

先决条件

创建并注册数据存储

在 Azure 上将存储服务注册为数据存储时,会自动创建该数据存储并将其注册到特定的工作区。 有关所需权限类型的指导,请参阅存储访问权限。 你还可以选择在没有任何特殊权限的情况下手动创建要连接到的存储,并且只需要名称。

有关如何连接到虚拟网络后面的数据存储的详细信息,请参阅使用虚拟网络

在下面的代码中,请注意缺少身份验证参数,例如,sas_tokenaccount_keysubscription_id,以及服务主体 client_id。 这种省略表示 Azure 机器学习将使用基于标识的数据访问来进行身份验证。 数据存储的创建通常在笔记本中或通过 Studio 以交互方式执行。 因此,Azure Active Directory 令牌用于数据访问身份验证。

注意

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

Azure blob 容器

若要将 Azure blob 容器注册为数据存储,请使用 register_azure_blob_container()

下面的代码会创建credentialless_blob数据存储,并将其注册到ws工作区,然后将其分配给变量 blob_datastore。 此数据存储访问 my-account-name 存储帐户上的 my_container_name blob 容器。

# Create blob datastore without credentials.
blob_datastore = Datastore.register_azure_blob_container(workspace=ws,
                                                      datastore_name='credentialless_blob',
                                                      container_name='my_container_name',
                                                      account_name='my_account_name')

Azure Data Lake Storage Gen2

使用 register_azure_data_lake_gen2() 可注册连接到 Azure Data Lake Storage Gen2 的数据存储。

下面的代码会创建credentialless_adls2数据存储,并将其注册到ws工作区,然后将其分配给变量 adls2_dstore。 此数据存储访问 myadls2 存储帐户中的文件系统 tabular

# Create Azure Data Lake Storage Gen2 datastore without credentials.
adls2_dstore = Datastore.register_azure_data_lake_gen2(workspace=ws, 
                                                       datastore_name='credentialless_adls2', 
                                                       filesystem='tabular', 
                                                       account_name='myadls2')

Azure SQL 数据库

对于 Azure SQL 数据库,请使用 register_azure_sql_database() 来注册连接到 Azure SQL 数据库存储的数据存储。

下面的代码会创建 credentialless_sqldb 数据存储并将其注册到 ws 工作区,然后将其分配给变量 sqldb_dstore。 此数据存储访问 myserver SQL DB 服务器中的数据库 mydb

# Create a sqldatabase datastore without credentials
                                                       
sqldb_dstore = Datastore.register_azure_sql_database(workspace=ws,
                                                       datastore_name='credentialless_sqldb',
                                                       server_name='myserver',
                                                       database_name='mydb')                                                       
                                                   

存储访问权限

为确保安全地连接到 Azure 上的存储服务,Azure 机器学习会要求你具有相应数据存储的访问权限。

警告

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

基于标识的数据访问仅支持与以下存储服务的连接:

  • Azure Blob 存储
  • Azure Data Lake Storage Gen2
  • Azure SQL 数据库

若要访问这些存储服务,必须至少具有存储帐户存储 Blob 数据读取者访问权限。 只有存储帐户所有者可以通过 Azure 门户更改访问级别

如果不想使用用户标识 (Azure Active Directory),还可以选择向工作区托管系统标识 (MSI) 授予创建数据存储的权限。 为此,必须具有存储帐户的所有者权限,并且必须将 grant_workspace_access= True 参数添加到数据寄存器方法。

如果要在远程计算目标上训练模型且想要访问用于训练的数据,必须至少为计算标识授予存储服务的存储 Blob 数据读取者角色。 了解如何在计算群集上设置托管标识

使用虚拟网络

默认情况下,Azure 机器学习无法与防火墙后面或虚拟网络中的存储帐户通信。

可将存储帐户配置为仅允许从特定虚拟网络进行访问。 此配置需要执行额外的步骤来确保不会将数据泄露到网络之外。 基于凭据的数据访问同样具有此行为。 有关详细信息,请参阅如何配置虚拟网络方案

如果存储帐户具有虚拟网络设置,则指定需要哪些标识类型和权限访问。 例如,对于数据预览和数据配置文件,虚拟网络设置确定用于对数据访问进行身份验证的标识类型。

  • 在只允许某些 IP 和子网访问存储的情况下,Azure 机器学习使用工作区 MSI 完成数据预览和配置文件。

  • 如果存储是 ADLS Gen 2 或 Blob,并且具有虚拟网络设置,则客户可以使用用户标识或工作区 MSI,具体取决于创建期间定义的数据存储设置。

  • 如果虚拟网络设置为“允许受信任服务列表中的 Azure 服务访问此存储帐户”,则使用工作区 MSI。

使用存储中的数据

通过 Azure 机器学习与存储中的数据进行交互时,建议使用 Azure 机器学习数据集

重要

自动化 ML 试验不支持使用基于标识的数据访问的数据集。

数据集可将数据打包成一个延迟计算的对象,可供机器学习任务(例如,训练)使用。 此外,利用数据集可从 Azure 存储服务(例如,Azure Blob 存储和 Azure Data Lake Storage)将任何格式的文件下载或装载到计算目标。

要创建数据集,你可以引用来自数据存储的路径,这些存储也使用基于标识的数据访问。

  • 如果基础存储帐户类型为 Blob 或 ADLS Gen 2,则用户标识需要 Blob 读取者角色。

在下面的示例中,blob_datastore 已存在且使用基于标识的数据访问。

blob_dataset = Dataset.Tabular.from_delimited_files(blob_datastore,'test.csv') 

还可以选择跳过数据存储创建并直接从存储 URL 创建数据集。 目前,此功能仅支持 Azure Blob 以及 Azure Data Lake Storage Gen1 和 Gen2。 若要基于存储 URL 创建,只需使用用户标识进行身份验证。

blob_dset = Dataset.File.from_files('https://myblob.blob.core.chinacloudapi.cn/may/keras-mnist-fashion/')

当提交训练作业时,如果训练作业使用基于标识的数据访问创建的数据集,则该训练计算的托管标识将用于数据访问身份验证。 不会使用 Azure Active Directory 令牌。 对于此方案,请确保至少为计算的托管标识授予存储服务的存储 Blob 数据读取者角色。 有关详细信息,请参阅在计算群集上设置托管标识

在计算群集上访问用于训练作业的数据(预览版)

适用于:Azure CLI ml 扩展 v2(当前版本)

Azure 机器学习计算群集上进行训练时,可以使用 Azure Active Directory 令牌向存储进行身份验证。

此身份验证模式使你可以:

  • 设置精细权限,其中不同的工作区用户有权访问不同的存储帐户或存储帐户中的不同文件夹。
  • 审核存储访问,因为存储日志会显示用于访问数据的标识。

重要

此功能具有以下限制

  • 仅对通过 Azure 机器学习 CLI 提交的试验支持此功能
  • 仅支持 CommandJobs 以及带有 CommandSteps 和 AutoMLSteps 的 PipelineJobs
  • 用户标识和计算托管标识不能用于同一作业中的身份验证。

警告

此功能是公共预览版对生产工作负载来说不安全。 确保只有受信任的用户才有权访问工作区和存储帐户。

预览功能在提供时不附带服务级别协议,不建议用于生产工作负载。 某些功能可能不受支持或者受限。

有关详细信息,请参阅适用于 Azure 预览版的补充使用条款

以下步骤概述了如何在计算群集上为训练作业设置基于标识的数据访问。

  1. 向用户标识授予对存储资源的访问权限。 例如,向 StorageBlobReader 授予对要使用的特定存储帐户的访问权限,或授予对 Azure Data Lake Gen 2 存储中特定文件夹或文件的基于 ACL 的权限。

  2. 在没有存储帐户的缓存凭据的情况下,创建 Azure 机器学习数据存储。 如果数据存储具有缓存凭据(例如存储帐户密钥),则使用这些凭据而不是用户标识。

  3. 提交属性 identity 设置为 type: user_identity 的训练作业,如以下作业指定所示。 在训练作业期间,通过提交作业的用户标识对存储进行身份验证。

注意

如果 identity 属性未指定且数据存储没有缓存凭据,则计算托管标识会成为备用选项。

command: |
  echo "--census-csv: ${{inputs.census_csv}}"
  python hello-census.py --census-csv ${{inputs.census_csv}}
code: src
inputs:
  census_csv:
    type: uri_file 
    path: azureml://datastores/mydata/paths/census.csv
environment: azureml:AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest
compute: azureml:cpu-cluster
identity:
  type: user_identity

后续步骤