Curso / Lição 10
Lição 10 · Multimodal

Visão (Qwen3-VL)

Dar olhos ao modelo local é tentador — e cheio de armadilhas. Imagem vira token, o encoder de visão come memória, e um VLM pequeno pode entrar em loop e cuspir !!!! para sempre. Esta lição conta a história real desta sessão: como o Qwen3-VL-30B-A3B virou o default do @alembic/vision, e como um único parâmetro de amostragem levou a descrição do corpus de 44% para 99% das imagens.

Leia primeiro (fonte primária)
Qwen3-VL-30B-A3B (mlx-community, 4-bit) — model card

Esta lição destila esse model card + os cuidados de visão do Ahmad Osman ("LLMs 101, 2026") + a medição própria nas imagens reais do corpus do fundador. Por que importa pra missão: é o "olho" local do Alembic — e a prova de que confiabilidade vem de medir no SEU corpus, não na demo do README.

0B / 0B
params totais · ativos (MoE)
~0 tok/s
geração (110–122 medido)
0 %
imagens descritas (3729/3747)
0 GB
RAM (~19,5 · 4-bit)
Objetivos desta lição
  • Explicar por que uma imagem vira tokens — e estimar quantos um print gasta pela resolução.
  • Diagnosticar o loop de !!!! como degeneração por repetição (amostragem), não falha do modelo.
  • Distinguir temperature de repetition_penalty e por que só a penalidade levou 44% → 99%.
  • Decidir entre co-residência e passes sequenciais ao orçar DS4 (81 GB) + Qwen3-VL (20 GB) em 128 GB.
MAPA DA LIÇÃO · da imagem ao texto, e os dois lugares onde dá ruim
01 · imagem vira token + RAM 02 · bug !!!! amostragem 03 · prova 44% → 99% 04 · MoE vence o denso 05 · orçamento ▲ aqui mora o bug (e a cura) ▲ aqui mora o teto de RAM
A história inteira em uma linha: a imagem entra (01), a amostragem quebra e cura (02–03), o MoE explica a escolha do modelo (04), e o orçamento de memória fecha (05).

01 · O custo escondido: imagem também vira token

A intuição traiçoeira da visão é achar que "uma imagem é só um anexo". Não é. No pipeline de um VLM, a imagem é fatiada em patches, cada patch passa pelo encoder de visão (um ViT + uma projeção), e o resultado entra na janela de contexto como tokens — exatamente os mesmos tokens que o texto consome. Um único print em alta resolução pode custar milhares deles. E o encoder, além disso, é peso de modelo extra carregado na RAM. Resolução, portanto, é um botão de custo — não um "quanto maior, melhor".

UMA IMAGEM → MILHARES DE TOKENS · o custo que ninguém vê
print 2048×1536 · fatiado em patches cada quadrado = 1 patch encoder de visão ViT + projeção ⚠ peso extra na RAM vira fluxo de tokens visuais ×1000s por imagem janela de contexto (a MESMA do texto) a imagem ocupa esta fatia sobra p/ texto menos resolução = menos tokens gastos = mais contexto livre
Entrada não-textual também vira token. Encoders de visão adicionam memória. Patches de imagem consomem contexto. Uma única imagem em alta resolução pode consumir milhares de tokens.— Ahmad Osman, "LLMs 101 (2026)"
O encoder dorme com o cérebro
O peso do encoder de visão soma ao peso do modelo de linguagem. É por isso que, na seção 05, o Qwen3-VL (20 GB no total: LLM + encoder) não co-reside com o DeepSeek q2 de 81 GB — os dois não cabem juntos nos 128 GB. Visão não é grátis nem em tokens nem em RAM.

01b · O pipeline de um VLM, caixa por caixa

Vale abrir o que acontece dentro do modelo quando uma imagem entra. Um VLM não "vê" pixels: ele os converte em tokens que o mesmo LLM de texto já sabe processar. São cinco estágios, e cada seta é um ponto onde o custo (tokens, RAM) ou a qualidade pode mudar. Repare na decisão no meio — é onde a resolução é escolhida, e onde a Lição inteira de custo começa.

PIPELINE VLM · imagem → patches → encoder → projetor → LLM → texto
1 · imagem RGB bruto (px) resolução? ↑res = ↑patches 2 · patches grade de blocos (ex.: 14×14 px) 3 · encoder ViT extrai features ⚠ peso extra RAM 4 · projetor → espaço do LLM (vira "tokens") prompt de texto "descreva a imagem" 5 · janela de contexto tokens visuais + texto 6 · LLM (MoE) mesmo decoder do texto 7 · descrição texto gerado ▲ estágios 1–2: a resolução escolhe quantos patches → quantos tokens visuais (o custo da seção 01c). ▲ estágios 3 e 6: encoder ViT + LLM são os dois pesos que somam na RAM (o orçamento da seção 05). ▲ estágio 6: é o MESMO decoder do texto — por isso o bug de amostragem da seção 02 ataca a visão também.
Por que "vira token" não é metáfora. Depois do projetor (estágio 4), os patches são vetores no mesmo espaço dos embeddings de palavra. O LLM literalmente não distingue um token "visual" de um token de texto — ambos ocupam uma posição na janela de contexto e custam o mesmo.
Onde cada problema da lição nasce. Custo de tokens → estágios 1–2 (resolução). Custo de RAM → estágios 3 e 6 (dois pesos). Bug de !!!! → estágio 6 (a amostragem do decoder). Um pipeline, três lições.

01c · Calculadora: resolução → tokens → contexto

Agora torne o custo tangível. A regra de bolso de um ViT: ele fatia a imagem em patches de lado fixo (tipicamente 14×14 px) e cada patch vira um token visual. Então o número de tokens cresce com a área — dobrar o lado quadruplica o custo. Antes de mexer no slider, faça uma aposta:

Adivinhe antes de revelar
Um print de 2048×1536 px, fatiado em patches de 14×14, gera quantos tokens visuais — aproximadamente?
16.000 tokens. (2048÷14) × (1536÷14) ≈ 146 × 109 ≈ 15.914 patches → 1 token cada. Uma única captura de tela já come o equivalente a ~12 mil palavras de contexto. É por isso que resolução é um botão de custo, não um "quanto maior melhor".

Aqui está a conta exata, número por número — depois é sua vez no slider:

Worked example · tokens de uma imagem 2048×1536
1
Patches na largura: 2048 ÷ 14 ≈ 146. O ViT cobre a imagem com uma grade de blocos de 14 px de lado.
2
Patches na altura: 1536 ÷ 14 ≈ 109.
3
Total de patches = 146 × 109 ≈ 15.914. Cada patch vira exatamente 1 token visual após o projetor.
4
Custo em contexto ≈ 15.914 tokens — só dessa imagem, antes de uma palavra de prompt ou de resposta.
5
Agora você tenta: e se reduzir o print para 1024×768 (metade do lado)? Calcule e confira no slider. (Dica: metade do lado → ¼ da área → ~¼ dos tokens ≈ 3.978.)

Arraste a resolução (aqui de uma imagem quadrada, lado × lado — por isso a 2048 px dá ~21k, um pouco mais que o print 4:3 acima de 2048×1536). A conta de tokens e a fatia de VRAM do encoder são recalculadas, e a barra de contexto é redesenhada em escala — verde = folgado, vermelho = engole o contexto:

janela de contexto (exemplo: 32.768 tokens) ≈65% do contexto VRAM do passe (LLM 19,5 GB + ativações do encoder, cresce com a resolução) ≈ 22,4 GB 2048 px ≈ 146×146 patches ≈ 21.316 tokens — ≈65% de uma janela de 32k só nesta imagem.

Modelo do cálculo: tokens ≈ (lado ÷ 14)² para imagem quadrada; VRAM = 19,5 GB de pesos + uma parcela de ativações proporcional à resolução (estimativa de ordem de grandeza, não medida exata). A lição: menos resolução = menos tokens E menos pico de RAM.

Por que isso importa num pass de 3.747 imagens
Se cada imagem em alta resolução engole metade do contexto, você não consegue passar várias de uma vez nem deixar espaço para um prompt rico. Baixar a resolução de entrada é a primeira alavanca de custo de um pass de visão em massa — antes mesmo de pensar em qual modelo usar.

02 · O bug do '!!!!' — e por que era amostragem, não o modelo

Aqui está o coração da sessão. Ao rodar o Qwen3-VL no corpus, uma fração grande das imagens não produzia descrição: o modelo entrava num loop e repetia o mesmo caractere — !!!!!!!!… — até esgotar os tokens. O reflexo é culpar o modelo ("é pequeno demais, alucina"). Estava errado. Era degeneração por repetição: um modo de falha clássico da amostragem, em que um token de alta probabilidade se realimenta e trava a geração. A cura não é trocar de modelo — é mexer no parâmetro certo.

A primeira tentativa foi só subir a temperatura (temperature=0.5). Isso ajudou, mas parcialmente: levou a descrição a apenas ~44% das imagens. Temperatura "espalha" a distribuição, mas não penaliza repetir o que já saiu — então o loop de ! ainda escapava em mais da metade dos casos. O que matou o bug foi o repetition_penalty=1.3: ele reduz a probabilidade de tokens já emitidos, quebrando exatamente a realimentação que cria o loop.

Clique nas três configurações de amostragem e veja o que cada uma produz nas imagens-problema:

SAÍDA · greedy / temperature 0
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! …até o fim dos tokens Loop total: o token mais provável (!) se realimenta sem nenhum freio. ~0% útil.
SAÍDA · temperature 0,5 (só temperatura)
"Captura de tela de um app…" [ok]  |  outras: !!!!!!!!!… [ainda trava] Temperatura espalha a distribuição, mas não penaliza repetir. Salva parte — ~44% das imagens.
SAÍDA · temperature 0,5 + repetition_penalty 1,3
"Captura de tela de um terminal mostrando a saída de pnpm test, 138 testes verdes…" [descrição real] A penalidade derruba a prob. de tokens já emitidos: o loop de ! não fecha. 99% das imagens.

Por que temperatura sozinha não basta

As duas alavancas atacam coisas diferentes. Temperatura achata a curva de probabilidade — torna tokens menos prováveis um pouco mais possíveis, adicionando variedade. Mas se o token ! ainda é o mais provável depois de já ter saído dez vezes, a temperatura sozinha continua deixando ele vencer. repetition_penalty ataca a causa: multiplica para baixo o score de qualquer token que já apareceu, então a cada ! emitido o próximo ! fica menos provável — e o loop morre.

temperature — espalha a distribuição inteira.
• Mais diversidade, menos determinismo.
Não sabe o que já foi gerado.
• Resultado nesta sessão: ~44% — ajuda, não resolve.
repetition_penalty — pune tokens repetidos.
• Olha para o histórico da geração.
• Quebra a realimentação que cria o loop.
• Com 1,3 (+ temp 0,5): 99% — a cura real.
O loop de !!!! é degeneração por repetição — um modo de falha da amostragem, não do modelo. Curou com repetition_penalty, não com temperatura.— Achado desta sessão (corpus de visão, M5 Max)

02b · Anatomia: como o loop se forma — e como cada alavanca o ataca

Para ver por que a penalidade cura e a temperatura não, dá para olhar a distribuição de probabilidade no momento de escolher o próximo token. A cada passo o modelo produz uma curva sobre o vocabulário; a amostragem escolhe um token dessa curva. O bug nasce quando um token (!) fica tão dominante que se escolhe a si mesmo para sempre.

A MESMA DISTRIBUIÇÃO, TRÊS AMOSTRAGENS · por que só uma quebra o loop
greedy (temp 0) ! a o de "!" domina → se escolhe p/ sempre + temperatura 0,5 ! a o de curva achata, mas "!" AINDA é o mais alto + repetition_penalty 1,3 ! a o de "!" já saiu → penalizado; outro token vence ✓

E o loop em si é um ciclo de realimentação. Veja-o como fluxograma — e exatamente onde cada alavanca corta o ciclo:

O CICLO DA DEGENERAÇÃO · e o ponto onde repetition_penalty o quebra
modelo emite "!" (token mais provável) "!" entra no histórico (contexto da geração) "!" ainda é o + provável? SIM (greedy / só temp) → ciclo se fecha: !!!! para sempre rep_penalty derruba "!" → outro token ✂ a penalidade corta esta aresta
Temperatura age na curva inteira. Ela divide os logits por um fator: a curva fica mais plana, todos os tokens ganham chance — inclusive o !. Não olha o que já foi gerado, então não corta a aresta de realimentação. Por isso: ajuda (44%), não cura.
repetition_penalty age no histórico. Ela divide o score de qualquer token que já apareceu por 1,3. A cada ! emitido, o próximo ! fica menos provável — a aresta do ciclo é cortada na origem. Por isso: cura (99%).

03 · 44% → 99%: a prova no corpus inteiro

Disciplina do loop-engineering: nada é "consertado" sem prova na fronteira real. A prova aqui foi rodar o pass de visão sobre todas as imagens do corpus e contar quantas saíram com descrição de verdade. Com a temperatura sozinha, ~44%. Com repetition_penalty=1.3, 3729 de 3747 imagens descritas — 99%. As 18 restantes (~1%) são casos genuinamente difíceis, não o loop.

COBERTURA DO CORPUS · % de imagens com descrição real (animado)
0% 100% greedy ~0% · loop de !!!! em quase tudo + temp 0,5 44% · temperatura ajuda, mas não penaliza repetir + rep 1,3 99% · 3729/3747 imagens As ~18 restantes (1%) são imagens genuinamente difíceis — não mais o bug de amostragem.

O salto de 44% para 99% não veio de um modelo maior, de mais RAM ou de mais resolução. Veio de um númerorepetition_penalty=1.3 — aplicado depois de diagnosticar o modo de falha correto. É a lição central da sessão: diagnostique a causa (degeneração de amostragem) antes de trocar a ferramenta (o modelo).

Como ler "99%"
99% é cobertura — quantas imagens saíram com texto útil em vez do loop. Não é uma nota de acurácia visual. Mas é exatamente o gargalo que decide se um pass de visão de milhares de imagens é viável de rodar de uma vez: com 44% você reprocessa metade; com 99% o corpus inteiro passa numa única varredura.

03b · A cura, passo a passo (o método, não só o número)

O salto de 44% para 99% não foi sorte — foi o método do loop-engineering aplicado a um bug de amostragem. Vale destrinchar a sequência, porque ela se repete para qualquer falha de geração, não só para visão:

Worked example · do sintoma à cura, com prova
1
Sintoma. Rodar o pass de visão no corpus → muitas imagens saem como !!!!!!!!… até o limite de tokens. Cobertura inicial: ~0% útil (greedy).
2
Hipótese errada (e por que descartá-la). "O modelo é pequeno/alucina." Refutada: o mesmo modelo descreve algumas imagens perfeitamente — não é incapacidade, é um modo de falha intermitente.
3
Diagnóstico. O padrão (um caractere repetido sem fim) é a assinatura clássica de degeneração por repetição — um token dominante se realimentando. Causa na amostragem, não no modelo.
4
Tentativa 1. temperature=0.5. Mede no corpus inteiro → ~44%. Ajudou, mas a maioria ainda trava: temperatura não pune repetir.
5
Tentativa 2. + repetition_penalty=1.3. Mede de novo → 99% (3729/3747). A penalidade corta a realimentação na origem.
6
Agora você tenta (transferência). Um LLM de texto começa a repetir a mesma frase num resumo longo. Qual a primeira alavanca? (Resposta: repetition_penalty / no_repeat_ngram — mesmo modo de falha, mesma cura; subir temperatura é o reflexo errado.)
O MÉTODO COMO FLUXOGRAMA · diagnosticar a causa antes de trocar a ferramenta
sintoma: loop de !!!! é o modelo ou a amostragem? "modelo" → reflexo errado amostragem ajusta 1 parâmetro temp → rep_penalty mede no corpus: cobertura subiu? 99% ✓ done NÃO → ajusta o próximo parâmetro (não troca o modelo)

04 · Por que o MoE de poucos ativos venceu o denso gigante

Antes de virar o default, o Qwen3-VL competiu contra outros VLMs nas mesmas imagens reais do corpus, no mesmo Mac. Ele venceu por ser, ao mesmo tempo, o mais rápido e o mais preciso — e a razão repete a física da Lição 04: contam os parâmetros ativos, não os totais. O Qwen3-VL tem 30B no disco mas só ~3B ativos por token (MoE), então gera a 110–122 tok/s em ~19,5 GB. O Qwen2.5-VL-72B é denso: cada token paga os 72B inteiros — 11 tok/s e 43,9 GB, e ainda errou um ícone que o MoE leu certo.

MoE (3B ativos) vs DENSO (72B ativos) · roteador acende poucos especialistas
★ Qwen3-VL-30B-A3B — MoE 30B no disco · só ~3B ativos por token o roteador acende 1 de N especialistas: ativo dormindo (custo zero/token) velocidade RAM → 110–122 tok/s · 19,5 GB · cabe sobrando Qwen2.5-VL-72B — denso 72B no disco · TODOS ativos por token cada token paga o modelo inteiro: todos acesos a cada passo velocidade RAM → 11 tok/s · 43,9 GB · lento e pesado

A tabela completa do benchmark

Quatro candidatos, as mesmas imagens reais do corpus, o mesmo M5 Max. O vencedor não foi o maior — foi o que casou velocidade, footprint pequeno e leitura correta do texto dentro da imagem:

ModeloTipotok/sRAMVeredicto
Qwen3-VL-30B-A3BMoE · 3B ativos110–12219,5 GBVenceu. Mais preciso; leu o texto exato na imagem. Agora é o default do @alembic/vision.
Qwen2.5-VL-72Bdenso1143,9 GBMais lento e menos preciso num ícone. Tamanho não comprou acurácia.
diffusiongemmadenso · multimodal84,718,5 GBOk. Multimodal de fato; roda via mlx-vlm da branch main.
InternVL3-8Bdenso5,7 GBLeve. Bom nó de fallback quando a folga aperta.

Como rodar o vencedor — é um modelo MLX, servido pela CLI mlx_vlm:

mlx_vlm.generate --model mlx-community/Qwen3-VL-30B-A3B-Instruct-4bit --image foto.png --temperature 0.5 --repetition-penalty 1.3— invocação típica do pass de visão (os dois flags que importam vêm da seção 02)
Mesma física da Lição 04: num Mac de memória unificada, o que decide a velocidade são os parâmetros ativos, não os totais. Um MoE de 30B/3B-ativos lê a imagem com a inteligência de um modelo grande e a velocidade de um pequeno. Foi por isso — somado à correção de amostragem da seção 02 — que ele virou o default do @alembic/vision.

04b · O comparativo estendido — e como escolher por critério

A tabela do benchmark acima mediu velocidade, RAM e acurácia. Mas a escolha real depende de qual eixo você prioriza. Esta segunda tabela põe os quatro VLMs contra os critérios de decisão — tipo, parâmetros ativos, multimodalidade e papel no setup. Os campos medidos vêm desta sessão; o que não foi verificado está marcado [uncertain], nunca inventado:

ModeloTipo / ativosRAM (4-bit)MultimodalLicençaPapel no setup
Qwen3-VL-30B-A3BMoE · ~3B ativos~19,5 GBimagem + texto[uncertain] (ver model card)Default do @alembic/vision — rápido + preciso.
Qwen2.5-VL-72Bdenso · 72B ativos43,9 GBimagem + texto[uncertain]Descartado: lento e errou um ícone. Tamanho ≠ acurácia.
diffusiongemmadenso · multimodal18,5 GBimagem + texto[uncertain]Alternativa OK; roda via mlx-vlm da branch main.
InternVL3-8Bdenso5,7 GBimagem + texto[uncertain]Fallback leve quando a folga de RAM aperta.

As mesmas quatro opções, plotadas no plano que realmente importa para rodar local: RAM (eixo X) × velocidade (eixo Y). O canto bom é "rápido e leve":

PLANO DE DECISÃO · velocidade × RAM dos 4 VLMs (mesmo Mac, mesmas imagens)
tok/s 120 60 0 RAM (GB) → 10 20 40 ★ rápido + leve = ideal Qwen3-VL ★ 115 t/s · 19,5 GB diffusiongemma 84,7 t/s · 18,5 GB InternVL3-8B 5,7 GB · t/s [uncertain] Qwen2.5-VL-72B 11 t/s · 43,9 GB O vencedor não foi o maior — foi o do canto superior-esquerdo: rápido, leve e preciso.
Critério: velocidade
Quem é o mais rápido?
clique pra virar ↻
Resposta
Qwen3-VL (110–122 t/s) graças aos ~3B ativos (MoE). diffusiongemma vem logo atrás (84,7 t/s).
Critério: leveza
Quem cabe na menor RAM?
clique pra virar ↻
Resposta
InternVL3-8B (5,7 GB) — por isso é o bom nó de fallback quando a folga aperta.
Critério: tamanho
O maior (72B) ganhou?
clique pra virar ↻
Resposta
Não. Qwen2.5-VL-72B: 11 t/s, 43,9 GB, e ainda errou um ícone que o MoE leu certo. Tamanho ≠ acurácia.

05 · Co-residência: DS4 + Qwen3-VL não cabem juntos

Resta o problema de orçamento. O cérebro (DeepSeek-V4-Flash q2) ocupa ~81 GB. A visão (Qwen3-VL) ocupa ~20 GB. Somados, são ~101 GB de pesos — e isso ignora KV cache, ativações e o macOS. Tentar manter os dois residentes ao mesmo tempo encosta no teto de 128 GB e dispara page faults: o SO começa a paginar memória para o disco e a performance despenca (ou estoura em OOM). A regra é dura: DS4 e Qwen3-VL não co-residem — eles rodam em passes sequenciais.

Alterne entre tentar co-residir e o modo sequencial e veja a RAM:

CO-RESIDÊNCIA · pesos somados vs teto 128 GB
teto seguro 80% (102 GB) 128 GB DS4 81 GB VL 20 ≈101 GB só de pesos — + KV + macOS cruza o teto: page faults, paginação no disco, risco de OOM.
PASSES SEQUENCIAIS · só um modelo grande por vez
PASS A — só o cérebro DS4 81 GB ✓ folga PASS B — só a visão (DS4 descarregado) VL 20 GB ✓ muita folga · pico baixo

Na prática: o pass de visão descreve as imagens com o DeepSeek descarregado; depois o cérebro volta para o trabalho de texto. Você paga alguns segundos de reload por troca e ganha estabilidade total — em nenhum momento a RAM cruza o teto, porque o cérebro e a visão nunca estão grandes ao mesmo tempo. É o mesmo princípio de orçamento da Lição 08, aplicado à visão.

Por que não "só co-residir e rezar"
Memória unificada não é elástica: passar do teto não fica "um pouco mais lento", vira paginação em disco (centenas de vezes mais lenta) ou morte por OOM. Sequenciar é a escolha de engenharia que troca latência previsível (segundos de reload) por um risco que você não quer (um pass de 3747 imagens travando no meio).

Fixe os conceitos (flashcards)

Clique pra virar. Tente lembrar a resposta antes de virar — recuperação ativa fixa mais que reler. Estes quatro fecham a lição inteira:

Custo
Por que uma imagem "vira token"?
clique pra virar ↻
Resposta
O ViT fatia em patches; cada patch → 1 token visual no MESMO contexto do texto. Tokens ≈ (lado ÷ 14)² — cresce com a área.
Bug
O loop de !!!! é falha de quê?
clique pra virar ↻
Resposta
Da amostragem (degeneração por repetição), não do modelo. Um token dominante se realimenta até o fim dos tokens.
Cura
temperature ou repetition_penalty?
clique pra virar ↻
Resposta
repetition_penalty=1.3. Temperatura achata a curva (44%) mas não pune repetir; a penalidade corta a realimentação → 99% (3729/3747).
Orçamento
DS4 + Qwen3-VL: juntos ou separados?
clique pra virar ↻
Resposta
Separados — passes sequenciais. 81 + 20 ≈ 101 GB só de pesos; com KV + macOS cruza os 128 GB → page faults/OOM.

Revisão cumulativa — recupere de memória

Antes de clicar: tente responder de cabeça. Recuperar da memória (não reler) é o que fixa de verdade. As quatro opções têm o mesmo tamanho de propósito — sem pista pela forma.

1. O Qwen3-VL repetia !!!! até o fim dos tokens. Qual era a causa real?
Correto: c. O loop de ! é o token mais provável se realimentando. temperature=0.5 sozinho salvou só ~44%; repetition_penalty=1.3 penaliza tokens já emitidos e quebra o loop → 99% (3729/3747).
2. Por que subir só a temperatura não resolveu o loop por completo?
Correto: b. As alavancas atacam coisas diferentes: temperatura adiciona variedade à curva inteira; repetition_penalty derruba tokens já emitidos. O loop é repetição, então só a penalidade o mata de vez (44% → 99%).
3. Por que o DeepSeek q2 e o Qwen3-VL rodam em passes sequenciais, e não juntos?
Correto: a. Memória unificada não é elástica: passar do teto vira paginação em disco ou OOM. Sequenciar (descarrega o cérebro, roda a visão, recarrega) troca segundos de reload por estabilidade — o pico nunca cruza o teto.
4. Você reduz um print de 2048 px para 1024 px no lado maior. O que acontece com o custo em tokens visuais?
Correto: d. Tokens ≈ (lado ÷ 14)²: metade do lado → ¼ da área → ~¼ dos tokens (≈15.914 → ≈3.978). a confunde lado com área (o erro mais comum); b ignora que cada patch vira 1 token e o nº de patches depende da resolução; c inverte a relação — menos resolução é menos patches, não mais.
💬 Travou em algo? Eu sou seu professor neste curso — pergunte. "Qual a diferença entre repetition_penalty e no_repeat_ngram?", "Como meço quantos tokens uma imagem gasta?", "Dá pra manter o encoder de visão residente e só trocar o LLM?". É só dizer.