gpt-oss を MacBook で動かしてみる

20b モデルはメモリ 16GB で動くらしい。
実行環境は
- MacBook Pro (2023)
- Apple M2 Pro
- メモリ 16GB
かなりギリギリだが 20b なら動くはず

まずは ollama で試す
Homebrew ではなく 公式サイトからダウンロードした
最新バージョンじゃないと gpt-oss には対応していないらしい
ダウンロードしたらターミナルで以下を実行
GUI もあるけど CLI のほうがなんかいい気がした
ollama run gpt-oss:20b
最初はモデルファイルのダウンロードから始まるので結構時間かかる
15GB 弱ぐらいのファイルがダウンロードされる
>>> Send a message (/? for help)
みたいなのが表示されたらようやくプロンプト入力できる
ここまででめっちゃ時間かかった
ダウンロードも長いしその後のローディングもみたいなのも超長い
体感 1時間ぐらい待った(実際は多分 5分ぐらい)
とりあえず hello.
って打って Enter したらしばらく固まった後丸ごと落ちて再起動になった

コンテキスト長を絞るとメモリ使用量を抑えられるらしい
ollama run
した状態で
/set parameter num_ctx 8192
とかするとコンテキスト長を指定できる
とりあえず 8k にしてみたら動いた
>>> こんにちは
Thinking...
The user says "こんにちは" (Hello in Japanese). Likely they want a reply in Japanese, friendly. The instructions: The user is speaking Japanese; reply in Japanese. Should ask if they have a question? The
user only says hello. We can respond with a greeting and ask how can we help. It's a simple reply. Use friendly tone.
...done thinking.
こんにちは!何かお手伝いできることがありますか?お気軽にどうぞ。
まあコンテキスト長が 8k しかないモデルとか実用性ないけどね
普通に簡単な会話ぐらいならできるけど
(初期の GPT-4 ってたしかこれぐらいで、それでも結構すごいって感じだったよね)
あとめちゃくちゃ遅い
2~3 tps ぐらい
けどまあまあ賢い気がする

安定しない場合は、GPU を使用するレイヤー数を調整するという手もあるらしい
/set parameter num_gpu 18
たしかにちょっと落ちにくくなった気がする?気のせいかも
その分より遅くなるっぽいけど、すでに十分遅いからわからん

ollama はなんか実装の都合上遅いらしい?とかいう話を見たので llama.cpp も試してみる
こちらも最新バージョンが必要なので GitHub から clone して手元でビルドする
git clone git@github.com:ggml-org/llama.cpp.git
cd llama.cpp
README に従ってビルドする
cmake が必要なので Homebrew とかで入れておく
mac の場合は普通にビルドすれば良いみたい
cmake -B build
cmake --build build --config Release
モデルは openai のやつじゃなくて llama.cpp のやつっぽい
起動
build/bin/llama-cli -hf ggml-org/gpt-oss-20b-GGUF -c 8192 -ngl 18
やっぱりコンテキスト長と GPU レイヤーの調整は必要
バーッとログみたいなのが出て、>
が表示されたらプロンプト入力できる
たしかにめっちゃはやい
速度でいうとかなり実用的なレベルな感じする
> こんにちは
<|channel|>analysis<|message|>The user says "こんにちは" (Hello). They likely want a greeting in response. The conversation is Japanese. The user says "こんにちは". The assistant should respond appropriately, in Japanese. Probably a friendly reply. "こんにちは!" Or "こんにちは!いかがですか?" The user might want a response. There's no conflict with the policies. So we can respond in Japanese.<|start|>assistant<|channel|>final<|message|>こんにちは!今日はどんなご用件でしょうか?
レスポンスは生のまま表示されてそう
特殊トークンみたいなのが見えている
ollama はパースして整形してくれていたんだな

はやいのはいいけど、なんかバカじゃないか?
ollama のときはもっと賢かった気がするぞ、と思ってもう一度 ollama で試してみたら、やっぱり賢さ違う気がする
llama.cpp は速度と引き換えに賢さを犠牲にしてしまったのか?
量子化の具合とかが何か違うのか、そういえば reasoning effort 的なのもなんかあったな
指定する方法わからないけど、デフォルト値が ollama のほうが高かったりするのか