VHLO Diyalekti

VHLO Lehçesi nedir?

VHLO (Sürümlü StableHLO) Dilek, serileştirme ve kararlılık için kullanılır. Bağımsız program öğeleri için sürüm oluşturarak belirli bir noktada StableHLO diyalektinin anlık görüntüsünü sağlar.

VHLO, sürümü olan işlemler, türler ve özelliklere sahip yalnızca eklenemeyen bir diyalekttir. Diğer bir deyişle, bir özellik lehçeye eklendikten sonra anlamları etkileyecek şekilde hiçbir şekilde değiştirilemez.

Bir işlem, tür veya özellikte yapılan değişiklikler için lehçeye yeni bir sürüm eklenmesi gerekir. Örneğin, varsayıma dayalı bir my_op, 0.9.0'da StableHLO'ya eklendiyse ancak 0.11.0'da değiştirildiyse VHLO'da şöyle olur:

// This represents the StableHLO version of the op from 0.9.0 -> 0.10.0
// Both the lower and the upper bound of versions are inclusive
def VHLO_MyOpV1 : VHLO_Op<"my_op_v1", "0.9.0", "0.10.0"> {
  let arguments = (ins
    VHLO_AnyType:$operand
  );
  let results = (outs VHLO_AnyType:$result);
}

// This represents the StableHLO version of the op from 0.11.0 -> current
def VHLO_MyOpV2 : VHLO_Op<"my_op_v2", "0.11.0", "current"> {
  let arguments = (ins
    VHLO_AnyType:$operand,
    VHLO_AnyAttr:$attr  // New attribute added to StableHLO in 0.11.0
  );
  let results = (outs VHLO_AnyType:$result);
}

StableHLO dili yalnızca işlemlerin en son sürümüne sahiptir. Çalışan örnekte, v0.11.0'daki StableHLO diyalekti yalnızca operand ve attr değerlerine sahip StableHLO_MyOp içerirken VHLO, operasyonun evriminin her aşamasını yakalar.

VHLO neden yararlıdır?

Sürümlü bir diyalektin olması, StableHLO operatörünün önceki sürümlerini hedeflememize olanak tanır. Bu, VHLO diyalektindeki işlemler arasındaki dönüşümlerde ileriye ve geriye dönük uyumluluğu kapsar.

İleriye dönük uyumluluk: İleriye dönük uyumluluk, VHLO'ya dönüştürülüp işlemlerin hedef sürüme yükseltilmesiyle sağlanır. Bir VHLO programındaki her işlem/tür/attr hedefi hedef sürüme indirilebiliyorsa VHLO, o sırada işlemin anlık görüntüsüne sahip olduğundan, hedef sürümden daha büyük veya eşit bir sürüm çalıştıran bir tüketicide seri durumdan çıkarılabilir ve StableHLO'ya dönüştürülebilir olması garanti edilir.

İleriye dönük uyumluluk resmi

İşlemin önceki sürümünde bulunmayan işlemler veya özellikler kullanılırsa bu eski sürüme geçiş işlemi başarısız olur. Bu, ileriye dönük uyumluluğun çalışma zamanında değil, yapımcıda keşfedildiği anlamına gelir.

Geriye dönük uyumluluk: VHLO işlemlerinin en son sürümlerine yükseltilmesi (gerekirse) ve ardından bir op'un tekrar StableHLO'ya dönüştürülmesiyle geriye dönük uyumluluk sağlanır. Uyumluluk aralığındaki tüm VHLO programları StableHLO'ya yükseltilebilir. Diğer bir deyişle, tüketicilerin farklı sürümleri önceki bir sürümden aynı VHLO yükünü seri durumdan çıkarabilir.

Geriye dönük uyumluluk görüntüsü

Daha da önemlisi, VHLO, serileştirmenin arkasında soyutlanır. Bu, ML çerçevelerinin (üreticilerin) yalnızca StableHLO işlemlerini hedeflemesi gerektiği, derleyici arka uçlarının (tüketiciler) ise yalnızca SttableHLO işlem kümesi olan en son sürümü desteklemesi gerektiği anlamına gelir. VHLO'ya gelen ve VHLO'dan alınan dönüşümler, StableHLO deposundaki makinelerle gerçekleştirilir.

MLIR Bayt Kodu Biçim Sürümleri

İleriye dönük uyumluluğu sağlamak için StableHLO sürümleri, ilişkili bir MLIR Bayte Kodu Biçimi sürümüne sahiptir. Ayrıca StableHLO'nun en son sürümü, MLIR Bayt Kodu Biçimi'nin en son sürümünü kullanır. MLIR Bayt Kodu Biçimi sürümü artırıldığında, StableHLO'nun bir sonraki sürümü alt sürümü artırır ve Version.cpp dosyasını en son MLIR Bayt Kodu Biçimi sürümünü kullanacak şekilde günceller.

MLIR Bayt Kodu Biçimi ve bu biçimi StableHLO'da kullanma gerekçesi hakkında ayrıntılı bilgi için bytecode.md adresine bakın.

Uyumsuz Değişikliklere Katkıda Bulunma

Uyumluluk etkileri olan tüm değişiklikler RFC işleminden geçmelidir. Buna özellik eklemek, kullanımdan kaldırmak veya yeniden adlandırmak da dahildir. RFC onaylandıktan sonra katkıda bulunmayla ilgili bazı yönergeler aşağıda verilmiştir:

Version.h'de Sürüm Numarasını artırın

VHLO işlemlerini, özelliklerini, türlerini veya dönüşümlerini güncellemeden önce Version.h dosyasında alt sürüm numarasını artırın. Eklenen tüm yeni VHLO özellikleri bu hızlandırılmış sürümü kullanır. Örneğin, 0.10.0 --> 0.11.0 dokunulduktan sonra VhloOps.td'daki yeni bir işlem şunları kullanır:

VHLO_Op<"abs_v2", "0.11.0", "current">

Gerekli VHLO Uygulamasını ve Dönüşümleri Ekleyin

Yeni bir özelliği entegre etmek için gereken kod değişiklik gösterir ancak büyük oranda aşağıdakilerin değiştirilmesi gerekir:

Uyumlulukla ilgili gönderimlere kısa süre önce örnek olarak iki FP8 türünün eklenmesi ve bunların #1379 öğesinde VHLO'ya uygulanması gösterilebilir.

Birim Testleri Ekleme / Güncelleme

Uyumsuz bir değişikliğe katkıda bulunan kişi, özelliğin hem pozitif hem de negatif birim testlerinden ve uyumluluk birim testlerinden sorumludur.

Uyumluluk birimi testi, StableHLO gidiş dönüş seyahatlerinin VHLO'nun en son sürümüyle yapılması ve gerekli olan ek ileriye veya geriye dönük uyumluluk testlerinin sağlanması için stablehlo_legalize_to_vhlo.mlir dosyasının güncellenmesini içerir.

Birkaç örnek:

Sürümlü Serileştirme Testi Ekle

stablehlo_legalize_to_vhlo.mlir için bir test noktası ekledikten sonra, aşağıda gösterildiği gibi stablehlo_legalize_to_vhlo.0_X_0.mlir adlı dosyanın sürümü oluşturulmuş bir kopyasını ve söz konusu dosyanın bir .0_X_0.mlir.bc uzantısına sahip bayt kodlu sürümünü oluşturun. İleri ve geriye dönük uyumluluk testi için uygun FileCheck satırlarını ekleyin.

$ export TARGET_VERSION=0.X.0
$ export TARGET_FILENAME=${TARGET_VERSION//./_}
$ cp stablehlo/tests/stablehlo_legalize_to_vhlo.mlir stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir
$ build/bin/stablehlo-translate --serialize --target=$TARGET_VERSION --strip-debuginfo stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir > stablehlo/tests/stablehlo_legalize_to_vhlo.$TARGET_FILENAME.mlir.bc

# Replace RUN commands in stablehlo/tests/stablehlo_legalize_to_vhlo.0_X_0.mlir with the following for 0.X.0:
// RUN: stablehlo-opt --mlir-print-op-generic %s.bc | FileCheck %s
// RUN: stablehlo-translate --deserialize %s.bc | stablehlo-translate --serialize --target=0.X.0 | stablehlo-opt --mlir-print-op-generic | FileCheck %s
// RUN: diff <(stablehlo-translate --deserialize %s.bc | stablehlo-opt) <(stablehlo-opt --strip-debuginfo %s)
// RUN: diff %s.bc <(stablehlo-translate --serialize --target=0.X.0 --strip-debuginfo %s)

#1430 bölümündeki sürüm oluşturulmuş test örneği.