🚀 GPT-Neo-125M-Code-Clippy
GPT-Neo-125M-Code-Clippy是一个专门用于多编程语言方法自动补全的模型。它基于GPT-Neo-125M模型微调而来,能为开发者在代码编写过程中提供高效的辅助。
🚀 快速开始
请参考我们新的 GitHub Wiki,其中详细记录了我们创建GitHub Copilot开源版本的工作。
✨ 主要特性
GPT-Neo-125M-Code-Clippy是基于 GPT-Neo-125M模型 进行微调的。它使用因果语言建模,在包含重复项的Code Clippy Data数据集上进行训练,该数据集是从公共GitHub仓库中抓取的(更多信息见提供的链接)。此模型专门用于对多种编程语言的方法进行自动补全。
如OpenAI的 Codex论文 中所讨论的,我们对GPT-Neo模型和分词器进行了修改,以适应额外的空白字符。具体来说,我们添加了以下标记 ["\t\t", " ", " ", " "]
,由于它们都与缩进相关,我们用与模型中已有的 \t
标记相同的权重初始化这些标记的嵌入层,希望模型能更快地学会将这些空白字符与缩进关联起来。自动执行此操作的脚本可在 此处 找到。
📦 安装指南
训练过程
用于训练此模型的训练脚本可在 此处 找到。
要重现训练过程,可以使用以下命令结合上述脚本:
./run_clm_streaming_flax.py \
--output_dir $HOME/gpt-neo-125M-code-clippy \
--model_name_or_path="flax-community/gpt-neo-125M-code-clippy" \
--dataset_name $HOME/gpt-code-clippy/data_processing/code_clippy.py \
--data_dir /home/shared/code_clippy_data \
--text_column_name="text" \
--do_train --do_eval \
--block_size="2048" \
--per_device_train_batch_size="8" \
--per_device_eval_batch_size="16" \
--preprocessing_num_workers="8" \
--learning_rate="1e-4" \
--max_steps 100000 \
--warmup_steps 2500 \
--decay_steps 25000 \
--adam_beta1="0.9" \
--adam_beta2="0.95" \
--weight_decay="0.1" \
--overwrite_output_dir \
--logging_steps="100" \
--eval_steps="500" \
--push_to_hub="False" \
--report_to="all" \
--dtype="bfloat16" \
--skip_memory_metrics="True" \
--save_steps="500" \
--save_total_limit 10 \
--gradient_accumulation_steps 16 \
--report_to="wandb" \
--run_name="125m_1e-4lr_1024bs" \
--max_eval_samples 2000 \
--save_optimizer true
💻 使用示例
基础用法
你可以直接使用此模型进行文本生成。以下示例每次运行时都会生成不同的序列:
from transformers import AutoModelForCausalLM, AutoTokenizer, FlaxAutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("flax-community/gpt-neo-125M-code-clippy")
tokenizer = AutoTokenizer.from_pretrained("flax-community/gpt-neo-125M-code-clippy")
prompt = """def greet(name):
'''A function to greet user. Given a user name it should say hello'''
"""
input_ids = tokenizer(prompt, return_tensors='pt').input_ids.to(device)
start = input_ids.size(1)
out = model.generate(input_ids, do_sample=True, max_length=50, num_beams=2,
early_stopping=True, eos_token_id=tokenizer.eos_token_id, )
print(tokenizer.decode(out[0][start:]))
📚 详细文档
预期用途和限制
该模型是在GitHub仓库的文本文件(主要是编程语言文件,但也包括Markdown和其他项目相关文件)上进行微调的。
限制和偏差
此模型仅用于研究目的,不保证生成代码的质量。
OpenAI的论文 "Evaluating Large Language Models Trained on Code" 对在代码上训练的大语言模型的影响进行了很好的讨论。因此,这里突出了他们讨论中与该数据集和可能从该数据集训练的模型相关的部分。以及与论文观点的一些差异,特别是在法律影响方面。
- 过度依赖:此模型可能会生成看似合理但不一定正确的解决方案。如果不恰当地评估生成的代码,可能会导致负面后果,例如引入错误或安全漏洞。因此,用户必须了解使用此语言模型的局限性和潜在的负面后果。
- 经济和劳动力市场影响:在如此大规模代码数据集上训练的、能够生成高质量代码的大语言模型,有可能自动化部分软件开发过程。这可能会对软件开发人员产生负面影响。然而,正如论文中所讨论的,根据 O*NET OnLine 的软件开发人员总结报告所示,开发人员不仅仅是编写软件。
- 安全影响:在训练此模型的数据集上,没有对漏洞或有缺陷的代码进行过滤或检查。这意味着数据集可能包含恶意代码或存在漏洞的代码。因此,此模型可能会生成有漏洞、有缺陷或恶意的代码。在安全关键型软件中,这可能导致软件运行不正常,并可能根据软件的不同导致严重后果。此外,此模型可能会被用于故意生成恶意代码,以进行勒索软件或其他此类攻击。
- 法律影响:没有对许可代码进行过滤。这意味着数据集可能包含受限制许可的代码。正如论文中所讨论的,公共GitHub仓库可能属于“合理使用”。然而,此前几乎没有此类使用许可的公开可用代码的案例。因此,使用此模型生成的任何代码可能需要遵守与训练它的软件一致的许可条款,例如GPL - 3.0。目前尚不清楚使用在此数据集上训练的语言模型的法律后果。
- 偏差:此模型训练数据集里最具代表性的编程语言是Javascript和Python。因此,其他仍然流行的语言,如C和C++,代表性较低,因此该模型在这些语言上的性能相对较差。此外,此数据集仅包含公共仓库,因此模型可能无法生成代表私人开发者编写的代码。没有对潜在的种族主义、冒犯性或其他不适当内容进行过滤。因此,此模型在生成代码时可能会反映出此类偏差。
GPT-Neo-125M-Code-Clippy是从GPT-Neo微调而来的,可能继承了它的偏差和限制。详情请参阅 GPT-Neo模型卡片。
评估结果
即将推出...
📄 许可证
文档未提及相关内容,故跳过该章节。
🔧 技术细节
训练数据
Code Clippy Data数据集。
模型修改
对GPT-Neo模型和分词器进行了修改,以适应额外的空白字符。添加了 ["\t\t", " ", " ", " "]
标记,并使用与 \t
标记相同的权重初始化其嵌入层。自动执行此操作的脚本可在 此处 找到。
训练脚本
训练脚本可在 此处 找到。通过特定命令可重现训练过程,命令示例见上文“安装指南”部分。