本日、私たちは、Open CodeLLM の開発を継続的に推進することに専念する、「強力」、「多様」、「実用的」なQwen2.5-Coderシリーズ (以前は CodeQwen1.5 として知られていました) をオープンソース化できることを嬉しく思います。
強力: Qwen2.5-Coder-32B-Instruct は、GPT-4o のコーディング機能と一致する、現在の SOTA オープンソース コード モデルになりました。強力で包括的なコーディング能力を実証すると同時に、優れた一般的および数学的スキルも備えています。
多様性: 以前にオープンソース化された 1.5B / 7B の 2 つのサイズに基づいて、このリリースでは 0.5B / 3B / 14B / 32B を含む 4 つのモデル サイズが提供されます。現在のところ、Qwen2.5-Coder はさまざまな開発者のニーズを満たすために 6 つの主流モデル サイズをカバーしています。
?実用的: コード アシスタントとアーティファクトを含む 2 つのシナリオで 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 | ベース | 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-Instruct-AWQ | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GGUF | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GPTQ-Int4 | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-0.5B-Instruct-GPTQ-Int8 | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-AWQ | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GGUF | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GPTQ-Int4 | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-1.5B-Instruct-GPTQ-Int8 | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-3B-Instruct-AWQ | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-3B-Instruct-GGUF | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-3B-Instruct-GPTQ-Int4 | 指示する | 32k | 抱き合う顔 • ModelScope |
Qwen2.5-Coder-3B-Instruct-GPTQ-Int8 | 指示する | 32k | 抱き合う顔 • 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
。
警告
「transformers」には「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": "あなたは 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)生成された_id = zip 内の input_ids、output_ids の [output_ids[len(input_ids):](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
メソッドを使用してトークナイザーとモデルを構築し、コード補完を実行するためにgenerate メソッドを使用します。以下は、Qwen2.5-Coder-32B とチャットする方法の例です。
fromTransformers 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()# 入力を tokens にトークン化するinput_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]# generated_ids にはプロンプト ID が含まれるため、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] で概説されている書式設定ガイドラインに従うことをお勧めします。これには、コード構造のそれぞれのセグメントを示すための 3 つの特殊なトークン
、
、および
の使用が含まれます。プロンプトは次のように構成されている必要があります。
プロンプト = '<|fim_prefix|>' + プレフィックス コード + '<|fim_suffix|>' + サフィックス コード + '<|fim_middle|>'
前述のアプローチに従って、例は次のように構成されます。
from トランスフォーマー 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|>def Quicksort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] < |fim_suffix|> 中央 = [x == ピボットの場合、arr の x の x] 右 = [x > ピボットの場合、arr の x の x] returnクイックソート(左) + 中央 + クイックソート(右)<|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 にはプロンプト 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}")
リポジトリ レベルのコード補完タスクには、同じリポジトリから複数のファイルのコンテンツをモデルにフィードすることが含まれます。これにより、モデルはこれらのファイル内のさまざまな呼び出し間の相互関係を理解できるようになり、コード コンテンツの完成が容易になります。リポジトリ構造を示すために、2 つの特別なトークン<|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}'''
fromTransformers 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, author, isbn, 部数): self.title = タイトル self.author = 著者 self.isbn = isbn self.copies = コピー数 def __str__(self): return f"タイトル: {self.title}、著者: {self.author}、ISBN: {self.isbn}、コピー数: {self.コピー}"クラス ライブラリ: def __init__(self): self.books = [] def add_book(self, title, author,isbn,copies): book = Book(title, author,isbn,copes) self.books.append(book) def find_book(self,isbn): self.books 内の本の場合: book.isbn == isbn の場合: 本を返します return None def list_books(self): self.books<|file_sep|> を返しますStudent.pyclass Student: def __init__(self, name, id): self.name = 名前 self.id = id self.borrowed_books = [] defborrow_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): self.borrowed_books 内の本の場合: self.borrowed_books.remove(book) book.copies += 1 return True return False<|file_sep|>main.pyfrom library import Libraryfromstudent import Studentdef main(): # いくつかの書籍を含むライブラリをセットアップしますlibrary = Library() library.add_book("華麗なるギャツビー", "F. Scott Fitzgerald", "1234567890", 3) library.add_book("To Kill a Mockingbird", "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 students.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} が返されました{book.title}")else:print(f"{student.name} は {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 でのオフライン バッチ推論の簡単な例を示します。
fromtransformers 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, repetition_penalty=1.05, max_tokens=1024)# モデル名またはパスを入力します。 GPTQ または AWQ モデルを使用できます。llm = LLM(model="Qwen/Qwen2.5-Coder-32B")# プロンプトを準備しますsprompt = "#クイック ソート アルゴリズムを作成します。ndefquick_sort("# 出力を生成しますoutputs = llm.generate( [prompt],sampling_params)# 出力の出力を出力します。出力:prompt = Output.promptgenerated_text = Output.outputs[0].textprint(f"プロンプト: {prompt!r}、生成されたテキスト: {generated_text!r}")
分散サービスでは、より多くの GPU デバイスを活用することで、サービスのスループットをスケールアップできます。推論に超長いシーケンスを使用すると、GPU メモリが不足する可能性があります。ここでは、引数tensor_parallel_size
を渡すだけでテンソル並列処理を使用して Qwen2.5-Coder-32B を実行する方法を示します。
llm = LLM(model="Qwen/Qwen2.5-Coder-32B", tensor_Parallel_size=8)
また、エクスペリエンスを向上させるための Gradio インターフェイスも提供しています。次の方法で実行できます。
cd demo/chatbot/# Linux および Windows ユーザー (およびインテル搭載 macOS??) の場合 python app.py # Apple Silicon ユーザーを搭載した macOS の場合、Intel はサポートされていません。これはおそらく RTX より 20 倍遅い 4090PYTORCH_ENABLE_MPS_FALLBACK=1 python app.py
アーティファクト モードの Gradio インターフェイスも提供します。
CD デモ/アーティファクト/ Python app.py
ニーズを満たすために--server_port
、 --share
、 --server_name
引数を指定できます。
または、HuggingFace で簡単に試してみてください:「チャットボット デモ」? 「アーティファクトデモ」
詳細については、Qwen2.5-Coder テクニカル レポートを参照してください。
私たちの仕事が役に立ったと思われる場合は、お気軽に引用してください。
@article{hui2024qwen2、title={Qwen2. 5-Coder Technical Report}、著者={Hui、Binyuan および Yang、Jian および Cui、Zeyu および Yang、Jiaxi および Liu、Dayiheng および Zhang、Lei および Liu、Tianyu および Zhang、Jiajun および Yu、Bowen および Dang、Kai およびその他}、ジャーナル={arXiv プレプリント 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、Daiiheng Liu、Feiファン、ドン・グアンティン、ウェイ・ハオラン、リン・ファン、タン・ジャロン、ワン・ジャリン、ヤン・ジャン、ジェンホントゥ、ジャンウェイ、マー・ジェンシン、シュウ・ジンレン、バイ・ジンゼー、何・晋正、リン・ジュンヤン、ダン・カイダン、ルー・ケミン、チェン・ケチン、ヤン・ケシン、メイ・リー、シュ・ミンフェン、ナ・ニー、チャン・ペイ、ワン・ペン、そしてRu Peng、Rui Men、Ruize Gao、Runji Lin、Shijie Wang、Shuai Bai、Sinan Tan、Tianhang朱氏、李天豪氏、劉天宇氏、葛文斌氏、鄧小東氏、周暁環氏、任興章氏、張新宇氏、魏西嬪氏、任玄成氏、楊範氏、楊耀氏、張宜昌氏、玉湾氏、朱雲飛氏、劉裕瓊氏、崔是宇氏、 Zhenru Zhang と Zhihao Fan}、journal={arXiv プレプリントarXiv:2407.10671}、年={2024}}
当社の研究チームまたは製品チームにメッセージを残すことに興味がある場合は、Discord または WeChat グループに参加してください。
↑ トップに戻る ↑