在 Databricks 上的 mlflow.pyfunc 模型中使用 code_path

2024-04-18

我们在 AWS 基础设施上使用 Databricks,在mlflow。 我们将项目内导入写为from src.(module location) import (objects).

按照网上的例子,我期望当我使用时mlflow.pyfunc.log_model(..., code_path=['PROJECT_ROOT/src'], ...),这会将整个代码树添加到模型的运行环境中,从而允许我们保持导入不变。

记录模型时,我得到一长串[Errno 95] Operation not supported,我们仓库中的每个笔记本都有一个。这会阻止我们将模型注册到 mlflow。

我们使用了几种临时解决方案和变通方法,从强迫自己使用一个文件中的所有代码,到仅使用同一目录中的文件(code_path=['./filename.py'],添加特定的库(并相应地更改导入路径)等。

然而,这些都不是最佳的。因此,我们要么重复代码(杀死 DRY),要么在包装器中放入一些导入(即那些无法在我们的工作环境中运行的导入,因为它与模型部署时遇到的环境不同)等。

我们还没有尝试将所有笔记本(我们认为这会导致[Errno 95] Operation not supported)在一个单独的文件夹中。这将对我们当前的情况和流程造成极大的破坏,我们希望尽可能避免这种情况。

请指教


当我使用 Databricks 中的自定义模型逻辑时,我也遇到了类似的困难。src目录(类似结构cookiecutter 数据科学 https://github.com/drivendata/cookiecutter-data-science)。解决方案是记录整个src使用相对路径的目录。

因此,如果您有以下项目结构。

.
├── notebooks
│   └── train.py
└── src
    ├── __init__.py
    └── model.py

Your train.py应该看起来像这样。注意 AddN 来自MLflow 文档 https://mlflow.org/docs/latest/models.html#example-creating-a-custom-add-n-model.

import mlflow

from src.model import AddN

model = AddN(n=5)

mlflow.pyfunc.log_model(
    registered_model_name="add_n_model",
    artifact_path="add_n_model",
    python_model=model,
    code_path=["../src"],
)

这将复制所有代码src/并将其记录在 MLflow 工件中,允许模型加载所有依赖项。

如果您没有使用notebooks/目录,您将设置code_path=["src"]。如果您使用像这样的子目录notebooks/train/train.py,你将设置code_path=["../../src"].

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Databricks 上的 mlflow.pyfunc 模型中使用 code_path 的相关文章

随机推荐