GPT-Neo-125M-Code-Clippy
请参阅我们全新的GitHub Wiki,其中详细记录了我们创建开源版GitHub Copilot的努力
模型描述
GPT-Neo-125M-Code-Clippy是基于GPT-Neo-125M模型进行微调的版本,采用因果语言建模方法训练,训练数据是我们整理的包含重复项的Code Clippy Data数据集(该数据集爬取自公开的Github仓库,更多信息见提供的链接)。该模型专精于多种编程语言的方法自动补全功能。参照OpenAI的Codex论文所述,我们修改了GPT-Neo模型及其分词器以适配额外的空白字符。具体而言,我们添加了以下标记["\t\t", " ", " ", " "]
,由于这些标记均与缩进相关,我们将这些标记的嵌入层权重初始化为模型中已有\t
标记的权重,以期模型能更快建立这些空白字符与缩进的关联。自动执行此操作的脚本可在此处获取。
训练数据
Code Clippy Data数据集。
训练流程
训练脚本详见此处。
要复现训练过程,可使用以下命令配合上述脚本:
./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
使用场景与限制
该模型基于Github仓库中的文本文件(主要是编程语言文件,也包括markdown和其他项目相关文件)进行微调。
使用方法
您可以直接使用文本生成管道调用该模型。以下示例每次运行都会生成不同的序列:
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:]))
限制与偏差
该模型仅供研究使用,不保证生成代码的质量。
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模型卡片。
评估结果
即将发布...