Linux本地部署DeepSeekR1-70B量化版
Linux本地部署DeepSeek-R1-70B
1、基础配置
服务器配置:i9-13900K、GPU 两块RTX4090D、内存 ddr5 6000hz 128GB、电源1200W、存储2TB
系统:Ubuntu20.04
模型: DeepSeek-R1-70B-4bit的量化版本
大模型管理工具:vLLM
访问方式:ONENAPI RESTFUL
2、具体步骤
2.1、步骤一:系统环境准备
2.1.1、安装 NVIDIA 驱动和 CUDA
已经安装好的跳过
# 添加 NVIDIA 驱动仓库
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
# 安装驱动(选择最新版本,需适配 RTX 4090D)
sudo ubuntu-drivers autoinstall
# 安装 CUDA 11.8(适配 PyTorch 2.0+ 和 bitsandbytes)
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sudo sh cuda_11.8.0_520.61.05_linux.run
2.1.2、安装Python环境
已经安装好的跳过,python>=3.8,我的python为3.10。
安装好python后,创建一个文件夹,然后cd进入该文件夹并创建一个虚拟环境。
# 这里以ldy为例子,创建一个运行deepseek的文件夹
sudo mkdir ldy
cd ldy
pip install virtualenv
virtualenv deepseek_env -p python3.10 # 我这里的python版本为3.10
source venv/bin/activate
下载huggingface依赖包,我们通过这个来下载量化后的模型
pip install -U huggingface_hub
2.1.3、下载Deepseek模型
这里下载的Deepseek-R1-70B-AWQ,vLLM不支持4bit的量化版本。
下载地址:Valdemardi/DeepSeek-R1-Distill-Llama-70B-AWQ · HF Mirror
设置模型下载的环境变量,这里使用的是国内的镜像地址。
export HF_ENDPOINT=https://hf-mirror.com
下载模型到本地
huggingface-cli download --resume-download Valdemardi/DeepSeek-R1-Distill-Llama-70B-AWQ --local-dir /home/xxx/deepseek-model-new
# --resume-download 为模型的仓库地址,支持断点下载
# --local-dir 为模型的保存路径 同时也是用户在请求服务器时的模型名称
等待下载…
可能存在部分模型没有下载下来的情况,需要手动下载到模型保存目录。
2.1.4、安装vLLM
pip install vllm
# 验证安装
python -c "from vllm import AsyncLLMEngine; print('Success')"
2.2 步骤二:启动vLLM服务
2.2.1、编写启动vLLM服务脚本
sudo vim start_vllm.sh
# 将下面的内容复制进去。
# 使用 vLLM 内置的 OpenAI API 服务,支持api+密钥的访问方式。
# 部分参数可以进行调整。
#!/bin/bash
/home/xxx/桌面/ldy/deepseek_venv/bin/python -m vllm.entrypoints.openai.api_server \
--model /home/xxx/deepseek-model-new \
--quantization awq \
--dtype float16 \
--tensor-parallel-size 2 \
--max-model-len 4096 \
--gpu-memory-utilization 0.95 \
--max-num-batched-tokens 16384 \
--block-size 32 \
--enforce-eager \
--swap-space 32 \
--api-key "you_api_key" \
--host 0.0.0.0 \
--port 8000
# 具体参数配置解释
--model /home/xxx/deepseek-model-new
作用:指定要加载的模型路径(需为 HuggingFace 格式的模型目录)。
注意:确保路径正确且模型文件完整(包含 config.json、pytorch_model.bin 等文件)。
--quantization awq
作用:使用 AWQ (Activation-aware Weight Quantization) 量化技术,降低模型显存占用。
适用场景:需模型支持 AWQ(如部分 Llama/Mistral 架构模型)。
效果:牺牲少量精度,显著提升推理速度并减少显存需求。
--dtype float16
作用:以半精度(16 位浮点数)加载模型。
对比选项:
bfloat16:兼容性更好,但内存占用相同
float32:更高精度,但显存占用翻倍
建议:大多数 GPU(如 NVIDIA 20 系及以上)支持 float16,优先使用。
二、资源分配与并行
--tensor-parallel-size 2
作用:启用张量并行,将模型拆分到多个 GPU 上(此处为 2 块 GPU)。
要求:需物理存在多块 GPU,且型号一致(如 2 块 RTX 3090)。
性能影响:提升推理速度,但增加 GPU 间通信开销。
--gpu-memory-utilization 0.95
作用:设置 GPU 显存利用率上限为 95%。
平衡点:
值过高(如 0.99):可能因显存碎片导致 OOM(内存不足)
值过低(如 0.8):浪费显存资源
建议:根据实际负载逐步调整,通常 0.9-0.95 是安全范围。
--swap-space 32
作用:预留 32GB 磁盘空间作为显存交换区(当显存不足时使用)。
代价:显著增加推理延迟(磁盘 I/O 速度远低于显存)。
应急方案:仅在显存不足且无法减少 max-model-len 时启用。
三、性能优化参数
--max-model-len 4096
作用:设置模型支持的最大上下文长度(token 数)。
影响:
值越大:支持更长对话,但显存占用更高
值过小:长文本生成会被截断
典型值:与模型训练长度对齐(如 LLaMA-2 通常为 4096)。
--max-num-batched-tokens 16384
作用:单次批处理的最大总 token 数(所有请求合并计算)。
平衡点:
值大:提高吞吐量,但增加显存占用和延迟
值小:降低显存需求,但吞吐量下降
建议:根据 GPU 显存和并发请求数调整。
--block-size 32
作用:设置内存块管理的粒度(每个块存储 32 个 token 的 KV 缓存)。
影响:
值小:内存利用率高,适合变长请求
值大:减少内存碎片,但可能浪费空间
典型值:16/32(短文本场景)或 64(长文本场景)。
--enforce-eager
作用:禁用 CUDA 图优化,强制使用逐行执行模式。
用途:
调试:更容易捕获错误堆栈
兼容性:解决某些 CUDA 版本或硬件的兼容问题
代价:降低推理速度(生产环境不建议启用)。
四、网络与安全配置
--api-key "you_api_key"
作用:设置 API 访问密钥(客户端需在请求头中携带 Authorization: Bearer you_api_key)。
安全建议:
使用复杂密钥(如 UUID)
配合 HTTPS 和防火墙规则使用
--host 0.0.0.0
作用:监听所有网络接口(允许外部设备访问)。
风险:若未配置防火墙,可能暴露服务到公网。
安全方案:
生产环境建议绑定内网 IP(如 192.168.x.x)
使用 Nginx 反向代理 + IP 白名单
--port 8000
作用:指定服务监听的端口号。
检查冲突:运行 netstat -tuln | grep 8000 确认端口未被占用
参数调优建议
场景 调整参数
显存不足 降低 --gpu-memory-utilization、减小 --max-model-len、启用 --swap-space
提高吞吐量 增大 --max-num-batched-tokens、增加 --tensor-parallel-size
减少延迟 移除 --enforce-eager、关闭 --swap-space、使用更高效的量化(如 GPTQ)
长文本生成 增大 --max-model-len、调整 --block-size 为 64
2.2.2、4090D显卡专属优化
编辑~/.bashrc文件,将一下内容填入文件末尾
# 添加到 ~/.bashrc
export CUDA_LAUNCH_BLOCKING=1
export VLLM_USE_TF32=0
export VLLM_DEFAULT_DTYPE=float16
2.2.3、修改模型配置文件
# 编辑模型目录下的config.json
vim /home/xxx/deepseek-model-new/config.json
# 将文件中的"torch_dtype": "bfloat16" 改为 "torch_dtype": "float16"
2.2.4、启动vLLM服务
./start_vllm.sh
#注:一般来说第一次启动模型会存在各种各样的问题导致模型不能正常启动,遇到的问题百度一下应该能解决。
#注:模型启动的时间较长,启动成功后的输出如下:
INFO 02-26 09:19:17 api_server.py:958] Starting vLLM API server on http://0.0.0. 0:8000
INFO 02-26 09:19:17 launcher.py:23] Available routes are:
INFO 02-26 09:19:17 launcher.py:31] Route: /openapi.json, Methods: GET, HEAD
INFO 02-26 09:19:17 launcher.py:31] Route: /docs, Methods: GET, HEAD
INFO 02-26 09:19:17 launcher.py:31] Route: /docs/oauth2-redirect, Methods: GET, HEAD
INFO 02-26 09:19:17 launcher.py:31] Route: /redoc, Methods: GET, HEAD
INFO 02-26 09:19:17 launcher.py:31] Route: /health, Methods: GET
INFO 02-26 09:19:17 launcher.py:31] Route: /ping, Methods: GET, POST
INFO 02-26 09:19:17 launcher.py:31] Route: /tokenize, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /detokenize, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /v1/models, Methods: GET
INFO 02-26 09:19:17 launcher.py:31] Route: /version, Methods: GET
INFO 02-26 09:19:17 launcher.py:31] Route: /v1/chat/completions, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /v1/completions, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /v1/embeddings, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /pooling, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /score, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /v1/score, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /v1/audio/transcriptions, Methods: PO ST
INFO 02-26 09:19:17 launcher.py:31] Route: /rerank, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /v1/rerank, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /v2/rerank, Methods: POST
INFO 02-26 09:19:17 launcher.py:31] Route: /invocations, Methods: POST
INFO: Started server process [12267]
INFO: Waiting for application startup.
INFO: Application startup complete.
2.3、测试服务
2.3.1、流式调用
from openai import OpenAI
client = OpenAI(
api_key="YOUR_SECRET_KEY",
base_url="http://localhost:8000/v1"
)
stream = client.completions.create(
model="deepseek-r1-70b",
prompt="请用Python实现快速排序:",
max_tokens=512,
stream=True # 启用流式
)
for chunk in stream:
print(chunk.choices[0].text, end="", flush=True)
2.3.2、非流式调用
from openai import OpenAI
client = OpenAI(
api_key="YOUR_SECRET_KEY",
base_url="http://localhost:8000/v1" # vLLM 的 OpenAI 兼容端点
)
response = client.completions.create(
model="deepseek-r1-70b",
prompt="你好,请介绍量子力学:",
max_tokens=512,
stream=False
)
print(response.choices[0].text)
3、ChatBox访问服务
ChatBox下载地址Chatbox AI官网:办公学习的AI好助手,全平台AI客户端,官方免费下载
- 模型提供方选择OPENAI API(遵循OPENAI 的RESTFUL API规范)
- 填写api密钥
- 填写api域名
- 填写模型名称,模型名称选择自定义模型,然后将模型的名称填入,我这里是:/home/ldtx/deepseek-model-new
4.3、设置为开机自启动
4.3.1、修改systemd服务配置
sudo vim /etc/systemd/system/vllm-api.service
# 将下面的内容复制进去
[Unit]
Description=vLLM OpenAI API Server
After=network.target
[Service]
User=xxx # 替换为你的实际用户名
WorkingDirectory=/home/xxx/桌面/ldy # 设置工作目录
ExecStart=/home/xxx/桌面/ldy/start_vllm.sh
Restart=on-failure
RestartSec=5s
# 日志配置(可选)
StandardOutput=file:/home/xxx/桌面/ldy/vllm-api.log
StandardError=file:/home/xxx/桌面/ldy/vllm-api-error.log
# 环境变量(如果GPU需要)
Environment="PATH=/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
[Install]
WantedBy=multi-user.target
4.3.2、应用配置
# 重新加载服务配置
sudo systemctl daemon-reload
# 启用开机启动
sudo systemctl enable vllm-api.service
# 立即启动服务
sudo systemctl start vllm-api.service
4.3.3、验证方法
# 查看服务状态
systemctl status vllm-api.service
# 服务正常启动应该显示
● vllm-api.service - vLLM OpenAI API Server
Loaded: loaded (/etc/systemd/system/vllm-api.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2025-02-27 16:00:00 CST; 1min ago
Main PID: 12345 (python)
Tasks: 10 (limit: 4915)
Memory: 10.2G
CGroup: /system.slice/vllm-api.service
└─12345 /home/xxx/桌面/ldy/deepseek_venv/bin/python -m vllm.entrypoints.openai.api_server...