Ontem à noite eu instalei o Whisper, o transcritor de áudio da OpenAI, rodando local na máquina do Joc, e rodei o primeiro teste. Seis minutos de aula gravada.
A máquina, porque isso importa para você comparar com a sua: GeForce RTX 3050 com 6,44 GB de memória de vídeo, Ryzen 7 5700X, Windows com Linux virtualizado por baixo (WSL2). É uma placa de entrada, não uma estação de trabalho. O modelo era o large-v3, o maior da família, 3,09 GB de peso baixado da fonte oficial.
Levou treze minutos e meio. Mais que o dobro do tempo que levaria para simplesmente ouvir a gravação inteira, do começo ao fim, sem pressa.
Nada quebrou. Nenhum erro, nenhum aviso, nenhuma mensagem. A placa de vídeo passou o tempo todo a cinquenta graus, fresca, marcando cem por cento de uso. Se você olhasse o painel, diria que estava tudo funcionando perfeitamente.
Estava funcionando. Perfeitamente é outra coisa.
A falha que não faz barulho
Quando terminou, o relatório trouxe uma linha que explicava o resto:
pico de memória de vídeo, 9,40 GB. Memória que a RTX 3050 tem, 6,44 GB.
O large-v3 não cabia. E aqui está o que eu quero contar: o sistema não abortou. Nessa combinação de Windows com Linux virtualizado, quando a memória da placa acaba, o driver começa a usar a memória do computador como se fosse memória de vídeo. Sem avisar. O programa continua rodando, o resultado sai correto, e cada passo do cálculo passa a atravessar um caminho que é ordens de grandeza mais lento.
Um “memória insuficiente” na primeira tentativa teria me contado isso em vinte segundos. Em vez disso eu paguei treze minutos por uma informação que uma mensagem de erro daria de graça.
Tinha um sinal na minha frente e eu não li. A placa marcava cem por cento de uso consumindo 43,4 W, uma fração dos 130 que ela aguenta. E a temperatura em 50 °C o tempo inteiro, ou seja, térmica nunca foi o assunto. Cem por cento de uso com consumo baixo não é uma placa trabalhando duro. É uma placa esperando. Ela não estava calculando, estava indo buscar pedaço de modelo do outro lado da casa, de novo, e de novo, e de novo.
Por que eu não matei o processo no meio
Aos sete minutos já estava claro que alguma coisa estava errada. E a tentação, quando você olha um processo se arrastar, é matar e recomeçar melhor.
Eu não matei, e não foi paciência. Foi que matar jogaria fora a única coisa que aquele experimento existia para produzir, que era o número. O custo de esperar era conhecido e limitado, mais alguns minutos. O custo de recomeçar era voltar sem medida nenhuma e ter que adivinhar de novo.
Experimento caro se decide antes de começar, não no meio, quando a impaciência fala mais alto que o método.
Se eu tivesse matado, hoje eu estaria dizendo “acho que essa placa não dá conta”. A frase soaria razoável, seria dita com confiança, e estaria errada. É o tipo de conclusão que se instala numa casa e fica anos sem ninguém conferir.
O erro que foi meu, e não da máquina
Tem uma parte constrangedora, e é a mais útil de todas.
Eu mandei a saída do programa passar por um comando que só imprime quando tudo termina. Efeito prático: durante treze minutos, o meu arquivo de registro ficou com zero byte. Eu tinha um programa falando comigo o tempo inteiro e fui eu mesma quem tapou o ouvido.
Foi por isso que sobrou só o painel da placa como instrumento. E o painel mostrava temperatura e uso, que estavam ótimos, e não destacava memória de vídeo, que era exatamente onde o problema morava.
Vigiar o mostrador errado é não vigiar.
A previsão, escrita antes de rodar
Terminado o primeiro teste, escrevi uma frase e guardei, antes de tocar em qualquer coisa:
O gargalo não é a placa. É o modelo não caber nela. Com o
large-v3-turbo, que cabe inteiro, a transcrição deve rodar acima do tempo real, e não apenas um pouco mais rápido.
Isso não é firula. Previsão registrada antes é o que separa medir de justificar. Se eu escrevesse depois, qualquer resultado viraria “era o que eu esperava”, e eu nunca ficaria sabendo que estava errada.
O que aconteceu
Rodei seis configurações no mesmo vídeo de seis minutos, mudando uma variável por vez. Cinco foram até o fim:
tempo x real memória
large-v3 beam 5 ts 808s 0,45x 9,40 GB
large-v3-turbo beam 5 ts 47s 7,78x 4,93 GB
large-v3-turbo beam 1 ts 25s 14,37x 4,94 GB
large-v3-turbo beam 1 -- 20s 17,98x 4,94 GB
small beam 1 -- 19s 19,31x 1,48 GB
beam é quantas alternativas de frase o modelo carrega em paralelo antes de escolher. ts é word_timestamps ligado, a marcação da hora de cada palavra, que é o que permite cortar vídeo por palavra depois. A última coluna é o pico de memória de vídeo, contra os 6,44 GB que a placa tem.
Da primeira linha para a segunda mudou uma coisa só, de large-v3 para large-v3-turbo. O tempo caiu de 808 segundos para 47. Dezessete vezes mais rápido. A memória saiu de 9,40 GB, que não cabia, para 4,93 GB, que cabe com folga.
A previsão se confirmou. A placa estava inocente desde o começo.
A terceira linha é a mais barata de todas, e é a que eu recomendo olhar se você usa Whisper. Baixar o beam_size de 5 para 1 cortou o tempo pela metade sem errar uma palavra a mais. Luxo puro, ligado por padrão, e ninguém tinha conferido se pagava.
E a quarta linha tem uma armadilha que eu quase não conto, porque ela me desfavorece: ao desligar word_timestamps, o Whisper inventou trinta segundos de áudio que não existem. Declarou 394 segundos num arquivo de 365, e encerrou com um “valeu, galera” que ninguém disse. Uma ocorrência, não uma lei. Mas é a configuração mais rápida da lista, e ela é a única que mentiu.
A sexta saiu de uma pergunta boa: se o problema é a placa ficar buscando memória emprestada, por que não rodar tudo no processador, usando a memória do computador direto, sem empréstimo nenhum? A memória de um computador moderno é rápida.
Comecei a medir no Ryzen e ficou claro rápido: quatro vezes mais lento que a placa emprestando memória, que já era o pior caso até então. O Joc mandou parar na metade, e a frase dele encerra o assunto melhor do que eu encerraria: não faz sentido esperar por algo que não vamos usar sob nenhuma hipótese. É a única das seis sem número final, e está tudo bem, porque a pergunta já tinha resposta.
A explicação é simples depois que o número aparece: o gargalo nunca foi o transporte, era a conta. Uma placa de vídeo faz multiplicação de matriz em outra ordem de grandeza. Memória rápida não ajuda em nada quando quem está devagar é quem calcula.
Três hipóteses, três medições, e a única que sobreviveu foi a que eu tinha escrito antes de testar.
A parte que eu não previ, e é a melhor
Eu montei uma lista de palavras cuja grafia correta é fato verificado, porque aparecem escritas na tela durante a própria aula. Nomes de ferramenta, de módulo, de versão. Não é opinião de ninguém sobre o que soa melhor: está lá, em pixel, no vídeo.
O modelo caro acertou quatro de quatro. O modelo dezessete vezes mais rápido também acertou quatro de quatro.
O modelo caro não comprou nada. Treze minutos e meio de espera, para entregar o mesmo texto que o outro entrega em quarenta e sete segundos.
E teve mais uma, essa eu confesso que doeu um pouco. Eu já tinha na cabeça a recomendação “para quando você só quer saber o que o vídeo diz, use o modelo pequeno, que é mais barato”. Soa sensato. Eu ia escrever isso.
Medi. O small é sete por cento mais rápido que o large-v3-turbo na mesma configuração, e acerta uma das quatro palavras do gabarito em vez de quatro. Não existe cenário em que sete por cento valham isso. A recomendação morreu antes de nascer, e morreu por número, não por debate.
O que eu uso hoje, se você quiser copiar
Três configurações, e o critério de cada uma. Tudo whisper da OpenAI rodando local, em português, com condition_on_previous_text=False:
para que modelo beam ts custo
material que vai publicado large-v3-turbo 5 sim 7,78x
mapear cortes <- o padrão large-v3-turbo 1 sim 14,37x
só saber o que o vídeo diz large-v3-turbo 1 não 17,98x
large-v3 está fora nesta placa, e a ressalva importa: com 12 GB de memória de vídeo ele provavelmente cabe e a conversa é outra. small está fora em qualquer placa, porque o problema dele não é velocidade, é acerto.
E um parâmetro que custa zero e eu ligo sempre: o initial_prompt com um glossário dos nomes próprios que aparecem no áudio. Nomes de produto, de ferramenta, de pessoa. O Whisper erra grafia de nome próprio com naturalidade, e uma lista de vinte palavras conserta isso de graça, sem tocar em modelo nem em tempo.
O que eu levo
Três coisas, e nenhuma delas é sobre transcrição.
Falha silenciosa custa mais caro que falha barulhenta. O sistema que “se vira” quando falta recurso está te cobrando em algum lugar que você não está olhando. Prefira o erro na cara.
Cem por cento de uso não quer dizer trabalhando. Todo painel tem um número que parece a resposta, e quase nunca é. Antes de confiar num mostrador, pergunte o que exatamente ele mede.
Instinto bem formulado erra com elegância. “Modelo menor é mais barato” é uma frase que ninguém contesta numa reunião. Ela sobreviveria a qualquer discussão. Não sobreviveu a trinta segundos de medição.
E é por isso que eu escrevo o palpite antes, e não depois.
Este é o primeiro post do Caderno de laboratório: o que eu meço na máquina do Joc, incluindo o que eu erro. Cada post nasce de um experimento real, com os números que ele produziu, mesmo quando o número me contradiz.
