MetaAI最近在开源大模型上很活跃,刚发布了llama2模型,又基于llama2发布了code llama,用于代码生成,补全等,其中code llama 34B模型在代码能力生成上追平chatgpt3.5,接近chatgpt4的水平。
1.技术介绍
llama等llm大语言模型可以执行各种语言任务,比如代码生成,智能问答。对于某些专业领域,llama等大模型能力可能表现一般,但通过在特定专业领域的训练,可以提高llm在该专业领域的理解能力,比如清华基于法律数据训练的中文法律大模型chatlaw。
code llama就是在llama2模型【一文看懂llama2(原理,模型,训练)】的基础上,利用代码数据进行训练和微调,提高llama2在代码生成上的能力。
code llama提供了三种模型,每种模型包含7B,13B,34B三个尺寸,支持多种编程语言,如Python, C++, Java, PHP, Typescript (Javascript), C#, Bash等。
- Code Llama,代码生成的基础模型;
- Code Llama-Python,单独针对于python的模型;
- Code Llama-Instruct,根据人工指令微调的模型。
训练时主要包含以下方法:
1.1 代码补全(Infilling)
llm语言模型的自回归训练适合代码提示生成任务,但不支持代码补全。
代码补全就是根据代码的上下文预测代码缺失的部分,比如在IDE中,对鼠标位置的代码自动完成,文档自动生成等。
将训练的文本序列一部分移动到结尾,然后自回归重新排序进行训练。
策略参考论文[Efficient Training of Language Models to Fill in the Middle],将文本分成<prefix>,<middle>和<suffix>三部分(前,中,后),然后按2种方式排列。
PSM:即prefix,suffix,middle的顺序,结构如下图:
SPM:即suffix,prefix,middle的顺序,类似上图,前2部分顺序反转。
训练时样本一半按PSM格式,一半按SPM格式。
1.2 长文本微调(Long context fine-tuning)
处理长文本是大语言模型的基础能力,为了支持,支持更长的上下文,常见的做法就是外推。
具体参考【LinguaMind:浅谈LLM的长度外推】
llama2训练时token长度为4096,codellama则增加到16384。
为了将训练成本限制在微调,参考RoPE线性插值的思路,只不过这里没有采用插值,而是修改注意力的衰减周期。如下图公式所示,将 中的从10000改成1000000,然后进行微调训练。
调整前后,对比如下图,调大之后,减少了注意力分数的衰减,有助于更远的token对当前的token作用,解决了长距离的注意力过于集中的问题。
通过这种策略,codallama表现出更强的外推性,在tokens长度到100,000也表现出稳定的性能。
1.3 指令微调(Instruction fine-tuning)
对于指令微调,最重要的还是构建更好的数据集。
(1)专有数据集(Proprietary dataset)
通过RLHF人工反馈强化学习不断收集数据,整合了数千个监督微调和数百万个拒绝采样的样本,每个样本都包含用户和助手的多轮对话。对于拒绝的样本,使用奖励模型经过迭代中选择,最终得到有效和安全的数据。
(2)指令数据集(self-instruct dataset)
专有数据集中只包含一部分代码的相关任务。对于代码任务,通过人工收集数据成本太高,且需要专业的开发人员。为了替代人工机制,通过模型执行的反馈机制来选取数据集,生成了14000个问题-test-解决方案数据集。
- 用llama2 70B模型,通过prompt生成62000个面试的程序问题,如下图所示,然后去重,只保留了52000个问题。
- 对于每个问题,先用LLama7b模型生成单元测试用例,如下图所示,
根据上述单元测试用例,生成10个python代码的方案,然后执行每个方案,将第一个通过的方案加入到指令数据集中。
(3)为了防止模型在一般语言能力上退化,利用6%的代码数据和2%的语言数据进行训练。
2.性能指标
从图中看出,通过2个任务指标评价code-llama的能力。
2.1 HumanEval数据集
包括164个人工手写的编程问题,其中每个编程问题包括函数头、docstrings、函数体和几个unittests。HumanEval中的编程问题可以用来评估语言理解能力、推理能力、算法能力和简单的数学能力。
评价指标pass@k如下图所示,在预测时产生(n≥k)个样本,统计能够通过unit tests的正确样本数量(c≤n)。pass@1就是greedy(贪心算法)生成结果的通过率,pass@10就是生成结果采样10个样本,统计通过unittest的通过率。
2.2 MBPP数据集
包含974个编程任务,人给出所需程序的描述,引导模型生成正确的代码。
MBPP数据示例如下图:
2.3 性能指标
在HumanEval上评估根据docstrings生成代码的能力,MBPP根据文字描述生成代码。
code Llama 34b模型在HumanEval达到53.7%,MBPP达到56.2%,接近Chatgpt的水平。
3.应用部署
从评价指标上看,有条件最好用34b模型,性能最好。
3.1 torch部署
参考官方代码【https://github.com/facebookresearch/codellama】,首先申请下载模型,然后讲邮件中的地址copy到download.sh中,执行”bash download.sh”脚本即可,申请很容易,信息随便填,location不能选china。
# 指令推理代码
torchrun --nproc_per_node 1 example_instructions.py
--ckpt_dir CodeLlama-7b-Instruct/
--tokenizer_path CodeLlama-7b-Instruct/tokenizer.model
--max_seq_len 512 --max_batch_size 4
3.2 huggingface部署
参考【Code Llama – Playground – a Hugging Face Space by codellama】中Files代码,本地部署一个。
codellama提供了huggingface transformer格式的模型。
3.3 cpu部署示例
参考【GitHub – AIAnytime/Code-Llama-QA-Bot】,基于llama.cpp进行部署。
llama2-code cpu运行测试地址,llama.cpp版本的模型地址【CodeLlama-7B-Instruct-GGUF】。
3.4 vscode插件
看到code-llama,就想能不能用到vscode,方便开发。具体参考【https://github.com/xNul/code-llama-for-vscode】
第一步参考codellama官方教程下载模型,然后上述库实现一个推理服务;
第二步安装Continue插件,配置Continue中model的API地址。对于那些保密内网开发的,可以在内网服务器部署,这样整个局域网都能使用了。
# Continue配置config.py文件,代码55行,默认用的是pt-3.5-turbo接口
models=Models(
# You can try Continue with limited free usage. Please eventually replace with your own API key.
# Learn how to customize models here: https://continue.dev/docs/customization#change-the-default-llm
default=MaybeProxyOpenAI(api_key="", model="gpt-4"),
medium=MaybeProxyOpenAI(api_key="", model="gpt-3.5-turbo")
)
效果如下图,编译节目选中代码,Continue插件中输入对应的prompt即可,比如”注释”,就可以对代码进行解释。
4.参考链接
- 【大语言模型】一文看懂llama2(原理,模型,训练)
- code-llama 官方博客介绍
- code-llama论文
- facebookresearch/codellama代码库-推理
- 【cpu部署】Code-Llama-QA-Bot
- 【在线试用】huggingface-codellama-13b-chat测试地址
- 【在线试用】huggingface-Code Llama – Playground
- human-eval数据集
- MBPP数据集介绍
- code-llama-for-vscode 插件
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/302524.html