Text Generation
Transformers
Safetensors
PEFT
Portuguese
English
Spanish
qwen2
qwen2.5
qlora
lora
python
code
code-generation
conversational
text-generation-inference
Instructions to use raporto/pycoder-3b with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use raporto/pycoder-3b with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="raporto/pycoder-3b") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# pip install -U transformers accelerate # Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("raporto/pycoder-3b") model = AutoModelForCausalLM.from_pretrained("raporto/pycoder-3b", device_map="auto") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=256) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - PEFT
How to use raporto/pycoder-3b with PEFT:
Task type is invalid.
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use raporto/pycoder-3b with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "raporto/pycoder-3b" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "raporto/pycoder-3b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/raporto/pycoder-3b
- SGLang
How to use raporto/pycoder-3b 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 "raporto/pycoder-3b" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "raporto/pycoder-3b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'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 "raporto/pycoder-3b" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "raporto/pycoder-3b", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use raporto/pycoder-3b with Docker Model Runner:
docker model run hf.co/raporto/pycoder-3b
File size: 6,768 Bytes
3bfd832 0c7cc43 3bfd832 0c7cc43 3bfd832 0c7cc43 3bfd832 0c7cc43 3bfd832 0c7cc43 3bfd832 0c7cc43 3bfd832 0c7cc43 3bfd832 0c7cc43 3bfd832 0c7cc43 3bfd832 0c7cc43 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | ---
license: apache-2.0
base_model: Qwen/Qwen2.5-3B-Instruct
library_name: transformers
pipeline_tag: text-generation
language:
- pt
- en
- es
tags:
- qwen2.5
- qlora
- lora
- peft
- python
- code
- code-generation
datasets:
- iamtarun/python_code_instructions_18k_alpaca
---
# pycoder-3b
Fine-tuning QLoRA de [`Qwen/Qwen2.5-3B-Instruct`](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct) para assistência em programação Python, com o adapter LoRA já mesclado nos pesos base.
O objetivo do ajuste é a **forma da resposta**, não conhecimento novo: entregar código completo e executável em vez de fragmentos, manter consistência de estilo e responder em português sem perder a capacidade original do modelo em inglês.
Versão quantizada para execução local: [`raporto/pycoder-3b-GGUF`](https://huggingface.co/raporto/pycoder-3b-GGUF).
## Formato de prompt
ChatML do Qwen2.5, com system prompt em português:
```text
<|im_start|>system
Você é um assistente especialista em programação Python.<|im_end|>
<|im_start|>user
Escreva uma função que...<|im_end|>
<|im_start|>assistant
```
O `apply_chat_template` do tokenizer já produz esse formato. Usar um template diferente do treino degrada bastante o resultado.
## Uso
```python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_id = "raporto/pycoder-3b"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id, dtype=torch.bfloat16, device_map="auto")
messages = [
{"role": "system", "content": "Você é um assistente especialista em programação Python."},
{"role": "user", "content": "Escreva uma função que remova duplicados de uma lista preservando a ordem."},
]
inputs = tokenizer.apply_chat_template(
messages, add_generation_prompt=True, return_dict=True, return_tensors="pt"
).to(model.device)
outputs = model.generate(**inputs, max_new_tokens=768, temperature=0.2, top_p=0.9, do_sample=True)
print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))
```
Em versões do Transformers anteriores à 5, use `torch_dtype` no lugar de `dtype`.
### Parâmetros recomendados
| Parâmetro | Valor | Motivo |
|---|---|---|
| `temperature` | 0.15 – 0.3 | Geração de código pede determinismo. |
| `top_p` | 0.9 | |
| `repetition_penalty` | 1.05 | Evita loops sem penalizar repetição legítima em código. |
| `max_new_tokens` | 768 – 1024 | Implementação com testes cabe nessa faixa. |
## Treinamento
QLoRA em 4 bits (NF4 com double quantization), adapters LoRA sobre todas as projeções de atenção e MLP (`q_proj`, `k_proj`, `v_proj`, `o_proj`, `gate_proj`, `up_proj`, `down_proj`). Apenas os tokens da resposta do assistente entram na perda; os tokens de prompt recebem `label = -100`.
Os exemplos foram concatenados em blocos contíguos de 1024 tokens (sequence packing), com ~89% de aproveitamento. Exemplos acima do limite foram descartados em vez de truncados, para não ensinar o modelo a interromper código no meio.
```json
{
"model": "Qwen/Qwen2.5-3B-Instruct",
"dataset": "iamtarun/python_code_instructions_18k_alpaca",
"dtype": "torch.bfloat16",
"packing": true,
"train_samples": 3431,
"train_tokens": 3124347,
"effective_batch": 16,
"steps": 215,
"train_loss": 0.48165738638057265,
"eval_loss": 0.47419440746307373,
"perplexity": 1.6067193148929226,
"lora": {
"r": 16,
"alpha": 32,
"dropout": 0.05
}
}
```
| Item | Valor |
|---|---|
| Parâmetros treináveis | 29.933.568 de 3.115.872.256 (0,96%) |
| Blocos de treino | 3.431 (dataset completo, 18.612 exemplos) |
| Tokens de treino | 3.124.347 |
| Épocas | 1 |
| Batch efetivo | 16 |
| Learning rate | 2e-4, cosine, warmup 3% |
| Precisão | bf16 |
| Otimizador | paged AdamW 8-bit |
`train_samples` conta blocos empacotados, não exemplos: o dataset foi percorrido integralmente.
A perplexidade de 1,61 é calculada apenas sobre os tokens de resposta e não é comparável à perplexidade de modelos de linguagem de propósito geral.
## Avaliação
A perda de validação sozinha não diz se o código funciona. A avaliação deste modelo usa um benchmark de tarefas Python com testes executáveis, medindo em quatro camadas: presença de bloco de código, validade sintática (`ast.parse`), execução sem exceção e aprovação nos asserts da tarefa (pass@1 e pass@k).
Recomenda-se reexecutar o benchmark contra o modelo base antes de adotar este ajuste em qualquer fluxo, e novamente após quantizar, já que a perda de precisão pode alterar o resultado.
## Idiomas
Treinado com system prompt e instruções em português, sobre um dataset de código em inglês. Responde bem em **português** e **inglês**. O **espanhol** é herdado da capacidade multilíngue do Qwen2.5 e não foi alvo do ajuste, portanto não tem garantia de consistência de formato.
Código, nomes de identificadores e mensagens de erro permanecem em inglês, como é convenção em Python.
## Limitações
Modelo de 3B parâmetros treinado em ~18k exemplos de instrução. Serve como assistente de código do dia a dia, não como fonte autoritativa: **valide o código gerado antes de executar em produção**.
Limitações específicas:
- **Alucinação de API.** Pode inventar parâmetros ou métodos de bibliotecas de terceiros. Confira contra a documentação oficial.
- **Contexto e raciocínio longos.** Refatorações amplas, dependências entre múltiplos arquivos e cadeias longas de raciocínio estão acima do que essa faixa de tamanho entrega de forma confiável.
- **Contaminação.** O modelo base provavelmente já viu parte do dataset de treino. Avaliações feitas com tarefas derivadas desse dataset superestimam o desempenho.
- **Segurança.** O código gerado não passa por análise de segurança. Trate-o como código de terceiros: revise antes de executar, especialmente se manipular arquivos, rede ou entrada não confiável.
- **Escopo.** Ajustado para Python. Outras linguagens funcionam apenas na medida do modelo base.
## Licença
Apache 2.0, herdada do modelo base Qwen2.5-3B-Instruct. Verifique também os termos do dataset antes de redistribuir derivados.
## Créditos
- Modelo base: [Qwen/Qwen2.5-3B-Instruct](https://huggingface.co/Qwen/Qwen2.5-3B-Instruct)
- Dataset: [iamtarun/python_code_instructions_18k_alpaca](https://huggingface.co/datasets/iamtarun/python_code_instructions_18k_alpaca)
- Método: [QLoRA (Dettmers et al., 2023)](https://arxiv.org/abs/2305.14314) e [LoRA (Hu et al., 2021)](https://arxiv.org/abs/2106.09685) |