文档
注册

大模型量化

大模型量化工具将高位浮点数转为低位的定点数,例如16bit降低到8bit,直接减少模型权重的体积,生成量化参数和权重文件。在无需训练成本的前提下,完成大模型的训练后压缩并最大程度保障其精度。

目前支持对包括但不限于表1中的大模型进行量化。

表1 大模型量化已验证模型列表

模型名称

框架

ChatGLM_V2-6B

PyTorch

LLaMA-13B

PyTorch

前提条件

  • 仅支持在以下昇腾AI处理器中使用。
    • Atlas 推理系列产品(Ascend 310P处理器)
    • Atlas 训练系列产品
    • Atlas A2训练系列产品
  • 已参考环境准备,完成CANN开发环境的部署、Python环境变量配置。
  • 量化前须执行命令安装依赖。

    如下命令如果使用非root用户安装,需要在安装命令后加上--user,例如:pip3 install onnx --user

    pip3 install numpy==1.25.2
    pip3 install transformers       #需大于等于4.29.1版本,LLaMA模型需指定安装4.29.1版本
    pip3 install torch==2.0.0       #安装CPU版本的PyTorch 2.0.0
    pip3 install accelerate==0.21.0
    pip3 install tqdm==4.66.1

功能实现流程

图1 量化接口调用流程

关键步骤说明如下:

  1. 用户准备原始模型和校准数据。
  2. 使用离群值抑制功能对LLM模型进行离群值抑制。非LLaMA可跳过此步骤,直接执行步骤3。
    1. 使用AntiOutlierConfig生成离群值抑制配置。
    2. 调用AntiOutlier接口,将模型、校准数据等传入,生成抑制器。
    3. 调用抑制器的process()方法对原始模型进行离群值抑制。
  3. 使用QuantConfig生成量化配置。
  4. 根据原始模型、量化配置和校准数据,调用Calibrator接口构建量化校准对象。
  5. 调用生成的量化校准对象的run()方法对原始模型进行量化。
  6. 调用生成的量化校准对象的save()接口保存量化后的模型,包括模型量化权重和模型相关参数,用于后续量化模型的部署任务。

更多实例请参考“${INSTALL_DIR}/tools/modelslim/pytorch/llm_ptq/README.md”获取,${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。例如,若安装的Ascend-cann-toolkit软件包,则安装后文件存储路径为:$HOME/Ascend/ascend-toolkit/latest。

量化步骤(以ChatGLM2-6B为例)

  1. 用户自行准备模型、权重文件和校准数据,本样例以ChatGLM2-6B为例,点击获取链接自行下载权重文件,并上传至服务器文件夹内,如上传至“chatglm2”文件夹,目录示例如下:
    ├── config.json
    ├── configuration chatglm.py
    ├── modeling_chatglm.py
    ├── pytorch_model-00001-of-00007.bin
    ├── pytorch_model-00002-of-00007.bin
    ├── pytorch_model-00003-of-00007.bin
    ├── pytorch_model-00004-of-00007.bin
    ├── pytorch_model-00005-of-00007.bin
    ├── pytorch_model-00006-of-00007.bin
    ├── pytorch_model-00007-of-00007.bin
    ├── pytorch_model.bin.index.json
    ├── quantization.py
    ├── README.md
    ├── tokenization_chatglm.py
    ├── tokenizer.model
    ├── tokenizer_config.json

    需注意,大模型量化工具建议在大模型下游任务评估流程打通的前提下使用,请自行调试源码后进行如下量化配置。

  2. ChatGLM_V2-6B模型进行量化前请执行如下命令安装所需依赖,若运行量化工具过程中提示缺失某个依赖,请根据提示安装。
    pip3 install protobuf==4.24.1
    pip3 install sentencepiece==0.1.99
    pip3 install sympy==1.11.1
  3. 新建模型的量化脚本quant.py,编辑quant.py文件,导入如下样例代码,并根据实际情况进行修改。
    # 导入相关依赖
    import torch
    import torch.utils.data
    from transformers import AutoTokenizer, AutoModel
    
    # for local path
    tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path='./chatglm2',
                                              trust_remote_code=True)
    model = AutoModel.from_pretrained(pretrained_model_name_or_path='./chatglm2',
                                      torch_dtype=torch.float32, trust_remote_code=True).cpu()
    
    # 准备校准数据,请根据实际情况修改
    calib_list = ["中国的首都在哪里?",
                  "请做一首诗歌:",
                  "我想要学习python,该怎么学习?",
                  "请帮我写一篇关于大模型推理优化的任职报告:",
                  "中国最值得去的几个景点"]
    #获取校准数据函数定义
    def get_calib_dataset(tokenizer, calib_list):
        calib_dataset = []
        for calib_data in calib_list:
            inputs = tokenizer([calib_data], return_tensors='pt').to('cpu')
            print(inputs)
            calib_dataset.append([inputs.data['input_ids'], inputs.data['position_ids'], inputs.data['attention_mask']])
        return calib_dataset
    
    dataset_calib = get_calib_dataset(tokenizer, calib_list)  #校准数据获取
    
    # 量化配置
    from modelslim.pytorch.llm_ptq.llm_ptq_tools import Calibrator, QuantConfig    # 导入量化配置接口
    # 使用QuantConfig接口,配置量化参数,并返回量化配置实例
    quant_config = QuantConfig(w_bit=8, disable_names=['transformer.encoder.layers.0.self_attention.query_key_value','transformer.encoder.layers.0.self_attention.dense', 'transformer.encoder.layers.0.mlp.dense_h_to_4h', 'transformer.output_layer'], dev_type='cpu', act_method=3, pr=0.5, mm_tensor=False, w_hessian=False)
    #使用Calibrator接口,输入加载的原模型、量化配置和校准数据,定义校准
    calibrator = Calibrator(model, quant_config, calib_data=dataset_calib, disable_level='L1')
    calibrator.run()     #使用run()执行量化
    calibrator.save('./quant_weight')      #使用save()保存模型量化参数,请根据实际情况修改路径
    print('Save quant weight success!')

    需注意,因为在存储量化参数过程中存在反序列化风险,所以已通过在存储过程中,将保存的量化结果文件夹权限设置为750,量化结果文件权限设置为400来消减风险。

  4. 启动模型量化任务,并在指定的输出目录获取模型量化参数,用于后续的推理部署任务。
    python3 quant.py

    量化任务完成后,可能会存在模型精度下降的情况,可以参考精度保持策略进行配置优化减少精度损耗。

精度保持策略

为了进一步降低量化精度损失,可以通过配置QuantConfig接口中的“pr”Calibrator接口中的“disable_level”参数来保持精度,配置建议如下:

  • pr:量化正则百分比,目前的模型最优值0.5,建议使用0.5,可以适当降低该参数进行精度调优。
  • disable_level:自动回退等级,从L0——L5可选,L0代表不回退,L1至L5对应的等级逐渐增大,在模型精度损失较大时可以适当提升回退等级。

同时,因为量化存在随机性,若精度损失较大,用户可以尝试多次运行量化脚本,导出较优的量化参数。

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词