如何在Azure端点评分脚本中访问数据资产以实现模型预测
在Azure ML端点中访问数据资产的正确方法
你的问题核心是直接使用公共Blob URL访问数据资产失败,这是因为Azure存储账户默认禁止匿名公共访问。以下是几种可靠的解决方案,帮助你在评分脚本中正确读取Azure数据资产:
方案1:将数据资产作为依赖项打包部署
把数据资产和模型一起打包到部署容器中,直接通过本地路径访问,无需额外权限配置。
操作步骤:
- 部署时指定数据资产为依赖项(支持Python SDK或CLI)
- 在评分脚本中通过环境变量获取数据资产的本地路径
评分脚本修改示例:
import os import logging import json import numpy import pickle import pandas as pd def init(): global model, historical_data # 加载模型 model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "ModelTest.sav") model = pickle.load(open(model_path,'rb')) # 读取数据资产:替换为你的数据资产名称 data_mount_path = os.getenv("AZUREML_DATAREFERENCES_HistoricalSalesData") historical_data = pd.read_csv(os.path.join(data_mount_path, "Data.csv")) logging.info("Init complete, model and historical data loaded") def run(raw_data): logging.info("model 1: request received") data = json.loads(raw_data)["data"] data = numpy.array(data) # 这里可以结合historical_data做预处理逻辑 result = model.predict(data) logging.info("Request processed") return result.tolist()
Python SDK部署配置示例:
from azure.ai.ml.entities import Deployment, Data from azure.ai.ml.constants import AssetTypes # 关联已注册的数据资产 data_asset = Data( name="HistoricalSalesData", version="1", type=AssetTypes.URI_FOLDER ) # 部署定义 deployment = Deployment( name="modeltest-endpoint", model="ModelTest:1", environment="azureml-openmpi4.1.0-ubuntu20.04", code_configuration={"code": "./score_scripts", "scoring_script": "score.py"}, data_references={"HistoricalSalesData": data_asset}, instance_type="Standard_DS3_v2", instance_count=1 )
方案2:挂载数据资产到容器路径
部署时直接将数据资产挂载到容器的指定目录,脚本中直接读取该路径即可。
CLI部署命令示例:
az ml model deploy \ --name modeltest-endpoint \ --model ModelTest:1 \ --score-script score.py \ --environment azureml-openmpi4.1.0-ubuntu20.04 \ --instance-type Standard_DS3_v2 \ --instance-count 1 \ --data "HistoricalSalesData@/mnt/historical_data"
评分脚本中读取数据:
# 在init函数中直接读取挂载路径 historical_data = pd.read_csv("/mnt/historical_data/Data.csv")
方案3:通过托管标识获取SAS URL访问
利用Azure ML的托管标识,获取数据资产的临时SAS URL,实现安全访问。
操作步骤:
- 给端点的托管标识分配存储账户的「存储Blob数据读取者」角色
- 在评分脚本中使用MLClient获取SAS URL并读取数据
评分脚本示例:
import pandas as pd from azure.ai.ml import MLClient from azure.identity import ManagedIdentityCredential import os def init(): global model, historical_data # 加载模型 model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "ModelTest.sav") model = pickle.load(open(model_path,'rb')) # 初始化MLClient ml_client = MLClient( credential=ManagedIdentityCredential(), subscription_id=os.getenv("AZUREML_SUBSCRIPTION_ID"), resource_group_name=os.getenv("AZUREML_RESOURCE_GROUP"), workspace_name=os.getenv("AZUREML_WORKSPACE_NAME"), ) # 获取数据资产的临时SAS URL data_asset = ml_client.data.get(name="HistoricalSalesData", version="1") sas_url = ml_client.data.get_uris(data_asset, timeout=3600)[0] # 读取数据 historical_data = pd.read_csv(sas_url) logging.info("Init complete, historical data loaded")
推荐方案
优先选择方案1或方案2,这两种方式无需额外配置权限,实现更简单,适合静态的历史数据场景;如果数据需要动态更新,可考虑方案3。
内容的提问来源于stack exchange,提问作者MikLUzz
相关产品推荐
相关产品推荐

