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