Closed3

Llama.cppでCode Llama(MetalによるGPUオフロード)

kun432kun432

https://zenn.dev/kun432/scraps/d532830c0f2260

上の続きみたいなもので、M2 Pro Macを手に入れたので、MetalによるGPUオフロードも試してみる。

  • Mac Mini 2023
    • 12コアCPU、19コアGPU、16コアNeural Engine搭載Apple M2 Proチップ
    • 32GBユニファイドメモリ
kun432kun432

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
kun432kun432

34BでGPUオフロードして、8トークン/秒は、体感的に全然使える範囲かな。

単純比較はできないけど、RTX4090 24GBでフルオフロードした場合と比べると、ちょっと物足りない感はある。M2 Ultraだと流石に違ってくる気はなんとなくはするけども。

このスクラップは2023/09/16にクローズされました