Migrer les versions de modèle du Workspace Model Registry vers Unity Catalog
Databricks recommande d'utiliser les modèles dans Unity Catalog pour une gouvernance améliorée, un partage facile entre les workspaces et les environnements, et des workflows MLOps plus flexibles. Pour migrer des versions de modèle du Workspace Model Registry vers Unity Catalog, Databricks recommande d'utiliser copy_model_version() avec le client MLflow >= 3.4.0:
import mlflow
from mlflow import MlflowClient
# Registry must be set to workspace registry
mlflow.set_registry_uri("databricks")
client = MlflowClient(registry_uri="databricks")
src_model_uri = f"models:/my_wmr_model/1"
uc_migrated_copy = client.copy_model_version(
src_model_uri, "mycatalog.myschema.my_uc_model"
)
Si le modèle de destination n'existe pas dans Unity Catalog, il est créé par cet appel d'API.
Signatures de modèle
Les modèles dans Unity Catalog nécessitent une signature. Si la version du modèle du Workspace n'a pas de signature, Databricks vous recommande d'en créer une en suivant les instructions de la documentation MLflow.
Pour simplifier la migration, vous pouvez utiliser la variable d’environnement MLFLOW_SKIP_SIGNATURE_CHECK_FOR_UC_REGISTRY_MIGRATION. Cette variable d'environnement est uniquement disponible lorsque vous utilisez copy_model_version() et nécessite MLflow version 3.4.0 ou une version ultérieure. Lorsque cette variable d'environnement est définie sur "true", une signature n'est pas requise.
Les versions de modèle enregistrées sans signature présentent des limitations. Voir Ajouter ou mettre à jour une signature pour une version de modèle existante.
import os
os.environ["MLFLOW_SKIP_SIGNATURE_CHECK_FOR_UC_REGISTRY_MIGRATION"] = "true"
Pour ajouter une signature à une version de modèle existante, consultez la documentation MLflow.
Script d'exemple pour migrer les versions de modèle vers un modèle Unity Catalog
Le script suivant montre comment migrer toutes les versions de modèle de votre modèle enregistré dans le Workspace vers un modèle Unity Catalog de destination. Ce script suppose que vous avez défini la variable d'environnement MLFLOW_SKIP_SIGNATURE_CHECK_FOR_UC_REGISTRY_MIGRATION sur « true », comme décrit dans Signatures de modèle.
import mlflow
from mlflow import MlflowClient
from mlflow.exceptions import MlflowException
from mlflow.models import ModelSignature
from mlflow.types.schema import Schema, ColSpec, AnyType
mlflow.set_registry_uri("databricks")
workspace_client = MlflowClient(registry_uri="databricks")
uc_client = MlflowClient(registry_uri="databricks-uc")
# Make a placeholder model that can be used to increment the version number
def make_placeholder_model() -> str:
class _Placeholder(mlflow.pyfunc.PythonModel):
def predict(self, ctx, x):
return None
with mlflow.start_run() as run:
schema = Schema([ColSpec(AnyType())])
model = mlflow.pyfunc.log_model(
name="m",
python_model=_Placeholder(),
signature=ModelSignature(inputs=schema, outputs=schema),
)
return f"models:/{model.model_id}"
# Check if the source model has a particular version number
def workspace_model_exists(name: str, version: int) -> bool:
try:
workspace_client.get_model_version(name, str(version))
return True
except MlflowException as e:
if e.error_code == "RESOURCE_DOES_NOT_EXIST":
# Convert the RESOURCE_DOES_NOT_EXIST error into False
return False
# Raise all other exceptions
raise e
# Copy model versions from a source Databricks workspace-registered model to
# a destination Databricks Unity Catalog registered model
def copy_model_versions_to_uc(src: str, dst: str) -> None:
latest_versions = workspace_client.get_latest_versions(src)
max_version_number = max(int(v.version) for v in latest_versions)
placeholder_model = make_placeholder_model()
for v in range(1, max_version_number + 1):
if workspace_model_exists(src, v):
workspace_client.copy_model_version(f"models:/{src}/{str(v)}", dst)
else:
# Create and immediately delete a placeholder model version to increment
# the version counter on the UC model, so the version numbers on the UC
# model match those on the workspace registered model.
mv = uc_client.create_model_version(dst, placeholder_model)
uc_client.delete_model_version(dst, mv.version)
copy_model_versions_to_uc("my_workspace_model", "mycatalog.myschema.my_uc_model")