La ejecución de modelos de lenguaje grande (LLM) potentes directamente en el dispositivo de un usuario permite el acceso a funciones que pueden mejorar significativamente las experiencias de los productos. Su disponibilidad offline hace que estén disponibles fácilmente en todo momento, mientras que su rentabilidad (sin costos por llamada API) los hace prácticos para tareas de alta frecuencia, como el resumen de textos o la corrección de pruebas.
Sin embargo, la implementación de estos modelos a escala de gigabytes en una amplia variedad de hardware perimetral mientras se alcanzan velocidades de latencia de tiempo hasta el primer token (TTFT) por debajo del segundo y se logra la calidad de salida requerida es un gran desafío técnico. Abordamos estos desafíos en LiteRT-LM.
Hoy, nos complace comenzar a ofrecer a los desarrolladores acceso directo a LiteRT-LM, el marco de inferencia listo para la producción que impulsa algunas de las implementaciones más importantes de Gemini Nano en los productos de Google hasta la fecha. Este motor probado una y otra vez permite el acceso en el dispositivo a Gemini Nano y Gemma en productos como Chrome, Chromebook Plus y Pixel Watch, así como en otros modelos abiertos a través de la API de Inferencia LLM de MediaPipe.
Ya puedes aprovechar las API de alto nivel, como la API de Inferencia LLM de MediaPipe, las API de IA integradas en Chrome y Android AICore para ejecutar LLM en el dispositivo; pero ahora, por primera vez, estamos ofreciendo la interfaz C++ subyacente (en versión preliminar) del motor LiteRT-LM. Este acceso de bajo nivel te permitirá crear canalizaciones de IA personalizadas y de alto rendimiento adaptadas a tus aplicaciones, dándote acceso a la tecnología probada del motor y el rendimiento optimizado en la plataforma de tu elección. Aprovecha nuestras API para comenzar a crear ya aplicaciones impulsadas por LLM y disfrutar del rendimiento optimizado.
Específicamente, LiteRT-LM está impulsando:
LiteRT-LM es un marco de inferencia probado en producción y diseñado para ejecutar modelos de lenguaje grandes, como Gemini Nano y Gemma, con alto rendimiento en una amplia variedad de dispositivos perimetrales. En esencia, LiteRT-LM es un proyecto de código abierto que ofrece una API fácil de integrar y un conjunto de módulos reutilizables. Esto permite a los desarrolladores crear canales LLM personalizados que se adapten con precisión a los requisitos de características de sus productos.
Para comprender dónde encaja LiteRT-LM, es útil observar la pila completa de Google AI Edge, desde el nivel más bajo hasta el más alto de abstracción:
Esta estructura en capas te brinda la flexibilidad para trabajar en la capa de abstracción que mejor se adapte a las necesidades de tu proyecto, mientras que LiteRT-LM proporciona el poder y la adaptabilidad centrales para el desarrollador que intenta implementar modelos de lenguaje grandes (LLM) a escala directamente en dispositivos de usuario.
Entre los aspectos más destacados de LiteRT-LM, se incluyen los siguientes:
Demostramos esta versatilidad con dos estudios de casos en los que se destaca la implementación a escala, que abarca el navegador Chrome, las Chromebooks y los últimos Pixel Watches, para llegar a cientos de millones de dispositivos.
La escala de gigabytes de los LLM modernos presenta un desafío de implementación único. A diferencia de los modelos convencionales de aprendizaje automático, que suelen estar en el orden de los megabytes, el gran tamaño de los LLM hace que sea poco práctico implementar múltiples modelos especializados de parámetros multimillonarios, por ejemplo, uno para resumir y otro para chatear, para potenciar diferentes funciones en el mismo dispositivo perimetral.
Para superar esto, LiteRT-LM se diseñó para permitir que múltiples funciones compartan un solo modelo de base, utilizando LoRA ligeras para la personalización específica de la función. Esto es posible gracias a un patrón arquitectónico claro en el que se separan los recursos pesados y compartidos de los aspectos configurables y con estado de las interacciones del usuario. Esta separación se logra a través de dos clases básicas, el motor y la sesión:
Esta arquitectura está respaldada por optimizaciones clave que permiten realizar un cambio de tareas eficiente y de baja huella1:
sesión
encapsula su "contexto" completo, que incluye el caché KV de Transformer, los pesos LoRA, etc. Al igual que un sistema operativo, al cambiar entre tareas, LiteRT-LM guarda el estado de la sesión
saliente y restaura el de la entrante. Esto garantiza que el LLM compartido siempre tenga el estado correcto para la tarea activa.sesión
. Así se almacena en caché de manera efectiva el estado de caché KV calculado en un punto específico, lo que permite que varias tareas nuevas se ramifiquen desde ese estado y se ahorre un cálculo significativo.sesión
clonada no copia inmediatamente la caché KV, sino que crea una referencia al búfer original. Una copia real solo se realiza cuando una sesión
está a punto de sobrescribir datos nuevos que entran en conflicto con el contenido de otra sesión. Este diseño hace que la clonación sea extremadamente rápida (<10 ms) y minimiza la huella de memoria al reutilizar los búferes de cache KV.En conjunto, estas funciones de arquitectura y optimización son fundamentales para producir con éxito múltiples funciones de LLM en el dispositivo de alto rendimiento en Chrome y Chromebook Plus.
Más allá de la administración de tareas simultáneas, escalar los modelos de ML a través de SKU de dispositivos fragmentados presenta un segundo obstáculo técnico importante. Cada SoC varía en componentes y capacidades (entre CPU, GPU y NPU), lo que exige una optimización personalizada para ejecutar la inferencia del modelo de manera eficiente. LiteRT-LM aprovecha LiteRT como el tiempo de ejecución de nivel inferior para la delegación de backend, lo que le permite escalar de manera eficiente a través de múltiples aceleradores de hardware. Además, LiteRT-LM logra una amplia compatibilidad de plataforma a través de un diseño central que abstrae componentes específicos de la plataforma (como descriptores de archivos y mmap), para proporcionar implementaciones nativas cuando sea necesario.
1Ten en cuenta que algunas de las optimizaciones mencionadas no se incluyen en esta versión preliminar anticipada, pero se lanzarán gradualmente en versiones futuras.
La implementación de LLM en dispositivos con recursos muy limitados, como el Pixel Watch, presenta un conjunto de desafíos completamente diferente. En estas plataformas, la prioridad pasa de admitir múltiples funciones con un modelo compartido a implementar una única función dedicada con un tamaño binario y una superficie de memoria tan pequeños como sea posible.
Es aquí donde el diseño modular de LiteRT-LM se vuelve esencial. Si bien nuestra arquitectura de motor/sesión tiene la potencia para administrar implementaciones complejas y multitarea, su superficie binaria no es lo suficientemente eficiente para cumplir con los estrictos requisitos de un dispositivo wearable.
En su lugar, el marco permite a los desarrolladores crear un canal personalizado directamente desde sus componentes principales. Para el Pixel Watch, seleccionamos los módulos mínimos requeridos, como el ejecutor, el tokenizador y el muestreador, y ensamblamos una canalización especializada. Este enfoque nos permitió minimizar el tamaño binario y el uso de memoria para satisfacer las limitaciones de recursos del dispositivo, como se muestra en la siguiente figura.
Este estudio de caso demuestra la flexibilidad de LiteRT-LM. Sus componentes modulares permiten a los desarrolladores crear implementaciones LLM que se adapten con precisión a los requisitos específicos de recursos y características de cualquier dispositivo de destino, desde teléfonos inteligentes potentes hasta wearables limitados.
Da el paso y lleva una IA generativa potente y eficiente en el dispositivo a tus usuarios.
#include "YOUR_INCLUDE_DIRECTORY/engine.h"
// ...
// 1. Define los recursos del modelo y la configuración del motor.
auto model_assets = ModelAssets::Create(model_path);
CHECK_OK(model_assets);
auto engine_settings = EngineSettings::CreateDefault(
model_assets, litert::lm::Backend::CPU);
// 2. Crea el objeto de motor principal.
absl::StatusOr<std::unique_ptr<Engine>> engine = Engine::CreateEngine(engine_settings);
CHECK_OK(engine);
// 3. Crea una sesión por cada conversación nueva.
auto session_config = SessionConfig::CreateDefault();
absl::StatusOr<std::unique_ptr<Engine::Session>> session = (*engine)->CreateSession(session_config);
CHECK_OK(session);
// 4. Genera contenido usando la API de alto nivel.
absl::StatusOr<Responses> responses = (*session)->GenerateContent(
{InputText("What is the tallest building in the world?")});
CHECK_OK(responses);
// 5. Imprime la respuesta.
std::cout << *responses << std::endl;
Nos gustaría agradecer especialmente a nuestros colaboradores clave por el trabajo fundamental que realizaron en este proyecto: 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 y Youchuan Hu.
También agradecemos las importantes contribuciones de los siguientes miembros del equipo: 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 y Yishuang Pang.
Este esfuerzo fue posible gracias a la guía y el apoyo de nuestros líderes: Cormac Brick, Etienne Noël, Juhyun Lee, Lu Wang, Matthias Grundmann y Sachin Kotwani.