Closed4
Llama.cppでCode Llama(cuBLASによるGPUオフロードも)
以下の続き。Llama.cpp使ったことなかったのでお試しもふくめて。とはいえLlama.cppだとそのままだとGPU関係ないので、あとでcuBLASも試してみる。
- CPU: Intel Core i9-13900F
- メモリ: 96GB
- GPUI: NVIDIA GeForce RTX 4090 24GB
ちなInstructモデルで。
llama.cpp(GGUF)
Q4_K_Mを使うこととする
CPUのみ
$ git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp
$ make
# モデルのダウンロード
$ wget -P models https://huggingface.co/TheBloke/CodeLlama-7B-Instruct-GGUF/resolve/main/codellama-7b-instruct.Q4_K_M.gguf
$ wget -P models https://huggingface.co/TheBloke/CodeLlama-13B-Instruct-GGUF/resolve/main/codellama-13b-instruct.Q4_K_M.gguf
$ wget -P models https://huggingface.co/TheBloke/CodeLlama-34B-Instruct-GGUF/resolve/main/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]"
結果
Log start
main: build = 1150 (571083f)
main: seed = 1693637520
llama_model_loader: loaded meta data with 17 key-value pairs and 291 tensors from ./models/codellama-7b-instruct.Q4_K_M.gguf (version GGUF V1 (support until nov 2023))
llama_model_loader: - tensor 0: token_embd.weight q4_0 [ 4096, 32016, 1, 1 ]
llama_model_loader: - tensor 1: output_norm.weight f32 [ 4096, 1, 1, 1 ]
(snip)
llama_model_loader: - tensor 289: blk.31.attn_norm.weight f32 [ 4096, 1, 1, 1 ]
llama_model_loader: - tensor 290: blk.31.ffn_norm.weight f32 [ 4096, 1, 1, 1 ]
llama_model_loader: - kv 0: general.architecture str
llama_model_loader: - kv 1: general.name str
(snip)
llama_model_loader: - kv 15: tokenizer.ggml.token_type arr
llama_model_loader: - kv 16: general.quantization_version u32
llama_model_loader: - type f32: 65 tensors
llama_model_loader: - type f16: 1 tensors
llama_model_loader: - type q4_0: 1 tensors
llama_model_loader: - type q4_K: 192 tensors
llama_model_loader: - type q6_K: 32 tensors
llm_load_print_meta: format = GGUF V1 (support until nov 2023)
llm_load_print_meta: arch = llama
llm_load_print_meta: vocab type = SPM
llm_load_print_meta: n_vocab = 32016
llm_load_print_meta: n_merges = 0
llm_load_print_meta: n_ctx_train = 16384
llm_load_print_meta: n_ctx = 512
llm_load_print_meta: n_embd = 4096
llm_load_print_meta: n_head = 32
llm_load_print_meta: n_head_kv = 32
llm_load_print_meta: n_layer = 32
llm_load_print_meta: n_rot = 128
llm_load_print_meta: n_gqa = 1
llm_load_print_meta: f_norm_eps = 1.0e-05
llm_load_print_meta: f_norm_rms_eps = 1.0e-05
llm_load_print_meta: n_ff = 11008
llm_load_print_meta: freq_base = 1000000.0
llm_load_print_meta: freq_scale = 1
llm_load_print_meta: model type = 7B
llm_load_print_meta: model ftype = mostly Q4_K - Medium
llm_load_print_meta: model size = 6.74 B
llm_load_print_meta: general.name = LLaMA
llm_load_print_meta: BOS token = 1 '<s>'
llm_load_print_meta: EOS token = 2 '</s>'
llm_load_print_meta: UNK token = 0 '<unk>'
llm_load_print_meta: LF token = 13 '<0x0A>'
llm_load_tensors: ggml ctx size = 0.09 MB
llm_load_tensors: mem required = 4038.96 MB (+ 256.00 MB per state)
...............................................................................................
llama_new_context_with_model: kv self size = 256.00 MB
llama_new_context_with_model: compute buffer total size = 72.00 MB
system_info: n_threads = 16 / 32 | AVX = 1 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 |
sampling: repeat_last_n = 64, repeat_penalty = 1.100000, presence_penalty = 0.000000, frequency_penalty = 0.000000, top_k = 40, tfs_z = 1.000000, top_p = 0.950000, typical_p = 1.000000, temp = 0.100000, mirostat = 0, mirostat_lr = 0.100000, mirostat_ent = 5.000000
generate: n_ctx = 512, n_batch = 512, n_predict = -1, n_keep = 0
[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST] Pythonで100以下のフィボナッチ数列を計算するには、以下のようなコードを使用します。
```
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以下のフィボナッチ数列を表示します。
このコードは、Pythonでフィボナッチ数列を計算するための基本的な方法を示しています。 [end of text]
llama_print_timings: load time = 176.56 ms
llama_print_timings: sample time = 126.67 ms / 316 runs ( 0.40 ms per token, 2494.77 tokens per second)
llama_print_timings: prompt eval time = 1907.19 ms / 65 tokens ( 29.34 ms per token, 34.08 tokens per second)
llama_print_timings: eval time = 32697.91 ms / 315 runs ( 103.80 ms per token, 9.63 tokens per second)
llama_print_timings: total time = 34837.50 ms
Log end
何回か繰り返してみたけど、7Bだと約10トークン/秒って感じ。体感的にも全然気にならない。
13Bと34Bも試してみた。こちらは統計情報だけ。
13B: 約5トークン/秒、7Bからすると遅いけど、個人的には我慢できないほどではなかった。
llama_print_timings: load time = 343.45 ms
llama_print_timings: sample time = 113.45 ms / 306 runs ( 0.37 ms per token, 2697.25 tokens per second)
llama_print_timings: prompt eval time = 3650.88 ms / 65 tokens ( 56.17 ms per token, 17.80 tokens per second)
llama_print_timings: eval time = 59323.34 ms / 305 runs ( 194.50 ms per token, 5.14 tokens per second)
llama_print_timings: total time = 63184.20 ms
34B: 約2トークン/秒、実用には耐えないかも。
llama_print_timings: load time = 872.62 ms
llama_print_timings: sample time = 121.58 ms / 305 runs ( 0.40 ms per token, 2508.74 tokens per second)
llama_print_timings: prompt eval time = 10450.68 ms / 65 tokens ( 160.78 ms per token, 6.22 tokens per second)
llama_print_timings: eval time = 149015.63 ms / 304 runs ( 490.18 ms per token, 2.04 tokens per second)
llama_print_timings: total time = 159713.99 ms
GPU併用(cuBLAS)
$ git clone https://github.com/ggerganov/llama.cpp && llama.cpp
$ mkdir build && cd build
$ cmake .. -DLLAMA_CUBLAS=ON
$ cmake --build . --config Release
$ cp bin/main .. # 生成された実行ファイルをコピー
$ cd ..
というか普通にmake使うやり方ある、ちゃんと読め、自分
これだけで良かった。
$ git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp
$ make LLAMA_CUBLAS=1
7B
モデルはmodelsディレクトリにあるものとして推論実行。
$ ./main -m ./models/codellama-7b-instruct.Q4_K_M.gguf --temp 0.1 -p "[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST]" -ngl 32 -b 512
結果。
GPUが有効になっていることがわかる。あと、7Bだと最大35レイヤーまでオフロード可能みたい。
(snip)
ggml_init_cublas: found 1 CUDA devices:
Device 0: NVIDIA GeForce RTX 4090, compute capability 8.9
(snip)
llm_load_tensors: using CUDA for GPU acceleration
llm_load_tensors: mem required = 320.58 MB (+ 256.00 MB per state)
llm_load_tensors: offloading 32 repeating layers to GPU
llm_load_tensors: offloaded 32/35 layers to GPU
llm_load_tensors: VRAM used: 3719 MB
...............................................................................................
llama_new_context_with_model: kv self size = 256.00 MB
llama_new_context_with_model: compute buffer total size = 72.00 MB
llama_new_context_with_model: VRAM scratch buffer: 70.53 MB
system_info: n_threads = 16 / 32 | AVX = 1 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 |
(snip)
質問の回答。
(snip)
[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以下のフィボナッチ数列を表示します。 [end of text]
約57トークン/秒でめちゃめちゃ速い。
llama_print_timings: load time = 444.88 ms
llama_print_timings: sample time = 81.70 ms / 276 runs ( 0.30 ms per token, 3378.05 tokens per second)
llama_print_timings: prompt eval time = 145.46 ms / 65 tokens ( 2.24 ms per token, 446.86 tokens per second)
llama_print_timings: eval time = 4830.15 ms / 275 runs ( 17.56 ms per token, 56.93 tokens per second)
llama_print_timings: total time = 5127.77 ms
Log end
nvidia-smiで見る限りはVRAMは約6GB程度。
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 4090 On | 00000000:01:00.0 Off | Off |
| 0% 49C P2 112W / 450W| 5651MiB / 24564MiB | 32% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1135 G /usr/lib/xorg/Xorg 9MiB |
| 0 N/A N/A 1382 G /usr/bin/gnome-shell 10MiB |
| 0 N/A N/A 50933 C ./main 5626MiB |
+---------------------------------------------------------------------------------------+
全35レイヤーオフロードしてみる。
$ ./main -m ./models/codellama-7b-instruct.Q4_K_M.gguf --temp 0.1 -p "[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST]" -ngl 35 -b 512
約130トークン/秒!
llama_print_timings: load time = 439.67 ms
llama_print_timings: sample time = 88.94 ms / 276 runs ( 0.32 ms per token, 3103.11 tokens per second)
llama_print_timings: prompt eval time = 55.46 ms / 65 tokens ( 0.85 ms per token, 1171.97 tokens per second)
llama_print_timings: eval time = 2081.38 ms / 275 runs ( 7.57 ms per token, 132.12 tokens per second)
llama_print_timings: total time = 2285.24 ms
VRAM約6GB
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 4090 On | 00000000:01:00.0 Off | Off |
| 0% 59C P2 246W / 450W| 5895MiB / 24564MiB | 83% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1135 G /usr/lib/xorg/Xorg 9MiB |
| 0 N/A N/A 1382 G /usr/bin/gnome-shell 10MiB |
| 0 N/A N/A 75240 C ./main 5870MiB |
+---------------------------------------------------------------------------------------+
13B
$ ./main -m ./models/codellama-13b-instruct.Q4_K_M.gguf --temp 0.1 -p "[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST]" -ngl 32 -b 512
最大43レイヤーであることがわかる。
llm_load_tensors: offloaded 32/43 layers to GPU
約16トークン/秒。
llama_print_timings: load time = 762.00 ms
llama_print_timings: sample time = 252.22 ms / 656 runs ( 0.38 ms per token, 2600.92 tokens per second)
llama_print_timings: prompt eval time = 1124.54 ms / 322 tokens ( 3.49 ms per token, 286.34 tokens per second)
llama_print_timings: eval time = 40521.37 ms / 654 runs ( 61.96 ms per token, 16.14 tokens per second)
llama_print_timings: total time = 42172.40 ms
VRAM約8GB。
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 4090 On | 00000000:01:00.0 Off | Off |
| 0% 56C P2 88W / 450W| 8011MiB / 24564MiB | 12% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1135 G /usr/lib/xorg/Xorg 9MiB |
| 0 N/A N/A 1382 G /usr/bin/gnome-shell 10MiB |
| 0 N/A N/A 96087 C ./main 7986MiB |
+---------------------------------------------------------------------------------------+
43レイヤーフルで。
$ ./main -m ./models/codellama-13b-instruct.Q4_K_M.gguf --temp 0.1 -p "[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST]" -ngl 43 -b 512
約81トークン/秒。
llama_print_timings: load time = 796.64 ms
llama_print_timings: sample time = 110.77 ms / 378 runs ( 0.29 ms per token, 3412.38 tokens per second)
llama_print_timings: prompt eval time = 88.84 ms / 65 tokens ( 1.37 ms per token, 731.69 tokens per second)
llama_print_timings: eval time = 4610.46 ms / 377 runs ( 12.23 ms per token, 81.77 tokens per second)
llama_print_timings: total time = 4892.95 ms
VRAM約10GB。
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 4090 On | 00000000:01:00.0 Off | Off |
| 30% 66C P2 292W / 450W| 9837MiB / 24564MiB | 91% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1135 G /usr/lib/xorg/Xorg 9MiB |
| 0 N/A N/A 1382 G /usr/bin/gnome-shell 10MiB |
| 0 N/A N/A 107462 C ./main 9812MiB |
+---------------------------------------------------------------------------------------+
34B
$ ./main -m ./models/codellama-34b-instruct.Q4_K_M.gguf --temp 0.1 -p "[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST]" -ngl 32 -b 512
最大51レイヤー。
llm_load_tensors: offloaded 32/51 layers to GPU
約5〜6トークン/秒。
llama_print_timings: load time = 1523.11 ms
llama_print_timings: sample time = 101.18 ms / 276 runs ( 0.37 ms per token, 2727.70 tokens per second)
llama_print_timings: prompt eval time = 1095.93 ms / 65 tokens ( 16.86 ms per token, 59.31 tokens per second)
llama_print_timings: eval time = 50304.23 ms / 275 runs ( 182.92 ms per token, 5.47 tokens per second)
llama_print_timings: total time = 51587.73 ms
VRAM約14GB
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 4090 On | 00000000:01:00.0 Off | Off |
| 0% 52C P2 91W / 450W| 14205MiB / 24564MiB | 8% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1135 G /usr/lib/xorg/Xorg 9MiB |
| 0 N/A N/A 1382 G /usr/bin/gnome-shell 10MiB |
| 0 N/A N/A 119519 C ./main 14180MiB |
+---------------------------------------------------------------------------------------+
ではフルで。
$ ./main -m ./models/codellama-34b-instruct.Q4_K_M.gguf --temp 0.1 -p "[INST]pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。[/INST]" -ngl 51 -b 512
約38トークン/秒。
llama_print_timings: load time = 1843.51 ms
llama_print_timings: sample time = 87.29 ms / 298 runs ( 0.29 ms per token, 3414.06 tokens per second)
llama_print_timings: prompt eval time = 170.97 ms / 65 tokens ( 2.63 ms per token, 380.19 tokens per second)
llama_print_timings: eval time = 7848.63 ms / 297 runs ( 26.43 ms per token, 37.84 tokens per second)
llama_print_timings: total time = 8170.19 ms
VRAM約20GB。
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 4090 On | 00000000:01:00.0 Off | Off |
| 34% 68C P2 324W / 450W| 20467MiB / 24564MiB | 95% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1135 G /usr/lib/xorg/Xorg 9MiB |
| 0 N/A N/A 1382 G /usr/bin/gnome-shell 10MiB |
| 0 N/A N/A 126635 C ./main 20442MiB |
+---------------------------------------------------------------------------------------+
GPUオフロード効果は絶大。
- 各モデルごとの-nglの最大値
- 7B: 35
- 13B: 43
- 34B: 51
- トークン数/秒、左から順に「cuBLASなし」「cuBLASあり(-ngl 32)」「cuBLASあり(-ngl 最大)」
- 7B: 10 / 57 / 130
- 13B: 5 / 16 / 81
- 34B: 2 / 6 / 38
- cuBLAS有効時のVRAM消費(GB)。左から「-ngl 32」「-ngl 最大」
- 7B: 6 / 6
- 13B: 8 / 10
- 34B: 14 / 20
久々にちょっとビルドし直してみたらこんなのが出た
!!!!
LLAMA_CUBLAS is deprecated and will be removed in the future. Use LLAMA_CUDA instead.
!!!!
どうやら以下のようにしてmakeするように変わったみたい。nvidia-cuda-toolkitが必要とあるけど、前からそうだっけか?覚えてない。
$ git clone https://github.com/ggerganov/llama.cpp && cd llama.cpp
$ make LLAMA_CUDA=1
このスクラップは2023/09/02にクローズされました