codealpaca - Code Alpaca:在代码生成指令上训练的 Instruction-following LLaMA Model

Created at: 2023-03-22 19:28:54
Language: Python
License: Apache-2.0

Code Alpaca:一种根据代码生成指令训练的遵循指令的LLaMA模型

许可证 蟒蛇 3.9+ 代码样式:黑色

这是Code Alpaca项目的存储库,该项目旨在构建和共享一个遵循指令的LLaMA模型,用于代码生成。此存储库完全基于斯坦福羊驼,并且仅更改用于训练的数据。培训方法是一样的。

存储库包含:

该模型的演示可以在 https://code-alpaca-demo.vercel.app/

概述

Code Alpaca 模型是从 7B 和 13B LLaMA 模型对 Self-Ininstruction [1] 论文中的技术生成的 20K 指令跟踪数据进行微调的,并进行了一些修改,我们将在下一节中讨论。Evals仍然是一个待办事项。

该模型没有经过微调以安全无害,因此请谨慎。

当前版本包含数据生成过程、数据集和训练代码。模型权重目前不是版本的一部分,以尊重OpenAI TOS和LLaMA许可证。

[1]:自我指导:将语言模型与自我生成的指令对齐。王一中, 叶加内·科尔迪, 斯瓦鲁普·米什拉, 艾丽莎·刘, 诺亚·史密斯, 丹尼尔·卡沙比, 汉纳内·哈吉希尔齐.https://arxiv.org/abs/2212.10560

数据发布

data/code_alpaca_20k.json 包含 20K 指令跟踪数据,用于微调 Code Alpaca 模型。此 JSON 文件是字典列表,每个字典包含以下字段:

  • instruction
    :,描述模型应执行的任务。20K 指令中的每一个都是唯一的。
    str
  • input
    :、任务的可选上下文或输入。例如,当指令为“修改以下 SQL 查询以选择不同的元素”时,输入是 SQL 查询。大约 40% 的示例有输入。
    str
  • output
    :,由 生成的指令的答案。
    str
    text-davinci-003

我们使用以下提示来微调模型:

  • 对于具有非空输入字段的示例:
Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request.

### Instruction:
{instruction}

### Input:
{input}

### Response:
  • 对于输入字段为空的示例:
Below is an instruction that describes a task. Write a response that appropriately completes the request.

### Instruction:
{instruction}

### Response:

在推理过程中(例如,对于网络演示),我们使用带有空输入字段的用户指令(第二个选项)。

数据生成过程

运行代码
  1. 将环境变量设置为 OpenAI API 密钥。
    OPENAI_API_KEY
  2. 使用 安装依赖项。
    pip install -r requirements.txt
  3. 运行以生成数据。
    python -m generate_instruction generate_instruction_following_data
数据生成管道与 [Stanford Alpaca](https://github.com/tatsu-lab/stanford_alpaca) - 修改提示相比略有变化,以专注于代码生成/编辑/优化任务,而不是常规任务。- 修改了种子任务,使其仅与代码生成相关。

这产生了一个遵循指令的数据集,其中包含以低得多的成本(不到 200 美元)获得的 20K 个示例。还包括一个较小的 2k 样本数据集,用于降低模型的方法和质量的风险。

微调

使用以下超参数使用标准拥抱面部训练代码和 deepspeed 微调模型:

超参数 价值
学习率 2e-5
时代 3
最大长度 512
重量衰减 0

鉴于Hugging Face尚未正式支持LLaMA模型,我们通过从特定分支(即此PR要合并)安装LLaMA与Hugging Face的变压器库进行了微调。我们安装的特定提交的哈希值是 。

68d640f7c368bcaaaecfc678f11908ebbd3d6176

该代码在 8xA100 80GB 上运行,但也可以在 8xA10040GB 或 4xA100 上运行,具有较低的批大小和梯度累积步骤。要获得GPU,我建议使用Lambda Labs,这是最佳硬件的最佳价格。

要重现 LLaMA 的微调运行,请先安装要求

pip install -r requirements.txt

然后,安装拥抱脸的变压器库的特定分支。

下面是一个命令,该命令在具有 4 个 A100 80G GPU 的机器上用我们的数据集微调 LLaMA-7B,处于 FSDP 模式。我们能够使用 Python 3.10 使用以下命令重现与我们在演示中托管的模型质量相似的模型。替换为你自己的端口、转换后的检查点和分词器的路径(按照 PR 中的说明进行操作),以及要存储输出的位置。

full_shard
<your_random_port>
<your_path_to_hf_converted_llama_ckpt_and_tokenizer>
<your_output_dir>

torchrun --nproc_per_node=8 --master_port=<your_random_port> train.py \
    --model_name_or_path <your_path_to_hf_converted_llama_ckpt_and_tokenizer>
    --data_path ./data/code_alpaca_20k.json \
    --fp16 True \
    --output_dir <your_output_dir> \
    --num_train_epochs 3 \
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 8 \
    --gradient_accumulation_steps 4 \
    --evaluation_strategy "no" \
    --save_strategy "steps" \
    --save_steps 500 \
    --save_total_limit 1 \
    --learning_rate 2e-5 \
    --weight_decay 0. \
    --warmup_ratio 0.03 \
    --lr_scheduler_type "cosine" \
    --logging_steps 1 \
    --deepspeed ds_config.json
    --tf32 False

请注意,给定的训练脚本旨在简单易用,并且没有特别优化。

为了方便起见,我包含了convert_to_hf.py covnert 骆驼检查点到拥抱面兼容检查点。(此文件取自拥抱面变压器存储库)

引文

如果你愿意,或者不想,引用这个回购,两者都很好。

@misc{codealpaca,
  author = {Sahil Chaudhary},
  title = {Code Alpaca: An Instruction-following LLaMA model for code generation},
  year = {2023},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/sahil280114/codealpaca}},
}

当然,你还应该引用原始LLaMA论文[1]和Self-Instruct论文[2]以及斯坦福羊驼回购