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 的使用量,可以调整来测试

三种推理方式测试结果

  1. 纯 CPU 推理测试: 在这种模式下, 系统完全依赖内存和 CPU 进行计算, 不使用 GPU 加速。本次测试使用的服务器配置为 480GB 内存和 4 卡 4090 显卡,但 GPU 不参与计算。在高并发场景下,内存占用最高可达到约 180GB。在这种配置下, 生成 token 的速度为每秒 3.23 个 token。

  2. CPU + GPU 混合推理: 只需要合理设置 --n-gpu-layers 参数, 就可以灵活地将模型的部分层加载到 GPU 上运行。这个过程不需要手动配置, 因为 llama.cpp 会自动识别当前 GPU 的数量以及可用的显存, 并将模型权重自动分配到不同的 GPU 上。在单卡 4090 设备上运行时, GPU 能够容纳大约 7 层的模型权重, 生成速度为每秒 3.65 个 token, 总共占用显存 23GB。

  3. 将更多的模型权重加载到 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): 只使用了第一张卡

GPU
Name
Fan
Temp
Perf
Pwr:Usage/Cap
Memory-Usage
GPU-Util

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 将显示模型名称、路径和相关参数。注册过程中需要注意以下几点:

  1. 确保配置文件路径正确无误。如果路径错误,Ollama 将无法加载模型。

  2. 如果模型已存在,可以使用 --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