A execução de modelos de linguagem grandes (LLMs) poderosos diretamente no dispositivo de um usuário desbloqueia recursos que podem melhorar significativamente as experiências com os produtos. Sua disponibilidade off-line os torna prontamente disponíveis em todos os momentos, enquanto sua eficiência de custo (sem custos por chamada de API) os torna práticos para tarefas de alta frequência, como resumos ou revisões de textos.
No entanto, implantar esses modelos em escala de gigabytes em uma ampla gama de tipos de hardware de borda e, ao mesmo tempo, alcançar velocidades de latência de TTFT (tempo até o primeiro token) inferiores a um segundo e a qualidade de saída necessária é um grande desafio técnico. Abordamos esses pontos com o LiteRT-LM.
Hoje, temos o prazer de oferecer aos desenvolvedores o acesso direto ao LiteRT-LM, o framework de inferência pronto para produção que tem habilitado algumas das mais amplas implantações do Gemini Nano em vários produtos Google até o momento. Esse mecanismo testado em campo permite o uso do Gemini Nano e do Gemma no dispositivo em produtos como Chrome, Chromebook Plus e Pixel Watch, além de outros modelos abertos por meio da API MediaPipe LLM Inference.
Você já pode aproveitar as APIs de nível alto, como a API MediaPipe LLM Inference, as APIs de IA integradas do Chrome e o Android AICore, para executar LLMs no dispositivo. Mas, pela primeira vez, estamos fornecendo a interface em C++ subjacente (em pré-lançamento) de nosso mecanismo LiteRT-LM. Esse acesso de nível baixo permite que você crie pipelines de IA personalizados e de alto desempenho, adaptados aos seus aplicativos, desbloqueando a tecnologia comprovada do mecanismo e o desempenho otimizado em sua plataforma preferida. Aproveite nossas APIs para começar a criar seus aplicativos habilitados por LLM hoje mesmo e experimentar esse desempenho otimizado.
Especificamente, o LiteRT-LM está habilitando:
O LiteRT-LM é um framework de inferência testado em produção que foi projetado para a execução de modelos de linguagem grandes, como Gemini Nano e Gemma, com alto desempenho em uma ampla variedade de dispositivos de borda. Em sua essência, o LiteRT-LM é um projeto totalmente de código aberto que fornece uma API fácil de integrar e um conjunto de módulos reutilizáveis. Isso permite que os desenvolvedores criem pipelines de LLM personalizados que sejam precisamente adaptados aos requisitos de recursos de seus produtos.
Para entender onde o LiteRT-LM se encaixa, vale a pena analisar toda a pilha do Google AI Edge, do nível de abstração mais baixo até o mais alto:
Essa estrutura em camadas oferece a flexibilidade de trabalhar na camada de abstração que se adapta melhor às necessidades de seu projeto, enquanto o LiteRT-LM fornece a potência central e a adaptabilidade para um desenvolvedor que deseja implantar modelos de linguagem grandes (LLMs) em escala diretamente nos dispositivos dos usuários.
Os principais destaques do LiteRT-LM incluem:
Demonstramos essa versatilidade com dois estudos de caso que destacam a implantação em escala, abrangendo o navegador Chrome, os Chromebooks e os mais recentes Pixel Watches, para alcançar centenas de milhões de dispositivos.
A escala de gigabytes dos LLMs modernos apresenta um desafio de implantação único. Ao contrário dos modelos convencionais de aprendizado de máquina, que normalmente são da ordem dos megabytes, o tamanho dos LLMs torna impraticável a implantação de vários modelos especializados com vários bilhões de parâmetros — por exemplo, um para resumos e outro para chat — a fim de habilitar diferentes recursos no mesmo dispositivo de borda.
Para superar isso, o LiteRT-LM foi projetado para permitir que vários recursos compartilhem um único modelo de base, usando LoRAs leves para personalização específica de recurso. Isso é possível graças a um padrão arquitetônico claro que separa recursos pesados e compartilhados dos aspectos configuráveis e com estado das interações do usuário. Essa separação é alcançada por meio de duas classes principais, Engine e Session:
Essa arquitetura tem o suporte de otimizações importantes que permitem a alternância de tarefas eficiente e com pouco consumo de espaço1:
Session
encapsula seu "contexto" completo, incluindo o cache de KV do transformador, os pesos de LoRA etc. Semelhante a um SO, ao alternar as tarefas, o LiteRT-LM salva o estado da Session
de saída e restaura a de entrada. Isso garante que o LLM compartilhado sempre tenha o estado correto para a tarefa ativa.Session
. Isso armazena em cache o estado computado do cache de KV com eficiência em um ponto específico, permitindo que várias tarefas novas se ramifiquem a partir desse estado e economizando muito em computação.Session
clonada não copia imediatamente o cache de KV, mas cria uma referência ao buffer original. Uma cópia efetiva só é feita quando uma Session
está prestes a sobrescrever novos dados que entram em conflito com o conteúdo de outra Session. Esse design torna a clonagem extremamente rápida (< 10 ms) e minimiza o consumo de memória ao reutilizar buffers do cache de KV.Juntos, esses recursos de arquitetura e otimização são fundamentais para colocar em produção, com êxito, vários recursos de LLMs de alto desempenho no dispositivo, seja no Chrome ou no Chromebook Plus.
Além de gerenciar tarefas simultâneas, o escalonamento de modelos de ML entre SKUs de dispositivos fragmentados apresenta um segundo grande desafio técnico. Cada SoC varia em componentes e recursos (entre CPUs, GPUs e NPUs), exigindo uma otimização personalizada para executar a inferência de modelos com alto desempenho. O LiteRT-LM utiliza o LiteRT como o ambiente de execução de nível inferior para delegação de back-end, permitindo seu escalonamento eficiente em vários aceleradores de hardware. Além disso, o LiteRT-LM alcança uma ampla compatibilidade com plataformas por meio de um design central que abstrai componentes específicos de plataforma (como descritores de arquivos e mmap), fornecendo implementações nativas, quando necessário.
1Observe que algumas otimizações mencionadas não estão incluídas neste pré-lançamento antecipado, mas elas serão lançadas gradualmente em versões futuras.
A implantação de LLMs em dispositivos com recursos escassos, como o Pixel Watch, apresenta um conjunto totalmente diferente de desafios. Nessas plataformas, a prioridade muda do suporte a vários recursos com um modelo compartilhado para a implantação de um único recurso dedicado com o menor tamanho de binário e consumo de memória possível.
É aqui que o design modular do LiteRT-LM se torna essencial. Embora nossa arquitetura Engine/Session seja poderosa para gerenciar implantações complexas e multitarefa, sua pegada binária não é enxuta o suficiente para os requisitos rigorosos de um dispositivo wearable.
Em vez disso, o framework permite que os desenvolvedores criem um pipeline personalizado diretamente a partir de seus componentes principais. Para o Pixel Watch, selecionamos os módulos mínimos necessários — como o executor, o tokenizador e o amostrador — e montamos um pipeline especializado. Essa abordagem nos permitiu minimizar o tamanho do binário e o uso da memória para satisfazer as restrições de recursos do dispositivo, como mostrado na figura abaixo.
Este estudo de caso demonstra a flexibilidade do LiteRT-LM. Seus componentes modulares capacitam os desenvolvedores a criar implantações de LLMs que são precisamente adaptadas aos requisitos específicos de recursos e atributos de qualquer dispositivo de destino, desde smartphones poderosos até wearables restritos.
Comece agora mesmo e forneça uma IA generativa no dispositivo poderosa e eficiente para seus usuários.
#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;
Gostaríamos de agradecer nossos principais colaboradores por seu trabalho fundamental neste projeto: 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 e Youchuan Hu.
Também agradecemos as importantes contribuições dos seguintes membros da equipe: 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 e Yishuang Pang.
Este esforço foi possível graças à orientação e ao apoio de nossa liderança: Cormac Brick, Etienne Noël, Juhyun Lee, Lu Wang, Matthias Grundmann e Sachin Kotwani.