DeepSeek 本地部署
硬件环境配置
深度学习环境
PyTorch 2.5.0, Python 3.12 (Ubuntu 22.04), CUDA 12.4
硬件环境
GPU
RTX 4090 (24GB) * 4
实际只使用一张GPU
CPU
64 vCPU Intel(R) Xeon(R) Gold 6430
内存
480G
至少需要 382G
硬盘
550G
实际使用需要 380G 左右
运行环境
AutoDL 服务器
所有方案均在 AutoDL 服务器上实现和运行,性能方面会受虚拟化环境影响
模型下载
国内从 ModelScope 下载,ModelScope 提供了多种下载方式。需要在本地环境中安装ModelScope的SDK包,之后运行下 列的python代码。如需下载不同版本的R1模型,修改allow_patterns参数即可。
方案一、llama.cpp
安装环境:
apt-get update apt-get install build-essential cmake curl libcur14-openss1-dev -y
下载源码:
git clone https://github.com/ggml-org/llama.cpp -ihttps://pypi.tuna.tsinghua.edu.cn/simple
项目编译
cmake llama.cpp -B llama.cpp/build -DBUILD SHARED LIBS=OFF -DGGML_CUDA=ON - DLLAMA_CURL=ON
cmake --build llama.cpp/build --config Release -j --clean-first - -target llama-quantize llama-cli llama-gguf-split
将编译后的文件转移
cp llama.cpp/build/bin/llama-* llama.cp
cd llama.cpp
./llama-cli \
--model /root/autodl-tmp/Deepseek-R1-GGUF/Deepseek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-0f-00003.gguf \
--cache-type-k q4_0 \
--threads 64 \
--prio 2 \
--temp 0.6 \
--ctx-size 512 \
--seed 3407 \
--n-gpu-layers 0 \
-no-cnv \
--prompt "<| User |>你好,好久不见,请介绍下你自己。\n<|Assistant|>"
核心参数说明
--cache-type-k
: K 缓存量化为 4bit--threads
: CPU 核心数--temp
: 模型温度参数, 控制生成随机性--ctx-size
: 输出上下文长度--seed
: 随机数种子--n-gpu-layers
: 控制 GPU 中的模型层数, 为 0 时则代表完全用 CPU 推理-no-cnv
: 不进行多轮对话
其中 n-gpu-layers 这个参数是用来规划 cpu 和 gpu 的使用量,可以调整来测试
三种推理方式测试结果
纯 CPU 推理测试: 在这种模式下, 系统完全依赖内存和 CPU 进行计算, 不使用 GPU 加速。本次测试使用的服务器配置为 480GB 内存和 4 卡 4090 显卡,但 GPU 不参与计算。在高并发场景下,内存占用最高可达到约 180GB。在这种配置下, 生成 token 的速度为每秒 3.23 个 token。
CPU + GPU 混合推理: 只需要合理设置
--n-gpu-layers
参数, 就可以灵活地将模型的部分层加载到 GPU 上运行。这个过程不需要手动配置, 因为 llama.cpp 会自动识别当前 GPU 的数量以及可用的显存, 并将模型权重自动分配到不同的 GPU 上。在单卡 4090 设备上运行时, GPU 能够容纳大约 7 层的模型权重, 生成速度为每秒 3.65 个 token, 总共占用显存 23GB。将更多的模型权重加载到 GPU 进行推理: 以 4 卡 4090 服务器为例, 总显存为 96GB。根据计算公式, 这时每个 GPU 可以容纳大约 39 层的模型权重。与单卡 24GB 显存相比, 生成 token 的速度提高到了每秒 5.78 个 token, 同时占用的显存约为 92GB。
方案一、KTransformers
配置文件下载: 在开始部署 KTransformer 之前,需要注意的是,Unsloth 团队提供的只有模型权重,进行模型推理还需要下载 DeepSeek 官方提供的分词器等模型配置文件。
配置文件地址:https://modelscope.cn/models/deepseek-ai/DeepSeek-R1/files
modelscope download --model deepseek-ai/DeepSeek-R1 README.md .gitattributes config.json configuration_deepseek.py generation_config.json LICENSE model.safetensors.index.json modeling_deepseek.py tokenizer.json tokenizer_config.json --local_dir /root/autodl-tmp/DeepSeek-R1-GGUF/R1_config
项目说明: KTransformer 目前开放了 V2.0、V2.1 和 V3.0 三个版本 (V3.0 目前只有预览版,只支持二进制文件下载和安装),其中 V2.0 和 V2.1 支持各类 CPU,但从 V3.0 开始,只支持最新几代的 Intel CPU。但版本间实际部署流程和调用指令没有区别,本方案以适配性较好的 V2.0 版本进行演示
安装步骤一:安装依赖
一、安装 gcc、cmake 等基础库包:
apt-get update
apt-get install gcc g++ cmake ninja-build
二、安装 PyTorch、flash-attn 等库包
pip install torch==2.5.0 packaging ninja cpufeature numpy
pip install flash-attn
三、安装 libstdc:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install --only-upgrade libstdc++6
conda install -c conda-forge libstdcxx-ng
安装步骤二:拉取代码及编译
四、拉取 KTransformers 项目代码:
git clone
https://github.com/kvcache-ai/ktransformers.git
cd ktransformers
git submodule init
git submodule update
五、根据 CPU 类型,如果是 64 核双槽版本,则需要运行命令,且该命令只需要在编译时运行一次即可:
export USE_NUMA=1
例如,CPU: 64 vCPU Interl(R) Xeon(R) Gold 6430 代表的就是 64 核双槽 CPU。
如果 CPU 类型是双槽版本而未执行,后续代码步骤可能会报错,此时再次执行该命令即可运行后续命令。
六、开始编译:
sh ./install.sh 或者
bash install
.sh
此处编译过程耗费时间较长,需要耐心等待...
七、查看安装情况:
pip show ktransformers
安装步骤三:运行模型
八、运行模型:
python ./ktransformers/local_chat.py --model_path /root/autodl-tmp/DeepSeek-R1-GGUF/R1_config --gguf_path /root/autodl-tmp/DeepSeek-R1-GGUF --cpu_infer 65 --max_new_tokens 1000 --force_think true
核心参数说明:
./ktransformers/local_chat.py
: 调用官方提供的最简单的对话脚本。--model_path
: 设置为前文下载好的配置文件路径, 也可以是来自 Hugging Face 的在线路径(如 deepseek-ai/DeepSeek-V3)。--gguf_path
: 模型路径地址, 建议下载并量化模型以满足需求 (注意,这是目录路径)。--max_new_tokens
: 1000 是最大输出 token 长度。如果发现答案被截断,可以增加该值以获得更长的答案,但设置过大会导致显存(OOM)问题,并且可能减慢生成速度。--force_think true
: 输出 R1 模型的推理思维链。--cpu_infer 65
: 若是单槽版本 CPU, 则不用输入参数。
单并发实测效果
性能指标:
Prompt Eval Count
11
token(s)
Prompt Eval Duration
0.842
s
Prompt Eval Rate
13.064
tokens/s
Eval Count
77
token(s)
Eval Duration
9.447
s
Eval Rate
8.150
tokens/s
GPU 使用情况 (nvidia-smi): 只使用了第一张卡
0
GeForce RTX 4090
30%
32C
P2
104W / 450W
11461MiB / 24564MiB
21%
1
GeForce RTX 4090
30%
28C
P8
26W / 450W
4MiB / 24564MiB
0%
2
GeForce RTX 4090
30%
29C
P8
25W / 450W
4MiB / 24564MiB
0%
3
GeForce RTX 4090
30%
31C
P8
25W / 450W
4MiB / 24564MiB
0%
在上述硬件配置下, KTransformers 使用 DeepSeek 模型进行单并发对话测试,生成速度约为 8.15 tokens/s, 主要占用第一张 RTX 4090 显卡的 11GB 显存。 Prompt 和 Eval 阶段的性能指标分别展示了模型处理输入提示和生成回复的速度。
KT 部署需要注意的问题
深度学习环境严格要求: 该项目对环境要求苛刻,例如,torch 版本不一致的话可能会导致后续依赖库安装出现问题,我们的环境版本为:PyTorch 2.5.0、Python 3.12、CUDA 12.4。
硬件要求: 该实测是在 RTX 4090(24GB) * 4 (实际只用 1 张),64 vCPU Intel(R) Xeon(R) Gold 6430 下进行的, 在使用 Q4 量化版本的 R1 时,最少需要保证有 20G 以上的显存和 382G 的 CPU 内存。
KTransformer 目前有多个版本: V2.0, V2.1, V3.0。本实验采用的是 V2.1 版本,不同版本差异较大,请注意辨别。
在安装依赖的过程中要注意安装依赖库的先后的顺序, 否则会导致其他依赖库无法安装的问题,例如 flash-attn 在安装过程中遇到的(“Building wheel for flash-attn (setup.py) ... error error: subprocess-exited-with-error”)
在 git 初始化的时候: git submodule init 若出现初始化失败报错的情况,尝试 git clone KT 官网的链接。
在运行 sh ./install.sh 安装运行脚本时, 可能会需要等待较长时间 (Building wheels for collected packages: ktransformers Building wheel for ktransformers (pyproject.toml) ... |)
方案三、Unsloth动态量化+Ollama
本部分内容详细介绍如何通过llama.cpp工具合并Unsloth动态量化模型的权重文件,并 借助Ollama工具进行模型注册与调用。通过合并权重文件,解决了Ollama对单文件支持的 限制;通过Ollama的高效管理与推理接口,实现了模型的快速部署与性能验证。这一流程 为Unsloth动态量化模型的本地部署提供了完整的解决方案。在实际应用中,用户可以根据硬件配置和需求,灵活调整模型参数,以优化推理速度和资源利用率。
模型权重合并
在部署Unsloth动态量化模型时,模型权重通常以分片形式存储,例如,DeepSeek-R1-UD- IQ1_S模型的权重可能分为多个文件,每个文件包含模型的部分权重。然而,Ollama仅支持单个 GGUF格式的模型权重文件,而Unsloth动态量化模型的权重通常以分片形式存储。为了使Ollama能 够加载和管理这些模型,必须将分片的权重文件合并为一个完整的GGUF文件。
使用 llama.cpp 提供的 llama-gguf-split 工具执行权重合并操作。该工具能够将分片的权重文件合并为一个完整的 GGUF 文件。具体命令如下:
mkdir DeepSeek-R1-UD-IQ1_S-merge
cd ./llama.cpp
./llama-gguf-split --merge /root/autodl-tmp/DeepSeek-R1-GGUF/DeepSeek-R1-UD_x0002_IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf merged_file.gguf
在完成模型权重合并后,下一步是将合并后的模型注册到Ollama中
创建 Ollama 模型配置文件
为了将合并后的模型注册到 Ollama 中,需要创建一个模型配置文件(如 DeepSeekQ1_Modelfile)。该文件包含模型的基本参数和运行配置,用于指导 Ollama 如何加载和运行模型。配置文件的格式如下:
FROM ./merged_file.gguf
PARAMETER num_gpu 7
PARAMETER num_ctx 2048
PARAMETER temperature 0.6
TEMPLATE "<| User |>{{ .System }}{{ .Prompt }}<| Assistant | >"
FROM
: 指定合并后的模型文件路径。PARAMETER num_gpu
: 指定加载到 GPU 的层数。该参数根据硬件配置调整,例如单卡 4090 GPU 可以设置为 7 层。PARAMETER num_ctx
: 指定生成的最大 token 数。该参数决定了模型推理时的最大上下文长度。PARAMETER temperature
: 指定模型温度参数,用于控制生成结果的随机性。TEMPLATE
: 指定模型提示词模板,用于定义用户输入和模型输出的格式。
注册模型到 Ollama
使用以下命令将合并后的模型注册到 Ollama 中:
ollama create DeepSeek-R1-UD-IQ1_M -f DeepSeekQ1_Modelfile
ollama list
如果模型注册成功,Ollama 将显示模型名称、路径和相关参数。注册过程中需要注意以下几点:
确保配置文件路径正确无误。如果路径错误,Ollama 将无法加载模型。
如果模型已存在,可以使用
--overwrite
选项覆盖旧模型:
ollama create DeepSeek-R1-UD-IQ1_M -f DeepSeekQ1_Modelfile --overwrite
确认无误后即可运行模型
ollama run DeepSeek-R1-UD-IQ1_M --verbose
运行模型并验证性能
模型注册完成后,即可通过 Ollama 运行模型并验证其性能。运行命令如下:
ollama run DeepSeek-R1-UD-IQ1_M --verbose
在运行过程中,可以观察模型的推理速度、吞吐量以及资源占用情况。
例如,在单卡 4090 GPU 上,推理速度可达 6 tokens/s,而在双卡 A100 服务器上,纯 GPU 推理速度可达 20 tokens/s。
性能验证不仅仅包括速度指标,还应关注模型的准确性和稳定性。可以通过以下方式验证模型性能:
推理速度测试: 通过输入简单的提示词,测试模型的响应时间。
吞吐量测试: 在多并发场景下,测试模型的吞吐量和资源占用情况。
准确性测试: 通过预定义的测试集,验证模型生成结果的准确性。
如果性能未达到预期,可以调整模型配置文件中的参数,例如增加 GPU 层数或调整温度参数。
Last updated