Implementação de referência e especificação arquitetural de uma arquitetura híbrida multimodal em torno do framework
bitnet.cpp(Microsoft), combinando encoders especialistas em alta precisão com um núcleo de linguagem ternário{-1, 0, +1}. Estruturada como pipeline de pesquisa reproduzível para Google Colab. As Fases 0–1 foram validadas em T4; as Fases 2–3 requerem L4/A100 e ainda aguardam execução por limitação de acesso a compute. Se você tem acesso a hardware ou créditos de nuvem e achou este projeto interessante, contribuições são muito bem-vindas.
O projeto organiza-se em dois componentes que se complementam:
| Componente | Localização | Papel |
|---|---|---|
| Biblioteca de módulos | utils/ | Código Python reutilizável, importável, documentado com docstrings NumPy e type hints |
| Notebooks de pipeline | notebooks/ | Artefatos executáveis por fase, autocontidos, prontos para Colab |
A separação é intencional: os utils/ são a camada de abstração estável, os notebooks são o protocolo de experimento executável. Os notebooks podem operar de forma autocontida (inline) ou importar os utils/ quando o projeto estiver montado no Drive.
multimodal-ternary-llm/
│
├── notebooks/ # Pipeline de implementação — 1 notebook por fase
│ ├── 00_baseline_teacher.ipynb # Fase 0 — Teacher FP16/BF16, interfaces, critérios de aceite
│ ├── 01_connector_pretraining.ipynb # Fase 1 — Pré-treinamento isolado do conector MLP
│ ├── 02_multimodal_alignment.ipynb # Fase 2 — Distilação KL + alignment loss
│ ├── 03_ternary_transition.ipynb # Fase 3 — QAT contínuo, conversão ternária
│ └── 04_export_deploy.ipynb # Fase 4 — Exportação .safetensors, bitnet.cpp, benchmarks
│
└── utils/ # Módulos Python reutilizáveis (biblioteca interna)
├── __init__.py
├── bit_layers.py # BitLinear, quantização ternária, ReLU², replace_linear
├── colab_utils.py # Drive, seeds, logging, checkpoints, device
├── connector.py # ModalityConnector — MLP 2 camadas GeLU, BF16
├── heads.py # ClassificationHead, RegressionHead, ActionHead
├── losses.py # HybridLoss, distillation KL, alignment, stability
└── training.py # QATScheduler, train_one_epoch, build_optimiser
Os módulos em utils/ são código de biblioteca: reutilizáveis, totalmente documentados (docstrings NumPy/SciPy), com type hints em todas as assinaturas. São independentes dos notebooks e podem ser importados diretamente.
bit_layers.pyImplementação do BitLinear — substituto direto de nn.Linear — com quantização ternária de pesos via absmean scaling e estimador straight-through para retropropagação. Inclui:
BitLinear — camada linear ternária treinávelquantise_weights_ternary — quantização {-1, 0, +1}quantise_activations_8bit — quantização de ativações absmaxreplace_linear_with_bitlinear — conversão recursiva de um módulo inteiroReLUSquared — ativação ReLU² conforme especificado no BitNetfrom utils.bit_layers import BitLinear, replace_linear_with_bitlinear
# Substituir todas as projeções lineares de um backbone existente
model = replace_linear_with_bitlinear(model, skip_names=["lm_head"])
connector.pyModalityConnector — MLP de 2 camadas com ativação GeLU, mantido em BF16. Projeta a saída de encoders especializados (visão, séries temporais) para o espaço de embedding do backbone BitNet.
from utils.connector import ModalityConnector
connector = ModalityConnector(d_enc=1024, d_model=2048)
projected = connector(encoder_output) # (B, seq, 2048)
losses.pyHybridLoss — agregador configurável das 5 funções de perda da especificação (Seção 6):
| Componente | Função |
|---|---|
language | Cross-entropy autoregressiva |
distill | KL divergence logits teacher→student |
align | Cosine similarity embeddings encoder/connector |
task | Classificação, regressão ou ação (plug-in) |
stability | Regularização de outliers de ativação (BitNet a4.8) |
from utils.losses import HybridLoss
loss_fn = HybridLoss(w_language=1.0, w_distill=0.5, w_align=0.1, temperature=4.0)
losses = loss_fn(student_logits, labels, teacher_logits, student_embeds, teacher_embeds)
# losses["total"], losses["language"], losses["distill"], losses["align"], ...
heads.pyCabeças de saída por tarefa, mantidas em FP16/BF16:
ClassificationHead — pooling (mean ou cls) + linear, com dropoutRegressionHead — regressão contínua com MSE ou Huber lossActionHead — controle/ação com tanh bounds, float32 por padrãotraining.pyUtilitários de treinamento:
build_optimiser — AdamW com grupos de parâmetros diferenciados por weight decaybuild_scheduler — warmup linear + cosine annealingtrain_one_epoch — loop de treinamento com AMP, grad clip e loggingQATScheduler — ramp gradual de força de quantização 0.0 → 1.0freeze_module / unfreeze_module — controle granular de gradientesget_trainable_param_count — diagnóstico de parâmetrosfrom utils.training import QATScheduler, build_optimiser
optimiser = build_optimiser(model, lr=1e-4)
qat = QATScheduler(total_steps=3000, warmup_fraction=0.2)
for step in range(3000):
strength = qat.get_strength() # 0.0 → 1.0
set_quant_strength(model, strength)
qat.step()
colab_utils.pyInfraestrutura de sessão para Google Colab:
mount_drive — monta o Drive (no-op fora do Colab)set_global_seed — seeds determinísticas (random, numpy, torch, CUDA)resolve_device — seleciona GPU/CPU e loga VRAM disponívelsave_checkpoint / load_checkpoint — persistência em Driveconfigure_logging — logging estruturado com file handler opcionalensure_drive_dirs — cria a árvore de diretórios do projeto no DriveCada notebook corresponde a uma fase do pipeline e é autocontido: instala dependências, fixa seeds, monta o Drive e documenta cada decisão com células Markdown antes de cada bloco de código. O tom é formal e acadêmico, adequado para uso como artefato de pesquisa reproduzível.
utils/ nos notebooksOs notebooks definem os módulos principais inline por padrão (portabilidade no Colab Free). Para usar os utils/, adicionar no início de qualquer notebook:
import sys
sys.path.insert(0, "/content/drive/MyDrive/multimodal-ternary-llm")
from utils.bit_layers import BitLinear, replace_linear_with_bitlinear
from utils.connector import ModalityConnector
from utils.losses import HybridLoss
from utils.training import QATScheduler, build_optimiser
from utils.heads import ClassificationHead, ActionHead
from utils.colab_utils import set_global_seed, mount_drive, save_checkpoint
Conforme a Seção 0.4 da especificação:
Célula 1 — Markdown: Título, Resumo, Fase
Célula 2 — Markdown: Índice
Célula 3 — Code: !pip install (versões fixadas)
Célula 4 — Code: Imports + seeds + device + constantes
Célula 5 — Code: Google Drive mount + criação de diretórios
Célula 6 — Markdown: Fundamentação teórica
Células N — Code/Markdown alternados (cada bloco precedido por Markdown)
Célula N-1 — Code: Validação e métricas
Célula N — Code: Salvamento de artefatos no Drive
Célula fim — Markdown: Conclusões e próximos passos
| Notebook | Fase | Componentes treináveis | Loss ativa |
|---|---|---|---|
00_baseline_teacher | 0 | Nenhum (só avaliação) | — |
01_connector_pretraining | 1 | Conector MLP | Language CE |
02_multimodal_alignment | 2 | Conector + top-N blocos do backbone | Language + Distillation KL + Alignment |
03_ternary_transition | 3 | Backbone completo (QAT) | Language CE |
04_export_deploy | 4 | Nenhum (congelado) | — (benchmarks) |
| Componente | Precisão | Justificativa |
|---|---|---|
| Encoders especialistas | FP16/BF16 | Preservar fidelidade perceptual |
| Connector MLP | BF16 | Alta precisão no alinhamento cross-modal |
| Backbone (BitNet) | Ternário {-1,0,+1} | Eficiência de inferência extrema |
| Ativações do backbone | INT8 (baseline), INT4 (avançado) | Balancear custo e outlier sensitivity |
| Cabeças de tarefa | FP16/BF16 | Sensibilidade numérica na saída |
/content/drive/MyDrive/multimodal-ternary-llm/
├── checkpoints/
│ ├── phase0_baseline/tokenizer/
│ ├── phase1_connector/connector_phase1.pt
│ ├── phase2_alignment/phase2_aligned.pt
│ ├── phase3_ternary/phase3_ternary_backbone.pt
│ └── phase4_deploy/
├── export/
│ ├── ternary_backbone.safetensors
│ ├── tokenizer/
│ └── deployment_report.json
├── logs/
└── metrics/
├── phase0_baseline_metrics.json
├── modality_interfaces.json
├── acceptance_criteria.json
├── phase1_metrics.json
├── phase2_metrics.json
├── phase3_metrics.json
└── phase4_final_report.json
| Recurso | Mínimo | Recomendado |
|---|---|---|
| GPU | T4 (Colab Free) | L4 / A100 80 GB |
| Python | 3.10+ | 3.11 |
| PyTorch | 2.x | 2.3+ |
| RAM (CPU) | 12 GB | 32 GB |
| Armazenamento Drive | 10 GB | 50 GB |
Fases 0 e 1 executam em T4. Fases 2 e 3 (distilação + QAT de backbone completo) requerem L4 ou A100 para escala de produção. Fase 4 (benchmarks) é limitada pelo hardware disponível.
3 commits
Jupyter Notebook
71.4%
Python
28.6%
Implementação de referência e especificação arquitetural de uma arquitetura híbrida multimodal em torno do framework
bitnet.cpp(Microsoft), combinando encoders especialistas em alta precisão com um núcleo de linguagem ternário{-1, 0, +1}. Estruturada como pipeline de pesquisa reproduzível para Google Colab. As Fases 0–1 foram validadas em T4; as Fases 2–3 requerem L4/A100 e ainda aguardam execução por limitação de acesso a compute. Se você tem acesso a hardware ou créditos de nuvem e achou este projeto interessante, contribuições são muito bem-vindas.
O projeto organiza-se em dois componentes que se complementam:
| Componente | Localização | Papel |
|---|---|---|
| Biblioteca de módulos | utils/ | Código Python reutilizável, importável, documentado com docstrings NumPy e type hints |
| Notebooks de pipeline | notebooks/ | Artefatos executáveis por fase, autocontidos, prontos para Colab |
A separação é intencional: os utils/ são a camada de abstração estável, os notebooks são o protocolo de experimento executável. Os notebooks podem operar de forma autocontida (inline) ou importar os utils/ quando o projeto estiver montado no Drive.
multimodal-ternary-llm/
│
├── notebooks/ # Pipeline de implementação — 1 notebook por fase
│ ├── 00_baseline_teacher.ipynb # Fase 0 — Teacher FP16/BF16, interfaces, critérios de aceite
│ ├── 01_connector_pretraining.ipynb # Fase 1 — Pré-treinamento isolado do conector MLP
│ ├── 02_multimodal_alignment.ipynb # Fase 2 — Distilação KL + alignment loss
│ ├── 03_ternary_transition.ipynb # Fase 3 — QAT contínuo, conversão ternária
│ └── 04_export_deploy.ipynb # Fase 4 — Exportação .safetensors, bitnet.cpp, benchmarks
│
└── utils/ # Módulos Python reutilizáveis (biblioteca interna)
├── __init__.py
├── bit_layers.py # BitLinear, quantização ternária, ReLU², replace_linear
├── colab_utils.py # Drive, seeds, logging, checkpoints, device
├── connector.py # ModalityConnector — MLP 2 camadas GeLU, BF16
├── heads.py # ClassificationHead, RegressionHead, ActionHead
├── losses.py # HybridLoss, distillation KL, alignment, stability
└── training.py # QATScheduler, train_one_epoch, build_optimiser
Os módulos em utils/ são código de biblioteca: reutilizáveis, totalmente documentados (docstrings NumPy/SciPy), com type hints em todas as assinaturas. São independentes dos notebooks e podem ser importados diretamente.
bit_layers.pyImplementação do BitLinear — substituto direto de nn.Linear — com quantização ternária de pesos via absmean scaling e estimador straight-through para retropropagação. Inclui:
BitLinear — camada linear ternária treinávelquantise_weights_ternary — quantização {-1, 0, +1}quantise_activations_8bit — quantização de ativações absmaxreplace_linear_with_bitlinear — conversão recursiva de um módulo inteiroReLUSquared — ativação ReLU² conforme especificado no BitNetfrom utils.bit_layers import BitLinear, replace_linear_with_bitlinear
# Substituir todas as projeções lineares de um backbone existente
model = replace_linear_with_bitlinear(model, skip_names=["lm_head"])
connector.pyModalityConnector — MLP de 2 camadas com ativação GeLU, mantido em BF16. Projeta a saída de encoders especializados (visão, séries temporais) para o espaço de embedding do backbone BitNet.
from utils.connector import ModalityConnector
connector = ModalityConnector(d_enc=1024, d_model=2048)
projected = connector(encoder_output) # (B, seq, 2048)
losses.pyHybridLoss — agregador configurável das 5 funções de perda da especificação (Seção 6):
| Componente | Função |
|---|---|
language | Cross-entropy autoregressiva |
distill | KL divergence logits teacher→student |
align | Cosine similarity embeddings encoder/connector |
task | Classificação, regressão ou ação (plug-in) |
stability | Regularização de outliers de ativação (BitNet a4.8) |
from utils.losses import HybridLoss
loss_fn = HybridLoss(w_language=1.0, w_distill=0.5, w_align=0.1, temperature=4.0)
losses = loss_fn(student_logits, labels, teacher_logits, student_embeds, teacher_embeds)
# losses["total"], losses["language"], losses["distill"], losses["align"], ...
heads.pyCabeças de saída por tarefa, mantidas em FP16/BF16:
ClassificationHead — pooling (mean ou cls) + linear, com dropoutRegressionHead — regressão contínua com MSE ou Huber lossActionHead — controle/ação com tanh bounds, float32 por padrãotraining.pyUtilitários de treinamento:
build_optimiser — AdamW com grupos de parâmetros diferenciados por weight decaybuild_scheduler — warmup linear + cosine annealingtrain_one_epoch — loop de treinamento com AMP, grad clip e loggingQATScheduler — ramp gradual de força de quantização 0.0 → 1.0freeze_module / unfreeze_module — controle granular de gradientesget_trainable_param_count — diagnóstico de parâmetrosfrom utils.training import QATScheduler, build_optimiser
optimiser = build_optimiser(model, lr=1e-4)
qat = QATScheduler(total_steps=3000, warmup_fraction=0.2)
for step in range(3000):
strength = qat.get_strength() # 0.0 → 1.0
set_quant_strength(model, strength)
qat.step()
colab_utils.pyInfraestrutura de sessão para Google Colab:
mount_drive — monta o Drive (no-op fora do Colab)set_global_seed — seeds determinísticas (random, numpy, torch, CUDA)resolve_device — seleciona GPU/CPU e loga VRAM disponívelsave_checkpoint / load_checkpoint — persistência em Driveconfigure_logging — logging estruturado com file handler opcionalensure_drive_dirs — cria a árvore de diretórios do projeto no DriveCada notebook corresponde a uma fase do pipeline e é autocontido: instala dependências, fixa seeds, monta o Drive e documenta cada decisão com células Markdown antes de cada bloco de código. O tom é formal e acadêmico, adequado para uso como artefato de pesquisa reproduzível.
utils/ nos notebooksOs notebooks definem os módulos principais inline por padrão (portabilidade no Colab Free). Para usar os utils/, adicionar no início de qualquer notebook:
import sys
sys.path.insert(0, "/content/drive/MyDrive/multimodal-ternary-llm")
from utils.bit_layers import BitLinear, replace_linear_with_bitlinear
from utils.connector import ModalityConnector
from utils.losses import HybridLoss
from utils.training import QATScheduler, build_optimiser
from utils.heads import ClassificationHead, ActionHead
from utils.colab_utils import set_global_seed, mount_drive, save_checkpoint
Conforme a Seção 0.4 da especificação:
Célula 1 — Markdown: Título, Resumo, Fase
Célula 2 — Markdown: Índice
Célula 3 — Code: !pip install (versões fixadas)
Célula 4 — Code: Imports + seeds + device + constantes
Célula 5 — Code: Google Drive mount + criação de diretórios
Célula 6 — Markdown: Fundamentação teórica
Células N — Code/Markdown alternados (cada bloco precedido por Markdown)
Célula N-1 — Code: Validação e métricas
Célula N — Code: Salvamento de artefatos no Drive
Célula fim — Markdown: Conclusões e próximos passos
| Notebook | Fase | Componentes treináveis | Loss ativa |
|---|---|---|---|
00_baseline_teacher | 0 | Nenhum (só avaliação) | — |
01_connector_pretraining | 1 | Conector MLP | Language CE |
02_multimodal_alignment | 2 | Conector + top-N blocos do backbone | Language + Distillation KL + Alignment |
03_ternary_transition | 3 | Backbone completo (QAT) | Language CE |
04_export_deploy | 4 | Nenhum (congelado) | — (benchmarks) |
| Componente | Precisão | Justificativa |
|---|---|---|
| Encoders especialistas | FP16/BF16 | Preservar fidelidade perceptual |
| Connector MLP | BF16 | Alta precisão no alinhamento cross-modal |
| Backbone (BitNet) | Ternário {-1,0,+1} | Eficiência de inferência extrema |
| Ativações do backbone | INT8 (baseline), INT4 (avançado) | Balancear custo e outlier sensitivity |
| Cabeças de tarefa | FP16/BF16 | Sensibilidade numérica na saída |
/content/drive/MyDrive/multimodal-ternary-llm/
├── checkpoints/
│ ├── phase0_baseline/tokenizer/
│ ├── phase1_connector/connector_phase1.pt
│ ├── phase2_alignment/phase2_aligned.pt
│ ├── phase3_ternary/phase3_ternary_backbone.pt
│ └── phase4_deploy/
├── export/
│ ├── ternary_backbone.safetensors
│ ├── tokenizer/
│ └── deployment_report.json
├── logs/
└── metrics/
├── phase0_baseline_metrics.json
├── modality_interfaces.json
├── acceptance_criteria.json
├── phase1_metrics.json
├── phase2_metrics.json
├── phase3_metrics.json
└── phase4_final_report.json
| Recurso | Mínimo | Recomendado |
|---|---|---|
| GPU | T4 (Colab Free) | L4 / A100 80 GB |
| Python | 3.10+ | 3.11 |
| PyTorch | 2.x | 2.3+ |
| RAM (CPU) | 12 GB | 32 GB |
| Armazenamento Drive | 10 GB | 50 GB |
Fases 0 e 1 executam em T4. Fases 2 e 3 (distilação + QAT de backbone completo) requerem L4 ou A100 para escala de produção. Fase 4 (benchmarks) é limitada pelo hardware disponível.
3 commits
Jupyter Notebook
71.4%
Python
28.6%