Hari ini, kami sangat antusias untuk menjadi open source seri Qwen2.5-Coder yang “Kuat”, “Beragam”, dan “Praktis” (sebelumnya dikenal sebagai CodeQwen1.5), yang didedikasikan untuk terus mempromosikan pengembangan Open CodeLLMs.
Kuat: Qwen2.5-Coder-32B-Instruct telah menjadi model kode sumber terbuka SOTA saat ini, yang cocok dengan kemampuan pengkodean GPT-4o. Selain menunjukkan kemampuan pengkodean yang kuat dan komprehensif, ia juga memiliki keterampilan umum dan matematika yang baik;
Beragam: Berdasarkan dua ukuran 1.5B / 7B yang sebelumnya bersumber terbuka, rilis ini menghadirkan empat ukuran model, termasuk 0.5B / 3B / 14B / 32B. Saat ini, Qwen2.5-Coder telah mencakup enam ukuran model utama untuk memenuhi kebutuhan pengembang yang berbeda;
? Praktis: Kami mengeksplorasi kepraktisan Qwen2.5-Coder dalam dua skenario, termasuk asisten kode dan Artefak, dengan beberapa contoh yang menunjukkan potensi penerapan Qwen2.5-Coder dalam skenario dunia nyata;
Mendukung pemahaman dan pembuatan konteks yang panjang dengan panjang konteks 128 ribu token;
Mendukung 92 bahasa pengkodean;
['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']
Pertahankan kekuatan dalam matematika dan kemampuan umum dari model dasar
Penting
Kami memperbarui token khusus dan id token terkait, untuk menjaga konsistensi dengan Qwen2.5. Token khusus yang baru adalah sebagai berikut:
{ "<|fim_prefix|>": 151659, "<|fim_middle|>": 151660, "<|fim_suffix|>": 151661, "<|fim_pad|>": 151662, "<|nama_repo|>": 151663, "<|file_sep|>": 151664, "<|im_start|>": 151644, "<|im_end|>": 151645}
nama model | jenis | panjang | Unduh |
---|---|---|---|
Qwen2.5-Pembuat Kode-0.5B | basis | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-1.5B | basis | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-3B | basis | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-7B | basis | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Pembuat Kode-14B | basis | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-32B | basis | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-0.5B-instruksikan | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-1.5B-instruksikan | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-3B-instruksikan | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-7B-instruksikan | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-14B-instruksikan | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-32B-instruksikan | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-0.5B-Instruksikan-AWQ | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-0.5B-Instruksikan-GGUF | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-0.5B-Instruksikan-GPTQ-Int4 | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-0.5B-Instruksikan-GPTQ-Int8 | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-1.5B-Instruksikan-AWQ | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-1.5B-Instruksikan-GGUF | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-1.5B-Instruksikan-GPTQ-Int4 | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-1.5B-Instruksikan-GPTQ-Int8 | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-3B-Instruksikan-AWQ | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-3B-Instruksikan-GGUF | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-3B-Instruksikan-GPTQ-Int4 | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-3B-Instruksikan-GPTQ-Int8 | menginstruksikan | 32k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-7B-Instruksikan-AWQ | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-7B-Instruksikan-GGUF | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-7B-Instruksikan-GPTQ-Int4 | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-7B-Instruksikan-GPTQ-Int8 | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-14B-Instruksikan-AWQ | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-14B-Instruksikan-GGUF | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-14B-Instruksikan-GPTQ-Int4 | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-14B-Instruksikan-GPTQ-Int8 | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-32B-Instruksikan-AWQ | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-32B-Instruksikan-GGUF | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-32B-Instruksikan-GPTQ-Int4 | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Qwen2.5-Coder-32B-Instruksikan-GPTQ-Int8 | menginstruksikan | 128k | Memeluk Wajah • ModelScope |
Performa dan pengenalan mendetail ditampilkan di sini? blog.
python>=3.9
transformers>4.37.0
untuk model padat Qwen2.5.
Peringatan
Ini adalah suatu keharusan karena `transformator` mengintegrasikan kode Qwen2 sejak `4.37.0`.
Anda dapat menginstal paket yang diperlukan dengan perintah berikut:
instalasi pip -r persyaratan.txt
Penting
Qwen2.5-Coder-[0.5-32]B-Instrcut adalah model instruksi untuk mengobrol;
Qwen2.5-Coder-[0.5-32]B adalah model dasar yang biasanya digunakan untuk penyelesaian, berfungsi sebagai titik awal yang lebih baik untuk penyesuaian.
Anda cukup menulis beberapa baris kode dengan transformers
untuk mengobrol dengan Qwen2.5-Coder-32B-Instruct. Pada dasarnya, kami membangun tokenizer dan model dengan metode from_pretrained
, dan kami menggunakan metode generate untuk melakukan obrolan dengan bantuan template obrolan yang disediakan oleh tokenizer. Di bawah ini adalah contoh cara chatting dengan Qwen2.5-Coder-32B-Instruct:
dari transformator impor 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 = "tulis algoritma pengurutan cepat."messages = [ {"role": "system", "content": "Anda adalah Qwen, dibuat oleh Alibaba Cloud. Anda adalah asisten yang sangat membantu."}, {"peran": "pengguna", "konten": prompt} ]teks = tokenizer.apply_chat_template(messages,tokenize=False,add_generasi_prompt=Benar)model_inputs = tokenizer([teks], return_tensors="pt").to(model.device)generated_ids = model.generate(**model_inputs,max_new_tokens= 512)generated_ids = [output_ids[len(input_ids):] untuk input_ids, output_ids dalam zip(model_inputs.input_ids, generate_ids) ]respons = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
Fungsi apply_chat_template()
digunakan untuk mengubah pesan ke dalam format yang dapat dipahami model. Argumen add_generation_prompt
digunakan untuk menambahkan perintah pembangkitan, yang mengacu pada <|im_start|>assistantn
ke input. Khususnya, kami menerapkan template ChatML untuk model obrolan mengikuti praktik kami sebelumnya. Argumen max_new_tokens
digunakan untuk mengatur panjang maksimum respon. Fungsi tokenizer.batch_decode()
digunakan untuk memecahkan kode respons. Dalam hal masukan, pesan di atas adalah contoh untuk menunjukkan cara memformat riwayat dialog dan perintah sistem Anda. Anda dapat menggunakan model instruksi ukuran lain dengan cara yang sama.
Model menyelesaikan cuplikan kode sesuai dengan perintah yang diberikan, tanpa pemformatan tambahan apa pun, yang biasanya disebut sebagai code completion
dalam tugas pembuatan kode.
Pada dasarnya, kami membangun tokenizer dan model dengan metode from_pretrained
, dan kami menggunakan metode generate untuk melakukan penyelesaian kode. Di bawah ini adalah contoh cara chatting dengan Qwen2.5-Coder-32B:
dari transformator impor AutoTokenizer, AutoModelForCausalLMdevice = "cuda" # perangkat untuk memuat model ke# Sekarang Anda tidak perlu menambahkan "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()# memberi token pada masukan ke dalam tokensinput_text = "#tulis algoritma pengurutan cepat"model_inputs = TOKENIZER([input_text], return_tensors ="pt").to(device)# Gunakan `max_new_tokens` untuk mengontrol panjang keluaran maksimum.generated_ids = MODEL.generate(model_inputs.input_ids, max_new_tokens=512, do_sample=False)[0]# Yang dihasilkan termasuk prompt_ids, jadi kita hanya perlu mendekode token setelah prompt_ids.output_text = TOKENIZER.decode(generated_ids[len(model_inputs.input_ids[ 0]):], skip_special_tokens=Benar)print(f"Prompt: {input_text}nnTeks yang dihasilkan: {output_text}")
Argumen max_new_tokens
digunakan untuk mengatur panjang maksimum respon. input_text
dapat berupa teks apa pun yang Anda ingin modelnya dilanjutkan.
config.json
saat ini disetel untuk panjang konteks hingga 32.768 token. Untuk menangani input ekstensif yang melebihi 32.768 token, kami menggunakan YaRN, sebuah teknik untuk meningkatkan ekstrapolasi panjang model, memastikan performa optimal pada teks yang panjang.
Untuk kerangka kerja yang didukung, Anda dapat menambahkan yang berikut ke config.json
untuk mengaktifkan YaRN:
{..., "rope_scaling": {"factor": 4.0,"original_max_position_embeddings": 32768,"type": "benang" } }
Tugas penyisipan kode, juga disebut sebagai tantangan "mengisi bagian tengah", memerlukan penyisipan segmen kode dengan cara yang menjembatani kesenjangan dalam konteks kode tertentu. Untuk pendekatan yang selaras dengan praktik terbaik, kami merekomendasikan untuk mengikuti pedoman format yang diuraikan dalam makalah "Pelatihan Model Bahasa yang Efisien untuk Mengisi Bagian Tengah"[arxiv]. Ini melibatkan penggunaan tiga token khusus
,
, dan
untuk menunjukkan masing-masing segmen struktur kode. Prompt harus disusun sebagai berikut:
prompt = '<|fim_prefix|>' + kode_awalan + '<|fim_suffix|>' + kode_akhiran + '<|fim_middle|>'
Mengikuti pendekatan yang disebutkan, sebuah contoh akan disusun dengan cara ini:
dari transformator mengimpor AutoTokenizer, AutoModelForCausalLM# memuat modeldevice = "cuda" # perangkat untuk memuat model keTOKENIZER = 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 quicksort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] <|fim_suffix|> middle = [x untuk x dalam arr jika x == pivot] kanan = [x untuk x di arr jika x > pivot] return quicksort(kiri) + tengah + quicksort(kanan)<|fim_middle|>"""model_inputs = TOKENIZER([input_text], return_tensors="pt").to(device)# Gunakan `max_new_tokens` untuk mengontrol panjang keluaran maksimum.generated_ids = MODEL.generate(model_inputs .input_ids, max_new_tokens=512, do_sample=False)[0]# ID_yang dihasilkan sertakan prompt_ids, kita hanya perlu mendekode token setelah 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: { keluaran_teks}")
Tugas penyelesaian kode tingkat repositori melibatkan pemberian konten beberapa file kepada model dari repositori yang sama. Hal ini memungkinkan model untuk memahami keterkaitan antara berbagai panggilan dalam file-file ini, sehingga memfasilitasi penyelesaian konten kode. Kami merekomendasikan penggunaan dua token khusus <|repo_name|>
dan <|file_sep|>
untuk menunjukkan struktur repositori. Misalnya, dengan asumsi nama repositori disimpan dalam repo_name
, dan berisi file dengan jalur dan konten masing-masing yang terdaftar sebagai [( file_path1
, file_content1
), ( file_path2
, file_content2
)], format prompt input akhir adalah sebagai berikut:
input_text = f'''<|repo_name|>{repo_name}<|file_sep|>{file_path1} {file_content1}<|file_sep|>{file_path2} {file_content2}'''
dari transformator impor AutoTokenizer, AutoModelForCausalLMdevice = "cuda" # perangkat untuk memuat model ke# Sekarang Anda tidak perlu menambahkan "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()# memberi token pada input ke dalam tokensinput_text = """<|repo_name|>sistem-perpustakaan<|file_sep|>perpustakaan .pyclass Buku: def __init__(diri, judul, penulis, isbn, salinan): self.title = judul self.author = penulis self.isbn = isbn self.copies = salinan def __str__(self): return f"Judul: {self.title}, Pengarang: {self.author}, ISBN: {self.isbn}, Salinan: {self.copies}"perpustakaan kelas: def __init__(diri): self.books = [] def add_book(diri, judul, pengarang, isbn, salinan): buku = Buku(judul, pengarang, isbn, salinan) self.books.append(book) def find_book(self, isbn): untuk buku di self.books: if book.isbn == isbn: return book return None def list_books(self): return self.books<|file_sep|> student.pyclass Siswa: def __init__(diri, nama, id): self.name = nama self.id = id self.borrowed_books = [] def peminjaman_buku(diri, buku, perpustakaan): jika buku dan buku.salinan > 0: self.borrowed_books.append(buku) buku.salinan -= 1 return True return False def return_book(mandiri, buku, perpustakaan): jika buku di 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(): # Siapkan perpustakaan dengan beberapa buku perpustakaan = Library() perpustakaan.add_book("The Great Gatsby", "F. Scott Fitzgerald", "1234567890", 3) library.add_book("To Kill a Mockingbird", "Harper Lee", "1234567891", 2) # Menyiapkan siswa siswa = Siswa("Alice", "S1") # Siswa meminjam buku"""model_inputs = TOKENIZER([input_text], return_tensors="pt").to(device)# Gunakan `max_new_tokens` untuk mengontrol panjang keluaran maksimum.generated_ids = MODEL.generate(model_inputs.input_ids, max_new_tokens=1024, do_sample=False)[0]# Generated_ids menyertakan prompt_ids, jadi kita hanya perlu mendekode token setelah prompt_ids.output_text = TOKENIZER.decode(generated_ids[len(model_inputs.input_ids[0]):], skip_special_tokens=True)print(f"Prompt: n{input_text}nnTeks yang dihasilkan: n{output_text}")
Output yang diharapkan sebagai berikut:
Teks yang dihasilkan:buku = perpustakaan.find_book("1234567890")if student.borrow_book(buku, perpustakaan):print(f"{student.name} meminjam {book.title}")else:print(f"{student.name} } tidak dapat meminjam {book.title}") # Siswa mengembalikan bukujika siswa.return_book(buku, perpustakaan):print(f"{student.name} dikembalikan {book.title}")else:print(f"{student.name} tidak dapat mengembalikan {book.title}") # Daftar semua buku di perpustakaanprint("Semua buku di perpustakaan:")untuk buku di perpustakaan. list_books():print(buku)if __name__ == "__main__":main()
Sebagai anggota keluarga Qwen2.5, Qwen2.5-Coder didukung oleh vLLM. Tutorial detailnya dapat ditemukan di tutorial Qwen. Di sini, kami memberi Anda contoh sederhana inferensi batch offline di vLLM.
from transformers import AutoTokenizerfrom vllm import LLM, SamplingParams# Inisialisasi tokenizertokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-Coder-32B")# Lewati hyperparameter decoding default Qwen1.5-32B-Chat# max_tokens adalah untuk maksimum panjang untuk generasi.sampling_params = SamplingParams(suhu=0,7, top_p=0.8, repeat_penalty=1.05, max_tokens=1024)# Masukkan nama model atau path. Bisa berupa GPTQ atau AWQ models.llm = LLM(model="Qwen/Qwen2.5-Coder-32B")# Siapkan promptsprompt = "#tulis algoritme pengurutan cepat.ndef quick_sort("# generate outputsoutputs = llm.generate( [prompt], sampling_params)# Cetak keluarannya.untuk keluaran di keluaran:prompt = keluaran.promptgenerated_text = output.outputs[0].textprint(f"Prompt: {prompt!r}, Teks yang dihasilkan: {generated_text!r}")
Untuk meningkatkan throughput penyajian Anda, penyajian terdistribusi membantu Anda dengan memanfaatkan lebih banyak perangkat GPU. Saat menggunakan urutan ultra-panjang untuk inferensi, hal ini mungkin menyebabkan memori GPU tidak mencukupi. Di sini, kami mendemonstrasikan cara menjalankan Qwen2.5-Coder-32B dengan paralelisme tensor hanya dengan meneruskan argumen tensor_parallel_size
.
llm = LLM(model="Qwen/Qwen2.5-Coder-32B", tensor_parallel_size=8)
Kami juga menyediakan antarmuka Gradio untuk pengalaman yang lebih baik, cukup dijalankan dengan:
cd demo/chatbot/# Untuk pengguna Linux dan Windows (dan macOS dengan Intel??)python app.py # Untuk macOS dengan pengguna Apple Silicon, Intel tidak didukung, ini mungkin 20x lebih lambat dibandingkan RTX 4090PYTORCH_ENABLE_MPS_FALLBACK=1 python app.py
Kami juga menyediakan antarmuka Gradio mode artefak:
CD demo/artefak/ aplikasi python.py
Anda dapat menentukan argumen --server_port
, --share
, --server_name
untuk memenuhi kebutuhan Anda!
Atau, cobalah dengan mudah di HuggingFace: 「demo chatbot」? 「demo artefak」
Untuk informasi lebih lanjut, silakan merujuk ke Laporan Teknis Qwen2.5-Coder.
Jika Anda merasa pekerjaan kami bermanfaat, silakan beri kami kutipan.
@artikel{hui2024qwen2, title={Qwen2. Laporan Teknis 5-Coder}, penulis={Hui, Binyuan dan Yang, Jian dan Cui, Zeyu dan Yang, Jiaxi dan Liu, Dayiheng dan Zhang, Lei dan Liu, Tianyu dan Zhang, Jiajun dan Yu, Bowen dan Dang, Kai dan other}, journal={arXiv preprint arXiv:2409.12186}, year={2024}}@article{qwen2,title={Qwen2 Teknis Report},author={An Yang dan Baosong Yang dan Binyuan Hui dan Bo Zheng dan Bowen Yu dan Chang Zhou dan Chengpeng Li dan Chengyuan Li dan Dayiheng Liu dan Fei Huang dan Guanting Dong dan Haoran Wei dan Huan Lin dan Jialong Tang dan Jialin Wang dan Jian Yang dan Jianhong Tu dan Jianwei Zhang dan Jianxin Ma dan Jin Xu dan Jingren Zhou dan Jinze Bai dan Jinzheng He dan Junyang Lin dan Kai Dang dan Keming Lu dan Keqin Chen dan Kexin Yang dan Mei Li dan Mingfeng Xue dan Na Ni dan Pei Zhang dan Peng Wang dan Ru Peng dan Rui Men dan Ruize Gao dan Runji Lin dan Shijie Wang dan Shuai Bai dan Sinan Tan dan Tianhang Zhu dan Tianhao Li dan Tianyu Liu dan Wenbin Ge dan Xiaodong Deng dan Xiaohuan Zhou dan Xingzhang Ren dan Xinyu Zhang dan Xipin Wei dan Xuancheng Ren dan Yang Fan dan Yang Yao dan Yichang Zhang dan Yu Wan dan Yunfei Chu dan Yuqiong Liu dan Zeyu Cui dan Zhenru Zhang dan Zhihao Fan},journal={arXiv pracetak arXiv:2407.10671},tahun={2024}}
Jika Anda tertarik untuk meninggalkan pesan ke tim riset atau tim produk kami, bergabunglah dengan grup Discord atau WeChat kami!
↑ Kembali ke Atas ↑