MacBook Air 2020 (Apple M1)で大規模言語モデルを動かす

インターネットが使えないときに大規模言語モデルの助けを借りたいときがあるかも知れません．今回は，MacBook Air 2020でどの程度大規模言語モデルが動くか検証します．

## 前提

- 使用すのはMacbook Air 2020です．Apple M1とメモリ16GBを搭載しています．
- ollamaを使用します．
- Dockerを使用します． **ollamaをDockerから使用するとGPUが使えません．CPUのみで計算します．**
- Dockerの仮想マシンにはCPUは8コア，**メモリは6GB**割り当てています．

## Dockerでのollamaの導入

次のコマンドでDockerコンテナ実行します．初回起動時にイメージがダウンロードされます．
```
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
```

次のコマンドで，言語モデルと対話します．例では，llama3を使用しています．
```
docker exec -it ollama ollama run llama3
```

## 実行結果

大きなモデルは実用的でないので，Phi-3 Mini，Llama3 8b, Starling 7b, Wizerdlm2 7b, CodeGemma 7b，Japanese-Starling-ChatV-7Bの4ビット量子化版を使います．「Can you tell me about neural entworks?」と質問したときのハードウェア使用率と生成スピードを計測しました．CPU使用率とメモリ使用率は仮想マシンのものです．


|Model|モデルのサイズ|CPU使用率|メモリ使用率|tokens/sec|
|--|--|--|--|--|
|Phi-3 Mini|2.3GB| 400%| 50% |2.42 |
|Llama3  8b|4.7GB|400%| 81% |3.52 |
|Starling-lm 7b| 4.1GB|400%| 70% | 4.16|
|Wizerdlm2 7b| 4.1GBGB|400%| 71% | 4.08|
|CodeGemma 7b|5.0GB|400%| 91% |2.94|
|Japanese-Starling-ChatV-7BGB|4.4|400%|75%|1.31|

このように，Macbookで，かつCPUのみで計算しても用途によってはギリギリ使えるスピードが出ていると思います．ChatGPTやClaudeなどのサービスやローカルのGPUを搭載したPCに比べれば相当遅いですが，緊急用であれば十分な速さではないでしょうか．

また，Phi-3 Miniが遅いのが意外です（何度か実行しても変わりませんでした）．今回の結果からMacbookのCPUで計算する場合，モデルサイズから実行速度の大小が推測できないことが分かりました．なぜそうなるかの理由は分かりません．

<!---
### Phi-3 Mini
total duration:       3m3.034235499s
load duration:        4.028416ms
prompt eval count:    15 token(s)
prompt eval duration: 5.792818s
prompt eval rate:     2.59 tokens/s
eval count:           429 token(s)
eval duration:        2m57.100715s
eval rate:            2.42 tokens/s

### Llama3 8b
total duration:       2m58.188026456s
load duration:        8.845125ms
prompt eval count:    18 token(s)
prompt eval duration: 3.318932s
prompt eval rate:     5.42 tokens/s
eval count:           616 token(s)
eval duration:        2m54.753425s
eval rate:            3.52 tokens/s

### Starling-lm
total duration:       3m11.245246669s
load duration:        2.118416ms
prompt eval count:    25 token(s)
prompt eval duration: 4.318008s
prompt eval rate:     5.79 tokens/s
eval count:           778 token(s)
eval duration:        3m6.835059s
eval rate:            4.16 tokens/s


### Widzerdlm2
total duration:       5m15.310142477s
load duration:        10.683166ms
prompt eval count:    46 token(s)
prompt eval duration: 9.947854s
prompt eval rate:     4.62 tokens/s
eval count:           1246 token(s)
eval duration:        5m5.207123s
eval rate:            4.08 tokens/s

### CodeGemma 7b
total duration:       2m24.196129566s
load duration:        2.012625ms
prompt eval duration: 1.101813s
prompt eval rate:     0.00 tokens/s
eval count:           420 token(s)
eval duration:        2m22.984217s
eval rate:            2.94 tokens/s

### Japanese-Starling-ChatV-7BGB
total duration:       5m44.495990614s
load duration:        3.202417ms
prompt eval count:    48 token(s)
prompt eval duration: 34.634481s
prompt eval rate:     1.39 tokens/s
eval count:           406 token(s)
eval duration:        5m9.730579s
eval rate:            1.31 tokens/s

--->

## 感想

Macbook Air 2020でも小さめの大規模言語モデルが比較的実用的な速さで動きます．このことから，インターネットが使えない出先でも，英語やコーディングで大規模言語モデルの助けを得ることができることが分かりました（バッテリーの持ちが心配ではありますが…）．