关于人工智能:Code-LlamaLlama-2-学会写代码了

32次阅读

共计 7930 个字符,预计需要花费 20 分钟才能阅读完成。

引言

Code Llama 是为代码类工作而生的一组最先进的、凋谢的 Llama 2 模型,咱们很快乐能将其集成入 Hugging Face 生态系统!Code Llama 应用与 Llama 2 雷同的社区许可证,且可商用。

明天,咱们很快乐能公布 Hugging Face 对 Code Llama 的全面反对 , 包含:

  • Hub 上的模型反对,包含模型卡及许可证
  • Transformers 已集成 Code Llama
  • TGI 已集成 Code Llama,以反对对其进行疾速高效的产品级推理
  • 推理终端 (Inference Endpoints) 已集成 Code Llama
  • 对 Code Llama 的代码基准测试后果已公布

代码大语言模型的倒退对于软件工程师来说无疑是振奋人心的,因为这意味着他们能够通过 IDE 中的代码补全性能来进步生产力,并利用其来解决反复或烦人的工作,例如为代码编写文档字符串或创立单元测试。

目录

  • 引言
  • 目录
  • Code Llama 简介
  • 如何应用 Code Llama?

    • 演示
    • Transformers

      • 代码补全
      • 代码填充
      • 对话式指令
      • 4 比特加载
    • 应用 TGI 和推理终端
  • 评估
  • 其余资源

Code Llama 简介

Code Llama 蕴含 3 个不同参数量的版本,别离为: 7 亿参数版、13 亿参数版 以及 340 亿参数版。在训练根底模型时,先用等同参数量的 Llama 2 模型初始化权重,而后在 5000 亿词元的代码数据集上训练。Meta 还对训得的根底模型进行了两种不同格调的微调,别离为: Python 专家版 (再加 1000 亿个额定词元) ; 以及指令微调版,其能够了解自然语言指令。

这些模型在 Python、C++、Java、PHP、C#、TypeScript 和 Bash 中都展现出最先进的性能。7B 和 13B 根底版和指令版反对完形填空,因而非常适合用作代码助手。

Code Llama 基于 16k 上下文窗口训练。此外,这三个尺寸的模型还进行了额定的长上下文微调,使其上下文窗口最多可扩大至 10 万词元。

受害于 RoPE 扩大方面的最新进展,将 Llama 2 的 4k 上下文窗口减少到 Code Llama 的 16k (甚至能够外插至 100k) 成为可能。社区发现能够对 Llama 的地位嵌入进行线性插值或频域插值,这使得通过微调让根底模型轻松扩大到更大的上下文窗口成为可能。在 Code Llama 中,他们把频域缩放和松弛技术二者联合起来: 微调长度是缩放后的预训练长度的一小部分。这个做法赋予了模型弱小的外推能力。

第一步是在 5000 亿词元的公开代码数据集上训练出一个模型。该数据集中除了有代码数据集外,还蕴含一些自然语言数据集,例如无关代码和代码片段的探讨,且最终数据集是应用近似去重法去过重的。可怜的是,Meta 没有披露无关该数据集的更多信息。

在对模型进行指令微调时,应用了两个数据集: 为 Llama 2 Chat 收集的指令微调数据集和自指令数据集。自指令数据集收集了 Llama 2 编制出的编程面试问题,而后应用 Code Llama 生成单元测试和解答,最初通过执行测试来评估解答。

如何应用 Code Llama?

Transformers 从 4.33 版开始反对 Code Llama。在此之前,须要从主分支进行源代码装置才行。

演示

咱们筹备了 这个 Space 或上面的 Playground 以供大家尝试 Code Llama 模型 (130 亿参数!):

这个演示背地应用了 Hugging Face TGI,HuggingChat 也用了雷同的技术,具体内容见下文。

你还能够玩玩 这个聊天机器人,或者复制一份到本人的账号下以供你应用 – 它是自含的,因而你能够得心应手地批改代码!

Transformers

从最新公布的 transformers 4.33 开始,你能够在 Code Llama 上利用 HF 生态系统中的所有工具,例如:

  • 训练和推理脚本和示例
  • 平安的文件格式 (safetensors )
  • bitsandbytes (4 比特量化) 和 PEFT 等工具联合应用
  • 运行模型生成所需的工具及辅助代码
  • 导出模型以进行部署的机制

transformers 4.33 公布之前,用户须要从主分支源码装置 transformers

!pip install git+https://github.com/huggingface/transformers.git@main accelerate

代码补全

咱们能够应用 7B 和 13B 模型进行文本 / 代码补全或填充。下述代码演示了如何应用 pipeline 接口来进行文本补全。运行时,只需抉择 GPU 即可在 Colab 的收费 GPU 上运行。

from transformers import AutoTokenizer
import transformers
import torch

tokenizer = AutoTokenizer.from_pretrained("codellama/CodeLlama-7b-hf")
pipeline = transformers.pipeline(
    "text-generation",
    model="codellama/CodeLlama-7b-hf",
    torch_dtype=torch.float16,
    device_map="auto",
)

sequences = pipeline(
    'def fibonacci(',
    do_sample=True,
    temperature=0.2,
    top_p=0.9,
    num_return_sequences=1,
    eos_token_id=tokenizer.eos_token_id,
    max_length=100,
)
for seq in sequences:
    print(f"Result: {seq['generated_text']}")

其输入如下:

Result: def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

def fibonacci_memo(n, memo={}):
    if n == 0:
        return 0
    elif n == 1:
        return

Code Llama 尽管专精于代码了解,但其仍是一个语言模型。你依然能够应用雷同的生成策略来主动实现正文或自然语言文本。

代码填充

这是代码模型能力实现的专门工作。该模型经过训练后,能够生成与给定上下文最匹配的代码 (包含正文)。这是代码助理的典型应用场景: 要求它们依据上下文填充以后光标处的代码。

此工作须要应用 7B 和 13B 的 根底 指令 模型。任何 34B 或 Python 版模型不能用于此工作。

填充类工作须要在生成时应用与训练时雷同格局的输出文本,因为训练时会应用非凡的分隔符来辨别提醒的不同局部。侥幸的是,transformersCodeLlamaTokenizer 曾经帮你把这事做了,如下所示:

from transformers import AutoTokenizer, AutoModelForCausalLM
import transformers
import torch

model_id = "codellama/CodeLlama-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.float16
).to("cuda")

prompt = '''def remove_non_ascii(s: str) -> str:""" <FILL_ME>
    return result
'''input_ids = tokenizer(prompt, return_tensors="pt")["input_ids"].to("cuda")
output = model.generate(
    input_ids,
    max_new_tokens=200,
)
output = output[0].to("cpu")

filling = tokenizer.decode(output[input_ids.shape[1]:], skip_special_tokens=True)
print(prompt.replace("<FILL_ME>", filling))

输入如下:

def remove_non_ascii(s: str) -> str:
    """ Remove non-ASCII characters from a string.

    Args:
        s: The string to remove non-ASCII characters from.

    Returns:
        The string with non-ASCII characters removed.
    """result =""
    for c in s:
        if ord(c) < 128:
            result += c
    return result

在底层,分词器会 主动按 <fill_me> 宰割 并生成一个格式化的输出字符串,其格局与 训练时的格局 雷同。这样做既防止了用户本人格式化的很多麻烦,也防止了一些很难调试的陷阱,例如词元粘合 (token glueing)。

对话式指令

如上所述,根底模型可用于补全和填充。Code Llama 还蕴含一个实用于对话场景的指令微调模型。

为此类工作筹备输出时,咱们须要一个提醒模板。一个例子是咱们在 Llama 2 博文 中形容的模板,如下:

<s>[INST] <<SYS>>
{{system_prompt}}
<</SYS>>

{{user_msg_1}} [/INST]{{model_answer_1}} </s><s>[INST]{{user_msg_2}} [/INST]

请留神,零碎提醒 (system prompt ) 是可选的 – 没有它模型也能工作,但你能够用它来进一步指定模型的行为或格调。例如,如果你心愿取得 JavaScript 的答案,即可在此申明。在零碎提醒之后,你须要提供对话交互历史: 用户问了什么以及模型答复了什么。与填充场景一样,你须要留神分隔符的应用。输出的最初必须是新的用户指令,这对模型而言是让其提供答案的信号。

以下代码片段演示了如何在理论工作中应用该模板。

  1. 首次用户输出,无零碎提醒
user = 'In Bash, how do I list all text files in the current directory (excluding subdirectories) that have been modified in the last month?'

prompt = f"<s>[INST]{user.strip()} [/INST]"
inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")
  1. 首次用户查问,有零碎提醒
system = "Provide answers in JavaScript"
user = "Write a function that computes the set of sums of all contiguous sublists of a given list."

prompt = f"<s><<SYS>>\\n{system}\\n<</SYS>>\\n\\n{user}"
inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")
  1. 含对话历史的多轮对话

该过程与 Llama 2 中的过程雷同。为了最分明起见,咱们没有应用循环或泛化此示例代码:

system = "System prompt"
user_1 = "user_prompt_1"
answer_1 = "answer_1"
user_2 = "user_prompt_2"
answer_2 = "answer_2"
user_3 = "user_prompt_3"

prompt = f"<<SYS>>\\n{system}\\n<</SYS>>\\n\\n{user_1}"
prompt = f"<s>[INST]{prompt.strip()} [/INST]{answer_1.strip()} </s>"
prompt += f"<s>[INST]{user_2.strip()} [/INST]{answer_2.strip()} </s>"
prompt += f"<s>[INST]{user_3.strip()} [/INST]"

inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")

4 比特加载

将 Code Llama 集成到 Transformers 中意味着咱们能够立刻取得 4 比特加载等高级性能的反对。这使得用户能够在英伟达 3090 卡等消费类 GPU 上运行大型的 32B 参数量模型!

以下是在 4 比特模式下运行推理的办法:

from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
import torch

model_id = "codellama/CodeLlama-34b-hf"
quantization_config = BitsAndBytesConfig(
   load_in_4bit=True,
   bnb_4bit_compute_dtype=torch.float16
)

tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=quantization_config,
    device_map="auto",
)

prompt = 'def remove_non_ascii(s: str) -> str:\n""" 'inputs = tokenizer(prompt, return_tensors="pt").to("cuda")

output = model.generate(inputs["input_ids"],
    max_new_tokens=200,
    do_sample=True,
    top_p=0.9,
    temperature=0.1,
)
output = output[0].to("cpu")
print(tokenizer.decode(output))

应用 TGI 和推理终端

TGI 是 Hugging Face 开发的生产级推理容器,可用于轻松部署大语言模型。它蕴含间断批处理、流式输入、基于张量并行的多 GPU 疾速推理以及生产级的日志记录和跟踪等性能。

你能够在本人的基础设施上应用 TGI,也能够应用 Hugging Face 的 推理终端。要部署 Codellama 2 模型,请登陆其 模型页面,而后单击 Deploy -> Inference Endpoints 按钮。

  • 推理 7B 模型,咱们倡议抉择“GPU [medium] – 1x Nvidia A10G”。
  • 推理 13B 模型,咱们倡议抉择“GPU [xlarge] – 1x Nvidia A100”。
  • 推理 34B 模型,咱们倡议启用 bitsandbytes 量化并抉择“GPU [1xlarge] – 1x Nvidia A100”或“GPU [2xlarge] – 2x Nvidia A100”

留神: 你可能须要发邮件给 api-enterprise@huggingface.co 申请配额降级能力拜访 A100

你能够在咱们的博文中具体理解如何 应用 Hugging Face 推理终端部署 LLM,该 博文 还蕴含了无关其反对的超参以及如何应用 Python 和 Javascript API 流式生成文本的相干常识。

评估

代码语言模型通常在 HumanEval 等数据集上进行基准测试,其蕴含了一系列编程题,咱们将函数签名和文档字符串输出给模型,模型须要实现函数体代码的编写。接着是运行一组预约义的单元测试来验证所提出的解答。最初是报告通过率,即有多少解答通过了所有测试。pass@1 度量了模型一次生成即通过的频率,而 pass@10 形容了模型生成 10 个候选解答其中至多有一个解答通过的频率。

尽管 HumanEval 是一个 Python 基准测试,但社区付出了微小致力将其转成更多编程语言,从而实现更全面的评估。其中一种办法是 MultiPL-E,它将 HumanEval 翻译成十多种编程语言。咱们正在基于其制作一个 多语言代码排行榜,这样社区就能够用它来比拟不同模型在各种编程语言上的体现,以评估哪个模型最适宜他们的需要。

模型 许可证 训练数据集是否已知 是否可商用 预训练词元数 Python JavaScript Leaderboard Avg Score
CodeLlaMa-34B Llama 2 license 2,500B 45.11 41.66 33.89
CodeLlaMa-13B Llama 2 license 2,500B 35.07 38.26 28.35
CodeLlaMa-7B Llama 2 license 2,500B 29.98 31.8 24.36
CodeLlaMa-34B-Python Llama 2 license 2,620B 53.29 44.72 33.87
CodeLlaMa-13B-Python Llama 2 license 2,620B 42.89 40.66 28.67
CodeLlaMa-7B-Python Llama 2 license 2,620B 40.48 36.34 23.5
CodeLlaMa-34B-Instruct Llama 2 license 2,620B 50.79 45.85 35.09
CodeLlaMa-13B-Instruct Llama 2 license 2,620B 50.6 40.91 31.29
CodeLlaMa-7B-Instruct Llama 2 license 2,620B 45.65 33.11 26.45
StarCoder-15B BigCode-OpenRail-M 1,035B 33.57 30.79 22.74
StarCoderBase-15B BigCode-OpenRail-M 1,000B 30.35 31.7 22.4
WizardCoder-15B BigCode-OpenRail-M 1,035B 58.12 41.91 32.07
OctoCoder-15B BigCode-OpenRail-M 1,000B 45.3 32.8 24.01
CodeGeeX-2-6B CodeGeeX License 2,000B 33.49 29.9 21.23
CodeGen-2.5-7B-Mono Apache-2.0 1400B 45.65 23.22 12.1
CodeGen-2.5-7B-Multi Apache-2.0 1400B 28.7 26.27 20.04

留神: 上表中的分数来自咱们的代码排行榜,所有模型均应用雷同的设置。欲了解更多详情,请参阅 排行榜。

其余资源

  • Hub 上的模型
  • 论文
  • Meta 官宣博文
  • 负责任使用指南
  • 演示 (代码补全,流式生成)
  • 演示 (指令微调、自含、可复制到本人的空间并批改)

英文原文: https://hf.co/blog/codellama

原文作者: Philipp Schmid,Omar Sanseviero,Pedro Cuenca,Lewis Tunstall,Leandro von Werra,Loubna Ben Allal,Arthur Zucker,Joao Gante

译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的利用及大规模模型的训练推理。

审校 / 排版: zhongdongy (阿东)

正文完
 0