-chlo-legalize-to-stablehlo

CHLO ops ফ্লো থেকে StableHLO এবং Shape ops এ বৈধ করে

-shape-legalize-to-stablehlo

StableHLO-তে আকৃতি-সম্পর্কিত অপারেশনগুলিকে বৈধ করুন।

একটি পরীক্ষামূলক পাস যা আকৃতি-সম্পর্কিত অপারেশনগুলিকে StableHLO অপ্সকে বৈধ করে।

একটি ঐচ্ছিক পাসের মাধ্যমে আকৃতি এবং ডেটা কম্পিউটেশন একত্রে আনার ফলে StableHLO ইকোসিস্টেমের পক্ষে সম্ভাব্যভাবে কম্পাইলেশন পাইপলাইনগুলিকে লিভারেজ করা সম্ভব হবে যা StableHLO ক্রিয়াকলাপগুলিকে গতিশীলতার মডেল করতে ব্যবহার করে৷

-stablehlo-aggressive-folder

Folds StableHLO অপারেশন

অপশন

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

-stablehlo-aggressive-simplification

StableHLO অপারেশনকে ক্যানোনিকালাইজ করে

-stablehlo-canonicalize-dynamism

গতিশীল StableHLO অপ্সকে স্ট্যাটিক অপস-এ ক্যানোনিকালাইজ করে।

DynamicReshapeOp-এর মতো ডায়নামিক StableHLO ops-কে সংশ্লিষ্ট স্ট্যাটিক কাউন্টারপার্টের সাথে প্রতিস্থাপন করে যেমন 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 ops আপডেট পায় বা সর্বশেষ সংস্করণে নতুন op চালু করা হয়। এই অপ্ট-ইন পাসটি পুরানো StableHLO সংস্করণগুলির সাথে নতুন StableHLO ক্রিয়াকলাপগুলিকে সেই পুরানো সংস্করণগুলির দ্বারা সমর্থিত সমতুল্য ক্রিয়াকলাপে পচিয়ে দিয়ে পিছনের সামঞ্জস্যকে প্রসারিত করে৷

কেন এটি একটি অপ্ট-ইন পাস?

মাঝে মাঝে, StableHLO op বর্ধিতকরণগুলি 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-complex-math-expander

StableHLO জটিল গণিত ক্রিয়াকলাপের জন্য এক্সপান্ডার।

StableHLO জটিল গণিত অপারেশনগুলি StableHLO বাস্তব গণিত অপারেশন ব্যবহার করে পচনশীল।

এই বিবৃতিটি এমন ধারণার উপর ভিত্তি করে তৈরি করা হয়েছে যে এমন কোনো হার্ডওয়্যার বিদ্যমান নেই যা স্থানীয়ভাবে জটিল সংখ্যা বা জটিল গণিত ক্রিয়াকলাপকে সমর্থন করে। এর মানে হল জটিল গণিত ক্রিয়াকলাপের ফলব্যাক প্রক্রিয়া যা কম্পাইলাররা প্রয়োগ করতে পারে, অপ্রয়োজনীয়। এই পাস সক্রিয় করার সাথে, সমস্ত StableHLO জটিল গণিত অপারেশন প্রসারিত হবে।

func.func @sqrt_op_complex(%arg0: tensor<4xcomplex<f64>>) -> tensor<4xcomplex<f64>> {
  %1 = stablehlo.sqrt %arg0 : tensor<4xcomplex<f64>>
  func.return %1 : tensor<4xcomplex<f64>>
}

==>

func.func @sqrt_op_complex(%arg0: tensor<4xcomplex<f64>>) -> tensor<4xcomplex<f64>> {
  TBD
  return %2 : tensor<4xcomplex<f64>>
}

-stablehlo-convert-to-signless

আইআরকে সাইনলেস পূর্ণসংখ্যাতে রূপান্তরিত করতে পাস করুন।

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

"ব্যতীত" পতাকা ব্যবহার করে এই রূপান্তর থেকে কম্পোজিটের একটি উপসেট বাদ দেওয়া যেতে পারে, যেমন:

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

ভাল-সমর্থিত অপ্স থেকে অবচয়িত অপ্সকে বৈধ করুন।

StableHLO v1.0 Opset Deprecations RFC (#2283) বেশ কিছু অপ্রয়োজনীয় অপস অপসারণের প্রস্তাব করেছে। এই পাস বিভিন্ন সংকলন পাইপলাইনে এই অপ অপসারণের প্রভাবকে তাদের দীর্ঘমেয়াদী সমর্থিত প্রতিপক্ষের কাছে বৈধ করে মূল্যায়ন করতে সাহায্য করে।

অপশন

-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 quantized ops থেকে 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<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

কোয়ান্টাইজড স্টেবলএইচএলও অপারেশনকে (ডি-কোয়ান্টাইজ, ফ্লোটিং-পয়েন্ট অপারেশন এবং কোয়ান্টাইজ) প্যাটার্নে পচন।

ইউনিফর্ম কোয়ান্টাইজ/ডিকুয়ান্টাইজ অপারেশন ব্যবহার করে স্টেবলএইচএলও কোয়ান্টাইজড প্রোগ্রামগুলি পচন করা। উদাহরণস্বরূপ, নিম্নলিখিত প্রোগ্রাম

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

প্রধান ফাংশনের আর্গুমেন্ট আকারগুলিকে পরিমার্জিত করে।

ইনপুট টাইপ স্বাক্ষর ব্যবহার করে প্রধান ফাংশনের আর্গুমেন্ট পরিবর্তন করে। শেপ রিফাইনমেন্ট চালানোর আগে IR বৈধ রাখতে custom_call @stablehlo.shape_refinement_operand_wrapper এ আর্গুমেন্টগুলি মোড়ানো হয়।

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 সরিয়ে দেয় এবং পুরো প্রোগ্রাম জুড়ে স্ট্যাটিক আকার প্রচার করে।

  %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 । এই ফাংশনগুলি শুধুমাত্র পরিমার্জন করার পরে ধ্রুবক মান ফিরিয়ে দিয়ে নির্দেশিত হয়। এই ফাংশন ইনলাইন করা হয়.
  • একটি একক ফাংশনের সমস্ত কল একই আর্গুমেন্ট আকারে সমাধান করে এবং কোনো পুনরাবৃত্ত/কো-রিকারসিভ ফাংশন কল করা হয় না। ### -vhlo-legalize-to-stablehlo

VHLO-কে StableHLO-তে বৈধ করুন।

-vhlo-to-version

VHLO এর সংস্করণগুলির মধ্যে রূপান্তর করুন।

অপশন

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

-chlo-legalize-to-stablehlo

CHLO ops ফ্লো থেকে StableHLO এবং Shape ops এ বৈধ করে

-shape-legalize-to-stablehlo

StableHLO-তে আকৃতি-সম্পর্কিত অপারেশনগুলিকে বৈধ করুন।

একটি পরীক্ষামূলক পাস যা আকৃতি-সম্পর্কিত অপারেশনগুলিকে StableHLO অপ্সকে বৈধ করে।

একটি ঐচ্ছিক পাসের মাধ্যমে আকৃতি এবং ডেটা কম্পিউটেশন একত্রে আনার ফলে StableHLO ইকোসিস্টেমের পক্ষে সম্ভাব্যভাবে কম্পাইলেশন পাইপলাইনগুলিকে লিভারেজ করা সম্ভব হবে যা StableHLO ক্রিয়াকলাপগুলিকে গতিশীলতার মডেল করতে ব্যবহার করে৷

-stablehlo-aggressive-folder

Folds StableHLO অপারেশন

অপশন

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

-stablehlo-aggressive-simplification

StableHLO অপারেশনকে ক্যানোনিকালাইজ করে

-stablehlo-canonicalize-dynamism

গতিশীল StableHLO অপ্সকে স্ট্যাটিক অপস-এ ক্যানোনিকালাইজ করে।

DynamicReshapeOp-এর মতো ডায়নামিক StableHLO ops-কে সংশ্লিষ্ট স্ট্যাটিক কাউন্টারপার্টের সাথে প্রতিস্থাপন করে যেমন 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 ops আপডেট পায় বা সর্বশেষ সংস্করণে নতুন op চালু করা হয়। এই অপ্ট-ইন পাসটি পুরানো StableHLO সংস্করণগুলির সাথে নতুন StableHLO ক্রিয়াকলাপগুলিকে সেই পুরানো সংস্করণগুলির দ্বারা সমর্থিত সমতুল্য ক্রিয়াকলাপে পচিয়ে দিয়ে পিছনের সামঞ্জস্যকে প্রসারিত করে৷

কেন এটি একটি অপ্ট-ইন পাস?

মাঝে মাঝে, StableHLO op বর্ধিতকরণগুলি 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-complex-math-expander

StableHLO জটিল গণিত ক্রিয়াকলাপের জন্য এক্সপান্ডার।

StableHLO জটিল গণিত অপারেশনগুলি StableHLO বাস্তব গণিত অপারেশন ব্যবহার করে পচনশীল।

এই বিবৃতিটি এমন ধারণার উপর ভিত্তি করে তৈরি করা হয়েছে যে এমন কোনো হার্ডওয়্যার বিদ্যমান নেই যা স্থানীয়ভাবে জটিল সংখ্যা বা জটিল গণিত ক্রিয়াকলাপকে সমর্থন করে। এর মানে হল জটিল গণিত ক্রিয়াকলাপের ফলব্যাক প্রক্রিয়া যা কম্পাইলাররা প্রয়োগ করতে পারে, অপ্রয়োজনীয়। এই পাস সক্রিয় করার সাথে, সমস্ত StableHLO জটিল গণিত অপারেশন প্রসারিত হবে।

func.func @sqrt_op_complex(%arg0: tensor<4xcomplex<f64>>) -> tensor<4xcomplex<f64>> {
  %1 = stablehlo.sqrt %arg0 : tensor<4xcomplex<f64>>
  func.return %1 : tensor<4xcomplex<f64>>
}

==>

func.func @sqrt_op_complex(%arg0: tensor<4xcomplex<f64>>) -> tensor<4xcomplex<f64>> {
  TBD
  return %2 : tensor<4xcomplex<f64>>
}

-stablehlo-convert-to-signless

আইআরকে সাইনলেস পূর্ণসংখ্যাতে রূপান্তরিত করতে পাস করুন।

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

"ব্যতীত" পতাকা ব্যবহার করে এই রূপান্তর থেকে কম্পোজিটের একটি উপসেট বাদ দেওয়া যেতে পারে, যেমন:

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

ভাল-সমর্থিত অপ্স থেকে অবচয়িত অপ্সকে বৈধ করুন।

StableHLO v1.0 Opset Deprecations RFC (#2283) বেশ কিছু অপ্রয়োজনীয় অপস অপসারণের প্রস্তাব করেছে। এই পাস বিভিন্ন সংকলন পাইপলাইনে এই অপ অপসারণের প্রভাবকে তাদের দীর্ঘমেয়াদী সমর্থিত প্রতিপক্ষের কাছে বৈধ করে মূল্যায়ন করতে সাহায্য করে।

অপশন

-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 quantized ops থেকে 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<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

কোয়ান্টাইজড স্টেবলএইচএলও অপারেশনকে (ডি-কোয়ান্টাইজ, ফ্লোটিং-পয়েন্ট অপারেশন এবং কোয়ান্টাইজ) প্যাটার্নে পচন।

ইউনিফর্ম কোয়ান্টাইজ/ডিকুয়ান্টাইজ অপারেশন ব্যবহার করে স্টেবলএইচএলও কোয়ান্টাইজড প্রোগ্রামগুলি পচন করা। উদাহরণস্বরূপ, নিম্নলিখিত প্রোগ্রাম

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

প্রধান ফাংশনের আর্গুমেন্ট আকারগুলিকে পরিমার্জিত করে।

ইনপুট টাইপ স্বাক্ষর ব্যবহার করে প্রধান ফাংশনের আর্গুমেন্ট পরিবর্তন করে। শেপ রিফাইনমেন্ট চালানোর আগে IR বৈধ রাখতে custom_call @stablehlo.shape_refinement_operand_wrapper এ আর্গুমেন্টগুলি মোড়ানো হয়।

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 সরিয়ে দেয় এবং পুরো প্রোগ্রাম জুড়ে স্ট্যাটিক আকার প্রচার করে।

  %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 । এই ফাংশনগুলি শুধুমাত্র পরিমার্জন করার পরে ধ্রুবক মান ফিরিয়ে দিয়ে নির্দেশিত হয়। এই ফাংশন ইনলাইন করা হয়.
  • একটি একক ফাংশনের সমস্ত কল একই আর্গুমেন্ট আকারে সমাধান করে এবং কোনো পুনরাবৃত্ত/কো-রিকারসিভ ফাংশন কল করা হয় না। ### -vhlo-legalize-to-stablehlo

VHLO-কে StableHLO-তে বৈধ করুন।

-vhlo-to-version

VHLO এর সংস্করণগুলির মধ্যে রূপান্তর করুন।

অপশন

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