Сегодня мы рады открыть исходный код серии 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 в двух сценариях, включая помощников по коду и артефакты, с некоторыми примерами, демонстрирующими потенциальное применение Qwen2.5-Coder в реальных сценариях;
Поддержка понимания и генерации длинного контекста с длиной контекста в 128 тыс. токенов;
Поддержка 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. Новые специальные жетоны следующие:
{ "<|fim_prefix|>": 151659, "<|fim_middle|>": 151660, "<|fim_suffix|>": 151661, "<|fim_pad|>": 151662, "<|имя_репо|>": 151663, "<|file_sep|>": 151664, "<|im_start|>": 151644, "<|im_end|>": 151645}
название модели | тип | длина | Скачать |
---|---|---|---|
Qwen2.5-Кодер-0.5B | база | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Кодер-1.5B | база | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Кодер-3B | база | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Кодер-7B | база | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Кодер-14B | база | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Кодер-32B | база | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-0.5B-инструкция | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-1.5B-инструкция | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-3B-инструкция | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-7B-инструкция | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-14B-инструкция | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-32B-инструкция | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-AWQ | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GGUF | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GPTQ-Int4 | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GPTQ-Int8 | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-AWQ | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GGUF | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GPTQ-Int4 | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GPTQ-Int8 | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-3B-Instruct-AWQ | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-3B-Instruct-GGUF | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-3B-Instruct-GPTQ-Int4 | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-3B-Instruct-GPTQ-Int8 | инструктировать | 32 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-7B-Instruct-AWQ | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-7B-Instruct-GGUF | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-7B-Instruct-GPTQ-Int4 | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-7B-Instruct-GPTQ-Int8 | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-14B-Instruct-AWQ | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-14B-Instruct-GGUF | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-14B-Instruct-GPTQ-Int4 | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-14B-Instruct-GPTQ-Int8 | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-32B-Instruct-AWQ | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-32B-Instruct-GGUF | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-32B-Instruct-GPTQ-Int4 | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Qwen2.5-Coder-32B-Instruct-GPTQ-Int8 | инструктировать | 128 тыс. | Обнимающее лицо • ModelScope |
Подробные характеристики и введение показаны в этом документе. блог.
python>=3.9
transformers>4.37.0
для плотных моделей Qwen2.5.
Предупреждение
Это необходимо, поскольку «трансформеры» интегрировали коды Qwen2, начиная с «4.37.0».
Вы можете установить необходимые пакеты с помощью следующей команды:
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:
из трансформаторов 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. Вы полезный помощник."}, {"роль": "пользователь", "контент": подсказка} ]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generate_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):] для input_ids, output_ids в zip (model_inputs.input_ids, сгенерированные_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:
из трансформаторов 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` для управления максимальным выходом length.generated_ids = MODEL.generate(model_inputs.input_ids, max_new_tokens=512, do_sample=False)[0]# Сгенерированные_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>
, <fim_suffix>
и <fim_middle>
для обозначения соответствующих сегментов структуры кода. Подсказка должна быть структурирована следующим образом:
приглашение = '<|fim_prefix|>' + префикс_код + '<|fim_suffix|>' + суффикс_код + '<|fim_middle|>'
Следуя упомянутому подходу, пример будет структурирован следующим образом:
из трансформаторов import AutoTokenizer, AutoModelForCausalLM# load modeldevice = "cuda" # устройство для загрузки модели в TOKENIZER = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")MODEL = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5) -Кодер-32Б", device_map="auto").eval()input_text = """<|fim_prefix|>def Quicksort(arr): if len(arr) <= 1: return arr Pivot = arr[len(arr) // 2] < |fim_suffix|> middle = [x для x в массиве, если x == центр] right = [x для x в массиве, если x > центр] return fastsort(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]# Generated_ids включает в себя Prompt_ids, нам нужно декодировать токены только после Prompt_ids.output_text = TOKENIZER.decode(generated_ids[len(model_inputs.input_ids[0]):],skip_special_tokens=True)print(f"Prompt: {input_text}nnGenerated text: {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}'''
из трансформаторов 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__(я, название, автор, 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, title,author, isbn, copy): book = Book(title,author,isbn, copy) self.books.append(book) def find_book(self, isbn): для книги в self.books: if book.isbn == isbn: return book 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 = [] def take_book(self, book, Library): if book и 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("Великий Гэтсби", "Ф. Скотт Фицджеральд", "1234567890", 3) Library.add_book("Убить пересмешника", "Харпер Ли", "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}") # Студент возвращает книгу, если Student.return_book(book, Library):print(f"{student.name} возвращен {book.title}")else:print(f"{student.name} не удалось вернуть {book.title}") # Список всех книг в библиотекеprint("Все книги в библиотеке:") для книги в библиотеке. list_books():print(book)if __name__ == "__main__":main()
Как член семейства Qwen2.5, Qwen2.5-Coder поддерживается vLLM. Подробное руководство можно найти в руководстве по Qwen. Здесь мы даем вам простой пример автономного пакетного вывода в vLLM.
from Transformers import AutoTokenizerfrom vllm import LLM, SamplingParams# Инициализировать токенизатор tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")# Передать гиперпараметры декодирования по умолчанию для Qwen1.5-32B-Chat# max_tokens для максимального значения длина для генерации.sampling_params = SamplingParams(temperature=0,7, top_p=0,8, повторение_пеналти=1,05, max_tokens=1024)# Введите имя модели или путь. Может быть GPTQ или AWQ models.llm = LLM(model="Qwen/Qwen2.5-Coder-32B")# Подготовьте подсказкиprompt = "#напишите алгоритм быстрой сортировки.ndef fast_sort("# генерировать выходные данные = llm.generate( [prompt], sample_params)# Распечатайте выходные данные.for в выходных данных:prompt = output.promptgenerated_text = output.outputs[0].textprint(f"Подсказка: {prompt!r}, Сгенерированный текст: {generated_text!r}")
Распределенное обслуживание помогает увеличить пропускную способность обслуживания за счет использования большего количества графических процессоров. Использование сверхдлинных последовательностей для вывода может привести к нехватке памяти графического процессора. Здесь мы демонстрируем, как запустить Qwen2.5-Coder-32B с тензорным параллелизмом, просто передав аргумент tensor_parallel_size
.
llm = LLM(model="Qwen/Qwen2.5-Coder-32B", tensor_parallel_size=8)
Мы также предоставляем интерфейс Gradio для более удобного использования, который можно просто запустить:
cd demo/chatbot/# Для пользователей Linux и Windows (и macOS с Intel??)python app.py # Для macOS с пользователями Apple Silicon Intel не поддерживается, это может быть в 20 раз медленнее, чем RTX 4090PYTORCH_ENABLE_MPS_FALLBACK=1 python app.py
Мы также предоставляем интерфейс Gradio для режима артефактов:
компакт-диск с демо/артефактами/ приложение Python.py
Вы можете указать аргументы --server_port
, --share
, --server_name
в соответствии с вашими потребностями!
Или просто опробуйте это на HuggingFace: «демо-чат-бот»? 「демонстрация артефактов」
Для получения дополнительной информации обратитесь к техническому отчету Qwen2.5-Coder.
Если наша работа окажется для вас полезной, пожалуйста, дайте нам ссылку.
@article{hui2024qwen2, title={Qwen2. Технический отчет 5-Coder}, автор = {Хуэй, Биньюань и Ян, Цзянь и Цуй, Зею и Ян, Цзяси и Лю, Дайихэн и Чжан, Лэй и Лю, Тяньюй и Чжан, Цзяцзюнь и Ю, Боуэн и Данг, Кай и другие}, журнал={препринт arXiv arXiv:2409.12186}, year={2024}}@article{qwen2,title={Технический отчет Qwen2},author={Ань Ян и Баосун Ян и Биньюань Хуэй и Бо Чжэн и Боуэн Ю и Чан Чжоу и Чэнпэн Ли и Чэнъюань Ли и Дайихэн Лю и Фей Хуан и Гуантин Донг, Хаоран Вэй, Хуань Линь, Цзялун Тан, Цзялин Ван, Цзянь Ян и Цзяньхун Ту и Цзяньвэй Чжан и Цзяньсинь Ма и Цзинь Сюй и Цзинжэнь Чжоу и Цзиньцзе Бай и Цзиньчжэн Хэ и Цзюньян Линь и Кай Дан и Кемин Лу и Кэцинь Чен и Кэсинь Ян и Мэй Ли и Минфэн Сюэ и На Ни и Пей Чжан и Пэн Ван и Ру Пэн, и Руй Мень, и Руизе Гао, и Жунджи Линь, и Шицзе Ван, и Шуай Бай, и Синан Тан и Тяньхан Чжу и Тяньхао Ли и Тяньюй Лю и Вэньбинь Гэ и Сяодун Дэн и Сяохуань Чжоу и Синчжан Жэнь и Синьюй Чжан и Сипин Вэй и Сюаньчэн Жэнь и Ян Фань и Ян Яо и Ичан Чжан и Юй Ван и Юнфэй Чу и Юцюн Лю и Зею Цуй, Чжэньру Чжан и Чжихао Fan},journal={препринт arXiv arXiv:2407.10671},year={2024}}
Если вы хотите оставить сообщение нашей исследовательской группе или команде разработчиков, присоединяйтесь к нашим группам Discord или WeChat!
↑ Наверх ↑