Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Mengembangkan backend baru untuk XLA

Panduan awal ini ditujukan bagi pengguna awal yang ingin dengan mudah menargetkan ulang TensorFlow ke perangkat keras mereka dengan cara yang efisien. Panduan ini bukanlah panduan langkah demi langkah dan mengasumsikan pengetahuan tentang LLVM , Bazel , dan TensorFlow.

XLA menyediakan antarmuka abstrak yang dapat diimplementasikan oleh arsitektur atau akselerator baru untuk membuat backend guna menjalankan grafik TensorFlow. Penargetan ulang XLA harus jauh lebih sederhana dan dapat diskalakan daripada mengimplementasikan setiap Operasi TensorFlow yang ada untuk hardware baru.

Sebagian besar penerapan akan termasuk dalam salah satu skenario berikut:

  1. Arsitektur CPU yang ada belum secara resmi didukung oleh XLA, dengan atau tanpa backend LLVM yang ada.
  2. Perangkat keras non-CPU dengan backend LLVM yang ada.
  3. Perangkat keras yang tidak mirip CPU tanpa backend LLVM yang ada.

Skenario 1: Arsitektur CPU yang ada belum didukung secara resmi oleh XLA

Dalam skenario ini, mulailah dengan melihat backend CPU XLA yang ada. XLA mempermudah penargetan ulang TensorFlow ke CPU yang berbeda dengan menggunakan LLVM, karena perbedaan utama antara backend XLA untuk CPU adalah kode yang dihasilkan oleh LLVM. Google menguji XLA untuk arsitektur x64 dan ARM64.

Jika vendor perangkat keras memiliki backend LLVM untuk perangkat keras mereka, sangat mudah untuk menautkan backend dengan LLVM yang dibuat dengan XLA. Dalam mode JIT, backend CPU XLA memancarkan kode untuk CPU host. Untuk kompilasi sebelumnya, xla::AotCompilationOptions dapat menyediakan triple LLVM untuk mengkonfigurasi arsitektur target.

Jika tidak ada backend LLVM tetapi ada jenis pembuat kode lain, sebagian besar backend CPU yang ada seharusnya dapat digunakan kembali.

Skenario 2: Perangkat keras yang tidak mirip CPU dengan backend LLVM yang ada

Dimungkinkan untuk membuat model implementasi xla::Compiler pada kelas xla::CPUCompiler dan xla::GPUCompiler , karena kelas ini sudah mengeluarkan LLVM IR. Bergantung pada sifat perangkat keras, ada kemungkinan banyak aspek generasi LLVM IR harus diubah, tetapi banyak kode yang dapat dibagikan dengan backend yang ada.

Contoh yang baik untuk diikuti adalah backend GPU XLA. GPU backend menargetkan ISA non-CPU-like, dan oleh karena itu beberapa aspek pembuatan kodenya unik untuk domain GPU. Jenis perangkat keras lainnya, misalnya DSP seperti Hexagon (yang memiliki backend LLVM hulu), dapat menggunakan kembali bagian logika emisi LLVM IR, tetapi bagian lain akan unik.

Skenario 3: Perangkat keras yang tidak mirip CPU tanpa backend LLVM yang ada

Jika tidak memungkinkan untuk menggunakan LLVM, maka opsi terbaik adalah mengimplementasikan backend baru untuk XLA untuk perangkat keras yang diinginkan. Opsi ini membutuhkan usaha paling keras. Kelas-kelas yang perlu diimplementasikan adalah sebagai berikut:

  • StreamExecutor : Untuk banyak perangkat, tidak semua metode StreamExecutor diperlukan. Lihat implementasi StreamExecutor ada untuk mengetahui detailnya.
  • xla::Compiler : Kelas ini merangkum kompilasi komputasi HLO ke dalam xla::Executable .
  • xla::Executable : Kelas ini digunakan untuk meluncurkan komputasi terkompilasi pada platform.
  • xla::TransferManager : Kelas ini memungkinkan backend menyediakan mekanisme khusus platform untuk membangun data literal XLA dari pegangan memori perangkat yang diberikan. Dengan kata lain, ini membantu merangkum transfer data dari host ke perangkat dan kembali.