-chlo-legalize-to-stablehlo

ทำให้ถูกต้องตามกฎหมายจากขั้นตอนการดําเนินการ CHLO ไปยัง StableHLO และ Shape Operations

-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 เสนอให้นําการดําเนินการหลายรายการที่ซ้ำซ้อนออก สิทธิ์นี้ช่วยประเมินผลกระทบของการนําการดําเนินการเหล่านี้ออกในไปป์ไลน์การคอมไพล์ต่างๆ โดยทำให้การดําเนินการเหล่านี้ถูกต้องตามกฎหมายเทียบกับการดำเนินการที่รองรับในระยะยาว

ตัวเลือก

-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 ที่ปรับแต่งรูปร่างภายในการดำเนินการ

Use Case หลักของพาสนี้คือการเปลี่ยนโปรแกรมที่มีรูปร่างแบบไดนามิกเป็นรูปร่างแบบคงที่ หากโปรแกรม 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 ในค่า symint ฟังก์ชันเหล่านี้จะระบุด้วยการคืนค่าคงที่หลังจากการปรับแต่งเท่านั้น ฟังก์ชันเหล่านี้จะฝังอยู่
  • การเรียกฟังก์ชันเดียวทั้งหมดจะเปลี่ยนรูปแบบอาร์กิวเมนต์เป็นรูปแบบเดียวกัน และไม่มีการเรียกใช้ฟังก์ชันแบบซ้ำซ้อน / แบบร่วมซ้ำซ้อน ### -vhlo-legalize-to-stablehlo

เปลี่ยน VHLO เป็น StableHLO

-vhlo-to-version

แปลงระหว่างเวอร์ชันต่างๆ ของ VHLO

ตัวเลือก

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