如何解决llama_cpp_python设置n_gpu_layer后的GPU异常问题?
llama_cpp_python GPU相关问题排查与解决建议
问题描述
- 设置
n_gpu_layer=1时,模型输出出现乱码字符 - 设置
n_gpu_layer=33时,输出全为#####... - 开启cuBLAS(
BLAS=1)调用GPU后,token生成性能明显下降
环境配置
- 硬件系统:NVIDIA GeForce RTX 3060 + Windows 11
- Python版本:3.12.2
- 模型:mistral-7b-openorca.Q4_0.gguf
- 依赖库:llama_cpp_python
相关CLI日志
n_gpu_layer=1时的输出乱码示例
To learn Python, you can consider the following options: 1. Online Courses: Websites like Coursera, edX, Codecadem♠♦♥◄!▬$▲▅ `▅☻↑↨►☻ply↨ ▼♦$§→↓ ♠♥§ ▬▅↔→☻▼▼ ♠§☻♥☻ ▬▼↔§!→ ♠♦→☺▼♠∟§$☻ $!☻ ↨"♥‼§♣▼ ∟♥¶↨▅ $→ ↨↨ ↔▅►▲↕♦ ☻$▅↓↓▼♠♠♥♦☺$↑§§ #↑☻∟☺‼ ◄☺▬‼¶☺♠▲→▲↨ ☺↑↕ ∟ ▅▼↑☺ ↓▬!↨ ◄▲↕►↕▬$♣►▲↕ ☻►▬▬↕↔§♠§▬ "▲ § $▲♦ §↓☺♠►↨ ☺☻↔!∟ \#♥#♠↔♣$"¶‼→◄▼♣☻#↔↑∟$♦ →►◄→↕ ♥►$◄! ▬↓↔↑▲►!♠▬ ♥↔► § ▬!▅ ↓‼ ▅! ▼§↓♥ ☻☻♣▬ ▅↔↕¶↕ ▅‼ ►"¶▬☺ ♣ ↕♦§ ♦♠☻▼♥∟§♠↕§☺▲! ▬ `
n_gpu_layer=33时的日志与输出
输出全为#####...,对应CLI日志:
ggml_init_cublas: GGML_CUDA_FORCE_MMQ: no ggml_init_cublas: CUDA_USE_TENSOR_CORES: yes ggml_init_cublas: found 1 CUDA devices: Device 0: NVIDIA GeForce RTX 3060, compute capability 8.6, VMM: yes llama_model_loader: loaded meta data with 20 key-value pairs and 291 tensors from ./models/mistral-7b-openorca.Q4_0.gguf (version GGUF V2) llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output. llama_model_loader: - kv 0: general.architecture str = llama llama_model_loader: - kv 1: general.name str = open-orca_mistral-7b-openorca llama_model_loader: - kv 2: llama.context_length u32 = 32768 llama_model_loader: - kv 3: llama.embedding_length u32 = 4096 llama_model_loader: - kv 4: llama.block_count u32 = 32 llama_model_loader: - kv 5: llama.feed_forward_length u32 = 14336 llama_model_loader: - kv 6: llama.rope.dimension_count u32 = 128 llama_model_loader: - kv 7: llama.attention.head_count u32 = 32 llama_model_loader: - kv 8: llama.attention.head_count_kv u32 = 8 llama_model_loader: - kv 9: llama.attention.layer_norm_rms_epsilon f32 = 0.000010 llama_model_loader: - kv 10: llama.rope.freq_base f32 = 10000.000000 llama_model_loader: - kv 11: general.file_type u32 = 2 llama_model_loader: - kv 12: tokenizer.ggml.model str = llama llama_model_loader: - kv 13: tokenizer.ggml.tokens arr\[str,32002\] = ["\<unk\>", "<s>", "</s>", "\<0x00\>", "\<... llama_model_loader: - kv 14: tokenizer.ggml.scores arr\[f32,32002\] = [0.000000, 0.000000, 0.000000, 0.0000... llama_model_loader: - kv 15: tokenizer.ggml.token_type arr\[i32,32002\] = [2, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, ... llama_model_loader: - kv 16: tokenizer.ggml.bos_token_id u32 = 1 llama_model_loader: - kv 17: tokenizer.ggml.eos_token_id u32 = 32000 llama_model_loader: - kv 18: tokenizer.ggml.unknown_token_id u32 = 0 llama_model_loader: - kv 19: general.quantization_version u32 = 2 llama_model_loader: - type f32: 65 tensors llama_model_loader: - type q4_0: 225 tensors llama_model_loader: - type q6_K: 1 tensors llm_load_vocab: special tokens definition check successful ( 261/32002 ). llm_load_print_meta: format = GGUF V2 llm_load_print_meta: arch = llama llm_load_print_meta: vocab type = SPM llm_load_print_meta: n_vocab = 32002 llm_load_print_meta: n_merges = 0 llm_load_print_meta: n_ctx_train = 32768 llm_load_print_meta: n_embd = 4096 llm_load_print_meta: n_head = 32 llm_load_print_meta: n_head_kv = 8 llm_load_print_meta: n_layer = 32 llm_load_print_meta: n_rot = 128 llm_load_print_meta: n_embd_head_k = 128 llm_load_print_meta: n_embd_head_v = 128 llm_load_print_meta: n_gqa = 4 llm_load_print_meta: n_embd_k_gqa = 1024 llm_load_print_meta: n_embd_v_gqa = 1024 llm_load_print_meta: f_norm_eps = 0.0e+00 llm_load_print_meta: f_norm_rms_eps = 1.0e-05 llm_load_print_meta: f_clamp_kqv = 0.0e+00 llm_load_print_meta: f_max_alibi_bias = 0.0e+00 llm_load_print_meta: n_ff = 14336 llm_load_print_meta: n_expert = 0 llm_load_print_meta: n_expert_used = 0 llm_load_print_meta: rope scaling = linear llm_load_print_meta: freq_base_train = 10000.0 llm_load_print_meta: freq_scale_train = 1 llm_load_print_meta: n_yarn_orig_ctx = 32768 llm_load_print_meta: rope_finetuned = unknown llm_load_print_meta: model type = 7B llm_load_print_meta: model ftype = Q4_0 llm_load_print_meta: model params = 7.24 B llm_load_print_meta: model size = 3.83 GiB (4.54 BPW) llm_load_print_meta: general.name = open-orca_mistral-7b-openorca llm_load_print_meta: BOS token = 1 '<s>' llm_load_print_meta: EOS token = 32000 '' llm_load_print_meta: UNK token = 0 '\<unk\>' llm_load_print_meta: LF token = 13 '' llm_load_tensors: ggml ctx size = 0.22 MiB llm_load_tensors: offloading 32 repeating layers to GPU llm_load_tensors: offloading non-repeating layers to GPU llm_load_tensors: offloaded 33/33 layers to GPU llm_load_tensors: CPU buffer size = 70.32 MiB llm_load_tensors: CUDA0 buffer size = 3847.56 MiB .................................................................................................. llama_new_context_with_model: n_ctx = 4096 llama_new_context_with_model: freq_base = 10000.0 llama_new_context_with_model: freq_scale = 1 llama_kv_cache_init: CUDA_Host KV buffer size = 512.00 MiB llama_new_context_with_model: KV self size = 512.00 MiB, K (f16): 256.00 MiB, V (f16): 256.00 MiB llama_new_context_with_model: graph splits (measure): 66 llama_new_context_with_model: CUDA0 compute buffer size = 296.00 MiB llama_new_context_with_model: CUDA_Host compute buffer size = 20.00 MiB AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 1 | 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 = 0 | VSX = 0 | ################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################### llama_print_timings: load time = 204.69 ms llama_print_timings: sample time = 43.81 ms / 500 runs ( 0.09 ms per token, 11412.92 tokens per second) llama_print_timings: prompt eval time = 204.58 ms / 62 tokens ( 3.30 ms per token, 303.07 tokens per second) llama_print_timings: eval time = 31397.33 ms / 499 runs ( 62.92 ms per token, 15.89 tokens per second) llama_print_timings: total time = 32731.88 ms / 561 tokens
解决建议
- 调整
n_gpu_layer数值:Mistral-7b只有32个transformer层,设置33等于强制全量GPU加载(包含非重复层),易引发显存或计算异常。建议从20开始逐步测试,比如16、24、32,找到稳定运行的数值。 - 关闭cuBLAS测试性能:开启BLAS后性能下降,可尝试编译llama_cpp_python时禁用BLAS,对比性能差异。编译命令:
CMAKE_ARGS="-DLLAMA_CUBLAS=on -DLLAMA_BLAS=off" pip install llama-cpp-python --force-reinstall --upgrade --no-cache-dir - 检查显存占用:RTX3060为12G显存,Q4_0量化的Mistral-7b模型占约4G,加上4096上下文的KV缓存约512M,理论足够。但如果有其他程序占用显存,会导致异常,可用任务管理器查看GPU显存使用情况。
- 更新依赖库版本:旧版本llama_cpp_python可能存在CUDA兼容性问题,卸载后安装最新版:
pip uninstall llama-cpp-python -y CMAKE_ARGS="-DLLAMA_CUBLAS=on" pip install llama-cpp-python --force-reinstall --upgrade --no-cache-dir - 优化KV缓存位置:尝试将KV缓存放在GPU上,设置
n_gpu_layers=32时添加kv_cache_type="cuda"参数(需确认当前版本支持),减少CPU-GPU数据传输开销。
内容的提问来源于stack exchange,提问作者Phương Nguyễn
相关产品推荐
相关产品推荐

