Bu kılavuz, XLA'nın donanımlarını verimli bir şekilde hedefleyen programların çıktısını almasını isteyen sistem mühendisleri içindir. Kılavuz adım adım değildir ve LLVM , Bazel ve XLA hakkında bilgi sahibi olunduğunu varsayar.
XLA, XLA tarafından çıkarılan makine öğrenimi programlarını çalıştırmak için bir arka uç oluşturmak üzere yeni bir mimarinin veya hızlandırıcının uygulayabileceği soyut bir arayüz sağlar. XLA'yı yeniden hedeflemek, yeni donanım için PyTorch veya TensorFlow gibi bir ön uç çerçevesinden mevcut her operasyonu uygulamaktan önemli ölçüde daha basit ve daha ölçeklenebilir olmalıdır.
Çoğu uygulama aşağıdaki senaryolardan birine denk gelecektir:
- Mevcut bir LLVM arka ucu olsun veya olmasın, henüz XLA tarafından resmi olarak desteklenmeyen mevcut CPU mimarisi.
- Mevcut bir LLVM arka ucuna sahip CPU benzeri olmayan donanım.
- Mevcut bir LLVM arka ucu olmayan, CPU benzeri olmayan donanım.
Senaryo 1: Henüz XLA tarafından resmi olarak desteklenmeyen mevcut CPU mimarisi
Bu senaryoda, mevcut XLA CPU arka ucuna bakarak başlayın. XLA, LLVM kullanarak farklı CPU'ları hedeflemeyi kolaylaştırır çünkü CPU'lar için XLA arka uçları arasındaki temel fark, LLVM tarafından oluşturulan koddur.
Donanım satıcısının donanımı için bir LLVM arka ucu varsa, arka ucu XLA ile oluşturulmuş LLVM'ye bağlamak kolaydır. JIT modunda, XLA CPU arka ucu ana bilgisayar CPU'su için kod yayar. Erken derleme için xla::AotCompilationOptions
, hedef mimariyi yapılandırmak üzere bir LLVM üçlüsü sağlayabilir.
Mevcut bir LLVM arka ucu yoksa ancak başka türde bir kod oluşturucu mevcutsa, mevcut CPU arka ucunun çoğunun yeniden kullanılması mümkün olmalıdır.
Senaryo 2: Mevcut bir LLVM arka ucuna sahip CPU benzeri olmayan donanım
Mevcut xla::CPUCompiler
ve xla::GPUCompiler
sınıfları üzerinde yeni bir xla::Compiler
uygulamasını modellemek mümkündür çünkü bunlar zaten LLVM IR yaymaktadır. Donanımın yapısına bağlı olarak, LLVM IR neslinin birçok yönünün değiştirilmesi gerekebilir ancak mevcut arka uçlarla çok sayıda kod paylaşılabilir.
İzlenecek iyi bir örnek, XLA'nın GPU arka ucudur . GPU arka ucu, CPU benzeri olmayan bir ISA'yı hedefler ve bu nedenle kod oluşturmanın bazı yönleri GPU alanına özgüdür. Diğer donanım türleri, örneğin Hexagon gibi DSP'ler (yukarı akışlı bir LLVM arka ucuna sahiptir), LLVM IR emisyon mantığının bazı kısımlarını yeniden kullanabilir, ancak diğer parçalar benzersiz olacaktır.
Senaryo 3: Mevcut bir LLVM arka ucu olmayan, CPU benzeri olmayan donanım
LLVM'yi kullanmak mümkün değilse en iyi seçenek, istenen donanım için XLA'ya yönelik yeni bir arka uç uygulamaktır. Bu seçenek en fazla çabayı gerektirir. Uygulanması gereken sınıflar aşağıdaki gibidir:
-
StreamExecutor
: Çoğu cihaz içinStreamExecutor
tüm yöntemlerine gerek yoktur. Ayrıntılar için mevcutStreamExecutor
uygulamalarına bakın. -
xla::Compiler
: Bu sınıf, bir HLO hesaplamasının derlenmesini birxla::Executable
dosyasına kapsüller. -
xla::Executable
: Bu sınıf, platformda derlenmiş bir hesaplama başlatmak için kullanılır. -
xla::TransferManager
: Bu sınıf, arka uçların, verilen cihaz bellek tanıtıcılarından XLA değişmez verileri oluşturmak için platforma özgü mekanizmalar sağlamasına olanak tanır. Başka bir deyişle, verilerin ana bilgisayardan cihaza ve cihaza aktarımının kapsüllenmesine yardımcı olur.
Bu kılavuz, XLA'nın donanımlarını verimli bir şekilde hedefleyen programların çıktısını almasını isteyen sistem mühendisleri içindir. Kılavuz adım adım değildir ve LLVM , Bazel ve XLA hakkında bilgi sahibi olunduğunu varsayar.
XLA, XLA tarafından çıkarılan makine öğrenimi programlarını çalıştırmak için bir arka uç oluşturmak üzere yeni bir mimarinin veya hızlandırıcının uygulayabileceği soyut bir arayüz sağlar. XLA'yı yeniden hedeflemek, yeni donanım için PyTorch veya TensorFlow gibi bir ön uç çerçevesinden mevcut her operasyonu uygulamaktan önemli ölçüde daha basit ve daha ölçeklenebilir olmalıdır.
Çoğu uygulama aşağıdaki senaryolardan birine denk gelecektir:
- Mevcut bir LLVM arka ucu olsun veya olmasın, henüz XLA tarafından resmi olarak desteklenmeyen mevcut CPU mimarisi.
- Mevcut bir LLVM arka ucuna sahip CPU benzeri olmayan donanım.
- Mevcut bir LLVM arka ucu olmayan, CPU benzeri olmayan donanım.
Senaryo 1: Henüz XLA tarafından resmi olarak desteklenmeyen mevcut CPU mimarisi
Bu senaryoda, mevcut XLA CPU arka ucuna bakarak başlayın. XLA, LLVM kullanarak farklı CPU'ları hedeflemeyi kolaylaştırır çünkü CPU'lar için XLA arka uçları arasındaki temel fark, LLVM tarafından oluşturulan koddur.
Donanım satıcısının donanımı için bir LLVM arka ucu varsa, arka ucu XLA ile oluşturulmuş LLVM'ye bağlamak kolaydır. JIT modunda, XLA CPU arka ucu ana bilgisayar CPU'su için kod yayar. Erken derleme için xla::AotCompilationOptions
, hedef mimariyi yapılandırmak üzere bir LLVM üçlüsü sağlayabilir.
Mevcut bir LLVM arka ucu yoksa ancak başka türde bir kod oluşturucu mevcutsa, mevcut CPU arka ucunun çoğunun yeniden kullanılması mümkün olmalıdır.
Senaryo 2: Mevcut bir LLVM arka ucuna sahip CPU benzeri olmayan donanım
Mevcut xla::CPUCompiler
ve xla::GPUCompiler
sınıfları üzerinde yeni bir xla::Compiler
uygulamasını modellemek mümkündür çünkü bunlar zaten LLVM IR yaymaktadır. Donanımın yapısına bağlı olarak, LLVM IR neslinin birçok yönünün değiştirilmesi gerekebilir ancak mevcut arka uçlarla çok sayıda kod paylaşılabilir.
İzlenecek iyi bir örnek, XLA'nın GPU arka ucudur . GPU arka ucu, CPU benzeri olmayan bir ISA'yı hedefler ve bu nedenle kod oluşturmanın bazı yönleri GPU alanına özgüdür. Diğer donanım türleri, örneğin Hexagon gibi DSP'ler (yukarı akışlı bir LLVM arka ucuna sahiptir), LLVM IR emisyon mantığının bazı kısımlarını yeniden kullanabilir, ancak diğer parçalar benzersiz olacaktır.
Senaryo 3: Mevcut bir LLVM arka ucu olmayan, CPU benzeri olmayan donanım
LLVM'yi kullanmak mümkün değilse en iyi seçenek, istenen donanım için XLA'ya yönelik yeni bir arka uç uygulamaktır. Bu seçenek en fazla çabayı gerektirir. Uygulanması gereken sınıflar aşağıdaki gibidir:
-
StreamExecutor
: Çoğu cihaz içinStreamExecutor
tüm yöntemlerine gerek yoktur. Ayrıntılar için mevcutStreamExecutor
uygulamalarına bakın. -
xla::Compiler
: Bu sınıf, bir HLO hesaplamasının derlenmesini birxla::Executable
dosyasına kapsüller. -
xla::Executable
: Bu sınıf, platformda derlenmiş bir hesaplama başlatmak için kullanılır. -
xla::TransferManager
: Bu sınıf, arka uçların, verilen cihaz bellek tanıtıcılarından XLA değişmez verileri oluşturmak için platforma özgü mekanizmalar sağlamasına olanak tanır. Başka bir deyişle, verilerin ana bilgisayardan cihaza ve cihaza aktarımının kapsüllenmesine yardımcı olur.