Closed3
Llama.cppでCode Llama(MetalによるGPUオフロード)
上の続きみたいなもので、M2 Pro Macを手に入れたので、MetalによるGPUオフロードも試してみる。
- Mac Mini 2023
- 12コアCPU、19コアGPU、16コアNeural Engine搭載Apple M2 Proチップ
- 32GBユニファイドメモリ
Macの場合はデフォルトでMetal有効でビルドされる。
$ git clone https://github.com/ggerganov/llama.cpp
$ cd llama.cpp
$ make
モデルは下を使う。modelsディレクトリにあるものとする。
- codellama-7b-instruct.Q4_K_M.gguf
- codellama-13b-instruct.Q4_K_M.gguf
- codellama-34b-instruct.Q4_K_M.gguf
7B
$ ./main -m ./models/codellama-7b-instruct.Q4_K_M.gguf --temp 0.1 -p "[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST]"
Metalは有効になっている。
ggml_metal_init: allocating
ggml_metal_init: found device: Apple M2 Pro
ggml_metal_init: picking default device: Apple M2 Pro
結果
[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST] Pythonで100以下のフィボナッチ数列を計算するには、以下のようなコードを使用します。
```python
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(100))
```
このコードは、`fibonacci`という関数を定義しています。この関数は、与えられた整数`n`に対してフィボナッチ数列を計算します。`if`文を使用して、`n`が1か0以下の場合はその値を返し、そうでない場合は再帰的に`fibonacci`関数を呼び出して計算します。最後に、`print`文を使用して、100以下のフィボナッチ数列を表示します。
このコードは、フィボナッチ数列を再帰的に計算することで、100以下の数列を生成しています。 [end of text]
約33.6トークン/秒
llama_print_timings: load time = 1154.14 ms
llama_print_timings: sample time = 212.47 ms / 323 runs ( 0.66 ms per token, 1520.21 tokens per second)
llama_print_timings: prompt eval time = 323.85 ms / 65 tokens ( 4.98 ms per token, 200.71 tokens per second)
llama_print_timings: eval time = 9576.08 ms / 322 runs ( 29.74 ms per token, 33.63 tokens per second)
llama_print_timings: total time = 10177.47 ms
-ngl 0
でGPUオフロードを無効化すると約23.8トークンぐらいまで下がる
llama_print_timings: load time = 758.59 ms
llama_print_timings: sample time = 169.68 ms / 253 runs ( 0.67 ms per token, 1491.08 tokens per second)
llama_print_timings: prompt eval time = 4995.39 ms / 65 tokens ( 76.85 ms per token, 13.01 tokens per second)
llama_print_timings: eval time = 10572.77 ms / 252 runs ( 41.96 ms per token, 23.83 tokens per second)
llama_print_timings: total time = 15794.94 ms
ちなみにcuBLASと違って、-ngl
に指定する数値は、0かそれ以外って感じに見える。つまり0以外は何を指定してもパフォーマンスが変わらない。ログを見ていても何レイヤー分オフロードしたかとかも全然わからないし。なんとなく単純にオフにするときだけ-ngl 0
という感じに思える。
まあユニファイドメモリではRAMとVRAMを区別する必要もないので、どれだけオフロードさせるかとかはほとんど意味がないとも言えるのだけど。
以下は参考まで。
13B
$ ./main -m ./models/codellama-13b-instruct.Q4_K_M.gguf --temp 0.1 -p "[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST]"
約18.8トークン/秒
llama_print_timings: load time = 11504.61 ms
llama_print_timings: sample time = 203.33 ms / 308 runs ( 0.66 ms per token, 1514.77 tokens per second)
llama_print_timings: prompt eval time = 618.42 ms / 65 tokens ( 9.51 ms per token, 105.11 tokens per second)
llama_print_timings: eval time = 16303.88 ms / 307 runs ( 53.11 ms per token, 18.83 tokens per second)
llama_print_timings: total time = 17188.98 ms
34B
$ ./main -m ./models/codellama-34b-instruct.Q4_K_M.gguf --temp 0.1 -p "[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST]"
約8.1トークン/秒
llama_print_timings: load time = 28685.32 ms
llama_print_timings: sample time = 208.38 ms / 318 runs ( 0.66 ms per token, 1526.08 tokens per second)
llama_print_timings: prompt eval time = 1544.08 ms / 65 tokens ( 23.76 ms per token, 42.10 tokens per second)
llama_print_timings: eval time = 39174.27 ms / 317 runs ( 123.58 ms per token, 8.09 tokens per second)
llama_print_timings: total time = 41001.35 ms
34BでGPUオフロードして、8トークン/秒は、体感的に全然使える範囲かな。
単純比較はできないけど、RTX4090 24GBでフルオフロードした場合と比べると、ちょっと物足りない感はある。M2 Ultraだと流石に違ってくる気はなんとなくはするけども。
このスクラップは2023/09/16にクローズされました