Transformers 文件
貢獻
並獲得增強的文件體驗
開始使用
貢獻
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 類
在 src/transformers/utils/quantization_config.py 中建立一個新的量化配置類。將新的量化配置新增到 Transformers 的 src/transformers/init.py 檔案中的 _import_structure 中。
在 src/transformers/quantizers/ 中建立一個名為
quantizer_your_method.py
的新檔案,並使其繼承自 [`~quantizers.HfQuantizer]。確保將新的量化器和量化配置新增到 src/transformers/quantizers/auto.py 中的量化自動對映中。為您的量化方法定義以下類屬性和屬性方法。
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 方法)的屬性方法。
編寫
validate_environment
和update_torch_dtype
方法。這些方法在建立量化模型之前呼叫,以確保使用者使用正確的配置。請參閱其他量化器以獲取其實現示例。編寫
_process_model_before_weight_loading
方法。在 Transformers 中,量化模型首先在"meta"
裝置上初始化,然後載入權重。這意味著_process_model_before_weight_loading
方法負責操作模型骨架以將某些模組(nn.Linear)替換為目標模組(量化模組)。您可以透過在 transformers/src/integrations/ 中建立新檔案並公開該資料夾的
__init__.py
檔案中的相關方法來定義模組替換邏輯或任何其他實用方法。最好的起點是檢視其他量化方法,例如 quantizer_awq.py。編寫
_process_model_after_weight_loading
方法。此方法允許實現需要在載入權重後操作模型的附加功能。記錄所有內容!透過在
docs/source/en/quantization
下新增新檔案來確保您的量化方法已記錄在案。您應該透過在
docker/transformers-quantization-latest-gpu
中的 nightly Dockerfile 中新增包,然後將新測試檔案新增到tests/quantization/xxx
來新增測試。請隨意檢視現有的量化方法以瞭解其實現方式。