模型:

flax-community/gpt-neo-125M-code-clippy

英文

GPT-Neo-125M-Code-Clippy

请参阅我们的 新文档,详细记录了我们在创建GitHub Copilot开源版本方面的努力

模型描述

GPT-Neo-125M-Code-Clippy是一个在我们的Code Clippy Data数据集上使用因果语言建模进行微调的模型,该数据集包含了来自公共GitHub存储库的重复内容(更多信息请参阅提供的链接)。此模型专门用于自动完成多种编程语言中的方法。如OpenAI的 Codex paper 所讨论的那样,我们修改了GPT-Neo模型和分词器,以适应额外的空格字符。具体来说,我们添加了以下标记 ["\t\t", " ", " ", " "],由于它们都与缩进有关系,我们使用与模型中已存在的\t标记相同的权重来初始化这些标记的嵌入层,希望模型能够更快地将这些空格字符与缩进关联起来。可通过 here 找到自动完成此操作的脚本。

训练数据

Code Clippy Data dataset

训练过程

训练此模型所使用的训练脚本可以在 here 处找到。

要重现训练过程,可以使用上述脚本执行以下命令:

./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存储库的文本文件上进行微调的(主要是编程语言,但也包括标记和其他项目相关文件)。

如何使用

您可以通过文本生成管道直接使用此模型。以下示例每次运行时生成一个不同的序列:

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 model card

    评估结果

    即将推出...