民工心事 发表于 2024-7-31 00:23:08

Code Llama利用手册

Code Llama 是 Llama 2 的一系列开始辈的开放访问版本,专门用于代码任务,我们很高兴发布与 Hugging Face 生态系统的集成! Code Llama 已利用与 Llama 2 相同的宽松社区允许证发布,并且可用于贸易用途。
今天,我们很高兴发布:


[*]Hub 上的模子及其模子卡和允许证
[*]Transformer集成
[*]与文本天生推理集成,以实现快速高效的生产就绪推理
[*]与推理端点集成
[*]代码基准测试
代码大模子对软件工程师来说是一项令人高兴的发展,因为他们可以通过 IDE 中的代码完成来提高生产力,处理重复或烦人的任务,例如编写文档字符串或创建单元测试。
1、什么是Code Llama?

Code Llama 版本引入了一系列包含 7、13 和 340 亿个参数的模子。 基础模子从 Llama 2 初始化,然后在 5000 亿个代码数据上进行练习。 Meta 对这些基本模子进行了两种差别风格的微调:Python 专家(1000 亿个额外令牌)和指令微调版本,可以明白自然语言指令。
这些模子在 Python、C++、Java、PHP、C#、TypeScript 和 Bash 中展示了开始辈的性能。 7B 和 13B 基本和指令变体支持基于周围内容的填充,使它们非常适合用作代码助手。
Code Llama 在 16k 上下文窗口上进行练习。 此外,这三个模子变体还进行了额外的长上下文微调,使它们能够管理最多 100,000 个令牌的上下文窗口。
由于 RoPE 扩展的最新发展,将 Llama 2 的 4k 上下文窗口增加到 Code Llama 的 16k(可以推断到 100k)是大概的。 社区发现 Llama 的位置嵌入可以线性插值或在频域中插值,这可以通过微调轻松过渡到更大的上下文窗口。 在 Code Llama 的环境下,频域缩放是通过松弛完成的:微调长度是缩放的预练习长度的一小部门,从而使模子具有强盛的外推本事。

https://img-blog.csdnimg.cn/img_convert/7e8c0a06da155d790b1813e21d261037.png
全部模子最初都是在公开可用代码的近乎重复数据删除的数据集上利用 5000 亿个令牌进行练习。 该数据集还包含一些自然语言数据集,例如有关代码和代码片断的讨论。 不幸的是,没有有关该数据集的更多信息。
对于指令模子,他们利用了两个数据集:为 Llama 2 Chat 网络的指令调整数据集和自指令数据集。 自指导数据集是通过利用 Llama 2 创建面试编程标题,然后利用 Code Llama 天生单元测试和办理方案,然后通过执行测试来评估的。
2、如何利用Code Llama?

从 Transformers 4.33 版本开始,Code Llama 已在 Hugging Face 生态系统中可用。 在 Transformers 4.33 发布之前,请从主分支安装它。
可以在此空间轻松尝试 Code Llama 模子(130 亿个参数!):

https://img-blog.csdnimg.cn/img_convert/39a6686fb0f38ac785e5a16b0f4afe0c.png
3、Transformers

随着即将发布的 Transformers 4.33,你可以利用 Code Llama 并利用 HF 生态系统中的全部工具,例如:


[*]练习和推理脚本和示例
[*]安全文件格式(safetensors)
[*]与bitsandbytes(4位量化)和PEFT(参数高效微调)等工具集成
[*]利用模子运行天生的实用程序和助手
[*]导出模子以进行摆设的机制
在 Transformers 4.33 发布之前,请从主分支安装它。
!pip install git+https://github.com/huggingface/transformers.git@main accelerate
表明
4、代码完成

7B 和 13B 模子可用于文本/代码补全或填充。 以下代码片断利用管道接口来演示文本完成。 只要你选择 GPU 运行时,它就可以在 Colab 的免费层上运行。
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 专门研究代码明白,但它本身就是一种语言模子。 你可以利用相同的天生计谋来自动完成注释或一般文本。
5、代码填充

这是特定于代码模子的专门任务。 该模子经过练习,可以天生与现有前缀和后缀最匹配的代码(包括注释)。 这是代码助理通常利用的计谋:要求他们填充当前光标位置,并思量其前后出现的内容。
此任务在 7B 和 13B 型号的基本版本和指令版本中可用。 它不实用于任何 34B 型号或 Python 版本。
要乐成利用此功能,你必要密切注意用于练习此任务模子的格式,因为它利用特殊的分隔符来辨认提示的差别部门。 让我们看一个例子:
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") prefix = 'def remove_non_ascii(s: str) -> str:\n """ ' suffix = "\n return result\n" prompt = f"<PRE> {prefix} <SUF>{suffix} <MID>" inputs = tokenizer(prompt, return_tensors="pt").to("cuda") output = model.generate( inputs["input_ids"], max_new_tokens=200, do_sample=False, ) output = output.to("cpu") print(tokenizer.decode(output))
表明
<s> <PRE> def remove_non_ascii(s: str) -> str: """ <SUF> return result <MID> Remove non-ASCII characters from a string. :param s: The string to remove non-ASCII characters from. :return: The string with non-ASCII characters removed. """ result = "" for c in s: if ord(c) < 128: result += c <EOT></s>
表明
为了利用补全功能,你必要处理输出以剪切 <MID>  和 <EOT> 标记之间的文本 - 这就是我们提供的前缀和后缀之间的内容。
6、对话指令

如上所述,基础模子可用于完成和填充。 Code Llama 版本还包括一个可在对话界面中利用的指令微调模子。
为了准备此任务的输入,我们必须利用一个提示模板,就像我们的 Llama 2 博客文章中描述的那样,我们在这里再次复制该模板:
<s> <<SYS>> {{ system_prompt }} <</SYS>> {{ user_msg_1 }} {{ model_answer_1 }} </s><s> {{ user_msg_2 }}
表明
请注意,系统提示是可选的 - 模子在没有它的环境下也可以工作,但可以利用它来进一步配置其行为或样式。 例如,如果你总是希望获得 JavaScript 中的答案,可以在此处声明。 系统提示后,你必要提供对话中之前的全部交互:用户扣问什么以及模子回答什么。 与填充环境一样,必要注意利用的分隔符。 输入的最终构成部门必须始终是新的用户指令,这将是模子提供答案的信号。
以下代码片断演示了该模板在实践中的工作原理。


[*]首次用户查询,系统无提示
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> {user.strip()} " inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")
表明


[*]系统提示的首次用户查询:
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")
表明


[*]与先前答案的持续对话
该过程与 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> {prompt.strip()} {answer_1.strip()} </s>" prompt += f"<s> {user_2.strip()} {answer_2.strip()} </s>" prompt += f"<s> {user_3.strip()} " inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")
表明
7、4位加载

将 Code Llama 集成到 Transformers 中意味着你可以立刻获得对 4 位加载等高级功能的支持。 这使你可以在 nvidia 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.to("cpu") print(tokenizer.decode(output))
表明
8、利用文本天生推理和推理端点

文本天生推理是 Hugging Face 开发的生产就绪推理容器,可轻松摆设大型语言模子。 它具有一连批处理、令牌流、用于在多个 GPU 上快速推理的张量并行性以及生产就绪的日志记载和跟踪等功能。
你可以在本身的基础设施上尝试文本天生推理,也可以利用 Hugging Face 的推理端点。 要摆设 Code llama 2 模子,请转到模子页面并单击摆设 -> 推理端点小部件。


[*]对于 7B 模子,我们建议你选择“GPU [中] - 1x Nvidia A10G”。
[*]对于 13B 模子,我们建议你选择“GPU - 1x Nvidia A100”。
[*]对于 34B 模子,我们建议你选择启用了位和字节量化的“GPU - 1x Nvidia A100”或“GPU - 2x Nvidia A100”
注意:你大概必要通过电子邮件哀求配额升级才气访问 A100
你可以在我们的博客中了解有关如何利用 Hugging Face Inference Endpoints 摆设 LLM 的更多信息。 该博客包含有关支持的超参数以及如何利用 Python 和 Javascript 流式传输响应的信息。
9、评估

代码语言模子通常在 HumanEval 等数据集上进行基准测试。 它由编程挑战构成,其中模子带有函数签名和文档字符串,并负责完成函数体。 然后通过运行一组预界说的单元测试来验证所提出的办理方案。 最后,报告通过率,描述有多少办理方案通过了全部测试。 pass@1 率描述了模子在一次尝试时天生通过办理方案的频率,而 pass@10 描述了从 10 个发起的候选方案中至少有一个办理方案通过的频率。
固然 HumanEval 是一个 Python 基准测试,但我们已经付出了巨大努力将其转换为更多编程语言,从而实现更全面的评估。 其中一种方法是 MultiPL-E,它将 HumanEval 翻译成十多种语言。 我们正在基于它托管一个多语言代码排行榜,以便社区可以比力差别语言的模子,以评估哪种模子最适合他们的用例。
模子允许数据集已知贸易用途?预练习长度 PythonJavaScript排行榜平均分数CodeLlaMa-34BLlama 2允许证❌✅2,500B45.1141.6633.89CodeLlaMa-13BLlama 2允许证❌✅2,500B35.0738.2628.35CodeLlaMa-7BLlama 2允许证❌✅2,500B29.9831.824.36CodeLlaMa-34B-PythonLlama 2允许证❌✅2,620B53.2944.7233.87CodeLlaMa-13B-PythonLlama 2允许证❌✅2,620B42.8940.6628.67CodeLlaMa-7B-PythonLlama 2允许证❌✅2,620B40.4836.3423.5CodeLlaMa-34B-InstructLlama 2允许证❌✅2,620B50.7945.8535.09CodeLlaMa-13B-InstructLlama 2允许证❌✅2,620B50.640.9131.29CodeLlaMa-7B-InstructLlama 2允许证❌✅2,620B45.6533.1126.45StarCoder-15BBigCode-OpenRail-M✅✅1,035B33.5730.7922.74StarCoderBase-15BBigCode-OpenRail-M✅✅1,000B30.3531.722.4WizardCoder-15BBigCode-OpenRail-M❌✅1,035B58.1241.9132.07OctoCoder-15BBigCode-OpenRail-M✅✅1,000B45.332.824.01CodeGeeX-2-6BCodeGeeX允许证❌❌2,000B33.4929.921.23CodeGen-2.5-7B-MonoApache-2.0✅✅1400B45.6523.2212.1CodeGen-2.5-7B-MultiApache-2.0✅✅1400B28.726.2720.04 注意:上表中显示的分数来自我们的代码排行榜,我们在其中评估具有相同设置的全部模子。 更多详情请参阅排行榜。

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