Llama3，Phi-3などの対話型人工知能（大規模言語モデル）をパソコンで動かす

かつては大規模言語モデルは，メモリを大量に消費し，大量のGPUが必要なため個人レベルで動かすものではありませんでした．しかし，2024年にLlama3 7BやMixtral 8x7b, Phi-3 smallなどChatGPT-3.5レベルの能力を持ち軽量で無料の大規模言語モデルが登場してきました．それだけではなく，これらの大規模言語モデルをコマンド一つでインストールするが出来るようにもなりました．2024年から，大規模言語モデル（対話型人工知能）を自宅で気軽に動かせる時代になったと言えます．

この記事に対話型人工知能をパソコンにインストールする方法とその結果を書きます．

## 環境

### 前提としている環境

私は人工知能の研究をしているため，すでに**Linux(Debian 12)上でPython3とCUDAが動く環境**を整えています．以下の記事は**Linuxの使用を前提にしています**．

### パソコンのスペック

- CPU: Ryzen 5900X
- RAM: 64GB
- GPU: GTX1080Ti x 2枚

Llama3 7BとPhi-3 Miniを動かすのであればGPU1枚で十分です(CPUだけでも動くかも知れません)．Llama3 70BとCommand R+は，メモリが64GBより多ければ動くと思われます（確証はありません）．

### 動かすモデル

 Llama3とMixtral，Command R+，CodeGemma，Phi-3を動かします．

## 大規模言語モデルのインストール

[Ollama](https://ollama.com/)というツールを使って大規模言語モデルをインストールします．

```
sudo apt install curl
curl -fsSL https://ollama.com/install.sh | sh
```
このコマンドでOllamaがインストールされます．

Llama3 7Bを使う場合は，次のコマンドを打ちます．
```
ollama run llama3
```
初回は，モデルをダウンロードするので時間がかかります．実効に成功すると，次のような表示となります．
```
ollama run llama3
>>> Send a message (/? for help)
```
この表示になれば，ChatGPTと同じように質問を打ち込んでEnterボタンを押すとLlama3 8Bから回答が得られます．このように，極めて簡単に大規模言語モデルをインストールし，使うことができます．

代表的なモデルの実行コマンドをまとめておきます．コマンドは変更の可能性があるので，公式ページも確認してください．**実行コマンドのモデル名の後にオプションが無いものやビット数が書かれていないものは基本的に4ビット量子化されたモデルです．**

|モデル        |実行コマンド|
|-------------|----------|
|Llama 8B     |ollama run llama3|
|Llama 8B (fp16)      |ollama run llama3:8b-instruct-fp16 |
|Llama 70B    |ollama run llama3:70b|
|Mixtral 8x7b |ollama run mixtral|
|Mixtral 8x7b (q5) |mixtral:8x7b-instruct-v0.1-q5_K_M|
|Mixtral 8x22b|ollama run mixtral:8x22b|
|Command R+|ollama run command-r-plus|
|CodeGemma|ollama run codegemma|
|Phi-3 Mini   |ollama run phi3|
|Phi-3 Mini (fp16) |ollama run phi3:3.8b-mini-instruct-4k-fp16|

また，モデルがアップデートされることがあります．先日もLlama 70Bに不具合がありアップデートされました．そのような場合は，次のコマンドでモデルをアップデートしましょう
```
ollama pull llama3:70b
```

## 実行速度

それぞれのモデルに"Can you tell me about neural networks?"と質問したときの回答速度をまとめておきます．1回の試行しかしていないので，正確ではないかも知れませんが目安にはなるでしょう．

表はeval rateです．実行速度を見ると，Llama3 8BとPhi-3 miniが圧倒的に早いことが分かります．Mixtral 8x7bは，これらに比べ遅いですが十分実用的な速度だと言えます．また，**Llama3 8BとPhi-3 mini量子化されていないfp16バージョンも十分早く，ゲーミングPCなどでこれらを動かす場合は量子化バージョンを使う必要はないでしょう．** Mixtral 8x7bは5ビット量子化版は速いですが，6ビット量子化版はllama3 70Bの4ビット量子化版と同程度のスピードです．

Llama3 70Bは遅いですが，使えなくは無いでしょう．Lamma3 70Bは性能がClaude3 Sonnetと同レベルと言われていますので，それを考えれば，この遅さも我慢できるのではないでしょうか．

Code生成に特化したCodeGemmaも高速に動作します．これもfp16版でも高速に動作しますので，より高速化したいという要望が無い限り量子化版を使う必要な無いでしょう．

|model|eval rate (tokens/s)|
|-----|---------|
|Llama3 8B     |51.71|
|Llama3 8B (fp16) |20.96|
|Llama3 70B    |1.85|
|Mixtral 8x7b |14.29|
|Mixtral 8x7b (q5) |9.15|
|Mixtral 8x7b (q6) |1.71|
|Mixtral 8x22b|-|
|Command R+|0.92|
|Phi-3 Mini |79.75|
|Phi-3 Mini (fp16) |37.55|
|deepseek-coder:6.7b (fp16)|23.94|
|CodeGemma|48.64|
|CodeGemma (fp16)|18.45|

<!-- 
各モデルの実行結果の詳細は次の通りです．

### Llama3 8B

```
total duration:       14.319408459s
load duration:        727.553µs
prompt eval count:    18 token(s)
prompt eval duration: 92.243ms
prompt eval rate:     195.14 tokens/s
eval count:           731 token(s)
eval duration:        14.136847s
eval rate:            51.71 tokens/s
```

### Llama3 8B (fp16)
```
total duration:       30.147344406s
load duration:        5.59117ms
prompt eval count:    18 token(s)
prompt eval duration: 239.97ms
prompt eval rate:     75.01 tokens/s
eval count:           624 token(s)
eval duration:        29.770402s
eval rate:            20.96 tokens/s
```

### Llama3 70B

```
total duration:       6m46.197992659s
load duration:        8.223629ms
prompt eval count:    18 token(s)
prompt eval duration: 3.482721s
prompt eval rate:     5.17 tokens/s
eval count:           743 token(s)
eval duration:        6m42.572507s
eval rate:            1.85 tokens/s
```


### Mixtral 8x7b

```
total duration:       21.026688235s
load duration:        3.393927ms
prompt eval count:    18 token(s)
prompt eval duration: 534.22ms
prompt eval rate:     33.69 tokens/s
eval count:           291 token(s)
eval duration:        20.35704s
eval rate:            14.29 tokens/s
```

### Mixtral 8x7b (q5)
```
total duration:       35.130786236s
load duration:        5.677654ms
prompt eval count:    18 token(s)
prompt eval duration: 782.259ms
prompt eval rate:     23.01 tokens/s
eval count:           313 token(s)
eval duration:        34.20659s
eval rate:            9.15 tokens/s
```

### Mixtral 8x7b (q6)
```
total duration:       2m36.521058141s
load duration:        13.015549ms
prompt eval count:    18 token(s)
prompt eval duration: 12.104158s
prompt eval rate:     1.49 tokens/s
eval count:           246 token(s)
eval duration:        2m24.263357s
eval rate:            1.71 tokens/s
```
### Mixtral 8x22b

スワップが発生したため計測しませんでした．

### Command R+

```
total duration:       5m2.131787134s
load duration:        802.08µs
prompt eval count:    14 token(s)
prompt eval duration: 5.451227s
prompt eval rate:     2.57 tokens/s
eval count:           274 token(s)
eval duration:        4m56.547492s
eval rate:            0.92 tokens/s
```

### CodeGemma

```
total duration:       9.415477197s
load duration:        954.131µs
prompt eval count:    17 token(s)
prompt eval duration: 113.544ms
prompt eval rate:     149.72 tokens/s
eval count:           446 token(s)
eval duration:        9.168609s
eval rate:            48.64 tokens/s
```
### CodeGemma (fp16)

```
total duration:       24.201236042s
load duration:        874.896µs
prompt eval count:    17 token(s)
prompt eval duration: 269.735ms
prompt eval rate:     63.02 tokens/s
eval count:           439 token(s)
eval duration:        23.798786s
eval rate:            18.45 tokens/s
```

### Phi-3 Mini

```
total duration:       5.783931152s
load duration:        853.032µs
prompt eval count:    15 token(s)
prompt eval duration: 59.636ms
prompt eval rate:     251.53 tokens/s
eval count:           446 token(s)
eval duration:        5.592391s
eval rate:            79.75 tokens/s
```

### Phi-3 Mini (fp16)
```
total duration:       17.657695996s
load duration:        823.464µs
prompt eval count:    15 token(s)
prompt eval duration: 153.597ms
prompt eval rate:     97.66 tokens/s
eval count:           654 token(s)
eval duration:        17.415791s
eval rate:            37.55 tokens/s
```


-->

## モデルのサイズ，実行時のメモリー使用率，CPU使用率

モデルのサイズ，実行時のメモリー使用率，CPU使用率の一覧です．メモリ使用率とCPU使用率は，先と同様に"Can you tell me about neural networks?"と質問したとき，モデルが回答を生成しているときのものです．この結果と先の生成速度を見ると，GPUのメモリが足りずメインメモリ(RAM)を使うモデルは，劇的に低速になることが分かります．これは効率的にGPUで計算できていないためではないでしょうか(正確なところはollamaの仕組みを理解しないと分かりませんが)．**この結果から，モデルがGPUのメモリに乗りさえすれば古いGPUでも十分高速に動作することが分かります。**そして，**GPUのメモリを増やすことが重要**である事も分かります．より多くのメモリを搭載したGPUを使えば，Llama3 70BとMixtral 8x7bは今回測定された速度より遥かに高速に動作するかも知れません．また，Mixtral 8x22bでは少量のスワップが発生してしまい実用的でない速度になることが予想されるため計測しませんでした．

|モデル        |サイズ|GPU1 RAM|GPU2 RAM| RAM |GPU1      | GPU2|CPU |
|-------------|-----|--------|--------|-----|----------|-----|-----|
|Llama3 8B    |4.7GB|   22.9%|   25.2%| 1.8%|40%台      |40%台|100%|
|Llama3 70B   | 40GB|   99.5%|   88.8%|61.1%|たまに20％台|たまに20％台|1085%|
|Mixtral 8x7b | 26GB|   93.8%|   88.1%|11.3%|10%台|10%台|835%|
|Mixtral 8x22b| 80GB|       -|       -| スワップが発生| -| -|-|
|Command R+   | 59GB|   96.7%|   74.3%|89.9%|たまに10％台|たまに10％台|1124%|
|CodeGemma    |  5GB|   27.6%|   33.4%| 2.2%|40%台|40%台|100%|
|Phi-3 Mini   |2.3GB|   17.3%|   16.5%| 1.2%|40%台|40%台|100%|

## 感想

ChatGPT3.5と同等（ベンチマークでは），それ以上の大規模言語モデルが自宅のパソコンで動く時代となりました．特に，Llama3 8BとPhi-3は軽量で高速な動作です．これら比較的小さなモデルならGPUが1枚あれば自宅でも高速に動作すると思われます．RTX3060の12GB版を1枚買えば安価にローカルLLMを楽しめることでしょう．

オープンなモデルの日本語の能力は未知数ですが，ベンチマークを見る限り英語での使用に関してはかなり有用ではないかと思われます．英語だけでの使用かつ用途が限られているのならば，ChatGPTやClaude3などのサブスクリプションを契約する必要は無い時代が来たかも知れません．

高速で高性能なモデルが無料で手に入る時代になると，いかにそれを活かすかが我々に問われることになります．
また，OpenAIなどは無料のモデルに対し，どのような優位性を提示できるか興味深いです．オープンなモデルの性能が向上すると，高性能なモデルを提供するビジネスモデルはなくなり，計算資源を提供するビジネスモデルが生き残るかもしれません（すでに2024年4月の段階でそうなっていると言えるかも知れません．巨大なモデルは自宅では動かないので，ChatGPTなどを使うということは巨大なモデルが動くコンピュータを借りていると言えます．）．