O que é Quantização em Machine Learning?

Mateus Zorzi
SiDi NLP
Published in
6 min readJul 6, 2023

Os modelos de Deep Learning mais populares atualmente são conhecidos pela sua capacidade de realizar tarefas de alta complexidade e robustez. Entretanto por possuírem uma arquitetura composta de muitos pesos e neurônios, requerem uma quantidade considerável de recursos computacionais.

Utilizando a área de Processamento de Linguagem Natural (PLN) como exemplo, três dos modelos mais famosos e utilizados atualmente são BERT, T5 e GPT-3. Tais modelos são disponibilizados como modelos pré-treinados e podem ser ajustados para uma tarefa específica. Por serem considerados LLMs (ou Large Language Models), possuem uma arquitetura composta de milhões (ou bilhões) de parâmetros, como pode ser visto na tabela abaixo:

Número de parâmetros por modelo.

Uma das aplicações onde esses modelos podem ser utilizados é a tarefa de Análise de Sentimentos. A partir de um LLM pré-treinado, podemos realizar o processo de fine-tuning e obter um modelo capaz de classificar textos em um aplicativo móvel, por exemplo.

Mas quando a intenção é utilizar um LLM no contexto de uma aplicação móvel, podemos abordar o problema de duas formas: (i) mantendo uma conexão com um modelo disponibilizado na nuvem ou (ii) embarcando o modelo no próprio dispositivo. Esta última é um desafio a parte, dada as limitações de recurso e processamento que um dispositivo móvel oferece.

Seria inviável adicionar esse modelo com todos esses parâmetros, tamanho e custo computacional no aplicativo, pois um celular não possui os mesmos recursos computacionais que o ambiente onde o modelo foi treinado. Além disso, impactaria diretamente na latência, desempenho, consumo de memória, entre outros fatores do dispositivo.

Nesse sentido, técnicas de otimização são empregadas para reduzir a demanda de recursos computacionais sem prejudicar o desempenho do modelo ou a experiência do usuário. Neste artigo, falaremos sobre a Quantização, que reduz a complexidade dos pesos e vieses utilizados pelo modelo. Por exemplo, uma rede neural onde seus pesos e vieses comumente são utilizados em ponto de precisão, os mesmos serão convertidos para um tipo de dado de complexidade menor como o inteiro. No exemplo abaixo, pode-se observar um número em ponto flutuante de 32 bits, convertido para o número inteiro mais próximo de 8 bits, seguindo a ideia da quantização inteira pós treinamento que será melhor detalhada a frente.

Exemplo de Quantização de float32 para int32. (Fonte: https://www.qualcomm.com/news/onq/2019/03/heres-why-quantization-matters-ai)

TensorFlow Lite

Apenas lendo o conceito de quantização, pode-se imaginar que é uma transformação simples, mas devido a quantidade de parâmetros e pesos que esses modelos possuem, essa “simples” conversão resulta em uma alteração significante na arquitetura do modelo.

Uma das ferramentas disponíveis para quantização de modelos disponibilizadas é o TensorFlow Lite, disponível com mais informações nesse link. Alguns dos principais ganhos da quantização, especificamente utilizando TensorFlow Lite, são:

  1. Menor latência: não há necessadade de conexão a um servidor;
  2. Privacidade: nenhum dado do usuário sai do dispositivo;
  3. Conectividade: não existe a necessidade de conexão a internet;
  4. Tamanho reduzido: o modelo pode reduzir seu tamanho em até 75%;
  5. Consumo de energia: diminuindo a complexidade também diminui o consumo de energia do aparelho;
  6. Compatibilidade: é compatível com diferentes sistemas e dispositivos como Android, iOS e microcontroladores, além de possuir compatibilidade com diversas linguagens de programação, como: Java, C++ e Python.

O TensorFlow Lite possibilita a utilização de alguns tipos de quantização que serão detalhados a seguir, e dividem-se em dois principais tipos: quantização pós-treinamento e quantização “durante o treinamento” (aware training). Em resumo, se diferenciam porque a quantização pós-treinamento, como o próprio nome diz, é realizada após o treinamento do modelo e isso torna o processo mais simples. Já o método “aware training” é mais complexo e acontece no momento de inferência do modelo. Mas, em alguns casos, pode oferecer menor perda de acurácia do modelo em relação ao método pós-treinamento.

Neste artigo, abordaremos apenas o tipo quantização pós-treinamento, por ser a mais recomendada ao iniciar a utilização do TensorFlow Lite e também apresentar ganhos consistentes e desempenho similar ao método “aware training”.

Quantização pós-treinamento float16

Essa quantização é a mais simples, como mencionado anteriormente, os modelos neurais costumam trabalhar com dados em float32, nesse método esses pesos e vieses serão convertidos para float16. Como é de se esperar, o modelo terá uma redução de cerca de 50% do seu tamanho e a perda de precisão será praticamente nula.

Um ponto negativo dessa abordagem é que como a conversão dos dados é mínima, passando de float32 para float16, a latência e uso de memória do modelo não será tão otimizada quanto em outros métodos.

Os códigos para realizar a conversão dos modelos são muito simples. Nesse caso, é necessário apenas carregar o modelo original e depois especificar que a conversão será feita para float16.

import tensorflow as tf

#carrega o modelo original
converter = tf.lite.TFLiteConverter.from_saved_model(modelo_salvo)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

#especifica para qual tipo será realizada a conversão (float16)
converter.target_spec.supported_types = [tf.float16]

#realiza a conversão
tflite_model = converter.convert()

Quantização de faixa dinâmica pós-treinamento

Este é um dos métodos mais indicados a serem utilizados, seus ganhos são muito significativos e a perda de acurácia é mínima. Nesta abordagem os dados são convertidos de float32 para int8, permitindo uma redução do tamanho do modelo em cerca de 75%. Enquanto os pesos e vieses são convertidos para int8 as saídas de ativação do modelo permanecem como ponto flutuante.

Esta é a conversão default do TFLite, por conta disso, não é necessário especificar o tipo que será realizada a conversão (int8) como no exemplo anterior.

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(modelo_salvo)

converter.optimizations = [tf.lite.Optimize.DEFAULT]

tflite_model = converter.convert()

Quantização inteira pós-treinamento

A quantização inteira é como uma extensão da quantização de faixa dinâmica, ela segue os mesmos princípios, mas além de converter os pesos e vieses do modelo para int8 as saídas de ativação do modelo também são convertidas, permitindo um tempo de inferência e latência ainda menores, sendo ideal para dispositivos de baixo poder computacional.

Este método possui uma diferença para os demais, para realizar a conversão completa de todos os dados de ponto flutuante do modelo é necessário utilizar uma amostragem dos dados de treinamento que irão auxiliar nessa conversão sem uma grande perca de acurácia. Normalmente, é uma pequena amostragem dos dados, como algumas centenas de dados escolhidos de forma randômica dos dados de treinamento ou validação.

import tensorflow as tf


converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

#indica uma amostra do dataset que será utilizada na conversão
converter.representative_dataset = representative_dataset

#caso algo não possa ser convertido para int será indicado um erro
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]

#indica que as entradas e saídas do modelo serão convertida para int8
converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8

tflite_model = converter.convert()

Salvando o modelo

Após realizar a conversão do modelo utilizando algum dos exemplos acima, podemos salvá-lo em seu novo formato tflite.

#indique o caminho onde deseja salvar o modelo .tflite
tflite_model_file = tflite_models_dir/"model_tflite.tflite"

#salva o modelo tflite_model gerado anteriormente no caminho acima
tflite_model_quant_file.write_bytes(tflite_model)

Após executar o código acima, o modelo estará convertido, salvo e pronto para ser utilizado em dispositivos como um modelo embarcado!

Neste artigo, abordamos a técnica de Quantização e sua utilidade em aplicações mobile e IoT, mostrando as possíveis quantizações utilizando a biblioteca TensorFlow Lit. No próximo artigo, vamos falar sobre uma outra técnica de compressão de modelos chamada “weight pruning” (ou poda de pesos) que funciona de forma diferente da quantização mas também apresenta resultados interessantes.

--

--