python - 如何使用 requirements.txt 或类似的 pickle 对象

标签 python dependencies pickle data-science devops

问题

如何转储具有自身依赖项的 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 中的构建配置解析文件并执行以下操作:

  1. 解析定义文件。
  2. 找到预测代码
  3. 将 pickle 模型复制为预测器应用程序根文件夹中的 model.pickle
  4. 将预测器的 requirements.txt 与 pickle 模型的 requirements.txt 合并
  5. 创建virtualenv,安装依赖,将其作为轮子推送

作为流程的输出,我有一个包含 REST API 的包,该 API 使用 pickle 模型并暴露给定义的端口。

最佳答案

对于如此复杂的构建步骤,我使用了 Makefile对于本地系统,以及基于云的 MLOps,使用类似 AWS CodeBuild with sagemaker 的东西.

打包依赖项和执行以下构建步骤的示例如下,需要三个文件 ma​​in.py 包含代码的驱动函数, Pipfile 包含您的 virtualenv 和模型的依赖项:

  1. ma​​in.py
def main():
      do_something()

if __name__ == "__main__":
      main()

  1. 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"
  1. 生成文件
.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/

相关文章:

python - 具有来自单个列表的嵌套类别的字典

python - 在正则表达式中编写可重复单词的简短版本的最佳方法| Python

eclipse - Ant/Eclipse 提示工件 :dependencies

matlab - 保存\共享具有函数依赖关系的 matlab 代码

python - 如何在 modbus 寄存器中存储带符号的 16 位值

python - 为什么我无法下载该模块?

c++ - make/gmake 的条件依赖

pickle - 加载 XGBoost 模型 : ModuleNotFoundError: No module named 'sklearn.preprocessing._label'

python - 在 Python 中使用 cPickle 导入错误

python - 如何使用 pickle 文件组织 Python 项目?