การอนุมานประเภท

StableHLO เดิมใช้ Bootstrapped จากภาษา MHLO และรับค่าการใช้ MHLO ในการอนุมานประเภท ระบบจะติดตามความคืบหน้าในการใช้งานใน status.md

หลักเกณฑ์ที่เสนอด้านล่างมีไว้เพื่อให้มั่นใจว่ามีการใช้ตัวตรวจสอบคุณภาพสูงและฟังก์ชันการกำหนดรูปร่างสำหรับการดำเนินการ StableHLO

ข้อเสนอ

ข้อเสนอเหล่านี้ใช้ได้กับทั้งการกลับไปใช้งานเดิมและการดำเนินการตามแนวทางใหม่จนกว่าจะครอบคลุมการใช้งานทั้งหมด

(P1) ใช้ข้อมูลจำเพาะของ StableHLO เป็นแหล่งข้อมูลที่ถูกต้อง

specเป็นแหล่งข้อมูลที่เชื่อถือได้สำหรับเครื่องมือตรวจสอบและฟังก์ชันการกำหนดรูปร่างทั้งหมดของการดำเนินการ StableHLO คุณต้องตรวจสอบตัวตรวจสอบที่มีอยู่และฟังก์ชันการกำหนดรูปร่างของการดำเนินการทุกรายการอีกครั้งเพื่อให้สอดคล้องกับข้อกำหนดอย่างสมบูรณ์ โปรดทราบว่าเอกสารข้อกำหนดมีการเปลี่ยนแปลงอยู่เสมอ ในกรณีที่ไม่มีข้อมูลจำเพาะสำหรับการดำเนินการ ควรใช้การใช้งาน XLA เป็นแหล่งที่มาของข้อเท็จจริงแทน รวมถึง xla/service/shape_inference.cc และ xla/service/hlo_verifier.cc การใช้ XLA ไม่ครอบคลุมไดนามิกที่ไร้ขอบเขต ดังนั้นเราจะใช้สามัญสำนึกจนกว่า RFC ที่มีความไดนามิกจะมีให้ใช้งาน

(P2) ใช้ ODS ให้เกิดประโยชน์สูงสุด

ไฟล์ ODS (เช่น StablehloOps.td) จะกำหนดการดำเนินการที่มีลักษณะและประเภทสำหรับตัวถูกดำเนินการ/แอตทริบิวต์/ผลลัพธ์แต่ละรายการ และจะทำการตรวจสอบ ดังนั้น จึงไม่จำเป็นต้องมีรหัสยืนยันในเครื่องมือยืนยันหรือฟังก์ชันการกำหนดรูปแบบสำหรับพร็อพเพอร์ตี้ที่ ODS รับประกันอยู่แล้ว นำรหัสยืนยันออกหากซ้ำกับ ODS เนื่องจากจะไม่มีการทริกเกอร์

เราต้องเพิ่มการทดสอบสำหรับข้อจำกัดจาก ODS ไหม โปรดดูกำหนดหลักเกณฑ์การทดสอบ

(P3) เก็บรักษารหัสยืนยันในเครื่องมือยืนยันและกำหนดรูปแบบฟังก์ชัน

ทั้ง 2 อย่าง

  • โปรแกรมยืนยัน: ติดตั้งใช้งานโดย Op::verify() และ
  • ฟังก์ชันรูปร่าง: ติดตั้งใช้งานโดย InferTypeOpInterface เช่น Op::inferReturnTypes() หรือ Op::inferReturnTypeComponents

อาจมีรหัสยืนยันเพื่อตรวจสอบตัวถูกดำเนินการ/แอตทริบิวต์/ผลลัพธ์ การแยกตอนเริ่มต้นอาจเป็นดังนี้ ให้ผู้ตรวจสอบตรวจสอบตัวถูกดำเนินการ/แอตทริบิวต์ จากนั้นอนุญาตให้ฟังก์ชันรูปร่างคำนวณเฉพาะประเภทผลลัพธ์ที่อนุมานและตรวจสอบความเข้ากันได้กับประเภทผลลัพธ์จริง แต่ในความเป็นจริง การแยกนี้มีปัญหาอยู่ 2-3 ข้อ ดังนี้

  • ฟังก์ชัน build() ที่สร้างขึ้นโดยอัตโนมัติสามารถเรียกใช้ฟังก์ชันรูปร่างได้โดยไม่ต้องเรียกตัวยืนยันก่อน ดังนั้นอินพุตที่เกี่ยวข้องจะต้องได้รับการยืนยัน ในฟังก์ชันรูปร่างด้วย
  • โค้ดซ้ำกัน: ตัวอย่างเช่น ในเครื่องมือยืนยัน เราจะประมวลผลตัวถูกดำเนินการบางส่วน จากนั้นยืนยันผลลัพธ์ที่อยู่ระหว่างกลาง ฟังก์ชันรูปร่างของฟังก์ชัน ผลลัพธ์ระดับกลางเหล่านี้มีประโยชน์ในการอนุมานผลลัพธ์สุดท้าย โดยจะต้องคำนวณผลลัพธ์ขั้นกลางเหล่านี้ 2 ครั้ง
  • ภาระในการบำรุงรักษา: การตรวจสอบการดำเนินการมี 2 วิธีที่แตกต่างกัน

วิธีแก้ปัญหามีดังนี้

  1. สำหรับการดำเนินการส่วนใหญ่ที่ไม่มีภูมิภาค (เช่น PadOp): ให้ใส่รหัสยืนยันทั้งหมดลงในฟังก์ชันรูปร่าง และทิ้งตัวตรวจสอบทั้งหมด

  2. สำหรับการดำเนินการที่มีเขต (เช่น ReduceOp/IfOp โปรดดูรายการแบบสมบูรณ์ที่นี่): เครื่องมือสร้างที่สร้างขึ้นอัตโนมัติจะไม่ใช้ภูมิภาคเป็นพารามิเตอร์ ดังนั้นหากเครื่องมือสร้างเหล่านี้เกี่ยวข้องกับการอนุมานประเภท ฟังก์ชันรูปร่างจะถูกเรียกด้วยพื้นที่ที่ว่างเปล่า (ดูตัวอย่างนี้)

    1. หากไม่จำเป็นต้องใช้ภูมิภาคสำหรับการอนุมานประเภท (เช่น ReduceOp) ให้ใส่ตรรกะการยืนยันที่เกี่ยวข้องกับภูมิภาคในเครื่องมือยืนยันแทนการใช้ฟังก์ชันรูปร่าง ทำซ้ำโค้ดบางอย่างหากหลีกเลี่ยงไม่ได้

    2. หากจำเป็นต้องใช้ภูมิภาคสำหรับการอนุมานประเภท (IfOp/CaseOp/MapOp) นอกจากนี้ ฟังก์ชันรูปร่างจะต้องยืนยันว่าเขตต่างๆ ไม่ว่างเปล่าอย่างชัดแจ้ง แม้ว่า ODS อาจรับประกันการมีอยู่ของภูมิภาคในคำจำกัดความของ Op อยู่แล้ว

(P4) กำหนดหลักเกณฑ์การทดสอบ

เราต้องเพิ่ม/ดูแลรักษาการทดสอบสำหรับการยืนยันที่ครอบคลุมโดย ODS ไหม

แต่ไม่ต้องกังวล การทดสอบควรมุ่งเน้นที่เครื่องมือยืนยันและฟังก์ชันของการกำหนดรูปแบบ ในขณะที่การเปลี่ยนแปลงใน ODS จะต้องทบทวนการทดสอบนี้

แต่โปรดระวังเกี่ยวกับองค์ประกอบที่หายไป เช่น หาก op มีลักษณะ SameOperandsAndResultShape ซึ่งจะตรวจสอบเฉพาะรูปร่าง แต่ไม่ตรวจสอบประเภทองค์ประกอบ การยืนยันประเภทของตัวถูกดำเนินการ/ผลลัพธ์ก็ยังคงต้องทดสอบ

เราจะทดสอบโปรแกรมตรวจสอบและพิมพ์การอนุมานได้จากที่ไหน

ops_stablehlo.mlir ประกอบด้วยกรณีของ Ops ที่เป็นบวก และการทดสอบเชิงลบ 1 ครั้งสำหรับข้อผิดพลาดในการยืนยันทั้งหมด นอกจากนี้ยังตรวจสอบได้ว่าประเภทผลลัพธ์ที่ได้จากการอนุมานนั้นใช้ร่วมกันได้กับประเภทผลการค้นหาจริง (ไม่เหมือนกับ!)

infer_stablehlo.mlir จะตรวจสอบการมีอยู่ของฟังก์ชันรูปร่างของ op ต่อบรรทัดด้วย hlo_test_infer.get_return_type_components"(%x):... และตรวจสอบว่าประเภทที่อนุมานนั้นตรงทุกประการกับที่คาดไว้ โดยทั่วไปมีผลการทดสอบเป็นบวก 1 รายการต่อการทดสอบ 1 ครั้ง

สิ่งที่ต้องทำ

เมื่อใช้หรือกลับไปตรวจสอบตัวยืนยันและ/หรือกำหนดฟังก์ชันของการดำเนินการ

  1. ใส่เคสที่เป็นบวกและเคสเชิงลบทั้งหมดไว้ใน ops_stablehlo.mlir

  2. เพิ่มการทดสอบที่เป็นบวก 1 รายการใน infer_stablehlo.mlir เพื่อทดสอบอินเทอร์เฟซ

  3. (ไม่บังคับ) หากการดำเนินการมีความซับซ้อนและอาจมีการทดสอบจำนวนมาก ให้ลองเพิ่มไฟล์ทดสอบแยกต่างหากที่ชื่อว่า verify_<op_name>.mlir หรือ verify_<your_topic>.mlir ในโฟลเดอร์เดียวกัน