当前位置: 首页 > news >正文

ModelSlim:大模型量化推理调优利器

一、背景介绍

ModeSlim 是什么?

ModeSlim 是昇腾提供的模型量化压缩工具。

ModeSlim 能做什么?

它可以对深度学习模型进行轻量化处理,核心目标是在保证模型性能(如精度)基本不受显著影响的前提下,减小模型体积、降低计算复杂度,从而提升模型的部署效率和运行速度,尤其适用于资源受限的场景。

官方仓库地址:GitCode - 全球开发者的开源社区,开源代码托管平台

二、依赖环境

硬件要求Atlas 800I A2/ Atlas 800T A2、Atlas 300I Duo 推理卡
OS版本openEuler 22.03 LTS
Python版本python3.10/python3.11
CANN版本8.2.RC2

基础配套镜像:昇腾镜像仓库详情

三、具体步骤

开启二进制编译(可选)

如果使用的是 npu 进行量化,可以选择开启二进制编译,从而避免在线编译算子

torch.npu.set_compile_mode(jit_compile=False)option={}option["NPU_FUZZY_COMPILE_BLACKLIST"]="ReduceProd"torch.npu.set_option(option)

模型加载

将模型加载到 npu 上:

model_path='/data/Qwen2.5-72B-Instruct/'model=AutoModelForCausalLM.from_pretrained(pretrained_model_name_or_path=model_path,torch_dtype=torch.bfloat16,trust_remote_code=True,device_map="auto",max_memory={0:"0GiB",1:"0GiB",2:"0GiB",3:"0GiB",4:"25GiB",5:"25GiB",6:"25GiB",7:"25GiB"}).eval()

获取校准数据

校准数据建议选取业务数据中,场景比较普适的子数据集。 例如对于ceval场景,选择teacher_qualification.jsonl。 对于中英文混合场景需要均衡输入中英文数据,对于代码生成类模型需要输入代码生成任务。 输入数量建议为10条-50条。

def get_calib_dataset(tokenizer, calib_list,device=model.device): calib_dataset=[]forcalib_dataincalib_list: inputs=tokenizer(calib_data,return_tensors='pt')calib_dataset.append([inputs.data['input_ids'].to(device), inputs.data['attention_mask'].to(device)])returncalib_dataset# boolq数据集entry="/dataset/boolq_lite/dev3.jsonl"with open(entry,'r')as file: calib_set=json.load(file)dataset_calib=get_calib_dataset(tokenizer, calib_set)

离群值抑制AntiOutlier设置

对于部分模型,单独的W8A8量化精度表现效果可能较差,可能需要在调用量化之前调用AntiOutlier模块进行异常值抑制,通过抑制量化过程中的异常值,使能后续更好的量化。

  • m1:SmoothQuant算法
  • m2:SmoothQuant升级版
  • m3:AWQ算法(适用于W8A16/W4A16)
  • m4:SmoothQuant优化算法
  • m5:CBQ算法
  • m6:Flex smooth量化算法
anti_config=AntiOutlierConfig(anti_method="m3",dev_type="npu",dev_id=model.device.index)anti_outlier=AntiOutlier(model,calib_data=dataset_calib,cfg=anti_config)anti_outlier.process()

配置量化参数

quant_config=QuantConfig(a_bit=8,w_bit=8,disable_names=disable_names,dev_type='npu',dev_id=model.device.index,act_method=1,pr=1.0,w_sym=True,mm_tensor=False).fa_quant(fa_amp=0)
  • disatble_names:回退层
  • arc_method:激活值量化方法
    • 1 代表 min-max 量化方式
    • 2 代表 histogram 量化方式
    • 3 代表 min-max 和 histogram 的混合量化方式

执行并保存

alibrator=Calibrator(model, quant_config,calib_data=dataset_calib,disable_level='L0')calibrator.run()calibrator.save('/data/qwen2.5-72-w8a8',save_type=["safe_tensor"])

四、qwen2.5-72B w8a8 fa3量化代码样例

importjsonimporttorchimporttorch_npufromtransformersimportAutoTokenizer,AutoModelForCausalLMfrommodelslim.pytorch.llm_ptq.anti_outlierimportAntiOutlierConfig,AntiOutlierfrommodelslim.pytorch.llm_ptq.llm_ptq_toolsimportCalibrator,QuantConfigimportjsonlines SEQ_LEN_OUT=100batch_size=1# 如果使用npu进行量化需开启二进制编译,避免在线编译算子torch.npu.set_compile_mode(jit_compile=False)option={}option["NPU_FUZZY_COMPILE_BLACKLIST"]="ReduceProd"torch.npu.set_option(option)""" 原始模型加载 """model_path='/data/Qwen2.5-72B-Instruct/'model=AutoModelForCausalLM.from_pretrained(pretrained_model_name_or_path=model_path,torch_dtype=torch.bfloat16,trust_remote_code=True,device_map="auto",max_memory={0:"0GiB",1:"0GiB",2:"25GiB",3:"25GiB",4:"25GiB",5:"25GiB",6:"25GiB",7:"25GiB"}).eval()tokenizer=AutoTokenizer.from_pretrained(pretrained_model_name_or_path=model_path,trust_remote_code=True,device_map="auto",)tokenizer.pad_token=tokenizer.eos_token""" 获取校准数据 """defget_calib_dataset(tokenizer,calib_list,device=model.device):calib_dataset=[]forcalib_dataincalib_list:inputs=tokenizer(calib_data,return_tensors='pt')calib_dataset.append([inputs.data['input_ids'].to(device),inputs.data['attention_mask'].to(device)])returncalib_dataset entry="/dataset/boolq_lite/dev3.jsonl"withopen(entry,'r')asfile:calib_set=json.load(file)dataset_calib=get_calib_dataset(tokenizer,calib_set)""" 回退层设置 """disable_names=[]num_layers=80disable_idx_lst=list(range(num_layers))forlayer_indexindisable_idx_lst:down_proj_name="model.layers.{}.mlp.down_proj".format(layer_index)disable_names.append(down_proj_name)""" AntiOutlier:本模型无需设置离群抑制值精度即可达标 """""" 配置量化参数 """quant_config=QuantConfig(a_bit=8,w_bit=8,disable_names=disable_names,dev_type='npu',dev_id=model.device.index,act_method=1,pr=1.0,w_sym=True,mm_tensor=False).fa_quant(fa_amp=0)calibrator=Calibrator(model,quant_config,calib_data=dataset_calib,disable_level='L0')#disable_level设置为L0精度即可达标calibrator.run()calibrator.save('/data/qwen25-72-w8a8',save_type=["safe_tensor"])

五、常见问题

报错卡异常模型无法加载

max_memory={0:“0GiB”,1:“0GiB”,2:“25GiB”,3:“25GiB”,4:“25GiB”,5:“25GiB”,6:“25GiB”,7:“25GiB”}

800I A2,32G qwen2.5-72B量化最少使用六卡,使用四卡时报错如下图

注明:昇腾PAE案例库对本文写作亦有帮助。

http://www.jsqmd.com/news/135281/

相关文章:

  • 2025最新!专科生必看10个AI论文平台测评与推荐
  • 北京哪里能开病假条诊断证明
  • 还在纠结项目该用啥模型?GLM - 4.7、MiniMax - M2.1 上线 ,限免体验,基于API完成AI面试助手项目!
  • CSS 弹性盒子(Flexbox)综合实战与核心知识点测试
  • k8s双活架构图
  • 软工团队作业6--事后诸葛亮会议
  • 电力场景高清图片输电线路植被被覆盖检测数据集VOC+YOLO格式447张1类别
  • 【开题答辩全过程】以 基于SpringBoot的同城二手交易系统的设计与实现为例,包含答辩的问题和答案
  • 前端防范 XSS(跨站脚本攻击)
  • hbase调试环境
  • 别再苦熬整夜写论文了!7款免费AI工具,10分钟生成万字带真参考文献论文 - 麟书学长
  • 学长亲荐9个AI论文工具,MBA毕业论文轻松搞定!
  • 【课程设计/毕业设计】基于springboot+vue传统文化宣传系统基于springboot+vue的传统文化交流交易平台【附源码、数据库、万字文档】
  • 【开题答辩全过程】以 基于springboot的社区志愿者服务管理系统的设计与实现为例,包含答辩的问题和答案
  • Book Page
  • 上海哪里能开病假条诊断证明
  • 哪里可以代开病假条
  • Java毕设项目推荐-基于Springboot框架的企业合同管理系统设计与实现基于springboot的合同信息管理系统【附源码+文档,调试定制服务】
  • 量子安全加密实战指南:Python实现CRYSTALS-Kyber完整教程
  • 【开题答辩全过程】以 基于Springboot的图书管理系统为例,包含答辩的问题和答案
  • 【开题答辩全过程】以 基于Springboot的体检中心信息管理系统设计与实现为例,包含答辩的问题和答案
  • 记2025鹏城杯CTF线上赛部分题目
  • 【 常用AI应用集成第三方api的教程】dify配置教程
  • Java毕设项目推荐-基于SpringBoot+Vue的地方传统文化展示与交流平台的设计与实现基于springboot+vue的传统文化交流交易平台【附源码+文档,调试定制服务】
  • Java毕设项目:基于springboot+vue的传统文化交流交易平台(源码+文档,讲解、调试运行,定制等)
  • 2025最新!自考党必看!10个AI论文工具测评,哪款最能帮你写毕业论文?
  • 拒绝流水账!手把手教你用“沁言学术+DeepSeek”构建满分论文工作流
  • 2025最新!自考党必备10个AI论文平台测评与推荐
  • 2025年AI大模型将取代传统开发!30+程序员职业转型指南,抓住50K高薪风口!
  • FPGA与GPU通信:RDMA、PCIE实现方式