ENEM Challenge (
eduagarcia/enem_challenge,
1431 questões, 5 alternativas). Sobre o "alignment tax" e por que pretrain
vence em completion enquanto SFT vence em chat, ver
README do repositório.
1git clone https://github.com/cjfbr/slm-pretraining.git
2cd slm-pretraining
3pip install -r requirements.txt
1import torch
2from huggingface_hub import hf_hub_download
3from slm.model import GPT
4from slm.config import ModelConfig
5from slm.tokenizer import Tokenizer
6
7# 1. Baixar checkpoint + tokenizer do Hub
8ckpt_path = hf_hub_download(
9 repo_id="cjfb75/slm-pt100m", filename="sft/best.pt",
10)
11tok_path = hf_hub_download(
12 repo_id="cjfb75/slm-pt100m", filename="tokenizer/tokenizer_ptbr.json",
13)
14
15# 2. Reconstruir modelo a partir do ModelConfig salvo no checkpoint
16ckpt = torch.load(ckpt_path, weights_only=False, map_location="cuda")
17cfg = ModelConfig(**{{k: v for k, v in ckpt["model_config"].items()
18 if k in ModelConfig.__dataclass_fields__}})
19model = GPT(cfg).to("cuda")
20model.load_state_dict(ckpt["model"])
21model.eval()
22
23tokenizer = Tokenizer(tok_path)
1prompt = "Usuário: Qual a capital do Brasil?\nAssistente:"
2ids = tokenizer.encode(prompt, add_eot=False)
3input_ids = torch.tensor([ids], dtype=torch.long, device="cuda")
4
5out = model.generate(
6 input_ids,
7 max_new_tokens=120,
8 temperature=0.8,
9 top_k=50,
10 repetition_penalty=1.3,
11 eot_token=tokenizer.eot_token,
12)
13gen_ids = out[0].cpu().tolist()[len(ids):]
14if tokenizer.eot_token in gen_ids:
15 gen_ids = gen_ids[:gen_ids.index(tokenizer.eot_token)]
16print(tokenizer.decode(gen_ids))
17# -> " A capital do Brasil é Brasília."
Projeto da disciplina
Aprendizado Profundo II (PUCRS).
Implementação inspirada em
nanoGPT
(Karpathy), com receitas do
SmolLM
(HuggingFace) e
Muon (Keller
Jordan). Datasets de instrução: Canarim
(
dominguesm/Canarim-Instruct-PTBR-Dataset)
e Alpaca-PT-BR
(
dominguesm/alpaca-data-pt-br).