A API de inferência de LLM permite executar modelos de linguagem grandes (LLMs) completamente no navegador para aplicativos da Web, que podem ser usados para realizar uma ampla gama de tarefas, como gerar texto, recuperar informações em linguagem natural e resumir documentos. A tarefa oferece suporte integrado a vários modelos de linguagem grandes de texto para texto, para que você possa aplicar os modelos de IA generativa mais recentes no dispositivo aos seus apps da Web.
A tarefa é compatível com as seguintes variantes do Gemma: Gemma 2 2B, Gemma 2B e Gemma 7B. O Gemma é uma família de modelos abertos leves e de última geração criados com base na mesma pesquisa e tecnologia usadas para criar os modelos do Gemini. Ele também oferece suporte aos seguintes modelos externos: Phi-2, Falcon-RW-1B e StableLM-3B.
Confira essa tarefa em ação com a demonstração do MediaPipe Studio. Para mais informações sobre os recursos, modelos e opções de configuração dessa tarefa, consulte a Visão geral.
Exemplo de código
O exemplo de aplicativo para a API de inferência do LLM fornece uma implementação básica dessa tarefa em JavaScript para sua referência. Use este app de exemplo para criar seu próprio app de geração de texto.
Acesse o app de exemplo da API LLM Inference no GitHub.
Configuração
Esta seção descreve as principais etapas para configurar seu ambiente de desenvolvimento e projetos de código especificamente para usar a API de inferência de LLM. Para informações gerais sobre como configurar seu ambiente de desenvolvimento para usar as tarefas do MediaPipe, incluindo os requisitos da versão da plataforma, consulte o Guia de configuração para a Web.
Compatibilidade com navegadores
A API de inferência de LLM requer um navegador da Web com compatibilidade com WebGPU. Para conferir uma lista completa de navegadores compatíveis, consulte Compatibilidade de navegadores com GPUs.
Pacotes JavaScript
O código da API de inferência do LLM está disponível no
pacote
@mediapipe/tasks-genai
. Você pode encontrar e fazer o download dessas bibliotecas nos links fornecidos no
guia de configuração da plataforma.
Instale os pacotes necessários para a preparação local:
npm install @mediapipe/tasks-genai
Para implantar em um servidor, use um serviço de rede de fornecimento de conteúdo (CDN), como o jsDelivr, para adicionar código diretamente à página HTML:
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
crossorigin="anonymous"></script>
</head>
Modelo
A API MediaPipe LLM Inference requer um modelo treinado compatível com essa tarefa. Para aplicativos da Web, o modelo precisa ser compatível com a GPU.
Para mais informações sobre os modelos treinados disponíveis para a API de inferência LLM, consulte a seção "Modelos" da visão geral da tarefa.
Fazer o download de um modelo
Antes de inicializar a API de inferência de LLM, faça o download de um dos modelos compatíveis e armazene o arquivo no diretório do projeto:
- Gemma-2 2B: a versão mais recente da família de modelos Gemma. Faz parte de uma família de modelos abertos leves e de última geração criados com a mesma pesquisa e tecnologia usadas para criar os modelos do Gemini.
- Gemma 2B: faz parte de uma família de modelos abertos leves e de última geração criados com base na mesma pesquisa e tecnologia usadas para criar os modelos do Gemini. É adequado para várias tarefas de geração de texto, incluindo respostas a perguntas, resumo e raciocínio.
- Phi-2: modelo Transformer de 2, 7 bilhões de parâmetros, mais adequado para o formato de perguntas e respostas, chat e código.
- Falcon-RW-1B: modelo de 1 bilhão de parâmetros somente para decodificador treinado com 350 bilhões de tokens do RefinedWeb.
- StableLM-3B: modelo de linguagem de apenas decodificador de parâmetros de 3 bilhões pré-treinado em 1 trilhão de tokens de diversos conjuntos de dados de inglês e código.
Além dos modelos compatíveis, você pode usar o AI Edge
Torch do Google para exportar modelos do PyTorch
para modelos LiteRT (tflite
) com várias assinaturas. Para mais informações, consulte
Conversor generativo do Torch para modelos PyTorch.
Recomendamos usar o Gemma-2 2B, que está disponível nos modelos do Kaggle. Para mais informações sobre os outros modelos disponíveis, consulte a seção "Modelos" da visão geral da tarefa.
Converter o modelo para o formato MediaPipe
A API de inferência de LLM é compatível com dois tipos de modelos de categorias, alguns dos quais exigem conversão de modelos. Use a tabela para identificar o método de etapas necessário para seu modelo.
Modelos | Método de conversão | Plataformas compatíveis | Tipo de arquivo | |
---|---|---|---|---|
Modelos compatíveis | Gemma 2B, Gemma 7B, Gemma-2 2B, Phi-2, StableLM, Falcon | MediaPipe | Android, iOS e Web | .bin |
Outros modelos do PyTorch | Todos os modelos LLM do PyTorch | Biblioteca generativa AI Edge Torch | Android, iOS | .task |
Os arquivos .bin
convertidos para Gemma 2B, Gemma 7B e Gemma-2 2B
estão hospedados no Kaggle. Esses modelos podem ser implantados diretamente usando nossa API de inferência de LLM. Para
aprender a converter outros modelos, consulte a seção Conversão de
modelos.
Adicionar modelo ao diretório do projeto
Armazene o modelo no diretório do projeto:
<dev-project-root>/assets/gemma-2b-it-gpu-int4.bin
Especifique o caminho do modelo com o parâmetro modelAssetPath
do objeto baseOptions
:
baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int4.bin`}
Criar a tarefa
Use uma das funções createFrom...()
da API LLM Inference para preparar a tarefa para
executar inferências. É possível usar a função createFromModelPath()
com um caminho relativo ou absoluto para o arquivo de modelo treinado. O exemplo de código usa a função createFromOptions()
. Para mais informações sobre as opções de configuração
disponíveis, consulte Opções de configuração.
O código a seguir demonstra como criar e configurar essa tarefa:
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
baseOptions: {
modelAssetPath: '/assets/gemma-2b-it-gpu-int4.bin'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101
});
Opções de configuração
Esta tarefa tem as seguintes opções de configuração para apps da Web e JavaScript:
Nome da opção | Descrição | Intervalo de valor | Valor padrão |
---|---|---|---|
modelPath |
O caminho para onde o modelo é armazenado no diretório do projeto. | CAMINHO | N/A |
maxTokens |
O número máximo de tokens (tokens de entrada + tokens de saída) que o modelo processa. | Número inteiro | 512 |
topK |
O número de tokens que o modelo considera em cada etapa de geração. Limita as previsões aos k tokens mais prováveis. | Número inteiro | 40 |
temperature |
A quantidade de aleatoriedade introduzida durante a geração. Uma temperatura mais alta resulta em mais criatividade no texto gerado, enquanto uma temperatura mais baixa produz uma geração mais previsível. | Ponto flutuante | 0,8 |
randomSeed |
A semente aleatória usada durante a geração de texto. | Número inteiro | 0 |
loraRanks |
Classificações LoRA a serem usadas pelos modelos LoRA durante a execução. Observação: isso só é compatível com modelos de GPU. | Matriz de números inteiros | N/A |
Preparar dados
A API de inferência de LLM aceita dados de texto (string
). A tarefa processa a entrada de dados, incluindo a tokenização e o pré-processamento de tensores.
Todo o pré-processamento é processado na função generateResponse()
. Não é
preciso fazer um pré-processamento adicional do texto de entrada.
const inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday.";
Executar a tarefa
A API de inferência LLM usa a função generateResponse()
para acionar inferências.
Para a classificação de texto, isso significa retornar as categorias possíveis para o
texto de entrada.
O código abaixo demonstra como executar o processamento com o modelo de tarefas.
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
Para transmitir a resposta, use o seguinte:
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
Processar e mostrar resultados
A API de inferência do LLM retorna uma string, que inclui o texto da resposta gerada.
Here's a draft you can use:
Subject: Lunch on Saturday Reminder
Hi Brett,
Just a quick reminder about our lunch plans this Saturday at noon.
Let me know if that still works for you.
Looking forward to it!
Best,
[Your Name]
Personalização de modelo LoRA
A API de inferência de LLM do Mediapipe pode ser configurada para oferecer suporte à adaptação de baixa classificação (LoRA) para modelos de linguagem grandes. Usando modelos LoRA ajustados, os desenvolvedores podem personalizar o comportamento de LLMs com um processo de treinamento econômico.
O suporte da API de inferência de LLM à LoRA funciona para todas as variantes do Gemma e modelos Phi-2 para o back-end da GPU, com pesos da LoRA aplicáveis apenas a camadas de atenção. Essa implementação inicial serve como uma API experimental para futuros desenvolvimentos com planos de oferecer suporte a mais modelos e vários tipos de camadas nas próximas atualizações.
Preparar modelos LoRA
Siga as instruções no
HuggingFace
para treinar um modelo LoRA ajustado no seu próprio conjunto de dados com os tipos de modelo compatíveis,
Gemma ou Phi-2. Os modelos Gemma-2 2B, Gemma
2B e
Phi-2 estão disponíveis no
HuggingFace no formato safetensors. Como a API de inferência LLM oferece suporte apenas ao
LoRA em camadas de atenção, especifique apenas camadas de atenção ao criar o
LoraConfig
da seguinte maneira:
# For Gemma
from peft import LoraConfig
config = LoraConfig(
r=LORA_RANK,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)
# For Phi-2
config = LoraConfig(
r=LORA_RANK,
target_modules=["q_proj", "v_proj", "k_proj", "dense"],
)
Para testes, há modelos LoRA ajustados e acessíveis publicamente que se encaixam na API LLM Inference disponível no HuggingFace. Por exemplo, monsterapi/gemma-2b-lora-maths-orca-200k para Gemma-2B e lole25/phi-2-sft-ultrachat-lora para Phi-2.
Depois de treinar no conjunto de dados preparado e salvar o modelo, você vai receber um arquivo adapter_model.safetensors
contendo os pesos do modelo LoRA ajustados.
O arquivo safetensors é o ponto de verificação da LoRA usado na conversão do modelo.
Na próxima etapa, você precisa converter os pesos do modelo em um Flatbuffer do TensorFlow Lite
usando o pacote MediaPipe Python. O ConversionConfig
precisa
especificar as opções de modelo básico e outras opções de LoRa. Como
a API só oferece suporte à inferência LoRA com GPU, o back-end precisa ser definido como
'gpu'
.
import mediapipe as mp
from mediapipe.tasks.python.genai import converter
config = converter.ConversionConfig(
# Other params related to base model
...
# Must use gpu backend for LoRA conversion
backend='gpu',
# LoRA related params
lora_ckpt=LORA_CKPT,
lora_rank=LORA_RANK,
lora_output_tflite_file=LORA_OUTPUT_TFLITE_FILE,
)
converter.convert_checkpoint(config)
O conversor vai gerar dois arquivos flatbuffer do TFLite, um para o modelo base e outro para o modelo LoRA.
Inferência de modelo LoRA
A API de inferência de LLM da Web, do Android e do iOS foi atualizada para oferecer suporte à inferência de modelos da LoRA.
A Web oferece suporte ao LoRA dinâmico durante a execução. Ou seja, os usuários declaram as classificações de LoRA que serão usadas durante a inicialização e podem trocar diferentes modelos de LoRA durante a execução.const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
// options for the base model
...
// LoRA ranks to be used by the LoRA models during runtime
loraRanks: [4, 8, 16]
});
Durante a execução, depois que o modelo base é inicializado, carregue os modelos LoRA a serem usados. Além disso, ative o modelo LoRA transmitindo a referência do modelo LoRA ao gerar a resposta do LLM.
// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);
// Specify LoRA model to be used during inference
llmInference.generateResponse(
inputPrompt,
loraModelRank4,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});