You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于MLflow在多租户环境中跨Azure订阅共享模型?

跨Azure订阅的Databricks中心化模型注册表实现方案

方案一:Azure Blob存储作为统一模型存储 + 自定义元数据管理

1. 搭建跨订阅可访问的Blob存储账户

  • 在独立订阅下创建Blob存储账户,给所有Databricks工作区的服务主体分配Storage Blob Data Contributor角色,确保跨订阅访问权限。
  • 为Blob容器启用版本控制和软删除,避免模型文件意外丢失。

2. 模型推送流程(Databricks端)

训练完成后,先将模型保存到本地临时路径,再上传到Blob的结构化路径(按模型名/版本号组织),同时记录模型元数据(版本、参数、指标等):

import mlflow
import os
from azure.storage.blob import BlobServiceClient

# 训练并保存模型到本地
with mlflow.start_run():
    # 替换为你的模型训练逻辑
    model = train_model()
    mlflow.sklearn.log_model(model, "model")
    local_model_path = mlflow.get_artifact_uri("model").replace("dbfs:/", "/dbfs/")

# 上传模型到跨订阅Blob存储
blob_service_client = BlobServiceClient.from_connection_string("<Blob连接字符串>")
container_client = blob_service_client.get_container_client("models-registry")
target_blob_path = f"models/my-model/v1/model"

# 递归上传模型目录下的所有文件
for root, _, files in os.walk(local_model_path):
    for file in files:
        local_file = os.path.join(root, file)
        blob_file_path = os.path.join(target_blob_path, os.path.relpath(local_file, local_model_path))
        with open(local_file, "rb") as data:
            container_client.upload_blob(blob_file_path, data, overwrite=True)

# 记录元数据(可保存到Blob的JSON文件或后续方案的SQL库)
metadata = {
    "model_name": "my-model",
    "version": 1,
    "training_workspace_id": "<Databricks工作区ID>",
    "metrics": mlflow.get_run(mlflow.active_run().info.run_id).data.metrics,
    "created_at": mlflow.active_run().info.start_time
}
container_client.upload_blob(f"models/my-model/v1/metadata.json", str(metadata))

3. 模型拉取流程(Databricks端)

根据元数据找到目标模型的Blob路径,下载到DBFS后加载使用:

from azure.storage.blob import BlobServiceClient
import mlflow.sklearn
import os

# 初始化Blob客户端
blob_service_client = BlobServiceClient.from_connection_string("<Blob连接字符串>")
container_client = blob_service_client.get_container_client("models-registry")

# 读取元数据,确定模型路径
metadata_blob = container_client.download_blob("models/my-model/v1/metadata.json")
metadata = eval(metadata_blob.readall().decode())
model_blob_path = f"models/my-model/v{metadata['version']}/model"

# 下载模型到DBFS临时路径
local_model_path = "/dbfs/tmp/models/my-model/v1"
dbutils.fs.mkdirs(local_model_path.replace("/dbfs/", "dbfs:/"))

# 递归下载模型文件
for blob in container_client.list_blobs(name_starts_with=model_blob_path):
    if not blob.name.endswith("/"):
        local_file = os.path.join(local_model_path, os.path.relpath(blob.name, model_blob_path))
        with open(local_file, "wb") as data:
            data.write(container_client.download_blob(blob.name).readall())

# 加载模型
model = mlflow.sklearn.load_model(local_model_path)

方案二:Azure SQL作为中心化元数据注册表 + Blob存储模型文件

用SQL存储结构化元数据,便于查询、版本管理和权限控制,Blob存实际模型文件。

1. 部署跨订阅可访问的Azure SQL数据库

  • 在独立订阅下创建Azure SQL,配置防火墙规则允许所有Databricks工作区的出站IP访问,或用Azure Private Link实现私有访问。
  • 创建模型注册表表:
CREATE TABLE ModelRegistry (
    ModelID INT IDENTITY(1,1) PRIMARY KEY,
    ModelName VARCHAR(100) NOT NULL,
    Version INT NOT NULL,
    BlobPath VARCHAR(500) NOT NULL,
    TrainingWorkspaceID VARCHAR(100) NOT NULL,
    TrainingParams NVARCHAR(MAX),
    Metrics NVARCHAR(MAX),
    CreatedAt DATETIME DEFAULT GETDATE(),
    UNIQUE(ModelName, Version)
)

2. 模型推送流程

上传模型到Blob后,向SQL插入元数据记录:

import pyodbc
# 模型上传到Blob的代码同方案一

# 插入元数据到SQL
conn_str = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=<SQL实例名>.database.windows.net;DATABASE=<库名>;UID=<用户名>;PWD=<密码>"
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
cursor.execute("""
    INSERT INTO ModelRegistry (ModelName, Version, BlobPath, TrainingWorkspaceID, TrainingParams, Metrics)
    VALUES (?, ?, ?, ?, ?, ?)
""", ("my-model", 1, "models/my-model/v1/model", "<工作区ID>", str(training_params), str(metrics)))
conn.commit()
conn.close()

3. 模型拉取流程

查询SQL获取模型Blob路径,再下载加载:

# 查询SQL获取模型路径
conn = pyodbc.connect(conn_str)
cursor = conn.cursor()
cursor.execute("SELECT BlobPath FROM ModelRegistry WHERE ModelName = ? AND Version = ?", ("my-model", 1))
row = cursor.fetchone()
model_blob_path = row[0]
conn.close()

# 下载并加载模型的代码同方案一

关键注意事项

  • 权限管理:优先用Azure AD身份验证替代连接字符串,给Databricks服务主体分配最小必要权限。
  • 一致性:推送时保证模型上传和元数据写入的原子性,可通过事务或幂等性设计避免数据不一致。
  • 性能优化:大模型采用Blob分块上传/下载,配合Databricks的并行处理提升传输效率。

内容的提问来源于stack exchange,提问作者steve jimenez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:36:32