本地将Databricks模型注册至AzureML时DBFS路径无法识别的问题问询
我有一批在Databricks中通过MLflow跟踪并注册的机器学习模型,需要将其注册到AzureML。模型的.pkl文件存储在DBFS上,在Databricks笔记本中运行代码可以正常执行,但在本地机器运行相同代码时,AzureML无法找到模型路径(会搜索本地项目路径),报错信息如下:
azureml.exceptions._azureml_exception.WebserviceException: WebserviceException:
Message: Error, provided model path "/dbfs/FileStore/path/to/model/model.pkl" cannot be found
InnerException None
ErrorResponse
{
"error": {
"message": "Error, provided model path "/dbfs/FileStore/path/to/model/model.pkl" cannot be found"
}
}
无论是否使用pyspark和databricks-connect运行代码,该问题都会出现。请问如何让AzureML指向正确的DBFS存储?
# 在Databricks中执行的安装命令:%pip install mlflow==2.1.1 azureml-sdk[databricks] azureml-mlflow import json import mlflow import os from azureml.core import Workspace, Experiment, Run from azureml.core.model import Model from azureml.core.authentication import ServicePrincipalAuthentication top_run_id = 123456789 top_run_dict = mlflow.get_run(top_run_id).to_dictionary() ### 连接到AZURE ML subscription_id = '<我的订阅ID>' resource_group = '<我的资源组>' workspace_name = '<我的工作区名称>' ## 配置AML与DB工作区的通信 svc_pr = ServicePrincipalAuthentication( tenant_id='<我的租户ID>', service_principal_id='<我的服务主体ID>', service_principal_password='<我的服务主体密码>' ) ws = Workspace( subscription_id=subscription_id, resource_group=resource_group, workspace_name=workspace_name, auth=svc_pr ) model_name = 'mlflow_local_azureml_test' model_uri = json.loads(mlflow.get_run(top_run_id).data.tags['mlflow.log-model.history'])[0]['flavors']['python_function']['artifacts']['model_path']['uri'] model_description = '测试模型' model_tags = { "Type": "RandomForest", "Run ID": top_run_id, "Metrics": mlflow.get_run(top_run_id).data.metrics } registered_model = Model.register( model_path=model_uri, model_name=model_name, tags=model_tags, description=model_description, workspace=ws )
核心原因
本地环境无法直接访问DBFS路径,AzureML的Model.register方法默认会从本地文件系统读取模型,而非远程的DBFS存储。
可行解决方法
方法1:通过MLflow模型URI直接注册(推荐)
无需解析mlflow.log-model.history获取本地路径,直接使用MLflow标准模型URI格式(runs:/<run_id>/model),AzureML支持通过该URI直接拉取模型。前提是本地MLflow已配置好与Databricks的连接:# 配置本地MLflow连接到Databricks(需提前设置DATABRICKS_HOST、DATABRICKS_TOKEN环境变量) mlflow.set_tracking_uri("databricks") # 用run_id构建模型URI model_uri = f"runs:/{top_run_id}/model" # 注册模型 registered_model = Model.register( model_path=model_uri, model_name=model_name, tags=model_tags, description=model_description, workspace=ws )方法2:下载DBFS模型到本地后注册
使用dbfs库或Databricks CLI将模型文件从DBFS下载到本地,再传入本地路径给Model.register:# 先安装dbfs库:pip install dbfs from dbfs import DBFS # 初始化DBFS客户端(替换为你的Databricks工作区URL和令牌) dbfs = DBFS(host="https://<databricks-workspace-url>", token="<databricks-token>") local_model_path = "./model.pkl" # 下载DBFS文件到本地 dbfs.download("/dbfs/FileStore/path/to/model/model.pkl", local_model_path) # 用本地路径注册模型 registered_model = Model.register( model_path=local_model_path, model_name=model_name, tags=model_tags, description=model_description, workspace=ws )方法3:将DBFS挂载的Blob Storage直接暴露给AzureML
如果模型存储在DBFS挂载的Azure Blob Storage中,可直接将Blob路径(如wasbs://container@storageaccount.blob.core.windows.net/path/to/model.pkl)作为model_path,同时确保AzureML的服务主体拥有该Blob存储的读取权限。
内容的提问来源于stack exchange,提问作者Kasia Kulma

