Percurso de um novato no treino de uma pequena LLM em português europeu

Community Article
Published August 9, 2026

Introdução

Este texto descreve o percurso experimental de construção e treino de uma pequena Large Language Model (LLM) orientada para o português europeu. O ponto de partida foi o de um principiante na área: que não pretende reproduzir um modelo de grande escala nem competir com os sistemas actualmente disponíveis, mas compreender minimamente, de forma prática, o que é necessário para construir uma LLM, desde a preparação dos dados até ao treino e avaliação do modelo.

A orientação para o português europeu acrescentou uma dificuldade que não estava presente no simples exercício de treinar uma pequena LLM. Não basta substituir os textos em inglês por textos em português. É necessário encontrar corpora adequados, distinguir português europeu de outras variantes, seleccionar conteúdos de qualidade, eliminar dados inadequados ou redundantes e, posteriormente, construir datasets apropriados às diferentes fases do treino.

O percurso começou pela aprendizagem dos conceitos fundamentais e pela avaliação das ferramentas disponíveis para efectuar o treino. Depois de algumas experiências com o nanochat, foi criada uma versão adaptada para português, o nanochatpt, e foram desenvolvidos mecanismos para preparar datasets compatíveis com o seu processo de treino. A partir daí, o trabalho passou progressivamente da utilização de datasets existentes para a investigação, classificação, filtragem e combinação de diferentes corpora.

O primeiro resultado completo foi o treino de um modelo depth 16, com aproximadamente 0,9 mil milhões de parâmetros, utilizando cerca de 10 mil milhões de tokens no pré-treino e uma fase posterior de SFT. Este primeiro modelo permitiu não só validar a infraestrutura e o processo de treino, mas também observar de forma concreta as limitações de uma abordagem ainda muito pouco refinada.

O objectivo deste relato não é apenas documentar o caminho percorrido, as decisões tomadas, os problemas encontrados, os recursos possiveis de serem explorados e usados, assim como aquilo que ainda falta fazer para obter uma pequena LLM realmente adequada ao português europeu.

A preparação

A preparação da viagem começou com a leitura dos seguintes livros, dos quais segue uma breve descrição.

Sebastian Raschka, Build a Large Language Model (From Scratch) https://amzn.to/4fqvn0D

Pedro Domingos, The Master Algorithm: How the Quest for the Ultimate Learning Machine Will Remake Our World https://www.wook.pt/livro/the-master-algorithm-pedro-domingos/17980273

No primeiro livro existe uma explicação, e progressiva, em como construir um modelo de linguagem (LLM) a partir do zero. O autor precorre os diversos estágios desde a concepção e implementação dos diferentes componentes de um LLM até à preparação dos dados, pré-treino com um corpus geral e afinação para tarefas específicas. Também são abordados aspectos como a classificação de texto, a utilização de dados próprios, o alinhamento através de feedback humano e a integração de pesos pré-treinados. Através de explicações, diagramas e exemplos, o livro procura tornar compreensível o funcionamento interno dos LLM, permitindo perceber não só como são construídos e treinados, mas também as suas limitações e formas de os adaptar.

O segundo livro apresenta uma visão abrangente sobre a procura de um algoritmo de aprendizagem universal capaz de aprender a partir dos dados e resolver todos os tipos de problemas. O autor explora as principais correntes existentes: os simbolistas, conexionistas, evolucionários, bayesianos e baseados em analogias; explicando os seus princípios, vantagens e limitações. Ao longo do livro, mostra como estas abordagens procuram extrair conhecimento dos dados e levanta a possibilidade de as combinar numa teoria unificada da aprendizagem. Para além dos aspectos técnicos, Domingos analisa as consequências científicas, económicas e sociais de máquinas cada vez mais capazes de aprender autonomamente, discutindo o impacto da inteligência artificial na ciência, nos negócios, na privacidade e nas sociedades.

A aprendizagem e compreensão do processo no essencial, não exige conhecimentos avançados de matemática, mas ajuda ter alguns conhecimentos de calculo, em particular derivadas parciais e gradientes, algebra linear e estatistica.

A escolha do framework a usar

Com o fim do ano académico, a atenção foi orientada para conhecer o software disponivel para efectuar o treino de uma LLM do principio ao fim, contemplando as diversas fases do processo. Assim como a aquisição de conhecimento sobre algum jargão da área.

Segue uma uma pequena lista das frameworks, enunciando o seu objectivo, escala e utilzadores tipicos.

Framework Objetivo principal Escala típica
nanochat Treino, aprender e experimentar 100M–5B parâmetros
nanollama Treino, aprender e experimentar 100M–7B parâmetros
nanoGPT Aprender e experimentar <1B parâmetros
Megatron-LM Treino de modelos em produção 7B–1T+ parâmetros
MaxText Treino de modelos em produção com JAX 7B–1T+ parâmetros
DeepSpeed Treino distribuído e otimização Qualquer escala
FSDP (PyTorch) Paralelização distribuída nativa Até dezenas de B de parâmetros
torchtitan Investigação e treino distribuído Modelos de grande escala, incluindo Llama
ColossalAI Treino distribuído e otimização Grandes modelos
Axolotl Fine-tuning de modelos existentes Modelos pré-treinados
TRL Fine-tuning e alinhamento (RLHF, DPO, GRPO) Modelos pré-treinados

De acordo com a minha condição de novato, os objectivos e os recursos, a escolha incidiu sobre o nanochat, disponível em https://github.com/karpathy/nanochat.

O nanochat é apresentado como um projecto experimental concebido para aprender, de forma prática, como construir e treinar um modelo de linguagem moderno desde o inicio. O autor reúne num único projecto os principais componentes de um sistema de linguagem, desde a preparação e tokenização dos dados até ao pré-treino, finetuning e reinforcment learning e utilização do modelo através de uma interface de conversação. Produz modelos funcionais e pela pequena dimensão da base de código e a via escolhida para estruturar, facilita a comprenção processo de construção de um LLM, permitindo experimentar directamente com a arquitectura, os dados, o treino e os diferentes estágios de desenvolvimento.

Na altura tinha uma NVIDIA GTX1060 de 6GB e como tenho um Jetson Orin Nano 8G, acabei por fazer seguines versões modificadas, que me permitiram correr o nanochat num PC com a 1060 e no Orin.

As minhas primeiras experiencias foram directas, usando os dataset de pré-treino original, verificar se tudo corria sem erros, e estimar os tempos de treino.

Para fazer uma verificação rápida das configurações pode ser usado algo como o smoke test descrito na entrada supa beginna nanochat — walkthrough zero to tiny yap machine, disponivel em https://github.com/karpathy/nanochat/discussions/677.

Chegado a este ponto estava em condições de identificar as modificações necessárias para alterar o nanochat para o adaptar a produção de modelos em português de Portugal.

Aqui existem dois niveis de dificuldade no processo de adaptação. O mais facil é a adaptação do software do nanochat, que consiste basicamente na troca dos urls dos diversos datasets usados nas diferentes fases do treino e na avaliação do modelo, e umas frases de teste. O mais dificil é encontrar ou produzir os datasets substitutos que cumpram os critérios adequados a uma tiny llm em português europeu.

Alterações ao software do nanochat

  • Trocar o dataset de pré-treino. nanochat/dataset.py BASE_URL = "https://huggingface.co/datasets/AUTOR/NOME/resolve/main" MAX_SHARD = NN # (NN sempre o numero de shards -1, porque começa em zero)

  • Alterações ao pré-treino. Com base em scripts/base_train.py. Trocar as questões de avaliação de inglês para português e datasets de avaliação.

  • alterações ao fine tuning. Com base em scripts/chat_sft.py. Trocar os datasets usados: HuggingFaceTB/smol-smoltalk 971M, cais/mmlu 270M, openai/gsm8k 6M

  • alterações ao reinforcment learning. Com base em scripts/chat_rl.py. Identificar e trocar os datasets usados.

  • Script de avaliação do tokenizer. scripts/tok_eval.py. Substituir por outro mais simples, temporariamente.

  • Script de avaliação do pré-treino. scripts/base_eval.py. Trocar as questões de avaliação de inglês para portugues. Trocar datasets de avaliação.

  • Script de avaliação do chatbot. scripts/chat_eval.py. Identificar e trocar os datasets usados.

Com base nas alterações necessárias e de alguns critérios de prioridade, estabeleci as alterações para uma primeira versão de teste, e criei o repositório nanochatpt, disponível em:

https://github.com/inaciose/nanochatpt.

nanochatpt

Para usar o nanochatpt tem de ter um dataset com o formato adequado e alterar o script de pré treino nanochat/dataset.py

BASE_URL = "https://huggingface.co/datasets/AUTOR/NOME/resolve/main" MAX_SHARD = NN # (NN sempre o numero de shards -1, porque começa em zero)

Alterar para o endereço e número correcto. No decurso desta publicação será descrito como se pode constituir um dataset experimental.

As alterações implementadas na primeira versão do nanochatpt, que foi usada no treino de um modelo de 0.8B na modal.com foram minimalistas. Segue a lista do:

  • Alterações ao pré-treino. As questões de avaliação foram alteradas de inglês para português.

  • Alterações á avaliação do pré-treino. As questões de avaliação foram alteradas de inglês para português.

  • Alterações ao script de avaliação do tokenizer. As questões de avaliação foram alteradas de inglês para português.

  • alterações ao fine tuning. Foi trocado o dataset, HuggingFaceTB/smol-smoltalk 971M, por uma versão experimental com base num subset do amalia-llm/AMALIA-LLM-0626-SFT-Dataset.

  • Foi adicionado um script de treino para 4xH100 na modal.com

Por fazer estão as alterações que dependem da existência de datasets adequados em português europeu. Ou seja são a parte dificl da alterações.

Corpus pt-pt e datasets

Do descrito acima, e mais alguma coisa que fui lendo, podemos enquadrar os datasets em quatro categorias: pré-treino, sft (afinação supervisionada), rl (aprendizagem condicionada), dpo (orientação directa de preferências), e eval (avaliação do modelo).

Também existe a modalidade de pré-treino adicional, que consiste na continuação do pré-treino com dados adicionais em domínios específicos, ou simplesmente continuação do treino genérico. Assim como destilação, que consiste no treino de modelos mais pequenos a partir de grandes.

Portanto o problema que se coloca nesta fase é como constituir os datasets adequados para substituir directamente os usados no nanochat.

A primeira tarefa nesta fase foi fazer uma recolha dos recursos disponiveis, da qual resultou a seguinte lista que sumariza os principais recursos que podem ser utilizados para obter os datasets de substituição para cada um dos casos.

Antes de entrar no detalhe por categoria de utilização do material disponível, dou destaque a duas contas do huggingface, uma, duarteocarmo, porque tem tem material disponível em português europeu para as várias fases do processo de treino; e a outra, amalia-llm, porque tem também material para usar em datasets pós treino, e no github tem ferramentas para explorar o arquivo.pt.

Pré treino

Corpus para curar datasets de pré-treino, ou datasets de pré curados para serem usados como pt-pt genéricos.

Depois de processados, caso seja necessário, o dataset tem de ser convertido para o formato usado pelo nanochat. Ficheiros shard comprimidos com cerca de 100MB, e com o seguinte esquema de nomes: shard_NNNNN.parquet

Corpus ou datasets que não necessitam de grande filtragem para pt-pt.

Que necessitam de filtragem para pt-pt.

Que necessitam de avaliação pré filtragem pt-pt.

A produção de um dataset de pré treino deve ter em conta vários critérios de modo a que as caracteristicas do dataset seja adequada ao objectivo. Não sendo uma lista exaustiva seguem os principais:

  1. Variante do idioma (principal ou exclusivo), filtrar e garantir equilibrio linguistico.
  2. Qualidade - Remover conteúdos de baixa qualidade, filtragem por perplexidade, classificadores, e heurísticas simples, assim como normalização dos documentos.
  3. Diversidade - Garantir diversidade tematica, estilistica e cobertura temporal.
  4. Desduplicação - Remover redundâncias que degradam a diversidade do lote de treino e aumentam a memorização.
  5. Escala - Seguir as leis de escala de Chinchilla. Aproximadamente 20× tokens por parâmetro para um treino.
  6. Critérios legais, com enfase nos direitos de autor e privacidade.

Mais abaixo está uma lista dos classificadores que consideramos úteis para avaliar e especificar critérios de seleção.

Para efectuar o primeiro teste de treino completo de um modelo nanochat de depth 16 bilingue com dados de treino em português de europeu (80%) e inglês (2)0%, foi criado um dataset com base no bagaço2, CETEMPublico, europarl e culturaX-pt filtrado para pt-pt, e o climbmix-400b-shuffle.

Apesar da pequena dimensão do modelo, foi experimentado treinar o modelo com uma percentagem consideravel de texto em inglês. A escolha deveu-se á falta de substituição de doius dos três datasets usados no sft. O único substituido foi o HuggingFaceTB/smol-smoltalk, e ainda assim apesar de composto maioritáriamente por português, tem também cerca de 20% de inglês. Todos os outros datasets usados no pós treino foram os originais do nanochat em inglês.

Este dataset inicial não foi, nem será, publicado devido ao uso do corpus CETEMPublico.

Está a ser preparada a publicação dos repositórios usados para o processo de tratamento e conversão dos corpus num dataset usavel no nanochatpt.

Pós treino: STF, RL e eval

A prioridade é encontrar ou fazer substitutos para todos os datasetes no processo de sft.

  • Produzir os datasets sft (supervised fine tuning) necessarios para trocar os datasets usados:
  • HuggingFaceTB/smol-smoltalk 971M, (fazer um inacio/smol-smoltalk-pt-v2)
  • cais/mmlu 270M, (fazer a 1a versão)
  • openai/gsm8k 6M (fazer a 1a versão)

As estratégias possiveis são:

  • Procurar o que existe nos repositórios do duarteocarmo e amalia-llm, e avaliar a possibilidade de aplicar critérios de extração a cada um dos datasets com potencial de ter partes usaveis para cada um dos casos, e depois coligir os diversos fragmentos de forma estruturada de modo a procurar manter as caracteristicas mais proximas possiveis dos originais;
  • Avaliar traduções artificiais de subsets ou da totalidade do dataset em causa.
  • Produzir os datasets de RL (reinforcment learning). Identificar os datasets usados e aplicar as mesmas estratégias que foram descriptas para o sft.

  • produzir os datasets de avaliação do pré-treino. Identificar os datasets usados e aplicar as mesmas estratégias que foram descriptas para o sft.

  • Script de avaliação do tokenizer. Rever se é necessário algum dataset para cumprir as funções originais, e fazer substituto caso a função seja relevante para o nanochatpt.

  • Script de avaliação do chatbot, Identificar e trocar os datasets usados e aplicar as mesmas estratégias que foram descriptas para o sft.

A ordem prevista das prioridades é: 1 - datasets sft 2 - datasets de RL 3 - datasets de avaliação do pré-treino 4 - datasets de avaliação do chatbot 8 - datasets de avaliação do tokenizer

Á medida que o desenvolvimento for avançando é provavel que publique os repositórios com o software usado para cada um dos processos envolvidos na produção destes datasets.

Como já foi referido, para efectuar o primeiro teste foi criado um dataset para substituir o HuggingFaceTB/smol-smoltalk, com base num subconjunto do amalia-llm/AMALIA-LLM-0626-SFT-Dataset.

Classificadores úteis para aplicação dos critérios

Para podermos aplicar critérios se seleção aos grandes volumes de dados que constituem os diversos corpus linguisticos a processar, recorremos a classificadores. Por isso uma das necessidades sentidas foi a de fazer uma lista que indentifica o que existe disponível para ser usado, quais as suas caracteristicas e tipo de classificação em que são úteis.

Para uma melhor avaliação, a lista foi efectuada de modo a categorizar as ferramentas nas seguintes categorias.

Código Categoria Descrição
GQ DL Filtros de Qualidade Geral e Deteção de Lixo Qualidade geral, conteúdo indesejado, toxicidade e filtragem de dados
VE Valor Educacional Classificadores de qualidade/valor educacional
VE ST Valor Educacional — STEAM/STEM Classificadores de conteúdo científico, técnico e STEM
PT Variante Linguística Distinção entre PT-PT e PT-BR
TT Tipo/Género de Texto Notícias, educação, domínios, fontes, géneros textuais, etc.
LP Legibilidade e Proficiência Métricas linguísticas, lexicais e sintácticas
PP Perplexidade Cálculo/estimativa da perplexidade

Lista extensa das ferramentas identificadas durante a pesquisa.

Categoria Modelo Tipo Uso
PT duarteocarmo/fasttext-euptvid fastText Classificador especificamente desenvolvido para distinguir PT-PT de PT-BR. Muito rápido e adequado a grandes corpora. Disponível em versão completa (1 GB) e quantizada (68 MB), com perda mínima de qualidade.
PP NOVA-vision-language/GlorIA-1.3B Language Model Modelo utilizado para cálculo de perplexidade.
VE utter-project/EuroFilter-v1 mDeBERTa-v3-base Classificador multilingue de valor educacional em 15 línguas, incluindo português. Adaptação multilingue das anotações FineWeb-Edu. Não é específico de PT-PT; é relevante para comparação com classificadores portugueses e foi utilizado no projecto AMALIA.
VE kenhktsui/llm-data-textbook-quality-fasttext-classifier-v2 fastText Classificador rápido de valor educacional com três níveis: Low, Mid e High. O score contínuo pode ser obtido a partir das probabilidades das três classes. É um modelo inglês, pelo que não deve ser considerado específico para PT-PT.
LP spacy/pt_core_news_lg spaCy / pipeline linguístico Pipeline linguístico para português. Não é um classificador de qualidade, mas permite obter tokenização, POS/morfologia, lematização, segmentação, dependências sintácticas, NER e vectores lexicais. Útil para métricas como riqueza lexical, complexidade sintáctica, comprimento de frases, distribuição de POS e subordinação.
TT inesctec/CitiLink-BERTimbau-large-Topic-Classification-pt BERTimbau Large Classificador multi-label de 22 tópicos, incluindo Administração, Ambiente, Actividades Económicas, Ciência, Cultura, Desporto, Educação, Saúde e Transportes. Especializado em actas/discussões de câmaras municipais portuguesas; particularmente útil para documentos administrativos/institucionais.
GQ DL TucanoBR/BERTimbau-large-text-filter BERTimbau Large Filtro de qualidade textual baseado em BERT. É o mais pesado dos três modelos TucanoBR e potencialmente o mais preciso. Produz uma pontuação de qualidade.
GQ DL TucanoBR/BERTimbau-base-text-filter BERTimbau Base (~109M parâmetros) Versão mais leve do filtro anterior. Produz igualmente um score de qualidade textual e utiliza o mesmo dataset de treino. Mais adequada a processamento em massa.
GQ DL TucanoBR/XGBClassifier-text-filter XGBoost + embeddings LaBSE Classificador leve e rápido. Utiliza embeddings gerados por outro modelo para classificar a qualidade textual, em vez de processar directamente o texto.
GQ DL TucanoBR/XGBRegressor-text-filter XGBoost + embeddings LaBSE Variante de regressão do modelo anterior. Produz uma pontuação contínua de qualidade, em vez de uma classificação discreta.
GQ DL ClassiCC-Corpus/ClassiCC-PT-toxic-classifier BERTimbau Classificador de toxicidade/conteúdo ofensivo, com score de 0–5. Desenvolvido especificamente para documentos web portugueses e para filtragem de corpora.
VE ClassiCC-Corpus/ClassiCC-PT-edu-classifier BERTimbau Classificador de valor educacional, com score de 0–5. Treinado sobre textos portugueses anotados por GPT-4o e destinado à filtragem/curadoria de corpora portugueses.
VE ST ClassiCC-Corpus/ClassiCC-PT-stem-classifier BERTimbau Classificador de conteúdo STEM, com score de 0–5. Permite medir a componente científica/técnica de um corpus independentemente do valor educacional geral.
GQ DL Polygl0t/portuguese-qwen3-4b-instruct-quality-classifier Qwen3-4B Classificador de qualidade de conversações user→assistant, com score 1–5. Destinado à filtragem/curadoria de dados para instruction tuning, não a documentos web isolados.
GQ DL Polygl0t/portuguese-qwen3-4b-instruct-quality-judge Qwen3-4B generativo Versão generativa do sistema anterior. Funciona como judge, produzindo score e justificação. Mais pesado, mas interessante para auditoria e amostragem de datasets SFT.
VE Polygl0t/portuguese-bertimbau-large-edu-classifier BERTimbau Large Classificador de valor educacional para texto português, baseado nas anotações portuguese-edu-qwen-annotations.
VE Polygl0t/portuguese-bertimbau-edu-classifier BERTimbau Classificador que atribui uma pontuação de valor educacional a texto português. Treinado no dataset Portuguese Educational Qwen Annotations.
GQ DL Polygl0t/portuguese-bertabaporu-large-toxicity-classifier BERTimbau Classificador de toxicidade em português, com score 1–5. Treinado sobre cerca de 700k anotações geradas por Qwen.
GQ DL Polygl0t/portuguese-bertimbau-toxicity-classifier BERTimbau Base Classificador de toxicidade em português, com score 1–5. Treinado sobre cerca de 700k anotações geradas por Qwen.
TT kyutai/dactory-models fastText Conjunto de classificadores para as 24 línguas oficiais da UE, incluindo português. Classifica a afinidade com oito tipos de fonte/domínio: rand, wiki, books/textbooks, science, stem, hum, pop e life. rand pode funcionar como indicador de baixa qualidade; as restantes classes permitem caracterizar o perfil de domínio do corpus.
TT vzani/portuguese-fake-news-classifier-bertimbau BERTimbau Classificador de fake news, afinado para português brasileiro.
TT classla/xlm-roberta-base-multilingual-text-genre-classifier XLM-RoBERTa Classificador de género textual, treinado no X-GENRE e abrangendo 94 línguas. Muito mais geral que o CitiLink e não específico de português.
TT lfcc/bert-claimpt-chunk BERTimbau Modelo treinado no ClaimPT, corpus de notícias em português europeu. Identifica, ao nível dos tokens, claims/alegações factuais verificáveis. Não é propriamente um classificador de género textual.
TT lfcc/bert-claimpt-sent BERTimbau Modelo ClaimPT para identificação de claims/alegações factuais ao nível da frase em notícias de português europeu. Não é propriamente um classificador de género textual.

Como a lista é extensa, e o tempo escasso, procuramos identificar as ferramentas mais promissoras de cada tipo, para avançar nas primeiras experiẽncias de classificação.

Código Modelo Função
GQ DL TucanoBR/BERTimbau-base-text-filter Qualidade geral
GQ DL TucanoBR/XGBRegressor-text-filter Qualidade geral independente
GQ DL / TT kyutai/dactory-models Qualidade + domínio/fonte
GQ DL ClassiCC-Corpus/ClassiCC-PT-toxic-classifier Toxicidade
VE utter-project/EuroFilter-v1 Valor educacional — referência AMALIA
VE ClassiCC-Corpus/ClassiCC-PT-edu-classifier Valor educacional PT
VE ST ClassiCC-Corpus/ClassiCC-PT-stem-classifier STEM
PT duarteocarmo/fasttext-euptvid PT-PT vs. PT-BR
TT classla/xlm-roberta-base-multilingual-text-genre-classifier Género textual
LP spacy/pt_core_news_lg Métricas linguísticas
PP NOVA-vision-language/GlorIA-1.3B Perplexidade

Na geração do primeiro dataset de pré-treino, assim como para a elaboração do substituto do smol-smoltalk, apenas foi usado usado o duarteocarmo/fasttext-euptvid.

Treino com o nanochat

Clonar o repositório do nanochat e fazer as alterações necessárias, ou clonar o nanochatpt, e assumir os datasets usados com excepção do dataset de pré treino que deve ser gerado, enviado para o huggingface, e o script nanochat/dataset.py alterado para o nome do dataset.

Com tudo preparado podemos fazer um smoke test. Informação disponivel em https://github.com/karpathy/nanochat/discussions/677

Podemos treinar localmente, se tivermos uma GPU adequada, seguindo o modelo do smoke test, mas com parametros adequados a um treino completo. Ou podemos treinar num datacenter.

Numa fase inicial foram feitas várias experiências locais, e numa segunda fase foi efectuada a adaptação de um script para efectuar o treino em 4 X NVIDIA A100-SXM4-80GB na modal.com

O primeiro treino completo, efectuado na modal.com, foi de um modelo de depth 16 (0.9B), com pré-treino em cerca de 10B tokens do dataset descrito acima, e treino sft com o MMLU e GSM8K, originais em inglês, e o smol-smoltalk composto com um mix de pt-pt (80%) e en (20%). Os logs foram guardados no wandb.

O comando executado foi o seguinte:

run TrainNanochatModal.py     --wandb-run=nanochatpt-d16-full

Tempo de treino: 2h 43m 38s pre + 36m 46s sft Custo de treino: 6.41$ (recorrendo aos 30$ mensais de crédito)

Foram gerados os seguintes modelos:

Evolução do pré-treino

val/bpb train/loss
val/bpb train/loss

Evolução do treino stf

val/bpb train/loss
val/bpb train/loss

Primeira questão colocada

### Por que o ceu é azul?

1. **Água (céu)**: É a água que o mantém em um estado sólido (gelo).
2. **Luz**: A luz bate e o ceu faz a forma de estrela, como o Sol se forma.
3. **Céu**: É a partícula que cai no céu (o céu é a estrela).
4. **Água**: É o líquido que o ceu possui (água).

### Exemplos simples:

* **Céu**: É a água que cai no céu.
* **Água**: É o líquido que o ceu possui (água).

### Curiosidade:

O ceu não é azul se a luz tocar, pois o céu é azul. Mas a questão pede para "porquê" a cor do ceu, e não do céu. É como se o céu fosse azul.

**Em resumo**: O ceu é azul porque a água que ele contém é a mesma água que ele cai no céu.

Como este exemplo ilustra, aparenta ter aprendido padrões de resposta, mas demonstra pouco conhecimento factual e alucina muito.

Existem três considerações que coloco em aberto para melhoria dos resultados:

  • Melhorar os datasets usados no pre-treino e no sft;
  • Aumentar o volume de tokens por parametro de 12 para 20;
  • Aumentar a depth do modelo para 20, e consequentemente, aumentar o numero de parametros.

As duas últimas, especialmente quando conjugadas vão aumentar o tempo de treino total e por conseguinte os custos de produção no datacenter.

Conjugar qualquer uma delas, não permite conhecer qual o contribudo de cada uma delas para a diferença de desempenho do novo modelo face ao anterior.

Por outro lado, os datasets usados no primeiro teste não passaram por nenhuma analise e filtragem criteriosa. O processo foi limitado ao minimo, ou seja foi apenas aplicado um filtro pt-pt aos corpos em que existe uma reconhecida predominancia do português sul americano.

Considerações sobre o dataset de pré-treino Nos datasets do teste que foram substituidos a relação pt/en foi de 80/20. Não sei se existira vantagem em diminuir o volume de dados em en, pois perderia a capacidade de entendimento básico do idioma. Caso considerare-se um aumento do numero de parametros, estou em crer que o aumento da percentagem de dados em en, se forem de alta qualidade, os conhecimentos adquiridos podem ser transferidos para o desempenho em português, além de melhorar a geração de texto em en, sem comprometer as qualidades da geração pt-pt. Nesta situação poderia considerar 65/35, só que tal alteração implicaria um depth de 34 e terá um custo de 1000$ para o pré-treino. o que a coloca por agora completamente fora de hipotese de concretizar.

Na proxima versão do dataset, que irá resultar da aplicação de critérios tendentes a melhorar a sua qualidade e adequação, provavelmente será mantida a relação pt/en de 80/20.

Considerações sobre os datasets de sft A constituição destes datasets será mais trabalhosa. Apesar de considerarmos que o substituto do smol-smoltalk usado no primeiro treino esteja longe de ser o mais adequado, o proximo esforço deve ser dirigido para encontrar substitutos para o gsm8k e para o mmlu.

Resumo

Foram descritos os principais passos de um percurso experimental que começou com a aprendizagem dos fundamentos das LLM e terminou com o treino completo de um primeiro modelo experimental orientado para o português europeu.

A adaptação do nanochat foi relativamente simples quando comparada com a preparação dos dados. A preparação do corpus de pré-treino constituiu uma parte significativa do trabalho. Nesse trabalho, foram identificadas diversas fontes de texto em português e analisados os problemas associados à variante linguística, qualidade, diversidade, desduplicação, escala e aspectos legais. Para permitir a aplicação destes critérios a grandes volumes de dados, foi também feita uma recolha e avaliação de classificadores para qualidade geral, valor educacional, conteúdo STEM, variante linguística, género textual, legibilidade e perplexidade. Até ao primeiro treino, contudo, no primeiro dataset experimental de pré-treino, a filtragem efectivamente aplicada foi ainda bastante limitada, estando grande parte deste trabalho reservado para versões posteriores.

O modelo resultante foi treinado com aproximadamente 10 mil milhões de tokens e depth 16, correspondendo a cerca de 0,9 mil milhões de parâmetros. O treino foi realizado na Modal, utilizando quatro NVIDIA A100-SXM4-80GB, tendo o pré-treino demorado 2h43m38s e o SFT 36m46s, com um custo de 6,41 dólares através do crédito disponível. Foram obtidos dois modelos, um modelo base e uma versão posteriormente submetida a SFT com apenas um dos três datasets usados, o smol-smoltalk substituido por uma versão com 80% de pt-pt.

Os primeiros resultados demonstraram que o modelo consegue aprender padrões de linguagem e produzir respostas estruturadas, mas também revelou limitações importantes no conhecimento factual e uma elevada tendência para a alucinação.

O resultado mais importante desta primeira experiência não é, por isso, o modelo produzido, mas a validação do caso de uso, a identificação dos recursos, das estratégias para a satisfação das necessidades de substitução dos datasets e das variáveis que podem ter influência na evolução do projecto, tais como a qualidade e adequação dos datasets, a quantidade de tokens por parâmetro, a dimensão do modelo e a qualidade dos datasets utilizados no SFT e nas restantes fases de pós-treino e avaliação.

Concluimos que, neste momento, a principal prioridade deverá ser melhorar os dados de treino antes de aumentar significativamente a dimensão do modelo, e verificar a diferença de desempenho. Numa segunda fase aumentar o número de tokens por parametro, e voltar a verficar a diferença. Paralelamente para comparação, será efectuada a continuação do treino do primeiro modelo até ao mesmo ratio usado na segunda fase do novo modelo de base.

Nota. Durante todo o processo inclusive na composição deste documento existiu o uso de assistentes IA.

Community

Sign up or log in to comment