Mac Studio M3 UltraでDeepSeek v3 0324を使ってRoo Codeを動かす

# 背景・目的

- DeepSeek V3 0324が精度が良いとのこと
- Mac Studio M3 Ultraの512GBのメモリであれば、4bit量子化版を動かせるのでは？と思い試してみた

# 結論

- [DeepSeekV3はmlx_lm](https://huggingface.co/mlx-community/DeepSeek-V3-0324-4bit)を使って動かすことができた
    - [unslothのQ4_K_XL](https://huggingface.co/unsloth/DeepSeek-V3-0324-GGUF)は、llama.cppで試してみたもののうまく動かなかった（`====`がずっと生成された）
- mlx_lmでOpenAI互換のサーバーは[mlx_lm/server.py](https://github.com/ml-explore/mlx-lm/blob/main/mlx_lm/server.py)を使って起動できた
    - プロンプトキャッシュなども有効化されている

# 詳細

## DeepSeek-V3-0324とは

DeepSeek V3 0324は、最新のオープンソースAIモデルであり、従来のAIモデルを凌駕する性能を誇ります。このモデルは、6710億から6850億パラメータに増強され、特に論理推論、プログラミング、数学問題解決において顕著な改善が見られます。DeepSeek V3 0324は、AIアプリケーションの開発において非常に有用であり、特に以下の点で優れています。

### **主な特徴**

- **強化された推論能力**: DeepSeek V3 0324は、論理的な推論や数学的な問題解決において、前バージョンに比べて大幅に性能が向上しています。これにより、AIアシスタントやコーディング支援ツールとしての利用が期待されます。

- **フロントエンド開発の改善**: このモデルは、Tailwindを使用したUIコンポーネントの生成や、インタラクティブなゲームフロントエンドの作成においても優れた能力を発揮します。ユーザーは、自然言語での説明を入力することで、即座にHTML/CSS/JSコードを生成し、視覚的なプレビューを得ることができます。

- **大規模なコンテキストウィンドウ**: 128Kトークンのコンテキスト長を持つこのモデルは、長文の会話や文書分析においても優れたパフォーマンスを発揮します。これにより、より複雑なタスクに対応可能です。

- **オープンソースの利点**: DeepSeek V3 0324はオープンソースであり、開発者は自由に利用・改良することができます。これにより、さまざまなAI駆動のアプリケーションを迅速に構築することが可能です。

### **実用性と応用**

DeepSeek V3 0324は、チャットボットやカスタマーサービスの自動化、翻訳などのリアルタイムアプリケーションにおいても優れた性能を発揮します。特に、非推論タスクにおいては、従来のAIモデルを上回る結果を出しています。

このモデルは、AI技術の進化を象徴するものであり、開発者や企業にとって、AI駆動のソリューションを構築するための強力なツールとなるでしょう。DeepSeek V3 0324の登場により、AIの可能性はさらに広がり、さまざまな分野での応用が期待されます。

## MLX-LMとは

**MLX-LM**は、Appleシリコン上で大規模言語モデル（LLM）を生成し、ファインチューニングするためのPythonパッケージです。このパッケージは、特にMLXフレームワークと統合されており、ユーザーが簡単にLLMを操作できるように設計されています。

#### 主な機能

- **Hugging Face Hubとの統合**: 数千のLLMを単一のコマンドで簡単に使用できます。
- **モデルの量子化とアップロード**: モデルを量子化し、Hugging Face Hubにアップロードすることが可能です。
- **低ランクおよびフルモデルのファインチューニング**: 量子化されたモデルのサポートも含まれています。
- **分散推論とファインチューニング**: `mx.distributed`を使用して、分散環境での処理が可能です。


## MLX-LMを使ってDeepSeek V3 0324の動かし方

```bash
pip install mlx-lm # mlx_lmを使えるようにする
sudo sysctl iogpu.wired_limit_mb=480000 # GPUが利用できるメモリを増やす
```

以下の内容をrun.pyという名前で保存し、`python run.py`で実行するとモデルがダウンロードされ、実行できる。

```python
from mlx_lm import load, generate

model, tokenizer = load("mlx-community/DeepSeek-V3-0324-4bit")

prompt = "hello"

if tokenizer.chat_template is not None:
    messages = [{"role": "user", "content": prompt}]
    prompt = tokenizer.apply_chat_template(
        messages, add_generation_prompt=True
    )

response = generate(model, tokenizer, prompt=prompt, verbose=True)
```

ただ、データ量がかなり大きく、ダウンロードスピードが遅いため、ダウンロードに1日近くかかるので注意。

実行結果は以下

```bash
! How can I assist you today? 😊
==========
Prompt: 4 tokens, 22.313 tokens-per-sec
Generation: 12 tokens, 23.413 tokens-per-sec
Peak memory: 378.897 GB
```

## mlx-community/DeepSeek-V3-0324-4bitについて

#### データサイズ: 352GB

```bash
du -sh ~/.cache/huggingface/hub/models--mlx-community--DeepSeek-V3-0324-4bit 
352G	/Users/username/.cache/huggingface/hub/models--mlx-community--DeepSeek-V3-0324-4bit
```

#### コンテキスト長: 16384

```python
>>> from mlx_lm import load
>>> model, tokenizer = load("mlx-community/DeepSeek-V3-0324-4bit")
>>> tokenizer.model_max_length
16384
```

（この値は変更できた。）

```python
>>> model, tokenizer = load("mlx-community/DeepSeek-V3-0324-4bit", tokenizer_config={"model_max_length": 32768})
>>> tokenizer.model_max_length
32768
```

#### 待機時のメモリ利用: 350GB程度

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144584/0c92f0a9-7c80-4d79-961e-95a2322c2d85.png)

## Roo Codeで利用する

1. サーバーを立てる
    - [mlx_lm/server.py](https://github.com/ml-explore/mlx-lm/blob/main/mlx_lm/server.py)を使う
        - これを使うとプロンプトキャッシュ込みのOpenAI一部互換のサーバーが立ち上がる
    - localhost:8080で待機される
2. Roo Codeからアクセスする
    - API Provider: Ollama（OpenAI Compatibleでも良さそう）
    - Base URL: `http://localhost:8080`
    - Model ID: `mlx-community/DeepSeek-V3-0324-4bit`


# 参考資料

- [mlx-community/DeepSeek-V3-0324-4bit](https://huggingface.co/mlx-community/DeepSeek-V3-0324-4bit)
- [mlx_lm/server.py](https://github.com/ml-explore/mlx-lm/blob/main/mlx_lm/server.py)
- [How to Run DeepSeek V3-0324: Updated Weights](https://apxml.com/posts/how-to-run-deepseek-v3-0324)