MindSpore框架

前提条件

功能实现流程

大模型压缩工具共分为稀疏、量化和权重压缩三大环节,用户需连续运行方可实现大模型压缩。

稀疏量化步骤

本示例旨在说明基于MindSpore框架的大模型稀疏量化的操作步骤。

  1. 用户自行准备模型、权重文件和校准数据,权重格式为ckpt。

    ├── model.ckpt

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

  2. 新建模型的稀疏量化脚本sparse_quant.py,编辑sparse_quant.py文件。

    稀疏量化场景导入样例代码如下:

    # 导入相关依赖
    import mindspore as ms
    model, tokenizer = load_model_and_tokenizer()    # 用户根据实际使用场景自行加载MindSpore框架下的组件
    
    # 准备校准数据,请根据实际情况修改
    calib_list = ["中国的首都在哪里?",
                  "请做一首诗歌:",
                  "我想要学习python,该怎么学习?",
                  "请帮我写一篇关于大模型推理优化的任职报告:",
                  "中国最值得去的几个景点"]
    
    #获取校准数据函数定义
    def get_calib_dataset(tokenizer, calib_list):
        calib_dataset = []
        for calib_data in calib_list:
            inputs = tokenizer(calib_data, return_tensors='np', padding=True) 
            calib_dataset.append([inputs.data['input_ids_name']])
        return calib_dataset
    dataset_calib = get_calib_dataset(tokenizer, calib_list)  #校准数据获取
    
    # 稀疏量化配置,请根据实际情况修改
    from msmodelslim.mindspore.llm_ptq import Calibrator, QuantConfig    # 导入稀疏量化配置接口
    # 使用QuantConfig接口,配置稀疏量化参数,并返回配置实例
    quant_config = QuantConfig(
        disable_names=[],      # 回退层按照实际需求进行配置
        fraction=0.03,         # fraction参数按照实际需求配置 
    )
    
    #使用Calibrator接口,输入加载的原模型、稀疏量化配置和校准数据,定义校准
    calibrator = Calibrator(
        cfg=quant_config,
        model=model,
        model_ckpt="./model.ckpt",
        calib_data=dataset_calib
    )
    calibrator.run()     #使用run()执行量化
    calibrator.save('./quant_weight.ckpt')      #使用save()保存模型量化参数,请根据实际情况修改路径
    print('Save quant weight success!')

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

  3. 启动模型稀疏量化任务,并在指定的输出目录获取模型量化参数,用于后续的推理部署任务

    python3 sparse_quant.py

压缩步骤

  1. 编译压缩函数。

    1. 已参考前提条件,完成环境变量配置。
    2. 进入权重压缩工具所在路径。
      cd ${INSTALL_DIR}/tools/msmodelslim/pytorch/weight_compression/compress_graph

      ${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。例如,若安装的Ascend-cann-toolkit软件包,则安装后文件存储路径为:$HOME/Ascend/ascend-toolkit/latest。

    3. 执行编译命令。
      bash build.sh $HOME/Ascend/ascend-toolkit/latest
    4. 编译结束后,在当前路径下生成build目录,执行如下命令查看编译结果compress_executor。
      cd build

  2. 用户参考稀疏量化步骤对指定模型进行稀疏量化之后,在指定的权重保存路径(./quant_weight.ckpt)下得到ckpt文件,并对待压缩的权重部分进行压缩操作。

    import re
    linear_weight_pattern = r"model\.layers\.\d+\.(attention[^_]|feed_forward|augs_attn\d+).*\.weight$" #根据实际情况进行权重键值的筛选
    reg = re.compile(linear_weight_pattern)
    sparse_ckpt = ms.load_checkpoint(f"./quant_weight.ckpt")  #./quant_weight.ckpt为稀疏量化结果件的保存路径
    compressed_weight_dict = {}
    for k, v in sparse_ckpt.items():
       if reg.search(k):
            if k in disable_names:
                continue
            compressed_weight_dict[k] = v.numpy() 
    np.save(f"quant_weight.npy", compressed_weight_dict)

    权重压缩工具仅需要对权重文件ckpt进行压缩操作。

  3. 新建压缩脚本compress.py,编辑compress.py文件,导入如下样例代码,并根据实际情况进行修改。

    # 导入相关依赖
    import sys
    import os
    import numpy as np
    # 导入权重压缩接口
    from msmodelslim.pytorch.weight_compression import CompressConfig, Compressor
    def make_dir(path):
        if not os.path.exists(path):
            os.makedirs(path, mode=0o750)
        return path
    
    # 准备待压缩权重文件和相关压缩配置,请根据实际情况进行修改
    weight_path = "./quant_weight.npy"       # 待压缩权重文件的路径
    save_path = "./compress"                          # 压缩后权重文件保存的路径
    index_root = make_dir(os.path.join(save_path, 'index'))
    weight_root = make_dir(os.path.join(save_path, 'weight'))
    info_root = make_dir(os.path.join(save_path, 'info'))
    
    # 使用CompressConfig接口,配置压缩参数,并返回配置实例
    compress_config = CompressConfig(do_pseudo_sparse=False, sparse_ratio=1, is_debug=True, record_detail_root=save_path, multiprocess_num=8)
    
    #使用Compressor接口,输入加载的压缩配置和待压缩权重文件
    compressor = Compressor(compress_config, weight_path)
    compress_weight, compress_index, compress_info = compressor.run()
    
    #使用export()接口,保存压缩后的结果文件
    compressor.export(compress_weight, weight_root)
    compressor.export(compress_index, index_root)
    compressor.export(compress_info, info_root, dtype=np.int64)

  4. 运行压缩脚本,并在指定的输出目录获取压缩后的权重文件,用于后续的推理部署任务。

    python3 compress.py

    用户需要将压缩后得到的权重文件(compress_weight、compress_index和compress_info)自行整合到ckpt文件中,才能用于后续的推理部署任务。