有效ml开发的模块化模型
modmod的Python项目详细描述
modmod
mod mod是用于生成mod-ularmod-els的库。主要问题是 modmod solves是如何在运行时加载模型而不实例化它们 多次;在这方面,它本质上是一个依赖注入 模型系统。
安装
要使用modmod,只需以通常的方式将其与包管理器一起安装。如果 使用Pipenv可以复制/粘贴:
pipenv install modmod
用法
modmod主要有两部分:模型和池
Pool
是模型的容器。可以将Model
视为
函数,它是一个Model
工厂。
下面是定义最简单的可能模型的示例:
from modmod.model import Model
class AddThings(Model):
def call(self, x: int, y: int) -> int:
return x + y
下面是您将如何使用它:
import modmod.pool
pool = modmod.pool.get()
adder = pool.get(AddThings)
z = adder(1, 2)
print(z) # prints 3
也可以使用快捷方式获取模型:
adder = AddThings.get()
但是,这不应该在模型中完成,因为它将使用 默认池,如果有人试图使用 在非默认池中建模。
带初始化的模型
有时需要初始化模型以加载数据或执行其他一次性操作
启动任务。为此,只需重写构造函数和create
方法。下面是一个删除stopwords的示例:
import nltk
from modmod.model import Model
class RemoveStopwords(Model):
def __init__(self, pool: Pool, config: Dict[str, Any], stopwords: List[str]) -> None:
super().__init__(pool, config)
self.stopwords = stopwords
@classmethod
def create(cls, pool: Pool, config: Dict[str, Any]) -> 'RemoveStopwords':
nltk.download('stopwords')
stopwords = nltk.corpus.stopwords.words('english')
stopwords.append('')
stopwords.remove('not')
stopwords.remove('no')
return RemoveStopwords(pool, config, stopwords)
def call(self, words: List[str]) -> List[str]:
return list(filter(lambda w: w not in self.stopwords, words))
当您调用create
时,将调用RemoveStopwords.get()
方法。它是
只在获得模型时首先调用;之后,创建的模型
位于池中,不会重新初始化
为什么__init__
和create
都是必需的?这是个好问题。
原因归结于可配置性和在测试环境中的使用。
在上面的例子中,如果你想尝试一个新的列表
stopwords,您可以使用构造函数创建一个具有该列表的模型
然后将其添加到池中:
pool = modmod.pool.get('stopwords-experiment')
config = {}
remove_new_stopwords = RemoveStopwords(pool, config, ['stop', 'word', 'list'])
pool.add_model(remove_new_stopwords, RemoveStopwords)
一旦添加到池中,任何调用
RemoveStopwords.get('stopwords-experiment')
将找到并检索
手动创建的模型。
注意:create
如果你要做一个大手术,通常会被覆盖,
比如下载文件或者读取一些数据。如果你只是在用游泳池
而config对象,完全可以重写__init__
和
保留create
的默认行为。
配置池
每个模型都将配置传递给它们,而这来自池。 所以,如果需要配置,就需要配置池
注意:在获得任何模型之前,必须配置池,因为 配置它覆盖现有池。
要配置默认池:
import modmod.pool
config = {'opt1': 2}
modmod.pool.configure(config)
非默认池
有时,您需要单独的池来执行单独的任务。一个例子 用于单元测试:您可能希望使用 模型。为此,可以使用单独的池
第一步是配置池:
import modmod.pool
poolname = 'my-pool'
config = {'opt1': 2}
modmod.pool.configure(config, poolname)
第二步就是使用游泳池!
import modmod.pool
pool = modmod.pool.get('my-pool')
adder = pool.get(AddThings)
# Equivalent:
adder = AddThings.get('my-pool')
路线图
我们在路线图上有一些计划。每一个都将是一个版本凹凸:
- []添加对数据和模型版本控制的支持,添加对模型培训的支持
- []添加用于分析、调试、缓存的挂钩