纯cpu版linux本地安装DeepSeek-R1-Distill-Qwen-1.5B

想要学习一下deepseek的运行原理与模型调优,所以就有了在本地安装一套deepseek的想法。

因为是学习为主,就选择了DeepSeek-R1-Distill-Qwen-1.5B版本为我们的学习版本。

但我只有一台centos7的纯cpu服务器,用来学习也够用了。以下记录deepseek在纯cpu版本的linux上部署的过程。

环境

  • cpu: Intel Xeon Processor (Skylake, IBRS)
  • os: centos7
  • 内存:16g
  • gpu: 无

安装过程

安装python3

vllm 官方需要python: 3.9 - 3.12

Python: 3.9 – 3.12

安装pyenv

因为linux里已经有了一套2.7的Python了,所以要按照Python3的话,只能重新安装一套了。综合考虑,选择使用pyenv工具来安装,比较简单

安装pyenv:

1
curl -fsSL https://pyenv.run | bash

也可以执行

1
curl -s -S -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

安装python

pyenv安装完成后,使用pyenv安装 Python3.10.16(3.x版本都可以,尽量用最新的):

1
pyenv install -v 3.10.16

在这里大概率会提示Missing the OpenSSL lib这个问题,可以参考centos7安装Python3.10,提示no ssl 问题解决解决

这里有两个选择:

如果希望将Python3.10 设置为全局的Python环境配置:

1
pyenv global 3.10.16

这样我们就可以在任意位置使用python3了,而且Python命令也指向了Python3.

如果希望仅在某个目录下使用Python3.10,可以配置:

1
pyenv local 3.10.16

这样,我们只有在这个目录下,才会使用到Python3.10. 其他配置下,还是使用系统配置。

注意,以上配置需要重启终端生效

安装vllm

安装好python3.10后,开始安装vllm.

因为vllm官方没有提供cpu版本的轮子,所以我们需要从源码手动编译vllm。

开启虚拟环境

开启虚拟环境,使vllm的安装与其他python环境隔离。

1
2
3
python -m venv vllm_env
source vllm_env/bin/activate

升级gcc

查看一下当前系统的gcc版本, centos7 大概率是4.8.5. 如果要安装vllm,需要将gcc升级到11.x

如果当前系统gcc已经是11.x, 可以跳过此步。

1
2
3
4
5
6
$ gcc --version

gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

升级gcc,请参考centos7升级gcc到版本8

安装vllm

vllm 需要依赖 PyTorch 来进行底层计算。因为我这是纯cpu的学习版,所以只有安装cpu版即可:

1
pip install torch torchvision torchaudio numactl-devel python3-devel openssl-devel xz-devel libffi-devel

查看cpu是否支持avx512_bf16向量指令集

1
grep avx512_bf16 /proc/cpuinfo

如果没有输出,则说明不支持,需要在打包vllm的时候禁用VLLM_CPU_AVX512BF16=1

克隆源码

1
2
git clone https://github.com/vllm-project/vllm.git vllm_source
cd vllm_source

在vllm源码目录下,打包cpu版vllm

1
2
3
4
5
6
7
8
# 安装cmake打包工具
pip install "cmake>=3.26" wheel packaging ninja "setuptools-scm>=8" numpy

# 根据官方推荐的cpu配置,下载cpu版的依赖
pip install -v -r requirements/cpu.txt --extra-index-url https://download.pytorch.org/whl/cpu

# 指定cpu模式,打包
FORCE_CUDA=0 VLLM_TARGET_DEVICE=cpu VLLM_CPU_AVX512BF16=1 python setup.py install

有的centos7版本比较老(比如我),会报如下错误:

1
2
vllm_source/csrc/cpu/utils.cpp:84:38: error: ‘gettid’ was not declared in this scope; did you mean ‘getuid’?
84 | thread_core_mapping.emplace_back(gettid(), omp_cpu_ids[i]);

也就是说gettid这个方法找不到,这个方法是用于获取线程ID的,我的系统不支持这个功能,需要自己去定义相关逻辑:

vllm_source/csrc/cpu/utils.cpp文件头部添加如下代码

1
2
#include <sys/syscall.h>
#define gettid() syscall(SYS_gettid)

最终效果如下:

1
2
3
4
5
6
7
8
9
10
11
#ifndef VLLM_NUMA_DISABLED
#include <numa.h>
#include <unistd.h>
#include <string>
#include <sched.h>
#endif

#include "cpu_types.hpp"

#include <sys/syscall.h>
#define gettid() syscall(SYS_gettid)

修改完成后,清理掉cmake 缓存,重新打包。

1
2
3
4
5
# 在vllm_source目录下
rm -rf build

# 指定cpu模式,打包
FORCE_CUDA=0 VLLM_TARGET_DEVICE=cpu VLLM_CPU_AVX512BF16=1 python setup.py install

最终,vllm终于安装成功了,验证一下:

1
2
3
4
$ python -c "import vllm; print(vllm.__version__)"

INFO 03-14 08:37:09 [__init__.py:256] Automatically detected platform cpu.
0.7.4.dev410+ga73122d.d20250314

vllm安装成功。

启动deepseek

deepseek模型一般都比较大,最后提前下载下来。

推荐使用modelscope来管理。modelscope是一个用来管理大模型的平台,可以用来下载各大平台的开源模型。

1
2
3
4
5
6
# 安装
pip install modelscope

# 下载deepseek 模型
mkdir -p model/DeepSeek-R1-Distill-Qwen-1.5B
modelscope download --model deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B --local_dir model/DeepSeek-R1-Distill-Qwen-1.5B

modelscope支持的模型

启动DeepSeek-R1-Distill-Qwen-1.5B模型

1
vllm serve model/DeepSeek-R1-Distill-Qwen-1.5B --tensor-parallel-size 2 --max-model-len 32768 --enforce-eager

提示如下,项目启动成功:

1
2
3
INFO:     Started server process [28967]
INFO: Waiting for application startup.
INFO: Application startup complete.

我们在日志里会发现,模型提供了很多接口,我们可以尝试一下:

  • 查看模型信息
1
curl http://localhost:8000/v1/models

返回结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
"object": "list",
"data": [
{
"id": "/root/bai/deepseek/model/DeepSeek-R1-Distill-Qwen-1.5B",
"object": "model",
"created": 1741916807,
"owned_by": "vllm",
"root": "/root/bai/deepseek/model/DeepSeek-R1-Distill-Qwen-1.5B",
"parent": null,
"max_model_len": 32768,
"permission": [
{
"id": "modelperm-74deb10e678f409698477a7818e7d57c",
"object": "model_permission",
"created": 1741916807,
"allow_create_engine": false,
"allow_sampling": true,
"allow_logprobs": true,
"allow_search_indices": false,
"allow_view": true,
"allow_fine_tuning": false,
"organization": "*",
"group": null,
"is_blocking": false
}
]
}
]
}
  • 对话
1
2
3
4
5
6
7
8
9
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "model/DeepSeek-R1-Distill-Qwen-1.5B",
"messages": [
{"role": "user", "content": "你是谁"}
],
"stream": false
}'

返回结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"id": "chatcmpl-5620282684554598b0448f1f7f4b6bda",
"object": "chat.completion",
"created": 1742174087,
"model": "model/DeepSeek-R1-Distill-Qwen-1.5B",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"reasoning_content": null,
"content": "您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。\n</think>\n\n您好!我是由中国的深度求索(DeepSeek)公司开发的智能助手DeepSeek-R1。如您有任何任何问题,我会尽我所能为您提供帮助。",
"tool_calls": []
},
"logprobs": null,
"finish_reason": "stop",
"stop_reason": null
}
],
"usage": {
"prompt_tokens": 7,
"total_tokens": 80,
"completion_tokens": 73,
"prompt_tokens_details": null
},
"prompt_logprobs": null
}

参考

vllm 官方安装cpu版本说明

安装modelscope

huggingface:DeepSeek-R1-Distill-Qwen-1.5B模型


纯cpu版linux本地安装DeepSeek-R1-Distill-Qwen-1.5B
https://www.hancher.top/2025/03/13/ai-deepseek-install-ds-r1-1-5b/
作者
寒澈
发布于
2025年3月13日
许可协议