【llm大语言模型】一文看懂llama2(原理,模型,训练)

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,根据人工指令微调的模型。
【llm大语言模型】一文看懂llama2(原理,模型,训练)
codellama流程

训练时主要包含以下方法:

1.1 代码补全(Infilling)

llm语言模型的自回归训练适合代码提示生成任务,但不支持代码补全。

代码补全就是根据代码的上下文预测代码缺失的部分,比如在IDE中,对鼠标位置的代码自动完成,文档自动生成等。

将训练的文本序列一部分移动到结尾,然后自回归重新排序进行训练。

策略参考论文[Efficient Training of Language Models to Fill in the Middle],将文本分成<prefix>,<middle>和<suffix>三部分(前,中,后),然后按2种方式排列。

PSM:即prefix,suffix,middle的顺序,结构如下图:

【llm大语言模型】一文看懂llama2(原理,模型,训练)

SPM:即suffix,prefix,middle的顺序,类似上图,前2部分顺序反转。

训练时样本一半按PSM格式,一半按SPM格式。

1.2 长文本微调(Long context fine-tuning)

处理长文本是大语言模型的基础能力,为了支持,支持更长的上下文,常见的做法就是外推。

具体参考【LinguaMind:浅谈LLM的长度外推

llama2训练时token长度为4096,codellama则增加到16384。

为了将训练成本限制在微调,参考RoPE线性插值的思路,只不过这里没有采用插值,而是修改注意力的衰减周期。如下图公式所示,将 中的从10000改成1000000,然后进行微调训练。

【llm大语言模型】一文看懂llama2(原理,模型,训练)

调整前后,对比如下图,调大之后,减少了注意力分数的衰减,有助于更远的token对当前的token作用,解决了长距离的注意力过于集中的问题。

【llm大语言模型】一文看懂llama2(原理,模型,训练)

通过这种策略,codallama表现出更强的外推性,在tokens长度到100,000也表现出稳定的性能。

1.3 指令微调(Instruction fine-tuning)

对于指令微调,最重要的还是构建更好的数据集。

(1)专有数据集(Proprietary dataset)

通过RLHF人工反馈强化学习不断收集数据,整合了数千个监督微调和数百万个拒绝采样的样本,每个样本都包含用户和助手的多轮对话。对于拒绝的样本,使用奖励模型经过迭代中选择,最终得到有效和安全的数据。

【llm大语言模型】一文看懂llama2(原理,模型,训练)

(2)指令数据集(self-instruct dataset)

专有数据集中只包含一部分代码的相关任务。对于代码任务,通过人工收集数据成本太高,且需要专业的开发人员。为了替代人工机制,通过模型执行的反馈机制来选取数据集,生成了14000个问题-test-解决方案数据集。

  • 用llama2 70B模型,通过prompt生成62000个面试的程序问题,如下图所示,然后去重,只保留了52000个问题。
【llm大语言模型】一文看懂llama2(原理,模型,训练)
  • 对于每个问题,先用LLama7b模型生成单元测试用例,如下图所示,
【llm大语言模型】一文看懂llama2(原理,模型,训练)
对问题生成单元测试用例

根据上述单元测试用例,生成10个python代码的方案,然后执行每个方案,将第一个通过的方案加入到指令数据集中。

【llm大语言模型】一文看懂llama2(原理,模型,训练)

(3)为了防止模型在一般语言能力上退化,利用6%的代码数据和2%的语言数据进行训练。

2.性能指标

从图中看出,通过2个任务指标评价code-llama的能力。

2.1 HumanEval数据集

包括164个人工手写的编程问题,其中每个编程问题包括函数头、docstrings、函数体和几个unittests。HumanEval中的编程问题可以用来评估语言理解能力、推理能力、算法能力和简单的数学能力。

【llm大语言模型】一文看懂llama2(原理,模型,训练)
humaneval数据集示例

评价指标pass@k如下图所示,在预测时产生(n≥k)个样本,统计能够通过unit tests的正确样本数量(c≤n)。pass@1就是greedy(贪心算法)生成结果的通过率,pass@10就是生成结果采样10个样本,统计通过unittest的通过率。

【llm大语言模型】一文看懂llama2(原理,模型,训练)
pass@k统计指标

2.2 MBPP数据集

包含974个编程任务,人给出所需程序的描述,引导模型生成正确的代码。

MBPP数据示例如下图:

【llm大语言模型】一文看懂llama2(原理,模型,训练)
MBPP数据示例

2.3 性能指标

在HumanEval上评估根据docstrings生成代码的能力,MBPP根据文字描述生成代码。

code Llama 34b模型在HumanEval达到53.7%,MBPP达到56.2%,接近Chatgpt的水平。

【llm大语言模型】一文看懂llama2(原理,模型,训练)

3.应用部署

从评价指标上看,有条件最好用34b模型,性能最好。

3.1 torch部署

参考官方代码【github.com/facebookrese】,首先申请下载模型,然后讲邮件中的地址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,方便开发。具体参考【github.com/xNul/code-ll

第一步参考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即可,比如”注释”,就可以对代码进行解释。

【llm大语言模型】一文看懂llama2(原理,模型,训练)
Continue插件

4.参考链接

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/302524.html

(0)
上一篇 2023年9月11日 14:51
下一篇 2023年9月11日 16:21

相关推荐

发表回复

登录后才能评论