Zhi Wei 的个人博客
本地玩转DeepSeek(一、部署)
本地玩转DeepSeek(一、部署)

本地玩转DeepSeek(一、部署)

2025年春节,一款名叫DeepSeek的大语言模型在中文互联网上爆火,一度成为了流量密码。在习惯了使用OPENAI的GPT搜索和寻找灵感以后,其逐渐的成为了我生活的一部分,为了更加深入的了解LLM大语言模型,我尝试在本地部署一套私有化的LLM模型。

写在前面

· 什么是LLM大语言模型

大语言模型LLM(Large Language Model),是一种由包含数百亿以上参数的深度神经网络构建的语言模型。2017 年,Transformer模型提出并在机器翻译任务上取得巨大成功,为大语言模型研究奠定了基础,当前大语言模型基本都是基于 Transformer 结构。2018 年,OpenAI 和Google 相继提出了基于 Transformer 的大规模预训练语言模型 GPT 和 BERT。

2023 年 3 月,OpenAI 推出参数量高达 1.8万亿的 GPT-4 模型,该模型拥有多模态理解能力,展现出接近“通用人工智能(AGI)”的能力和水平1。各大公司和研究机构也相继发布各类大模型,包括 Google 推出的 Bard、智谱的 ChatGLM、百度的文心一言、科大讯飞的星火、阿里云的通义千问等。大模型呈爆发式增长。

· DeepSeek爆火的原因

深度求索公司推出的开源LLM模型DeepSeek,并非是在性能方面全方位超越GPT和谷歌的模型,而是在一个相近性能水平上,所消耗的算力成本远低于OpenAI的模型,据网络上公开的消息DeepSeek-V3使用了2048张英伟达H800 GPU,费用大约500万美元。而OpenAI则需要至少10000张。

这意味着相比闭源的OpenAI,DeepSeek 的开源模型明显成为了另外一个成本更加低的选择,同时也拉低了LLM部署的门框,使得更多的开发者和中小企业可以将AI技术应用到实际生产中来,打破了AI领域的在资本市场中的垄断。

准备阶段

· 选择LLM模型

DeepSeek-R1是继DeepSeek-V3模型后深度求索推出的LLM模型,原版 DeepSeek-R1 671B 全量模型的文件体积高达 720GB,对于消费级市场的硬件来说,是属于看一眼都算僭越的程度。但是R1模型还有通过知识蒸馏后微调的1.5B/7B/8B模型。这里我们选择DeepSeek-R1-Distill-Llama-8B模型。

知识蒸馏是一种将复杂的大型模型(教师模型)的知识迁移到较小的模型(学生模型)中的技术。从模型的命名和Github文档中可以看到可以清晰的看出DeepSeek-R1-Distill-Llama-8B模型是使用DeepSeek-R1模型传授Llama-3.1-8B模型知识和微调后得到的模型。

· 模型细节

B是billion的缩写,表示模型的参数大小,8B就表示80亿个参数。模型参数越高,知识储备就越高,能力也就越强。LLM模型还有一个参数叫做浮点数(Floating Point),简称FP。FP的精度(FP32、FP16、BF16、FP8)与模型体积大小之间存在着密切的关系,BF16精度1个参数使用2个字节存储。粗略计算一下模型的体积8000000000*2≈15GB,显存占用约为15GB *1.2。

然而对于我12GB显存的RTX 4070 来说这个大小是不可以接受的,所以还需要对模型进行量化(Quantization)。量化就是将浮点精度进行转换压缩,可以降低参数所需的存储空间,模型体积降低后,可以提升模型运行速度,显存占用也会降低。缺点是精度损失后,模型计算结果也会失准,直观的感受就是模型变笨了。然而,通过使用适当的量化技术和校准方法,可以在保持可接受的精度水平的同时实现显著的压缩和加速。2

· Debian安装显卡驱动

NVIDIA官网中给出的专有Linux发行版驱动包仅有Arch和FreeDS。而通用的驱动包也无法直接安装在Debian 12上,参照Debian官方帮助文档:https://wiki.debian.org/NvidiaGraphicsDrivers#Debian_12_.22Bookworm.22,安装完驱动后会导致无法登录到Debian的GNOME桌面环境,需要打开Nvidia的电源管理服务,参考文档配置完成后即可成功进入桌面环境。https://wiki.debian.org/NvidiaGraphicsDrivers#Wayland

成功进入桌面后在安装NVIDIA CUDA工具包,Debian社区中的CUDA版本更新比较慢,最新版可以直接从NVIDIA官方安装,参考:https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html。安装Docker参考:https://docs.docker.com/engine/install/debian/

root@AI:~# apt install nvidia-open-kernel-dkms nvidia-driver firmware-misc-nonfree
root@AI:~# cat /sys/module/nvidia_drm/parameters/modeset #返回Y则跳过设置drm
root@AI:~# echo "options nvidia-drm modeset=1" >> /etc/modprobe.d/nvidia-options.conf
root@AI:~# echo "options nvidia NVreg_PreserveVideoMemoryAllocations=1" >> /etc/modprobe.d/nvidia-options.conf
root@AI:~# reboot
root@AI:~# echo 'GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX nvidia-drm.modeset=1"' > /etc/default/grub.d/nvidia-modeset.cfg
root@AI:~# update-grub
root@AI:~# systemctl enable nvidia-suspend.service
root@AI:~# systemctl enable nvidia-hibernate.service
root@AI:~# systemctl enable nvidia-resume.service
root@AI:~# reboot
root@AI:~# apt install nvidia-cuda-dev nvidia-cuda-toolkit #安装CUDA
root@AI:~# docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi #docker容器测试是否支持CUDA
Fri Mar 28 06:51:17 2025       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.216.01             Driver Version: 535.216.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4070        On  | 00000000:01:00.0 Off |                  N/A |
|  0%   33C    P8               9W / 200W |   2841MiB / 12282MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
+---------------------------------------------------------------------------------------+

部署LLM模型

常见的本地部署LLM的工具有vLLMollama,在定位上vLLM更偏向于企业级,在高并发的场景下具有优势,一般使用HuggingFace格式的模型文件,可以使用原始的模型浮点精度,可定制程度高,资源需求高。

ollama偏向于个人或实验,部署非常便捷,使用已经量化过的GGUF(GGML Unified Format)格式模型文件,并且已经封装好,用户只需要Pull模型即可,对显存占用较低。

安装ollama

ollama的安装还是比较简单的,执行官方给出的安装脚本https://ollama.com/download/linux,然后修改一下监听端口https://github.com/ollama/ollama/blob/main/docs/faq.md。整体操作类似使用Docker操作容器,可以使用ps list run stop等命令控制模型。

root@AI:~# curl -fsSL https://ollama.com/install.sh | sh
root@AI:~# systemctl edit ollama.service
root@AI:~# systemctl daemon-reload && systemctl restart ollama
root@AI:~# ollama run deepseek-r1:8b
>>> 你好 
<think>

</think>

你好!很高兴见到你,有什么我可以帮忙的吗?

>>> /bye
root@AI:~# ollama ps
NAME              ID              SIZE      PROCESSOR    UNTIL              
deepseek-r1:8b    28f8fd6cdc67    6.9 GB    100% GPU     2 minutes from now    
root@AI:~# ollama list
NAME                ID              SIZE      MODIFIED    
deepseek-r1:8b      28f8fd6cdc67    4.9 GB    3 weeks ago    
### 修改ollama默认监听端口
### Editing /etc/systemd/system/ollama.service.d/override.conf
### Anything between here and the comment below will become the new contents of the file

[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"

### Lines below this comment will be discarded

### /etc/systemd/system/ollama.service
# [Unit]
# Description=Ollama Service
# After=network-online.target
# 
# [Service]
# ExecStart=/usr/local/bin/ollama serve
# User=ollama
#......

通过和模型简单的沟通,可以发现模型仅能够根据自身包含的行为模式和知识库给出回答,而如果需要对模型进行微调或者自定义,则需要使用vLLM,和强大的算力作为基础。因此为本地LLM模型配置检索增强生成(Retrieval-Augmented Generation,RAG)引擎,是一种经济且高效的做法。

RAG知识库是一种结合了 LLM 和信息检索系统的技术。RAG 使大语言模型能够利用特定领域知识库提高文本生成的准确性和丰富度。当响应用户查询时,RAG 首先利用检索系统从特定领域知识库中检索相关内容,然后将检索到的内容与原始查询一同输入到 LLM,从而使大语言模型能够获取最新的信息,解决模型的知识幻想、特定领域知识缺乏等问题,并产生可靠的输出。

安装RAGFlow

RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠的问答以及有理有据的引用。在使用vLLM加载模型的方案中,一般使用LangChain作为RAG知识库。LangChain与RAGFlow相比,前者的可定制性比后者高,后者的使用便捷度高于前者。

根据RAGFlow的帮助文档https://ragflow.io/docs/dev/,先将项目clone到本地,然后修改.env配置文件,Docker会自动拉取和配置容器。启动完毕后通过访问HTTP协议访问RAGFlow的WebUI进行AI和RAG知识库的配置。第一个注册的用户默认为系统管理员。

root@AI:~# echo "vm.max_map_count=262144" >> /etc/sysctl.conf #need reboot
root@AI:~# apt install -y git && git clone https://github.com/infiniflow/ragflow.git
root@AI:~# cd ragflow/docker && git checkout -f v0.17.2
root@AI:~# docker compose -f docker-compose-gpu.yml up -d
root@AI:~# docker compose down #关闭所有容器
root@AI:~# cat ragflow/docker/.env 
#......
DOC_ENGINE=${DOC_ENGINE:-infinity} #向量数据库
#......
RAGFLOW_IMAGE=infiniflow/ragflow:v0.17.2 #ragflow完整版本

至此,本地部署工作就已经完成,下一步是进行配置调试。

  1. 基于 LLM 和 RAG 的中邮网院智能客服系统研究.PDF ↩︎
  2. https://gemini.google.com/ ↩︎

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注