如何在Azure机器学习工作区中无需本地下载,直接通过azureml://路径使用joblib加载模型
如何在Azure机器学习工作区中无需本地下载,直接通过azureml://路径使用joblib加载模型
我完全懂你想跳过本地下载、直接从Azure ML工作区加载模型的需求——反复下载确实挺繁琐的,尤其是测试阶段,能省一步是一步。不过得先说明:joblib本身并不支持直接解析azureml://这种专用URI,它只能读取本地文件路径或者标准的文件类流对象。不过我们可以通过Azure的SDK来绕开本地下载,直接通过内存流加载模型,下面给你两种干净的实现方式:
方法一:利用Azure Blob Storage SDK直接读取模型流
既然模型最终存在Azure Blob存储里,我们可以直接用Blob Storage的客户端来获取文件流,再传给joblib加载:
from azure.ai.ml import MLClient from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobClient import joblib # 初始化ML客户端,连接到你的工作区 ml_client = MLClient( DefaultAzureCredential(), subscription_id="4*****c", resource_group_name="mauromi-ml-wrkgp01", workspace_name="mmAmlsWksp02" ) # 获取已注册的模型对象 m_name = "iris_flat_model_from_cli" m_version = "你的模型版本号" model = ml_client.models.get(name=m_name, version=m_version) # 解析模型路径中的存储信息 # model.path格式为:azureml://datastores/<datastore-name>/paths/<blob-path>/ path_parts = model.path.split("/") datastore_name = path_parts[3] # 拼接完整的模型文件blob路径(假设模型文件是model.pkl) blob_full_path = "/".join(path_parts[5:]) + "/model.pkl" # 获取数据存储的连接信息 datastore = ml_client.datastores.get(datastore_name) # 创建Blob客户端 blob_client = BlobClient( account_url=f"https://{datastore.account_name}.blob.core.windows.net", container_name=datastore.container_name, blob_name=blob_full_path, credential=DefaultAzureCredential() ) # 直接通过流加载模型,无需本地下载 with blob_client.open_read() as blob_stream: m = joblib.load(blob_stream) # 现在可以直接调用模型推理 result = m.predict_proba(你的输入数据)
方法二:使用Azure ML核心库的Datastore流下载
如果你习惯用旧版的azureml-core库,也可以通过Datastore的直接流下载功能来实现:
from azureml.core import Workspace, Datastore from azureml.core.model import Model import joblib # 加载工作区 ws = Workspace( subscription_id="4*****c", resource_group="mauromi-ml-wrkgp01", workspace_name="mmAmlsWksp02" ) # 获取模型对象 model = Model(ws, name="iris_flat_model_from_cli", version="你的模型版本号") # 获取模型所在的数据存储和文件路径 datastore = Datastore.get(ws, model.datastore_name) model_file_path = f"{model.path}/model.pkl" # 直接获取文件流并加载模型 with datastore.download_file(model_file_path, output_stream=True) as stream: m = joblib.load(stream) # 执行推理 predictions = m.predict_proba(你的输入数据)
为什么不能直接用joblib.load(azureml://...)?
简单来说,joblib是为本地文件系统设计的库,它没有内置对Azure ML专用URI的解析能力。要读取远程存储的模型,必须先通过Azure的SDK把远程文件转换成joblib能识别的流对象,这就是上面两种方法的核心逻辑。
备注:内容来源于stack exchange,提问作者Mauro Minella
相关产品推荐
相关产品推荐

