Escalando a Cirurgia Neural: Compressão Estrutural do Qwen-3B com ASVD e CPU-Offloading
Após validar o pipeline de compressão estrutural no modelo Qwen-1.5B, o próximo passo lógico na minha pesquisa era testar a escalabilidade do método. O objetivo: aplicar a mesma cirurgia de Activation-Aware Singular Value Decomposition (ASVD) combinada com LoRA Healing em uma arquitetura com o dobro do tamanho — o Qwen2.5-3B.
No entanto, ao escalar a arquitetura, esbarrei em um obstáculo físico intransponível para pesquisadores independentes: o limite de VRAM de hardware de entrada.
Neste artigo, detalho como contornei as limitações de uma GPU NVIDIA T4 de 16GB utilizando técnicas de CPU-offloading para fatorar matrizes massivas, removendo com sucesso mais de 163 milhões de parâmetros do modelo base.
O Desafio do Hardware: O Gargalo da Fatoração SVD
O Qwen-3B, operando nativamente em precisão FP16, ocupa aproximadamente 6.5 GB de VRAM. A princípio, uma placa de 16GB parece ter espaço de sobra. O problema reside na matemática da decomposição.
Durante o mapeamento de ativações, extraí o Root Mean Square (RMS) das camadas lineares para escalar os pesos antes do corte. Quando a função torch.linalg.svd tenta fatorar essas matrizes escaladas diretamente na GPU, ela exige a alocação de tensores intermediários em precisão FP32. O pico de alocação de memória gerado por essa conversão em matrizes de 3 bilhões de parâmetros excede instantaneamente os 15 GB úteis da T4, resultando em falhas críticas de Out-Of-Memory (OOM).
A Solução de Engenharia: SVD Offloading Seguro
Para evitar o colapso de memória, modifiquei a classe de amputação para isolar o gargalo matemático da GPU. Implementei um mecanismo de roteamento onde os cálculos de decomposição pesados ocorrem na memória RAM do sistema (CPU).
A ordem de alocação foi estritamente definida para garantir eficiência:
- O peso bruto (FP16) é movido da GPU para a CPU.
- Somente na CPU ele é convertido para FP32, utilizando a vasta memória RAM disponível.
- A Fatoração SVD ocorre na CPU.
- As matrizes fatiadas, agora muito menores devido ao limiar de 85% de retenção de variância, retornam para a GPU em FP16.
Essa abordagem não apenas protegeu o sistema contra falhas de OOM, como permitiu que o meu pipeline operasse de ponta a ponta de forma autônoma.
Impacto Estrutural e Fisioterapia Neural
Com o gargalo de hardware resolvido, apliquei o corte nas camadas q_proj, k_proj, v_proj, o_proj e down_proj. Os resultados da amputação foram massivos:
- Parâmetros Base (Camadas Alvo): ~1.03 Bilhão
- Parâmetros Pulverizados: 163.045.888
- Redução Absoluta: 15.77% de redução no tamanho estrutural alvo.
A perda imediata de 163 milhões de parâmetros corrompeu o roteamento sintático do modelo. Para restaurar essa capacidade, iniciei o LoRA Healing.
Injetei adaptadores de baixo posto (Rank 16, Alpha 32) em todas as camadas lineares sobreviventes. O custo dessa injeção foi de meros 33.3 milhões de parâmetros treináveis (cerca de 1.12% da rede). Em apenas duas épocas de treinamento com acúmulo de gradientes, a perda (loss) despencou de 4.50 para 3.56.
Após o treinamento, realizei o merge and unload matemático dos pesos. O modelo recuperou integralmente sua capacidade de abstração e raciocínio lógico profundo, operando em formato 100% nativo.
Resultados e Repositório Oficial
A tabela abaixo consolida a métrica de escalabilidade do meu método, comprovando que a proporção de gordura matemática e o custo de recuperação se mantêm consistentes mesmo ao dobrar a arquitetura.
| Arquitetura | Retenção (ASVD) | Parâmetros Removidos | LoRA (Custo de Cura) | Formato Final |
|---|---|---|---|---|
| Qwen-1.5B | 85% | 72.3 Milhões (14.29%) | 20.7 Milhões | FP16 Nativo |
| Qwen-3B | 85% | 163.0 Milhões (15.77%) | 33.3 Milhões | FP16 Nativo |
Esta versão do modelo prova que é possível rodar LLMs com altíssima eficiência em ambientes Edge, mitigando custos computacionais sem recorrer à latência imposta por quantizações GGUF/bitsandbytes.
O modelo Qwen-3B-ASVD-Healed está público e acessível no Hugging Face. Para integrá-lo imediatamente no seu pipeline, utilize o código abaixo:
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "Kodjaoglanian/Qwen-3B-ASVD-Healed"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map="auto"
)
prompt = "The most important concept in quantum physics is"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=50,
do_sample=True,
temperature=0.7
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
Visite o repositório completo para acessar os arquivos do modelo: Hugging Face - Kodjaoglanian/Qwen-3B-ASVD-Healed.