在 CPU 上运行任意量化 GGUF 模型进行本地推理

在 cpu 上运行任意量化 gguf 模型进行本地推理

本文档旨在指导用户如何使用 llama-cpp-python 库在 CPU 上进行本地推理,以运行任意开源量化 GGUF 格式的大语言模型(LLM),例如 Llama 3、Mistral、Zephyr 等。我们将详细介绍安装步骤、模型下载以及推理代码示例,并提供选择合适模型的建议,帮助读者轻松上手。

使用 llama-cpp-python 进行 CPU 推理

llama-cpp-python 是一个易于使用且能够快速支持新型号量化版本的库,非常适合在 CPU 上运行 GGUF 模型。

1. 安装必要的库

首先,需要安装 llama-cpp-python 和 huggingface_hub。llama-cpp-python 用于加载和运行模型,huggingface_hub 用于从 Hugging Face Model Hub 下载模型。

pip install llama-cpp-pythonpip install huggingface_hub

注意:这里安装的是 CPU 版本的 llama-cpp-python。如果需要 GPU 支持,安装过程会更复杂,不在本文档的讨论范围之内。

2. 下载 GGUF 模型

使用 huggingface_hub 下载所需的 GGUF 模型。以下代码演示了如何下载 Mixtral-8x7B-Instruct-v0.1 模型的 Q4_K_M 量化版本。

from huggingface_hub import hf_hub_downloadmodel_name = "TheBloke/Mixtral-8x7B-Instruct-v0.1-GGUF"model_file = "mixtral-8x7b-instruct-v0.1.Q4_K_M.gguf"  # 选择特定的量化模型文件model_path = hf_hub_download(model_name, filename=model_file)

请根据您的需求选择合适的模型和量化版本。Hugging Face Model Hub 上提供了多种量化级别,例如 Q4_K_M、Q5_K_M 等。量化级别越高,模型体积越大,精度也越高,但对硬件的要求也更高。

3. 加载模型并进行推理

下载模型后,使用 llama-cpp-python 加载模型并进行推理。

from llama_cpp import Llama# 实例化模型llm = Llama(    model_path=model_path,    n_ctx=16000,  # 设置上下文长度    n_threads=32,  # 设置 CPU 线程数    n_gpu_layers=0  # 确保模型在 CPU 上运行)# 设置生成参数generation_kwargs = {    "max_tokens": 20000,    "stop": [""],    "echo": False,  # 是否在输出中显示提示词    "top_k": 1  # 使用贪婪解码,始终选择概率最高的token}# 运行推理prompt = "The meaning of life is "res = llm(prompt, **generation_kwargs)  # res 是一个字典# 从结果中提取生成的文本并打印print(res["choices"][0]["text"])

上述代码首先实例化了 Llama 类,并传入模型路径、上下文长度、CPU 线程数和 GPU 层数等参数。n_gpu_layers=0 确保模型完全在 CPU 上运行。

然后,定义了生成参数,包括最大 token 数、停止词、是否显示提示词以及 top_k 值。top_k=1 意味着使用贪婪解码,始终选择概率最高的 token。可以根据需要调整这些参数。

最后,使用 llm() 函数运行推理,并将提示词和生成参数传入。推理结果存储在 res 字典中,可以从中提取生成的文本并打印。

4. 选择合适的模型

Mixtral-8x7B 是一个相对较大的模型,需要至少 25GB 的 RAM。如果您的设备内存有限,可以选择较小的模型,例如 Llama-2-13B 或 Mistral-7B。以下是一些推荐的模型:

Llama-2-13B-chat-GGUF: model_name=”TheBloke/Llama-2-13B-chat-GGUF”; model_file=”llama-2-13b-chat.Q4_K_M.gguf”Mistral-7B-OpenOrca-GGUF: model_name=”TheBloke/Mistral-7B-OpenOrca-GGUF”; model_file=”mistral-7b-openorca.Q4_K_M.gguf”

注意事项

内存需求: 确保您的设备有足够的 RAM 来加载和运行模型。量化级别: 选择合适的量化级别,以平衡模型大小和精度。CPU 线程数: 根据您的 CPU 核心数设置 n_threads 参数,以充分利用 CPU 资源。上下文长度: 根据您的应用场景设置 n_ctx 参数。更大的上下文长度可以处理更长的输入,但也需要更多的内存。解码策略: 调整 top_k、top_p 等参数,以控制生成文本的质量和多样性。

总结

本文档介绍了如何使用 llama-cpp-python 库在 CPU 上运行任意量化 GGUF 模型进行本地推理。通过安装必要的库、下载模型、加载模型并进行推理,您可以轻松地在自己的设备上运行各种开源 LLM。请根据您的需求选择合适的模型和参数,并根据实际情况进行调整。希望本文档能够帮助您成功上手。

以上就是在 CPU 上运行任意量化 GGUF 模型进行本地推理的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1374974.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 14:36:39
下一篇 2025年12月14日 14:36:49

相关推荐

  • python解释器如何实现字典合并

    Python字典合并主要通过|操作符、**解包和update()方法实现,底层由CPython的哈希表机制高效处理键值对插入与覆盖。 Python 中字典合并的实现方式,主要依赖于语言层面的操作符和内置方法,底层由 CPython 解释器用 C 代码高效处理。字典合并最常见的写法是使用 | 操作符(…

    好文分享 2025年12月14日
    000
  • python卡方检验是什么

    卡方检验用于判断两个分类变量是否相关,Python中可用scipy.stats.chi2_contingency进行独立性检验。首先构建列联表,如性别与喜好数据[[20,10],[15,25]],调用chi2_contingency返回卡方值、P值、自由度和期望频数。若P 卡方检验(Chi-Squa…

    2025年12月14日
    000
  • python正则表达式查找和替换内容

    答案:Python中使用re模块进行正则查找替换,re.search查找首个匹配,re.findall提取所有匹配项,re.sub实现替换功能。示例包括提取邮箱、隐藏电话号码及忽略大小写替换,建议使用原始字符串和预编译提升效率。 在Python中使用正则表达式进行查找和替换,主要依赖于内置的 re …

    2025年12月14日
    000
  • Python日志系统:解决命名日志器不触发根日志器自定义处理器的难题

    本文深入探讨了Python logging模块中一个常见但容易被忽视的问题:当命名日志器(named loggers)的日志消息未能正确传播并触发根日志器(root logger)上动态添加的自定义处理器。通过分析 logging.config.dictConfig 配置中 disable_exis…

    2025年12月14日
    000
  • Python编程:高效生成弗洛伊德三角形

    本文详细介绍了如何在Python中高效地生成弗洛伊德三角形。通过清晰的逻辑和示例代码,读者将学习如何利用循环结构和序列生成技巧,以简洁有效的方式打印出指定行数的弗洛伊德三角形,并避免常见的编程陷阱。 弗洛伊德三角形简介 弗洛伊德三角形(floyd’s triangle)是一个由自然数构成…

    2025年12月14日
    000
  • python中怎么清屏

    答案:在Python中实现清屏可通过os.system()调用系统命令,Windows用’cls’,Linux/macOS用’clear’;更安全的方式是使用subprocess.run();跨平台开发可选用rich等第三方库,如console.cle…

    2025年12月14日
    000
  • YAML 中读取存储在多个变量中的文件名

    YAML 中读取存储在多个变量中的文件名 本文介绍了如何在 YAML 文件中定义共享的根路径,并在其他变量中使用该根路径来构建完整的文件路径。通过使用 Python 的字符串格式化功能,可以有效地解决 YAML 解析时遇到的 ScannerError 问题,从而轻松读取和使用这些文件路径。 在处理包…

    2025年12月14日
    000
  • 使用 PyO3 嵌入 Python 解释器时配置虚拟环境

    本文档旨在解决在使用 PyO3 将 Python 嵌入 Rust 程序时,遇到的 ModuleNotFoundError 错误,尤其是在使用虚拟环境时。PyO3 默认使用全局 Python 安装,但通过手动初始化 Python 解释器并指定虚拟环境路径,可以确保 Rust 代码正确加载虚拟环境中的 …

    2025年12月14日
    000
  • Python在Windows 10中实现同一行递减数字打印

    本文将介绍如何在Windows 10环境下,使用Python实现在同一行打印递减的数字。正如摘要所述,我们将解决数字显示不完整的问题,并提供清晰的代码示例。 实现原理 在控制台中实现动态更新输出的关键在于使用回车符 r。回车符的作用是将光标移动到当前行的开头,后续的输出会覆盖之前的内容。同时,需要设…

    2025年12月14日
    000
  • PyTorch Conv2d 实现详解:定位与理解卷积运算

    本文旨在帮助开发者理解 PyTorch 中 conv2d 函数的底层实现。通过追踪源码,我们将定位卷积运算的具体实现位置,并简要分析其核心逻辑,为深入理解卷积神经网络的底层原理提供指导。 PyTorch 中的 conv2d 函数是实现卷积神经网络的核心算子之一。 虽然可以通过 torch.nn.fu…

    2025年12月14日
    000
  • python中AttributeError异常的介绍

    当Python无法找到对象的属性或方法时会抛出AttributeError,常见于调用不存在的方法(如字符串调用append)、访问未定义属性、拼写错误、模块导入不全或类型误解;可通过dir()查看属性、hasattr()判断存在性、getattr()安全获取来避免;调试时应检查对象类型、拼写及是否…

    2025年12月14日
    000
  • Python 缩进错误:原因、避免与调试

    本文旨在帮助 Python 初学者理解并避免常见的“Expected indented block”错误。通过分析错误原因、提供正确的缩进示例,以及介绍如何利用编辑器或IDE来解决缩进问题,帮助读者编写出更规范、更易读的 Python 代码。 Python 是一种对缩进非常敏感的语言。这意味着代码块…

    2025年12月14日
    000
  • PyTorch Conv2d 实现详解:定位卷积运算的底层代码

    本文旨在帮助开发者快速定位 PyTorch 中 conv2d 函数的底层实现代码。通过追踪 PyTorch 源码,我们将深入了解卷积运算的具体实现位置,从而更好地理解 PyTorch 的底层机制,并为自定义卷积操作提供参考。 PyTorch 的 conv2d 函数是深度学习中常用的卷积操作,但在使用…

    2025年12月14日
    000
  • 使用 PyO3 嵌入 Python 时配置虚拟环境

    本文介绍了在使用 PyO3 将 Python 嵌入 Rust 项目时,如何正确配置和使用虚拟环境,以解决依赖包无法找到的问题。通过手动初始化 Python 解释器,并设置正确的 Python 前缀,确保 PyO3 使用指定的虚拟环境,从而避免 ModuleNotFoundError 错误,保证项目依…

    2025年12月14日
    000
  • Python缩进错误排查与避免:编写清晰可读代码

    本文旨在帮助Python初学者理解和避免常见的“Expected indented block”错误。通过分析错误原因,提供代码示例,并介绍如何使用IDE或编辑器来规范代码缩进,确保Python程序的正确运行和可读性。 Python是一种对缩进非常敏感的语言,错误的缩进会导致程序无法正常运行,并抛出…

    2025年12月14日
    000
  • Python中random模块的方法整理

    Python的random模块提供随机数生成功能,常用于模拟、游戏和抽样。主要方法包括:random()生成[0.0, 1.0)浮点数,uniform(a,b)生成a到b间浮点数,randint(a,b)生成a到b间整数,randrange(start,stop,step)按步长选随机整数;choi…

    2025年12月14日
    000
  • Matplotlib图表交互式保存与重载:利用Pickle实现可编辑绘图会话

    本教程旨在解决Matplotlib图表保存后无法像交互式窗口那样进行拖拽、缩放等操作的问题。通过介绍Python的pickle模块,我们将学习如何将Matplotlib的Axes对象序列化并保存,从而在需要时重新加载该对象,恢复其在Matplotlib环境中的交互性,实现图表的持久化与灵活重用,而非…

    2025年12月14日
    000
  • Matplotlib图表的持久化:如何保存并重新加载可调整的图表

    本教程旨在解决Matplotlib图表保存后无法进行交互式调整的问题。虽然SVG等矢量格式提供了缩放能力,但它们不能在后续重新加载到Matplotlib环境中进行编辑。我们将深入探讨如何利用Python的pickle模块,将Matplotlib的Axes对象序列化保存,从而实现在不同会话中加载并重新…

    2025年12月14日
    000
  • Python 文件读取:f.read() 与 for line in f 的选择

    本文旨在帮助开发者理解 Python 中读取文件的两种常用方法:f.read() 和 for line in f 循环。我们将深入探讨这两种方法的差异、适用场景以及性能考量,并通过示例分析,帮助你根据实际需求选择最合适的读取方式,从而提高代码效率和资源利用率。 Python 提供了多种读取文件的方法…

    2025年12月14日
    000
  • Matplotlib图表持久化:实现可重载的交互式编辑体验

    本文探讨了如何保存Matplotlib图表,使其在后续加载时仍能保持交互性,而非仅作为静态图片。通过使用Python的pickle模块序列化Matplotlib的Axes对象,用户可以捕获图表的当前状态,并在需要时重新加载到Matplotlib环境中,从而实现类似于plt.show()的交互式操作,…

    2025年12月14日
    000

发表回复

登录后才能评论
关注微信