首页 > 科技周边 > 人工智能 > 神经网络重量量化

神经网络重量量化

Joseph Gordon-Levitt
发布: 2025-03-08 10:40:10
原创
695 人浏览过

在越来越大的语言模型和复杂的神经网络的时代,优化模型效率变得至关重要。重量量化是减少模型大小和提高推理速度而没有显着性能降解的关键技术。本指南提供了一种实践方法来实施和理解权重量化,以我们的实际例子为例。

学习目标

了解体重量化的基本原理及其在模型优化中的重要性。
    学习Absmax和零点量化技术之间的差异。
  • 使用Pytorch在GPT-2上实现权重量化方法。
  • 分析量化对记忆效率,推理速度和准确性的影响。
  • >使用直方图可视化量化的权重分布。
  • 通过文本生成和困惑度量评估模型绩效。
  • 探索在资源受限设备上部署模型的量化优势。>
  • >本文是

> > data Science Blogathon的一部分。 内容表 > >理解重量量化基本原理>实用实施 量化过程:权重和模型>

>可视化量化的权重分布

  • 体重量
  • 问题
  • 了解体重量化基本面
  • 重量量化将高精度的浮点重量(通常为32位)转换为低精度表示(通常是8位整数)。此过程大大降低了模型的大小和内存使用情况,同时试图保持模型性能。关键挑战在于保持模型精度,同时降低数值精度。
为什么要量化?

>

内存效率:

>将精度从32位降低到8位可以从理论上将模型尺寸降低75%

>
  • 更快的推理:整数操作通常比浮点操作更快
  • >
  • 降低功率消耗:减少内存带宽和更简单的计算导致能源节省
  • >部署灵活性:较小的模型可以在资源约束设备上部署 实施
  • >让我们深入实施两种流行的量化方法:ABSMAX量化和零点量化。 设置环境
  • 首先,我们将以必要的依赖关系来设置我们的开发环境:

>下面我们将考虑实施量化方法:

absmax量化

ABSMAX量化方法根据张量中的最大绝对值来缩放权重:

import seaborn as sns
import torch
import numpy as np
from transformers import AutoModelForCausalLM, AutoTokenizer
from copy import deepcopy
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import seaborn as sns
登录后复制
登录后复制

此方法作用:

  • 在重量张量
  • 中找到最大绝对值
  • >计算缩放因子以拟合INT8范围内的值
  • 缩放和四舍五入值
  • 提供量化和去除版本
键优点:

    简单实现
  • 良好保存大价值
  • 附近的对称量化
零点量化

零点量化增加了一个偏移,以更好地处理不对称分布:>

# Define quantization functions
def absmax_quantize(X):
    scale = 100 / torch.max(torch.abs(X))  # Adjusted scale
    X_quant = (scale * X).round()
    X_dequant = X_quant / scale
    return X_quant.to(torch.int8), X_dequant
登录后复制
登录后复制
输出:

这个方法:
def zeropoint_quantize(X):
    x_range = torch.max(X) - torch.min(X)
    x_range = 1 if x_range == 0 else x_range
    scale = 200 / x_range
    zeropoint = (-scale * torch.min(X) - 128).round()
    X_quant = torch.clip((X * scale + zeropoint).round(), -128, 127)
    X_dequant = (X_quant - zeropoint) / scale
    return X_quant.to(torch.int8), X_dequant
登录后复制

计算全范围的值
    >
  • 确定比例尺和零点参数
  • 应用缩放和移动
  • 剪辑值以确保int8 bunds
  • 好处:

更好地处理不对称分布
  • 改进的接近零值的表示
  • 通常会导致更好的总体准确性
  • >加载和准备模型

>让我们将这些量化方法应用于真实模型。我们将使用GPT-2作为我们的示例:

Using device: cuda
登录后复制
输出:

神经网络重量量化量化过程:权重和模型

探讨将量化技术应用于单个权重和整个模型。此步骤可确保降低内存使用和计算效率,同时保持性能。

可视化量化的重量分布

# Load model and tokenizer
model_id = 'gpt2'
model = AutoModelForCausalLM.from_pretrained(model_id).to(device)
tokenizer = AutoTokenizer.from_pretrained(model_id)

# Print model size
print(f"Model size: {model.get_memory_footprint():,} bytes")
登录后复制
>可视化并比较原始,Absmax量化和零点量化模型的重量分布。这些直方图提供了有关量化如何影响体重值及其整体分布的见解。

该代码包含一个综合的可视化功能:

# Quantize and visualize weights
weights_abs_quant, _ = absmax_quantize(weights)
weights_zp_quant, _ = zeropoint_quantize(weights)


# Quantize the entire model
model_abs = deepcopy(model)
model_zp = deepcopy(model)

for param in model_abs.parameters():
    _, dequantized = absmax_quantize(param.data)
    param.data = dequantized

for param in model_zp.parameters():
    _, dequantized = zeropoint_quantize(param.data)
    param.data = dequantized
登录后复制
>显示原始权重与Absmax重量

的图形

>显示原始权重与零点权重
    的图形
  • 输出:

神经网络重量量化

性能评估

评估量化对模型性能的影响对于确保效率和准确性至关重要。让我们来衡量与原始模型相比的量化模型的性能如何。神经网络重量量化>

>文本生成

>探索量化模型如何生成文本并将输出的质量与原始模型的预测进行比较。

import seaborn as sns
import torch
import numpy as np
from transformers import AutoModelForCausalLM, AutoTokenizer
from copy import deepcopy
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import seaborn as sns
登录后复制
登录后复制

此代码比较了三个模型的文本生成输出:原始模型,“ Absmax”量化模型和“ Zeropoint”量化模型。它使用generate_text函数根据输入提示进行生成文本,应用带有30的TOP-K值的采样。最后,它打印了所有三个模型的结果。>

输出:

神经网络重量量化

# Define quantization functions
def absmax_quantize(X):
    scale = 100 / torch.max(torch.abs(X))  # Adjusted scale
    X_quant = (scale * X).round()
    X_dequant = X_quant / scale
    return X_quant.to(torch.int8), X_dequant
登录后复制
登录后复制
代码使用三个模型计算给定输入的混淆性(衡量模型预测文本的能力):原始“ Absmax”量化和“ Zeropoint”量化模型。较低的困惑表明表现更好。它打印了困惑得分以进行比较。

>

输出:

神经网络重量量化

>您可以在此处访问Colab链接。

体重量化的优势

>下面我们将研究重量量化的优势:

内存效率:
    量化可将模型大小降低75%,从而更快地加载和推理。
  • 更快的推理:>
  • >
  • 降低功率消耗:减少内存带宽和简化的计算导致节省能源,对于边缘设备和移动部署至关重要。>
  • >
  • >部署灵活性:较小的模型更容易在具有有限资源的硬件上部署(例如,手机,嵌入式设备)。 >>最小的性能降解:
  • 具有正确的量化策略,尽管精确度降低,但模型仍可以保留其大部分精度。
  • > 结论
  • 重量量化在提高大语言模型的效率方面起着至关重要的作用,尤其是在将它们部署在资源约束设备上时。通过将高精度权重转换为较低精确的整数表示,我们可以显着降低内存使用情况,提高推理速度和降低功耗,而不会严重影响模型的性能。 在本指南中,我们探索了两种流行的量化技术(ABSMAX量化和零点量化),将GPT-2作为一个实际示例。两种技术都表明了减少模型的内存足迹和计算要求的能力,同时保持文本生成任务的准确性很高。但是,零点量化方法及其不对称方法通常可以更好地保存模型的准确性,尤其是对于非对称重量分布。

    钥匙要点

    • ABSMAX量化更简单,并且适用于对称重量分布,尽管它可能无法像零点量化那样有效地捕获不对称分布。 通过引入不对称分布的偏移,
    • 零点量化提供了一种更灵活的方法,通常会导致更好的准确性和更有效的权重表示。
    • >量化对于在计算资源受到限制的实时应用程序中部署大型模型至关重要。 尽管量化过程降低了精度,但仍可以通过适当的调整和量化策略保持模型性能。>
    • 可视化技术(例如直方图)可以提供有关量化如何影响模型权重和张量中值分布的见解。
    • 常见问题
    • > Q1。什么是重量量化?
    a。权重量化可降低模型的权重的精度,通常从32位浮点值到较低精确的整数(例如8位整数),以节省内存和计算,同时保持性能。权重量化如何影响模型性能?虽然量化减少了模型的内存足迹和推理时间,但它可能导致准确性略有降解。但是,如果正确完成,准确性的损失最小。可以将量化应用于任何模型吗?是的,量化可以应用于任何神经网络模型,包括语言模型,视觉模型和其他深度学习体系结构。我如何在模型中实现权重量化?您可以通过创建功能来扩展和围绕模型的权重来实现量化,然后将它们应用于所有参数。像Pytorch这样的图书馆为某些量化技术提供了本机支持,尽管指南中所示的自定义实现提供了灵活性。量化适用于所有类型的模型?重量量化对于减少内存足迹和计算至关重要的大型模型最有效。但是,非常小的模型可能不会从量化中受益那么多。

    >

    >本文所示的媒体不归Analytics Vidhya拥有,并由作者的酌情决定使用。

以上是神经网络重量量化的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板