借助DeepSeek之东风扬帆AI海洋(一):快速入门AI必备技术
大模型通常拥有数十亿甚至上百亿的参数,这对运行设备的内存提出了极高的要求——毕竟,只有将模型权重加载到内存中,推理才能顺利进行。而模型加载到内存后,推理的流畅度又与CPU、GPU等计算单元的性能密切相关。要知道,许多大语言模型是在顶级GPU集群上训练的,换到普通个人电脑上,可能五秒才能蹦出一个词,这样的体验显然难以称得上“实用”。
今天,我要介绍一种非常有趣的方式,让你在没有GPU的情况下也能部署DeepSeek模型。这得益于社区大神开发的模型推理框架——llama.cpp。
llama.cpp:让大模型在消费级硬件上运行
llama.cpp的诞生背景可以追溯到2023年,当时Meta开源了Llama系列大语言模型,技术社区随即掀起了一股模型轻量化部署的热潮。保加利亚天才程序员Georgi Gerganov用纯C/C++实现了Llama模型的推理引擎,开创了在消费级硬件上运行大模型的新范式。
与传统的基于Python的AI框架(如PyTorch、TensorFlow)不同,llama.cpp选择了回归底层语言的实现策略。这种设计让它摆脱了Python解释器、CUDA驱动等重型依赖,通过静态编译生成单一可执行文件,在资源受限的环境中展现出独特的优势。项目开源仅三个月,GitHub星标就超过了3万,足以证明其技术路线的成功。
llama.cpp的极简主义设计理念是其最引人注目的特点之一。它完全基于C/C++编写,无需依赖PyTorch、TensorFlow等重型框架,直接编译为可执行文件。这种设计不仅避免了复杂的依赖环境配置,还跳过了不同硬件平台的适配难题,真正实现了“开箱即用”。
在性能优化方面,llama.cpp充分挖掘了硬件的潜力。对于Apple Silicon设备,它利用ARM NEON指令集实现高效的并行计算;而在x86平台上,则通过AVX2指令集加速运算。同时,它还支持F16和F32混合精度计算,既保证了计算效率,又兼顾了模型精度。更值得一提的是,llama.cpp引入了4-bit量化技术,使得模型体积大幅缩减,甚至可以在没有GPU的情况下,仅靠CPU就能流畅地运行大模型。
根据开发者提供的数据,在M1 MacBook Pro上运行Llama-7B模型时,每个token的推理时间仅需60毫秒,相当于每秒处理十多个token。这样的速度对于本地化部署的大模型来说,已经相当可观。得益于纯C/C++实现的高效性,llama.cpp不仅能在MacBook Pro上运行,甚至可以在Android设备上流畅执行。
量化技术:降低硬件门槛的关键
在深度神经网络模型的开发流程中,结构设计完成后,训练阶段的核心任务是通过大量数据调整模型的权重参数。这些权重通常以浮点数的形式存储,常见的精度包括16位(FP16)、32位(FP32)和64位(FP64)。
训练过程通常依赖GPU的强大算力来加速计算,但这也带来了较高的硬件需求。为了降低这些需求,量化技术应运而生。量化的原理可以概括为:通过降低权重参数的精度,减少模型对计算资源和存储空间的要求,从而使其能够在更多设备上运行。
以Llama模型为例,其原始版本采用16位浮点精度(FP16)。一个包含70亿参数的7B模型,完整大小约为14 GB。这意味着用户至少需要14 GB的显存才能加载和使用该模型。而对于更大的13B版本,模型大小更是达到26 GB,这对普通用户来说无疑是巨大的负担。
然而,通过量化技术,例如将权重精度从16位降至4位,7B模型的大小可以压缩至约4 GB,13B模型则压缩至8 GB左右。这种显著的体积缩减使得这些大模型能够在消费级硬件上运行,普通用户也能在个人电脑上体验大模型的强大能力。
llama.cpp的量化实现依赖于作者Georgi Gerganov开发的另一个库——ggml。ggml是一个用C/C++实现的机器学习库,专注于高效处理神经网络中的核心数据结构——张量(tensor)。张量是多维数组的泛化形式,广泛用于TensorFlow、PyTorch等主流深度学习框架中。通过改用C/C++实现,ggml不仅支持更广泛的硬件平台,还显著提升了计算效率。这种高效的设计为llama.cpp的诞生提供了坚实的基础,使其能够在资源受限的环境中实现高性能的模型推理。
量化技术的核心在于权衡精度与效率。通过降低权重参数的精度,模型的计算量和存储需求大幅减少,但同时也可能引入一定的精度损失。因此,量化算法的设计需要在压缩率和模型性能之间找到最佳平衡点。ggml库通过创新的量化策略和高效的张量计算实现,在成功保持较高模型性能的同时,也显著降低了硬件门槛。这种技术突破不仅让大模型得以在普通设备上运行,也为边缘计算和移动端AI应用开辟了新的可能性。
使用 llama.cpp 部署 DeepSeek
要使用llama.cpp部署DeepSeek模型,首先需要准备一台只有CPU的服务器。这里以一台4核16G规格的Ubuntu 22.04服务器为例。硬件准备好后,接下来就是配置llama.cpp工具。
llama.cpp的使用可以通过源码编译,也可以直接使用作者编译好的release版本。作者更新版本的速度非常快,有时几乎一天就更新好几个版本。你可以根据自己的系统选择合适的版本。以llama-b4707-bin-ubuntu-x64.zip为例,下载后将其解压到环境变量目录(如/usr/local/llama),然后在/etc/profile文件中配置环境变量,确保llama.cpp的二进制工具可以在任意地方执行。
如果你的系统没有安装gcc,还需要安装一下,否则可能会报找不到库的错误。最后,配置一下lib库的环境变量:
LD_LIBRARY_PATH=$(pwd):$LD_LIBRARY_PATH
这是因为llama.cpp自带了一堆.so文件,需要能被引用到。
接下来是模型下载。你需要下载适配llama.cpp的GGUF版本,而不是DeepSeek的原版本。以DeepSeek的7B模型为例,有多个量化版本可以选择,通常推荐使用Q6或Q8版本的模型。下载完成后,将模型上传到服务器。
启动模型的命令如下:
llama-cli -m ./DeepSeek-R1-Distill-Qwen-7B-Q6_K_M.gguf -co -cnv -p "你 是 一 个 python编 程 专 家 " -n 512
既然服务器没有显存,那模型就只能占用内存了。看一下,这个模型占了多少内存。使用命令:
ps aux --sort=%mem
发布成 HTTP 服务
llama.cpp是否也能像Ollama或vLLM一样,将模型发布成HTTP服务,让用户通过API访问呢?答案是肯定的。这里推荐两种方法。
第一种方法:使用官方的服务启动
在终端输入下面的命令。
llama-server --model DeepSeek-R1-Distill-Qwen-7B-Q6_K_M.gguf
测试一下效果:
curl http://localhost:8080/v1/completions \ -H "Content-Type: application/json" \ -d '{ "model": "deepseek-r1", "prompt": "你好", "max_tokens": 1024, "temperature": 0 }'
第二种方法:使用第三方库
需要安装一下,命令如下。
apt install ninja-buildpip install uvicorn anyio starlette fastapi sse_starlette starlette_context pydantic_settingspip install llama-cpp-python -i https://mirrors.aliyun.com/pypi/simple/
安装好后运行模型:
python3 -m llama_cpp.server --model ./DeepSeek-R1-Distill-Qwen-7B-Q6_K_M.gguf
第三方库的好处在于兼容OpenAI数据格式。你可以用OpenAI方式访问:
curl http://localhost:8000/v1/chat/completions \-H "Content-Type: application/json" \-d '{ "messages": [ {"role": "system", "content": "你是一个python专家"}, {"role": "user", "content": "python的字典数据类型如何定义"} ]}'
总结
目前GPU资源相对稀缺,像llama.cpp这样的方案在特定场景下具有很高的价值。例如,原本运行一个满血的671B DeepSeek-R1模型需要至少16张A100 GPU,但如果能使用大量内存替代显存,成本将大幅降低。最近清华大学开发的KTransformer推理引擎,用24G的4090显卡部署了满血版DeepSeek-R1,虽然使用的是Q4量化版且占用了300多G内存,但确实将普通人玩AI的门槛又降低了一大截。
llama.cpp的出现,不仅为大模型的本地化部署提供了新的可能性,也为AI技术的普及打开了新的大门。未来,随着技术的不断演进,我们或许能在更多设备上体验到AI的强大能力。