如何让Azure ML Service Web服务访问数据存储(Datastore)?
实现Azure ML Service Web服务访问数据存储的方案
其实在Azure ML的Web服务里访问数据存储完全可行,只是得在评分脚本和部署配置里做些额外设置,我给你整理几个常用的靠谱方案:
方法一:在评分脚本中用Azure ML SDK直接访问数据存储
这是最灵活的方式,不需要修改计算目标的配置,直接在score.py里借助SDK连接数据存储读取特征数据。
第一步:确保部署环境包含Azure ML SDK
Web服务的运行环境里得安装azureml-core包,你可以在环境定义里添加这个依赖:
from azureml.core import Environment # 创建自定义环境 env = Environment(name="my-scoring-env") conda_dep = env.python.conda_dependencies # 添加Azure ML SDK依赖 conda_dep.add_pip_package("azureml-core") # 添加你的模型依赖,比如scikit-learn conda_dep.add_pip_package("scikit-learn==1.2.2") # 其他必要依赖按需添加
第二步:在评分脚本中连接数据存储并读取数据
修改你的score.py,在预测逻辑里加入访问数据存储的代码。注意用托管身份或者服务主体认证,绝对别硬编码凭据:
import pickle import pandas as pd from azureml.core import Workspace, Datastore def init(): global model, workspace # 加载训练好的模型 model_path = "model.pkl" with open(model_path, "rb") as f: model = pickle.load(f) # 用托管身份自动连接工作区(无需手动输入密钥) workspace = Workspace.from_config() def run(raw_data): # 解析输入的请求数据,提取客户ID这类关键标识 input_data = pd.read_json(raw_data) customer_id = input_data["customer_id"].iloc[0] # 获取目标数据存储 datastore = Datastore.get(workspace, datastore_name="your_datastore_name") # 读取数据存储里的特征文件(这里以Blob存储的parquet文件为例) # 路径格式根据你的数据存储类型调整 feature_file_path = f"az://{datastore.container_name}/features/customer_{customer_id}.parquet" feature_data = pd.read_parquet(feature_file_path, storage_options=datastore._get_storage_options()) # 合并输入数据和历史特征 combined_data = pd.merge(input_data, feature_data, on="customer_id") # 执行预测并返回结果 prediction = model.predict(combined_data) return {"prediction": prediction.tolist()}
关键注意点
- 如果用托管身份部署Web服务,要给托管身份分配对应数据存储的访问权限(比如Blob存储的读取权限);
- 不同类型的数据存储(比如ADLS Gen2、SQL DB)的访问逻辑略有不同,你可以根据实际类型调整读取代码。
方法二:将数据存储挂载到Web服务的计算目标
如果你的Web服务部署在AKS或者Azure ML计算实例上,可以把数据存储直接挂载到计算目标的文件系统,这样评分脚本就能像访问本地文件一样读取数据,性能会更好。
第一步:部署时配置数据存储挂载
在部署配置里添加挂载设置:
from azureml.core.webservice import AksWebservice from azureml.core.model import InferenceConfig, Model from azureml.core.compute import AksCompute # 加载已有的AKS计算目标 aks_target = AksCompute(workspace, name="my-aks-cluster") # 定义推理配置(关联评分脚本和环境) inference_config = InferenceConfig( source_directory="./scoring_files", entry_script="score.py", environment=env ) # 配置数据存储挂载路径 datastore = Datastore.get(workspace, "your_datastore_name") mount_config = datastore.mount_configuration(mount_path="/mnt/feature_data") # 创建AKS部署配置,添加挂载设置 aks_config = AksWebservice.deploy_configuration( cpu_cores=1, memory_gb=2, mounts=[mount_config] ) # 部署Web服务 service = Model.deploy( workspace=workspace, name="customer-payment-service", models=[model], inference_config=inference_config, deployment_config=aks_config, deployment_target=aks_target ) service.wait_for_deployment(show_output=True)
第二步:在评分脚本中访问挂载的文件
此时你可以直接通过挂载路径读取数据,代码更简洁:
def run(raw_data): input_data = pd.read_json(raw_data) customer_id = input_data["customer_id"].iloc[0] # 直接读取挂载路径下的特征文件 feature_data = pd.read_parquet(f"/mnt/feature_data/features/customer_{customer_id}.parquet") # 合并数据并预测 combined_data = pd.merge(input_data, feature_data, on="customer_id") prediction = model.predict(combined_data) return {"prediction": prediction.tolist()}
方法三:批量预测(适合非实时场景)
如果你的预测是批量处理的(比如每天批量预测一次),可以用Azure ML的批量预测功能——它天生支持读取数据存储里的输入数据,处理完后还能把结果写回数据存储,不用单独搭建Web服务。
总结对比
- 方法一适合实时服务,灵活性高,无需修改计算目标;
- 方法二适合需要频繁读取大量数据的场景,性能更优;
- 方法三适合非实时批量处理的需求。
无论用哪种方法,都要优先用托管身份或服务主体做认证,绝对不要在代码里硬写凭据,避免安全风险。
内容的提问来源于stack exchange,提问作者Wellington Noberto
相关产品推荐
相关产品推荐

