Abeja社のQwen2.5-32b-Japanese-v0.1をDatabricks上で試してみる

最近あまりできなかったので、いろんなモデルを触ってみたい欲求が。

# 導入

少し前にABEJA社がQwen2.5 32b-Instructをベースとして継続事前学習を実施したABEJA-Qwen2.5-32b-Japanese-v0.1をリリースしました。
こちらは経済産業省が立ち上げた「GENIAC」にて開発されたモデルとのこと。

https://tech-blog.abeja.asia/entry/geniac2-qwen25-32b-v0.1

モデルはHugging Face上に公開されています。

https://huggingface.co/abeja/ABEJA-Qwen2.5-32b-Japanese-v0.1

元のモデルであるQwen2.5 32Bよりも日本語性能が向上しており、GPT-4-Turbo以上の日本語性能のようです。

どんなものか気になったので、以下のGGUFフォーマットに変換&4bit量子化されたモデルを利用し、Databricks上で動かしてみます。（毎度利用させていただき感謝です）

https://huggingface.co/mmnga/ABEJA-Qwen2.5-32b-Japanese-v0.1-gguf

環境はDatabricks on AWS、DBRは16.2 ML(Beta)、インスタンスタイプはg5.xlargeのGPUクラスタを利用します。

# 試してみる

ノートブックを作成し、必要なパッケージをインストール。
[前回](https://qiita.com/isanakamishiro2/items/c83db4a39b2d98da16d0)同様、SGLangを使うことにします。

```python
%pip install flashinfer==0.1.6 --no-deps -i https://flashinfer.ai/whl/cu124/torch2.4/ --trusted-host flashinfer.ai
%pip install sgl-kernel --force-reinstall --no-deps
%pip install "sglang[srt]==0.4.2.post1"

dbutils.library.restartPython()
```

事前に上記リポジトリからダウンロードしておいたGGUFファイルをロードします。

```python
import sglang as sgl
import asyncio

model_path = "/Volumes/training/llm/model_snapshots/models--mmnga--ABEJA-Qwen2.5-32b-Japanese-v0.1-gguf/ABEJA-Qwen2.5-32b-Japanese-v0.1-Q4_K_M.gguf"
llm = sgl.Engine(model_path=model_path, mem_fraction_static=0.9)
```

では、適当なプロントをいくつか実行してみます。

```python
def format_prompt(prompt):
    return f"
user\n{prompt}
\n
assistant\n"

prompts = [
    "Hello, what is your name?",
    "Databricksとは何ですか？詳細に教えてください。",
    "まどか☆マギカでは誰が一番かわいい?",
    "ランダムな10個の要素からなるリストを作成してソートするコードをPythonで書いてください。",
    "現在の日本の首相は誰？",
    "あなたはマラソンをしています。今3位の人を抜きました。あなたの今の順位は何位ですか?ステップバイステップで考えてください。",
    "9.9と9.11、どっちの数字が大きい？",
]
formated_prompts = [format_prompt(p) for p in prompts]

sampling_params = {
    "temperature": 0,
    "max_new_tokens": 500,
}
results = llm.generate(formated_prompts, sampling_params)

for p, r in zip(prompts, results):
    print("---"*30)
    print("Q:", p)
    print("A:", r["text"])
    print()
```

````md:出力結果
------------------------------------------------------------------------------------------
Q: Hello, what is your name?
A: Hello! I'm Qwen, a large language model. I don't have a personal name because I'm not a real person, but you can just call me Qwen. Nice to meet you!

------------------------------------------------------------------------------------------
Q: Databricksとは何ですか？詳細に教えてください。
A: Databricksは、Apache Sparkを基盤としたクラウドベースのデータ分析プラットフォームで、大量のデータを効率的に処理・分析するためのツールを提供しています。Databricksは、データエンジニアリング、データサイエンス、機械学習のための統合環境を提供し、データの取り込み、変換、分析、可視化、モデルの構築と展開までを一貫して行うことができます。

Databricksの主な特徴は以下の通りです：

1. **統合環境**：Databricksは、データエンジニアリング、データサイエンス、機械学習のための統合環境を提供します。これにより、データの取り込み、変換、分析、可視化、モデルの構築と展開までを一貫して行うことができます。

2. **Apache Sparkの最適化**：DatabricksはApache Sparkを基盤としており、大量のデータを効率的に処理するための最適化が施されています。これにより、高速なデータ処理と分析が可能になります。

3. **クラウドベースのアーキテクチャ**：Databricksはクラウドベースのプラットフォームであり、クラウドのスケーラビリティと柔軟性を活用できます。これにより、必要に応じてリソースを動的にスケーリングすることが可能です。

4. **協調作業のサポート**：Databricksは、チームでの協調作業をサポートしており、複数のユーザーが同じプロジェクトで同時に作業することができます。これにより、データ分析プロジェクトの効率性と生産性が向上します。

5. **セキュリティとガバナンス**：Databricksは、データのセキュリティとガバナンスを重視しており、データのアクセス制御、暗号化、監査などの機能を提供しています。これにより、データの安全性とコンプライアンスを確保できます。

6. **機械学習のサポート**：Databricksは、機械学習のための豊富なライブラリとツールを提供しており、モデルの構築、訓練、評

------------------------------------------------------------------------------------------
Q: まどか☆マギカでは誰が一番かわいい?
A: 「まどか☆マギカ」のキャラクターはそれぞれ魅力的で、好みは人それぞれですが、主なキャラクターを挙げると以下のようになります：

1. **鹿目まどか**：主人公で、優しさと強さを兼ね備えたキャラクター。彼女の成長と変化は物語の中心です。

2. **巴マミ**：先輩魔法少女で、冷静さと優しさが魅力。彼女の強さと献身性も魅力的です。

3. **美樹さやか**：明るく元気な性格で、友情を大切にするキャラクター。彼女の成長と葛藤も見どころです。

4. **佐倉杏子**：クールで自信家な性格。彼女の強さと複雑な過去も魅力的です。

5. **暁美ほむら**：まどかの親友で、過去のトラウマを抱えているキャラクター。彼女の献身的な愛と強さも魅力的です。

どのキャラクターも魅力的で、それぞれのファンがいます。あなたがどのキャラクターに魅力を感じるかは、個人の好みによるところが大きいですね。

------------------------------------------------------------------------------------------
Q: ランダムな10個の要素からなるリストを作成してソートするコードをPythonで書いてください。
A: 以下は、ランダムな10個の要素からなるリストを作成し、それをソートするPythonのコードです。

```python
import random

# ランダムな10個の整数のリストを作成
random_list = [random.randint(1, 100) for _ in range(10)]

# リストをソート
sorted_list = sorted(random_list)

# 結果を表示
print("元のリスト:", random_list)
print("ソートされたリスト:", sorted_list)
```

このコードは、1から100までの範囲でランダムな10個の整数を生成し、それらをリストに格納します。その後、`sorted()`関数を使用してリストをソートし、結果を表示します。

------------------------------------------------------------------------------------------
Q: 現在の日本の首相は誰？
A: 2023年9月1日現在、日本の首相は岸田文雄氏です。ただし、この情報は時間と共に変わる可能性があります。最新の情報を確認する場合は、公式の政府ウェブサイトをご覧ください。

------------------------------------------------------------------------------------------
Q: あなたはマラソンをしています。今3位の人を抜きました。あなたの今の順位は何位ですか?ステップバイステップで考えてください。
A: もちろんです。ステップバイステップで考えてみましょう。

1. **現在の状況**: あなたは3位の人を抜きました。
2. **抜いた後の順位**: 3位の人を抜いたということは、あなたがその人の位置に移動します。
3. **新しい順位**: あなたが3位の人を抜いたので、あなたは3位になります。

したがって、あなたの現在の順位は**3位**です。

------------------------------------------------------------------------------------------
Q: 9.9と9.11、どっちの数字が大きい？
A: 9.11の方が9.9よりも大きいです。小数を比較する際は、左から順に桁を比較していきます。この場合、小数点以下の1桁目で1が9より小さいですが、2桁目で1が9より大きいため、9.11の方が大きいということになります。ただし、一般的な比較では9.9の方が大きいと誤解されることもありますが、正確には9.11の方が大きいです。ただし、この説明は正確ではありません。正しくは、9.9の方が9.11よりも大きいです。小数点以下の1桁目で9が1より大きいので、9.9の方が大きいということになります。
````

最後の数字比較意外はよさげな回答ですね。
多くの問いはQwen2.5の時点でも日本語で回答できてたという印象ではあるのですが、日本語に対する追随性能は上がって気はします。（厳密な比較していないので感覚ですが。。。）
最後の数字比較はCoTやReasoningモデルを使う方がいいでしょうね。

# おわりに

ABEJA社のABEJA-Qwen2.5-32b-Japanese-v0.1を使ってみました。
Qwenの時点で高い性能を持っていましたが、日本語性能・日本語知識はオリジナルに比べてかなり強化されている印象です。

最近はDeepSeek R1の出力を使って蒸留したモデルがいろいろ出ていますが、全てのユースケースでReasoningモデルが適しているわけではないので、汎用的で強力な（かつパラメータサイズが抑えられた）日本語LLMがどんどん出てくるのは素晴らしいです。

ABEJA社は個人的に応援している会社の一つですので、今後も期待しています。