A API LLM Inference permite executar modelos de linguagem grandes (LLMs) completamente no dispositivo para aplicativos iOS, que podem ser usados para executar uma ampla variedade de tarefas, como gerar texto, recuperar informações na forma de 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 iOS.
É possível conferir 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 código de exemplo do MediaPipe Tasks é uma implementação básica de um app da API LLM Inference para iOS. Você pode usar o app como ponto de partida para seu próprio app iOS ou referir-se a ele ao modificar um app existente. O código de exemplo da API LLM Inference está hospedado no GitHub.
Fazer o download do código
As instruções a seguir mostram como criar uma cópia local do código de exemplo usando a ferramenta de linha de comando git.
Para fazer o download do código de exemplo:
Clone o repositório git usando o seguinte comando:
git clone https://github.com/google-ai-edge/mediapipe-samples
Opcionalmente, configure sua instância do Git para usar o checkout esparso, para que você tenha apenas os arquivos do app de exemplo da API LLM Inference:
cd mediapipe git sparse-checkout init --cone git sparse-checkout set examples/llm_inference/ios/
Depois de criar uma versão local do código de exemplo, é possível instalar a biblioteca de tarefas do MediaPipe, abrir o projeto usando o Xcode e executar o app. Para instruções, consulte o Guia de configuração para iOS.
Configuração
Esta seção descreve as principais etapas para configurar seu ambiente de desenvolvimento e projetos de código para usar a API de inferência de LLM. Para informações gerais sobre como configurar seu ambiente de desenvolvimento para usar tarefas do MediaPipe, incluindo os requisitos de versão da plataforma, consulte o Guia de configuração para iOS.
Dependências
A API de inferência de LLM usa a biblioteca MediaPipeTasksGenai
, que precisa ser instalada
usando o CocoaPods. A biblioteca é compatível com apps Swift e Objective-C
e não requer nenhuma configuração específica da linguagem.
Para instruções sobre como instalar o CocoaPods no macOS, consulte o Guia de instalação
do CocoaPods.
Para instruções sobre como criar um Podfile
com os pods necessários para seu
app, consulte Como usar
CocoaPods.
Adicione o pod MediaPipeTasksGenai
no Podfile
usando o seguinte código:
target 'MyLlmInferenceApp' do
use_frameworks!
pod 'MediaPipeTasksGenAI'
pod 'MediaPipeTasksGenAIC'
end
Se o app incluir destinos de teste de unidade, consulte o guia de configuração para
iOS para mais informações sobre como configurar
o Podfile
.
Modelo
A tarefa da API MediaPipe LLM Inference requer um modelo treinado compatível com essa tarefa. Para mais informações sobre modelos treinados disponíveis para a API LLM Inference, consulte a visão geral da tarefa Seção Modelos.
Fazer o download de um modelo
Faça o download de um modelo e adicione-o ao diretório do projeto usando o Xcode. Para instruções sobre como adicionar arquivos ao projeto do Xcode, consulte Gerenciar arquivos e pastas no projeto do Xcode.
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 usada 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 a mesma pesquisa e tecnologia usadas para criar os modelos do Gemini. Adequada para várias tarefas de geração de texto, incluindo respostas a perguntas, resumo e raciocínio.
- Phi-2: modelo de Transformer de 2, 7 bilhões de parâmetros, mais adequado para o formato pergunta-resposta, 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 com três bilhões de parâmetros somente decodificador, pré-treinado em 1 trilhão de tokens de diversos conjuntos de dados de inglês e código.
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.
Criar a tarefa
É possível criar a tarefa da API de inferência de LLM chamando um dos inicializadores dela. O
inicializador LlmInference(options:)
define valores para as opções de configuração.
Se você não precisar de uma API de inferência de LLM inicializada com opções de configuração
personalizadas, use o inicializador LlmInference(modelPath:)
para criar uma
API de inferência de LLM com as opções padrão. Para mais informações sobre as opções de configuração, consulte Visão geral da configuração.
O código a seguir demonstra como criar e configurar essa tarefa.
import MediaPipeTasksGenai
let modelPath = Bundle.main.path(forResource: "model",
ofType: "bin")
let options = LlmInferenceOptions()
options.baseOptions.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
let llmInference = try LlmInference(options: options)
Opções de configuração
Esta tarefa tem as seguintes opções de configuração para apps iOS:
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 (de entrada e de saída) processados pelo modelo. | 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 |
loraPath |
O caminho absoluto para o modelo LoRA localmente no dispositivo. Observação: isso só é compatível com modelos de GPU. | CAMINHO | N/A |
Preparar dados
A API LLM Inference funciona com dados de texto. A tarefa lida com o pré-processamento de entrada de dados, incluindo a tokenização e o pré-processamento de tensor.
Todo o pré-processamento é processado na função generateResponse(inputText:)
.
Não é necessário fazer o pré-processamento adicional do texto de entrada.
let inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."
Executar a tarefa
Para executar a API LLM Inference, use o método generateResponse(inputText:)
. A
API LLM Inference retorna as categorias possíveis para o texto de entrada.
let result = try LlmInference.generateResponse(inputText: inputPrompt)
Para fazer streaming da resposta, use o método generateResponseAsync(inputText:)
.
let resultStream = LlmInference.generateResponseAsync(inputText: inputPrompt)
do {
for try await partialResult in resultStream {
print("\(partialResult)")
}
print("Done")
}
catch {
print("Response error: '\(error)")
}
Processar e mostrar resultados
A API de inferência do LLM retorna o texto de resposta gerado.
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 dos LLMs com um processo de treinamento econômico.
O suporte da LoRA à API LLM Inference funciona para modelos Gemma-2B e Phi-2 para o back-end da GPU, com pesos LoRA aplicáveis apenas às camadas de atenção. Essa implementação inicial serve como uma API experimental para desenvolvimentos futuros, 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-2B ou Phi-2. Os modelos Gemma-2B e Phi-2 estão disponíveis no HuggingFace no formato safetensors. Como a API de inferência LLM só oferece suporte ao LoRA em camadas de atenção, especifique apenas camadas de atenção ao criar o LoraConfig
da seguinte maneira:
# For Gemma-2B
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 de inferência de LLM 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
com 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 TensorFlow Lite Flatbuffer usando o pacote MediaPipe Python. O ConversionConfig
precisa especificar as opções de modelo base 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 para Web, Android e iOS foi atualizada para oferecer suporte à inferência de modelos LoRA. A Web oferece suporte à LoRA dinâmica, que pode alternar entre diferentes modelos LoRA durante a execução. O Android e o iOS oferecem suporte à LoRA estática, que usa os mesmos pesos da LoRA durante a duração da tarefa.
O iOS oferece suporte a LoRA estático durante a inicialização. Para carregar um modelo LoRA, os usuários especificam o caminho do modelo LoRA e o LLM base.import MediaPipeTasksGenai
let modelPath = Bundle.main.path(forResource: "model",
ofType: "bin")
let loraPath= Bundle.main.path(forResource: "lora_model",
ofType: "bin")
let options = LlmInferenceOptions()
options.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
options.loraPath = loraPath
let llmInference = try LlmInference(options: options)
Para executar a inferência de LLM com o LoRA, use os mesmos métodos generateResponse()
ou generateResponseAsync()
do modelo base.