配置的简要说明#

所有的配置均可以在这里找到,具体地,包括量化算法量化实践以及方法组合技, 以及推理后端相关的配置

下面的是一个简要的配置例子

base:
    seed: &seed 42 # 设置随机种子
model:
    type: model_type # 模型的类型
    path: model path # 模型的路径
    tokenizer_mode: fast # 模型的tokenizer类型
    torch_dtype: auto # 模型的dtype
calib:
    name: pileval # 校准数据集名
    download: False # 校准数据集是否在线下载
    path: calib data path # 校准数据集路径
    n_samples: 512 # 校准数据集的数量
    bs: 1 # 校准数据集的batch size
    seq_len: 512 # 校准数据集的长度
    preproc: pileval_smooth # 校准数据集的预处理方式
    seed: *seed # 校准数据集的随机种子
eval:
    eval_pos: [pretrain, transformed, fake_quant] # 评测的位点
    name: wikitext2 # 评测数据集的名字
    download: False # 评测数据集是否在线下载
    path: eval data path # 评测数据集的路径
    bs: 1 # 评测数据集的batch size
    seq_len: 2048 # 评测数据集的长度
    eval_token_consist: False # 是否评测量化模型和原始模型输出token的一致性
quant:
    method: SmoothQuant # 压缩方法
    weight:
        bit: 8 # 权重的量化bit数
        symmetric: True # 权重量化是否是对称量化
        granularity: per_channel # 权重量化的粒度
    act:
        bit: 8 # 激活的量化bit数
        symmetric: True # 激活量化是否是对称量化
        granularity: per_token # 激活量化的粒度
    speical: # 量化算法需要的特殊参数,可参照每个算法的配置文件的注释以及原论文掌握其用法
save:
    save_vllm: False # 是否保存真实量化的模型,以供VLLM推理
    save_sgl: False # 是否保存真实量化的模型,以供Sglang推理
    save_autoawq: False # 是否保存真实量化的模型,以供AutoAWQ推理
    save_mlcllm: False # 是否保存真实量化的模型,以供MLC-LLM推理
    save_trans: False # 是否保存权重变换之后的模型
    save_fake: False # 是否保存伪量化的权重
    save_path: /path/to/save # 保存路径

配置的详细说明#

base#

base.seed

设置随机种子,用于整个框架的所有随机种子的设定

model#

model.type

模型的类型,可支持Llama,Qwen2,Llava,Gemma2等模型,可以从这里查看llmc支持的所有模型

model.path

模型的权重路径,llmc目前只支持hugging face格式的模型,可以用以下的代码检测是否可以正常load

from transformers import AutoModelForCausalLM, AutoConfig


model_path = # 模型的权重路径
model_config = AutoConfig.from_pretrained(
    model_path, trust_remote_code=True
)
model = AutoModelForCausalLM.from_pretrained(
    model_path,
    config=model_config,
    trust_remote_code=True,
    torch_dtype="auto",
    low_cpu_mem_usage=True,
)

print(model)

如果上述代码不可以load你所给的模型,可能原因有

  1. 你的模型格式并不是hugging face格式

  2. 你的tansformers版本太低了,可以执行pip install transformers --upgrade升级

llmc运行之前确保上述代码能加载成功你的模型,否则llmc也无法加载你的模型

model.tokenizer_mode

选择使用slow还是fast的tokenizer

model.torch_dtype

设置模型权重的数据类型,可以选择以下几种类型

  1. auto

  2. torch.float16

  3. torch.bfloat16

  4. torch.float32

其中auto将跟随权重文件原本的数据类型设置

calib#

calib.name

校准数据集的名称,目前支持以下几种校准数据集

  1. pileval

  2. wikitext2

  3. c4

  4. ptb

  5. custom

其中custom表示使用用户自定义的校准数据集,具体使用说明参考文档的进阶用法的自定义校准数据集章节

calib.download

表示该校准数据集是否需要运行时在线下载

如果设置True,则无需设置calib.path,llmc会自动联网下载数据集

如果设置False,则需要设置calib.path,llmc会从该地址读取数据集,全程也无需联网运行llmc

calib.path

如果设置calib.download为False,则需要设置calib.path,表示存储校准数据集的路径

其中该路径存储的数据,需要是arrow格式的数据集

从hugging face下载arrow格式的数据集,可以使用以下代码

from datasets import load_dataset
calib_dataset = load_dataset(数据集名)
calib_dataset.save_to_disk(保存路径)

加载该格式的数据集可以使用

from datasets import load_from_disk
data = load_from_disk(数据集路径)

llmc已经提供了上述数据集的下载脚本

校准数据集可以在这里下载

执行命令是python download_calib_dataset.py --save_path [校准数据集保存路径]

测试数据集可以在这里下载

执行命令是python download_eval_dataset.py --save_path [测试数据集保存路径]

如果用户想用更多的数据集,就可以参考上面的arrow格式数据集的下载方式,自行修改

calib.n_samples

选择n_samples条数据用于校准

calib.bs

将校准数据以calib.bs为batch size进行打包,如果设置为-1,表示将全部数据打包成一个batch数据

calib.seq_len

校准数据的长度

calib.preproc

校准数据的预处理方式,目前llmc实现了多种预处理方式

  1. wikitext2_gptq

  2. ptb_gptq

  3. c4_gptq

  4. pileval_awq

  5. pileval_smooth

  6. pileval_omni

  7. general

  8. random_truncate_txt

除了general,其余预处理均可以在这里找到实现方式

general在base_dataset中的general_preproc函数中实现

calib.seed

数据预处理中的随机种子,默认跟随base.seed的设置

eval#

llmc默认支持评测量化模型的困惑度(PPL), 以及量化模型和原始模型输出token的一致性。此外还支持通过harness和opencompass评测下游任务的精度(可见评测章节v1v2

eval.eval_pos

表示评测PPL的位点,目前支持三个位点可以被评测

  1. pretrain

  2. transformed

  3. fake_quant

eval_pos需要给一个列表,列表可以为空,空列表表示不进行测试

eval.name

测试数据集的名称,目前支持以下几种测试数据集

  1. wikitext2

  2. c4

  3. ptb

测试数据集下载方式参考calib.name校准数据集

eval.download

表示该测试据集是否需要运行时在线下载,参考calib.download

eval.path

参考calib.path

eval.bs

测试的batch size

eval.seq_len

测试的数据长度

eval.inference_per_block

llmc仅支持单卡运行,如果你的模型太大,在测试的时候,单张卡的显存放不下整个模型,那么就需要打开inference_per_block,使用per block进行推理测试,同时在不爆显存的前提下,适当提高bs以提高推理速度

下面的是一个配置例子

bs: 10
inference_per_block: True

同时测试多个数据集

llmc也支持同时评测多个数据集的PPL

下面是评测单个wikitext2数据集的例子

eval:
    name: wikitext2
    path: wikitext2的数据集路径

下面是评测多个数据集的例子

eval:
    name: [wikitext2, c4, ptb]
    path: 这几个数据集的共有上层目录

需要注意的是,多个数据集评测的name需要以列表形式表示,同时需要遵循以下目录规则

  • 共有上层目录

    • wikitext2

    • c4

    • ptb

如果直接使用llmc的下载脚本,则共有上层目录就是--save_path所指定的数据集保存路径

eval.eval_token_consist

表示是否评测量化模型和原始模型输出token的一致性,取值范围[0,1], 越接近1越说明量化模型的性能越接近原始模型

quant#

quant.method

使用的量化算法名,llmc支持的所有量化算法可以在这里查看

quant.weight

权重的量化设置

quant.weight.bit

权重的量化bit数

quant.weight.symmetric

权重的量化对称与否

quant.weight.granularity

权重的量化粒度,支持以下粒度

  1. per_tensor

  2. per_channel

  3. per_group

quant.weight.group_size

当权重是per-group量化时,其表示group的大小

quant.weight.ste

在权重量化的取整过程中,是否用直通估计器(straight-through estimator)来使round函数可以产生梯度以便进行反向传播

quant.weight.calib

权重的校准方法,默认采用minmax,除此之外,llmc还支持learnable,mse两种方法,可能会取得更好的结果

quant.act

激活的量化设置

quant.act.bit

激活的量化bit数字

quant.act.symmetric

激活的量化对称与否

quant.act.granularity

激活的量化粒度,支持以下粒度

  1. per tensor

  2. per token

  3. per head

quant.act.ste

在激活量化的取整过程中,是否用直通估计器(straight-through estimator)来使round函数可以产生梯度以便进行反向传播

quant.act.calib

激活的校准方法,默认采用minmax,且只支持minmax

其中如果quant.method设置的为RTN,激活量化可以支持静态per tensor设置,下面是,权重静态per-channel量化,激活静态per tensor量化的配置和激活动态per token 8bit量化的配置

quant:
    method: RTN
    # 静态per-channel量化
    weight:
        bit: 8
        symmetric: True
        granularity: per_channel

    # 静态per-tensor量化
    act:
        bit: 8
        symmetric: True
        granularity: per_tensor
        static: True
quant:
    method: RTN
    #静态per-channel量化
    weight:
        bit: 8
        symmetric: True
        granularity: per_channel

    # 动态per-tensor量化
    act:
        bit: 8
        symmetric: True
        granularity: per_token

sparse#

sparse.method

使用的稀疏化算法名,这包含对模型的稀疏化和对视觉token的reduction,所有支持算法可以在文件中查看。

值得说明的是针对模型稀疏化,需要指定具体的算法名称,而token reduction只需要先指定为TokenReduction,在special中继续指定具体的算法。

sparse:
    method: Wanda
sparse:
    method: TokenReduction
    special:
        method: FastV

save#

save.save_vllm

是否保存为VLLM推理后端支持的真实量化模型

当开启该选项时,你会发现保存的模型权重显著变小(真实量化),同时可以通过VLLM后端来直接加载推理,提高推理速度以及降低显存占用,有关于VLLM推理后端的内容见该章节

save.save_sgl

是否保存为Sglang推理后端支持的真实量化

当开启该选项时,你会发现保存的模型权重显著变小(真实量化),同时可以通过Sglang后端来直接加载推理,提高推理速度以及降低显存占用,有关于Sglang推理后端的内容见该章节

save.save_autoawq

是否保存为AutoAWQ推理后端支持的真实量化模型

当开启该选项时,你会发现保存的模型权重显著变小(真实量化),同时可以通过AutoAWQ后端来直接加载推理,提高推理速度以及降低显存占用,有关于AutoAWQ推理后端的内容见该章节

save.save_mlcllm

是否保存为MLC-LLM推理后端支持的真实量化模型

当开启该选项时,你会发现保存的模型权重显著变小(真实量化),同时可以通过MLC-LLM后端来直接加载推理,提高推理速度以及降低显存占用,有关于MLC-LLM推理后端的内容见该章节

save.save_trans

是否保存调整之后的模型权重

保存的该权重,是经过调整之后的更适合量化的权重,其可能包含更少的离群值,其还是以fp16/bf16的格式保存(权重文件大小与原始模型保持一致),在推理引擎中部署的时候,需要开启推理引擎的naive量化功能,即可实现量化推理。

save_vllm等不同的是,其需要该推理引擎来完成真实量化,而llmc提供一个更适合量化的浮点模型权重。

例如SmoothQuant/Os+/AWQ/Quarot等算法导出的save_trans模型,其具有更少的outliers,更适合量化。

save.save_fake

是否保存伪量化的模型

save.save_path

保存模型的路径,该路径需要是一个不存在的新的目录路径,否则llmc会终止运行,并发出相应的错误提示