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 วิธีที่แตกต่างกัน
วิธีแก้ปัญหามีดังนี้
สำหรับการดำเนินการส่วนใหญ่ที่ไม่มีภูมิภาค (เช่น
PadOp
): ให้ใส่รหัสยืนยันทั้งหมดลงในฟังก์ชันรูปร่าง และทิ้งตัวตรวจสอบทั้งหมดสำหรับการดำเนินการที่มีเขต (เช่น
ReduceOp/IfOp
โปรดดูรายการแบบสมบูรณ์ที่นี่): เครื่องมือสร้างที่สร้างขึ้นอัตโนมัติจะไม่ใช้ภูมิภาคเป็นพารามิเตอร์ ดังนั้นหากเครื่องมือสร้างเหล่านี้เกี่ยวข้องกับการอนุมานประเภท ฟังก์ชันรูปร่างจะถูกเรียกด้วยพื้นที่ที่ว่างเปล่า (ดูตัวอย่างนี้)หากไม่จำเป็นต้องใช้ภูมิภาคสำหรับการอนุมานประเภท (เช่น
ReduceOp
) ให้ใส่ตรรกะการยืนยันที่เกี่ยวข้องกับภูมิภาคในเครื่องมือยืนยันแทนการใช้ฟังก์ชันรูปร่าง ทำซ้ำโค้ดบางอย่างหากหลีกเลี่ยงไม่ได้หากจำเป็นต้องใช้ภูมิภาคสำหรับการอนุมานประเภท (
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 ครั้ง
สิ่งที่ต้องทำ
เมื่อใช้หรือกลับไปตรวจสอบตัวยืนยันและ/หรือกำหนดฟังก์ชันของการดำเนินการ
ใส่เคสที่เป็นบวกและเคสเชิงลบทั้งหมดไว้ใน ops_stablehlo.mlir
เพิ่มการทดสอบที่เป็นบวก 1 รายการใน infer_stablehlo.mlir เพื่อทดสอบอินเทอร์เฟซ
(ไม่บังคับ) หากการดำเนินการมีความซับซ้อนและอาจมีการทดสอบจำนวนมาก ให้ลองเพิ่มไฟล์ทดสอบแยกต่างหากที่ชื่อว่า
verify_<op_name>.mlir
หรือverify_<your_topic>.mlir
ในโฟลเดอร์เดียวกัน