问题
如何转储具有自身依赖项的 pickle 对象?
pickle对象一般是从notebook生成的。
我尝试为笔记本创建 virtualenv
来跟踪依赖关系,但是这样我不仅得到了 pickle 对象的导入,还得到了应用程序其他地方使用的更多对象,这是足够好,但不是最好的解决方案。
背景
我要达到的目标
我正在尝试构建 MLOps 流程。快速解释:MLOps 是一个流行词,是机器学习 DevOps 的同义词。不同的公司针对它提供了不同的PaaS/SaaS解决方案,它们通常解决以下问题:
- 从模型中自动创建网络 API
- 处理需求/依赖
- 存储和运行用于模型生成、模型二进制文件和数据集的脚本。
我将跳过存储部分并专注于前两个部分。
我是如何努力实现的
在我的例子中,我尝试使用良好的旧 TeamCity 设置此流程,其中模型是由 sk-learn 生成的 pickle 对象。要求是:
- 必须明确定义依赖关系
- 必须支持其他 pickle 对象(而不是 sk-learn)。
- 数据科学家的工作流程如下所示:
- 数据科学家 使用
requirements.txt
上传 pickle 模型。 - 数据科学家 提交了一个如下所示的定义文件:
apiPort: 8080 apiName: name-tagger model: model-repository.internal/model.pickle requirements: model-repository.internal/model.requirements predicterVersion: 1.0
- 其中预测器是一个 FLASK 应用程序,具有自己的
requirements.txt
。它是 pickle 模型的 API 包装器/层,可将模型加载到内存中并提供来自休息端点的预测。
- 数据科学家 使用
然后 TeamCity 中的构建配置解析文件并执行以下操作:
- 解析定义文件。
- 找到预测代码
- 将 pickle 模型复制为预测器应用程序根文件夹中的 model.pickle
- 将预测器的
requirements.txt
与 pickle 模型的requirements.txt
合并 - 创建virtualenv,安装依赖,将其作为轮子推送
作为流程的输出,我有一个包含 REST API 的包,该 API 使用 pickle 模型并暴露给定义的端口。
最佳答案
对于如此复杂的构建步骤,我使用了 Makefile对于本地系统,以及基于云的 MLOps,使用类似 AWS CodeBuild with sagemaker 的东西.
打包依赖项和执行以下构建步骤的示例如下,需要三个文件 main.py 包含代码的驱动函数, Pipfile 包含您的 virtualenv 和模型的依赖项:
- main.py
def main():
do_something()
if __name__ == "__main__":
main()
- Pip文件
[[source]]
url = 'https://pypi.python.org/simple'
verify_ssl = true
name = 'pypi'
[requires]
python_version = '2.7'
[common-packages]
scipy >= "0.17.0"
pandas
[model1-packages]
numpy >= "1.11.0"
[model2-packages]
numpy == "1.0.0"
- 生成文件
.DEFAULT_GOAL := run
init:
pipenv --three install
pipenv shell
analyze:
flake8 ./src
run_tests:
pytest --cov=src test/jobs/
run:
# cleanup
find . -name '__pycache__' | xargs rm -rf
# run the job
python main.py
在为您的用例自定义这 3 个文件后,可以使用以下命令执行该过程:
make run
关于python - 如何使用 requirements.txt 或类似的 pickle 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56150740/