nikkie-ftnextの日記

イベントレポートや読書メモを発信

Apple Silicon・CPUでphi-3(Phi-3-mini-4k-instruct-gguf)を動かす

はじめに

ユーフォ3期4話、めっちゃよかった。すっごいよかった😭 nikkieです

最近登場したphi-3、気になったので触りました。

目次

届いたphi-3の興奮

Llama 3が登場したばかりですが、phi-3への興奮の声を観測1

phi-1は「Textbooks Are All You Need」論文で提案されたモデルです。
それの3代目ってことなのかな(2代目も探してみなきゃ)

phi-1 is a Transformer-based model with 1.3B parameters, (略) using a selection of “textbook quality” data from the web (6B tokens) and synthetically generated textbooks and exercises with GPT-3.5 (1B tokens)

Phi-3-mini-4k-instruct-ggufを動かす

Hugging Faceを見ると、複数の方法が案内されます。

ollamaで動かす

ノーコードで動かす方法です。

macOS向けのGUIアプリケーションからコマンドラインを設定しました2
phi-3のHugging Faceページではcurlで導入する方法も案内されています。

curl -fsSL https://ollama.com/install.sh | sh
% ollama --version
ollama version is 0.1.32

https://ollama.com/library/phi3:3.8b-mini-instruct-4k-q4_K_M を指定します。
latest, 3.8b, instruct, miniというタグもありますが、ハッシュが同一なので中身は今回指定するタグと同じと思われます。

% ollama run phi3:3.8b-mini-instruct-4k-q4_K_M
>>>

(モデル(2.3GB)がダウンロードされる待ち時間がありました)

Hugging Faceの例を入れてみます。
中世の騎士にインターネットを説明すると?

>>> How to explain Internet to a medieval knight?
Lady/Sir, imagine the world you know as our kingdom.

1600文字程度出力されました。
出力は速くてすごいですね。快適です

訳した日本語も入れたところ、体感同じ速さで日本語が返ってきました
ただ読んでみるとちょっと変なところがあります(繰り返しとか、突然の英語とか、文字化けとか)

llama-cpp-pythonを使って動かす

Pythonスクリプトからも動かしてみます。
Hugging Faceのページではllama-cpp-pythonが紹介されていました。

モデルのファイルのパスを指定するようでした。
ここで「ollamaでダウンロードしているモデルが渡せるのでは?」と企みました。
ollama runのプロンプトで/show modelfileとすると、ダウンロードしたファイルがどこにあるか分かります(FROMの行)

動作環境3

% pipx run --python python3.11 ./script_llama_cpp.py

<|user|>
How to explain Internet to a medieval knight?<|end|>
<|assistant|> To explain the concept of the Internet to a medieval knight, one must use metaphors and analogies that relate to their world. Here's how you might approach it:
(略)

量子化前のモデルをtransformersで動かす

transformersでも動かしてみます4

動作環境

  • Python 3.11.8
  • transformers 4.40.1
  • PyTorch 2.3.0

% pipx run --python python3.11 ./script_transformers.py

Good morrow, noble knight. I come before thee to share knowledge of a magical realm known as the "Internet." Imagine, if thou wilt, a vast kingdom where all the wisdom of the world is stored, and it can be accessed by any person with a device, much like a scroll or tome, but far more powerful and swift.

(略)

(下で紹介するぬこぬこさんの実装を参考にしています)

積ん読:Phi-3-mini-128k-instructもすごそう

ぬこぬこさん5が試している例、few-shotで日本語を流暢に話していました

messages = [
    {"role": "system", "content": "あなたは有益なデジタルアシスタントです。ユーザーに安全で倫理的かつ正確な情報を提供してください。"},
    {"role": "user", "content": "バナナとドラゴンフルーツを組み合わせて食べる方法を教えていただけますか?"},
    {"role": "assistant", "content": "もちろんです!バナナとドラゴンフルーツを一緒に食べる方法はいくつかあります:1. バナナとドラゴンフルーツのスムージー:バナナとドラゴンフルーツをミルクとはちみつと一緒にブレンドします。2. バナナとドラゴンフルーツのサラダ:スライスしたバナナとドラゴンフルーツをレモン汁とはちみつで和えます。"},
    {"role": "user", "content": "2x + 3 = 7 の方程式を解くことについてはどうですか?"},
]

終わりに

phi-3を触りました。
量子化したモデルをollamaやllama-cpp-pythonを介して触ったときの、テキスト生成の速さはすごかったです。

アンフェアな比較かもしれないですが、1年前に触ったOpenCALMとは出力の質が違うという体感です。
すごい時代が、来てしまいました!


  1. rasbt氏は『Python機械学習プログラミング』の著者で、勝手に師だと思っています。
  2. ロゴがかわいいですよね。もふもふ
  3. PYTHONINSPECT環境変数を指定すると、pipxが仮想環境を作る箇所でハングしているように見受けられました。なんなんだろう?
  4. NLP2024チュートリアルで知ったMPSを指定してみたのですが、macOS 12では一部機能しか使えないようでOSアップデートが促されました。このあたり理解進めながら対応したいな
  5. ぬこぬこさんの最近の記事でollamaも取り上げられています