Phi-3をOllamaを使ってローカルで動作させる

# はじめに
Microsoftによって開発された小型言語モデルであるPhi-3と、大規模言語モデルをローカルで簡単にセットアップし実行できるツールOllamaについてまとめます。Phi-3はその軽量ながら高性能な特性を持ち、Ollamaはこれらのモデルを手軽に活用するためのインターフェースを提供します。この組み合わせにより、開発者はパワフルなAIツールを手元で直接コントロールすることが可能になります。記事では、これらの技術の基本的な特徴、セットアップ方法、そして具体的な使用例までをカバーします。

## イントロダクション
### Phi-3モデルとは何か？
[Phi-3](https://azure.microsoft.com/en-us/blog/introducing-phi-3-redefining-whats-possible-with-slms/)はMicrosoftによって開発されたオープンな小型言語モデル（SLM）です。このモデルは、パラメータ数が小さく非常に軽量でありながら、さまざまな言語、推論、コーディング、数学のベンチマークで類似サイズの他のモデルを凌駕する優れた性能を提供します。
小型言語モデル（SLM）は、リソースに制約のある環境 (デバイス上およびオフライン環境での推論など)での利用、超低レイテンシが求められるシナリオなど、これまで大規模言語モデルでは適用が難しかったユースケースに対して柔軟に対応できることが期待されています。

最新リリースであるPhi-3-miniは、3.8Bのパラメータを持つ言語モデルで、Azure AI Studio、Hugging Face、そしてOllamaプラットフォームで利用可能です。このモデルは、4Kトークンと128Kトークンのコンテキスト長をサポートする2つのバリアントを提供し、長いコンテキストウィンドウでも品質を維持する能力を備えています。

また、ONNX Runtimeで最適化されており、Windows DirectMLを含むクロスプラットフォームでGPU、CPU、モバイルデバイスに対応しています。NVIDIA GPUに最適化されたこのモデルは、標準APIインターフェースを持つNVIDIA NIMマイクロサービスとしても利用可能です。


### Ollamaの紹介とその重要性
[Ollama](https://ollama.com/) は、ユーザーが大規模言語モデルをローカルで簡単にセットアップして実行できる非常に便利なツールです。Ollama を使用すると、ユーザーは Llama 2 などの言語モデルをローカルで実行でき、より高速で効率的な処理機能を提供できます。セットアップとインターフェイスも非常にシンプルで、ユーザーが選択した言語モデルをすばやく簡単に立ち上げて実行できます。

記載時点では、macOS, Linux が対応しており、Windows版もプレビューとなっています。

ちなみに、Ollamaは、[llama.cpp](https://github.com/ggerganov/llama.cpp) というローカルLLMフレームワークをバックエンドで利用しています。llama.cppは、CPU だけでLLMを動作させるように最適化してくれるプラットフォームでこちらも非常によく利用されているツールかと思います。

## 環境構築
### 実行環境
- PC: Surface Laptop 5
- OS: Windows 11
- CPU: 12th Gen Intel(R) Core(TM) i7-1265U   2.70 GHz
- メモリ: 32GB


### Ollamaのインストール方法
OSごとにインストール方法が異なりますが、どれも非常に簡単です。[こちら](https://github.com/ollama/ollama/tree/main?tab=readme-ov-file#ollama)にインストール方法が記載されています。
私のPCはWindowsですが、Windowsは現在プレビュー版のため、WSLを使ってLinux版を利用する手順を記載します。


```sh
curl -fsSL https://ollama.com/install.sh | sh
```

## Phi-3の基本的な使い方

### チャットインターフェースでの実行
以下のコマンドを実行するだけで、モデルのダウンロードし、CLIでチャットセッションを開始することができます。

```sh
ollama run phi3
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660892/4e1b092b-57bf-a201-3942-7de264967eb3.png)


Phi モデルは、主に英語のテキストでトレーニングされているため、英語以外の言語では、パフォーマンスが低下するようですが、日本語のプロンプトにも対応はしています。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660892/f3cf28fa-ed9a-3329-f9f3-398cce181533.png)

マシンスペックには当然依存すると思いますが、ローカル実行でも十分使えるくらいのレイテンシになっていました。

### APIでの実行
Ollamaにはモデルを実行・管理するための[REST API](https://github.com/ollama/ollama/blob/main/docs/api.md)もあります。前の手順で実施した `ollama run phi3` を実行すると裏でAPIエンドポイントが作成され、APIで様々な操作を行えるようになります。本番運用においてはAPIで実行したいというケースもあると思うので非常にありがたいです。


以下は、Chat CompletionのAPIです。
```sh
curl http://localhost:11434/api/chat -d '{
  "model": "phi3",
  "messages": [
    { "role": "user", "content": "大規模言語モデルの代表的なユースケースは？" }
  ]
}'
```

デフォルトで、Streaming 形式になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660892/813956cd-ce77-e855-f475-f26bf45527bd.png)

Streaming を無効にしたい場合は、`"stream": false` を指定します。
```sh
curl http://localhost:11434/api/chat -d '{
  "model": "phi3",
  "messages": [
    { "role": "user", "content": "大規模言語モデルの代表的なユースケースは？" }
  ],
  "stream": false
}'
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660892/11ab5633-aae0-2e5b-69a3-a33b10ff3299.png)



### プロンプトのカスタマイズ
Ollamaライブラリのモデルはプロンプトをカスタマイズすることができます。

任意のディレクトリに `Modelfile` を作成します。ここでは、AIに関する質問にのみ回答をさせるようにシステムメッセージを指定します。
```
FROM phi3

# set the temperature to 0 [higher is more creative, lower is more coherent]
PARAMETER temperature 0

# set the system message
SYSTEM """
You are an expert on AI; answer only questions about AI. Do not answer any other questions.
"""
```

個人的な感想ですが、Ollama は Docker の思想によく似ています。モデルをプルして実行したり、[Modelfile](https://github.com/ollama/ollama/blob/main/docs/modelfile.md) によってモデルをカスタマイズ可能な点も Dockerfile に似ています。 

次に、Modelfileで定義したモデルを作成します。`ai-expert` の部分が新しく作成するモデル名で任意の名前を指定できます。

```sh
ollama create ai-expert -f ./Modelfile
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660892/5539ea66-889a-242a-acf3-7917c5a13ae3.png)

あとはモデル名を指定して `run` するだけです。

```sh
ollama run ai-expert
```

プロンプトで「所得税についてわかりやすく教えて」とAIに関連しない質問をしてみると、英語の回答ですがある程度期待した回答をしてくれました。（実際に使う分にはもう少しプロンプトは工夫する必要がありそうです。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660892/8ead1992-2e8f-7f77-b896-26d08ca63298.png)


### Ollama-UI
Ollamaには、「[ollama-ui](https://github.com/ollama-ui/ollama-ui)」というGUIのツールも用意されています。ターミナルでの利用も非常に簡単でしたが、検証時などは、チャットプレイグランドのようなGUIがあるとより便利だと思います。

Chromeの[extension](https://chromewebstore.google.com/detail/ollama-ui/cmgdpmlhgjhoadnonobjeekmfcehffco)が用意されており、すぐにブラウザで利用することができます。（Edgeブラウザも対応しているようです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660892/2b1676bd-7cb9-7c66-8363-31d6f23571f6.png)

利用するモデルやチャット履歴を切り替えたりすることが可能です。試してないですが、`Hostname` を変えて別のサーバやコンテナにホストしたOllamaへリクエストを投げることもできそうです。

## 参考
### Phi3 モデル
- アーキテクチャ: Phi-3 Mini には 3.8B パラメーターがあり、高密度デコーダーのみの Transformer モデル。このモデルは、人間の嗜好や安全ガイドラインとの整合性を確保するために、SFT(Supervised fine-tuning)とDPO(Direct Preference Optimization)でFine-tuningされている
- 入力: テキスト。チャット形式を使用したプロンプトに最適
- 出力: 入力に応答して生成されたテキスト
- 最大コンテキストの長さ: 128K トークン（小さいモデルもあり）
- トレーニングで使用したGPU:512 H100-80G
- トレーニング時間:7日間
- トレーニングデータ:3.3Tトークン
- 日付: モデルは 2024 年 2 月から 4 月の間にトレーニング
- データセット: 3兆3,000億トークンの多種多様なソースが含まれており、厳選された高品質のデータを使用してトレーニング
- カットオフ: 2023 年 10 月までのデータセットでトレーニングされている
- ライセンス: MITライセンス

### リソース
推論実行中はCPU、メモリともに非常に利用率が高くなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3660892/2fa7e3fb-6b49-d078-4b1a-c742f012db05.png)

# まとめ
今回の記事で、Phi-3モデルとOllamaツールの概要から具体的な使用方法に至るまでを紹介しました。Phi-3の優れた性能と、Ollamaによる柔軟なローカル実行環境が、多様な開発ニーズに応えることができそうです。新たなSLMのリリースも今後期待したいです。