license: bigcode-openrail-m
datasets:
- bigcode/the-stack-dedup
- teknium1/GPTeacher-codegen
library_name: transformers
pipeline_tag: text-generation
tags:
- 代码生成
StarCoder GPTeacher-Codegen微调版
本模型基于bigcode/starcoder
,使用teknium1/GPTeacher
代码生成数据集(GPT-4代码指令微调)进行微调。
模型详情
基础StarCoder模型为155亿参数模型,训练数据涵盖The Stack (v1.2)中80+种编程语言(已排除退出请求数据)。模型采用多头查询注意力机制,8192token上下文窗口,基于中间填充目标在1万亿token上训练。
使用场景
预期用途
基础模型在GitHub代码上训练后,通过指令进行微调。对于"编写计算平方根的函数"这类提示能较好响应。原仓库推荐使用技术助手提示模板进行少样本提示。本微调模型采用Alpaca提示模板。
生成示例
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
checkpoint = "GeorgiaTechResearchInstitute/starcoder-gpteacher-code-instruct"
device = "cuda"
input_prompt = ("以下是描述任务的指令,附带提供上下文的输入。请编写恰当完成请求的响应。\n\n"
"### 指令:\n"
"{instruction}\n\n"
"### 输入:\n"
"{input}\n\n"
"### 响应:")
prompt = "请解释以下程序。"
extra_input = "send(to, from, count)\nregister short *to, *from;\nregister count;\n{\n register n = (count + 7) / 8;\n switch (count % 8) {\n case 0: do { *to = *from++;\n case 7: *to = *from++;\n case 6: *to = *from++;\n case 5: *to = *from++;\n case 4: *to = *from++;\n case 3: *to = *from++;\n case 2: *to = *from++;\n case 1: *to = *from++;\n } while (--n > 0);\n }\n}"
prompt = input_prompt.format_map({"instruction": prompt, "input": extra_input})
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint, trust_remote_code=True, torch_dtype=torch.float16).to(device)
inputs = tokenizer.encode(prompt, return_tensors="pt").to(device)
outputs = model.generate(inputs)
print(tokenizer.decode(outputs[0]))
示例输出
完整提示:
以下是描述任务的指令,附带提供上下文的输入。请编写恰当完成请求的响应。
### 指令:
这个程序的功能和原理是什么?
### 输入:
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7) / 8;
switch (count % 8) {
case 0: *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}
while (--n > 0) {
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
*to = *from++;
}
}
### 响应:
模型响应:
该程序用于高效地将字节从内存的一个位置复制到另一个位置。它将'from'指针指向位置的'count'个字节复制到'to'指针指向位置,无论地址是否对齐都能正确工作。函数'foo'是封装函数,用于初始化'to'和'from'指针,检查内存边界,并在必要时进行字节对齐。
使用该程序时,需声明两个指针变量'to'和'from',然后调用'foo'函数并传入以下参数:
foo(to, from, count)
归属要求
模型预训练数据集仅包含宽松许可证内容,但可能生成与数据集完全一致的代码片段。部分代码许可证可能要求署名或其他特定要求。BigCode项目提供搜索索引帮助追溯生成代码来源。
局限性
模型在80+种编程语言的源代码上训练,主要语言为英语。虽然能基于上下文生成代码片段,但不能保证生成代码的有效性,可能存在低效、错误或漏洞问题。详见原始论文。当前微调版本对用户指令响应更佳,但仍是早期尝试,效果未达模型全部潜力。
训练
模型参数
- 架构: 采用多头查询注意力的GPT-2模型,中间填充训练目标
- 预训练步数: 25万步
- 预训练token数: 1万亿
- 精度: bfloat16
- 指令-响应对微调数据: 4.5k条
- 微调上下文长度: 1024token
- 微调轮次: 3轮
- 微调学习率: 2e-5
- 优化方案: FSDP
硬件配置
- GPU: 8块Tesla A100
- 训练时长: 5小时
许可协议
模型采用BigCode OpenRAIL-M v1许可证,完整协议参见此处。由于使用GPT-4输出进行微调,同时受OpenAI服务条款约束。
引用
基础模型仓库参见此处
@article{li2023starcoder,
title={StarCoder:愿源码与你同在!},
author={Raymond Li等},
year={2023},
eprint={2305.06161},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
详细结果参见此处
指标 |
得分 |
平均分 |
32.57 |
ARC (25样本) |
32.68 |
HellaSwag (10样本) |
47.6 |
MMLU (5样本) |
28.63 |
TruthfulQA (0样本) |
40.41 |
Winogrande (5样本) |
55.56 |
GSM8K (5样本) |
0.0 |
DROP (3样本) |
23.11 |