在 Python 中使用 ML 模型打包库
Packaging Libraries with ML models in Python
我有一个已保存的情绪分析模型以及代码和数据。我正在尝试创建一个库,该库将具有此代码的功能并使用此训练有素的模型。我不知道如何合并模型和依赖于它的功能。
谁能指导我具体如何操作?
编辑:使用 pickle 是我使用的方法(在下面回答)
如果你想正确地维护这样一个库,你需要知道三件事:
- 如何构建包
- 如何对包进行版本控制
- 如何分发包
有几种方法可以做到这一点,如果您想将此 post 用作教程,目前最多 user-friendly 可能是 poetry
, so I'll use that as an example. It needs to be installed。
为了使用一些非常基本的项目框架,我假设您有类似的东西:
modelpersister
├───modelpersister
│ ├───model.pkl
│ ├───__init__.py
│ ├───model_definition.py
│ ├───train.py
│ └───analyze.py
└───pyproject.toml
model.pkl
:您要随包裹一起运送的模型工件
__init__.py
:空,needs to be there to make this folder a python module
model_definition.py
:包含 class 定义和定义模型的特征
train.py
:接受数据来训练你的模型并用结果覆盖当前的 model.pkl
文件,大致如下:
import pickle
from pathlib import Path
from modelpersister.model_definition import SentimentAnalyzer
# overwrite the current model given some new data
def train(data):
model = SentimentAnalyzer.train(data)
with open(Path(__file__).parent / "model.pkl") as model_file:
pickle.dump(model, model_file)
analyze.py
:在给定当前 model.pkl
的情况下接受数据点进行分析,大致如下:
import pickle
import importlib.resources
from modelpersister.model_definition import MyModel
# load the current model as a package resource (small but important detail)
with importlib.resources.path("modelpersister", "model.pkl") as model_file:
model: MyModel = pickle.load(model_file)
# make meaningful analyzes available in this file
def estimate(data_point):
return model.estimate(data_point)
pyproject.toml
: poetry 打包这段代码需要的元数据文件,和这个很像:
[tool.poetry]
name = "modelpersister"
version = "0.1.0"
description = "Ship a sentiment analysis model."
authors = ["Mishaal <my@mail.com>"]
license = "MIT" # a good default as far as licenses go
[tool.poetry.dependencies]
python = "^3.8"
sklearn = "^0.23" # or whichever ML library you used for your model definition
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
鉴于所有这些文件都充满了有意义的代码,并希望为项目使用比 modelpersister
更好的名称,您的工作流程将大致如下所示:
- 更新
model_definition.py
中的特征,使用 train.py
更好的数据训练模型,或在 analysis.py
中添加新函数,直到您觉得您的模型现在明显比以前更好
- 运行
poetry version minor
更新包版本
- 运行
poetry build
将您的代码和模型构建到源代码分发和 wheel 文件中,如果需要,您可以在 上执行一些最终测试
- 运行
poetry publish
分发您的包 - 默认到 global Python package index, but you can also set up a private PyPI instance and tell poetry
about it,或手动上传到其他地方
我有一个已保存的情绪分析模型以及代码和数据。我正在尝试创建一个库,该库将具有此代码的功能并使用此训练有素的模型。我不知道如何合并模型和依赖于它的功能。
谁能指导我具体如何操作?
编辑:使用 pickle 是我使用的方法(在下面回答)
如果你想正确地维护这样一个库,你需要知道三件事:
- 如何构建包
- 如何对包进行版本控制
- 如何分发包
有几种方法可以做到这一点,如果您想将此 post 用作教程,目前最多 user-friendly 可能是 poetry
, so I'll use that as an example. It needs to be installed。
为了使用一些非常基本的项目框架,我假设您有类似的东西:
modelpersister
├───modelpersister
│ ├───model.pkl
│ ├───__init__.py
│ ├───model_definition.py
│ ├───train.py
│ └───analyze.py
└───pyproject.toml
model.pkl
:您要随包裹一起运送的模型工件__init__.py
:空,needs to be there to make this folder a python modulemodel_definition.py
:包含 class 定义和定义模型的特征train.py
:接受数据来训练你的模型并用结果覆盖当前的model.pkl
文件,大致如下:
import pickle
from pathlib import Path
from modelpersister.model_definition import SentimentAnalyzer
# overwrite the current model given some new data
def train(data):
model = SentimentAnalyzer.train(data)
with open(Path(__file__).parent / "model.pkl") as model_file:
pickle.dump(model, model_file)
analyze.py
:在给定当前model.pkl
的情况下接受数据点进行分析,大致如下:
import pickle
import importlib.resources
from modelpersister.model_definition import MyModel
# load the current model as a package resource (small but important detail)
with importlib.resources.path("modelpersister", "model.pkl") as model_file:
model: MyModel = pickle.load(model_file)
# make meaningful analyzes available in this file
def estimate(data_point):
return model.estimate(data_point)
pyproject.toml
: poetry 打包这段代码需要的元数据文件,和这个很像:
[tool.poetry]
name = "modelpersister"
version = "0.1.0"
description = "Ship a sentiment analysis model."
authors = ["Mishaal <my@mail.com>"]
license = "MIT" # a good default as far as licenses go
[tool.poetry.dependencies]
python = "^3.8"
sklearn = "^0.23" # or whichever ML library you used for your model definition
[tool.poetry.dev-dependencies]
[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"
鉴于所有这些文件都充满了有意义的代码,并希望为项目使用比 modelpersister
更好的名称,您的工作流程将大致如下所示:
- 更新
model_definition.py
中的特征,使用train.py
更好的数据训练模型,或在analysis.py
中添加新函数,直到您觉得您的模型现在明显比以前更好 - 运行
poetry version minor
更新包版本 - 运行
poetry build
将您的代码和模型构建到源代码分发和 wheel 文件中,如果需要,您可以在 上执行一些最终测试
- 运行
poetry publish
分发您的包 - 默认到 global Python package index, but you can also set up a private PyPI instance and tellpoetry
about it,或手动上传到其他地方