StableHLO 中的量化類型
量化技術可將浮點數 (例如原始模型中使用的數字) 轉換為較低精確度的整數,藉此最佳化機器學習模型。這項技術可減少記憶體用量並加快運算速度,讓模型更有效率地部署在資源有限的裝置上。
StableHLO 量化作業遵循 LiteRT 量化規格,採用統一的量化配置,支援張量和軸的量化作業。它會從 MLIR 的 Quant 方言繼承型別運算式,提供標準化的方式來表示量化資料型別。
均勻量化會使用均勻步階大小,將浮點值對應至整數,產生間隔均勻的量化值。這是透過仿射關係,使用兩個重要量化參數達成。
均勻量化會將浮點數對應至間隔均勻的整數,藉此簡化浮點數的表示方式。這項對應作業是透過仿射轉換完成,並使用兩個重要參數:比例和零點。比例尺會決定連續量化值之間的步階大小。縮放比例越小,量化值越接近。零點定義整數值,代表原始浮點空間中的零。
在均勻量化中,原始浮點值 (real_value) 與量化整數值 (quantized_value) 之間的關係如下:
real_value = scale * (quantized_value - zero_point)
每個張量的量化
在每個張量量化中,張量內的所有值都會使用單一比例和零點。每個張量的量化型別在 StableHLO 中表示為:
quant.uniform scale:zero_point> 範例:!quant.uniform<i8:f32, 0.01:50>
這代表用來儲存 32 位元浮點數 (f32) 的 8 位元整數 (i8),使用的比例為 0.01,零點為 50。
依軸量化
相較於張量量化,軸量化提供更精細的方法。與其為整個張量使用單一比例和零點,不如為張量的特定維度 quantized_dimension 沿線的切片指派個別比例和零點。如果不同維度的值差異很大,這項功能就特別實用,可更妥善地保留資訊並提高準確度。
假設張量 t 的維度大小為 [4, 3, 2]。我們選擇沿著第二個維度 (quantized_dimension = 1) 量化這個張量。這表示我們會有三個切片 (因為第二個維度的大小為 3),每個切片都有自己的比例和零點:
t[:, 0, :]: This slice gets scale[0] and zero_point[0].
t[:, 1, :]: This slice gets scale[1] and zero_point[1].
t[:, 2, :]: This slice gets scale[2] and zero_point[2].
在 StableHLO 中,每個軸的量化型別表示方式如下:
quant.uniform {scale0:zero_point0, scale1:zero_point1, ...}> 其中 scale:zero_point 的長度與所含張量 quantized_dimension 的切片數相符。
示例:tensor<4x3x2x!quant.uniform<i8:f32:1, {0.2:20, 0.1:10, 0.3:30}>>
StableHLO 中的量化傳遞
StableHLO 提供多個編譯器傳遞,可進行與量化相關的不同轉換和最佳化,讓您彈性處理量化模型。這些票證包括:
stablehlo-legalize-qdq-to-quantized-op
這個階段會將量化模型中的常見模式 (先是去量化運算,接著是浮點運算,最後是量化運算) 融合為單一量化運算。詳細資料
stablehlo-legalize-quantized-op-to-qdq
這個階段與上一個階段相反。它會將量化作業分解為等效的取消量化、浮點運算和量化作業序列。詳細資料
stablehlo-legalize-quant-to-math
這個階段會將量化型別的 StableHLO 作業,轉換為整數型別的對等作業。這項作業基本上是使用標準數學運算,實作量化算術。如果系統不支援原生量化,但仍可使用量化算術表示量化模型的語意,這種分解方式就很有用。詳細資料
stablehlo-quant-legalize-to-tosa-rescale
StableHLO 可將量化作業合法化,並轉換為 TOSA 方言中的對應表示法。這項合法化作業有助於 StableHLO 和 TOSA 之間的相容性和互通性。這個階段會策略性地將 StableHLO 量化作業轉換為 StableHLO 和 TOSA 作業的組合,其中 TOSA 方言主要用於 rescale 作業。tosa.rescale op 在調整量化值的比例和零點方面扮演重要角色,可確保量化資料在 TOSA 架構中準確呈現。
詳細資料
tosa-rescale-legalize-to-stablehlo
這個階段會將 TOSA 重新縮放作業重寫為 StableHLO 原始數學作業。這項傳遞的主要用途之一,是讓 StableHLO 解譯器評估含有 TOSA 重新縮放作業的程式。詳細資料
評估量化程式
StableHLO 參考解譯器可有效執行含有量化作業的程式。為達成這個目標,編譯器會先將程式降級為僅使用整數運算的等效表示法。這個降低程序涉及一系列編譯器傳遞,可在解譯前轉換程式。
基本上,解譯器會利用 stablehlo-legalize-quant-to-math 傳遞,將量化作業轉換為對應的整數算術實作項目。這個傳遞會導入 CHLO 廣播作業,用於處理比例乘法/除法和零點加法。為確保與 StableHLO 解譯器相容,這些 CHLO 作業隨後會合法化為 StableHLO 作業。這會導入形狀相關作業,後續會使用一系列正規化傳遞作業,將這些作業正規化並進行最佳化。
這個降低程序涉及的完整傳遞順序如下:
stablehlo-legalize-quant-to-math
chlo-legalize-to-stablehlo
canonicalize
shape-legalize-to-stablehlo
stablehlo-canonicalize-dynamism
量化測試案例
StableHLO 提供完整的量化測試案例套件,可驗證量化作業的正確性和行為。這些測試案例會做為單元測試,涵蓋量化情境中的各種 StableHLO 作業。
量化測試案例的典型範例如下:
func.func @main() -> tensor<11xf32> {
%operand_0 = stablehlo.constant dense<...> : tensor<11xf32>
%operand_1 = stablehlo.constant dense<...> : tensor<11xf32>
%golden = stablehlo.constant dense<...> : tensor<11xf32>
%0 = stablehlo.uniform_quantize %operand_0 : (tensor<11xf32>) -> tensor<11x!quant.uniform<i8:f32, 0.3>>
%1 = stablehlo.uniform_quantize %operand_1 : (tensor<11xf32>) -> tensor<11x!quant.uniform<i8:f32, 0.3>>
%2 = stablehlo.add %1, %0 : tensor<11x!quant.uniform<i8:f32, 0.3>>
%result = stablehlo.uniform_dequantize %2 : (tensor<11x!quant.uniform<i8:f32, 0.3>>) -> tensor<11xf32>
%4 = stablehlo.custom_call @check.eq(%golden, %result) : (tensor<11xf32>, tensor<11xf32>) -> tensor<i1>
return %3 : tensor<11xf32>
}
包括:
- 輸入資料:作業的代表性輸入值。
- 黃金輸出:套用至輸入資料時,作業的預期輸出內容應符合 StableHLO 參考解譯器和 HLO 評估器。
這些測試案例有助於:
- 驗證 StableHLO 量化:確保 StableHLO 作業的量化行為符合預期結果。
- 交叉驗證:比較 StableHLO 量化與其他實作項目或架構的行為。
- 偵錯和開發:協助開發及偵錯新的量化功能或最佳化項目。