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