เป้าหมายหลักของล่าม StableHLO คือการให้ข้อมูลอ้างอิง
การนำความหมายของแนวคิด StableHLO มาปรับใช้
เป้าหมายรองคือให้การปรับใช้อย่างใกล้ชิด
ข้อมูลจำเพาะ ซึ่งให้ความอ่านง่ายมากกว่าประสิทธิภาพ เพื่อให้ความชัดเจนยิ่งขึ้น
ต่อความหมายของการดำเนินการที่เกี่ยวข้องที่สุดอย่าง Convolution
Gather/Scatter และ DotGeneral
ในขณะนี้ OpenXLA รองรับการตีความ 91 จาก 96 คะแนน
การดำเนินการ HLO ที่เสถียร การดำเนินการ 3 รายการที่เหลือ (FftOp, RngOp, RngBitGeneratorOp) มี
อรรถศาสตร์ของตนถูกบันทึกไว้ใน
spec.md และมี
ได้ดำเนินการตรวจสอบเบื้องต้นเกี่ยวกับวิธีการดำเนินการต่อแล้ว (ดู
status.md
เพื่อดูรายการการดำเนินการทั้งหมดและสถานะล่าสุด) ขั้นสุดท้าย
การเพิ่มประสิทธิภาพจะได้รับการนำไปใช้กับชุมชนที่จำเป็น
ขอบเขต
เราได้จัดหมวดหมู่เครื่องมือ StableHLO เป็น 11 หมวดหมู่ ซึ่งประกอบด้วยการดำเนินการ 118 รายการใน ทั้งหมด (ดูภาคผนวก) การใช้งานข้อมูลอ้างอิง สตรีมงานจะจัดระเบียบงานด้านการใช้งานล่าม สำหรับการดำเนินการ StableHLO 100% ตามที่ระบุไว้ในข้อกำหนด StableHLO เรา วางแผนที่จะทำงานทั้งหมดหรือเกือบทั้งหมดให้เสร็จในสตรีมงานนี้ใน StableHLO v1.0 จากการดำเนินการ 96 รายการที่มีข้อมูลจำเพาะในปัจจุบัน เราตีความการดำเนินการ 91 ครั้งผ่าน OpenXLA (ดูกรณีพิเศษสำหรับอีก 5 กรณีที่เหลือ)
ข้อมูลจำเพาะ
ข้อกำหนดหลักสำหรับล่ามคือการโต้ตอบแบบ 1:1 กับ ข้อกำหนด ข้อกำหนดนี้จะช่วยให้กำหนดมาตรฐานล่ามให้กับการดำเนินการที่คล้ายกันซึ่ง ซึ่งจะนำไปสู่การใช้งานล่ามคุณภาพสูงแบบแยกส่วน
คดีพิเศษ
เบ็ดเตล็ด
หมวดหมู่นี้มีปฏิบัติการที่ย่อยได้ซึ่งมีอนาคตที่ไม่ชัดเจนในขณะนี้ มี เป็นการดำเนินการ 3 รายการในหมวดหมู่นี้ซึ่งล่ามไม่รองรับ ช่วงเวลา:
FftOpRngOpRngBitGeneratorOp
FftOp จัดอยู่ในหมวดหมู่เบ็ดเตล็ด แต่แตกต่างจากการดำเนินการอื่นๆ ในหมวดหมู่นี้
กระบวนการนี้ไม่มี Extender Pass และการสนับสนุนนี้ใน StableHLO คือ
อยู่ระหว่างดำเนินการ
สามารถแยก RngOp และ RngBitGeneratorOp เป็น MHLO Ops ได้ แต่
decomposition ทำให้เกิด XlaRngGetAndUpdateStateOp ซึ่งเป็น MHLO ที่เฉพาะเจาะจง
การดำเนินการ การสนับสนุนการตีความทั้งสองสิ่งนี้เป็นการดำเนินการทางกฎหมาย
เครื่องมือในการแปลงการดำเนินการที่เหลือในหมวดหมู่นี้เป็น Ops ของ StableHLO อินเตอร์พรีเตอร์รองรับอยู่ใน hlo_expand_main.cc
ไม่ได้อยู่ใน HLO
นอกเหนือจากการดำเนินการที่กำหนดแล้ว หมวดหมู่นี้ยังประกอบด้วยการดำเนินการที่ไม่ได้ระบุ 8 รายการ (โปรดดู StableHLO Ops category) ซึ่งมีแผนจะ ย้ายออกจาก StableHLO การดำเนินการเหล่านี้ส่วนใหญ่มีบัตรผ่านใน mhlo ไปยัง ให้แปลงเป็นการดำเนินการที่เทียบเท่า StableHLO
เครื่องมือในการแปลงการดำเนินการที่เหลือในหมวดหมู่นี้เป็นปฏิบัติการ StableHLO ที่เทียบเท่า ที่ล่ามรองรับจะอยู่ใน mlir-hlo-opt.cc
การกำหนดปริมาณ
การรองรับล่ามสำหรับการดำเนินการ stablehlo.constant ที่มีประเภทที่เล็กลงคือ
ไม่รองรับและติดตามผ่าน
#1691
วิธีการใช้งาน
การสร้างล่ามอ้างอิง
สร้างและทดสอบล่ามได้ผ่าน Bazel หรือ CMake (แนะนำ) สำหรับแบบเต็ม โปรดดูคำแนะนำที่ README.md
บาเซล:
bazel build //...
ผู้ผลิต:
mkdir -p build && cd build
cmake .. -GNinja \
-DLLVM_ENABLE_LLD="$LLVM_ENABLE_LLD" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=On \
-DMLIR_DIR=${PWD}/../llvm-build/lib/cmake/mlir
เรามีเครื่องมือแปลภาษาเพื่อตีความโปรแกรม StableHLO ในการเรียกใช้ล่าม ซึ่งเขียนด้วย MLIR
stablehlo-translate --interpret <path/to/program>
ภาษาล่าม
ภาษาInterpreterประกอบด้วยการดำเนินการด้านยูทิลิตีต่างๆ ที่เกี่ยวข้องกับ
เป็นล่าม โดยเฉพาะอย่างยิ่ง interpreter.run_parallel (โปรดดู
InterpreterOps.td
สำหรับความหมายและตัวอย่างการใช้งาน) การดำเนินการทำให้แปลภาษาของการดำเนินการเผยแพร่ และอื่นๆ ได้
แผนสาธารณูปโภคที่เพิ่มขึ้นตามความต้องการของชุมชน
ภาษาในการตรวจสอบ
ภาษาCheckใช้เพื่อเปรียบเทียบค่ารันไทม์ของล่ามกับที่คาดไว้
เอาต์พุตของโปรแกรม StableHLO สามารถทดสอบได้ผ่านการตรวจสอบต่างๆ (โปรดดู
CheckOps.td
สำหรับความหมายความเห็นและตัวอย่าง)
การเขียนโปรแกรมทดสอบ
เราใช้เครื่องมือไฟของ LLVM ในการเรียกใช้และ เปรียบเทียบกับไฟล์ที่สร้างขึ้นเพื่อแสดงความแตกต่างกับเอาต์พุตของล่าม (โปรดดู stablehlo/tests/interpret เช่น การทดสอบ)
กำลังทดสอบ AddOp (ตัวอย่างจาก
interpret_add.mlir):
// RUN: stablehlo-translate --interpret %s
func.func @add_op_scalar() {
%0 = stablehlo.constant dense<2> : tensor<i4>
%1 = stablehlo.constant dense<3> : tensor<i4>
%2 = stablehlo.add %0, %1 : tensor<i4>
check.expect_eq_const %2, dense<5> : tensor<i4>
func.return
}
การดำเนินการทดสอบในหมวดหมู่การเผยแพร่จำเป็นต้องเรียกใช้ผ่าน
ผู้ให้บริการสาธารณูปโภค interpreter.run_parallel
กำลังทดสอบ AllReduceOp (ตัวอย่างจาก
all_reduce.mlir):
// RUN: stablehlo-translate --interpret %s
module @cross_replica {
func.func public @all_reduce(%operand : tensor<4xi64>) -> tensor<4xi64> {
%result = "stablehlo.all_reduce"(%operand) ({
^bb0(%arg0: tensor<i64>, %arg1: tensor<i64>):
%0 = stablehlo.add %arg0, %arg1 : tensor<i64>
stablehlo.return %0 : tensor<i64>
}) {
replica_groups = dense<[[0, 1]]> : tensor<1x2xi64>,
channel_handle = #stablehlo.channel_handle<handle = 0, type = 0>
} : (tensor<4xi64>) -> tensor<4xi64>
return %result : tensor<4xi64>
}
func.func public @main() {
%inputs0 = stablehlo.constant dense<[1, 2, 3, 4]> : tensor<4xi64>
%inputs1 = stablehlo.constant dense<[5, 6, 7, 8]> : tensor<4xi64>
%results:2 = "interpreter.run_parallel"(%inputs0, %inputs1) {
programs=[[@all_reduce], [@all_reduce]]
} : (tensor<4xi64>, tensor<4xi64>) -> (tensor<4xi64>, tensor<4xi64>)
check.expect_eq_const %results#0, dense<[6, 8, 10, 12]> : tensor<4xi64>
check.expect_eq_const %results#1, dense<[6, 8, 10, 12]> : tensor<4xi64>
func.return
}
}
การแก้ไขข้อบกพร่อง StableHLO
ตามขั้นตอนการสร้าง StableHLO แล้ว ไบนารีของ StableHLO สำหรับเครื่องมือใน
stablehlo/tools ควรอยู่ใน /build/bin เครื่องมือแก้ไขข้อบกพร่องทั่วไป เช่น
GDB สามารถใช้เพื่อดำเนินการในโค้ดได้:
gdb --args ./build/bin/stablehlo-translate -allow-unregistered-dialect --interpret ./stablehlo/tests/interpret/<test>.mlir
ภาคผนวก
แปลงการดำเนินการเบ็ดเตล็ด
# batch_norm_grad
hlo-expand --batch_norm_grad_expander <path/to/hlo_module>
# batch_norm_inference
hlo-expand --batch_norm_inference_expander <path/to/hlo_module>
# batch_norm_training
hlo-expand --batch_norm_training_expander <path/to/hlo_module>
# cholesky
hlo-expand --cholesky_expander <path/to/hlo_module>
# constant
# Supported in StableHLO interpreter.
# fft
# TBD
# iota
# Supported in StableHLO interpreter.
# rng
# TBD
# rng_bit_generator
# TBD
# triangular_solve
hlo-expand --triangular_solve_expander <path/to/hlo_module>
แปลงไม่ได้อยู่ในการดำเนินการ HLO
# broadcast
mlir-hlo-opt -mhlo-legalize-broadcast-to-broadcast-in-dim <path/to/input>
# create_token
mlir-hlo-opt -mhlo-legalize-create-token-to-after-all <path/to/input>
# cross-replica-sum
mlir-hlo-opt -mhlo-legalize-cross-replica-sum-to-all-reduce <path/to/input>
# dot
mlir-hlo-opt -mhlo-legalize-dot-to-dot-general <path/to/input>
# einsum
mlir-hlo-opt -mhlo-legalize-einsum-to-dot-general <path/to/input>
# torch_index_select
mlir-hlo-opt -mhlo-legalize-torch-index-select-to-gather <path/to/input>
# unary_einsum
mlir-hlo-opt --canonicalize -mhlo-legalize-einsum-to-dot-general <path/to/input>
หมวดหมู่การดำเนินการของ StableHLO
| หมวดหมู่ | การช่วยจำ | รวม |
|---|---|---|
| 119 | ||
| ควบคุมโฟลว์ | after_all, case, if, optimize_barrier, ขณะที่ | 5 |
| การย้ายข้อมูล | Broadcast_in_dim, Concatenate, dynamic_slice, Dynamic_update_slice, รวบรวม, แผ่น, ปรับรูปร่าง, กลับ, กระจาย, แบ่งส่วน, จัดเรียง, สลับตำแหน่ง | 12 |
| การจัดจำหน่าย | all_gather, all_reduce, all_to_all,collective_permute, infeed, Outfeed, outfeed, Partition_id,เรคv,Reduce_scatter,จำรหัส_ส่ง, ส่ง | 11 |
| ความคิดวิพากษ์วิจารณ์ | Dynamic_broadcast_in_dim, Dynamic_conv, Dynamic_gather, Dynamic_iota, Dynamic_pad, Dynamic_reshape, get_dimension_size, Real_dynamic_slice, set_dimension_size | 9 |
| Elementwise | ตั้งใจ, ตั้งไว้, เพิ่มและดังที่นาฬิกาไว้ | 48 |
| ความสามารถในการขยายการใช้งาน | custom_call, get_tuple_element, ทูเพิล | 3 |
| เบ็ดเตล็ด | group_norm_grad, bar_norm_inference, block_norm_training, cholesky, ค่าคงที่, fft, iota, rng, rng_bit_generator, Triangular_solve | 10 |
| Modularity | การโทร, ฟัง, โมดูล, ย้อนกลับ | 4 |
| ไม่ได้อยู่ใน HLO | ประกาศ, create_token, Cross-replica-sum, จุด, einsum, torch_index_select, unary_einsum | 8 |
| การกำหนดปริมาณ | วัดจำนวนนับ | 2 |
| การลด | Convolution, dot_General, ลด, ลดกรอบเวลา, Select_and_scatter | 5 |