如何使用 requirements.txt 或类似的 pickle 对象
How to use requirements.txt or similar for a pickle object
问题
如何转储具有自身依赖项的 pickle 对象?
pickle对象一般是从notebook生成的。
我尝试为笔记本创建 virtualenv
来跟踪依赖关系,但是这样我不仅得到了 pickle 对象的导入,还得到了应用程序其他地方使用的更多对象,这很好足够但不是最好的解决方案。
背景
我想要实现的目标
我正在尝试构建 MLOps 流程。快速解释:MLOps 是一个流行词,与 DevOps for machine learning 同义。不同的公司提供了不同的 PaaS/SaaS 解决方案,他们通常解决以下问题:
- 从模型
创建 Web API 的自动化
- 处理requirements/dependencies
- 存储和 运行 用于模型生成、模型二进制和数据集的脚本。
我将跳过存储部分并专注于前两个。
我是如何努力实现的
在我的例子中,我正在尝试使用良好的旧 TeamCity 设置此流程,其中模型是由 sk-learn 生成的 pickle 对象。要求是:
- 依赖项必须明确定义
- 必须支持其他 pickle 对象(而不是 sk-learn)。
- 数据科学家的工作流程如下所示:
- 数据科学家 使用
requirements.txt
上传泡菜模型。
- 数据科学家 提交了一个如下所示的定义文件:
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 wrapper/layer,可将模型加载到内存中并提供来自休息端点的预测。
然后 TeamCity 中的构建配置解析文件并执行以下操作:
- 解析定义文件。
- 找到预测代码
- 将 pickle 模型复制为 model.pickle 到预测器应用程序根文件夹
- 将预测器
requirements.txt
与泡菜模型 requirements.txt
合并
- 创建 virtualenv,安装依赖项,将其作为 wheel 推送
作为流程的输出,我有一个包含 REST API 的包,它使用 pickle 模型并暴露给定义的端口。
对于如此复杂的构建步骤,我使用 Makefile for on-prem system, and on cloud-based MLOps using something like AWS CodeBuild with sagemaker。
打包依赖项的示例如下,执行以下构建步骤需要三个文件 main.py 包含代码的驱动程序函数,Pipfile 包含您的 virtualenv 和模型的依赖项:
- main.py
def main():
do_something()
if __name__ == "__main__":
main()
- Pipfile
[[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
问题
如何转储具有自身依赖项的 pickle 对象?
pickle对象一般是从notebook生成的。
我尝试为笔记本创建 virtualenv
来跟踪依赖关系,但是这样我不仅得到了 pickle 对象的导入,还得到了应用程序其他地方使用的更多对象,这很好足够但不是最好的解决方案。
背景
我想要实现的目标
我正在尝试构建 MLOps 流程。快速解释:MLOps 是一个流行词,与 DevOps for machine learning 同义。不同的公司提供了不同的 PaaS/SaaS 解决方案,他们通常解决以下问题:
- 从模型 创建 Web API 的自动化
- 处理requirements/dependencies
- 存储和 运行 用于模型生成、模型二进制和数据集的脚本。
我将跳过存储部分并专注于前两个。
我是如何努力实现的
在我的例子中,我正在尝试使用良好的旧 TeamCity 设置此流程,其中模型是由 sk-learn 生成的 pickle 对象。要求是:
- 依赖项必须明确定义
- 必须支持其他 pickle 对象(而不是 sk-learn)。
- 数据科学家的工作流程如下所示:
- 数据科学家 使用
requirements.txt
上传泡菜模型。 - 数据科学家 提交了一个如下所示的定义文件:
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 wrapper/layer,可将模型加载到内存中并提供来自休息端点的预测。
- 数据科学家 使用
然后 TeamCity 中的构建配置解析文件并执行以下操作:
- 解析定义文件。
- 找到预测代码
- 将 pickle 模型复制为 model.pickle 到预测器应用程序根文件夹
- 将预测器
requirements.txt
与泡菜模型requirements.txt
合并 - 创建 virtualenv,安装依赖项,将其作为 wheel 推送
作为流程的输出,我有一个包含 REST API 的包,它使用 pickle 模型并暴露给定义的端口。
对于如此复杂的构建步骤,我使用 Makefile for on-prem system, and on cloud-based MLOps using something like AWS CodeBuild with sagemaker。
打包依赖项的示例如下,执行以下构建步骤需要三个文件 main.py 包含代码的驱动程序函数,Pipfile 包含您的 virtualenv 和模型的依赖项:
- main.py
def main():
do_something()
if __name__ == "__main__":
main()
- Pipfile
[[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