加载和管理模型¶
BentoML 提供了简单的 API,用于加载、存储和管理 AI 模型。
理解模型仓库¶
BentoML 提供了一个本地模型仓库来保存和管理模型,它本质上是 BentoML 维护的一个本地文件目录。它在以下几种场景中非常有用,包括
私有模型管理:对于为特定任务微调或训练的私有模型,使用 BentoML 的模型仓库提供了一种安全有效的方式来存储、版本化和访问它们。
模型编目:BentoML 的模型仓库有助于轻松编目和版本化模型,使您能够维护清晰的模型迭代记录并进行切换。
保存模型¶
您可以使用上下文管理器将模型注册到模型仓库中,使用 bentoml.models.create()
以确保模型的正确清理和保存。例如,您可以将 Hugging Face Transformers pipeline 保存到模型仓库中,如下所示
import transformers
import bentoml
model= "sshleifer/distilbart-cnn-12-6"
task = "summarization"
pipeline = transformers.pipeline(task, model=model)
with bentoml.models.create(
name='summarization-model', # Name of the model in the Model Store
) as model_ref:
pipeline.save_pretrained(model_ref.path)
print(f"Model saved: {model_ref}")
默认情况下,所有下载到模型仓库的模型都保存在目录 /home/user/bentoml/models/
中,每个模型都有一个特定的子目录。例如,上面的代码片段会将摘要模型保存到 /home/user/bentoml/models/summarization-model/
。您可以使用模型的 path
属性来检索保存模型的路径。
如果您磁盘上有一个现有模型,您可以通过 shutil
将其导入到 BentoML 模型仓库中。
import shutil
import bentoml
local_model_dir = '/path/to/your/local/model/directory'
with bentoml.models.create(
name='my-local-model', # Name of the model in the Model Store
) as model_ref:
# Copy the entire model directory to the BentoML Model Store
shutil.copytree(local_model_dir, model_ref.path, dirs_exist_ok=True)
print(f"Model saved: {model_ref}")
加载模型¶
BentoML 提供了一种加载 AI 模型的高效机制,以加速在 BentoCloud 上的模型部署,减少镜像构建时间和冷启动时间。
要从本地模型仓库或 BentoCloud 加载模型,请从 bentoml.models
实例化一个 BentoModel
并指定其模型标签。确保模型已存储在本地或 BentoCloud 中可用。
这里有一个例子
import bentoml
from bentoml.models import BentoModel
import joblib
@bentoml.service(resources={"cpu": "200m", "memory": "512Mi"})
class MyService:
# Define model reference at the class level
# Load a model from the Model Store or BentoCloud
iris_ref = BentoModel("iris_sklearn:latest")
def __init__(self):
self.iris_model = joblib.load(self.iris_ref.path_of("model.pkl"))
默认情况下,BentoModel
中的 __get__
返回一个 bentoml.Model
对象,这需要像 joblib.load
这样的额外工具来加载模型数据。
要从 Hugging Face (HF) 加载模型,请从 bentoml.models
实例化一个 HuggingFaceModel
类并指定 HF 上显示的模型 ID。对于受限的 Hugging Face 模型,请记住在加载模型之前将您的 Hugging Face API token 导出为环境变量。
这里有一个例子
import bentoml
from bentoml.models import HuggingFaceModel
from transformers import AutoModelForSequenceClassification, AutoTokenizer
@bentoml.service(resources={"cpu": "200m", "memory": "512Mi"})
class MyService:
# Specify a model from HF with its ID
model_path = HuggingFaceModel("google-bert/bert-base-uncased")
def __init__(self):
# Load the actual model and tokenizer within the instance context
self.model = AutoModelForSequenceClassification.from_pretrained(self.model_path)
self.tokenizer = AutoTokenizer.from_pretrained(self.model_path)
默认情况下,HuggingFaceModel
返回下载的模型路径作为字符串,这意味着您可以直接将路径传递给像 transformers
这样的库来加载模型。
如果您的模型托管在私有仓库中,请通过 endpoint
参数指定您的端点 URL,该参数默认为 https://hugging-face.cn/
。
model_path = HuggingFaceModel("your_model_id", endpoint="https://my.huggingface.co/")
将 HF 模型部署到 BentoCloud 后,您可以在 Bento 详情页面查看和验证它。它由 HF 图标表示。单击它可以将您重定向到 HF 上的模型页面。

使用 BentoModel
或 HuggingFaceModel
时,必须从 Service 的类作用域加载模型。将模型定义为类变量会将其声明为 Service 的依赖项,确保在传输和部署 Bento 时模型被引用。如果您在 Service 类的构造函数中调用这两个 API,模型将不会被 Bento 引用。因此,它将不会被推送或部署,从而导致模型 NotFound
错误。
注意
BentoML 以两种主要方式加速模型加载。首先,使用 BentoModel
或 HuggingFaceModel
时,模型是在镜像构建期间下载,而不是在 Service 启动时。下载的模型会被缓存并直接挂载到容器中,从而显著减少冷启动时间并提高扩展性能,特别是对于大型模型。其次,BentoML 通过使用 safetensors 进行并行加载来优化实际的加载过程本身。模型权重不再按顺序加载,而是同时加载模型的多个部分。
更多信息,请参阅Bento 和模型 API。
管理模型¶
将模型保存到模型仓库并检索它是模型管理的两个最常见用例。除此之外,您还可以使用 BentoML CLI 或管理 API 执行其他操作。
CLI 命令¶
您可以使用 BentoML CLI 对模型执行以下操作。
列出所有可用模型
$ bentoml models list
Tag Module Size Creation Time
summarization-model:btwtmvu5kwqc67i3 1.14 GiB 2023-12-18 03:25:10
获取特定模型的信息
$ bentoml models get summarization-model:latest
name: summarization-model
version: btwtmvu5kwqc67i3
module: ''
labels: {}
options: {}
metadata:
model_name: sshleifer/distilbart-cnn-12-6
task_name: summarization
context:
framework_name: ''
framework_versions: {}
bentoml_version: 1.1.10.post84+ge2e9ccc1
python_version: 3.9.16
signatures: {}
api_version: v1
creation_time: '2023-12-18T03:25:10.972481+00:00'
您可以将 BentoML 模型仓库中的模型导出为独立的归档文件,并在团队之间共享或在不同的构建阶段之间移动。例如
$ bentoml models export summarization-model:latest .
Model(tag="summarization-model:btwtmvu5kwqc67i3") exported to ./summarization-model-btwtmvu5kwqc67i3.bentomodel
$ bentoml models import ./summarization-model-btwtmvu5kwqc67i3.bentomodel
Model(tag="summarization-model:btwtmvu5kwqc67i3") imported
您可以将模型导出到外部存储设备(如 AWS S3、GCS、FTP 和 Dropbox)或从中导入模型。例如
pip install fs-s3fs *# Additional dependency required for working with s3*
bentoml models export summarization-model:latest s3://my_bucket/my_prefix/
BentoCloud 提供了一个集中式的模型仓库,具有灵活的 API 和 Web 控制台,用于管理您的团队创建的所有模型。在您登录 BentoCloud后,使用 bentoml models push
和 bentoml models pull
将您的模型上传到 BentoCloud 并从中下载
$ bentoml models push summarization-model:latest
Successfully pushed model "summarization-model:btwtmvu5kwqc67i3" │
$ bentoml models pull summarization-model:latest
Successfully pulled model "summarization-model:btwtmvu5kwqc67i3"
$ bentoml models delete summarization-model:latest -y
INFO [cli] Model(tag="summarization-model:btwtmvu5kwqc67i3") deleted
提示
运行 bentoml models --help
命令了解更多 CLI 用法。
Python API¶
除了 CLI 命令,BentoML 还提供了等效的 Python API 用于管理模型。
bentoml.models.list
返回 bentoml.Model
实例列表
import bentoml
models = bentoml.models.list()
import bentoml
bentoml.models.export_model('iris_clf:latest', '/path/to/folder/my_model.bentomodel')
bentoml.models.import_model('/path/to/folder/my_model.bentomodel')
您可以将模型导出到外部存储设备(如 AWS S3、GCS、FTP 和 Dropbox)或从中导入模型。例如
bentoml.models.import_model('s3://my_bucket/folder/my_model.bentomodel')
如果您有权访问 BentoCloud,您还可以将本地模型推送到 BentoCloud 或从中拉取模型。
import bentoml
bentoml.models.push("summarization-model:latest")
bentoml.models.pull("summarization-model:latest")
import bentoml
bentoml.models.delete("summarization-model:latest")