如何在评分脚本中获取AzureML Workspace引用且不暴露凭据
报错根因说明
你看到的
ScoreInitRestart报错只是表面现象,实际是init函数执行时Azure ML SDK默认触发了交互式设备登录流程,无交互环境下登录流程卡住超时,导致init函数不断重启触发报错。
注意:不要在部署的评分脚本中使用Workspace.from_config()方法,该方法仅适配本地开发场景,部署环境下会触发默认的交互式登录逻辑。
无凭据泄露的解决方案
优先推荐:完全避免在评分脚本中调用Workspace接口
部署在线端点时直接将需要用到的已注册数据集作为挂载参数传入,推理容器会直接把数据集映射到本地路径,评分脚本不需要再做身份认证拉取数据:
# 部署侧代码示例 from azureml.core import Model, Dataset, AciWebservice dataset = Dataset.get_by_name(workspace=ws, name="你的数据集名") deploy_config = AciWebservice.deploy_configuration(cpu_cores=1, memory_gb=2) # 通过datasets参数挂载数据集,容器内默认路径为/datasets/对应数据集名 service = Model.deploy( workspace=ws, name="推理服务名", models=[model], inference_config=inference_config, deployment_config=deploy_config, datasets=[dataset.as_mount()] ) # 评分脚本init()中直接读挂载路径即可,不需要连接Workspace def init(): global data_path data_path = "/datasets/你的数据集名"
若必须在init中操作Workspace资源:使用托管标识
不需要硬编码服务主体的任何敏感凭据,由Azure自动管理身份凭证:
- 给你的在线端点配置系统分配/用户分配托管标识,在Azure门户的端点「标识」页开启即可,随后给该托管标识分配Azure ML工作区的对应访问权限(如数据集读取权限、工作区读取权限)
- 评分脚本中使用
DefaultAzureCredential自动获取托管标识凭证:
from azureml.core import Workspace from azure.identity import DefaultAzureCredential def init(): global ws # 不需要传入任何凭据参数,自动读取当前环境的托管标识 ws = Workspace( subscription_id="你的订阅ID", resource_group_name="你的资源组名", workspace_name="你的工作区名", auth=DefaultAzureCredential() )
内容的提问来源于stack exchange,提问作者Anirban Saha
相关产品推荐
相关产品推荐

