今天,我們很高興開源「強大」、「多元」、「實用」的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 =p. 「寫一個快速排序演算法。」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 = models.genes**Fdel)_newmodels = modelmax. =第512章 512 章 ]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")ForDEL(TR321.D. "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 包含我們只需要在原始內容 =s. .decode( generated_ids[len(model_inputs.input_ids[0]):],skip_special_tokens=True)print(f"Prompt: {input_text}nnGenerate text: {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 = AutoModelForCapred. -Coder-32B", device_map="auto").eval()input_text = """<|fim_prefix|>def fastsort(arr): 如果len(arr) <= 1: 回傳arr 樞軸= arr[len( arr) ) // 2] <|fim_suffix|> middle = [x for x in arr if x == hub] right = [x for x in arr if x > hub] return 快速排序(左) + 中+ 快速排序(右)< |fim_middle|>"""model_inputs = TOKENIZER([input_text], return_tensors="pt").to(device)# 使用`max_new_tokens`控制最大輸出長度. generated_ids = MODEL.genemax_new_tokens`控制最大輸出長度. generated_ids = MODEL.generate(model_inputs.ininput_ids. max_new_tokens= 512, do_sample=False)[0]# generated_ids 包含prompt_ids,我們只需要解碼後的token 提示_ids.output_text = TOKENIZER.decode( generated_ids[len(model):00] )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")ForDEL(TR321.D. "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 = title self.author = 作者self.isbn = isbn self.copies = Copys def __strtle__(self): return f"Title: {self.title__(self): return f"Title:} ,作者:{self.author},ISBN:{self.isbn},份數:{self.copies}」類別庫:def __init__(self): self.books = [] def add_book(self,標題,作者, isbn,副本):book = Book(標題,作者,isbn,副本) self.books.append(book) def find_book(self,isbn):對於self.books 中的書: if 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.bor defrowed_bor_bor; (self, book, library): if book and book.copies > 0: self.borrowed_books.append(book) book.copies -= 1 return True return 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.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_inputs. , do_sample=False)[0]# generated_ids包含prompt_ids,所以我們只需要解碼prompt_ids.output_text = TOKENIZER.decode( generated_ids[len(model_inputs.input_ids[0]):ids[0]):. "提示: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 book in library.list_books():print(book)if __name__ == "__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_length for max_lem 最大值參數 的預設解碼超值參數 max_length for max_length for max_lea 的預設解碼。 Generation.sampling_params = SamplingParams(Temperature=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輸出:prompt = output.prompt generated_text = output.outputs[0].textprint(f"Prompt: {prompt!r}, generated text: { 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和其他},journal={arXiv 預印本arXiv:2409.12186},year={2024}}@article{qwen2,title={Qwen2 技術報告},作者={An Yang 和Baosong Yang 和Binyuan Hui 和 Cheng 和 Cheen Yu和周常、李成鵬、李成元、劉大一恆、黃飛、董冠廷、魏浩然、林煥、唐家龍、王家林、楊建、塗建紅、張建偉、馬建新、徐金、週景仁、白金澤何金正、林俊陽、黨凱、陸克明、陳克勤、楊可欣、李梅、薛明峰、倪娜、張培、王鵬、彭如、門銳、高瑞澤、林潤吉、王世傑、帥白、譚思南、朱天浩、李天浩、劉天宇、葛文斌、鄧曉東、周小歡、任興章、張新宇、魏西平、任宣成、範楊、姚洋、張宜昌、萬宇、螢雲飛、劉玉瓊、崔澤宇、張真如、范志豪},journal={arXiv 預印本arXiv:2407.10671,year ={2024}}
如果您有興趣給我們的研究團隊或產品團隊留言,請加入我們的Discord或微信群組!
↑ 返回頂部 ↑