如何在本地运行大语言模型,保护数据隐私(上)

如何在本地运行大语言模型,保护数据隐私(上)

大型语言模型(LLM)已经深刻地变革了技术领域,但数据安全问题依然严峻,尤其是在将敏感信息发送到第三方服务器时。在本文中,我们将探讨如何在本地、私有环境(即个人计算机)中部署LLM模型,例如Llama模型。我们在本地运行了Llama 3.1,并分析了不同版本和框架的速度、功耗和整体性能,提供详细的评测。

不论是技术专家还是好奇的读者,都能在本文中获得关于本地LLM部署的见解。对于简要概述,非技术读者可以参阅我们的汇总表,而技术读者可进一步了解具体工具和性能评测。如果你想了解更多关于LLM的相关内容,可以阅读以下这些文章:
大语言模型:AI如何改变医疗现状
为什么大语言模型不适合编码?
AI驱动的财务分析:多代理LLM系统将数据转化为见解
2024年打造生产级LLM应用的最佳技术栈

要点

  • LLM本地运行:可以下载LLM模型,使用社区中广泛的工具和框架在私有服务器上本地运行。虽然最强大的模型需要昂贵的硬件,但小型模型可以在笔记本电脑或台式机上顺畅运行。
  • 隐私与定制性:本地运行LLM不仅提升隐私保护,还增强了模型设置与使用策略的控制权。
  • 模型规模:开源Llama模型有不同的规模,如Llama 3.1 提供了80亿、700亿和4050亿参数版本。参数数量越多,模型性能越强,但同时也需要更高的内存和存储需求。
  • 量化:量化通过将参数“舍入”至更低的精度来减少内存和磁盘空间,但可能影响模型的精度。对于含有大量参数的LLM,量化在降低内存使用和加快执行速度方面至关重要。
  • 成本效益:与云端解决方案相比,基于GPU的本地实现可以显著节省成本。

隐私与可靠性的重要性

在我们之前的文章中,探讨了LLM的关键概念及其应用,例如通过Langchain等框架创建个性化的聊天机器人或工具(见图1)。这种架构虽可采用合成数据或混淆数据的方法来保护隐私,但仍需要将数据传输至第三方,并且无法控制模型、策略或可用性方面的变化。一个有效的解决方案是在私有服务器上运行LLM(见图2)。此举可以完全保障数据隐私,减少对外部服务商的依赖。

私有部署LLM需要考虑成本、功耗和处理速度。在我们的实验中,主要运行的是Llama 3.1,测试其在不同量化级别与框架中的性能表现。这些权衡对于希望利用AI潜力并保持数据与资源控制的用户尤为重要。

图1

图1 说明聊天机器人或工具的典型后端设置的图表,其中ChatGPT(或类似模型)作为自然语言处理引擎。这种设置依赖于快速工程来定制响应。”

图2

图2 完全私有后端配置的示意图,其中所有组件(包括大型语言模型)都托管在安全服务器上,确保完全控制和隐私。

量化和GGUF文件

在深入了解我们所探索的工具之前,让我们首先讨论量化和GGUF格式。

量化是一种通过将权重和偏差从高精度浮点值转换为低精度表示来减小模型大小的技术。LLM从这种方法中受益匪浅,因为它们有大量的参数。例如,最大版本的Llama3.1包含了惊人的4050亿个参数。量化可以显著减少内存使用和执行时间,使这些模型更有效地在各种设备上运行。

GGUF格式用于存储LLM模型,最近在分发和运行量化模型方面得到了普及。它针对快速加载、读取和保存进行了优化。与只使用张量的格式不同,GGUF还以标准化的方式存储模型元数据,使框架更容易支持这种格式,甚至将其作为规范。

分析的工具和模型

我们探索了四种工具来本地运行Llama模型:

  • Hugging Face的Transformers库与Hub
  • vLLM
  • llama.cpp
  • Ollama

我们主要关注的是llama.cpp和Ollama,因为这些工具允许我们快速有效地部署模型。具体来说,我们探讨了它们的速度、能源成本和整体性能。对于模型,我们主要分析了量化的8B和70B Llama 3.1版本,因为它们在合理的时间范围内运行。

HuggingFace

Hugging Face提供了一个丰富的模型和工具库,使其成为开发者的热门选择。Transformers库支持通过bitsandbytes进行4位和8位量化,但直接使用变压器库加载量化模型在内存占用上表现不佳。尽管如此,Hugging Face在文档、社区支持和训练框架方面具有独特优势。

vLLM

与hugs Face类似,vLLM可以通过正确配置的Python环境轻松安装。然而,对GGUF文件的支持仍然是高度实验性的。虽然我们能够快速设置它以运行8B模型,但尽管有出色的文档,但超出这个范围的扩展证明是具有挑战性的。

总的来说,我们相信vLLM有很大的潜力。然而,我们最终选择了llama.cpp和Ollama框架,因为它们具有更直接的兼容性和效率。公平地说,本可以在这里进行更彻底的调查,但考虑到我们在其他库中发现的直接成功,我们选择关注这些库。

Ollama

我们发现Ollama非常棒。我们最初的印象是,它是一个用户准备好的工具,用于本地推断Llama模型,具有开箱即用的易用性。Mac和Linux用户安装它很简单,Windows版本目前正在预览中。Ollama自动检测你的硬件和管理模型卸载之间的CPU和GPU无缝。它有自己的模型库,可以自动下载模型并支持GGUF文件。虽然它的速度比lama.cpp略慢,但即使在只有cpu的设置和笔记本电脑上,它也表现得很好。

为了快速入门,安装后,运行ollama run llama3.1:latest将直接从命令行以对话模式加载最新的8B模型。

一个缺点是自定义模型可能有些不切实际,特别是对于高级开发。例如,即使调整温度也需要创建一个新的聊天机器人实例,而这个实例又会加载一个已安装的模型。虽然这是一个小小的不便,但它确实有助于在单个文件中设置自定义聊天机器人(包括其他参数和角色)。总的来说,我们相信Ollama是一个有效的本地工具,它模仿了云服务的一些关键功能。

值得注意的是,Ollama作为一种服务运行,至少在Linux机器上是这样,它提供了方便、简单的命令来监控哪些模型正在运行以及它们在哪里被卸载,如果需要,还可以立即停止它们。社区面临的一个挑战是配置某些方面,例如模型存储的位置,这需要Linux系统的技术知识。虽然这可能不会对最终用户造成问题,但它可能会略微损害该工具在高级开发目的中的实用性。

llama.cpp

在分析过程中,lama.cpp成为我们最喜欢的工具。正如其存储库中所述,它旨在以最小的设置和先进的性能在大型语言模型上运行推断。像Ollama一样,它支持CPU和GPU之间的卸载模型,尽管这不是直接开箱即用的。要启用GPU支持,你必须使用适当的标志编译工具-特别是GGML_CUDA=on。我们建议使用最新版本的CUDA工具包,因为旧版本可能不兼容。

该工具可以通过从存储库中提取并编译来独立安装,这为运行模型提供了方便的命令行客户端。例如,你可以执行llama-cli -p ‘you are a useful assistant’ -m Meta-Llama-3-8B-Instruct.Q8_0。gguf cnv。这里,最后一个标志直接从命令行启用对话模式。lama-cli提供了各种定制选项,比如调整上下文大小、重复惩罚和温度,它还支持GPU卸载选项。

与Ollama类似,llama.cpp有一个Python绑定,可以通过pip install llama-cpp-python来安装。这个Python库允许大量定制,使开发人员可以轻松地根据特定的客户需求定制模型。然而,与独立版本一样,Python绑定需要使用适当的标志进行编译以启用GPU支持。

一个小缺点是该工具还不支持自动CPU-GPU卸载。相反,用户需要手动指定将多少层卸载到GPU上,其余的交给CPU。虽然这需要一些微调,但这是一个简单、可控的步骤。

对于像我们这样有多个gpu的环境,llama.cpp提供了两种分割模式:行模式和层模式。在行模式下,一个GPU处理小张量和中间结果,而在层模式下,层在GPU之间划分。在我们的测试中,这两种模式都提供了相当的性能(请参阅下面的分析)

实验分析

从现在开始,结果只涉及llama.cpp和Ollama。

我们使用Ollama和Llama .cpp对70B和8B Llama 3.1模型的速度和功耗进行了分析。具体来说,我们检查了quantfactory中可用的各种量化方法中每个模型的速度和每个令牌的功耗。

为了执行此分析,我们开发了一个小应用程序,以便在选择工具后评估模型。在推理过程中,我们记录了一些指标,例如速度(每秒令牌数)、生成的令牌总数、温度、gpu上加载的层数以及响应的质量评级。此外,我们还测量了模型执行期间GPU的功耗。在每个令牌生成之后,使用一个脚本(通过nvidia-smi)立即监视GPU的电量使用情况。推断完成后,我们根据这些读数计算平均功耗。由于我们关注的是完全适合GPU内存的模型,所以我们只测量GPU功耗。

此外,实验采用多种提示进行,以确保不同的输出大小,因此,数据涵盖了广泛的场景。

(文章较长,剩下的部分明天发~)

原文作者:Robert Corwin
翻译作者:过儿
美工编辑:过儿
校对审稿:Jason
原文链接:https://towardsdatascience.com/running-large-language-models-privately-a-comparison-of-frameworks-models-and-costs-ac33cfe3a462