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

527 阅读3分钟

想要学习一下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:

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

也可以执行

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

安装python

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

pyenv install -v 3.10.16

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

这里有两个选择:

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

pyenv global 3.10.16

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

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

pyenv local 3.10.16

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

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

安装vllm

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

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

开启虚拟环境

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

python -m venv vllm_env
source vllm_env/bin/activate

升级gcc

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

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

$ 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版即可:

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

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

grep avx512_bf16 /proc/cpuinfo

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

克隆源码

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

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

# 安装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版本比较老(比如我),会报如下错误:

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文件头部添加如下代码

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

最终效果如下:

#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 缓存,重新打包。

# 在vllm_source目录下
rm -rf build

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

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

$ 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是一个用来管理大模型的平台,可以用来下载各大平台的开源模型。

# 安装
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模型

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

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

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

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

  • 查看模型信息
curl http://localhost:8000/v1/models
{
  "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
        }
      ]
    }
  ]
}

我的主页

寒澈笔记

文章原文