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)