DeepSeek量化#

DeepSeekR1模型主要采用FP8-Static和W4A8两种方案进行模型压缩

FP8量化#

DeepSeekR1的FP8量化为per-tensor粒度。

您可以量化AngelSlim/configs/deepseek_r1下面带有fp8_static字段的模型类型。

配置#

FP8 confg.yaml文件参数配置,您可以参考config/deepseek_r1/fp8_static路径下的文件,下面是参数信息介绍。

model配置#

  • name:填写DeepSeek

  • torch_dtype:权重加载时使用的数据类型。设置为fp8时可直接加载HF上的deepseek-ai/DeepSeek-R1-0528模型。设置为bf16时需要将fp8权重进行转换。

  • low_cpu_mem_usage:设置为True时表示使用单卡运行,权重存放在CPU上,同时quantization.low_memory也要设置为true,并且model.device_map填写cpu

Compression配置#

  • name:压缩策略,选填量化quantization

  • quantization.name:压缩算法选填fp8_static

  • quantization.bits:量化比特数,目前支持8bit。

  • quantization.low_memory: 设置为true表示使用单卡运行。

  • quantization.quant_method:主要指定权重的量化粒度,FP8为per-tensor

  • quantization.ignore_layers:指定模型中不需要量化的层。

FP8量化#

您可以通过下面代码启动FP8量化流程。支持多机多卡以及单卡校准。

多卡#

多卡模式需要–multi-nodes参数指定。单机8卡H20可实现DeepSeek权重以fp8类型加载的量化。

NNODES={运行的节点数}
NPROC_PER_NODE={每个节点的卡数}
MASTER_ADDR={主节点ip地址}
CONFIG=configs/deepseek_r1/fp8_static/deepseek_r1_fp8_static.yaml

torchrun \
    --nnodes $NNODES \
    --nproc-per-node $NPROC_PER_NODE \
    --node-rank {节点序号} \
    --master-addr $MASTER_ADDR \
    tools/run.py \
    --config $CONFIG \
    --multi-nodes

双机16卡运行时,则每台机器上都执行以上脚本。

单卡#

python3 tools/run.py -c configs/deepseek_r1/fp8_static/deepseek_r1_fp8_static_low_memmory.yaml

部署#

vLLM支持DeepSeek的per-tensor量化,已验证vllm==0.8.5可部署。

若使用单机8卡141GB H20,您可以修改AngelSlim/scripts/deploy/run_vllm.sh中的MODEL_PATH字段后通过以下命令使用:

cd AngelSlim/scripts/deploy
sh run_vllm.sh

若使用96GB H20,需要双机部署

W4A8-FP8量化#

DeepSeekR1的W4A8-FP8量化,其中权重为per-group的粒度,group-size为128,激活为per-tensor的粒度。

您可以量化AngelSlim/configs/deepseek_r1下面带有w4a8_fp8字段的模型类型。

配置#

W4A8-FP8 confg.yaml文件参数配置,您可以参考config/deepseek_r1/w4a8_fp8路径下的文件,下面是参数信息介绍。

model配置#

  • name:填写DeepSeek

  • torch_dtype:权重加载时使用的数据类型。设置为fp8时可直接加载HF上的deepseek-ai/DeepSeek-R1-0528模型。设置为bf16时需要将fp8权重进行转换后再进行量化。

  • low_cpu_mem_usage:设置为True时表示使用单卡运行,权重存放在CPU上,同时quantization.low_memory也要设置为true,并且model.device_map填写cpu

Compression配置#

  • name:压缩策略,选填量化quantization

  • quantization.name:压缩算法选填w4a8_fp8

  • quantization.bits:量化比特数,W4A8-FP8下不起作用。

  • quantization.low_memory: 设置为true表示使用单卡运行。

  • quantization.quant_method:主要指定权重的量化粒度,W4A8-FP8为per-group

  • quantization.group_size:权重量化分组数。

  • quantization.ignore_layers:指定模型中不需要量化的层。

W4A8-FP8量化#

您可以通过下面代码启动W4A8-FP8量化流程。支持多机多卡以及单卡校准。

多机多卡#

多机多卡模式需要–multi-nodes参数指定

NNODES={运行的节点数}
NPROC_PER_NODE={每个节点的卡数}
MASTER_ADDR={主节点ip地址}
CONFIG=configs/deepseek_r1/w4a8_fp8/deepseek_r1_w4a8_fp8.yaml

torchrun \
    --nnodes $NNODES \
    --nproc-per-node $NPROC_PER_NODE \
    --node-rank {节点序号} \
    --master-addr $MASTER_ADDR \
    tools/run.py \
    --config $CONFIG \
    --multi-nodes

单卡#

python3 tools/run.py -c configs/deepseek_r1/w4a8_fp8/deepseek_r1_w4a8_fp8_low_memmory.yaml

INT4-AWQ量化#

DeepSeekR1的INT4-AWQ量化,可使用vllm部署。其中权重为per-group的粒度,group-size可选64/128;激活为动态per-token量化,可支持激活数据类型为int8/fp8。具体可见对应PR:

https://github.com/vllm-project/vllm/pull/24722

您可以量化AngelSlim/configs/deepseek_r1下面带有int4_awq字段的模型类型。

配置#

INT4-AWQ confg.yaml文件参数配置,您可以参考config/deepseek_r1/int4_awq路径下的文件,下面是参数信息介绍。

model配置#

  • name:填写DeepSeek

  • torch_dtype:权重加载时使用的数据类型。设置为fp8时可直接加载HF上的deepseek-ai/DeepSeek-R1-0528模型。设置为bf16时需要将fp8权重进行转换后再进行量化。

  • device_map:设置为cpu

Compression配置#

  • name:压缩策略,填写PTQ

  • quantization.name:压缩算法选填int4_awq

  • quantization.bits:量化比特数,设置为4。

  • quantization.quant_method:主要指定权重的量化粒度,设置为per-group

  • quantization.group_size:权重量化分组数。

  • quantization.zero_point:权重量化偏置,设置为True

  • quantization.ignore_layers:指定模型中不需要量化的层。

INT4-AWQ量化#

您可以通过下面代码启动INT4-AWQ量化流程:

AWQ算法#

python3 tools/run.py --config configs/deepseek_r1/int4_awq/deepseek_r1_int4_awq.yaml

快速转换AWQ格式#

python3 tools/convert_int4_awq_offline.py \
--bit 4 \
--group-size xx \ # 128或者64
--zero-point xx \ # 设置为True时在vllm中对应AWQ,设置为False对应GPTQ
--num-workers xx \ # 线程数
--input_path 权重路径 \
--output_path 保存路径 \
--exclude-patterns None \ # 设置不量化模块,默认为None