Azure ML API v2中使用自定义容器注册表的认证问题
问题
我有一个可用的Azure容器注册表(ACR),可以通过服务主体认证执行拉取、推送等操作。但把任务提交到计算集群时,集群无法从该注册表拉取正确的Docker镜像,运行日志显示拉取镜像时提示未授权。我用Azure ML API v2的command函数提交任务,没找到在该函数里添加服务主体的Docker用户名和密码的方式,而v1 API支持这个配置,想问是v2 API有问题还是我漏了操作?
集群运行日志
2023/09/25 14:39:53 Downloading source code... 2023/09/25 14:39:54 Finished downloading source code 2023/09/25 14:39:54 Creating Docker network: acb_default_network, driver: 'bridge' 2023/09/25 14:39:55 Successfully set up Docker network: acb_default_network 2023/09/25 14:39:55 Setting up Docker configuration... 2023/09/25 14:39:55 Successfully set up Docker configuration 2023/09/25 14:39:55 Logging in to registry: caf220d1b3fa459e8a75611cec79dbe5.azurecr.io 2023/09/25 14:39:56 Successfully logged into caf220d1b3fa459e8a75611cec79dbe5.azurecr.io 2023/09/25 14:39:56 Volume source scriptsFromEms successfully created 2023/09/25 14:39:56 Executing step ID: acb_step_0. Timeout(sec): 5400, Working directory: '', Network: 'acb_default_network' 2023/09/25 14:39:56 Scanning for dependencies... 2023/09/25 14:39:57 Successfully scanned dependencies 2023/09/25 14:39:57 Launching container with name: acb_step_0 Sending build context to Docker daemon 77.31kB Step 1/21 : FROM tampere.azurecr.io/custom/ubuntu20.04@sha256:aa19088a50e382bbde8b89e9a5848ef3632736a35dd45d991cae9afa76ed5cba Get "https://tampere.azurecr.io/v2/custom/ubuntu20.04/manifests/sha256:aa19088a50e382bbde8b89e9a5848ef3632736a35dd45d991cae9afa76ed5cba": unauthorized: authentication required, visit https://aka.ms/acr/authorization for more information. 2023/09/25 14:39:58 Container failed during run: acb_step_0. No retries remaining. failed to run step ID: acb_step_0: exit status 1 Run ID: cbt failed after 15s. Error: failed during run, err: exit status 1
使用的Azure ML API v2代码
from azure.ai.ml import command ... job = command( code="./", command=cli_command, environment=f"mlflow-env:4", # *must* provide a version compute=cluster_name, experiment_name=experiment_name, display_name=job_name, environment_variables={ "PYTHONUNBUFFERED":"1" } ) print("LAUNCHING JOB") ml_client.create_or_update(job) print("JOB LAUNCHED! - HAVE A NICE DAY")
解决方案
Azure ML API v2并没有取消私有ACR的认证配置,只是配置方式和v1不同,可通过以下两种方式解决:
方式一:在环境定义中配置ACR凭据
如果自定义环境存储在私有ACR中,需要在创建环境时指定注册表的认证信息,通过Environment类的credentials参数传入服务主体的客户端ID(用户名)和客户端密钥(密码):
from azure.ai.ml import Environment env = Environment( image="tampere.azurecr.io/custom/ubuntu20.04@sha256:aa19088a50e382bbde8b89e9a5848ef3632736a35dd45d991cae9afa76ed5cba", credentials={ "username": "<服务主体客户端ID>", "password": "<服务主体客户端密钥>" }, name="custom-ubuntu-env", version="1" ) # 先创建环境 ml_client.environments.create_or_update(env) # 提交任务时使用这个环境 job = command( code="./", command=cli_command, environment="custom-ubuntu-env:1", compute=cluster_name, experiment_name=experiment_name, display_name=job_name, environment_variables={ "PYTHONUNBUFFERED":"1" } ) ml_client.create_or_update(job)
方式二:给计算集群的托管标识分配ACR拉取权限
无需在代码中硬编码凭据,更安全的方式是给计算集群使用的托管标识分配ACR的AcrPull角色:
- 找到Azure ML计算集群,查看其使用的托管标识(系统分配或用户分配)
- 进入目标ACR的「访问控制(IAM)」页面,添加角色分配
- 选择
AcrPull角色,将计算集群的托管标识添加为角色分配对象 - 保存配置后,集群即可自动认证拉取ACR中的镜像
注意:日志显示已登录caf220d1b3fa459e8a75611cec79dbe5.azurecr.io,但拉取的是tampere.azurecr.io中的镜像,二者是不同ACR,需确保认证配置针对后者。
内容的提问来源于stack exchange,提问作者SiloSampsa
相关产品推荐
相关产品推荐

