Avançado7 min de leituraAtualizado

Correr IA num CPU: quantização, ONNX e porque é que os modelos pequenos ganham

Nem sempre é preciso uma GPU. Como a quantização para int8, o ONNX Runtime e o tamanho certo fazem um modelo de moderação responder em milissegundos num CPU.

Porque é que a velocidade importa

Uma API de moderação de chats tem de responder enquanto o utilizador ainda está a olhar para o ecrã: algumas centenas de milissegundos, no máximo. As GPU são rápidas mas caras; os servidores comuns têm CPU. Pôr um modelo rápido num CPU é o que torna um serviço de moderação acessível.

O que calcula um modelo

Uma rede neuronal é sobretudo multiplicação de matrizes: os números que representam o texto são multiplicados pelos pesos do modelo, camada após camada. A velocidade depende de quantas multiplicações há (o tamanho do modelo e o comprimento do texto) e da rapidez de cada uma.

A quantização

Os pesos são normalmente guardados como números decimais de 32 bits. A quantização guarda-os como inteiros de 8 bits (int8), com um fator de escala por linha ou canal:

FormatoTamanho de um modelo com 560 milhões de parâmetrosVelocidade típica em CPU
float32cerca de 2,2 GBreferência
int8cerca de 0,6 GBmuitas vezes 2 a 4 vezes mais rápido

Os CPU modernos têm instruções que multiplicam muitos números de 8 bits ao mesmo tempo (VNNI, AVX-512, Intel AMX), e é daí que vem a velocidade.

O preço é uma perda mínima de precisão. Com a quantização dinâmica por canal, um bom classificador não costuma perder quase nada mensurável, mas as pontuações deslocam-se ligeiramente. Por isso os limiares têm de ser realinhados depois de quantizar: cada limiar é movido para que o modelo quantizado assinale a mesma proporção de mensagens que o original num conjunto de calibração.

ONNX e ONNX Runtime

O ONNX é um formato aberto para guardar um modelo como um grafo de operações, independente do framework com que foi treinado. O ONNX Runtime executa esse grafo e está otimizado para CPU: funde operações, usa todos os núcleos e escolhe as instruções mais rápidas disponíveis.

Um exemplo real

A VigiMod 1.2.1 tem cerca de 560 milhões de parâmetros. Com 4 núcleos de CPU:

VersãoTempo por par mensagem–categoria
Precisão totalcerca de 113 ms
ONNX int8cerca de 32 ms (3,5 vezes mais rápido)

Depois de realinhar os limiares, a perda de qualidade medida nos dados de validação ficou abaixo de 0,005 de F1, dentro do ruído.

Outros truques

  • Entradas mais curtas: limita o contexto às últimas mensagens que importam.
  • Lotes: pontua várias mensagens de uma vez quando chegam juntas.
  • Guardar em cache a parte fixa da entrada (por exemplo uma política longa) nos modelos que o permitem.
  • Modelo mais pequeno, dados melhores: um modelo pequeno treinado com os exemplos certos muitas vezes ganha a um grande e genérico, por uma fração do custo.

Quando é mesmo preciso uma GPU

Para treinar e para correr modelos muito grandes que geram respostas longas. Um desenho habitual é uma cascata: um modelo pequeno e rápido em todas as mensagens e um maior só nos poucos casos duvidosos.

Teste-se

Responda às perguntas e depois verifique as respostas.

  1. 1. O que muda a quantização para int8?
  2. 2. Porque é que é preciso rever os limiares depois de quantizar?
  3. 3. O que é o ONNX Runtime?
  4. 4. O que é uma cascata?

Todos os guias →

Veja em mensagens reais

Experimente a demo ao vivo ou leia como funciona a API.