ترجمة فورية ثابتة

ويتمثل الهدف الرئيسي من مترجم StableHLO في توفير مرجع على دلالات دالة StableHLO وفقًا لدلالات واجهة المواصفات. الهدف الثانوي هو أن تتبع التنفيذ بدقة المواصفات، مع تفضيل القراءة على الأداء، لتوفير مزيد من الوضوح إلى دلالات العمليات الأكثر تفاعلاً مثل Convolution، Gather/Scatter، وDotGeneral.

في الوقت الحالي، يدعم OpenXLA تفسير 91 من 96 محددًا عمليات StableHLO تتضمّن العمليات الثلاث المتبقية (FftOp وRngOp وRngBitGeneratorOp) ودلالاتها موثقة في spec.md، ولديها التحقيقات الأولية التي تم إكمالها حول كيفية المضي قدمًا (راجع status.md للحصول على قائمة كاملة بالعمليات وأحدث حالة لها). هذه الأدوار النهائية التحسينات على أساس المجتمع حسب الحاجة.

النطاق

صنفنا عملية StableHLO إلى 11 فئة تتكون من 118 عملية في الإجمالي (يُرجى الاطّلاع على الملحق). تنفيذ المراجع ينظم سير العمل العمل على إيجاد مترجم لنسبة 100% من عمليات StableHLO على النحو المحدّد في مواصفات StableHLO. نحن التخطيط لإنجاز كل الأعمال أو جميعها تقريبًا في مسار العمل هذا في StableHLO الإصدار 1.0 من بين 96 عملية لها مواصفات حاليًا، يمكننا تفسير 91 عملية من خلال OpenXLA (اطّلِع على الحالات الخاصة للحالات الخمس المتبقية).

المواصفات

إن الشرط الرئيسي للمترجم الفوري هو أن يكون لديك مراسلات 1:1 مع المواصفات. تسمح المواصفات بتوحيد المترجم الفوري في العمليات المشابهة التي أن تؤدّي إلى تنفيذ تنسيق عالٍ وعالي الجودة للمترجم

حالات خاصة

خيارات متنوعة

تحتوي هذه الفئة على عمليات قابلة للتحليل لا يمكن تحديد مستقبلها في الوقت الحالي. هناك هي ثلاث عمليات محددة ضمن هذه الفئة لا يتيحها المترجم الفوري اللحظة الحالية:

  • FftOp
  • RngOp
  • RngBitGeneratorOp

FftOp مصنفة على أنها متنوعة، ولكن على عكس العمليات الأخرى في هذه الفئة، لا تحتوي هذه العملية على بطاقة توسيع، ويدعم ذلك في StableHLO العمل قيد التقدم.

يمكن تحليل RngOp وRngBitGeneratorOp إلى عمليات MHLO، ولكن تؤدي الانحلال إلى إنشاء XlaRngGetAndUpdateStateOp، وهي قيمة خاصة بـ MHLO عملية دعم التفسير لهاتين العمليتين هو العمل قيد التقدم.

وهي أداة لتحويل العمليات المتبقية في هذه الفئة إلى عمليات StableHLO التي يمكنك العثور على ميزة "الترجمة الفورية" في hlo_expand_main.cc.

غير موجود في HLO

بصرف النظر عن العمليات المحددة، تتكون هذه الفئة من 8 عمليات غير محددة (يُرجى الاطلاع على فئات عمليات SttableHLO) التي يتم التخطيط لها تم نقل القناة من StableHLO. تتوفّر في معظم هذه العمليات بطاقات حاليًا mhlo إلى وتحويلها إلى عمليات مكافئة في StableHLO.

أداة تحويل العمليات المتبقية في هذه الفئة إلى عمليات StableHLO المكافئة التي توفِّرها أداة الترجمة الفورية في mlir-hlo-opt.cc.

الكمية

تتوفّر ميزة الترجمة الفورية لتشغيل عملية "stablehlo.constant" من خلال النوع الكمية. غير مدعومة وتتبعها عبر #1691.

تعليمات الاستخدام

إنشاء مترجم فوري

يمكن إنشاء أداة الترجمة الفورية واختبارها باستخدام Bazel أو CMake (الخيار المفضّل). لكامل الشاشة التعليمات، يُرجى الرجوع إلى README.md.

بازل:

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

لتشغيل ميزة الترجمة الفورية، تتوفّر لدينا أداة ترجمة تتيح تفسير برامج StableHLO. مكتوبة في MLIR.

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

لهجة الترجمة الفورية

تحتوي اللهجة Interpreter على عمليات مساعدة متنوعة متعلقة بـ أو المترجم الفوري. وعلى وجه التحديد، interpreter.run_parallel (يُرجى الاطّلاع على InterpreterOps.td لعلم الدلالات التشغيلية وأمثلة الاستخدام) يتيح الأمر تفسير عمليات التوزيع، والمزيد والمرافق بناءً على احتياجات المجتمع المحلي.

لهجة الشيك

يتم استخدام اللهجة Check للمقارنة بين قيم بيئة التشغيل الخاصة بميزة "الترجمة الفورية" والقيمة المتوقّعة. القيم. ويمكن اختبار نتائج برنامج StableHLO من خلال عمليات فحص مختلفة (راجع CheckOps.td لدلالات العمليات وأمثلة الاستخدام).

برامج اختبار الكتابة

نستخدم أداة lit من LLVM لتشغيل المقارنة مع الملف الذي تم إنشاؤه الاختلاف مع نتائج المترجم الفوري (يُرجى الاطّلاع على stablehlo/tests/interpret على سبيل المثال الاختبارات).

اختبار AddOp (عيّنة من 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
}

يتطلب اختبار العمليات في فئة "التوزيع" تشغيلها عبر عملية الأداة المساعدة interpreter.run_parallel

اختبار AllReduceOp (عيّنة من 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
  }
}

تصحيح أخطاء StableHLO

باتباع خطوات إنشاء StableHLO، يتم استخدام برامج ثنائية StableHLO للأدوات في يجب أن يكون "stablehlo/tools" مقيمًا في /build/bin. أدوات تصحيح الأخطاء الشائعة مثل يمكن استخدام GDB للتنقل عبر الرمز:

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

الملحق

تحويل العمليات المتنوعة

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

التحويل غير المضمّن في عمليات 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>

فئات StableHLO Ops

الفئات وسائل الاستذكار المجموع
119
مسار التحكّم بعد_الكل، حالة، حالة، تحسين_حاجز، بينما 5
نقل البيانات البث_in_dim، تسلسل، Dynamic_slice، Dynamic_update_slice، جمع، لوحة، إعادة تشكيل، عكس، مبعثر، شريحة، فرز، تبديل 12
التوزيع all_gather، all_reduce، all_to_all، collectionsive_permute، infeed، outfeed،مساعد_القسم، recv، تقليل_scatter، نسخ_النُسخ، إرسال 11
الديناميكية Dynamic_broadcast_in_dim، Dynamic_conv، Dynamic_gather، Dynamic_iota، Dynamic_pad، Dynamic_reshape، get_dimension_size، Real_dynamic_slice، set_dimension_size 9
Elementwise abs, add, and, atan2, bitcast_convert, cbrt, ceil, clamp, compare, complex, convert, cosine, count_leading_zeros, divide, exponential, exponential_minus_one, floor, imag, is_finite, log, log_plus_one, logistic, map, maximum, minimum, multiply, negate, not, or, popcnt, power, real, reduce_precision, remainder, round_nearest_afz, round_nearest_even, rsqrt, select, shift_left, shift_right_arithmetic, shift_right_logical, sign, sine, sqrt, subtract, tan, tanh, xor 48
القابلية للتوسّع custom_call، وget_tuple_element، tuple 3
خيارات متنوعة الدفعة_norm_grad، يوجد_norm_inference، ارتباط_norm_training، ccolsky، ثابت، fft، iota، rng، rng_bit_ Builder، triangular_solve 10
Modularity استدعاء، فني، وحدة، عودة 4
غير موجود في HLO البث، create_token، المجموع المتكرر، نقطة، einsum، torch_index_select، unary_einsum 8
الكمية uniform_dequantize وuniform_quantize 2
تقليل التفاف، نقطة_عام، صغير، تقليل_نافذة، select_and_scatter 5