-chlo-legalize-to-stablehlo

ترخيص تدفق عمليات CHLO إلى عمليات StableHLO وShape ops

-shape-legalize-to-stablehlo

إضفاء الشرعية على العمليات ذات الصلة بالشكل في StableHLO

خطوة تجريبية تُعدّ العمليات ذات الصلة بالشكل قانونية لعمليات StableHLO

من خلال دمج عمليات حساب الشكل والبيانات معًا من خلال خطوة اختيارية، سيتيح ذلك لمنظومة StableHLO المتكاملة إمكانية الاستفادة من قنوات المعالجة التي تستخدم عمليات StableHLO لوضع نماذج للديناميكية.

-stablehlo-aggressive-folder

تجميع عمليات StableHLO

الخيارات

-fold-float : Allow for potentially lossy computations using float type.

-stablehlo-aggressive-simplification

توحيد عمليات StableHLO

-stablehlo-canonicalize-dynamism

توحيد عمليات StableHLO الديناميكية في عمليات ثابتة

تستبدل هذه العملية عمليات StableHLO الديناميكية، مثل DynamicReshapeOp، بعمليات ثابتة مقابلة، مثل DynamicReshapeOp إلى ReshapeOp أو DynamicBroadcastInDim إلى BroadcastInDim إذا كانت جميع العناصر الديناميكية من هذه العمليات ثابتة في الواقع.

  %c = stablehlo.constant dense<16> : tensor<1xi32>
  %0 = stablehlo.dynamic_broadcast_in_dim %cst, %c, dims = [] : (tensor<f32>, tensor<1xi32>) -> tensor<16xf32>

  ==>

  %0 = stablehlo.broadcast_in_dim %cst, dims = [] : (tensor<f32>) -> tensor<16xf32>

-stablehlo-compatibility-expander

موسّع التوافق لعمليات StableHLO

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

لماذا هذا البطاقة اختيارية؟

في بعض الأحيان، يتم استخدام تحسينات عمليات StableHLO لتبسيط التعامل مع أنماط شائعة معيّنة في منظومة OpenXLA المتكاملة. ويشمل ذلك عناصر مثل TanOp، التي توفّر دعمًا عاليًا للإطارات المرجعية والمجمّعات، بالإضافة إلى سمات تجميع/تشتيت الحِزم، والتي يمكن تمثيلها باستخدام الشرائح، ولكنّها تصعّب تجزئة البيانات بشكلٍ كبير. بالنسبة إلى هذه الفئة من الميزات الجديدة، لا نقدّم ميزة الرجوع إلى إصدار سابق تلقائيًا، لأنّ ذلك قد يؤدي إلى فقدان معلومات مهمة يتم استخدامها في عمليات التحسين اللاحقة. يمكن استخدام هذه الخطوة لتوسيع نطاق هذه العمليات استنادًا إلى إصدار مستهدَف لزيادة التوافق إلى أقصى حدّ على حساب عملية الترجمة التي قد تكون أقل كفاءة.

func.func @tan_op_non_complex(%arg0: tensor<4xf64>) -> tensor<4xf64> {
  %1 = stablehlo.tan %arg0 : tensor<4xf64>
  func.return %1 : tensor<4xf64>
}

==>

func.func @tan_op_non_complex(%arg0: tensor<4xf64>) -> tensor<4xf64> {
  %0 = stablehlo.sine %arg0 : tensor<4xf64>
  %1 = stablehlo.cosine %arg0 : tensor<4xf64>
  %2 = stablehlo.divide %0, %1 : tensor<4xf64>
  return %2 : tensor<4xf64>
}

الخيارات

-target : The target version. Must be a version of the form #.#.#.

-stablehlo-convert-to-signless

يجب تمرير القيمة لتحويل IR إلى أعداد صحيحة بدون علامة.

-stablehlo-legalize-composite-to-call

استبدال العمليات المركبة باستدعاء لدمج العمليات

تستبدل العمليات المركبة باستدعاء لتفكيكها، مثل ما يلي:

stablehlo.composite "my_namespace.my_op" %arg0, %arg1 {
  decomposition = @bar,
  version = 1,
  composite_attributes = {
    "my_attribute": "my_value"
  }
}

ستصبح:

func.call @bar(%arg0, %arg1)

يمكن استثناء مجموعة فرعية من العناصر المركبة من عملية التحويل هذه باستخدام العلامة "except"، على سبيل المثال:

stablehlo-opt --stablehlo-legalize-composite-to-call=except='foo.baz,foo.qux'

الخيارات

-except : Names of composites that should not be replaced with calls.

-stablehlo-legalize-deprecated-ops

استخدام العمليات المُسنَنة بدلاً من العمليات المتوافقة جيدًا:

تقترح RFC‏ (#2283) بشأن إيقاف مجموعات عمليات StableHLO v1.0 نهائيًا إزالة العديد من العمليات المكرّرة. يساعد هذا الإجراء في تقييم تأثير عمليات إزالة op هذه في مسارات المعالجة المختلفة من خلال تحويلها إلى الإصدارات المتوافقة على المدى الطويل.

الخيارات

-fail-on-unused : Fail on (mostly) unused ops that are deprecated without any fallback.

-stablehlo-legalize-qdq-to-quantized-op

دمج نمط (إزالة التقريب وإجراء العمليات بنقطة عائمة والتقريب) في عملية التقريب في StableHLO

دمج نمط (إزالة التجزئة، وعمليات النقطة العائمة والتجزئة) في عملية StableHLO المقسّمة ملاحظة: لا تحذف الخطوة أي عملية حالية. على سبيل المثال، البرنامج التالي

func.func @add(%arg0: tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>) -> tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>> {
  %0 = stablehlo.uniform_dequantize %arg0 : (tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>) -> tensor<16x16xf32>
  %1 = stablehlo.abs %0 : tensor<16x16xf32>
  %2 = stablehlo.uniform_quantize %1 : (tensor<16x16xf32>) -> tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>
  func.return %2 : tensor<16x16x!quant.uniform<ui8:f32, 34.0:16>>
}

ستصبح:

func.func @add(%arg0: tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>) -> tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>> {
  %0 = stablehlo.uniform_dequantize %arg0 : (tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>) -> tensor<16x16xf32>
  %1 = stablehlo.abs %0 : tensor<16x16xf32>
  %2 = stablehlo.abs %arg0 : tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>
  %3 = stablehlo.uniform_quantize %1 : (tensor<16x16xf32>) -> tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>
  return %2 : tensor<16x16x!quant.uniform<u8:f32, 3.400000e+01:16>>
}

-stablehlo-legalize-quant-to-math

التحويل من العمليات المحوَّلة إلى أرقام ثنائية في StableHLO إلى العمليات الحسابية الأساسية في StableHLO

حوِّل برامج StableHLO التي تستخدم أنواع UniformQuantized إلى عمليات رياضية عددية مكافئة من الناحية الدلالية.

func.func @add(%arg0: tensor<!quant.uniform<i8:f32,1.0:0>>, %arg1: tensor<!quant.uniform<i8:f32,2.0:1>>) ->  tensor<!quant.uniform<i8:f32,3.0:2>> {
  %0 = "stablehlo.add"(%arg0, %arg1) : (tensor<!quant.uniform<i8:f32,1.0:0>>, tensor<!quant.uniform<i8:f32,2.0:1>>) -> tensor<!quant.uniform<i8:f32,3.0:2>>
  func.return %0 : tensor<!quant.uniform<i8:f32,3.0:2>>
}

ستصبح:

func.func @add(%arg0: tensor<i8>, %arg1: tensor<i8>) -> tensor<i8> {
  %0 = stablehlo.convert %arg0 : (tensor<i8>) -> tensor<f32>
  %cst = stablehlo.constant dense<0.333333343> : tensor<f32>
  %1 = chlo.broadcast_multiply %0, %cst : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %cst_0 = stablehlo.constant dense<2.000000e+00> : tensor<f32>
  %2 = chlo.broadcast_add %1, %cst_0 : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %3 = stablehlo.round_nearest_even %2 : tensor<f32>
  %4 = stablehlo.convert %3 : (tensor<f32>) -> tensor<i32>
  %5 = stablehlo.convert %arg1 : (tensor<i8>) -> tensor<f32>
  %cst_1 = stablehlo.constant dense<0.666666686> : tensor<f32>
  %6 = chlo.broadcast_multiply %5, %cst_1 : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %cst_2 = stablehlo.constant dense<1.33333337> : tensor<f32>
  %7 = chlo.broadcast_add %6, %cst_2 : (tensor<f32>, tensor<f32>) -> tensor<f32>
  %8 = stablehlo.round_nearest_even %7 : tensor<f32>
  %9 = stablehlo.convert %8 : (tensor<f32>) -> tensor<i32>
  %c = stablehlo.constant dense<2> : tensor<i32>
  %10 = chlo.broadcast_add %4, %9 : (tensor<i32>, tensor<i32>) -> tensor<i32>
  %11 = chlo.broadcast_subtract %10, %c : (tensor<i32>, tensor<i32>) -> tensor<i32>
  %c_3 = stablehlo.constant dense<-128> : tensor<i32>
  %c_4 = stablehlo.constant dense<127> : tensor<i32>
  %12 = stablehlo.clamp %c_3, %11, %c_4 : tensor<i32>
  %13 = stablehlo.convert %12 : (tensor<i32>) -> tensor<i8>
  return %13 : tensor<i8>
}

-stablehlo-legalize-quantized-op-to-qdq

استخدم نمط (إلغاء التجميع، وإجراء حسابي باستخدام النقطة العائمة، والتجميع) لتقسيم عملية StableHLO التي تم تجميعها.

تحليل البرامج التي تم تحويلها إلى تنسيق StableHLO باستخدام عمليات تحويل موحّدة إلى تنسيق/تحويل من تنسيق على سبيل المثال، البرنامج التالي

func.func @add(%arg0: tensor<!quant.uniform<i8:f32,1.0:0>>, %arg1: tensor<!quant.uniform<i8:f32,2.0:1>>) ->  tensor<!quant.uniform<i8:f32,3.0:2>> {
  %0 = "stablehlo.add"(%arg0, %arg1) : (tensor<!quant.uniform<i8:f32,1.0:0>>, tensor<!quant.uniform<i8:f32,2.0:1>>) -> tensor<!quant.uniform<i8:f32,3.0:2>>
  func.return %0 : tensor<!quant.uniform<i8:f32,3.0:2>>
}

ستصبح:

func.func @add(%arg0: tensor<!quant.uniform<i8:f32, 1.000000e+00>>, %arg1: tensor<!quant.uniform<i8:f32, 2.000000e+00:1>>) -> tensor<!quant.uniform<i8:f32, 3.000000e+00:2>> {
  %0 = stablehlo.uniform_dequantize %arg0 : (tensor<!quant.uniform<i8:f32, 1.000000e+00>>) -> tensor<f32>
  %1 = stablehlo.uniform_dequantize %arg1 : (tensor<!quant.uniform<i8:f32, 2.000000e+00:1>>) -> tensor<f32>
  %2 = stablehlo.add %0, %1 : tensor<f32>
  %3 = stablehlo.uniform_quantize %2 : (tensor<f32>) -> tensor<!quant.uniform<i8:f32, 3.000000e+00:2>>
  return %3 : tensor<!quant.uniform<i8:f32, 3.000000e+00:2>>
}

-stablehlo-legalize-to-vhlo

إضفاء الشرعية على StableHLO إلى VHLO

-stablehlo-refine-arguments

يُحسِّن أشكال الوسيطات للدالة الرئيسية.

يُعدِّل وسيطات الدالة الرئيسية باستخدام توقيع نوع الإدخال. لتغليف الوسيطات في custom_call @stablehlo.shape_refinement_operand_wrapper للحفاظ على صلاحية IR قبل تشغيل تحسين الشكل.

func.func public @main(%arg0: tensor<?xf32>) -> tensor<?xf32> {
  ...
}

==>

func.func public @main(%arg0: tensor<16xf32>) -> tensor<?xf32> {
  %c = stablehlo.constant dense<16> : tensor<1xi64>
  %0 = stablehlo.custom_call @stablehlo.shape_refinement_operand_wrapper(%arg0, %c) {...}
    : (tensor<16xf32>, tensor<1xi64>) -> tensor<?xf32>
  ...

يمكن استخدام refinedTypesOption لتحديد قائمة بالأنواع المحسّنة. يمكن تحديد ذلك في MLIR باستخدام --types='tensor<...>,tensor<...>'، أو تمريره إلى طريقة إنشاء البطاقة. يجب أن تحدِّد قائمة أنواع التحسين نوع كلّ مَعلمة من مَعلمات طريقة main التي يتم تحسينها.

الخيارات

-types : The new types to be used for the main function's arguments, specified as an MLIR TypeRange 'tensor<1x2xf32>, ...'

-stablehlo-refine-shapes

تحسين الأشكال في برنامج StableHLO

يشرح هذا الفيديو برنامج StableHLO الذي يُحسِّن الأشكال ضمن العمليات.

وتشمل حالة الاستخدام الرئيسية لهذا الترخيص تخصيص البرامج التي تتضمّن أشكالًا ديناميكية لأشكال ثابتة. إذا كان برنامج StableHLO الذي يتضمّن أشكالًا ديناميكية يتضمّن البنية الصحيحة، سيؤدي تعديل أنواع وسيطاته من الأشكال الديناميكية إلى الأشكال الثابتة وتنفيذ هذه الخطوة إلى نشر الأشكال الثابتة في البرنامج.

تزيل هذه الخطوة custom_call @shape_refinement_operand_wrapper من خلال استبدال استخدامات النتيجة بالم Operand مباشرةً، ونشر الأشكال الثابتة في جميع أنحاء البرنامج.

  %c = stablehlo.constant dense<16> : tensor<1xi64>
  %0 = stablehlo.custom_call @stablehlo.shape_refinement_operand_wrapper(%arg0, %c) {...}
      : (tensor<16xf32>, tensor<1xi64>) -> tensor<?xf32>
  %1 = stablehlo.add %0, %0 : tensor<?xf32>

  ==>

  %1 = stablehlo.add %arg0, %arg0 : tensor<16xf32>

يجب أن تتضمّن الوحدات الصالحة لتحسين الشكل السمات التالية:

  • تعتمد جميع الأشكال الديناميكية على أشكال الإدخال فقط (لا تعتمد أي شكل على محتوى صفيف الإدخال). نشير إلى العمليات التي تعتمد بشكل تبادلي على أشكال الإدخال فقط (على سبيل المثال، كما هو موضّح في stablehlo.get_dimension_size) أو الثوابت الشاملة، مثل قيم الأرقام الصحيحة الرمزية التي تم حلّها (أي مصفوفة : A = 5)، باسم dimension عمليات. يمكن تحويل جميع قيم السمات إلى ثوابت من خلال تجميع الثوابت بين الإجراءات.
  • يمكن أن تأخذ الدوالّ الوسيطة عددًا من وسيطات الرموز (من النوع !stablehlo.token) في بداية قائمة الوسائط، متبوعة ببعض الوسيطات الثابتة الشاملة التي تكون عددية قياسية ثابتة، مثل القيم التي تم حلّها للأرقام الصحيحة الرمزية (أي مصفوفة : A = 5).
  • قد تعرض بعض الدوالّ الوسيطة عمليات حسابية على الثوابت الشاملة، أي floordiv على قيم symint. يتم الإشارة إلى هذه الدوال من خلال عرض قيم ثابتة فقط بعد التحسين. يتم تضمين هذه الدوال.
  • يتم تحويل جميع طلبات الدالة الواحدة إلى أشكال الوسيطات نفسها، ولا يتم إجراء طلبات دوال متكررة / متكررة مشترَكة. ### -vhlo-legalize-to-stablehlo

إضفاء الشرعية على VHLO إلى StableHLO

-vhlo-to-version

التحويل بين إصدارات VHLO

الخيارات

-target : The target version. Must be a version of the form #.#.# .