宣布 BentoML 1.4

2025 年 2 月 20 日 • 作者: Sherlock Xu

从 RAG 应用到多模型管道,AI 系统正变得越来越复杂。部署这些系统时,传统的开发工作流程往往会感觉像是阻碍。我们听到了您的痛点,尤其是在管理复杂环境、应对缓慢的迭代时间和克服部署瓶颈方面。

今天,我们很高兴宣布 BentoML 1.4,这是一个包含新功能和增强功能的主要版本,包括

  • Codespaces:借助云开发平台,迭代速度提升 20 倍
  • 新运行时配置 SDK:使用纯 Python 定义您的整个 Bento 运行时
  • 模型下载加速:比以往更快地加载 AI 模型
  • 外部依赖项:无缝连接到任何已部署的模型

这些功能是基于社区的真实反馈构建的,直接解决了您在构建 AI 应用时面临的挑战。现在,让我们深入了解这些改进将如何赋能您的开发工作流程!

使用 Codespaces 提升 20 倍迭代速度

想象一下:您正在构建一个具有多个模型的尖端 RAG 应用,每次进行微小代码更改时,您都在等待...等待...等待。您的本地 GPU 难以跟上,依赖项相互冲突,在您的机器上正常工作的代码在生产环境中神秘地崩溃。这就像试图在您的车库里建造一艘宇宙飞船,这在技术上是可行的,但效率极低。

我们看到了这些日常开发难题如何减缓 RAG 和 AI 代理等现代 AI 应用的部署。这就是为什么我们激动地推出 BentoML Codespaces——我们彻底解决这些难题的方案。

使用 BentoML Codespaces,您可以比以前快 20 倍地开发和迭代 AI 应用。入门就像运行以下命令一样简单

bentoml code

此命令将您的本地开发环境连接到 BentoCloud(我们的统一 AI 推理平台)上的远程沙盒。您在本地进行的每次更改都会在云端立即同步。以下是您可以做到的

  • 使用您喜欢的 IDE 开发和迭代 AI 应用
  • 利用强大的云 GPU 使用任何开源模型构建现代 AI 应用
  • 通过自动配置的环境消除依赖管理难题
  • 在云控制面板上通过实时更新和实时日志进行调试

总之,您可以获得比传统本地开发快 20 倍的迭代速度。您将能够专注于构建出色的 AI 应用,而不是与您的开发环境作斗争。

要了解其工作原理的更多信息,请参阅我们的博文 使用 BentoML Codespaces 加速 AI 应用开发BentoML 文档

新运行时 SDK:使用纯 Python 定义 Bento 规范

在早期版本中,用户需要在单独的文件(如 bentofile.yamlpyproject.toml)中设置 Bento 的运行时配置。虽然这可行,但这意味在构建 AI 服务时需要处理多个文件和上下文。我们听到了您关于这种分散配置方法的反馈,很高兴推出一个更直观、更统一的解决方案,即 BentoML 的新 Python SDK。

现在,您可以在单个 Python 文件 service.py 中直接与您的 Service 代码一起定义整个运行时环境。此更新使运行时配置更简单、更清晰、更动态

让我们快速看看它是如何工作的

import bentoml # Set the Bento Python version and required dependencies my_image = bentoml.images.PythonImage(python_version='3.11') \ .python_packages("torch", "transformers") @bentoml.service(image=my_image) class MyService: # Service implementation

将所有内容集中在一处,您可以充分利用 Python 中的动态特性(例如子类化),只需几行代码即可自定义您的运行时环境。

这种方法的另一个好处是缓存。如果镜像定义没有改变,BentoML 会智能地缓存层,避免不必要的重建。此外,我们大幅提高了镜像拉取速度——以前需要几分钟的操作现在只需几秒钟。

但这还不是全部。新 API 为您提供了对运行时环境各个方面的细粒度控制。您可以指定操作系统发行版和系统软件包等参数。以下是更多可用方法和参数

# Specify distro, system packages, use a requirements.txt file my_image = bentoml.images.PythonImage(python_version='3.11', distro='alpine') \ .system_packages("curl", "git") \ .requirements_file("requirements.txt")

新 API 最强大的功能之一是能够在构建过程中运行自定义命令run() 方法可以与其他配置选项链接在一起,让您完全控制您的构建管道

import bentoml image = bentoml.images.PythonImage(python_version='3.11') \ .run('echo "Starting build process..."') \ .system_packages("curl", "git") \ .run('echo "System packages installed"') \ .python_packages("pillow", "fastapi") \ .run('echo "Python packages installed"')

run() 是上下文敏感的,这意味着命令将按照正确的顺序执行。例如,放置在 .python_packages() 之前的命令将在安装 Python 依赖项之前运行。

注意:如果您偏好旧方法,我们仍然完全支持通过 bentofile.yamlpyproject.toml 进行配置。

有关详细信息,请查看 完整文档

闪电般的模型加载速度

如果您曾使用过 Hugging Face (HF) 等仓库中的大型模型,您会非常熟悉等待它们加载的痛苦。无论您是构建新镜像还是扩展部署,等待的宝贵时间都可能感觉像几个小时。这就是为什么我们在 BentoML 1.4 中引入了模型加载机制的显著改进。

在此版本中,BentoML 通过两种方式加速模型加载

  • 构建时下载:BentoML 现在在镜像构建期间下载模型,而不是在 Service 启动时。这些模型随后会被缓存并直接挂载到容器中。这意味着您的 Service 一旦启动即可立即使用它们,从而缩短冷启动时间并提高扩展性能。
  • 使用 safetensors 进行并行加载:BentoML 现在不是一次加载模型权重的一部分,而是同时加载模型的多部分。这对于大型模型尤其有利,因为顺序加载会导致显著延迟。

以下是使用新 API HuggingFaceModel 加载 HF 模型的示例。默认情况下,它返回下载的模型路径作为字符串,您可以直接将其传递给 transformers 等库

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)

对于托管在私有 HF 仓库中的模型,只需指定您的自定义端点即可

model_path = HuggingFaceModel("your_model_id", endpoint="https://my.huggingface.co/")

对于来自 HF 以外来源的模型,请使用 BentoModel

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"))

注意:始终在 Service 的类作用域中定义您的模型引用。这确保它们作为依赖项被正确跟踪,并在部署 Service 时可用。

更多信息,请参阅 模型加载和管理

通过外部部署依赖项调用任何 AI 服务

运行分布式 Services 一直是 BentoML 的一个关键特性。从编排 CPU 和 GPU 处理到配置多模型管道,BentoML 使连接 Services、优化资源利用率和高效扩展模型变得容易。

设置这些交互的核心方式是通过 bentoml.depends()。它允许一个 Service 调用另一个 Service 的方法,就像本地调用一样。BentoML 抽象了网络通信、序列化和反序列化的复杂性,因此您无需担心数据如何在 Services 之间传输。

以前,您只能依赖内部 BentoML Services

class ServiceA: service_b = bentoml.depends(ServiceB) @bentoml.api def predict(self, input: np.ndarray) -> int: # Call the predict function from ServiceB return int(self.service_b.predict(input)[0][0])

这对于本地 Services 非常有效,但是如何调用已部署在 BentoCloud 上或运行在其他服务器上的 AI 服务呢?我们听到了您对更大灵活性的需求,现在我们将 bentoml.depends() 的能力扩展到本地环境之外。

通过 BentoML 1.4,您可以轻松依赖任何已部署的模型,无论它托管在 BentoCloud 上还是运行在您自己的基础设施上。方法如下

import bentoml @bentoml.service class MyService: # `cluster` is optional if your Deployment is in a non-default cluster iris = bentoml.depends(deployment="iris-classifier-x6dewa", cluster="my_cluster_name") # Call the model deployed on BentoCloud by specifying its URL # iris = bentoml.depends(url="https://iris.example-url.bentoml.ai") # Call the model served elsewhere # iris = bentoml.depends(url="http://192.168.1.1:3000") @bentoml.api def predict(self, input: np.ndarray) -> int: # Call the predict function from the remote Deployment return int(self.iris.predict(input)[0][0])

无论您是调用本地 Service 还是远程 Deployment,语法完全相同。所有网络通信、序列化和反序列化的复杂性都由 BentoML 自动处理。

有关详细信息,请查看 BentoML 文档

结论

BentoML 1.4 为您的 AI 开发和部署过程带来了显著增强。从加速您的迭代周期到简化运行时配置,每个功能都旨在解决您日常面临的痛点。

一如既往,BentoML 的构建始终以您的需求为导向,我们迫不及待地想听听这些新功能如何帮助您将您的 AI 应用变为现实!

查看以下资源以了解更多并保持联系