使用llama调用gguf模型

from llama_cpp import Llama

# 加载 .gguf 格式的模型
model = Llama(model_path='/home/lqsilicon/Public/xgx/llama.cpp/models/llama-2-7b-chat.Q4_0.gguf')

# 输入问题
question = "What is the capital of France?"

response = model(question)

# 提取生成的文本
generated_text = response['choices'][0]['text']

# 打印生成的答案
print(generated_text)

注意 回答中的tokens的数量可能会被限制造成回答不全 可以手动进行设置

response = model(question,max_tokens=4096 )

结果为

/home/lqsilicon/Workspace/llama32_env/bin/python3 /tmp/pycharm_project_676/test.py 
llama_model_loader: loaded meta data with 19 key-value pairs and 291 tensors from /home/lqsilicon/Public/xgx/llama.cpp/models/llama-2-7b-chat.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              = LLaMA v2
llama_model_loader: - kv   2:                       llama.context_length u32              = 4096
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              = 11008
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              = 32
llama_model_loader: - kv   9:     llama.attention.layer_norm_rms_epsilon f32              = 0.000001
llama_model_loader: - kv  10:                          general.file_type u32              = 2
llama_model_loader: - kv  11:                       tokenizer.ggml.model str              = llama
llama_model_loader: - kv  12:                      tokenizer.ggml.tokens arr[str,32000]   = ["<unk>", "<s>", "</s>", "<0x00>", "<...
llama_model_loader: - kv  13:                      tokenizer.ggml.scores arr[f32,32000]   = [0.000000, 0.000000, 0.000000, 0.0000...
llama_model_loader: - kv  14:                  tokenizer.ggml.token_type arr[i32,32000]   = [2, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, ...
llama_model_loader: - kv  15:                tokenizer.ggml.bos_token_id u32              = 1
llama_model_loader: - kv  16:                tokenizer.ggml.eos_token_id u32              = 2
llama_model_loader: - kv  17:            tokenizer.ggml.unknown_token_id u32              = 0
llama_model_loader: - kv  18:               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: control token:      2 '</s>' is not marked as EOG
llm_load_vocab: control token:      1 '<s>' is not marked as EOG
llm_load_vocab: special_eos_id is not in special_eog_ids - the tokenizer config may be incorrect
llm_load_vocab: special tokens cache size = 3
llm_load_vocab: token to piece cache size = 0.1684 MB
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          = 32000
llm_load_print_meta: n_merges         = 0
llm_load_print_meta: vocab_only       = 0
llm_load_print_meta: n_ctx_train      = 4096
llm_load_print_meta: n_embd           = 4096
llm_load_print_meta: n_layer          = 32
llm_load_print_meta: n_head           = 32
llm_load_print_meta: n_head_kv        = 32
llm_load_print_meta: n_rot            = 128
llm_load_print_meta: n_swa            = 0
llm_load_print_meta: n_embd_head_k    = 128
llm_load_print_meta: n_embd_head_v    = 128
llm_load_print_meta: n_gqa            = 1
llm_load_print_meta: n_embd_k_gqa     = 4096
llm_load_print_meta: n_embd_v_gqa     = 4096
llm_load_print_meta: f_norm_eps       = 0.0e+00
llm_load_print_meta: f_norm_rms_eps   = 1.0e-06
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: f_logit_scale    = 0.0e+00
llm_load_print_meta: n_ff             = 11008
llm_load_print_meta: n_expert         = 0
llm_load_print_meta: n_expert_used    = 0
llm_load_print_meta: causal attn      = 1
llm_load_print_meta: pooling type     = 0
llm_load_print_meta: rope type        = 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_ctx_orig_yarn  = 4096
llm_load_print_meta: rope_finetuned   = unknown
llm_load_print_meta: ssm_d_conv       = 0
llm_load_print_meta: ssm_d_inner      = 0
llm_load_print_meta: ssm_d_state      = 0
llm_load_print_meta: ssm_dt_rank      = 0
llm_load_print_meta: ssm_dt_b_c_rms   = 0
llm_load_print_meta: model type       = 7B
llm_load_print_meta: model ftype      = Q4_0
llm_load_print_meta: model params     = 6.74 B
llm_load_print_meta: model size       = 3.56 GiB (4.54 BPW) 
llm_load_print_meta: general.name     = LLaMA v2
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_print_meta: EOG token        = 2 '</s>'
llm_load_print_meta: max token length = 48
llm_load_tensors: tensor 'token_embd.weight' (q4_0) (and 290 others) cannot be used with preferred buffer type CPU_AARCH64, using CPU instead
llm_load_tensors:   CPU_Mapped model buffer size =  3647.87 MiB
..................................................................................................
llama_new_context_with_model: n_seq_max     = 1
llama_new_context_with_model: n_ctx         = 512
llama_new_context_with_model: n_ctx_per_seq = 512
llama_new_context_with_model: n_batch       = 512
llama_new_context_with_model: n_ubatch      = 512
llama_new_context_with_model: flash_attn    = 0
llama_new_context_with_model: freq_base     = 10000.0
llama_new_context_with_model: freq_scale    = 1
llama_new_context_with_model: n_ctx_per_seq (512) < n_ctx_train (4096) -- the full capacity of the model will not be utilized
llama_kv_cache_init:        CPU KV buffer size =   256.00 MiB
llama_new_context_with_model: KV self size  =  256.00 MiB, K (f16):  128.00 MiB, V (f16):  128.00 MiB
llama_new_context_with_model:        CPU  output buffer size =     0.12 MiB
llama_new_context_with_model:        CPU compute buffer size =    70.50 MiB
llama_new_context_with_model: graph nodes  = 1030
llama_new_context_with_model: graph splits = 1
AVX = 1 | AVX_VNNI = 0 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | AVX512_BF16 = 0 | AMX_INT8 = 0 | FMA = 1 | NEON = 0 | SVE = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | RISCV_VECT = 0 | WASM_SIMD = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 | 
Model metadata: {'tokenizer.ggml.unknown_token_id': '0', 'tokenizer.ggml.eos_token_id': '2', 'general.architecture': 'llama', 'llama.context_length': '4096', 'general.name': 'LLaMA v2', 'llama.embedding_length': '4096', 'llama.feed_forward_length': '11008', 'llama.attention.layer_norm_rms_epsilon': '0.000001', 'llama.rope.dimension_count': '128', 'llama.attention.head_count': '32', 'tokenizer.ggml.bos_token_id': '1', 'llama.block_count': '32', 'llama.attention.head_count_kv': '32', 'general.quantization_version': '2', 'tokenizer.ggml.model': 'llama', 'general.file_type': '2'}
Using fallback chat format: llama-2
llama_perf_context_print:        load time =    2867.75 ms
llama_perf_context_print: prompt eval time =       0.00 ms /     8 tokens (    0.00 ms per token,      inf tokens per second)
llama_perf_context_print:        eval time =       0.00 ms /    13 runs   (    0.00 ms per token,      inf tokens per second)
llama_perf_context_print:       total time =    4797.69 ms /    21 tokens

();`

Answer: The capital of France is Paris.

GGUF (Generic GPU Unified Format)

GGUF(Generic GPU Unified Format)是一种用于深度学习模型的数据存储和交换格式,旨在支持高效的模型加载和推理操作。该格式由 llama.cpp 等推理框架使用,特别适用于量化和优化后的模型。GGUF 格式的主要特点包括:

  1. 高效的存储和加载: GGUF 格式专为大规模深度学习模型设计,可以存储包括权重、配置、词汇表等在内的完整模型数据,优化了模型加载速度。

  2. 量化支持: GGUF 格式通常支持模型的量化(如 Q4_0Q6_K 等量化级别),这意味着它能够在保持性能的前提下,减小模型的体积和内存占用,适合推理时使用。

  3. 适应多种硬件: GGUF 格式支持跨平台的模型推理,能够在多种硬件上运行,包括 CPU、GPU 和其他加速设备。这使得它成为一个广泛应用于推理场景的统一格式。

  4. 支持多种深度学习框架: GGUF 格式不依赖于特定的深度学习框架,能够支持从多个框架(如 PyTorch、TensorFlow 等)转换过来的模型。其主要目的是为推理过程提供统一、简洁的接口,减少框架和硬件之间的兼容性问题。

主要优势:
  • 高效的内存管理:通过量化和优化,GGUF 格式减少了内存占用和计算开销。
  • 统一格式:支持从不同训练框架导出的模型,兼容性强。
  • 推理性能提升:优化了推理流程,特别是在量化后的版本中,性能和速度有显著提升。
常见用途:
  • 部署在资源受限的设备上:例如嵌入式设备、移动设备等。
  • 大规模推理:在云端或本地服务器上进行高效推理任务。
  • 优化后的深度学习模型:尤其是经过量化、剪枝等优化后的模型,适合在生产环境中部署。

llama.cpp

llama.cpp 是一个高效的 C++ 实现,专门用于运行 LLaMA(Large Language Model Meta AI)系列模型,特别是针对 LLaMA v2 模型的优化。llama.cpp 提供了对 LLaMA 模型的推理支持,并提供了许多优化和扩展功能,使得 LLaMA 模型能够在更广泛的硬件平台上进行高效推理。

主要特点:
  1. 高效的推理框架llama.cpp 提供了一种轻量级的推理框架,专门用于加载和执行 LLaMA 模型,能够高效地在不同硬件上运行,包括 CPU 和 GPU。它支持高效的内存管理,优化了计算和数据流的处理。

  2. 支持 GGUF 格式llama.cpp 支持使用 GGUF 格式的模型文件,这意味着用户可以将原本训练在 PyTorch 或 TensorFlow 中的 LLaMA 模型转换为 GGUF 格式,并在 llama.cpp 中进行高效推理。

  3. 量化支持llama.cpp 支持对 LLaMA 模型的量化,包括常见的量化格式,如 Q4_0Q6_K 等。这些量化格式能显著减小模型的内存占用,使其适应低功耗设备和边缘设备。

  4. 灵活的模型加载llama.cpp 允许用户灵活地加载和切换模型,支持不同版本的 LLaMA 模型。用户可以根据硬件资源和计算需求选择合适的模型版本。

  5. 支持批量推理llama.cpp 提供了批量推理的支持,使得模型推理可以并行处理多个输入,提高推理效率,特别适合在大规模并行任务中使用。

主要优势:
  • 高效性:通过 C++ 实现,llama.cpp 提供了快速的模型加载和推理性能,适合生产环境部署。
  • 多平台支持:不仅支持常规的 CPU,还能支持 GPU 和其他硬件加速设备。
  • 量化和优化:支持量化后的模型,能够在有限的硬件资源上进行高效推理。
  • 易于集成:提供了简洁的接口,可以方便地与其他应用集成,支持多种输入输出格式。
典型应用:
  • 大规模推理任务:可以用于云端服务器、大规模数据中心等环境,支持并发处理多个推理请求。
  • 低资源设备:适用于嵌入式设备、移动端和其他资源受限的设备,能够实现较高效的推理。
  • 量化模型部署:优化后的量化模型可以在不牺牲性能的前提下,减少内存和计算开销。

GGUF 和 llama.cpp 之间的关系

  1. GGUF作为存储格式

    • GGUF 是一种用于存储和交换大规模深度学习模型的数据格式。llama.cpp 支持从 GGUF 格式加载 LLaMA 模型,能够高效地利用该格式提供的优化(如量化)来提升推理性能。
  2. 转换和兼容性

    • 你可以使用 llama.cpp 提供的转换工具,将 PyTorch 或 TensorFlow 格式的 LLaMA 模型转换为 GGUF 格式。这使得用户能够轻松将训练好的模型转换为 llama.cpp 所支持的格式,并进行推理。
  3. 模型加载与推理

    • 使用 llama.cpp 加载 GGUF 格式的模型时,能够充分利用其内存和计算优化,使得在不同硬件平台上的推理更加高效。

总结

  • GGUF 是一种用于存储和交换深度学习模型的数据格式,特别适合大规模模型,支持量化优化,能够提升推理效率。
  • llama.cpp 是一个高效的 C++ 推理框架,专为 LLaMA 模型设计,支持 GGUF 格式的模型,可以高效地执行模型推理,支持不同硬件平台和量化模型。

通过将 LLaMA 模型转换为 GGUF 格式,并使用 llama.cpp 进行推理,用户能够在不同硬件和资源环境中高效地执行大规模语言模型的推理任务。

### 关于LLaMA模型GGUF格式下的推理方法 为了利用LLaMA模型进行基于GGUF格式的推理,开发者通常依赖`llama.cpp`库所提供的工具集。该库不仅支持将预训练的大规模语言模型转化为更高效的GGUF格式文件,还提供了执行量化操作的能力,从而减少模型大小而不显著影响性能[^1]。 #### 准备工作 确保已经安装了最新版本的`llama.cpp`库,下载所需的LLaMA模型权重。如果目标是使用经过量化的GGUF格式模型,则需先通过指定命令完成转换过程: ```bash python convert_hf_to_gguf.py <你的模型所在路径> --outtype q8_0 --outfile <希望保存的路径> ``` 此脚本会读取原始模型参数将它们存储到新的`.gguf`文件中,在这个例子中采用了Q8_0量化方案以达到更好的压缩效果[^4]。 #### 加载与初始化模型 一旦拥有了GGUF格式的模型文件,就可以着手准备加载它来进行推理任务。下面是一个简单的Python代码片段展示如何实例化一个能够处理文本输入生成相应输出的对象: ```python from llama_cpp import Llama model_path = "<已转换好的GGUF格式模型路径>" llm = Llama(model_path=model_path) context = "Once upon a time" output = llm(context, max_tokens=50) print(output['choices'][0]['text']) ``` 上述代码首先导入必要的模块,接着创建了一个`Llama`类的新实例,传入之前获得的GGUF格式模型的位置作为参数。之后定义了一段初始上下文字符串供后续调用使用;最后调用模型对象上的方法传递这段文字,指定了最大返回token数量为50个字符长度的结果。 #### 执行推理 当一切设置就绪后,只需简单地向模型提供想要预测的内容即可得到回应。值得注意的是,由于这里采用的是较为轻量级的方式运行大型语言模型,所以在某些情况下可能无法完全重现官方API所能提供的全部功能特性。不过对于许多应用场景而言,这样的解决方案仍然具有很高的实用价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值