Tujuan utama penafsir StableHLO adalah untuk menyediakan referensi
pada semantik opset StableHLO sesuai dengan
spesifikasi
pendukung. Tujuan sekundernya adalah agar implementasinya mengikuti
spesifikasi, mengutamakan keterbacaan daripada performa, untuk memberikan kejelasan tambahan
ke semantik operasi yang paling terlibat seperti Convolution
,
Gather
/Scatter
, dan DotGeneral
.
Saat ini, OpenXLA mendukung interpretasi 91 dari 96 spesifikasi
Operasi StabilHLO. 3 operasi yang tersisa (FftOp
, RngOp
, RngBitGeneratorOp
) telah
semantik mereka
didokumentasikan dalam
spec.md, dan memiliki
menyelesaikan penyelidikan awal tentang
cara melangkah maju (lihat
status.md
untuk mengetahui daftar lengkap operasi dan status terbarunya). Laporan akhir
akan diterapkan berdasarkan kebutuhan komunitas.
Cakupan
Kami mengategorikan opset StableHLO ke dalam 11 kategori yang terdiri dari 118 operasi di total (lihat Lampiran). Penerapan Referensi workstream mengatur tugas penerapan penerjemah untuk 100% operasi StableHLO seperti yang ditetapkan dalam spesifikasi StableHLO. Kami berencana untuk menyelesaikan semua atau hampir semua pekerjaan dalam alur kerja ini di StableHLO v1.0. Dari 96 operasi yang saat ini memiliki spesifikasi, kita dapat menafsirkan 91 operasi melalui OpenXLA (lihat Kasus Khusus untuk 5 kasus lainnya).
Spesifikasi
Persyaratan utama untuk penerjemah adalah memiliki korespondensi 1:1 dengan spesifikasi. Spesifikasi memungkinkan standarisasi penafsir di seluruh operasi serupa yang menjadikan implementasi penerjemah modular dan berkualitas tinggi.
Kasus Khusus
Lain-lain
Kategori ini memiliki operasi yang dapat diurai yang masa depannya tidak jelas saat ini. Ada ada tiga operasi khusus dalam kategori ini yang tidak didukung oleh penerjemah momen tersebut:
FftOp
RngOp
RngBitGeneratorOp
FftOp
dikategorikan sebagai Lain-Lain, tetapi tidak seperti operasi lain dalam kategori ini,
operasi ini tidak memiliki pass peluas, dan mendukungnya di StableHLO adalah
WIP.
RngOp
dan RngBitGeneratorOp
dapat diurai menjadi operasi MHLO, tetapi
dekomposisi memperkenalkan XlaRngGetAndUpdateStateOp
yang merupakan
atau. Penafsiran pendukung kedua operasi ini adalah WIP.
Alat untuk mengonversi operasi yang tersisa dalam kategori ini ke operasi StableHLO yang penafsiran yang didukung berada di hlo_expand_main.cc.
Tidak di HLO
Terlepas dari operasi yang ditentukan, kategori ini terdiri dari 8 operasi yang tidak ditentukan (lihat Kategori Operasi SttableHLO) yang direncanakan pindah dari StableHLO. Sebagian besar operasi ini sudah memiliki kartu di mhlo ke mengubahnya ke operasi yang setara dengan StableHLO.
Alat untuk mengonversi operasi yang tersisa dalam kategori ini ke operasi Stabil yang setara yang didukung penafsir berada di mlir-hlo-opt.cc.
Kuantisasi
Dukungan penerjemah untuk operasi stablehlo.constant
dengan jenis terkuantisasi adalah
tidak didukung dan dilacak melalui
#1691.
Petunjuk Penggunaan
Membangun Penerjemah Referensi
Penafsir dapat dibangun dan diuji melalui Bazel atau CMake (lebih disukai). Untuk lengkap lihat README.md.
Bazel:
bazel build //...
CMake:
mkdir -p build && cd build
cmake .. -GNinja \
-DLLVM_ENABLE_LLD="$LLVM_ENABLE_LLD" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=On \
-DMLIR_DIR=${PWD}/../llvm-build/lib/cmake/mlir
Untuk menjalankan penafsir, kami memiliki alat terjemahan untuk menafsirkan program StableHLO yang ditulis dalam MLIR.
stablehlo-translate --interpret <path/to/program>
Dialek Penerjemah
Dialek Interpreter
berisi berbagai operasi utilitas yang terkait dengan
penerjemahan mesin. Secara khusus, interpreter.run_parallel
(lihat
InterpreterOps.td
untuk semantik operasi dan contoh penggunaan) memungkinkan interpretasi operasi Distribusi, dan banyak lagi
utilitas akan ditambahkan berdasarkan kebutuhan masyarakat.
Dialek Cek
Dialek Check
digunakan untuk membandingkan nilai runtime penafsir dengan yang diharapkan
masing-masing. Output program StableHLO dapat diuji melalui berbagai operasi pemeriksaan (lihat
CheckOps.td
untuk semantik operasi dan contoh penggunaan).
Program Ujian Menulis
Kita menggunakan alat lit LLVM untuk menjalankan dan membandingkan file yang dihasilkan untuk membedakan dengan output penafsir (lihat stablehlo/tests/interpret misalnya, pengujian).
Menguji AddOp
(sampel dari
interpret_add.mlir):
// RUN: stablehlo-translate --interpret %s
func.func @add_op_scalar() {
%0 = stablehlo.constant dense<2> : tensor<i4>
%1 = stablehlo.constant dense<3> : tensor<i4>
%2 = stablehlo.add %0, %1 : tensor<i4>
check.expect_eq_const %2, dense<5> : tensor<i4>
func.return
}
Pengujian operasi dalam kategori Distribusi mengharuskan untuk menjalankannya melalui
Operasi utilitas interpreter.run_parallel
.
Menguji AllReduceOp
(sampel dari
all_reduce.mlir):
// RUN: stablehlo-translate --interpret %s
module @cross_replica {
func.func public @all_reduce(%operand : tensor<4xi64>) -> tensor<4xi64> {
%result = "stablehlo.all_reduce"(%operand) ({
^bb0(%arg0: tensor<i64>, %arg1: tensor<i64>):
%0 = stablehlo.add %arg0, %arg1 : tensor<i64>
stablehlo.return %0 : tensor<i64>
}) {
replica_groups = dense<[[0, 1]]> : tensor<1x2xi64>,
channel_handle = #stablehlo.channel_handle<handle = 0, type = 0>
} : (tensor<4xi64>) -> tensor<4xi64>
return %result : tensor<4xi64>
}
func.func public @main() {
%inputs0 = stablehlo.constant dense<[1, 2, 3, 4]> : tensor<4xi64>
%inputs1 = stablehlo.constant dense<[5, 6, 7, 8]> : tensor<4xi64>
%results:2 = "interpreter.run_parallel"(%inputs0, %inputs1) {
programs=[[@all_reduce], [@all_reduce]]
} : (tensor<4xi64>, tensor<4xi64>) -> (tensor<4xi64>, tensor<4xi64>)
check.expect_eq_const %results#0, dense<[6, 8, 10, 12]> : tensor<4xi64>
check.expect_eq_const %results#1, dense<[6, 8, 10, 12]> : tensor<4xi64>
func.return
}
}
Men-debug StabilHLO
Dengan mengikuti langkah-langkah build StableHLO, biner StableHLO untuk alat di
stablehlo/tools
harus berada di /build/bin
. Alat {i>debugging <i}yang umum seperti
GDB dapat digunakan untuk menelusuri kode:
gdb --args ./build/bin/stablehlo-translate -allow-unregistered-dialect --interpret ./stablehlo/tests/interpret/<test>.mlir
Lampiran
Konversikan Operasi Lain-Lain
# batch_norm_grad
hlo-expand --batch_norm_grad_expander <path/to/hlo_module>
# batch_norm_inference
hlo-expand --batch_norm_inference_expander <path/to/hlo_module>
# batch_norm_training
hlo-expand --batch_norm_training_expander <path/to/hlo_module>
# cholesky
hlo-expand --cholesky_expander <path/to/hlo_module>
# constant
# Supported in StableHLO interpreter.
# fft
# TBD
# iota
# Supported in StableHLO interpreter.
# rng
# TBD
# rng_bit_generator
# TBD
# triangular_solve
hlo-expand --triangular_solve_expander <path/to/hlo_module>
Konversi Tidak Di Operasi HLO
# broadcast
mlir-hlo-opt -mhlo-legalize-broadcast-to-broadcast-in-dim <path/to/input>
# create_token
mlir-hlo-opt -mhlo-legalize-create-token-to-after-all <path/to/input>
# cross-replica-sum
mlir-hlo-opt -mhlo-legalize-cross-replica-sum-to-all-reduce <path/to/input>
# dot
mlir-hlo-opt -mhlo-legalize-dot-to-dot-general <path/to/input>
# einsum
mlir-hlo-opt -mhlo-legalize-einsum-to-dot-general <path/to/input>
# torch_index_select
mlir-hlo-opt -mhlo-legalize-torch-index-select-to-gather <path/to/input>
# unary_einsum
mlir-hlo-opt --canonicalize -mhlo-legalize-einsum-to-dot-general <path/to/input>
Kategori Operasi StabilHLO
Kategori | Mnemonik | Total |
---|---|---|
119 | ||
Alur Kontrol | after_all, case, if, optimization_barrier, sementara | 5 |
Perpindahan Data | broadcast_in_dim, gabungkan, dynamic_slice, dynamic_update_slice, kumpulkan, pad, bentuk ulang, balik, sebar, iris, urutkan, transposisi | 12 |
Distribusi | all_gather, all_reduce, all_to_all, collective_permute, infeed, outfeed, partition_id, recv, apply_scatter, replica_id, kirim | 11 |
Dinamisme | dynamic_broadcast_in_dim, dynamic_cond, dynamic_gather, dynamic_iota, dynamic_pad, bentuk_ulang dinamis, get_dimension_size, real_dynamic_slice, set_dimension_size | 9 |
Elementwise | , cbrt, ceil, clamp, membandingkan, kompleks, kompleks, mengubah, mengubah, kosin, count_ mendukung_zeros, membagi, eksponensial,. | 48 |
Ekstensibilitas | custom_call, get_tuple_element, tuple | 3 |
Lain-lain | batch_norm_grad, batch_norm_inference, batch_norm_training, cholesky, konstan, fft, iota, rng, rng_bit_generator, triangular_resolve | 10 |
Modularitas | call, func, module, return | 4 |
Tidak di HLO | broadcast, create_token, cross-replica-sum, titik, einsum, torch_index_select, unary_einsum | 8 |
Kuantisasi | {i>uniform_dequantize<i}, {i>uniform_quantize<i} | 2 |
Pengurangan | konvolusi, titik_umum, kurangi, kurangi_jendela, pilih_dan_pencar | 5 |