Percurso de um novato no treino de uma pequena LLM em português europeu
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.
- CETEMPublico - https://www.linguateca.pt/cetempublico/informacoes.html
- bagaco2 - https://huggingface.co/datasets/duarteocarmo/fineweb2-bagaco
- bagaco3 - https://huggingface.co/datasets/duarteocarmo/bagaco3
- https://huggingface.co/datasets/Helsinki-NLP/europarl
- https://huggingface.co/datasets/PORTULAN/parlamento-pt
Que necessitam de filtragem para pt-pt.
- CulturaX - https://huggingface.co/datasets/uonlp/CulturaX
- CrawlPT https://huggingface.co/datasets/eduagarcia/CrawlPT_dedup
Que necessitam de avaliação pré filtragem pt-pt.
- arquivo.pt- https://arquivo.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:
- Variante do idioma (principal ou exclusivo), filtrar e garantir equilibrio linguistico.
- Qualidade - Remover conteúdos de baixa qualidade, filtragem por perplexidade, classificadores, e heurísticas simples, assim como normalização dos documentos.
- Diversidade - Garantir diversidade tematica, estilistica e cobertura temporal.
- Desduplicação - Remover redundâncias que degradam a diversidade do lote de treino e aumentam a memorização.
- Escala - Seguir as leis de escala de Chinchilla. Aproximadamente 20× tokens por parâmetro para um treino.
- 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 ( |
| 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:
- Base: inaciose/inacio-d16v1
- SFT : inaciose/inacio-sft-d16v1
Evolução do pré-treino
Evolução do treino stf
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.



