🗼

Phi-4-miniのMLX-8bitモデル

2025/02/28に公開

Phi-4-mini公開

https://huggingface.co/microsoft/Phi-4-mini-instruct

Phi-4-miniモデルが公開されたので、MLXの8bitで量子化しました。

huggingfaceで公開

https://huggingface.co/kokitakeishi/Phi-4-mini-mlx-8bit

こちらに公開しています。

簡単に手順

FineTuning用の余計なライブラリのimportもありますがMLXで8bit量子化するところまでの手順です。
google colabratoryのL4でやりました。

ライブラリのインポート

!pip install transformers accelerate torch bitsandbytes datasets huggingface_hub peft

FineTuningのライブラリもありますが、import

import sys
import torch
import os
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    pipeline,
    TrainingArguments,
    Trainer,
    BitsAndBytesConfig
)
from datasets import Dataset
from huggingface_hub import snapshot_download
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training, PeftModel

torch.manual_seed(0)

モデルをhugginggaceからダウンロード

model_name = "microsoft/Phi-4-mini-instruct"

# モデルをダウンロード
model_cache_path = snapshot_download(repo_id=model_name, cache_dir=".")

# 4bit量子化の設定
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type='nf4',
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.float16
)

## モデルをロード(4bit量子化を使用)
model = AutoModelForCausalLM.from_pretrained(
    model_cache_path,
    device_map="auto",
    trust_remote_code=True,
    quantization_config=bnb_config,
    torch_dtype=torch.float16,
)

tokenizer = AutoTokenizer.from_pretrained(model_cache_path, trust_remote_code=True)

モデルとトークナイザーをロードする必要はないですが、試しに推論したり、
torchのバージョンが古いとロード時にエラーになったりするので、ロードした方が良いかと。


こんな感じでモデルがダウンロードされる。

model

モデルの中身を見てみる。4bitに量子化しているからLinear4bitになってる。。

Phi3ForCausalLM(
  (model): Phi3Model(
    (embed_tokens): Embedding(200064, 3072, padding_idx=199999)
    (layers): ModuleList(
      (0-31): 32 x Phi3DecoderLayer(
        (self_attn): Phi3Attention(
          (o_proj): Linear4bit(in_features=3072, out_features=3072, bias=False)
          (qkv_proj): Linear4bit(in_features=3072, out_features=5120, bias=False)
        )
        (mlp): Phi3MLP(
          (gate_up_proj): Linear4bit(in_features=3072, out_features=16384, bias=False)
          (down_proj): Linear4bit(in_features=8192, out_features=3072, bias=False)
          (activation_fn): SiLU()
        )
        (input_layernorm): Phi3RMSNorm((3072,), eps=1e-05)
        (post_attention_layernorm): Phi3RMSNorm((3072,), eps=1e-05)
        (resid_attn_dropout): Dropout(p=0.0, inplace=False)
        (resid_mlp_dropout): Dropout(p=0.0, inplace=False)
      )
    )
    (norm): Phi3RMSNorm((3072,), eps=1e-05)
    (rotary_emb): Phi3RotaryEmbedding()
  )
  (lm_head): Linear(in_features=3072, out_features=200064, bias=False)
)

ちなみにphi-3.5-miniのmodel

Phi3ForCausalLM(
  (model): Phi3Model(
    (embed_tokens): Embedding(32064, 3072, padding_idx=32000)
    (embed_dropout): Dropout(p=0.0, inplace=False)
    (layers): ModuleList(
      (0-31): 32 x Phi3DecoderLayer(
        (self_attn): Phi3Attention(
          (o_proj): Linear4bit(in_features=3072, out_features=3072, bias=False)
          (qkv_proj): Linear4bit(in_features=3072, out_features=9216, bias=False)
          (rotary_emb): Phi3LongRoPEScaledRotaryEmbedding()
        )
        (mlp): Phi3MLP(
          (gate_up_proj): Linear4bit(in_features=3072, out_features=16384, bias=False)
          (down_proj): Linear4bit(in_features=8192, out_features=3072, bias=False)
          (activation_fn): SiLU()
        )
        (input_layernorm): Phi3RMSNorm()
        (resid_attn_dropout): Dropout(p=0.0, inplace=False)
        (resid_mlp_dropout): Dropout(p=0.0, inplace=False)
        (post_attention_layernorm): Phi3RMSNorm()
      )
    )
    (norm): Phi3RMSNorm()
  )
  (lm_head): Linear(in_features=3072, out_features=32064, bias=False)
)

ほとんど一緒に見える。

!pip install -U mlx_lm

mlx_lmをインストール。mlx_lmの更新も激しいのでバージョンは最新が良い。

8bitでconvertする。

!mlx_lm.convert --hf-path models--microsoft--Phi-4-mini-instruct/snapshots/4b00ec8714b0cb224e4fb33380cbf0919f177f3e --mlx-path "phi-4-mini-ft-lora_q4" --q-bits 8 --quantize

こちらをhuggingfaceにあげましたので、お試しにどうぞ。

実行してみる

iOSのjupyter notebook上でお試しください。

!pip install -U mlx_lm

transformerを最新にした方が良いです。

from mlx_lm import load, generate
model, tokenizer = load('./phi-4-mini-ft-lora_q8/')
response = generate(
    model,
    tokenizer,
    prompt='Phi-4-miniは従来のPhi-3.5-miniよりどこが優れている?',
    verbose=True,
    max_tokens=512,
)

Phi-4-mini-mlx-8bitの出力

==========
2023年の最新情報に基づいて、Phi-4-miniとPhi-3.5-miniの比較を行います。これらのデバイスは、2023年の時点で、さまざまな側面で競争しています。

1. 画面サイズ: 4インチのPhi-4-miniは、4インチのPhi-3.5-miniよりも小さい画面サイズを持っています。これは、4インチの画面が3.5インチの画面よりも小さいことを意味します。

2. 画面解像度: 4インチの画面は、3.5インチの画面よりも高い解像度を提供する可能性があります。これは、4インチの画面が3.5インチの画面よりも多くのピクセルを持っていることを意味します。

3. 画面解像度 (PPI): 4インチの画面は、3.5インチの画面よりも高いピクセルあたりの面積 (PPI) を提供する可能性があります。これは、4インチの画面が3.5インチの画面よりもより詳細な画像を提供することを意味します。

4. 画面解像度 (PPI): 4インチの画面は、3.5インチの画面よりも高いピクセルあたりの面積 (PPI) を提供する可能性があります。これは、4インチの画面が3.5インチの画面よりもより詳細な画像を提供することを意味します。

5. 画面解像度 (PPI): 4インチの画面は、3.5インチの画面よりも高いピクセルあたりの面積 (PPI) を提供する可能性があります。これは、4インチの画面が3.5インチの画面よりもより詳細な画像を提供することを意味します。

6. 画面解像度 (PPI): 4インチの画面は、3.5インチの画面よりも高いピクセルあたりの面積 (PPI) を提供する可能性があります。これは、4インチの画面が3.5インチの画面よりもより詳細な画像を提供することを意味します。

7. 画面解像度
==========
Prompt: 23 tokens, 171.047 tokens-per-sec
Generation: 512 tokens, 37.715 tokens-per-sec
Peak memory: 8.136 GB

同じ文章を繰り返している?し、Phi-4-miniをデバイスと勘違いしている。

Phi-3.5-mini-mlx-8bitの出力

==========


Phi-4-miniは、Phi-3.5-miniの改良版であり、その主な改良点は以下の通りです:

1. 高速化:Phi-4-miniはPhi-3.5-miniのパフォーマンスを大幅に向上させ、特に大規模なデータセットや複雑な計算を処理する際に優れた速度を実現します。
2. 効率性:Phi-4-miniはより効率的なメモリ管理とリソース使用を実現し、より少ないリソースで同じ結果を達成することができます。これにより、コスト削減やシステムのスケーラビリティが向上します。
3. 機能性:Phi-4-miniは新しい機能や改良された機能を含むことで、より多くのタスクやアプリケーションに対応できるようになります。
4. スケーラビリティ:Phi-4-miniは、将来のニーズに対応するために拡張可能であり、より複雑なタスクや増加するデータ量に対応できるように設計されています。

要約すると、Phi-4-miniはPhi-3.5-miniの改良版であり、高速化、効率性、機能性、スケーラビリティの向上を図っています。これにより、より効果的で柔軟なソリューションを提供
==========
Prompt: 34 tokens, 199.993 tokens-per-sec
Generation: 512 tokens, 37.779 tokens-per-sec
Peak memory: 8.136 GB

phi-3.5-miniの方が良さそう。

response = generate(
    model,
    tokenizer,
    prompt='In what ways is the Phi-4-mini superior to the conventional Phi-3.5-mini?',
    verbose=True,
    max_tokens=512,
)

英語で聞いてみた、Phi-4-mini-mlx-8bitの結果

==========
The Phi-4-mini is an advanced version of the Phi-3.5-mini, and it offers several improvements and enhancements over its predecessor. Here are some of the key ways in which the Phi-4-mini is superior to the Phi-3.5-mini:

1. Enhanced Performance: The Phi-4-mini is designed to provide better performance in various tasks, including natural language understanding, reasoning, and problem-solving. It is more efficient and can handle more complex tasks with greater accuracy.

2. Improved Efficiency: The Phi-4-mini is more efficient in terms of computational resources, which means it can perform tasks more quickly and with less computational power compared to the Phi-3.5-mini.

3. Advanced Capabilities: The Phi-4-mini has been designed with more advanced capabilities, including better understanding of context, reasoning, and problem-solving. It can understand and process more complex tasks and provide more accurate and relevant responses.

4. Better Integration: The Phi-4-mini is designed to be more easily integrated with other systems and applications, making it more versatile and adaptable to various use cases.

5. Improved User Experience: The Phi-4-mini is designed to provide a better user experience, with more accurate and relevant responses, and a more natural and human-like interaction.

In summary, the Phi-4-mini is a more advanced and efficient version of the Phi-3.5-mini, with improved performance, efficiency, and capabilities, making it a more powerful and versatile tool for various applications.
==========
Prompt: 20 tokens, 109.367 tokens-per-sec
Generation: 304 tokens, 38.538 tokens-per-sec
Peak memory: 8.152 GB

翻訳結果

Phi-4-miniはPhi-3.5-miniの高度版であり、その前身に比べていくつかの改善点や強化が施されています。Phi-4-miniがPhi-3.5-miniよりも優れている主な点は以下の通りです。

1. **性能の向上**  
 Phi-4-miniは、自然言語理解、推論、問題解決など、さまざまなタスクにおいてより高いパフォーマンスを発揮するよう設計されています。効率が向上しており、より複雑なタスクをより正確に処理できます。

2. **効率性の改善**  
 Phi-4-miniは計算資源の利用効率が向上しており、Phi-3.5-miniと比べて、より迅速に、かつ少ない計算力でタスクを実行できます。

3. **高度な機能**  
 Phi-4-miniは、文脈の理解、推論、問題解決などの高度な能力が強化されており、より複雑なタスクを理解し処理できるため、より正確で関連性の高い応答を提供します。

4. **優れた統合性**  
 Phi-4-miniは他のシステムやアプリケーションと容易に統合できるよう設計されているため、さまざまなユースケースに対して柔軟かつ適応性があります。

5. **ユーザー体験の向上**  
 Phi-4-miniは、より正確で関連性の高い応答や、自然で人間らしい対話を提供することで、より良いユーザー体験を実現するよう設計されています。

まとめると、Phi-4-miniはPhi-3.5-miniのより高度で効率的なバージョンであり、性能、効率性、機能面の改善により、さまざまな用途に対してより強力で多用途なツールとなっています。

英語はそれっぽいなー、日本語対応がうまくいってないのかも。

まとめ

Phi-4-miniを検証していきたいと思います。

ヘッドウォータース

Discussion