首頁 > 科技週邊 > 人工智慧 > 神經網絡重量量化

神經網絡重量量化

Joseph Gordon-Levitt
發布: 2025-03-08 10:40:10
原創
694 人瀏覽過

在越來越大的語言模型和復雜的神經網絡的時代,優化模型效率變得至關重要。重量量化是減少模型大小和提高推理速度而沒有顯著性能降解的關鍵技術。本指南提供了一種實踐方法來實施和理解權重量化,以我們的實際例子為例。

學習目標

了解體重量化的基本原理及其在模型優化中的重要性。
    學習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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板