直接在用户的设备上运行强大的大语言模型 (LLM),可以打造出大幅提升产品体验的功能。这些模型在离线时也可用,因此用户可以随时使用,而优越的成本效益(并非按每次 API 调用收费)使其适用于文本总结或校对等高频任务。
然而,在广泛的边缘硬件上部署这些千兆字节级模型,同时实现亚秒级的首 Token 时间 (TTFT) 延迟速度和所需的输出质量是一项重大的技术挑战。我们已经在 LiteRT-LM 中解决这些问题。
今天,我们很高兴能对开发者开放 LiteRT-LM 的直接访问权限。LiteRT-LM 是一种可用于生产环境的推理框架,为迄今为止 Gemini Nano 在 Google 产品中的一些最广泛部署提供支持。这款经过实战考验的引擎可通过 MediaPipe LLM 推理 API,在 Chrome、Chromebook Plus 和 Pixel Watch 等产品以及其他开源模型中实现设备端 Gemini Nano 和 Gemma 部署。
您已经可以利用 MediaPipe LLM 推理 API、Chrome 内置 AI API 和 Android AICore 等高阶 API 在设备端运行 LLM。但现在,我们首次提供 LiteRT-LM 引擎的底层 C++ 界面(预览版)。这种低级别访问使您能为自己的应用构建定制的高性能 AI 流水线,在您选择的平台上释放该引擎成熟的技术和优化的性能。立即利用我们的 API 开始构建 LLM 驱动的应用,体验这种优化的性能吧。
具体来说,LiteRT-LM 正在为以下功能提供支持:
LiteRT-LM 是一个经过生产环境测试的推理框架,专为运行大语言模型(如 Gemini Nano、Gemma)而设计,可在各种边缘设备上高性能运行。LiteRT-LM 的核心是一个完全开源的项目,该项目提供一个易于集成的 API 和一组可重用的模块。这使开发者能够根据其产品功能要求构建精确定制 LLM 流水线。
要了解 LiteRT-LM 的适用范围,请查看完整的 Google AI Edge 堆栈,包括从最低层到最高层的抽象:
这种分层结构使您可以灵活选择在最适合项目需求的抽象层上工作,而 LiteRT-LM 为试图直接在用户设备上大规模部署大语言模型 (LLM) 的开发者提供了核心能力和适应性。
LiteRT-LM 的主要亮点包括:
我们将通过两个案例研究展示这种多功能性,这两个案例研究重点介绍 LiteRT-LM 的大规模部署能力。该框架可部署至数亿台设备,包括 Chrome 浏览器、Chromebook 和最新的 Pixel Watch。
新式 LLM 的千兆字节规模带来了独特的部署挑战。与传统的机器学习模型(通常为兆字节)不同,LLM 的庞大规模使之无法在同一边缘设备上部署多个专门的数十亿参数模型(例如,一个用于总结,另一个用于聊天)来支持不同的功能。
为解决这个问题,我们使 LiteRT-LM 允许多个功能共享单个基础模型,使用轻量级 LoRA 进行针对特定功能的定制。这可以通过一个清晰的架构模式来实现:该模式将庞大的共享资源与用户互动的可配置和有状态资源分开。我们通过两个核心类来实现这种分离,即引擎和会话:
此架构由关键的优化提供支持,可实现低空间占用的高效任务切换1:
会话
都封装其完整的“上下文”,包括 Transformer 的 KV 缓存、LoRA 权重等。与操作系统类似,在切换不同任务时,LiteRT-LM 会保存传出会话
的状态并恢复传入会话。这可确保共享 LLM 始终获取活动任务的正确状态。会话
。这能有效地在特定时候缓存计算的 KV 缓存状态,允许多个新任务从该状态发展出分支,并免去大量计算工作。会话
不会立即复制 KV 缓存,而是创建对原始缓冲区的引用。只有当会话
即将重写与其他会话内容冲突的新数据时,才会实际执行复制。这种设计使克隆速度极快(<10 毫秒),并通过重用 KV 缓存缓冲区将内存占用降至最低。这些架构和优化功能共同成为在 Chrome 和 Chromebook Plus 中成功打造多种高性能、设备端 LLM 功能的关键。
除了管理并发任务之外,跨分散的设备 SKU 扩展 ML 模型还存在第二个主要技术障碍。每个 SoC 在组件和功能(跨 CPU、GPU 和 NPU)上都有所不同,需要对高性能运行模型推理进行自定义优化。LiteRT-LM 利用 LiteRT 作为后端委派的低级别运行时,使其能够在多个硬件加速器之间有效扩展。此外,LiteRT-LM 通过将特定平台组件(如文件描述符和 mmap)抽象化的核心设计实现广泛的平台兼容性,并在必要时提供原生实现。
1请注意,此处提到的一些优化未包含在此早期预览版中,但将在未来版本中逐步发布。
在资源严重受限的设备(如 Pixel Watch )上部署 LLM 面临着完全不同的挑战。在这些平台上,优先事项不再是用共享模型支持多个功能,而是用尽可能小的二进制文件和内存占用部署单个专用功能。
在这方面,LiteRT-LM 的模块化设计变得至关重要。虽然我们的引擎/会话架构功能强大,可用于管理复杂的多任务部署,但其二进制文件占用空间过大,不足以满足可穿戴设备的严格要求。
相反,该框架可让开发者直接从其核心组件构建自定义流水线。对于 Pixel Watch,我们选择了最低要求的模块(例如执行器、分词器和采样器),并搭建了一个专门的流水线。这种方法使我们能够最大限度地减少二进制文件大小和内存用量,满足设备的资源限制,如下图所示。
本案例研究展示了 LiteRT-LM 的灵活性。其模块化组件使开发者能够创建精准定制的 LLM 部署,满足任何目标设备(从功能强大的智能手机到资源有限的可穿戴设备)的特定资源和功能要求。
开始使用并为您的用户提供强大、高效的设备端生成式 AI。
#include "YOUR_INCLUDE_DIRECTORY/engine.h"
// ...
// 1. Define model assets and engine settings.
auto model_assets = ModelAssets::Create(model_path);
CHECK_OK(model_assets);
auto engine_settings = EngineSettings::CreateDefault(
model_assets, litert::lm::Backend::CPU);
// 2. Create the main Engine object.
absl::StatusOr<std::unique_ptr<Engine>> engine = Engine::CreateEngine(engine_settings);
CHECK_OK(engine);
// 3. Create a Session for a new conversation.
auto session_config = SessionConfig::CreateDefault();
absl::StatusOr<std::unique_ptr<Engine::Session>> session = (*engine)->CreateSession(session_config);
CHECK_OK(session);
// 4. Generate content using the high-level API.
absl::StatusOr<Responses> responses = (*session)->GenerateContent(
{InputText("What is the tallest building in the world?")});
CHECK_OK(responses);
// 5. Print the response.
std::cout << *responses << std::endl;
我们要特别感谢以下主要贡献者为本项目所做的基础工作:Advait Jain、Austin Sullivan、Clark Duvall、Haoliang Zhang、Ho Ko、Howard Yang、Marissa Ikonomidis、Mohammadreza Heydary、Ronghui Zhu、Tyler Mullen、Umberto Ravaioli、Weiyi Wang、Xu Chen、Youchuan Hu
我们还要感谢以下团队成员的重大贡献:Agi Sferro、Chi Yo Tsai、David Massoud、Dillon Sharlet、Frank Barchard、Grant Jensen、Ivan Grishchenko、Jae Yoo、Jim Pollock、Majid Dadashi、Quentin Khan、Raman Sarokin、Ricky Liang、Tenghui Zhu、Terry (Woncheol) Heo、Yi-Chun Kuo、Yishuang Pang
这项成果离不开领导层的指导和支持:Cormac Brick、Etienne Noël、Juhyun Lee、Lu Wang、Matthias Grundmann 和 Sachin Kotwani。