Fastllm:DeepSeek R1-0528 CPU+GPU混合推理加速方案

在转发过《DeepSeek-671B纯CPU部署:配置选型、性能测试与量化对比》之后,我一直想找个合适的时机也给大家分享下CPU+GPU混合推理DeepSeek R1等MoE大模型的方案。

应该说,该技术实现的技术门槛不算太高。国内做得相对比较好的免费/开源软件一个是清华章明星老师团队的KTransformers;另一个就是我今天要给大家介绍的Fastllm。

图片

DeepSeek R1-0528 本地部署方案

fastllm是后端无依赖的高性能大模型推理库。同时支持张量并行推理稠密模型和混合模式推理MOE模型,任意10G以上显卡即可推理满血DeepSeek。双路AMD EPYC 9004/9005服务器+单显卡部署DeepSeek满血满精度原版模型,单并发20tps;INT4量化模型单并发30tps,多并发可达60+。

编者注:以下关于硬件配置的信息,转载自链接:https://www.zhihu.com/question/11385894245/answer/1913591687525172485。只是其中关于价格等仅供参考,不代表《企业存储技术》公众号观点。多说一句可能得罪人的话:比如HN这类主板品牌,我一位朋友多年前曾说他们“用二手芯片组”,市场中能存在的价值就是还有些人一味追求廉价,但站在硬件从业者的角度我确实不敢推荐。

各档位配置对比

(根据Fastllm用户群的信息整理,此处预估价格按个人海鲜市场装机计算,含税价会高出很多)

图片

硬件选型原则

DeepSeek模型由MLA(约14B参数)和MOE(约660B参数,每次激活约23B)两部分组成:

  • 显卡负责计算MLA部分:需要容量小但带宽高
  • 内存负责计算MOE部分:需要容量大但带宽要求较低

计算速度主要取决于:

  • 内存带宽(由内存通道数和频率决定)
  • 显卡带宽(新架构效率更高)
  • CPU主要目标是跑满内存带宽,提高核数主要提升Prefill速度

    (编者注:根据我在EPYC 9005上测试llama.cpp的经验,32核左右CPU算是甜点吧)。

注:以下内容转发自Fastllm项目主页 https://github.com/ztxz16/fas...,供大家参考。

介绍

fastllm是c++实现自有算子替代Pytorch的高性能全功能大模型推理库,可以推理Qwen, Llama, Phi等稠密模型,以及DeepSeek, Qwen-moe等moe模型。

  • 具有优良的兼容性,支持M40, K80到5090全系列N卡,支持MI50,7900等A卡,支持天数,沐曦等国产卡,支持ThinkForce NPU推理
  • 支持任意显卡的FP8推理
  • 任意显卡只需要显存 > 10G就可以支持单卡推理满血DeepSeek R1 671B模型
  • 双路9004/9005服务器 + 单显卡部署DeepSeek R1 671B - FP8原版模型,- 单并发速度可达20左右,部署INT4模型单并发速度可达30左右,最高并发速度可达60+

亮点功能

  • 🚀安装使用简单方便,一条命令就能成功安装,一条命令就能成功运行。
  • 🚀支持CPU + GPU混合推理MOE大参数模型(单显卡即可推理DEEPSEEK 671B)。
  • 🚀使用C++实现自有底层算子,不依赖PyTorch。
  • 🚀兼容性好,PIP安装支持可以支持到P100、MI50等老卡,源码安装支持更多设备。
  • 🚀支持多卡张量并行推理,支持3、5、7等奇数张卡。
  • 🚀支持GPU + CPU混合张量并行推理
  • 🚀支持CPU和显卡实现FP8运算,老设备也可以运行
  • 🚀支持多CPU加速,且只占用1份内存
  • 🚀支持ROCM,AMD GPU;支持天数,沐曦,燧原;支持华为昇腾。
  • 🚀支持动态Batch,流式输出;前后端分离设计,可跨平台移植,可在安卓上直接编译。
  • 🚀支持Python自定义模型结构(https://github.com/ztxz16/fas...)

快速开始

安装

    • PIP安装(目前仅支持Nvidia GPU和AMD GPU,其余GPU请使用源码安装

Linux系统 + Nvidia GPU:

由于目前PyPI限制库大小,安装包中不含CUDA依赖,安装ftllm之前建议先手动安装CUDA 12以上版本 (已安装cuda可跳过)

wget https://developer.download.nv...

sudo sh cuda_12.8.1_570.124.06_linux.run

然后用pip安装,命令如下:

pip install ftllm -U

Linux系统 + AMD GPU:

由于目前PyPI限制库大小,安装包中不含ROCM依赖,安装ftllm之前建议先手动安装ROCM 6.3.3 (若已安装ROCM可跳过)

wget wget https://repo.radeon.com/amdgp...

apt install ./amdgpu-install_6.3.60303-1_all.deb -y

amdgpu-install --usecase=hiplibsdk,rocm,dkms -y

然后用pip安装,命令如下:

pip install ftllm-rocm -U

Windows系统(仅支持Nvidia GPU:

第一次安装前需要安装依赖库:

pip install https://hf-mirror.com/fastllm...

然后用pip安装,命令如下:

pip install ftllm -U

    • Hint

Conda下安装有时候会出现环境错误,如果出现可以尝试在Conda外或使用venv等虚拟环境尝试

(若使用时报错,可参考FAQ中“ftllm报错” )

运行demo程序

可以运行一个较小模型测试安装是否成功, 以Qwen/Qwen3-0.6B模型为例

命令行聊天:

ftllm run Qwen/Qwen3-0.6B

WebUI:

ftllm webui Qwen/Qwen3-0.6B

API Server (OpenAI 风格):

ftllm server Qwen/Qwen3-0.6B

使用指南

1. 如何启动模型

基本的启动命令格式如下:

ftllm run Qwen/Qwen3-0.6B # 启动本地对话

ftllm webui Qwen/Qwen3-0.6B # 启动WebUI

ftllm server Qwen/Qwen3-0.6B # 启动API Server

根据你需要开启的服务,选择相应的命令。以server命令为例,格式如下:

ftllm server model

这里的model可以是:

  • Huggingface上的模型,例如Qwen/Qwen3-0.6B代表千问3-0.6B模型
  • 本地模型路径。例如/mnt/Qwen3-0.6B,高速下载模型可以参考模型下载(https://github.com/ztxz16/fas...)

无论是在线模型还是本地模型,目前支持以下几种格式(均以在线模型举例,可以在Huggingface上搜到对应模型):

    • FP16, BF16格式的原始模型,例如Qwen/Qwen3-0.6B
    • FP8格式的模型,例如Qwen/Qwen3-0.6B-FP8
    • AWQ格式的模型,例如Qwen/Qwen3-14B-AWQ
    • Fastllm格式的模型,例如fastllm/DeepSeek-V3-0324-INT4。也可以下载原始模型后通过模型导出中的命令导出
    • 目前暂不支持GGUF格式的模型

如果您是第一次使用ftllm,建议直接使用基本的启动命令启动,所有的参数都会自动设置。如果您希望继续调参,请参照下面的参数设置说明

2. 如何设定推理精度

当启动的模型为浮点精度时(BF16, FP16, FP8)时,可以通过以下参数来设置模型的推理精度:

  • --dtype:
  • 描述: 指定模型的数据类型。
  • 可选值: int4gint4int8fp8float16或其他支持的数据类型。
  • 示例: --dtype int4
  • --moe_dtype:
  • 描述: 指定模型MOE层的数据类型。
  • 可选值: int4gint4int8fp8float16或其他支持的数据类型。
  • 示例: --moe_dtype int4
  • 说明: 如果指定的模型不是moe结构的模型,这个参数不会生效

命令示例:

ftllm server Qwen/Qwen3-0.6B --dtype int8

 上面的命令会读取原始模型(这个模型是BF16精度),并在线量化为INT8精度推理

ftllm server deepseek-ai/DeepSeek-V3-0324 --dtype fp8 --moe_dtype int4

 上面的命令会读取原始模型(这个模型是FP8精度),并使用FP8 + INT4的混合精度推理

若不设定这些参数,ftllm会使用模型中设定的精度来进行推理

若使用的模型已经是量化好的模型(例如AWQ模型,Fastllm导出的量化模型等),建议不指定这些参数

3. 如何设定运行设备

可以通过以下参数来设定执行推理的设备

  • --device:
  • 描述: 指定模型运行的计算设备。
  • 示例: --device cpu, --device cuda
  • 常用值说明:
  • cpu使用cpu推理
  • cuda使用gpu推理
  • numa使用多路numa节点加速推理,在多CPU的机器才会有提升
  • multicuda使用多设备张量并行推理
  • 使用多显卡: --device multicuda:0,1
  • 使用多显卡+CPU: --device multicuda:0,cpu
  • 按比例使用多显卡+CPU: --device multicuda:0:4,1:5,cpu:1 (cuda:0计算4/10, cuda:1计算5/10, cpu计算1/10)
  • --moe_device:
  • 描述: 指定 MOE(Mixture of Experts)层的计算设备。
  • 示例: --moe_device cpu, --moe_device numa
  • 常用值说明:
  • cpu使用cpu推理
  • numa使用多路numa节点加速推理,在多CPU的机器才会有提升
  • cuda使用gpu推理(MOE层需要大量显存,一般不建议指定为cuda)
  • 说明: 一般和device指定为不同的设备实现混合推理,例如--device cuda       --moe_device cpu来实现MOE模型的单卡+CPU混合推理。--device cuda --moe_device numa来实现MOE模型的单卡+多NUMA节点加速推理如果指定的模型不是moe结构的模型,这个参数不会生效

若不设定这些参数,会使用默认配置来推理,默认配置如下:
image.png

对于发烧友而言,如果想更进一步榨干硬件,可以参考混合推理指南(https://github.com/ztxz16/fas...)

4. 如何设定运行参数

可以通过下列参数设置运行参数。

需要注意的是,速度和参数设置并不一定正相关,如果对性能要求高,可以多方向尝试一下

  • -t或--threads:
  • 描述: 设置使用的CPU线程数。
  • 当device为cpu时,这个参数决定了推理使用的线程数
  • 当device为numa时,推理线程数主要由环境变量FASTLLM_NUMA_THREADS决定,threads参数请设得小一点(推荐设为1)
  • 示例: -t 27

例如我们在多CPU设备上用GPU + 多CPU混合部署一个MOE模型fastllm/DeepSeek-V3-0324-INT4,可以尝试这些命令:

export FASTLLM_NUMA_THREADS=27 && ftllm server fastllm/DeepSeek-V3-0324-INT4 --device cuda --moe_device numa -t 1

 使用多numa推理,每个numa节点使用27个线程

export FASTLLM_NUMA_THREADS=16 && ftllm server fastllm/DeepSeek-V3-0324-INT4 --device cuda --moe_device numa -t 1

 使用多numa推理,每个numa节点使用16个线程

numactl -C 0-31 -m 0 ftllm server fastllm/DeepSeek-V3-0324-INT4 --device cuda --moe_device cpu -t 27

 绑定单numa节点,使用CPU推理,使用27线程

不同硬件上,不同参数发挥出的性能有很大不同。一般而言,CPU上使用的线程数不建议超过物理核数

5. 其它参数

  • --moe_experts:
  • 描述: 指定 MOE(Mixture of Experts)层使用的专家数。不设定则根据模型配置设定。减少专家数可以提高推理速度,但可能降低推理准确度
  • 示例: --moe_experts 6
  • --port:
  • 描述: 指定服务运行的端口号。
  • 示例: --port 8080
  • --help:
  • 描述: 查看模块参数详细信息。
  • 示例: ftllm server --help
  • --version或-v:
  • 描述: 查看ftllm版本号。
  • 示例: ftllm -v
  • --hide_input:
  • 描述: server模式隐藏日志中的请求信息。
  • 示例: ftllm server       --hide_input
  • --api_key:
  • 描述: server模式设定api_key。
  • 示例: ftllm server --api_key       xxxxxxxx
  • --max_token:
  • 描述: webui模式指定最大输出。
  • 示例: ftllm webui --max_token
  • --think:
  • 描述: 强制思考。
  • 示例: ftllm webui --think
  • --cache_dir:
  • 描述: 指定在线Huggingface模型的缓存目录
  • 示例: ftllm --cache_dir /mnt

模型获取

模型下载

可以使用如下命令将模型下载到本地(使用高速镜像,无需科学上网)

ftllm download deepseek-ai/DeepSeek-R1

模型导出

如果使用量化加载模型(如--dtype int4),那么每次读取模型时会在线量化,读取速度较慢。

ftllm export 是一个用于导出和转换模型权重的工具。它支持将模型权重转换为不同的数据类型。以下是如何使用 ftllm export 的详细说明。

命令格式

ftllm export<模型路径> -o <输出路径> --dtype <数据类型> -t <线程数>

示例命令

ftllm export /mnt/DeepSeek-V3 -o /mnt/DeepSeek-V3-INT4 --dtype int4 -t 16

混合精度

可以通过指定--moe_dtype来实现混合精度,例如

ftllm export /mnt/DeepSeek-V3 -o /mnt/DeepSeek-V3-FP16INT4 --dtype float16 --moe_dtype int4 -t 16

加载导出后的模型

导出后的模型使用方法和原始模型类似,使用导出模型时--dtype参数将被忽略

例如

ftllm run /mnt/DeepSeek-V3-INT4/

支持的模型

如果需要运行更多早期的模型,请参考支持模型列表(https://github.com/ztxz16/fas...)

源码安装

若pip安装失败或有其它特殊需求,可以用源码编译安装源码安装后如果需要卸载,方法和PIP安装一样

pip uninstall ftllm

建议使用cmake编译,需要提前安装gcc,g++ (建议9.4以上), make, cmake (建议3.23以上)

GPU编译需要提前安装好CUDA编译环境,建议使用尽可能新的CUDA版本

使用如下命令编译

bash install.sh -DUSE_CUDA=ON -D CMAKE_CUDA_COMPILER=$(which nvcc)# 编译GPU版本
# bash install.sh -DUSE_CUDA=ON -DCUDA_ARCH=89 -D CMAKE_CUDA_COMPILER=$(which nvcc) # 可以指定CUDA架构,如4090使用89架构
# bash install.sh # 仅编译CPU版本

其他平台编译

其他不同平台的编译可参考文档

TFACC平台
ROCm平台

编译中遇到问题可参考FAQ文档

END

作者:ztxz16
原文:企业存储技术

推荐阅读

欢迎关注企业存储技术极术专栏,欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
5628
内容数
292
关注存储、服务器、图形工作站、AI硬件等方面技术。WeChat:490834312
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息