使用 3090 部署 1.58bit 动态量化版 DeepSeek R1 671b
1.58 bit 量化技术最早由论文 BitNet: Scaling 1-bit Transformers for Large Language Models 提出,简单说即是将权值量化为仅有三个状态 -1、0 和 1,可最大程度地节约显存并加速推理。
Run DeepSeek R1 Dynamic 1.58-bit 一文介绍了 1.58 bit 动态量化版的 DeepSeek R1 671b(以下简称 unsloth 版)。我们知道 DeepSeek R1 70b 及以下的版本都是通过知识蒸馏得到的,唯有 671b 是满血的版本。然而原版 671b 的推理需要大量显存及算力,仅模型文件便有 404GB。
unsloth 版有选择地对部分权值作 1.58 bit 量化,将模型文件压缩至 131GB,同时也保持了不错的生成质量。结合 llama.cpp 实现的 CPU+GPU 混合推理,我们可在低成本的硬件上部署 671b 模型。
使用 llama-bench 测试生成速度
先说结论。笔者在实验室集群单个 3090 节点上尝试部署 unsloth 版 671b 模型,最大 token 生成速度可达 10 tokens/s,足够应付单人日常使用。节点的硬件配置如下:
- CPU – AMD EPYC 7402 24-Core Processor
- RAM – 32GB x 16, DIMM DDR4 Synchronous Registered (Buffered) 3200 MHz
- GPU – 8x NVIDIA GeForce RTX 3090 (24GB VRAM)
以下是 token 生成速度与 GPU Layers 数量的关系曲线:
GPU Layers 指置于 GPU 上的网络层数,取值范围为 0~62,可由 CLI 参数 --n-gpu-layers
配置。其中取 0 时代表完全使用 CPU 运行,取 62 时代表完全使用 GPU 运行。图中还标出了不同 GPU Layers 数量所需的 GPU 卡数(顶部横轴),以方便读者根据自己的显存大小调整 GPU Layers。
值得注意的是,虽然 7 张 3090 可以放下整个模型,在实际推理时考虑到 Context 的额外开销,所需显存可能不止于此,比如我后文部署 --ctx-size=8192
的 llama-server 时就需要占满 8 张 3090。
以上测试数据由如下脚本得出:
export CUDA_VISIBLE_DEVICES=0
next_gpu=1
for i in {0..62}; do
mkdir -p benchout
while true; do
./llama.cpp/build/bin/llama-bench \
--model /models/DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf \
--cache-type-k q4_0 \
--threads 64 --prio 2 \
--n-gpu-layers $i -n 128 2>&1 | tee benchout/bench-$i.log
if [ ${PIPESTATUS[0]} -eq 0 ]; then
break
else
echo "Retrying..."
export CUDA_VISIBLE_DEVICES=${CUDA_VISIBLE_DEVICES},${next_gpu}
next_gpu=$((next_gpu + 1))
fi
done
done
下面介绍如何借助 llama.cpp 运行一个基础可用的 Web 界面,以使用 unsloth 版 671b 模型。
llama-server 服务部署
模型下载
本次使用的模型位于 Huggingface 的 unsloth/DeepSeek-R1-GGUF 仓库。仓库提供了多种量化的版本,我们只需下载其中的 DeepSeek-R1-UD-IQ1_S
目录,置于 /mnt/models/
路径,形成以下结构:
/mnt/models/DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S
├── DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf
├── DeepSeek-R1-UD-IQ1_S-00002-of-00003.gguf
└── DeepSeek-R1-UD-IQ1_S-00003-of-00003.gguf
下载模型可使用 Python 的 huggingface_hub
库:
import os
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"
from huggingface_hub import snapshot_download
snapshot_download(
repo_id = "unsloth/DeepSeek-R1-GGUF",
local_dir = "/mnt/models",
allow_patterns = ["*UD-IQ1_S*"],
)
当然,如果环境中不方便使用 Python,笔者推荐使用 HuggingFaceModelDownloader 下载。这是一个用 Go 编写的下载器,无需像 Python 那样配置环境即可使用:
curl -sSL https://g.bodaay.io/hfd -o hfd && chmod +x hfd
./hfd -m unsloth/DeepSeek-R1-GGUF:UD-IQ1_S -c 8 -s /mnt/models
编译 llama.cpp 及启动 llama-server 服务
运行 1.58 bit 的 DeepSeek R1 需要使用 llama.cpp。笔者选择使用 Docker 部署,以避免繁琐的环境配置。
为了方便读者使用,笔者将镜像的准备和启动过程整合到了 Docker Compose 文件中。读者只需将以下两个文件 compose.yaml
和 llama_Dockerfile
放在同一个目录下,执行 docker compose up
即可启动 llama-server。llama-server 内置了一个简单的 Web 界面,可以通过 http://localhost:10000
访问。
services:
deepseek:
build:
args:
- PROXY=
- CUDA_ARCH=86
dockerfile: llama_Dockerfile
command: |
llama-server
--model /models/DeepSeek-R1-GGUF/DeepSeek-R1-UD-IQ1_S/DeepSeek-R1-UD-IQ1_S-00001-of-00003.gguf
--cache-type-k q4_0
--threads 12 --prio 2
--temp 0.6
--ctx-size 8192
--port 10000
--host 0.0.0.0
--n-gpu-layers 62
volumes:
- /mnt/models:/models
ports:
- 10000:10000
deploy: { resources: { reservations: { devices: { driver: nvidia, capabilities: [ gpu ],
count: 8
} } } }
FROM hsfzxjy/devkit:cuda11.7.1
ARG PROXY
ENV http_proxy=${PROXY} https_proxy=${PROXY}
RUN mkdir /app/ && cd /app && git clone https://github.com/ggerganov/llama.cpp
WORKDIR /app/llama.cpp
RUN apt-get install -y libcurl4-openssl-dev
ARG CUDA_ARCH
RUN cmake . -B build \
-DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON -DCMAKE_CUDA_ARCHITECTURES=${CUDA_ARCH}
RUN cmake --build build --config Release -j16 --clean-first --target llama-cli llama-server llama-bench
ENV PATH=/app/llama.cpp/build/bin:${PATH}
ENV http_proxy= https_proxy=
作者:hsfzxjy
链接:
许可:CC BY-NC-ND 4.0.
著作权归作者所有。本文不允许被用作商业用途,非商业转载请注明出处。
OOPS!
A comment box should be right here...But it was gone due to network issues :-(If you want to leave comments, make sure you have access to disqus.com.