QwenモデルはAlibabaによって開発され、コード補完やインストラクションタスクの両方において高い性能を示しています。本ブログでは、QwenモデルをLlama系アーキテクチャと類似のアプローチでDatabricks上に登録・デプロイする方法をご紹介します。この記事のステップに従えば、低レイテンシーかつ高スループットの利点を持つ、Databricksの基盤モデル(Provisioned Throughput)エンドポイントを活用することができます。 目次 動機:なぜDatabricksでQwenモデルを提供するのか? コアとなる考え方 実装:コメント付きコードでの解説 パフォーマンスと制約 まとめと今後の展望 動機:なぜDatabricksでQwenモデルを提供するのか? 多くのエンタープライズ向けワークロードにおいて、Databricksは大規模言語モデル(LLM)のトレーニング、登録、提供までを一貫して行えるプラットフォームです。Databricks Mosaic AIモデルサービングを利用すれば、ファインチューニング済みモデルやベースモデルを簡単にデプロイし、リアルタイム推論やバッチ推論に活用できます。 最近リリースされたQwen 2.5シリーズのモデルは、コード補完やインストラクションタスクにおいて非常に高い性能を示しています。Qwen 2.5 modelsはリリース時点で、MMLU、ARC-C、MATH、HumanEvalといった標準ベンチマークや、Multi-Exam、Multi-Understandingといった多言語ベンチマークにおいて、同等サイズの他モデルを上回る結果を出しました。 Qwen 2.5 Coder modelsも、コード関連のベンチマークにおいて同様の成果を示しています。 こうした性能の高さから、Databricks Model ServingでQwenモデルを活用し、さまざまなユースケースに対応したいと考える顧客にとっては、大きな導入動機となるでしょう。 QwenモデルをDatabricks上で提供するには、以下の4つのステップが必要です: ノートブックを実行して、QwenモデルのファイルをLlamaアーキテクチャおよびDatabricksのモデルサービングに対応する形式へ変換する QwenモデルをUnity Catalogに登録する 登録済みモデルをDatabricks Foundation Model Servingにデプロイする デプロイされたモデルに対して品質テストを実施する(手動でのテスト、または標準ベンチマークをエンドポイントに対して実行するなど) コアアイデア Databricks基盤モデル提供は、MetaのLlamaモデルなどのモデルに最適化されたパフォーマンスを提供します。顧客は、これらのモデルをプロビジョニングされたスループットでデプロイし、低レイテンシーと高スループットを実現することができます。Qwenモデルの基礎となるモデル構造はLlamaモデルの構造と非常に似ていますが、Databricksのモデル提供インフラを活用するためには一部の修正が必要です。以下の手順では、顧客が必要な変更をどのように行うかを説明しています。 実装:注釈付きコードのウォークスルー パート1)Qwenの重みと設定をLlamaモデルと一貫性があるように書き換えてください。 modify_qwen.pyの手順は、Qwen2.5モデルを取り、Databricksでのプロビジョニングスループットに最適化されたLlamaアーキテクチャと一致するように書き換えます。以下はコードの主要な手順です: Qwen State Dictのロード: 元のQwenディレクトリから .safetensors を収集します。 重みのコピー&調整: Llamaがそれを期待する場所で、注意の出力に対してゼロバイアスを挿入します。 Configの書き換え: "architectures"、"model_type"などのフィールドを"llama"に更新し、Qwen特有のフラグを削除します。 トークナイザーファイルのコピー: tokenizer.jsonを持ってくることを確認します、merges.txt、など。 最終出力フォルダの作成: 新しいディレクトリのファイルは、典型的なLlamaモデルのように見えます。 このステップの終わりには、Llamaと互換性のあるQwenモデルができあがります。vLLMでモデルをロードすることができ、それをLlamaモデルとして扱い、コードを生成したり、使用したモデルに応じて指示に従ったりすることができます。 ヒント: huggingface_hub.snapshot_downloadを使用して、Hugging FaceからQwen/Qwen2.5-Coder-7B-InstructなどのQwenモデルの一つをディレクトリにフェッチし、変換を行う前にダウンロードすることができます。 パート2)DatabricksでQwenを登録し、提供する 次に、Databricksで「Qwen as Llama」モデルをログに記録し、提供する方法に焦点を当てます。これはregister_qwen.pyによって処理されます。ここでの手順は、モデルがLlamaモデルとしてモデル提供が期待する設定を持つことを確認します。主な手順: 以前に変換されたモデルへのパスを指定します。 トークナイザーの設定を変更します(特にchat_templateを削除し、tokenizer_classを設定する)。 調整 config.jsonをLlama互換のシーケンス長に反映させます。 ロギング前にLlamaのようなメタデータでモデルを更新します。 MLflowでモデルを登録する、これによりGPUエンドポイントで提供することができます。 このノートブックを実行すると、モデルはUnityカタログに登録されます。モデルに移動し、「このモデルを提供する」をクリックしてエンドポイントを設定します。異なるトークン/秒レートでプロビジョニングされた入力を持つエンドポイントを設定するオプションが表示されるはずです。 エンドポイントのテスト エンドポイントが準備できたら、基本的なテストを行って正常に動作していることを確認できます。仮に、私たちがQwen2.5-Coder-7Bをデプロイしたとします。上記の変換と登録を行った後のモデル。このモデルは、コードの一部を完成させるか、中間部分を埋めることができます。それを使って簡単なソート関数を完成させましょう。“Use”ドロップダウンで“Query”をクリックし、以下のリクエストを入力します: { "prompt": "def quick_sort(", "temperature": 0.05, "max_tokens": 250, "stop": "\n\n" } レスポンスのテキストには、実装の残りの部分が含まれています: ary): if len(ary) <= 1: return ary pivot = ary[0] lesser_arry, equal_arry, greater_arry = [], [], [] for num in ary: if num < pivot: lesser_arry.append(num)elif num > pivot: greater_arry.append(num)else: equal_arry.append(num)return quick_sort(lesser_arry) + equal_arry + quick_sort(greater_arry) より定量的なアプローチのために、HumanEvalタスクのための補完を生成することができます。その後、その評価を実行してpass@1メトリックを取得し、公開された結果と比較します。 パフォーマンスと制限 手動チャットフォーマット Qwenの組み込みチャットテンプレートを削除するため、クライアントコードでシステム/ユーザー/アシスタントのメッセージを手動でフォーマットする必要があります。これにより、モデルは会話のターンを適切に解釈することができます。 最大位置埋め込み 特定のDatabricks制約に合うように、max_position_embeddingsを16000トークンに設定します。もともとQwenがより多くをサポートしていた場合、最大コンテキスト長をいくつか失う可能性があります。しかし、プロビジョニングされたスループットのサポートは依然として得られます。 サマリーと次のステップ Databricksは現在、プロビジョニングスループットモデル提供に直接Qwenモデルをサポートしていませんが、上記の方法により、これらのモデルをLlamaモデルのアーキテクチャと互換性のある形に整えて登録し、提供することができます。このワークアラウンドは、あなたのチームがQwenの機能を必要としながらも、Databricksモデルサービングエンドポイントとプロビジョニングされたスループットの利便性を求める場合に特に役立ちます。 主要なポイント QwenモデルとLlamaモデルは、アーキテクチャの類似性が十分に共有されているため、トークナイザーの設定とモデルのメタデータにわずかな修正(具体的には)を加えるだけで、Databricksのモデル提供インフラストラクチャは、プロビジョニングされたスループットを使用してQwenモデルを容易に提供できます。 将来的な考慮事項 Databricksモデル提供における公式のQwenサポートに注目することをお勧めします。 強制的にコンテキストサイズを制限することから生じるパフォーマンスのオーバーヘッドを評価します。 チャットプロンプトに依存している場合は、クライアント側でプロンプトを手動でフォーマットすることを忘れないでください。 謝辞 Qwen変換の基礎となった初期の例としてのhiyougaのllamafy_qwen.py。 内部提供制約を明確にしたDatabricksのエンジニアリングチーム。 このアプローチをテストし、洗練させたすべてのコミュニティメンバー。