ล่าม StableHLO

เป้าหมายหลักของล่าม 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 รายการในหมวดหมู่นี้ซึ่งล่ามไม่รองรับ ช่วงเวลา:

  • FftOp
  • RngOp
  • RngBitGeneratorOp

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