我正在尝试使用 mlflow.pyfunc.PythonModel
将私有(private) Python 包用作模型。
我的 conda.yaml
看起来像
channels:
- defaults
dependencies:
- python=3.10.4
- pip
- pip:
- mlflow==2.1.1
- pandas
- --extra-index-url <private-pypa-repo-link>
- <private-package>
name: model_env
python_env.yaml
python: 3.10.4
build_dependencies:
- pip==23.0
- setuptools==58.1.0
- wheel==0.38.4
dependencies:
- -r requirements.txt
requirements.txt
mlflow==2.1.1
pandas
--extra-index-url <private-pypa-repo-link>
<private-package>
运行以下命令时
import mlflow
model_uri = '<run_id>'
# Load model as a PyFuncModel.
loaded_model = mlflow.pyfunc.load_model(model_uri)
# Predict on a Pandas DataFrame.
import pandas as pd
t = loaded_model.predict(pd.read_json("test.json"))
print(t)
结果是
WARNING mlflow.pyfunc: Encountered an unexpected error (InvalidRequirement('Parse error at "\'--extra-\'": Expected W:(0-9A-Za-z)')) while detecting model dependency mismatches. Set logging level to DEBUG to see the full traceback.
在加载模式之前添加以下内容使其工作
dep = mlflow.pyfunc.get_model_dependencies(model_uri)
print(dep)
import subprocess
import sys
subprocess.check_call([sys.executable, "-m", "pip", "install", "-r", dep])
有没有办法自动安装这些依赖项而不是显式安装?我可以选择哪些选项来让 mlflow 安装私有(private)软件包?
最佳答案
在这里回答我自己的问题。事实证明,问题是我试图使用需要预先安装的 key 环库,并且在虚拟环境中进行推理时不支持该库。 不过,有一些方法可以解决这个问题。
将身份验证 token 添加到
extra-index-url
本身。您可以在 stackoverflow question 中找到它的记录。 .MlFlow 允许您使用
code_path
参数 ( link ) 记录与模型本身的任何依赖关系。使用此方法,您可以跳过添加私有(private)包的要求。这个question也涉及同一主题。代码看起来有点像这样。
mlflow.pyfunc.save_model(
path=dest_path,
python_model=MyModel(),
artifacts=_get_artifact_dict(t_dir),
conda_env=conda_env,
# Adding the current script file as dependency
code_path=[os.path.realpath(__file__), #Add any other script]
)
如果在 requirements.txt
中保存身份验证 token 可行,请选择第一种方法,否则使用第二种方法。使用 code_path
解决方案的缺点是,对于每个模型,您的包的代码都会被复制。
关于python - 加载MLFlow模型时如何加载私有(private)python包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75418655/