【阅读原文】戳:告别服务器繁忙,云上部署DeepSeek
一、背景
DeepSeek-R1是DeepSeek公司推出的一个开源推理模型,推理性能优秀,在性能比肩OpenAI o1的同时,还能够输出它的思维链,即思考的过程。原生DeepSeek-R1模型拥有660B个参数,无法部署在显存较小的GPU上,所以DeepSeek公司通过DeepSeek-R1的输出,借助蒸馏技术用低成本训练出高效的模型,蒸馏出了Qwen、Llama等6个小模型版本,其中32B和70B模型在多项能力上实现了对标OpenAI o1-mini的效果。本文以DeepSeek-R1-Distill-Qwen-32B-FP8为例,向您介绍如何在GPU实例上使用容器来部署量化的DeepSeek-R1蒸馏模型,可以离线测试或通过WebUI在线使用DeepSeek-R1蒸馏模型服务。
二、准备运行环境
我们可以根据实际使用的模型选择合适的GPU实例,如下表所示:
模型运行时实际占用的显存大小除了需要考虑模型本身的大小之外,还需要考虑上下文长度,KV cache的设置情况等。运行DeepSeek-R1-Distill-Qwen-32B-FP8蒸馏模型需要的显存大小至少为32GB,所以本文将在gn8is实例上(显存大小48GB)通过容器来运行DeepSeek-R1蒸馏模型。使用容器可以帮助您快速且方便地构建大语言模型的推理环境,无需深入了解底层硬件,也无需额外配置即可开箱即用。
Tips:本文使用ecs.gn8is.2xlarge实例进行模型部署(目前该实例规格仅海外在售,如有需求请联系阿里云销售)。若您只是用于模型体验,也可选择库存充足的ecs.gn7i-4x.8xlarge实例,调整vLLM启动参数--tensor-parallel-size 4,其他操作配置不变,也可运行模型。
下面将详细介绍如何创建gn8is实例、安装GPU驱动和安装容器,以准备运行环境:
1. 创建GPU实例并安装GPU驱动
我们打开阿里云创建实例页面,选择ecs.gn8is.2xlarge实例类型,操作系统我们选择Ubuntu20.04,取消勾选安装eRDMA软件栈(单卡实例不需要),勾选安装GPU驱动:CUDA 12.4.1,Driver 550.127.08, CUDNN 9.2.0.82,这样GPU实例创建完成后,会同时自动安装GPU驱动、CUDA、cuDNN库等,相比手动安装方式更快捷。磁盘空间需要200G以上,因为需要下载模型数据与容器镜像。
2. 通过ssh远程连接GPU实例
3. 执行以下命令,安装Docker环境
sudo apt-get update sudo apt-get -y install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io
4. 执行以下命令,检查Docker是否安装成功
docker -v
如下图回显信息所示,表示Docker已安装成功。
5. 执行以下命令,安装nvidia-container-toolkit
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit
6. 设置Docker开机自启动并重启Docker服务
sudo systemctl enable docker sudo systemctl restart docker
7. 执行以下命令,查看Docker是否已启动
sudo systemctl status docker
如下图回显所示,表示Docker已启动。
三、运行deepseek-R1 32B蒸馏模型容器
通常情况下,运行32B的模型需要64G显存,gn8is实例GPU的显存大小为48GB,无法直接运行32B模型,所以需要使用参数量化后的模型,这样才能在gn8is实例上运行32B模型,本文以 modelscope上FP8量化的模型DeepSeek-R1-Distill-Qwen-32B-FP8为例,您可根据实际需求更换其他量化模型。下面将分别介绍两种运行deepseek-R1 32B蒸馏模型容器的方法,您可以根据需求选择其一来运行容器:
1. 使用预装 DeepSeek-R1-Distill-Qwen-32B-FP8 蒸馏模型的容器镜像运行容器
2. 手动部署运行 DeepSeek-R1-Distill-Qwen-32B-FP8 蒸馏模型容器
3.1 使用预装DeepSeek-R1-Distill-Qwen-32B-FP8蒸馏模型的容器镜像运行容器
阿里云提供了预装DeepSeek-R1-Distill-Qwen-32B-FP8蒸馏模型和Open-WebUI的容器镜像,方便您快速便地构建大语言模型的推理环境,无需额外配置即可开箱即用。
1. 执行以下命令,拉取容器镜像。镜像大小47GB(包含了模型数据),拉取容器镜像耗时较长,请您耐心等候
sudo docker pull egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-nv-pytorch:preview-25.02-dsr1distill-qwen32bfp8-vllm0.6.4.post1-pytorch2.5.1-cuda12.4-20250208
2. 执行以下命令,运行deepseek容器
sudo docker run -d -t --net=host --gpus all \ --privileged \ --ipc=host \ --name deepseek \ egslingjun-registry.cn-wulanchabu.cr.aliyuncs.com/egslingjun/inference-nv-pytorch:preview-25.02-dsr1distill-qwen32bfp8-vllm0.6.4.post1-pytorch2.5.1-cuda12.4-20250208
配置参数解释:
--net=host --ipc=host:共享宿主机的网络命名空间与IPC命名空间,方便后续访问容器内运行的大模型服务
3. 执行以下命令,查看deepseek容器是否启动成功
docker ps
如下图回显所示,表示deepseek容器已启动。
3.2 手动部署运行DeepSeek-R1-Distill-Qwen-32B-FP8蒸馏模型容器
如果不使用预装 DeepSeek-R1-Distill-Qwen-32B-FP8 蒸馏模型和 Open-WebUI 的容器镜像,也可以通过以下命令手动部署运行 DeepSeek-R1-Distill-Qwen-32B-FP8 蒸馏模型容器。以下将介绍如何在基础镜像 nvcr.io/nvidia/cuda:12.4.1-runtime-ubuntu22.04上安装依赖库,准备 DeepSeek-R1 蒸馏模型运行的容器环境:
1. 执行以下命令,拉取基础容器镜像
sudo docker pull nvcr.io/nvidia/cuda:12.4.1-runtime-ubuntu22.04
2. 执行以下命令,运行deepseek容器
sudo docker run -d -t --net=host --gpus all \ --privileged \ --ipc=host \ --name deepseek \ nvcr.io/nvidia/cuda:12.4.1-runtime-ubuntu22.04
配置参数解释:
--net=host --ipc=host:共享宿主机的网络命名空间与IPC命名空间,方便后续访问容器内运行的大模型服务
3. 执行以下命令,查看deepseek容器是否启动成功
docker ps
如下图回显所示,表示deepseek容器已启动。
4. 执行以下命令,进入deepseek容器
docker exec -it deepseek bash
5. 执行以下命令,创建并进入工作目录 /workspace
mkdir /workspace && cd /workspace
6. OpenWebUI依赖python 3.11,执行以下命令,安装python 3.11
# 安装 python3.11 apt update apt install -y python3.11 # 使用 Python 3.11 作为默认的 Python3 update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 1 # 安装对应版本的 pip apt install -y curl curl -sS https://bootstrap.pypa.io/get-pip.py | python3
7. 执行以下命令,查看python3.11和pip是否安装成功
# 查看 python3 是否安装成功 python3 --version # 查看 pip 是否安装成功 pip --version
如下图回显所示,表示python3.11和pip安装成功。
8. 执行以下命令,安装vllm 0.6.4.post1。“-i https://pypi.tuna.tsinghua.edu.cn/simple” 参数,用于指定清华的pip源,加快下载速度
pip install vllm==0.6.4.post1 -i https://pypi.tuna.tsinghua.edu.cn/simple
9. 执行以下命令,查看vllm 0.6.4.post1是否安装成功
python3 -c 'import vllm; print(vllm.__version__)'
如下图回显所示,表示vllm 0.6.4.post1安装成功。
10. 执行以下命令,安装运行vllm的依赖库
apt-get install -y libgl1-mesa-glx libglib2.0-0
11. 执行以下命令,安装 open-webui,同样指定清华pip源
pip install open-webui==0.5.10 -i https://pypi.tuna.tsinghua.edu.cn/simple
12. 执行以下命令,查看open-webui是否安装成功
open-webui --help
如下图回显所示,表示open-webui安装成功。
13. 执行以下命令,通过git lfs下载modelscope格式的DeepSeek-R1-Distill-Qwen-32B-FP8蒸馏模型
安装git-lfs便于下载大语言模型:
apt install -y git-lfs
执行以下命令,下载模型。下载模型耗时较长,耗时视模型大小与网络情况而定,下载DeepSeek-R1-Distill-Qwen-32B-FP8大约需要2小时,请耐心等候。
git lfs clone https://www.modelscope.cn/okwinds/DeepSeek-R1-Distill-Qwen-32B-FP8.git
下载完成的文件目录如下:
vllm适配版本说明
1. 需要使用较新版本的vLLM,使用0.5.4版本会报错Exception: data did not match any variant of untagged enum ModelWrapper at line 757503 column 3。
2. 实测vLLM版本0.6.4.post1与最新版本0.7.2(截止2025年2月8号)均可以运行,上文以v0.6.4.post1版本为例,如需使用最新版本0.7.2,可在运行deepseek容器后,在容器内执行以下命令升级vllm版本到0.7.2,“-i https://pypi.tuna.tsinghua.edu.cn/simple” 参数,用于指定清华的pip源,加快下载速度。
pip install vllm==0.7.2 -i https://pypi.tuna.tsinghua.edu.cn/simple
在容器内执行以下命令,查看vllm是否升级成功:
python3 -c 'import vllm; print(vllm.__version__)'
如下图回显所示,表示vllm升级成功。
四、运行deepseek-R1 32B蒸馏模型服务
根据步骤三,通过预装DeepSeek-R1-Distill-Qwen-32B-FP8 蒸馏模型的容器镜像或手动部署,我们成功运行了deepseek容器,接下来我们将在deepseek容器中运行量化的蒸馏模型服务与OpenWebUI服务,并进行一些测试与验证。
执行以下命令,进入deepseek容器与工作目录
docker exec -it deepseek bash cd /workspace
4.1 离线运行DeepSeek-R1-Distill-Qwen-32B-FP8推理服务
1. 执行以下命令,创建demo目录,下载安装vim,编辑vllm_demo.py脚本
# 使用预装 DeepSeek-R1-Distill-Qwen-32B-FP8 容器镜像, # 测试脚本已准备好,进入 demo 目录即可。 cd demo # 手动部署 DeepSeek-R1-Distill-Qwen-32B-FP8 容器, # 需要创建编辑 vllm_demo.py 脚本。 mkdir demo && cd demo apt install -y vim vim vllm_demo.py
2. vllm_demo.py脚本内容如下:
from vllm import LLM, SamplingParams # Sample prompts. prompts = [ "Hello, my name is", "The president of the United States is", "The capital of France is", "The future of AI is", ] # Create a sampling params object. sampling_params = SamplingParams(temperature=0.8, top_p=0.95) # Create an LLM. llm = LLM(model="/workspace/DeepSeek-R1-Distill-Qwen-32B-FP8", max_model_len=18432, gpu_memory_utilization=0.98) # Generate texts from the prompts. The output is a list of RequestOutput objects # that contain the prompt, generated text, and other information. outputs = llm.generate(prompts, sampling_params) # Print the outputs. for output in outputs: prompt = output.prompt generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
代码第14行llm = LLM(model="/workspace/DeepSeek-R1-Distill-Qwen-32B-FP8",max_model_len=18432, gpu_memory_utilization=0.98) 模型的配置参数解释如下:
a. model:指定模型路径
b. max_model_len=18432设置模型上下文长度,gpu_memory_utilization=0.98设置 vllm 的显存使用率,如果设置不恰当,可能会报错 ValueError: The model's max seq len (131072) is larger than the maximum number of tokens that can be stored in KV cache (39648). Try increasing gpu_memory_utilization or decreasing max_model_len when initializing the engine. 这个错误说明模型上下文长度max_model_len超出了所用GPU的KV缓存限制,减小max_model_len或增加 gpu_memory_utilization即可。
c. gpu_memory_utilization=0.98
3. 执行以下命令,进行离线测试
python3 /workspace/demo/vllm_demo.py
可以快速地处理对话问答任务,推理示例如下:
4.2 在线运行DeepSeek-R1-Distill-Qwen-32B-FP8推理服务
1. 容器内任意目录下执行以下命令,启动蒸馏模型推理服务
python3 -m vllm.entrypoints.openai.api_server \ --model /workspace/DeepSeek-R1-Distill-Qwen-32B-FP8 \ --trust-remote-code \ --quantization fp8 \ --tensor-parallel-size 1 \ --port 8000 \ --enforce-eager \ --gpu-memory-utilization 0.98 \ --max-model-len 18432
如下所示,表示蒸馏模型推理服务已启动,服务地址是localhost:8000。
配置参数解释:
• model/workspace/DeepSeek-R1-Distill-Qwen-32B-FP8:指定模型路径
• quantization fp8:启用 FP8 量化,显著降低显存占用。
• tensor-parallel-size 1:设置 tensor 并行大小。
• port 8000:设置服务监听端口为8000。
• enforce-eager:启用eager模式,加快推理速度。
• gpu_memory_utilization 0.98:设置显存使用率为98%,尽可能多地利用显存。
• max-model-len 18432设置最大序列长度为18432个token,可以设置的大小跟显存大小和KV cache限制有关,如果报错 ValueError: The model's max seq len (131072) is larger than the maximum number of tokens that can be stored in KV cache (39648). Try increasing gpu_memory_utilization or decreasing max_model_len when initializing the engine. 则说明模型上下文长度max_model_len超出了所用GPU的KV缓存限制,减小max_model_len或增加gpu_memory_utilization即可。
2. 执行以下命令,测试推理效果
curl http://localhost:8000/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "/workspace/DeepSeek-R1-Distill-Qwen-32B-FP8", "messages": [ {"role": "user", "content": "介绍一下什么是大模型推理。" } ]}'
耗时1分钟左右输出推理结果,如下图所示:
3. 运行Open-WebUI前端服务,可以访问公网ip通过web页面访问 DeepSeek-R1蒸馏模型推理服务。执行以下命令:
a. 打开新的终端窗口,执行以下命令进入deepseek容器和工作目录。
docker exec -it deepseek bash cd /workspace
b. 设置以下Open-WebUI运行的环境变量
# 避免服务器一直尝试连接 Ollama 而降低面板响应速度 export ENABLE_OLLAMA_API=False # 连接 DeepSeek 大模型服务器,访问 localhost:8080 即可使用 # 蒸馏模型服务(对应服务地址是 localhost:8000) export OPENAI_API_BASE_URL=http://127.0.0.1:8000/v1 # 指定 open-webui 下载依赖的镜像源 export HF_ENDPOINT=https://hf-mirror.com # 指定 open-webui 的数据存储路径 export DATA_DIR=./open-webui-data
c. 运行以下命令启动Open-WebUI前端服务:
open-webui serve
如下所示,表示Open WebUI前端服务已启动,服务地址为 localhost:8080(注意跟大模型服务做区分,大模型服务地址是 localhost:8000)。第一次运行需要下载一些依赖库,耗时2分钟左右。
4. 访问web页面之前,需要打开阿里云控制台,配置实例的安全组,将TCP端口8080放行。授权对象是您客户端的公网ip,客户端的公网ip可以通过网页访问ip138.com查询。
a. 在浏览器中输入阿里云实例的公网ip:8080端口,即 http://x.x.x.x:8080就可以访问了。如下所示:
b. 点击开始使用,根据提示创建管理员账号。
然后就可以使用了。
通过deepseek容器运行的后台服务器看到平均吞吐量为17.0 tokens/s
4.3 使用其他精度量化的模型
本文以DeepSeek-R1-Distill-Qwen-32B-FP8为例,根据实际需求,如果您想要使用其他精度量化的模型,只需要下载对应的模型以及更改运行命令即可,其余与前文保持一致:
比如,如果想要支持更长的上下文,如65536,并且可以承担一些精度损失,那么可以在modelscope上寻找使用量化精度更小的模型,比如int4量化的deepseek-r1-distill-qwen-32b-gptq-int4。
1. 下载模型
git lfs clone https://www.modelscope.cn/tclf90/deepseek-r1-distill-qwen-32b-gptq-int4.git
2. 运行命令
python3 -m vllm.entrypoints.openai.api_server \ --model /workspace/deepseek-r1-distill-qwen-32b-gptq-int4 \ --trust-remote-code \ --quantization gptq_marlin \ --tensor-parallel-size 1 \ --port 8000 \ --enforce-eager \ --gpu-memory-utilization 0.98 \ --max-model-len 65536
与运行DeepSeek-R1-Distill-Qwen-32B-FP8命令的不同之处在于:
a. model修改为对应的模型/workspace/deepseek-r1-distill-qwen-32b-gptq-int4
b. quantization修改量化方式为gptq_marlin
c. max-model-len修改最大上下文长度为65536
五、总结
通过上述步骤,我们可以在阿里云异构实例gn8is上部署DeepSeek蒸馏模型DeepSeek-R1-Distill-Qwen-32B-FP8,可以离线测试或通过WebUI在线使用DeepSeek-R1蒸馏模型服务。
我们是阿里巴巴云计算和大数据技术幕后的核心技术输出者。
获取关于我们的更多信息~