【问题标题】:Packaging Libraries with ML models in Python [closed]在 Python 中使用 ML 模型打包库 [关闭]
【发布时间】:2020-11-30 04:55:06
【问题描述】:

我有一个用于情绪分析的保存模型以及代码和数据。我正在尝试创建一个库,该库将具有此代码的功能并使用此训练有素的模型。我不明白如何合并依赖它的模型和功能。

谁能指导我具体怎么做?

编辑:使用pickle是我采用的方法(在下面回答)

【问题讨论】:

    标签: python machine-learning module libraries python-packaging


    【解决方案1】:

    如果你想正确维护这样一个库,你需要知道三件事:

    • 如何构建包
    • 如何对包进行版本控制
    • 如何分发包

    有几种方法可以做到这一点,目前最用户友好的可能是poetry,所以我将使用它作为示例。如果您想将此帖子用作教程,请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:包含定义模型的类定义和特性
    • 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:诗歌打包这段代码所需的元数据文件,与此非常相似:
    [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,但你也可以设置一个私有的PyPI实例and tell poetry about it,或者在其他地方手动上传

    【讨论】:

    • 非常感谢您的帮助。我遵循了这一点并成功地制作了一个图书馆。但是,我想在分发之前对其进行测试。如何使用 .tar 和 .whl 做到这一点?是像 pip install packagename 这样的命令还是我需要先分发?
    • 不客气 =) 是的,您可以使用 pip install modelpersisterf-0.1.0-py3-none-any.whl 之类的东西安装它们。一个很好的测试,看看你的 .whl 和 .tar 是否良好,可以创建新的虚拟环境并使用上述 pip 命令将其安装到其中。
    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2018-03-24
    • 2022-01-18
    • 2018-11-11
    相关资源
    最近更新 更多