Phi-4 を一番楽に自分の PC で動かす


# はじめに
合成データセット、フィルタリングされたパブリック ドメインの Web サイトのデータ、学術書や Q&A データセットを組み合わせて構築された最先端のオープン モデルである、Phi-4 が OSS で公開されました！

https://huggingface.co/microsoft/phi-4

とはいえ、Hugging Face にあるモデルはおよそ 30GB と結構でかくて、自分のマシンで動かすにはちょっと大変。どうにか 4bit 量子化かけたりなんだりして自分のマシンで動かせないかなーと思っていたら、Ollama にまさに Q4_K_M 量子化済みのモデルが置いてあったので、それを有難く拝借したときの作業メモを共有します。

https://ollama.com/library/phi4

# 手順
## 動かした環境
### 自前のゲーミング PC
- Windows 11 Pro
- CPU : Intel Core i9-14900HX
- Memory : 64GB
- GPU : NVIDIA GeForce RTX 4080 Laptop GPU

### Hyper-V 上に立てた Windows VM
- Windows 11 Pro
- CPU : ホストの Intel Core i9-14900HX を 16 Core 分割り当て
- Memory : 12GB

## Ollama のインストール
Ollama を以下のサイトからダウンロードしてインストールします。

https://ollama.com/

Windows 環境でしたら、Windows Installer 形式でインストーラーが提供されていますので、特に苦労をすることもなくサクッとインストールを完了できるはずです。他の OS については試していませんが、ダウンロードサイトの記述は非常にシンプルでしたので、他の OS でも簡単にセットアップできるかなと思います。

## Phi-4 モデルのダウンロードならびに動作チェック
Ollama をインストールしたマシンでコマンドプロンプトを起動します。
（`Windows キー` + `R` → `cmd` で起動するのが簡単かと！）

開いたコマンドプロンプトで以下のコマンドを実行。

```cmd
ollama run phi4
```

:::note info
ダウンロードされてくるモデルをメモリ上に展開する際に 10GB 強のサイズとなるため、CPU で動作させる場合にはメモリにそれ以上の空き容量が、GPU で動作させる場合には GPU のメモリがそれ以上のサイズでないとエラーになるはずです。
:::

上手くモデルがダウンロードされたら、以下のプロンプトが表示されるはず。

```cmd
>>> Send a message (/? for help)
```

このプロンプトが表示されたら、何かメッセージを送ってみましょう。GPU アクセラレーションがある環境では割とサクサクと返事が返ってくると思います。

```cmd
>>> こんにちは！
こんにちは！どのようにお手伝いできるか教えてください。何か質問があれば、お気軽にどうぞ。

>>> Send a message (/? for help)
```

これだけで Phi-4 をローカルで使えるようになってしまいました！これはありがたすぎる。

## REST API から呼び出してみる
実は Ollama が実行されている環境では、localhost:11434 で REST API も公開されています。

例えば、[VS Code](https://code.visualstudio.com/) の [REST Client 拡張機能](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) を使って、以下のようなリクエストを投げると Phi-4 から応答を得ることが出来ます。

```
POST http://localhost:11434/api/generate
Content-Type: application/json

{
  "model": "phi4",
  "prompt":"こんにちは！"
}
```

得られる応答はこんな感じ。

```
HTTP/1.1 200 OK
Content-Type: application/x-ndjson
Date: Mon, 13 Jan 2025 17:45:34 GMT
Connection: close
Transfer-Encoding: chunked

{"model":"phi4","created_at":"2025-01-13T17:45:34.707469Z","response":"こんにちは","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:34.7408504Z","response":"！","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:34.7782793Z","response":"ど","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:34.8033229Z","response":"の","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:34.8351905Z","response":"よ","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:34.8658873Z","response":"う","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:34.8987196Z","response":"に","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:34.9313839Z","response":"お","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:34.9644937Z","response":"手","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.0269691Z","response":"伝","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.0597588Z","response":"い","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.0873883Z","response":"で","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.1181866Z","response":"き","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.1435606Z","response":"ます","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.1726162Z","response":"か","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.201102Z","response":"？","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.2302572Z","response":"何","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.2623838Z","response":"か","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.3220405Z","response":"質","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.3527765Z","response":"問","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.3796098Z","response":"が","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.4078424Z","response":"あ","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.4378446Z","response":"る","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.4672312Z","response":"場","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.495122Z","response":"合","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.5257292Z","response":"や","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.5560545Z","response":"情","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.5846013Z","response":"報","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.6146763Z","response":"を","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.6743113Z","response":"探","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.7032794Z","response":"して","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.732617Z","response":"い","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.762973Z","response":"る","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.7918269Z","response":"場","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.8229481Z","response":"合","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.8543233Z","response":"は","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.8875411Z","response":"、","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:35.9521209Z","response":"遠","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:36.0511086Z","response":"慮","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:36.0835336Z","response":"な","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:36.1153476Z","response":"く","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:36.1818494Z","response":"教","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:36.2090748Z","response":"え","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:36.2416192Z","response":"て","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:36.2731894Z","response":"ください","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:36.3058464Z","response":"。","done":false}
{"model":"phi4","created_at":"2025-01-13T17:45:36.3396729Z","response":"","done":true,"done_reason":"stop","context":[100264,882,100266,198,90115,6447,100265,198,100264,78191,100266,198,90115,6447,67645,16144,57980,30297,20230,33334,46034,17885,251,16995,16556,50834,33541,32149,11571,99849,32149,83812,103,99397,29295,30591,30369,75267,40862,71289,40474,78943,30512,19012,95,39926,16995,30369,75267,40862,15682,5486,30250,254,162,227,106,26854,47884,8067,247,58942,38144,72315,1811],"total_duration":2037907800,"load_duration":63368600,"prompt_eval_count":12,"prompt_eval_duration":263000000,"eval_count":54,"eval_duration":1709000000}
```

# まとめ
これで、自前のマシンで Ollama を使って簡単に Phi-4 を動かすことができるようになりました！しかも REST API までついています！

…ということは、70B 程度のパラメーター数を持つ LLM と同等の性能を持つと言われるモデルを、持ち歩き出来る PC でも動かすことが出来て、Ollama の REST API 機能で別のアプリケーションやライブラリからもローカルで呼び出しできる環境がサクッと整ってしまうということで、今後色々活用していきたくなってしまいますね！

Phi-4 は GPQA や MATH などの大学院レベルの知識と論理的思考を必要とするようなデータセットを使ったベンチマークや、HumanEval などのコーディング能力に関するベンチマークで高いスコアをマークしていることから、エッジデバイスやローカルデバイスでやれることの幅がグッと増えるんじゃないかと期待しています。

https://techcommunity.microsoft.com/blog/aiplatformblog/introducing-phi-4-microsoft%E2%80%99s-newest-small-language-model-specializing-in-comple/4357090

# 参考文献
## Ollama 関連

https://ollama.com/

https://ollama.com/library/phi4

https://github.com/ollama/ollama/blob/main/docs/api.md

## Phi-4 関連

https://techcommunity.microsoft.com/blog/aiplatformblog/introducing-phi-4-microsoft%E2%80%99s-newest-small-language-model-specializing-in-comple/4357090

https://huggingface.co/microsoft/phi-4

## VS Code 関連

https://code.visualstudio.com/

https://marketplace.visualstudio.com/items?itemName=humao.rest-client