想要学习一下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环境配置:
这样我们就可以在任意位置使用python3了,而且Python命令也指向了Python3.
如果希望仅在某个目录下使用Python3.10,可以配置:
这样,我们只有在这个目录下,才会使用到Python3.10. 其他配置下,还是使用系统配置。
注意,以上配置需要重启终端生效
安装vllm 安装好python3.10后,开始安装vllm.
因为vllm官方没有提供cpu版本的轮子,所以我们需要从源码手动编译vllm。
开启虚拟环境 开启虚拟环境,使vllm的安装与其他python环境隔离。
1 2 3 python -m venv vllm_envsource 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_sourcecd vllm_source
在vllm源码目录下,打包cpu版vllm
1 2 3 4 5 6 7 8 pip install "cmake>=3.26" wheel packaging ninja "setuptools-scm>=8" numpy pip install -v -r requirements/cpu.txt --extra-index-url https://download.pytorch.org/whl/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 rm -rf build 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 modelscopemkdir -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
启动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模型