File size: 4,922 Bytes
b16bcf2
 
 
 
 
 
 
 
608f394
b16bcf2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
license: bsd-3-clause
base_model: Salesforce/codet5-base
datasets:
  - google/code_x_glue_cc_code_refinement
language:
  - code
library_name: transformers
pipeline_tag: text-generation
tags:
  - code
  - codet5
  - code-repair
  - program-repair
  - bug-fixing
  - java
  - seq2seq
model-index:
  - name: codet5-base-code-repair
    results:
      - task:
          type: text2text-generation
          name: Automated Program Repair
        dataset:
          name: CodeXGLUE code-refinement (small)
          type: google/code_x_glue_cc_code_refinement
          config: small
          split: test
        metrics:
          - type: exact_match
            value: 22.43
            name: Exact Match (%)
          - type: bleu
            value: 80.13
            name: BLEU
---

# codet5-base-code-repair

[Salesforce/codet5-base](https://huggingface.co/Salesforce/codet5-base) fine-tuned on the
[CodeXGLUE code-refinement](https://huggingface.co/datasets/google/code_x_glue_cc_code_refinement)
`small` split for **automated program repair**: given a buggy Java method, the model generates the
fixed version.

Inputs and outputs follow the dataset's abstracted Java style, where identifiers are normalised to
tokens such as `METHOD_1`, `VAR_1`, `TYPE_1` and `STRING_1`.

## Usage

```python
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

model_id = "MODEL_ID"  # <- repo id
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForSeq2SeqLM.from_pretrained(model_id)

buggy = (
    "public int METHOD_1 ( int VAR_1 ) { if ( VAR_1 = 0 ) { return 1 ; } "
    "return ( VAR_1 * ( METHOD_1 ( ( VAR_1 - 1 ) ) ) ) ; }"
)

inputs = tokenizer(buggy, max_length=256, truncation=True, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=256, num_beams=4, early_stopping=True)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
```

No task prefix is needed — the buggy snippet is fed in as-is. Beam search with `num_beams=4` is the
decoding setting used for all numbers reported below, and it is already stored in the repo's
`generation_config.json`.

## Results

Full splits (5,835 examples each), beam search with 4 beams:

| Split      | Exact Match | BLEU  | Loss   |
|------------|-------------|-------|--------|
| Validation | 21.29%      | 80.27 | 0.1272 |
| Test       | 22.43%      | 80.13 | 0.1257 |

Breakdown of the test-set predictions:

| Outcome                                     | Share  |
|---------------------------------------------|--------|
| Exact fix                                   | 22.43% |
| Partial fix (changed, closer but not exact) | 13.49% |
| Input copied unchanged                      | 3.38%  |
| Incorrect                                   | 64.08% |

The high BLEU next to the modest exact-match rate is expected for this task: the fixed method is
usually a near-copy of the buggy one, so most generated tokens are correct even when the actual bug
is not fixed. **Exact match is the metric that matters here**; BLEU mostly measures how well the
model preserves the surrounding code.

Validation exact match by epoch (1,000-example in-training subset):

| Epoch | 1    | 2    | 3    | 4    | 5    | 6    | 7    | 8    | 9        | 10   |
|-------|------|------|------|------|------|------|------|------|----------|------|
| EM    | 10.5 | 15.2 | 17.5 | 19.5 | 19.8 | 20.6 | 20.9 | 20.6 | **21.2** | 21.0 |

The epoch-9 checkpoint scored best and is the one published here.

## Training

| | |
|---|---|
| Base model | `Salesforce/codet5-base` (~223M params) |
| Dataset | `google/code_x_glue_cc_code_refinement`, config `small` |
| Train / validation / test | 46,680 / 5,835 / 5,835 |
| Epochs | 10 (best checkpoint by exact match kept) |
| Learning rate | 5e-5, linear decay, 5% warmup |
| Batch size | 16 × 2 gradient accumulation (effective 32) |
| Weight decay | 0.01 |
| Max grad norm | 1.0 |
| Max source / target length | 256 / 256 tokens |
| Precision | bf16 |
| Seed | 42 |
| Training time | ~1h25m on a single GPU |

No example in any split was truncated at 256 tokens (longest source: 132 tokens), and the dataset
contains no identical buggy/fixed pairs.

## Limitations

- Trained only on **abstracted Java** methods from CodeXGLUE. Real-world code with actual
  identifier names, or any other language, is out of distribution and will perform much worse.
- Handles single, self-contained methods — no cross-file or repository-level context.
- Roughly two thirds of test inputs are still not repaired correctly. Treat outputs as suggestions
  to review, not as verified fixes, and always re-run your tests.
- The model can return the input unchanged (3.4% of the test set) when it finds no fix.

## License

Released under BSD-3-Clause, following the `Salesforce/codet5-base` base model. The training data,
CodeXGLUE code-refinement, is distributed under the Computational Use of Data Agreement (C-UDA).