百亿大模型(如LLaMa-13B)由于权重规模巨大,推理过程对昇腾AI处理器的的硬件存储和带宽要求很高。当前的大模型稀疏量化工具,通过减少模型体积、减少内存和带宽的消耗,从而提升模型的性能。
大模型稀疏量化工具包括稀疏、量化和压缩三个部分:
如下命令如果使用非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.1.0 #安装PyTorch 2.1.0版本
pip3 install accelerate==0.21.0 #若需要使用NPU多卡并行方式对模型进行量化,需大于等于0.28.0版本
pip3 install tqdm==4.66.1
pip3 install tensorboard #需大于等于2.11.2版本
pip3 install typepy #需大于等于1.3.1版本
pip3 install sacrebleu #需大于等于2.3.1版本
pip3 install datasets #需大于等于2.13.1版本
pip3 install sqlitedict #需大于等于2.1.0版本
pip3 install omegaconf #需大于等于2.3.0版本
pip3 install pycountry #需大于等于22.3.5版本
pip3 install rouge_score #需大于等于0.1.2版本
pip3 install peft #需大于等于0.5.0版本
export PYTORCH_NPU_ALLOC_CONF=expandable_segments:False # 关闭NPU的虚拟内存 export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3 #配置量化将会执行的设备序列环境
仅Atlas 训练系列产品和Atlas A2训练系列产品/Atlas 800I A2推理产品支持此功能。
大模型压缩工具共分为稀疏、量化和权重压缩三大环节,用户需连续运行方可实现大模型压缩。
权重压缩工具在加载输入的权重文件时,存在一定的反序列化攻击安全风险。权重压缩工具通过界面提示操作存在反序列化攻击的安全风险,在加载前用户交互确认加载的权重文件无风险后,才开始进行对文件的操作。
├── 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
需注意,大模型量化工具建议在大模型下游任务评估流程打通的前提下使用,请自行调试源码后进行如下量化配置。
pip3 install protobuf==4.24.1 pip3 install sentencepiece==0.1.99 pip3 install sympy==1.11.1
稀疏量化场景导入样例代码如下,lowbit算法稀疏量化场景导入的代码样例请参考lowbit算法稀疏量化场景,请参考加粗字体信息提示,根据实际情况进行修改。
# 导入相关依赖 import torch import torch_npu # 若需要cpu上进行量化,可忽略此步骤 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', trust_remote_code=True, torch_dtype=torch.float16 ).npu() # 如果需要在npu上进行多卡量化,需要先参考前提条件进行配置,并配置以下参数device_map='auto', torch_dtype为当前使用模型的默认数据类型;在npu上进行量化时,单卡校准需将模型移到npu上model = model.npu(),多卡校准时不需要 # 准备校准数据,请根据实际情况修改 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(model.device) print(inputs) calib_dataset.append([inputs.data['input_ids'], inputs.data['attention_mask']]) return calib_dataset dataset_calib = get_calib_dataset(tokenizer, calib_list) #校准数据获取 # 稀疏量化配置,请根据实际情况修改 from msmodelslim.pytorch.llm_ptq.llm_ptq_tools import Calibrator, QuantConfig # 导入稀疏量化配置接口 # 使用QuantConfig接口,配置稀疏量化参数,并返回配置实例 quant_config = QuantConfig( w_bit=4, 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'], act_method=3, dev_type='npu', # 在cpu进行量化时,需要配置参数dev_type='cpu',并取消参数dev_id=model.device.index的配置 dev_id=model.device.index, pr=2.0, fraction=0.011, nonuniform=False, mm_tensor=False, co_sparse=True ) #使用Calibrator接口,输入加载的原模型、稀疏量化配置和校准数据,定义校准 calibrator = Calibrator(model, quant_config, calib_data=dataset_calib, disable_level='L0') calibrator.run() #使用run()执行量化 calibrator.save('./quant_weight') #使用save()保存模型量化参数,请根据实际情况修改路径 print('Save quant weight success!')
因为在存储量化参数过程中存在反序列化风险,所以已通过在存储过程中,将保存的量化结果文件夹权限设置为750,量化权重文件权限设置为400,量化权重描述文件设为600来消减风险。
python3 sparse_quant.py
cd ${INSTALL_DIR}/tools/msmodelslim/pytorch/weight_compression/compress_graph
${INSTALL_DIR}请替换为CANN软件安装后文件存储路径。例如,若安装的Ascend-cann-toolkit软件包,则安装后文件存储路径为:$HOME/Ascend/ascend-toolkit/latest。
bash build.sh $HOME/Ascend/ascend-toolkit/latest
cd build
├── deq_scale.npy ├── input_offset.npy ├── input_scale.npy ├── quant_bias.npy ├── quant_weight.npy
权重压缩工具仅需要对权重文件quant_weight.npy进行压缩操作。
# 导入相关依赖 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 = "./chatglm2/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)
python3 compress.py