StableHLO'daki nicemleme türleri
Kuantizasyon, kayan noktalı sayıları (orijinal modellerde kullanılanlar gibi) daha düşük hassasiyetli tam sayılara dönüştürerek makine öğrenimi modellerini optimize etme tekniğidir. Bu, bellek kullanımını azaltır ve hesaplamaları hızlandırarak modelleri sınırlı kaynaklara sahip cihazlara dağıtmak için daha verimli hale getirir.
StableHLO nicemleme, LiteRT nicemleme spesifikasyonunu izler. Hem tensör başına hem de eksen başına nicemlemeyi destekleyen tek tip bir nicemleme şeması kullanılır. Tür ifadesini MLIR'nin Quant lehçesinden alır ve nicelenmiş veri türlerini temsil etmek için standartlaştırılmış bir yol sağlar.
Tekdüzen nicemleme, kayan nokta değerlerini tekdüzen bir adım boyutu kullanarak tam sayılara eşler. Bu da eşit aralıklı nicemlenmiş değerlerle sonuçlanır. Bu, iki temel nicelendirme parametresinin kullanıldığı bir afin ilişki aracılığıyla sağlanır.
Düzgün nicemleme, kayan noktalı sayıları eşit aralıklı tam sayılarla eşleyerek gösterimlerini basitleştirir. Bu eşleme, iki temel parametrenin (ölçek ve sıfır noktası) kullanıldığı bir afin dönüşümüyle gerçekleştirilir. Ölçek, ardışık nicelenmiş değerler arasındaki adım boyutunu belirler. Ölçek ne kadar küçük olursa nicelenmiş değerler birbirine o kadar yakın olur. Sıfır noktası, orijinal kayan noktalı alanda sıfırı temsil eden tam sayı değerini tanımlar.
Orijinal kayan nokta değeri (real_value) ile tekdüzen nicemlemede nicemlenmiş tam sayı değeri (quantized_value) arasındaki ilişki şöyledir:
real_value = scale * (quantized_value - zero_point)
Tensor başına nicemleme
Tensör başına nicemlemede, tensördeki tüm değerler için tek bir ölçek ve sıfır noktası kullanılır. Tensör başına kuantize edilmiş bir tür, StableHLO'da şu şekilde ifade edilir:
quant.uniform scale:zero_point> Örnek: !quant.uniform<i8:f32, 0.01:50>
Bu, 0.01 ölçeği ve 50 sıfır noktası kullanılarak 32 bit kayan noktalı sayıyı (f32) depolamak için kullanılan 8 bitlik bir tam sayıyı (i8) temsil eder.
Eksen başına nicemleme
Eksen başına nicemleme, tensör başına nicemlemeye kıyasla daha ayrıntılı bir yaklaşım sunar. Tüm tensör için tek bir ölçek ve sıfır noktası kullanmak yerine, eksen başına nicemleme, tensörün belirli bir boyutu quantized_dimension boyunca dilimlere ayrı ölçekler ve sıfır noktaları atar. Bu özellik, değerler farklı boyutlarda önemli ölçüde değiştiğinde özellikle yararlıdır. Bilgilerin daha iyi korunmasını ve doğruluğunu sağlar.
Boyutları [4, 3, 2] olan bir tensör t düşünün. Bu tensörü ikinci boyut boyunca nicelendirmeyi seçiyoruz (quantized_dimension = 1). Bu, her biri kendi ölçeğine ve sıfır noktasına sahip üç dilimimiz olacağı anlamına gelir (çünkü ikinci boyutun boyutu 3'tür):
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'da, eksen başına nicelenmiş tür şu şekilde ifade edilir:
quant.uniform {scale0:zero_point0, scale1:zero_point1, ...}> Burada scale:zero_point uzunluğu, kapsayan tensörün quantized_dimension boyunca dilim sayısıyla eşleşir.
Örnek: tensor<4x3x2x!quant.uniform<i8:f32:1, {0.2:20, 0.1:10, 0.3:30}>>
StableHLO'da nicemleme geçişleri
StableHLO, farklı dönüştürmelere ve nicemleme ile ilgili optimizasyonlara olanak tanıyan çeşitli derleyici geçişleri sağlar. Bu sayede, nicemlenmiş modelleri nasıl işleyeceğiniz konusunda esneklik elde edersiniz. Bu kartlar şunlardır:
stablehlo-legalize-qdq-to-quantized-op
Bu geçiş, nicelenmiş modellerdeki ortak bir kalıbı (bir niceliksizleştirme işlemi, ardından bir kayan nokta işlemi ve son olarak bir nicelendirme işlemi) tek bir nicelenmiş işlemde birleştirir. Ayrıntılar
stablehlo-legalize-quantized-op-to-qdq
Bu geçiş, önceki geçişin tam tersini yapar. Kuantize edilmiş bir işlemi, eşdeğer dekuantize, kayan nokta işlemi ve kuantize işlemleri dizisine ayırır. Ayrıntılar
stablehlo-legalize-quant-to-math
Bu geçiş, nicelenmiş türlerdeki StableHLO işlemlerini tam sayı türlerindeki eşdeğer işlemlere dönüştürür. Temel olarak, standart matematiksel işlemler kullanılarak nicel aritmetik uygulanır. Bu ayrıştırma, nicemleme aritmetiğini kullanarak nicemlenmiş modellerin semantiğini ifade edebilen ancak nicemlemeyi yerel olarak desteklemeyen sistemler için yararlıdır. Ayrıntılar
stablehlo-quant-legalize-to-tosa-rescale
StableHLO, nicelenmiş işlemleri TOSA lehçesindeki karşılık gelen temsillerine yasallaştırma olanağı sunar. Bu yasallaştırma, StableHLO ile TOSA arasında uyumluluğu ve birlikte çalışabilirliği kolaylaştırır. Bu geçiş, StableHLO nicelendirilmiş işlemleri stratejik olarak StableHLO ve TOSA işlemlerinin bir kombinasyonuna dönüştürür. TOSA lehçesi, öncelikle rescale işlemi için kullanılır. tosa.rescale işlemi, nicelenmiş değerlerin ölçeğini ve sıfır noktasını ayarlamada önemli bir rol oynar. Bu sayede, nicelenmiş verilerin TOSA çerçevesinde doğru şekilde gösterilmesi sağlanır.
Ayrıntılar
tosa-rescale-legalize-to-stablehlo
Bu geçiş, TOSA yeniden ölçeklendirme işlemlerini StableHLO temel matematik işlemlerine yeniden yazar. Bu geçişin temel kullanım alanlarından biri, StableHLO yorumlayıcısının TOSA yeniden ölçeklendirme işlemleri içeren programları değerlendirmesine izin vermektir. Ayrıntılar
Kuantize edilmiş programları değerlendirme
StableHLO referans yorumlayıcısı nicelendirilmiş işlemler içeren programları verimli bir şekilde yürütebilir. Bunu yapmak için önce programı yalnızca tam sayı işlemleri kullanarak eşdeğer bir temsile indirir. Bu düşürme işlemi, yorumlamadan önce programı dönüştüren bir dizi derleyici geçişini içerir.
Yorumlayıcı, nicelendirilmiş işlemleri karşılık gelen tam sayı aritmetik uygulamalarına dönüştürmek için stablehlo-legalize-quant-to-math geçişinden yararlanır. Bu geçiş, ölçekli çarpma/bölme ve sıfır noktası ekleme işlemlerini yönetmek için CHLO yayın işlemlerini kullanıma sunar. StableHLO yorumlayıcısıyla uyumluluğu sağlamak için bu CHLO işlemleri StableHLO işlemlerine dönüştürülür. Bu, şekille ilgili işlemleri kullanıma sunar. Bu işlemler, bir dizi standartlaştırma geçişi kullanılarak daha sonra standartlaştırılır ve optimize edilir.
Bu azaltma işleminde yer alan geçişlerin tam sırası şu şekildedir:
stablehlo-legalize-quant-to-math
chlo-legalize-to-stablehlo
canonicalize
shape-legalize-to-stablehlo
stablehlo-canonicalize-dynamism
Nicelendirilmiş Test Durumları
StableHLO, nicelenmiş işlemlerin doğruluğunu ve davranışını doğrulamak için kapsamlı bir nicelenmiş test senaryoları paketi sunar. Bu test durumları, birim testleri olarak işlev görür ve nicelendirilmiş senaryolarda çeşitli StableHLO işlemlerini kapsar.
Kuantize edilmiş bir test durumu örneği aşağıdaki gibidir:
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>
}
ve şunları içerir:
- Giriş verileri: İşlem için temsili giriş değerleri.
- Altın çıkış: StableHLO referans yorumlayıcısı ve HLO değerlendiricisi ile uyumlu olarak giriş verilerine uygulandığında işlemin beklenen çıkışı.
Bu test senaryoları şunlar için değerlidir:
- StableHLO nicemlemenin doğrulanması: StableHLO işlemlerinin nicemleme davranışının beklenen sonuçlarla uyumlu olmasını sağlar.
- Çapraz doğrulama: StableHLO nicemlemenin davranışını diğer uygulamalar veya çerçevelerle karşılaştırma.
- Hata ayıklama ve geliştirme: Yeni nicemleme özelliklerinin veya optimizasyonlarının geliştirilmesine ve hata ayıklanmasına yardımcı olur.