今天,我们很高兴开源“强大”、“多样”、“实用”的Qwen2.5-Coder系列(原CodeQwen1.5),致力于不断推动Open CodeLLM的发展。
功能强大:Qwen2.5-Coder-32B-Instruct已成为当前SOTA开源代码模型,匹配GPT-4o的编码能力。在展现出强大而全面的编码能力的同时,还具备良好的综合能力和数学能力;
多样化:在之前开源的 1.5B / 7B 两种尺寸的基础上,本次发布带来了 0.5B / 3B / 14B / 32B 等四种模型尺寸。截至目前,Qwen2.5-Coder已覆盖六种主流模型尺寸,满足不同开发者的需求;
?实用性:我们探讨了Qwen2.5-Coder在代码助手和Artifacts两个场景中的实用性,并通过一些示例展示了Qwen2.5-Coder在现实场景中的潜在应用;
支持长上下文理解和生成,上下文长度为128K token;
支持92种编码语言;
['ada', 'agda', 'alloy', 'antlr', 'applescript', 'assembly', 'augeas', 'awk', 'batchfile', 'bluespec', 'c', 'c#', 'c++', 'clojure', 'cmake', 'coffeescript', 'common-lisp', 'css', 'cuda', 'dart', 'dockerfile', 'elixir', 'elm', 'emacs-lisp', 'erlang', 'f#', 'fortran', 'glsl', 'go', 'groovy', 'haskell', 'html', 'idris', 'isabelle', 'java', 'java-server-pages', 'javascript', 'json', 'julia', 'jupyter-notebook', 'kotlin', 'lean', 'literate-agda', 'literate-coffeescript', 'literate-haskell', 'lua', 'makefile', 'maple', 'markdown', 'mathematica', 'matlab', 'objectc++', 'ocaml', 'pascal', 'perl', 'php', 'powershell', 'prolog', 'protocol-buffer', 'python', 'r', 'racket', 'restructuredtext', 'rmarkdown', 'ruby', 'rust', 'sas', 'scala', 'scheme', 'shell', 'smalltalk', 'solidity', 'sparql', 'sql', 'stan', 'standard-ml', 'stata', 'swift', 'systemverilog', 'tcl', 'tcsh', 'tex', 'thrift', 'typescript', 'verilog', 'vhdl', 'visual-basic', 'vue', 'xslt', 'yacc', 'yaml', 'zig']
保留基础模型的数学优势和一般能力
重要的
我们更新了特殊令牌及其相应的令牌 ID,以保持与 Qwen2.5 的一致性。新的特殊令牌如下:
{“<|fim_prefix|>”:151659, “<|fim_middle|>”:151660, “<|fim_suffix|>”:151661, “<|fim_pad|>”:151662, “<|repo_name|>”:151663, “<|文件间隔|>”:151664, “<|im_start|>”:151644, “<|im_end|>”:151645}
型号名称 | 类型 | 长度 | 下载 |
---|---|---|---|
Qwen2.5-Coder-0.5B | 根据 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-1.5B | 根据 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-3B | 根据 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-7B | 根据 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-14B | 根据 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-32B | 根据 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-0.5B-指令 | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-1.5B-指令 | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-3B-指令 | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-7B-指令 | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-14B-指令 | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-32B-指令 | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-0.5B-指令-AWQ | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-0.5B-指令-GGUF | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-0.5B-指令-GPTQ-Int4 | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-0.5B-指令-GPTQ-Int8 | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-1.5B-指令-AWQ | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-1.5B-指令-GGUF | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-1.5B-指令-GPTQ-Int4 | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-1.5B-指令-GPTQ-Int8 | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-3B-指令-AWQ | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-3B-指令-GGUF | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-3B-指令-GPTQ-Int4 | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-3B-指令-GPTQ-Int8 | 指示 | 32k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-7B-指令-AWQ | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-7B-指令-GGUF | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-7B-指令-GPTQ-Int4 | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-7B-指令-GPTQ-Int8 | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-14B-指令-AWQ | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-14B-指令-GGUF | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-14B-指令-GPTQ-Int4 | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-14B-指令-GPTQ-Int8 | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-32B-指令-AWQ | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-32B-指令-GGUF | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-32B-指令-GPTQ-Int4 | 指示 | 128k | 拥抱脸部 • ModelScope |
Qwen2.5-Coder-32B-指令-GPTQ-Int8 | 指示 | 128k | 拥抱脸部 • ModelScope |
详细的性能和介绍见此?博客。
python>=3.9
对于 Qwen2.5 密集模型, transformers>4.37.0
。
警告
这是必须的,因为“变形金刚”从“4.37.0”开始集成了 Qwen2 代码。
您可以使用以下命令安装所需的软件包:
pip install -r 要求.txt
重要的
Qwen2.5-Coder-[0.5-32]B-Instrcut是聊天的指令模型;
Qwen2.5-Coder-[0.5-32]B是通常用于完成的基本模型,作为微调的更好起点。
您只需使用transformers
编写几行代码即可与 Qwen2.5-Coder-32B-Instruct 聊天。本质上,我们使用from_pretrained
方法构建分词器和模型,并使用生成方法在分词器提供的聊天模板的帮助下执行聊天。以下是如何与 Qwen2.5-Coder-32B-Instruct 聊天的示例:
来自变压器导入 AutoModelForCausalLM, AutoTokenizermodel_name = "Qwen/Qwen2.5-Coder-32B-Instruct"model = AutoModelForCausalLM.from_pretrained(model_name,torch_dtype="auto",device_map="auto")tokenizer = AutoTokenizer.from_pretrained(model_name)prompt = “编写一个快速排序算法。”messages = [ {"role": "system", "content": "你是Qwen,阿里云打造,你是得力助手。"}, {“角色”:“用户”,“内容”:提示} ]text = tokenizer.apply_chat_template(messages,tokenize=False,add_ Generation_prompt=True)model_inputs = tokenizer([text], return_tensors="pt").to(model.device) generated_ids = model.generate(**model_inputs,max_new_tokens= [512] 512) 生成的_ids = [output_ids[len(input_ids):] zip(model_inputs.input_ids, generated_ids) ]response = tokenizer.batch_decode( generated_ids,skip_special_tokens=True)[0]
apply_chat_template()
函数用于将消息转换为模型可以理解的格式。 add_generation_prompt
参数用于添加生成提示,它引用输入的<|im_start|>assistantn
。值得注意的是,我们按照之前的做法将 ChatML 模板应用于聊天模型。 max_new_tokens
参数用于设置响应的最大长度。 tokenizer.batch_decode()
函数用于解码响应。在输入方面,以上消息是一个示例,展示了如何格式化对话历史记录和系统提示。您可以以同样的方式使用其他尺寸的指令模型。
模型根据给定的提示完成代码片段,无需任何额外的格式化,这在代码生成任务中通常称为code completion
。
本质上,我们使用from_pretrained
方法构建分词器和模型,并使用生成方法来执行代码完成。以下是如何与 Qwen2.5-Coder-32B 聊天的示例:
from Transformers import AutoTokenizer, AutoModelForCausalLMdevice = "cuda" # 加载模型的设备# 现在你不需要添加 "trust_remote_code=True"TOKENIZER = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")MODEL = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-Coder-32B", device_map="auto").eval()# 将输入标记为 tokensinput_text = "#编写快速排序算法"model_inputs = TOKENIZER([input_text], return_tensors="pt").to(device)# 使用 `max_new_tokens` 来控制最大输出长度. generated_ids = MODEL.generate(model_inputs.input_ids, max_new_tokens=512, do_sample=False)[0]# generated_ids包含prompt_ids,所以我们只需要解码prompt_ids.output_text = TOKENIZER.decode( generated_ids[len(model_inputs.input_ids[0]):],skip_special_tokens=True)print( f"提示:{input_text}nn生成的文本:{output_text}")
max_new_tokens
参数用于设置响应的最大长度。 input_text
可以是您希望模型继续使用的任何文本。
当前config.json
设置的上下文长度最多为 32,768 个令牌。为了处理超过 32,768 个标记的大量输入,我们利用 YaRN,这是一种增强模型长度外推的技术,确保在长文本上获得最佳性能。
对于支持的框架,您可以将以下内容添加到config.json
以启用 YaRN:
{ ..., "rope_scaling": {"factor": 4.0,"original_max_position_embeddings": 32768,"type": "yarn" } }
代码插入任务,也称为“中间填充”挑战,需要以桥接给定代码上下文内的间隙的方式插入代码段。对于符合最佳实践的方法,我们建议遵循论文“高效训练语言模型以填充中间”[arxiv]中概述的格式指南。这涉及使用三个专用标记
、
和
来表示代码结构的各个段。提示的结构应如下所示:
提示 = '<|fim_prefix|>' + prefix_code + '<|fim_suffix|>' + suffix_code + '<|fim_middle|>'
按照提到的方法,示例将以这种方式构建:
from Transformers import AutoTokenizer, AutoModelForCausalLM# load modeldevice = "cuda" # 将模型加载到的设备TOKENIZER = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")MODEL = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5 -Coder-32B", device_map="auto").eval()input_text = """<|fim_prefix|>def fastsort(arr): if len(arr) <= 1: return arr hub = arr[len(arr) // 2] <|fim_suffix|> middle = [x for x in arr如果 x == 枢轴] 右 = [x for x in arr if x > 枢轴] 返回快速排序(左)+ 中间 + 快速排序(右)<|fim_middle|>"""model_inputs = TOKENIZER([input_text], return_tensors="pt").to(device)# 使用 `max_new_tokens` 控制最大输出长度 generated_ids = MODEL.generate(model_inputs.input_ids, max_new_tokens=512, do_sample=False)[0 ]# generated_ids包含prompt_ids,我们只需要在prompt_ids.output_text =之后解码token即可TOKENIZER.decode( generated_ids[len(model_inputs.input_ids[0]):],skip_special_tokens=True)print(f"提示:{input_text}nn生成的文本:{output_text}")
存储库级别代码完成任务涉及向模型提供来自同一存储库的多个文件的内容。这使得模型能够理解这些文件内不同调用之间的相互关系,从而有利于代码内容的完成。我们建议使用两个特殊标记<|repo_name|>
和<|file_sep|>
来指示存储库结构。例如,假设存储库名称存储在repo_name
中,并且它包含各自路径和内容列为 [( file_path1
, file_content1
), ( file_path2
, file_content2
)] 的文件,则最终输入提示的格式将如下所示:
input_text = f'''<|repo_name|>{repo_name}<|file_sep|>{file_path1} {file_content1}<|file_sep|>{file_path2} {file_content2}'''
from Transformers import AutoTokenizer, AutoModelForCausalLMdevice = "cuda" # 加载模型的设备# 现在你不需要添加 "trust_remote_code=True"TOKENIZER = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")MODEL = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-Coder-32B", device_map="auto").eval()# 将输入标记为 tokensinput_text = """<|repo_name|>library-system<|file_sep|>library.pyclass Book: def __init__(self, title,author, isbn, Copys ): self.title = 标题 self.author = 作者 self.isbn = isbn self.copies = 副本 def __str__(self): return f"Title: {self.title},作者:{self.author},ISBN:{self.isbn},份数:{self.copies}”类库:def __init__(self): self.books = [] def add_book(self, title,author, isbn,副本):书=书(标题,作者,isbn,副本)self.books.append(书)def find_book(self,isbn):对于self.books中的书:如果book.isbn == isbn:返回书return None def list_books(self): return self.books<|file_sep|>student.pyclass 学生: def __init__(self, name, id): self.name = name self.id = id self.borrowed_books = [] defborrowed_book (self、book、library):如果 book 且 book.copies > 0: self.borrowed_books.append(book) book.copies -= 1 返回 True 返回 False def return_book(self, book, library): if book in self.borrowed_books: self.borrowed_books.remove(book) book.copies += 1 return True return False<|file_sep|>main.pyfrom library import Libraryfrom Student import Studentdef main (): # 设置包含一些书籍的图书馆library = Library()library.add_book("了不起的盖茨比", "F. Scott Fitzgerald", "1234567890", 3) library.add_book("杀死一只知更鸟", "Harper Lee", "1234567891", 2) # 设置一个学生 Student = Student("Alice", "S1") #学生借书"""model_inputs = TOKENIZER([input_text], return_tensors="pt").to(device)# 使用 `max_new_tokens` 控制最大输出长度 generated_ids = MODEL.generate(model_inputs.input_ids, max_new_tokens=1024, do_sample=False)[0]# generated_ids 包括prompt_ids,所以我们只需要在prompt_ids.output_text =之后解码令牌TOKENIZER.decode( generated_ids[len(model_inputs.input_ids[0]):],skip_special_tokens=True)print(f"提示:n{input_text}nn生成文本:n{output_text}")
预期输出如下:
生成文本:book = library.find_book("1234567890")if Student.borrow_book(book, library):print(f"{student.name}借了{book.title}")else:print(f"{student.name) } 无法借阅 {book.title}") # 学生归还一本书if Student.return_book(book, library):print(f"{student.name} returned {book.title}")else:print(f"{student.name} 无法返回 {book.title}") # 列出图书馆中的所有图书print("图书馆中的所有图书:")for 图书馆中的图书。 list_books():print(book)if __name__ == "__main__":main()
作为Qwen2.5家族的成员,Qwen2.5-Coder得到vLLM的支持。详细教程可以参见Qwen教程。在这里,我们为您提供一个 vLLM 中离线批量推理的简单示例。
from Transformers import AutoTokenizerfrom vllm import LLM, SamplingParams# 初始化 tokenizertokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")# 传递 Qwen1.5-32B-Chat 的默认解码超参数# max_tokens 为最大值Generation.sampling_params = SamplingParams(温度=0.7, top_p=0.8,repetition_penalty=1.05,max_tokens=1024)#输入模型名称或路径。可以是 GPTQ 或 AWQ models.llm = LLM(model="Qwen/Qwen2.5-Coder-32B")# 准备提示prompt = "#编写快速排序算法.ndef fast_sort("# 生成输出outputs = llm.generate( [prompt], Sample_params)# 打印Outputs.for 输出中的Outputs:prompt = output.prompt generated_text = output.outputs[0].textprint(f"提示:{prompt!r},生成的文本:{ generated_text!r}")
为了扩大服务吞吐量,分布式服务可以利用更多 GPU 设备来帮助您。当使用超长序列进行推理时,可能会导致GPU内存不足。在这里,我们演示如何仅通过传入参数tensor_parallel_size
来运行具有张量并行性的 Qwen2.5-Coder-32B 。
llm = LLM(模型=“Qwen/Qwen2.5-Coder-32B”,tensor_parallel_size=8)
我们还提供了 Gradio 界面以获得更好的体验,只需运行:
cd demo/chatbot/# 对于 Linux 和 Windows 用户(以及带有 Intel 的 macOS??)python app.py # 对于使用 Apple Silicon 的 macOS 用户,不支持 Intel,这可能比 RTX 4090PYTORCH_ENABLE_MPS_FALLBACK=1 python app.py 慢 20 倍
我们还提供了artifacts模式的Gradio接口:
cd 演示/工件/ 蟒蛇应用程序.py
您可以指定--server_port
、 --share
、 --server_name
参数来满足您的需求!
或者,在 HuggingFace 上轻松尝试一下:「聊天机器人演示」? 「文物演示」
更多信息请参阅Qwen2.5-Coder技术报告。
如果您发现我们的工作有帮助,请随时给我们一个引用。
@文章{hui2024qwen2,标题={Qwen2. 5-Coder技术报告},作者={Hui、Binyuan和Yang、Jian和Cui、Zeyu和Yang、Jiaxi和Liu、Dayiheng和Zhang、Lei和Liu、Tianyu和Zhang、Jiajun和Yu、Bowen和Dang、Kai和其他},期刊={arXiv预印本arXiv:2409.12186},年份={2024}}@article{qwen2,title={Qwen2技术报告},作者={杨安、杨宝松、惠斌源、郑博、余博文、周常、李成鹏、李成远、刘大一恒、黄飞、董冠廷、魏浩然、林焕、唐家龙、王家林杨健、屠建红、张建伟、马建新、徐金、周景仁、白金泽、何金正、林俊阳、党凯、卢克明、陈克勤、杨可新、梅李、薛明峰、倪娜、张培、王鹏、彭如、门锐、高瑞泽、林润吉、王世杰、白帅、谭思南、朱天行、李天浩、刘天宇、葛文斌、邓晓东、周晓欢、任兴章、张新宇、魏西平、任宣成、杨帆、杨耀、张宜昌、万宇、褚云飞、刘玉琼、崔泽宇、张真如和范志豪},journal={arXiv 预印本 arXiv:2407.10671},year={2024}}
如果您有兴趣给我们的研究团队或产品团队留言,请加入我们的Discord或微信群!
↑ 返回顶部 ↑