【发布时间】:2019-10-02 16:19:42
【问题描述】:
问题
如何转储带有自身依赖项的 pickle 对象?
pickle 对象一般是从笔记本生成的。
我尝试为笔记本创建virtualenv 以跟踪依赖关系,但是这样我不仅获得了pickle 对象的导入,还获得了在应用程序的其他地方使用的更多对象,这已经足够好但不是最佳解决方案。
背景
我正在努力实现的目标
我正在尝试构建 MLOps 流程。快速解释:MLOps 是一个流行词,与 用于机器学习的 DevOps 同义。不同的公司为其提供了不同的 PaaS/SaaS 解决方案,它们通常解决以下问题:
- 从模型创建 Web API 的自动化
- 处理需求/依赖关系
- 存储和运行用于模型生成、模型二进制和数据集的脚本。
我将跳过存储部分并专注于前两个。
我的目标是什么
在我的情况下,我正在尝试使用良好的旧 TeamCity 设置此流程,其中模型是由 sk-learn 生成的泡菜对象。要求是:
- 必须明确定义依赖关系
- 必须支持其他 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- 其中 predicter 是一个带有自己的
requirements.txt的 FLASK 应用程序。它是 pickle 模型的 API 包装器/层,可将模型加载到内存中并提供来自 rest 端点的预测。
-
数据科学家使用
然后 TeamCity 中的构建配置解析文件并执行以下操作:
- 解析定义文件。
- 查找预测代码
- 在预测器应用程序根文件夹中将 pickle 模型复制为 model.pickle
- 将预测器的
requirements.txt与泡菜模型的requirements.txt合并 - 创建 virtualenv,安装依赖项,将其作为轮子推送
作为流程的输出,我有一个包含 REST API 的包,该 API 使用 pickle 模型并公开给定义的端口。
【问题讨论】:
标签: python dependencies pickle data-science devops