Mistral社のMistral Small 3をDatabricks上で試してみる

いろんなモデル触りたいシリーズその2。

# 導入

先日、Mistral社がMistralシリーズの最新モデル、Mistral Small 3を公開しました。

https://mistral.ai/news/mistral-small-3/

Apache 2.0ライセンスでリリースされた、パラメータサイズ24BのLLMであり、以下で公開されています。

https://huggingface.co/mistralai/Mistral-Small-24B-Instruct-2501

モデルサイズ比での高い性能をうたっており、Llama 3.3 70BやQwen 32Bなどの大型モデルに匹敵する性能でかつ低いレイテンシを強みとしています。

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

https://huggingface.co/mmnga/Mistral-Small-24B-Instruct-2501-gguf

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

# 試してみる

ノートブックを作成し、必要なパッケージをインストール。
今回はvLLMを利用します。

```python
%pip install -U flash-attn --no-build-isolation
%pip install vllm==0.7.1

dbutils.library.restartPython()
```

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

```python
from vllm import LLM
from vllm.sampling_params import SamplingParams

path = "/Volumes/training/llm/model_snapshots/models--mmnga--Mistral-Small-24B-Instruct-2501-gguf/Mistral-Small-24B-Instruct-2501-Q4_K_M.gguf"
from vllm import LLM, SamplingParams

llm = LLM(
    model=path,
    max_model_len=8_000
)
```

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

```python
def convert_to_conversation(prompt):
    return {"role": "user", "content": prompt}

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

sampling_params = SamplingParams(
    temperature=0.5, 
    max_tokens=8_000,
    repetition_penalty=1.1
)

results = [llm.chat([c], sampling_params=sampling_params) for c in conversations]

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

````md:出力結果
Processed prompts: 100%|██████████| 1/1 [00:02<00:00,  2.04s/it, est. speed input: 5.40 toks/s, output: 24.07 toks/s]
Processed prompts: 100%|██████████| 1/1 [00:37<00:00, 37.88s/it, est. speed input: 0.45 toks/s, output: 25.45 toks/s]
Processed prompts: 100%|██████████| 1/1 [00:18<00:00, 18.34s/it, est. speed input: 1.04 toks/s, output: 25.52 toks/s]
Processed prompts: 100%|██████████| 1/1 [00:13<00:00, 13.02s/it, est. speed input: 2.53 toks/s, output: 24.50 toks/s]
Processed prompts: 100%|██████████| 1/1 [00:03<00:00,  3.22s/it, est. speed input: 4.03 toks/s, output: 23.58 toks/s]
Processed prompts: 100%|██████████| 1/1 [00:05<00:00,  5.70s/it, est. speed input: 7.38 toks/s, output: 24.06 toks/s]
Processed prompts: 100%|██████████| 1/1 [00:04<00:00,  4.23s/it, est. speed input: 5.20 toks/s, output: 24.35 toks/s]------------------------------------------------------------------------------------------
Q: Hello, what is your name?
A: I don't have a name. I'm here to assist you with any questions or problems you might have. If you'd like, you can give me a name to make our conversation more personalized! What would you prefer to call me?

------------------------------------------------------------------------------------------
Q: Databricksとは何ですか？詳細に教えてください。
A: Databricksは、クラウドベースのデータ分析プラットフォームで、ビッグデータ処理と機械学習を円滑に行うためのツールとサービスを提供しています。Databricksは、Apache Sparkを基盤としており、データエンジニアリング、データサイエンス、機械学習、およびBI（ビジネスインテリジェンス）など、さまざまなデータ関連の作業を統合的にサポートします。

### 主要な特徴

1. **Unified Analytics Platform**:
   - Databricksは、データの取得、処理、分析、機械学習モデルのトレーニングとデプロイまで、すべてのデータワークフローを一つのプラットフォーム上で実現できます。

2. **Apache Spark**:
   - Apache Sparkは、大規模データセットの高速な処理を行うためのオープンソースの分散コンピューティングフレームワークです。DatabricksはSparkをベースにしているため、Sparkの強力な機能を活用しつつ、使いやすさを向上させたインターフェースを提供しています。

3. **Notebooks**:
   - Databricks Notebooksは、Python、R、Scala、SQLなどの言語を使用してコードを書くことができるインタラクティブなノートブック環境です。これにより、データサイエンティストやデータエンジニアは、データの探索、分析、可視化を行うことができます。

4. **Data Engineering**:
   - データパイプラインの設計と管理が容易になります。Databricksは、データのETL（抽出、変換、ロード）プロセスを自動化するためのツールを提供しており、データの質を保ちながら効率的に処理できます。

5. **Machine Learning**:
   - データサイエンティストは、MLflowを利用して機械学習モデルのトレーニング、評価、デプロイを簡単に行うことができます。MLflowは、Databricksによって開発されたオープンソースの機械学習ライフサイクル管理ツールです。

6. **Collaboration**:
   - チームでのコラボレーションを促進するための機能があり、複数のユーザーが同じプロジェクトを同時に編集・実行することができます。バージョン管理もサポートされており、変更履歴を追跡することができます。

7. **Security and Governance**:
   - データのセキュリティとガバナンスを重視しており、データアクセス制御、監査ログ、コンプライアンス管理など、さまざまなセキュリティ機能を提供しています。

8. **Integration**:
   - 他のクラウドサービスやデータソースとの統合が容易であり、AWS、Azure、Google Cloudなどの主要なクラウドプロバイダと互換性があります。

### 使用シナリオ

- **データエンジニアリング**: 大量のデータを効率的に処理し、データパイプラインを構築する。
- **データサイエンス**: データの探索、分析、機械学習モデルのトレーニングとデプロイを行う。
- **ビジネスインテリジェンス**: ビジネスの意思決定を支援するためのレポートやダッシュボードを作成する。
- **ETL/ELT**: データの抽出、変換、ロード（またはローディング先での変換）を自動化する。

Databricksは、データ駆動型企業がデータを有効に活用し、ビジネスの価値を最大化するための強力なツールセットを提供しています。

------------------------------------------------------------------------------------------
Q: まどか☆マギカでは誰が一番かわいい?
A: 『魔法少女まどか☆マギカ』（Madoka Magica）は、多くのキャラクターが人気を博しており、それぞれに魅力的な点があります。以下にいくつかの主なキャラクターとその特徴を紹介します。

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)]
print("元のリスト:", random_list)

# リストをソート
sorted_list = sorted(random_list)
print("ソートされたリスト:", sorted_list)
```

このコードでは、`random.randint(1, 100)` を使って1から100の間のランダムな整数を生成し、リストに追加します。その後、`sorted()` 関数を使用してリストをソートします。

実行すると、以下のように出力されます（具体的な値は毎回異なります）：

```
元のリスト: [45, 23, 87, 9, 62, 12, 34, 56, 78, 3]
ソートされたリスト: [3, 9, 12, 23, 34, 45, 56, 62, 78, 87]
```

このコードを実行することで、ランダムな要素を含むリストが生成され、ソートされることを確認できます。

------------------------------------------------------------------------------------------
Q: 現在の日本の首相は誰？
A: 2023年10月の時点で、日本の首相は岸田文雄です。彼は2021年10月4日に第100代内閣総理大臣に就任しました。最新情報を確認するためには、信頼できるニュースソースや公式ウェブサイトを参照してください。

------------------------------------------------------------------------------------------
Q: あなたはマラソンをしています。今3位の人を抜きました。あなたの今の順位は何位ですか?ステップバイステップで考えてください。
A: マラソンをしているときに、今3位の人を抜いた場合、あなたの現在の順位を考えるためには以下のステップを踏むことができます。

1. **現在の状況を確認**: あなたが3位の人の前に出たということは、その人が4位になりました。
2. **自分の順位を確認**: 3位の人を抜いた時点で、あなた自身もその人の後ろから一番前の位置に移動します。つまり、あなたが3位になります。

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

------------------------------------------------------------------------------------------
Q: 9.9と9.11、どっちの数字が大きい？
A: 9.9と9.11を比較すると、9.11の方が大きいです。小数点以下の桁数が同じ場合、より大きな数字の方が大きくなります。

- 9.9は9と0.9から成ります。
- 9.11は9と0.11から成ります。

したがって、9.11の方が9.9よりも大きいです。

````

日本語モデルではないため知識的には不十分な面もありますが、Qwenと同等性能ありそうな回答内容です。
最後の数字比較は間違えましたが、このクラスだとCoTしない場合はよくあるケースだと思います。

# おわりに

Mistral社のMistral Small 3を使ってみました。
Mistralは最近あまりプレゼンスが高くないなという印象を持ってたのですが、きっちりと優秀なモデルを公開しているのはすごいと思います。今後も期待しています。