Instructions to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("TucanoBR/Tucano-160m") model = PeftModel.from_pretrained(base_model, "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto") - Transformers
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto")# pip install -U transformers accelerate # Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto", device_map="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto
- SGLang
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto with Docker Model Runner:
docker model run hf.co/guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto
Tucano-160m: LoRA em pt-BR, treinado em CPU
Piloto de adaptação para responder instruções curtas em português brasileiro. Usa 94 pares de treino do OpenAssistant 2 e publica o adapter com o código completo.
A loss caiu, mas as respostas continuam erradas em exemplos simples. Não é um assistente pronto. O valor deste repositório é permitir reproduzir um treino pequeno, comparar com a base e inspecionar as falhas sem precisar de GPU.
English summary: CPU-only LoRA experiment on Brazilian Portuguese instructions. Held-out response-token loss decreased; generated answers remain unreliable. Research artifact, not a usable general assistant.
Resultado medido
Avaliação final em float32, sem autocast, com os mesmos prompts e respostas de referência antes e depois. Loss de próximo token apenas na resposta, incluindo EOS; instrução e padding ficam mascarados. A média é ponderada pelo número de tokens de resposta. Perplexidade = exp(loss). Isso mede ajuste às referências, não correção factual.
| Conjunto | Exemplos | Tokens de resposta | Loss base | Loss LoRA | PPL base | PPL LoRA |
|---|---|---|---|---|---|---|
| Validação | 12 | 1.522 | 2.3569 | 2.2422 | 10.5577 | 9.4140 |
| Teste retido | 12 | 1.907 | 2.4296 | 2.3473 | 11.3544 | 10.4572 |
O checkpoint publicado é o da época 2, escolhido pela menor loss de validação, medida durante o treino sob autocast bfloat16, entre seis épocas. A avaliação final float32 não alterou essa seleção. O teste não escolheu o checkpoint nem os hiperparâmetros. Não houve busca de hiperparâmetros. Uma única seed; o teste tem só 12 itens e não sustenta conclusão sobre desempenho geral.
metrics.json contém os números completos e a curva por época. verification.json registra uma segunda avaliação, carregando o adapter salvo do disco; as quatro losses foram reproduzidas com tolerância de 1e-6.
Gerações antes e depois
Greedy em float32, sem amostragem, limite de 80 tokens novos. Mesma instrução e tokenizer. Os seis exemplos são os primeiros do teste na ordenação SHA-256 definida antes do treino, sem escolher os melhores. Saídas brutas e referências em generations.json.
As primeiras três comparações são:
Exemplo 1
Instrução: A mãe de Pedro tem 3 filhos, o mais novo se chama Bruno e o mais velho se chama Júlio. Qual é o nome do filho do meio?
Base:
Júlio: O nome dele é João.
###
Qual é a idade da criança que está com ele?
###
Quais são os nomes dos filhos dela?
Julio: O nome deles é Pedro.
###
Qual é o nome do irmãozinho que ela tem?
###
Quais são as características físicas da criança que ela tem?
###
Quais são os traços físicos
LoRA:
O nome do filho do meio é Bruno.
Exemplo 2
Instrução: Olá! Você poderia agir como um professor de inglês? Eu queria que você me corrigisse sempre que encontrasse um erro e sugerisse melhores maneiras de escrever a frase se for o caso. What you think?
Base:
Com base no texto fornecido, aqui está uma possível resposta:
Você pode corrigir o problema da seguinte forma:
- A sentença deve ser escrita em inglês.
- O problema é sobre erros gramaticais ou ortográficos.
- Se houver erros, por favor forneça mais informações para ajudar a resolver o problema.
LoRA:
Como modelo de linguagem AI, não posso fornecer uma resposta definitiva sobre qual é o melhor método para corrigir erros gramaticais ou ortográficos. No entanto, aqui estão algumas dicas gerais que podem ajudar:
1. Use palavras mais simples: ao escrever frases com erros, tente usar palavras mais simples, como "obrigado", "por favor" etc. Isso ajudará a evitar confusões e melhorar a compreensão do leitor.
2. Evite jarg
Exemplo 3
Instrução: Olá! O que são rimas ricas e rimas pobres? Poderia escrever algumas rimas ricas e algumas rimas pobres.
Base:
Rimas ricas, rimas pobres, rimas pobres
Rimas ricas, rimas pobres, rimas pobres
Rimas ricas, rimas pobres, rimas pobres
Rimas ricas, rimas pobres, rimas pobres
Rimas ricas, rimas pobres, rimas pobres
Rimas ricas, rimas pobres, rimas pobres
Rimas ricas, rimas pobres, rimas pobres
Rimas ricas, rimas pobres, rimas pobres
Rimas ricas, rimas pobres, rimas
LoRA:
Rimas ricas, rimas pobres. As rimas ricas são aquelas que têm um ritmo mais lento e uma melodia mais lenta. Elas podem ser escritas em qualquer tipo de rima, desde as mais simples até as mais complexas.
O filho esperado no exemplo 1 é Pedro, não Bruno. A resposta sobre rimas não explica o critério de classes gramaticais. Esses exemplos não demonstram ganho factual.
Essas observações não são uma métrica de acurácia. Não foi medida melhoria factual nem segurança.
Base e dados
Base: TucanoBR/Tucano-160m, 162.417.408 parâmetros, arquitetura Llama, Apache-2.0. Revisão 6331cbef9933c05d8d0c8ae5ee23ed2570f06571. Foram conferidos também o Tucano-630m e os Instruct oficiais; os Instruct começam em 1b1. A versão de 160m mantém o experimento pequeno em CPU. O 630m não foi treinado nem cronometrado aqui. O projeto original já aponta para a série Tucano 2 da Polygl0t; este piloto usa explicitamente a primeira série.
Dados: OpenAssistant/oasst2, Apache-2.0, revisão 179dd21fc55192153d94adb0e0ce8f69e222bf75, arquivo 2023-11-05_oasst2_ready.messages.jsonl.gz.
Foram conferidos primeiro os datasets de guicybercode. O nl2bash-pt foi descartado porque seu próprio card informa fontes sem licença declarada e sem rastreabilidade por linha, além de erros de tradução. O cybercode-bench-ptbr permanece reservado para avaliação; nenhum de seus itens foi usado. Os outros próprios têm tema diferente ou são microamostras. O OpenAssistant tem instruções humanas e licença explícita.
Filtros aplicados a pergunta e resposta:
- Idioma original
pt-BR, revisão aprovada, não deletado e não sintético. Qualidade anotada pelo dataset >= 0,5; PII, spam e idioma errado sem indicação positiva. Isso usa anotações existentes, não uma auditoria nova de privacidade ou de conteúdo. - Só primeira resposta de cada árvore, rank 0. Instrução entre 4 e 128 tokens; resposta entre 4 e 256 tokens, incluindo EOS; no máximo 384 tokens totais. Sem truncamento. Excluídos pictogramas e instruções duplicadas exatas após normalizar caixa e espaços.
208 pares passaram nos filtros anteriores ao limite de tamanho; 90 foram excluídos por comprimento. Restaram 118: 94 treino, 12 validação e 12 teste. São splits próprios, não os splits oficiais da fonte. Árvores inteiras ficam em um único split, ordenadas pelo SHA-256 de tucano-ptbr-v1: + ID da pergunta. Não foi feita deduplicação semântica entre árvores.
Os arquivos em data/ contêm texto e IDs necessários para reproduzir o recorte, sem IDs dos colaboradores nem metadados de conta. data-stats.json registra contagens e hashes.
A revisão humana original não garante referências corretas. Há erros conhecidos: a referência do exemplo sobre Transformers sugere um método inexistente model.inference; respostas sobre esportes podem estar desatualizadas. Nenhuma dessas referências deve ser tratada como documentação ou conselho.
Treino e custo observado
| Item | Valor |
|---|---|
| Hardware | Intel Xeon x86-64, 8 vCPUs, 15,627 GiB de RAM; sem GPU |
| Uso de CPU | 6 threads intra-op; 1 inter-op |
| Precisão | Pesos base e LoRA float32; operações sob autocast bfloat16 em CPU |
| LoRA | r=16; alpha=32; dropout=0,05; bias=none |
| Projeções | q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj |
| Parâmetros treináveis | 3.391.488; base congelada |
| Otimizador | AdamW; learning rate 3e-4; weight decay 0,01; gradient clip 1,0 |
| Scheduler | Cosine; 3 passos de warmup entre 36 updates totais |
| Batch | Microbatch 4; acumulação 4; efetivo nominal 16, último grupo menor |
| Loss | Apenas resposta + EOS; acumulação ponderada por tokens |
| Duração planejada | 6 épocas, seed 42 |
| Checkpoint publicado | Época 2, após 12 updates e 25.028 tokens supervisionados, contando repetições |
| Treino das seis épocas, sem avaliações | 154.75 s, cerca de 2 min 35 s |
| Processo de treino com avaliações e gerações BF16 | 187.06 s, cerca de 3 min 07 s; sem instalação/downloads |
| Avaliação final float32 + gerações, após o treino | 14.20 s adicionais |
| Pico RSS do processo de treino | 5.50 GiB |
Execução em 10/11/2026, das 16h11 às 16h14, horário de Brasília (America/Sao_Paulo, UTC-3). Instalação e preparação dos dados não estão incluídas nas durações acima. O primeiro run foi repetido ao investigar variação na baseline. Um controle mostrou variação entre forwards idênticos sob autocast bfloat16 nesta CPU, mesmo em eval. A tabela de resultados foi então recalculada em float32, sem mudar o checkpoint ou os hiperparâmetros. A recarga independente confere essa avaliação float32. As medições BF16 originais ficam em training-metrics.json; as gerações BF16 ficam em bfloat16-generations.json e baseline.json. Os dois runs de seis épocas somaram cerca de cinco minutos de treino; a tabela de custo reporta o run final e a avaliação float32 adicional. As seis épocas somaram 75.084 tokens de resposta supervisionados, contando repetições; o adapter selecionado só viu as duas primeiras.
Python 3.13.5, PyTorch 2.15.0+cpu, Transformers 4.57.6, PEFT 0.21.2, Datasets 5.0.1, Accelerate 1.15.0. requirements-lock.txt fixa o ambiente observado. Logs completos em logs/.
Como carregar
O repositório contém o adapter, scripts e dados do recorte. Pesos e tokenizer são carregados da revisão fixada da base. Não exige trust_remote_code. Para reproduzir o caminho float32 da avaliação:
import torch
from peft import PeftModel
from transformers import AutoModelForCausalLM, AutoTokenizer
torch.set_num_threads(6)
repo = "guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto"
base_id = "TucanoBR/Tucano-160m"
base_revision = "6331cbef9933c05d8d0c8ae5ee23ed2570f06571"
tokenizer = AutoTokenizer.from_pretrained(base_id, revision=base_revision)
base = AutoModelForCausalLM.from_pretrained(
base_id, revision=base_revision, torch_dtype=torch.float32,
attn_implementation="sdpa",
)
model = PeftModel.from_pretrained(base, repo).eval()
text = "### Instrução:\nQual é a capital do Brasil?\n\n### Resposta:\n"
inputs = tokenizer(text, return_tensors="pt")
with torch.inference_mode():
output = model.generate(
**inputs, max_new_tokens=80, do_sample=False, use_cache=True,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id,
)
print(tokenizer.decode(output[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
Velocidade, arredondamentos e saídas podem mudar em outro hardware ou outra precisão. O exemplo demonstra carregamento, não garante resposta correta. Não execute código ou comandos gerados.
Reproduzir o experimento
Baixe os arquivos deste repositório para uma pasta local. Depois:
python3 -m venv .venv
. .venv/bin/activate
pip install --extra-index-url https://download.pytorch.org/whl/cpu -r requirements-lock.txt
python scripts/download_base.py
python scripts/prepare.py
python scripts/test_pipeline.py
python scripts/train.py
python scripts/final_eval.py
python scripts/verify_adapter.py
prepare.py refaz o recorte na subpasta publish/data/; train.py escreve o novo adapter e seus resultados BF16 em publish/; final_eval.py registra a comparação final float32, sem mudar o adapter. Os hashes permitem conferir o recorte. O checkpoint inicial é sempre a base original, não este adapter. Seed fixa não garante reprodução bit a bit em outro hardware.
Limitações e próximo passo
Este é um ensaio de treinamento, não um modelo de uso. São 94 exemplos de treino e apenas 12 de teste. O resultado depende do recorte; não mede generalização para outros assuntos. A possível presença dos dados no pré-treino da base não foi investigada.
O LoRA aprende formato, mas pode inventar respostas curtas com mais confiança. Continua errando raciocínio simples e produzindo código falso. Os filtros não são avaliação de segurança; há vieses herdados dos dados. Não usar para saúde, decisões sobre pessoas ou geração autônoma de comandos.
O gargalo deste piloto é a quantidade e a revisão dos dados, não só o hardware. Um próximo experimento precisa de mais pares pt-BR revisados, teste maior e métricas da tarefa, com múltiplas seeds. O Tucano-630m pode ser uma comparação futura em uma T4 de Kaggle/Colab, se houver cota; nenhuma execução nessa GPU foi feita e não há estimativa medida de duração. Não há Space ou modelo mesclado neste lançamento.
Créditos e licença
Adapter e scripts: Guilherme Monteiro / guicybercode, Apache-2.0. Os exemplos são um recorte filtrado de OpenAssistant/oasst2, Apache-2.0; não são dados originais de guicybercode. Pesos base: TucanoBR, Apache-2.0. Consulte LICENSE e NOTICE.
- Corrêa, Sen, Falk e Fatimah. Tucano: Advancing Neural Text Generation for Portuguese. arXiv:2411.07854, Patterns, 2025.
- Köpf et al. OpenAssistant Conversations: Democratizing Large Language Model Alignment. arXiv:2304.07327, 2023; release 2 do corpus, novembro de 2023.
Framework versions
- PEFT 0.21.2
- Downloads last month
- 11
Model tree for guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto
Base model
TucanoBR/Tucano-160m
docker model run hf.co/guicybercode/tucano-160m-oasst2-ptbr-lora-cpu-piloto