Transformers 文件

貢獻

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

貢獻

Transformers 支援多種量化方法,例如 QLoRA、GPTQ、LLM.int8 和 AWQ。然而,仍有許多量化方法尚未整合。為了更輕鬆地將這些量化方法新增到 Transformers 中並使用它們,請使用 HfQuantizer 類。HfQuantizer 被設計為用於新增量化方法的內部幫助類,而不是應用於每個 PyTorch 模組的類。

本指南將向您展示如何使用 HfQuantizer 整合新的量化方法。

要求

在將新的量化方法整合到 Transformers 中之前,請確保該方法滿足以下要求。僅支援可與 PyTorch 模組一起執行的量化方法。

  • 量化方法可透過可 pip 安裝的 Python 包提供(如果只能從原始碼安裝包,也可以)。理想情況下,預編譯的核心應包含在 pip 包中。

  • 該方法可以在常用硬體(CPU、GPU 等)上執行。

  • 該方法被封裝在 nn.Module~bitsandbytes.nn.Linear8bitLt~bitsandbytes.nn.Linear4bit)中,量化線性層應具有以下定義。

    class Linear4bit(nn.Module):
        def __init__(self, ...):
            ...
        
        def forward(self, x):
            return my_4bit_kernel(x, self.weight, self.bias)

    透過這種方式,透過用目標類替換 nn.Linear 的例項,可以輕鬆地對 Transformers 模型進行量化。

  • 量化方法應該是可序列化的。您可以將量化權重儲存在本地或推送到 Hub。

  • 確保包含量化核心/原語的包是穩定的(沒有頻繁的破壞性更改)。

某些量化方法可能需要透過資料校準(AWQ)“預量化”模型。在這種情況下,我們傾向於僅在 Transformers 中支援推理,並讓 ML 社群維護的第三方庫處理模型量化本身。

建立新的 HFQuantizer 類

  1. src/transformers/utils/quantization_config.py 中建立一個新的量化配置類。將新的量化配置新增到 Transformers 的 src/transformers/init.py 檔案中的 _import_structure 中。

  2. src/transformers/quantizers/ 中建立一個名為 quantizer_your_method.py 的新檔案,並使其繼承自 [`~quantizers.HfQuantizer]。確保將新的量化器和量化配置新增到 src/transformers/quantizers/auto.py 中的量化自動對映中。

  3. 為您的量化方法定義以下類屬性和屬性方法。

    • requires_calibration:量化方法是否需要資料校準過程。如果設定為 True,則只能支援推理(帶量化權重),而不能支援推理和量化。
    • required_packages:使用量化權重所需的包的字串列表。您可能需要定義一些新的實用方法,例如 transformers/src/utils/import_utils.py 中的 is_auto_awq_available
    • requires_parameters_quantization:僅當您的量化方法需要額外關注底層 nn.Parameter 物件時才需要。例如,bitsandbytes 使用 ~bitsandbytes.nn.Params4bit~bitsandbytes.nn.Int8Params,這在量化模型時需要額外關注。大多數最近的量化方法將 int2 和 int4 權重打包到 torch.uint8 權重中,因此此標誌實際上不應需要(預設為 False)。
    • is_serializable:確定方法是否可序列化的屬性方法。
    • is_trainable:確定您是否可以在量化方法之上微調模型(有或沒有 PEFT 方法)的屬性方法。
  4. 編寫 validate_environmentupdate_torch_dtype 方法。這些方法在建立量化模型之前呼叫,以確保使用者使用正確的配置。請參閱其他量化器以獲取其實現示例。

  5. 編寫 _process_model_before_weight_loading 方法。在 Transformers 中,量化模型首先在 "meta" 裝置上初始化,然後載入權重。這意味著 _process_model_before_weight_loading 方法負責操作模型骨架以將某些模組(nn.Linear)替換為目標模組(量化模組)。

    您可以透過在 transformers/src/integrations/ 中建立新檔案並公開該資料夾的 __init__.py 檔案中的相關方法來定義模組替換邏輯或任何其他實用方法。最好的起點是檢視其他量化方法,例如 quantizer_awq.py

  6. 編寫 _process_model_after_weight_loading 方法。此方法允許實現需要在載入權重後操作模型的附加功能。

  7. 記錄所有內容!透過在 docs/source/en/quantization 下新增新檔案來確保您的量化方法已記錄在案。

  8. 您應該透過在 docker/transformers-quantization-latest-gpu 中的 nightly Dockerfile 中新增包,然後將新測試檔案新增到 tests/quantization/xxx 來新增測試。請隨意檢視現有的量化方法以瞭解其實現方式。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.