ToB企服应用市场:ToB评测及商务社交产业平台

标题: 代码生成的原理剖析:从Codex、GitHub Copliot到CodeLlama(用了NTK-aware) [打印本页]

作者: 三尺非寒    时间: 2024-10-1 19:08
标题: 代码生成的原理剖析:从Codex、GitHub Copliot到CodeLlama(用了NTK-aware)
媒介

本文精讲代码生成的发展史与其背后的技术原理,总计4个部门


第一部门 GitHub copilot的开端:Codex

我们在这篇文章《ChatGPT技术原理剖析:从RL之PPO算法、RLHF到GPT4、instructGPT》中的2.5节有提到,“2021 年7月,OpenAI发布Codex的论文《Evaluating Large Language Models Trained on Code》,其中初始的Codex是根据120亿参数的GPT-3变体进行微调的,且通过对159GB的Python代码进行代码练习,厥后这个120 亿参数的模子演酿成OpenAI API中的code-cushman-001,具备较强的代码/推理能力”
接下来,我们来看下Codex背后的原理到底是怎样的,即其是怎样一步一步练习出来的
1.1 Codex效果的评估

1.1.1 HumanEval:评估Codex的数据集

为了准确地对Codex进行基准测试,OpenAI创建了一个包含164个原始编程题目的数据集,并进行了单元测试
为了办理该测试集中的一个个编程题目,让Codex生成了多个答案,并检查其中是否有通过单元测试的样本
当然,如果对于某个编程题目,让Codex生成100个答案的话,那Codex-S能够为77.5%的题目生成至少一个正确的答案,这一结果表明,可以通过开导式排序来选择准确的代码样本,而不是充分评估每个样本(This result suggests that accurate code samples can be selected via heuristic ranking instead of fully evaluating each sample)
事实上,我们发现对数概率均值最高的样本通过了44.5%题目的单元测试(Indeed, we find that the sample with highest mean log-probability passes unit tests for 44.5% of the problems)
1.1.2 pass@k度量的计算逻辑

代码的生成模子主要通过与参考办理方案匹配样本来进行基准测试,其中匹配可以是准确的或暗昧的(如BLEU分数)。然而Ren等人(2020)发现BLEU在捕捉特定于代码的语义特征方面存在题目,并发起对分数进行一些语义修改,说白了,BLEU在基于匹配的代码指标方面存在缺陷
   为方便各人对上述pass@k的计算过程有更好的明确,故我还是推导下其计算公式
  
  

  通过末了的式子可知,式子中第二项的分子有2n-c-k项相乘,其分母也有2n-c-k项相乘,很容易导致相乘的结果超出整数所能表示的范围
  下面单独分析一下这个式子
  

  然后把上式拆成两项,可得
  

  末了的结果相称于便是论文中的写法,即
,从而也就与论文中给出的稳定版的代码一致了
  1. def pass_at_k(n, c, k):
  2.     """
  3.     :param n: total number of samples
  4.     :param c: number of correct samples
  5.     :param k: k in pass@$k$
  6.     """
  7.     if n - c < k: return 1.0
  8.     return 1.0 - np.prod(1.0 - k /
  9.         np.arange(n - c + 1, n + 1))
复制代码
1.2 Codex的练习全流程

1.2.1 通过159G的Python代码微调GPT3

因为GPT3只能办理一些相对简单的代码题目(因为其练习数据中并没有特别多的代码),但办理不了相对复杂的代码题目,故Codex通过对12B参数巨细的GPT3进行微调
其练习数据集是在2020年5月从GitHub上托管的5400万个公共软件库中网络的,一开始有179 GB的Python代码,但随着过滤掉了大概是自动生成的文件,匀称行长度大于100,最大行长度大于1000,或者包含一小部门字母数字字符,最终数据集巨细为159 GB
1.2.2 练习参数与采样方法核采样

Codex利用与GPT模子相同的学习率,具有175步线性热身和余弦学习率衰减。我们利用具有β1= 0.9,β2= 0.95,=10−8,权重衰减系数为0.1的Adam优化器,对总共1000亿个token进行练习「We train Codex using the same learning rate as the corre-sponding GPT model, with a 175 step linear warmup andcosine learning rate decay. We train for a total of 100 billiontokens, using the Adam optimizer with β1 = 0.9, β2 = 0.95, = 10−8 , and a weight decay coefficient of 0.1.
之后,有个题目是在预测当前序列的末了一个词时,可以选取概率最大的词(softmax最高的值),但没法全局最优且不具备多样性(因为每次局部最优不代表最终全局最优,且每次都是取概率最大的词,则无论采样多少次,答案都是唯一没有多样性),对此

第二部门 微软GitHub Copilot

2.1 Your AI pair programmer

据GitHub copilot官方先容的页面称
2.1.1 根据注释转换为代码


GitHub Copilot通过OpenAI的Codex演变而来,在大量公共源代码上进行了培训。它既擅长编写天然语言,也擅长编写代码,因此现实上它可以为您完成注释。在下面的例子中,我们起首让它不全我们的注释,然后,一行一行地,完成注释所要求的的功能
2.1.2 创建单元测试

GitHub Copilot的一个重要用例是镌汰编写单元测试的一些苦差事。好比当我们实现了一个计算两个列表的公共前缀的代码后(we already have an implementation of a function that computes the common prefix of two lists),我们想要测试它
为此,我们导入单元测试包,然后我们开始编写一个测试函数,让Copilot生成asserts,我们只需按Tab键就可以接受这些断言

2.1.3 创建SQL查询

好比我们还可以通过GitHub Copilot把嵌入式SQL生成Go(只需将模式显示为CREATE TABLE语句),具体如下图

// 待更

第三部门 Code Llama:Meta于23年8月底发布

3.1 Code Llama:通过代码数据集微调Llama 2

3.1.1 三个模子:Code Llama、Code Llama - Python、Code Llama - instruction

Code Llama 基于特定的代码数据集在Llama 2上进一步微调练习而成,可以根据代码和天然语言提示生成代码,它还可资助用户进行代码补全和调试代码
且Code Llama 的开源协议与 Llama 2 一样,免费用于研究以及商用目的, 其对应的论文为《Code Llama: Open Foundation Models for Code》,此为其GitHub 所在
3.1.2 Code Llama 的练习数据集

下表为 Code Llama、Code Llama-Python 的练习数据集


3.1.3 长上下文微调:类似位置插值微调(fine-tuning by position interpolation)

对长序列的有效处置惩罚是基于transformer的语言建模的一个主要研究课题(Vaswani et al., 2017)。基本的建模挑战是外推,即在练习时间以外的序列长度上进行操纵,以及有利于在短到中等长度输入上进行练习的留意力通报的二次复杂度(Effective handling of long sequences is a major topic of research in transformer-based language model-ing (Vaswani et al., 2017). The fundamental modeling challenges are extrapolation, i.e., operating on sequencelengths beyond those seen at training time, and the quadratic complexity of attention passes which favors training on short-to-medium length inputs.)
具体来说,在旋转嵌入中,位置n的query和key向量xn受到线性变更RΘd,n xn,其中RΘd,n是一个分块对角矩阵,其形式为(Specifically, with rotary embeddings, the query and key vectors xn at position n are subject to a linear transformation RΘd,n xn, where RΘd,nis a blockdiagonal matrix with entries of the form)

而d表示嵌入维数。旋转频率计算为θi=θ−2i/d,为了进行微调,我们将基准周期θ从10000增加到1,000,000。这种增加允许处置惩罚更大的序列,并镌汰对短距离留意力的偏差「d denotes the embedding dimension. Rotation frequencies are computed as θi = θ−2i/d , and we increasethe base period θfrom 10,000 to 1,000,000 for fine-tuning. This increase allows for processing much largersequences and reduces bias towards short-distance attention (see Appendix F.1 for further discussion).
我们的实验证实,Code Llama模子不仅在微调期间利用的增加的序列长度内有效,而且进一步显示外推能力,不仅提供了多达 100000 个上下文 token 的稳定生成,所有模子的练习 token 序列也高达 16000「Ourexperiments confirm that Code Llama models are not only effective within the increased sequence lengthused during fine-tuning, but further show extrapolation capabilities and exhibit stable behavior on very longsequences of up to 100,000 tokens (Section 3.3).
// 待更
3.2 Code Llama 性能怎样

Meta 利用了 HumanEval 和 MBPP(Mostly Basic Python Programming)两个编码基准进行测试。我们已经知道,HumanEval 测试模子基于文档字符串(docstrings)完成代码的能力,而MBPP 则测试模子基于形貌编写代码的能力,具体而言

// 待更

第四部门 从CodeGeex到CodeGeex2

4.1 CodeGeex

关于大型预练习代码模子,除了OpenAI的Codex,还包括

很快,推出了ChatGLM的智谱AI发布了CodeGeeX,参数规模为13B,在23种编程语言的大型代码语料库上进行了预练习,且支持集成到Visual Studio Code、JetBrains等编译器里
4.1.1 codegeex的焦点架构:transformer解码器底子上

与最近的预练习模子(如GPT-3 (Brown等人,2020)、PaLM (Chowdhery等人,2022)和Codex (Chen等人,2021)类似,CodeGeeX遵照生成式预练习(GPT)架构(Radford等人,2018),接纳自回归(编程)语言建模的解码器风格
CodeGeeX的焦点架构是一个39层的transformer解码器


别的,通过接纳GPT范式,我们在大量未标记的代码数据上练习模子。其原理是迭代地将代码token作为输入,预测下一个token,并将其与ground truth进行比力,具体来说
4.1.2 codegeex的练习数据与练习细节

练习语料库包含两部门
为提高练习效率

4.2 CodeGeeX2:基于 ChatGLM2 架构加入代码预练习

4.2.1 CodeGeeX2:通过600B代码预练习且最终+107% > CodeGeeX

据CodeGeeX2的GitHub页面所称,其是多语言代码生成模子 CodeGeeX (KDD’23) 的第二代模子。不同于一代 CodeGeeX(完全在国产华为昇腾芯片平台练习)

更多特性包括:

我们开辟了支持 VS Code、 IntelliJ IDEA、PyCharm、GoLand、WebStorm、Android Studio 等IDE的 CodeGeeX 插件。在插件中,可以更直接地体验到 CodeGeeX2 模子在代码生成与补全、添加注释、代码翻译及技术问答方面的能力为开辟效率带来的提升。欢迎在IDE中下载 CodeGeeX 插件获得更加全面的AI编程体验,详情见CodeGeeX主页
4.2.2 CodeGeeX2的快速利用

4.2.2.1 利用transformers快速调用CodeGeeX2-6B

  1. from transformers import AutoTokenizer, AutoModel
  2. tokenizer = AutoTokenizer.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True)
  3. model = AutoModel.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True, device='cuda')
  4. model = model.eval()
  5. # remember adding a language tag for better performance
  6. prompt = "# language: Python\n# write a bubble sort function\n"
  7. inputs = tokenizer.encode(prompt, return_tensors="pt").to(model.device)
  8. outputs = model.generate(inputs, max_length=256, top_k=1)
  9. response = tokenizer.decode(outputs[0])
  10. >>> print(response)
  11. # language: Python
  12. # write a bubble sort function
  13. def bubble_sort(list):
  14.     for i in range(len(list) - 1):
  15.         for j in range(len(list) - 1):
  16.             if list[j] > list[j + 1]:
  17.                 list[j], list[j + 1] = list[j + 1], list[j]
  18.     return list
  19. print(bubble_sort([5, 2, 1, 8, 4]))
复制代码
4.2.2.2 启动 Gradio DEMO

  1. python ./demo/run_demo.py
  2. usage: run_demo.py [-h] [--model-path MODEL_PATH] [--example-path EXAMPLE_PATH] [--quantize QUANTIZE]
  3.                    [--chatglm-cpp] [--fastllm] [--n-gpus N_GPUS] [--gpu GPU] [--cpu] [--auth] [--username yourname]
  4.                    [--password yourpassword]
  5.                    [--port PORT] [--listen ADDRESS]
  6. # 若要启用身份验证,请先启用--auth,然后定义--username与--password,如:
  7. python run_demo.py --auth --username user --password password  # 若要监听所有地址请指定 --listen 0.0.0.0
复制代码
支持利用 ChatGLM.cpp 量化推理加速:
  1. python ./demo/run_demo.py --quantize 4 --chatglm-cpp
复制代码
4.2.2.3 启动FAST API

  1. python ./demo/fastapicpu.py
  2. usage: fastapicpu.py [-h] [--model-path MODEL_PATH] [--listen ADDRESS] [--port PORT] [--workders NUM] [--cpu] [--half] [--quantize QUANTIZE] [--chatglm-cpp]
  3. # --cpu启用cpu --half启用.half()
复制代码
支持利用 ChatGLM.cpp 量化推理加速,同样添加 --quantize 4 --chatglm-cpp 参数即可。
4.2.2.4 API利用示例

  1. curl -X POST "http://127.0.0.1:7860" \
  2.     -H 'Content-Type: application/json' \
  3.     -d '{"lang": "Python", "prompt": "# Write a quick sort function"}'
复制代码
// 待更

参考文献与推荐阅读


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4