Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

XLA: Derleyici'yi Makine Öğrenimi için Optimize Etme

XLA (Hızlandırılmış Doğrusal Cebir), potansiyel kaynak kodu değişikliği olmadan TensorFlow modellerini hızlandırabilen doğrusal cebir için alana özgü bir derleyicidir.

Sonuçlar hız ve bellek kullanımındaki iyileştirmelerdir: dahili ölçütlerin çoğu XLA etkinleştirildikten sonra ~ 1.15 kat daha hızlı çalışır. Aşağıdaki veri kümesi tek bir NVidia V100 GPU'da değerlendirilmiştir:

Giriş

Bir TensorFlow programı çalıştırıldığında, tüm işlemler TensorFlow yürütücüsü tarafından ayrı ayrı yürütülür. Her TensorFlow işleminde, yürütücünün gönderdiği önceden derlenmiş bir GPU çekirdek uygulaması vardır.

XLA, çalışan modeller için alternatif bir mod sağlar: TensorFlow grafiğini, belirtilen model için özel olarak oluşturulan bir dizi hesaplama çekirdeğinde derler. Bu çekirdekler modele özgü olduğu için, optimizasyon için modele özgü bilgilerden yararlanabilirler. Örneğin, XLA'nın basit bir TensorFlow hesaplaması bağlamında yaptığı bir optimizasyona bakalım:

 def model_fn(x, y, z):
  return tf.reduce_sum(x + y * z)
 

XLA olmadan çalıştırın, grafik üç çekirdek başlatır: biri çarpma için, diğeri ekleme için ve diğeri azaltma için. Ancak, XLA grafiği tek bir çekirdek başlatmasında sonucu hesaplayacak şekilde optimize edebilir. Bunu toplama, çarpma ve azaltmayı tek bir GPU çekirdeğine "kaynaştırarak" yapar. Ayrıca, bu kaynaşmış işlem y*z ve x+y*z tarafından üretilen ara değerleri belleğe yazmaz; bunun yerine, bu ara hesaplamaların sonuçlarını doğrudan GPU kayıtlarında tutarken doğrudan kullanıcılarına "aktarır". Fusion, XLA'nın en önemli optimizasyonudur. Bellek bant genişliği genellikle donanım hızlandırıcıları üzerindeki en nadir kaynaktır, bu nedenle bellek işlemlerini kaldırmak performansı artırmanın en iyi yollarından biridir.

TensorFlow modelleri için XLA'yı etkinleştirme

Otomatik kümeleme

TensorFlow modellerinde XLA kullanmaya başlamanın en basit yolu, TensorFlow grafiği içinde XLA kullanılarak derlenip çalıştırılabilen kümeleri (bağlı alt çizgiler) otomatik olarak bulan otomatik kümelemeyi etkinleştirmektir. GPU'da otomatik kümeleme, TF_XLA_FLAGS ortam değişkeni ayarlanarak etkinleştirilebilir:

 $ TF_XLA_FLAGS=--tf_xla_auto_jit=2 path/to/your/tf/program
 

Otomatik kümeleme şu anda GPU iş yükleri için en iyi duruma getirilmiştir, ancak CPU üzerinde ayrıca --tf_xla_cpu_global_jit bayrağı kullanılarak da --tf_xla_cpu_global_jit :

 $ TF_XLA_FLAGS="--tf_xla_auto_jit=2 --tf_xla_cpu_global_jit" path/to/your/program
 

Ayrıntılı kullanım örneği için otomatik kümeleme öğretici kolabına bakın .

Açık derleme ile tf.function

Otomatik kümeleme, kodda herhangi bir değişiklik yapmadan modeli daha hızlı hale getirmek için harika bir araçtır, ancak hangi değişikliklerin yapıldığını anlamak zor olabilir.

Açık derleme API'si, hangi işlevlerin derlenmesi gerektiğini seçmek için daha ayrıntılı bir denetim sunar. Örneğin, MNIST eğitimini gerçekleştiren aşağıdaki TensorFlow işlevi XLA ile derlenmiştir:

 @tf.function(experimental_compile=True)
def train_mnist(images, labels):
    images, labels = cast(images, labels)

    with tf.GradientTape() as tape:
      predicted_labels = layer(images)
      loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
          logits=predicted_labels, labels=labels
      ))
    layer_variables = layer.trainable_variables
    grads = tape.gradient(loss, layer_variables)
    optimizer.apply_gradients(zip(grads, layer_variables))
 

experimental_compile API mutlaka derleme anlambilim içeriyor: ya tüm fonksiyon XLA ile derlendi veya bir errors.InvalidArgumentError istisnası atılır. XLA şu anda boyutların kısırlaştırılamadığı işlevleri derleyememektedir : yani, tüm hesaplamayı çalıştırmadan tüm tansörlerin boyutlarını çıkarmak mümkün değilse. Örneğin, aşağıdaki işlev derlenmez:

 @tf.function
def not_compilable(x):
  return tf.unique(x)
 

Şekiller koşularda değişebilir:

 @tf.function(experimental_compile=True)
def recompiled_on_launch(a, b):
  return a + b

recompiled_on_launch(tf.ones([1, 10]), tf.ones([1, 10]))
recompiled_on_launch(tf.ones([1, 100]), tf.ones([1, 100]))
 

Daha ayrıntılı bir kullanım örneği için eğitim kolabına bakın.

tfcompile ile CPU için AOT ( tfcompile ) derlemesi

Ayrıca, TensorFlow grafiğini yürütülebilir koda dönüştüren bağımsız bir tfcompile aracı da kullanabilirsiniz (yalnızca x86-64 CPU için).

Derlenmiş programları inceleyin

XLA, oluşturulan programları incelemenize izin veren içgözlem olanakları sağlar. Oluşturulan programları boşaltmak için XLA_FLAGS ortam değişkenini XLA_FLAGS :

 $ XLA_FLAGS="--xla_dump_to=/tmp/generated" TF_XLA_FLAGS="--tf_xla_auto_jit=2" my/tensorflow/program
 

Döküm gerçekleştirildikten sonra, /tmp/generated dosyada aşağıdaki dosyaları bulabilirsiniz:

  • module_XXXX.*_optimizations.txt Derlenmiş her kümede bir tane olmak üzere oluşturulan XLA programları . XLA hata raporlarını gönderirken bunları eklemek son derece yararlı!

  • module_XXXX.ir-*.ll NVPTX intrinsics ile LLVM ara gösteriminde oluşturulan dosyalar.

  • module_XXXX.ptx Oluşturulan PTX dosyaları.

Ayrıca, XLA kümelerinin TensorFlow grafiğinin içine gömülmesini görselleştirerek grafiği dökebilirsiniz:

 $ TF_DUMP_GRAPH_PREFIX=/tmp/generated TF_XLA_FLAGS="--tf_xla_clustering_debug"
 

Tekrarlanabilir hata raporları

Bir hata raporunun, üretilen XLA programları ve kullanılan otomatik kümeleme gömme için dökümleri içermesi durumunda çoğaltılması çok daha kolaydır. Bunları otomatik kümeleme ile çalışan bir TensorFlow programı için oluşturmak üzere başlatın:

 $ TF_DUMP_GRAPH_PREFIX=/tmp/generated \
  TF_XLA_FLAGS="--tf_xla_clustering_debug --tf_xla_auto_jit=2" \
  XLA_FLAGS="--xla_dump_hlo_as_text --xla_dump_to=/tmp/generated" \
    my/tensorflow/program"
 

Hataları dosyalarken, /tmp/generated dizinin içeriğini ekleyin (yukarıda belirtilmiştir).

Mümkünse, replay_computation kullanarak ve yinelenen olarak oluşturulan programlarda çalıştırarak bir hatayı tek bir XLA programına ayırmaya çalışın.

XLA Ön Uçları

TensorFlow dışında XLA programları aşağıdakiler tarafından oluşturulabilir:

  • JAX : Python + NumPy programlarının birleştirilebilir dönüşümleri
  • Julia : Bilimsel bilgi işlem için Julia dili
  • PyTorch : PyTorch çerçevesi

daha fazla okuma