这是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:
在推理过程中(例如,对于网络演示),我们使用带有空输入字段的用户指令(第二个选项)。
OPENAI_API_KEY
pip install -r requirements.txt
python -m generate_instruction generate_instruction_following_data
这产生了一个遵循指令的数据集,其中包含以低得多的成本(不到 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]以及斯坦福羊驼回购。