SpinQuant

SpinQuant SpinQuant SpinQuant

3 分钟阅读

SpinQuant

SpinQuant 简介

SpinQuant 是一个通过学习旋转矩阵来优化大规模语言模型(LLM)量化的工具。该工具具有以下主要发现和贡献:

  1. 旋转去除离群值 :旋转是去除LLM中的离群值并辅助量化的有效手段。
  2. 非随机旋转 :并非所有旋转都同样有效,随机旋转在量化模型中会产生很大的方差。
  3. Cayley优化学习旋转 :使用Cayley优化方法学习旋转极大地提升了最终的模型性能。

通过这些贡献,SpinQuant显著缩小了LLaMA-2 7B模型在零样本推理任务中W4A4KV4量化和全精度之间的精度差距,仅为2.9个点,相比之下,比LLM-QAT(量化训练的LLM)高出19.1个点,比SmoothQuant高出25.0个点。

使用场景

SpinQuant主要用于以下场景:

  1. 大规模语言模型的低位量化 :例如LLaMA-2 7B/13B、LLaMA-3 8B/70B等模型。
  2. 去除模型中的离群值 :通过优化旋转矩阵减少离群值对量化精度的影响。
  3. 提高量化模型的推理精度 :尤其在资源受限的硬件环境下,通过低位量化减少计算和存储开销。
运行步骤
  1. 环境配置
  • 安装Python 3.9和PyTorch>=2.0。
  • 安装必要的Python包:pip install -r requirement.txt
  • 克隆并安装Fast Hadamard Transform库:

git clone https://github.com/Dao-AILab/fast-hadamard-transform.git cd fast-hadamard-transform pip install .

  1. 运行步骤
  • 优化旋转矩阵
  • 针对LLaMA-2 7B/13B和LLaMA-3 8B模型:

bash 10_optimize_rotation.sh $model_name $w_bit $a_bit $kv_bit

例如:对Llama-2-7b模型进行4位权重、4位激活、4位kv缓存的量化:

bash 10_optimize_rotation.sh meta-llama/Llama-2-7b 4 4 4

  • 针对LLaMA-2 70B和LLaMA-3 70B模型:

bash 11_optimize_rotation_fsdp.sh $model_name $w_bit $a_bit $kv_bit

例如:对Llama-2-70b模型进行4位权重、4位激活、4位kv缓存的量化:

bash 11_optimize_rotation_fsdp.sh meta-llama/Llama-2-70b 4 4 4

  • 运行PTQ评估

bash 2_eval_ptq.sh $model_name $w_bit $a_bit $kv_bit

参数说明
  • input_model:模型名称或权重路径。
  • output_rotation_path:保存优化旋转矩阵的本地路径。
  • per_device_train_batch_size:旋转优化训练的批次大小。
  • per_device_eval_batch_size:PPL评估的批次大小。
  • a_bits:激活量化的位数。
  • w_bits:权重量化的位数。
  • v_bits:值量化的位数。
  • k_bits:键量化的位数。
  • w_clip:是否使用网格搜索来找到最佳的权重截断范围。
  • w_rtn:是否使用最近舍入量化,如果没有这个参数则使用GPTQ量化。
  • rotate:是否对模型进行旋转。
  • optimized_rotation_path:优化旋转矩阵的检查点路径,如果未提供路径则使用随机旋转。

通过这些步骤和参数配置,可以实现对LLM的高效量化和评估,有效提升模型在低位量化下的精度表现。