XLA İşleminin Yapısı
Örnek bir HLO'yu inceleyelim:
add.936 = bf16[8,1,1280,16384]{3,2,0,1:T(8,128)(2,1)}
add(exponential.183, broadcast.3115)
Bu, aşağıdaki bileşenlerden oluşur:
- İşlem Adı:
add.936- Bu, işlemin benzersiz adıdır.
- Şekil:
bf16[8,1,1280,16384]- Bu, Op'nin çıkış şeklidir. Burada dtype, bf16 ve şekil
[8,1,1280,16384]'dir.
- Bu, Op'nin çıkış şeklidir. Burada dtype, bf16 ve şekil
- Düzen (döşeme ile):
3,2,0,1:T(8,128)(2,1)- Bu, dizinin bellekte nasıl depolandığını açıklar.
3,2,0,1, bellekteki eksenlerin sırasını (ör.sütun öncelikli, satır öncelikli vb.) belirtir.T(8,128)(2,1)ise kullanılan döşeme ve dolguyu belirtir. - Düzen isteğe bağlıdır. Belirtilmezse döşeme yapılmaz ve boyutların en büyükten en küçüğe doğru sıralandığı varsayılır.
- Bu, dizinin bellekte nasıl depolandığını açıklar.
- İşlem:
add- Gerçekleştirilen işlem. Burada, Op adında da belirtilen Add (Ekle) değeri kullanılır.
- Arguments:
exponential.183,broadcast.3115- Bu işlem, benzersiz adlarıyla belirtilen iki bağımsız değişken alır.
Şimdi de bir füzyon işlemi örneğini inceleyelim:
%fusion.3 = bf16[32,32,4096]{2,1,0:T(8,128)(2,1)S(1)}
fusion(bf16[32,32,8192]{2,1,0:T(8,128)(2,1)S(1)} %fusion.32),
kind=kCustom, calls=%all-reduce-scatter.3
Daha önce açıklanan bileşenlere ek olarak şunlardan oluşur:
- Özellikler:
kindvecalls- Bu parametreler, gerçekleştirilen işlem (bu örnekte birleştirme) hakkında daha fazla bilgi sağlar.
- Bellek konumu (bellek alanı tanımlayıcısı):
S(1)- Bu, dizinin depolandığı bellek alanını/konumunu gösterir.
S(1)burada, bu dizinin VMEM'de (TPU'da) bulunduğunu gösterir.
- Bu, dizinin depolandığı bellek alanını/konumunu gösterir.
%fusion.32giriş bağımsız değişkeninin şekil ve düzen ayrıntıları
Aşağıdaki bölümlerde Şekiller, Düzen ve Bellek Alanı Tanımlayıcıları açıklanmaktadır. Döşeme hakkında daha fazla bilgiyi Döşeme Düzeni başlıklı makalede bulabilirsiniz.
Şekiller
XLA ShapeProto proto
(xla_data.proto)
N boyutlu bir dizinin (kısaca dizi) boyut sayısını, boyutunu ve veri türünü açıklar.
Terminoloji, notasyon ve kurallar
Bir dizinin gerçek boyut sayısı, boyutu 1'den büyük olan boyutların sayısıdır.
Boyutlar,
Nboyutlu bir dizi için0ileN-1arasında numaralandırılır. Bir boyutun boyutu, negatif olmayan bir tam sayıdır. Özellikle 0 boyutu geçerlidir. Boyut numaraları, kolaylık sağlamak için rastgele etiketlerdir. Bu boyut numaralarının sırası, şeklin düzeninde belirli bir küçük/büyük sıralama anlamına gelmez. Düzen,LayoutProtoproto'su tarafından belirlenir.Boyutlar, boyut numarasına göre artan düzende listelenir. Örneğin,
[A x B x C]boyutunda 3 boyutlu bir dizi için boyut 0'ın boyutuA, boyut 1'in boyutuBve boyut 2'nin boyutuC'tür.XLA'daki bazı yardımcı programlar, Python benzeri negatif indekslemeyi de destekler: Boyut -1, son boyuttur (
Nboyutlu bir dizi içinN-1'ya eşdeğerdir). Örneğin, yukarıda açıklanan 3 boyutlu dizi için -1 boyutuCboyutuna, -2 boyutuBboyutuna sahiptir.İki, üç ve dört boyutlu dizilerde genellikle boyutlarla ilişkili belirli harfler bulunur. Örneğin, 2 boyutlu bir dizi için:
- 0. boyut:
y - 1. boyut:
x
3D dizi için:
- 0. boyut:
z - 1. boyut:
y - 2. boyut:
x
4 boyutlu bir dizi için:
- 0. boyut:
p - 1. boyut:
z - 2. boyut:
y - 3. boyut:
x
- 0. boyut:
XLA API'deki boyut alan işlevler, boyut numarası artan sırada çalışır. Bu, boyutlar
initializer_listolarak iletilirken kullanılan sıralamayla eşleşir. Örneğin:ShapeUtil::MakeShape(F32, {A, B, C, D})boyut dizisi
[A, B, C, D]olan bir şekil oluşturur.
Düzen
LayoutProto proto'su, bir dizinin bellekte nasıl temsil edildiğini açıklar. Aşağıdaki alanları içerir:
message LayoutProto {
repeated int64 minor_to_major;
int64 tail_padding_alignment_in_elements;
...
}
Küçükten büyüğe boyut sıralaması
Tek zorunlu alan minor_to_major'dır. Bu alan, bir şekil içindeki boyutların küçükten büyüğe sıralanmasını açıklar. minor_to_major içindeki değerler, dizinin boyutlarının sıralamasıdır (N boyutlu bir dizi için 0 ile N-1 arasında). İlk değer en küçük boyuttan başlayıp son değer olan en büyük boyuta kadar devam eder. En küçük boyut, doğrusal bellekte düzenlenmiş dizinin öğeleri arasında ilerlerken en hızlı değişen boyuttur.
Örneğin, [2 x 3] boyutundaki aşağıdaki 2 boyutlu diziyi ele alalım:
a b c
d e f
Burada 0 boyutu 2, 1 boyutu ise 3'tür. Düzendeki minor_to_major alanı [0, 1] ise 0 boyutu en küçük boyut, 1 boyutu ise en büyük boyuttur. Bu, doğrusal bellekteki aşağıdaki düzene karşılık gelir:
a d b e c f
0 ile N-1 arasındaki bu küçükten büyüğe boyut sırası, sütun öncelikli
(2 boyutlu diziler için) sıraya benzer. Boyutların monoton bir şekilde sıralandığını varsayarsak bu düzenden kodda "dim 0 is minor" (0. boyut küçük) şeklinde de bahsedebiliriz.
Öte yandan, düzendeki minor_to_major alanı [1, 0] ise doğrusal bellekteki düzen şu şekildedir:
a b c d e f
N boyutlu bir dizide N-1 ile 0 arasında değişen küçükten büyüğe boyut sırası, satır öncelikli (2 boyutlu diziler için) sıraya benzer. Boyutların monoton bir şekilde sıralandığını varsayarsak bu düzene kodda "0. boyut ana boyuttur" şeklinde de atıfta bulunabiliriz.
Varsayılan olarak küçükten büyüğe sıralama
Yeni oluşturulan şekillerin varsayılan düzeni "boyut sırası büyükten küçüğe" şeklindedir (ör. [N-1, ..., 0]).
Dolgu
tail_padding_alignment_in_elements alanı, döşeli dizinin öğe sayısı açısından hizalamasını tanımlar. Döşeme uygulandıktan sonra, toplam öğe sayısı bu değerin katı olana kadar düzenin sonuna doldurulmuş öğeler eklenir.
Dizilere dizin oluşturma
index_util.h dosyasındaki IndexUtil sınıfı, şekil ve düzen verildiğinde çok boyutlu dizinler ile doğrusal dizinler arasında dönüştürme için yardımcı programlar sağlar. Çok boyutlu dizinler, her boyut için bir int64 dizini içerir. Doğrusal dizinler, diziyi tutan arabellekte dizin oluşturmak için kullanılan tek bir int64 değeridir. Şekillerin ve düzenlerin oluşturulmasını ve değiştirilmesini kolaylaştıran yardımcı programlar için aynı dizindeki shape_util.h ve layout_util.h bölümlerine bakın.
Bellek alanı tanımlayıcıları
HLO'da her dizi, S(n) olarak yazılan bir bellek alanı tanımlayıcısıyla açıklama eklenmiş olabilir.
S(0)(genellikle atlanır), cihazın yüksek bant genişlikli belleğini (HBM) ifade eder.S(1), cihazdaki sanal belleği (VMEM) temsil eder.S(2),S(3)vb., cihaza özel ek bellek alanlarına karşılık gelir.S(5), ana makine belleğini gösterir.