오늘 우리는 Open CodeLLM의 개발을 지속적으로 촉진하는 데 전념하는 "강력한", "다양한" 및 "실용적인" Qwen2.5-Coder 시리즈(이전의 CodeQwen1.5)를 오픈 소스로 제공하게 된 것을 기쁘게 생각합니다.
강력함: Qwen2.5-Coder-32B-Instruct는 GPT-4o의 코딩 기능과 일치하는 현재 SOTA 오픈 소스 코드 모델이 되었습니다. 강력하고 포괄적인 코딩 능력을 보여주는 동시에 우수한 일반 및 수학 능력도 보유하고 있습니다.
다양성: 이전에 오픈 소스로 제공되었던 두 가지 크기인 1.5B/7B를 기반으로 구축된 이번 릴리스에서는 0.5B/3B/14B/32B를 포함한 네 가지 모델 크기를 제공합니다. 현재 Qwen2.5-Coder는 다양한 개발자의 요구 사항을 충족하기 위해 6가지 주류 모델 크기를 다루고 있습니다.
? 실용성: 실제 시나리오에서 Qwen2.5-Coder의 잠재적 응용 프로그램을 보여주는 몇 가지 예를 통해 코드 도우미 및 아티팩트를 포함한 두 가지 시나리오에서 Qwen2.5-Coder의 실용성을 탐구합니다.
128K 토큰의 컨텍스트 길이로 긴 컨텍스트 이해 및 생성을 지원합니다.
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']
기본 모델에서 수학 및 일반 기능의 강점을 유지합니다.
중요한
Qwen2.5와의 일관성을 유지하기 위해 특수 토큰과 해당 토큰 ID를 모두 업데이트합니다. 새로운 특수 토큰은 다음과 같습니다:
{ "<|fim_prefix|>": 151659, "<|fim_middle|>": 151660, "<|fim_suffix|>": 151661, "<|fim_pad|>": 151662, "<|repo_name|>": 151663, "<|file_sep|>": 151664, "<|im_start|>": 151644, "<|im_end|>": 151645}
모델명 | 유형 | 길이 | 다운로드 |
---|---|---|---|
Qwen2.5-Coder-0.5B | 베이스 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-1.5B | 베이스 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-3B | 베이스 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-7B | 베이스 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-14B | 베이스 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-32B | 베이스 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-0.5B-지시 | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-1.5B-지시 | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-3B-지시 | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-7B-지시 | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-14B-지시 | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-32B-명령 | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-AWQ | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GGUF | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GPTQ-Int4 | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GPTQ-Int8 | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-AWQ | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GGUF | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GPTQ-Int4 | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GPTQ-Int8 | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-3B-Instruct-AWQ | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-3B-Instruct-GGUF | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-3B-Instruct-GPTQ-Int4 | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-3B-Instruct-GPTQ-Int8 | 지시하다 | 32,000 | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-7B-Instruct-AWQ | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-7B-Instruct-GGUF | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-7B-Instruct-GPTQ-Int4 | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-7B-Instruct-GPTQ-Int8 | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-14B-Instruct-AWQ | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-14B-Instruct-GGUF | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-14B-Instruct-GPTQ-Int4 | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-14B-Instruct-GPTQ-Int8 | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-32B-Instruct-AWQ | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-32B-Instruct-GGUF | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-32B-Instruct-GPTQ-Int4 | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
Qwen2.5-Coder-32B-Instruct-GPTQ-Int8 | 지시하다 | 128k | 포옹하는 얼굴 • ModelScope |
자세한 성능과 소개는 여기에 나와 있습니다. 블로그.
python>=3.9
Qwen2.5 밀집 모델의 경우 transformers>4.37.0
.
경고
'트랜스포머'는 '4.37.0'부터 Qwen2 코드를 통합했기 때문에 필수입니다.
다음 명령을 사용하여 필수 패키지를 설치할 수 있습니다.
pip 설치 -r 요구사항.txt
중요한
Qwen2.5-Coder-[0.5-32]B-Instrcut은 채팅을 위한 명령 모델입니다.
Qwen2.5-Coder-[0.5-32]B 는 일반적으로 완성에 사용되는 기본 모델로, 미세 조정을 위한 더 나은 시작점 역할을 합니다.
Qwen2.5-Coder-32B-Instruct와 채팅하기 위해 transformers
사용하여 여러 줄의 코드를 작성할 수 있습니다. 기본적으로 from_pretrained
메소드를 사용하여 토크나이저와 모델을 구축하고, 토크나이저에서 제공하는 채팅 템플릿의 도움으로 생성 메소드를 사용하여 채팅을 수행합니다. 다음은 Qwen2.5-Coder-32B-Instruct와 채팅하는 방법의 예입니다.
Transformers import 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": "당신은 Alibaba Cloud에서 만든 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)generated_ids = [output_ids[len(input_ids):] for zip(model_inputs.input_ids, generate_ids)의 input_ids, output_ids ]응답 = 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()# 입력을 토큰으로 토큰화합니다.input_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]# 생성된_id에는 프롬프트_ID가 포함되어 있으므로 프롬프트_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" } }
"중간 채우기" 과제라고도 하는 코드 삽입 작업에서는 주어진 코드 컨텍스트 내의 간격을 메우는 방식으로 코드 세그먼트를 삽입해야 합니다. 모범 사례에 부합하는 접근 방식을 위해서는 "Efficient Training of Language Models to Fill in the Middle"[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 -코더-32B", device_map="auto").eval()input_text = """<|fim_prefix|>defquicksort(arr): if len(arr) <= 1: return arr 피벗 = arr[len(arr) // 2] < |fim_suffix|> middle = [x for x in arr if x == 피벗] right = [x for x in arr if x > 피벗] returnquicksort(left) + middle + quicksort(right)<|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]# 생성된_ids에는 프롬프트_ID가 포함되어 있으므로 프롬프트_ids.output_text = TOKENIZER.decode(generated_ids[len(model_inputs.input_ids[0]):], Skip_special_tokens=True)print(f"프롬프트: {input_text}nn생성된 텍스트: 이후에만 토큰을 디코딩하면 됩니다. {출력_텍스트}")
리포지토리 수준 코드 완성 작업에는 동일한 리포지토리의 여러 파일 콘텐츠를 모델에 제공하는 작업이 포함됩니다. 이를 통해 모델은 이러한 파일 내의 다양한 호출 간의 상호 관계를 이해할 수 있으므로 코드 콘텐츠 완성이 쉬워집니다. 리포지토리 구조를 나타내기 위해 두 개의 특수 토큰 <|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 도서: def __init__(self, title, 작성자, isbn, 복사본): self.title = 제목 self.author = 작성자 self.isbn = isbn self.copies = 사본 def __str__(self): return f"제목: {self.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: 책 반환 반환 없음 def list_books(self): self.books 반환<|file_sep|> Student.pyclass 학생: def __init__(self, name, id): self.name = 이름 self.id = id self.borrowed_books = [] def rent_book(self, book, library): 책 및 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 = Library() library.add_book("The Great Gatsby", "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]# 생성된_id에는 프롬프트_ID가 포함됩니다. 따라서 프롬프트_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(도서, 도서관):print(f"{student.name} 빌린 {book.title}")else:print(f"{student.name } {book.title}을 빌릴 수 없습니다.") # 학생이 책을 반환합니다.if Student.return_book(book, library):print(f"{student.name} 반환됨 {book.title}")else:print(f"{student.name} could not return {book.title}") # 도서관에 있는 모든 책을 나열합니다.print("All books in the library:")for book in library. 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는 최대값입니다. 생성 길이.sampling_params = SamplingParams(온도=0.7, top_p=0.8, Repeat_penalty=1.05, max_tokens=1024)# 모델명이나 경로를 입력해주세요. GPTQ 또는 AWQ 모델일 수 있습니다.llm = LLM(model="Qwen/Qwen2.5-Coder-32B")# 프롬프트 준비sprompt = "#빠른 정렬 알고리즘을 작성합니다.ndefquick_sort("# 생성 출력soutputs = llm.generate( [프롬프트], sampling_params)# 출력에 대한 출력을 인쇄합니다. 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 데모/chatbot/# Linux 및 Windows 사용자(그리고 Intel??을 사용하는 macOS)python app.py # Apple Silicon 사용자가 있는 macOS의 경우 Intel이 지원되지 않습니다. 이는 RTX 4090PYTORCH_ENABLE_MPS_FALLBACK=1보다 20배 느릴 수 있습니다. python app.py
또한 아티팩트 모드의 Gradio 인터페이스도 제공합니다.
CD 데모/아티팩트/ 파이썬 app.py
필요에 따라 --server_port
, --share
, --server_name
인수를 지정할 수 있습니다!
아니면 HuggingFace: 「챗봇 데모」에서 손쉽게 사용해 보세요. 「아티팩트 데모」
자세한 내용은 Qwen2.5-Coder 기술 보고서를 참조하세요.
우리 작업이 도움이 되었다고 생각하시면 언제든지 인용해 주세요.
@article{hui2024qwen2, title={Qwen2. 5-코더 기술 보고서}, 저자={Hui, Binyuan 및 Yang, Jian 및 Cui, Zeyu 및 Yang, Jiaxi 및 Liu, Dayiheng 및 Zhang, Lei 및 Liu, Tianyu 및 Zhang, Jiajun 및 Yu, Bowen 및 Dang, Kai 및 기타}, 저널={arXiv preprint arXiv:2409.12186}, year={2024}}@article{qwen2,title={Qwen2 기술 보고서},author={An Yang, Baosong Yang, Binyuan Hui, Bo Zheng, Bowen Yu, Chang Zhou, Chengpeng Li, Chengyuan Li, Dayiheng Liu, Fei Huang, Guanting Dong, Haoran Wei, Huan Lin, Jialong Tang, Jialin Wang, Jian Yang, Jianhong Tu, Jianwei Zhang 및 Jianxin Ma, Jin Xu, Jingren Zhou, Jinze Bai, Jinzheng He, Junyang Lin, Kai Dang, Keming Lu, Keqin Chen, Kexin Yang, Mei Li, Mingfeng Xue, Na Ni, Pei Zhang, Peng Wang, Ru Peng, Rui Men 그리고 Ruize Gao, Runji Lin, Shijie Wang, Shuai Bai, Sinan Tan, Tianhang Zhu, Tianhao Li, Tianyu Liu 그리고 Wenbin Ge, Xiaodong Deng, Xiaohuan Zhou, Xingzhang Ren, Xinyu Zhang, Xipin Wei, Xuancheng Ren, Yang Fan, Yang Yao, Yichang Zhang, Yu Wan, Yunfei Chu, Yuqiong Liu, Zeyu Cui, Zhenru Zhang, Zhihao Fan},저널 ={arXiv 사전 인쇄 arXiv:2407.10671},연도={2024}}
저희 연구 팀이나 제품 팀에 메시지를 남기고 싶으시면 Discord 또는 WeChat 그룹에 가입하세요!
↑ 맨 위로 돌아가기 ↑