Tłumacz rozmowy w StableHLO

Głównym celem tłumaczenia rozmowy StableHLO jest dostarczenie zgodnie z semantyką ustawienia StableHLO. specyfikacji. Dodatkowym celem jest ścisłe przestrzeganie specyfikację, nadając priorytet czytelności nad wydajnością, aby zwiększyć przejrzystość nawet w najważniejszych operacjach, takich jak Convolution, Gather/Scatter i DotGeneral.

Obecnie OpenXLA obsługuje interpretację 91 z 96 zastosowanych Operacje StableHLO. Pozostałe 3 operacje (FftOp, RngOp, RngBitGeneratorOp) wykazały ich semantykę opisaną w spec.md i mają przeprowadzili wstępną analizę na temat dalszych działań (patrz status.md , gdzie znajdziesz pełną listę operacji i ich najnowszy stan). Te ostatnie ulepszenia będą wdrażane w razie potrzeby w ramach społeczności.

Zakres

Podzieliliśmy grupę StableHLO na 11 kategorii zawierających 118 operacji (patrz Dodatek). Implementacja referencyjna przepływ pracy porządkuje pracę nad wdrożeniem tłumacza dla 100% operacji StableHLO zgodnie z definicją w specyfikacji StableHLO. Jesteśmy planujecie wykonanie wszystkich lub prawie wszystkich zadań w tym strumieniu pracy w StableHLO Wersja 1.0. Spośród 96 operacji mających obecnie specyfikację możemy interpretować 91 OpenXLA (pozostałe 5 znajdziesz w przypadkach specjalnych).

Specyfikacja

Głównym wymaganiem od tłumaczy jest korespondencja 1:1 z specyfikacja. Specyfikacja pozwala ustandaryzować tłumacza w podobnych operacjach, prowadzi do modułowej implementacji tłumacza o wysokiej jakości.

Przypadki szczególne

Różne

W tej kategorii znajdują się operacje rozkładane, a przyszłość nie jest w tej chwili nieznana. OK to 3 określone operacje w tej kategorii, których tłumacz nie obsługuje ten moment:

  • FftOp
  • RngOp
  • RngBitGeneratorOp

Działanie FftOp jest sklasyfikowane jako Różne, ale w przeciwieństwie do innych działań w tej kategorii to działanie nie ma karnetu rozwijania, a obsługa go w StableHLO jest W trakcie opracowywania.

RngOp i RngBitGeneratorOp można podzielić na operacje MHLO, ale dekompozycja wprowadza element XlaRngGetAndUpdateStateOp, który jest specyficzny dla MHLO op. Interpretacja tych 2 operacji jest w trakcie opracowywania.

Narzędzie do konwertowania pozostałych operacji w tej kategorii na operacje StableHLO, które są tłumacz znajduje się w pliku hlo_expand_main.cc.

Brak w HLO

Oprócz działań wskazanych w tej kategorii składa się z 8 nieoczekiwanych operacji (patrz kategorii operacji StableHLO), które planujemy przeniesione ze StableHLO. Większość z tych operacji ma już karty mhlo na i przekonwertować je na operacje równoważne StableHLO.

Narzędzie do konwertowania pozostałych operacji w tej kategorii na odpowiadające im operacje StableHLO w pliku mlir-hlo-opt.cc.

Kwantyfikacja

Obsługa tłumaczenia rozmowy w przypadku operacji stablehlo.constant z typem kwantyzowanym to nieobsługiwane i śledzone przez 1691.

Instrukcje

Tworzenie tłumaczenia rozmowy

Tłumacz można utworzyć i przetestować w Bazel lub CMake (preferowane). Pełny instrukcji można znaleźć w sekcji README.md.

Bazel:

bazel build //...

Marka:

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

Do uruchomienia tłumaczenia rozmowy mamy narzędzie do tłumaczenia programów StableHLO. napisane w języku MLIR.

stablehlo-translate --interpret <path/to/program>

Dialekt tłumacza

Dialekt Interpreter zawiera różne operacje użytkowe związane z tłumaczem ustnym. Konkretnie chodzi o interpreter.run_parallel (zobacz InterpreterOps.td semantyki operacyjnej i przykładowego użycia) op umożliwia interpretację operacji dystrybucji i nie tylko. plan wykorzystania usług komunalnych w zależności od potrzeb społeczności.

Sprawdzanie dialektu

Dialekt Check służy do porównywania wartości czasu działania tłumaczenia z oczekiwanymi . Dane wyjściowe programu StableHLO można przetestować za pomocą różnych operacji kontrolnych (zobacz CheckOps.td semantyki operacyjnej i przykładowego zastosowania).

Pisanie programów testów

Używamy narzędzia LLVM (lit) do uruchamiania porównanie z wygenerowanym plikiem, aby porównać je z danymi wyjściowymi interpretera (patrz: stablehlo/tests/interpret. np. testy).

Testowanie: AddOp (przykład z 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
}

Testowanie operacji w kategorii Dystrybucja wymaga uruchomienia jej za pomocą interpreter.run_parallel – op.

Testowanie: AllReduceOp (przykład z 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
  }
}

Debugowanie StableHLO

Zgodnie z instrukcjami kompilacji StableHLO pliki binarne StableHLO dla narzędzi w stablehlo/tools to miejsce zamieszkania: /build/bin. Typowe narzędzia do debugowania, takie jak Za pomocą GDB można wykonać kod:

gdb --args ./build/bin/stablehlo-translate -allow-unregistered-dialect --interpret ./stablehlo/tests/interpret/<test>.mlir

Dodatek

Konwertuj różne operacje

# 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>

Konwersja nie należąca do operacji 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>

Kategorie operacji StableHLO

Kategorie Mnemotechnika Łącznie
119
Przepływ kontroli after_all, case, if, optymalizację_barrier, podczas 5
Przenoszenie danych transmisja_w_dim, scalanie, wycinek_dynamiczny, wycinek_aktualizacji dynamicznej, zbieranie, wycinanie, zmiana kształtu, odwrotne, rozproszenie, wycinek, sortowanie, transponowanie 12
Dystrybucja all_gather, all_reduce, all_to_all, zbiorowe_permute, Infeed, outfeed, Party_id, recv, max_scatter, replik_id, send 11
Dynamizm dynamiczna_transmisja_transmisji_w_dim, konwersja_dynamiczna, zbieranie_dynamicznych, dynamiczna_iota, dynamiczna_pad, dynamiczna_reshape, get_dimension_size, real_dynamic_slice oraz set_dimension_size 9
Elementwise , ,, ,, ??, trzeba, cosine, ,. , ,. ,. ,. ,. ,. ,. , 48
Możliwość rozszerzania custom_call, get_tuple_element, kropka 3
Różne wsad_norm_grad, wsad_do_inferencji_normki, wsad_szkolenia_z_normą, cholesky, stała, fft, iota, rng, generator_bitów_rng, generator_trójkątny 10
Modularity wywołanie, func, moduł, zwrot 4
Brak w HLO transmisja, create_token, cross-replica-sum, kropka, einsum, torch_index_select oraz unary_einsum 8
Kwantyfikacja uniform_dewantize, uniform_quantize 2
Redukcja splot, kropka_general, zmniejsz, zmniejsz_okno, wybierz_i_punkt 5