เดิมที StableHLO ใช้เงินลงทุนของตนเองจากภาษาถิ่น MHLO และรับค่ามาจากการนำการอนุมานประเภท MHLO มาใช้ ติดตามความคืบหน้าในการใช้งานใน status.md
หลักเกณฑ์ที่เสนอด้านล่างมีจุดประสงค์เพื่อให้แน่ใจว่ามีการใช้ตัวตรวจสอบคุณภาพสูงและฟังก์ชันการกำหนดรูปร่างสำหรับการดำเนินการ StableHLO
ข้อเสนอ
ข้อเสนอเหล่านี้มีผลกับทั้งการทบทวนการติดตั้งใช้งานที่มีอยู่และการบรรลุเป้าหมายใหม่ๆ จนกว่าจะครอบคลุมทั้งหมด
(P1) ใช้ข้อมูลจำเพาะของ StableHLO เป็นแหล่งข้อมูลที่เชื่อถือได้
specเป็นแหล่งข้อมูลที่เชื่อถือได้สำหรับเครื่องมือตรวจสอบและฟังก์ชันรูปร่างทั้งหมดของ ops StableHLO คุณจะต้องตรวจสอบตัวตรวจสอบที่มีอยู่และฟังก์ชันรูปร่างของทุกการดำเนินการอีกครั้งเพื่อให้สอดคล้องกับข้อกำหนดโดยสมบูรณ์ โปรดทราบว่าเอกสารข้อกำหนดเปลี่ยนแปลงอยู่เสมอ ในกรณีที่ไม่มีข้อมูลจำเพาะสำหรับการดำเนินการ ควรใช้การใช้งาน XLA เป็นแหล่งข้อมูลที่ถูกต้องแทน ซึ่งรวมถึง xla/service/shape_inference.cc และ xla/service/hlo_verifier.cc การนำ XLA ไปใช้นั้นไม่ครอบคลุมไดนามิกที่ไม่มีขอบเขต ดังนั้นเราจะใช้สามัญสำนึกจนกว่า RFC จะรองรับการเปลี่ยนแปลงนี้ได้อย่างอิสระ
(P2) ใช้ ODS ให้เกิดประโยชน์สูงสุด
ไฟล์ ODS (เช่น StablehloOps.td) จะกำหนด Ops ที่มีลักษณะและประเภทสำหรับตัวถูกดำเนินการ/แอตทริบิวต์/ผลลัพธ์แต่ละรายการและจะดำเนินการยืนยัน ดังนั้นจึงไม่จำเป็นต้องใช้รหัสยืนยันในเครื่องมือยืนยันหรือฟังก์ชันรูปร่างสำหรับที่พักที่ ODS รับประกันอยู่แล้ว นำรหัสยืนยันออกหากทำซ้ำกับ ODS เนื่องจากจะไม่มีการทริกเกอร์
เราต้องเพิ่มการทดสอบสำหรับข้อจำกัดจาก ODS ไหม โปรดดูกำหนดหลักเกณฑ์การทดสอบ
(P3) เก็บรักษารหัสยืนยันในเครื่องมือยืนยันและฟังก์ชันรูปร่าง
ทั้ง 2 อย่าง
- เครื่องมือยืนยัน: ติดตั้งใช้งานโดย
Op::verify()
และ - ฟังก์ชันรูปร่าง: นำมาใช้โดย
InferTypeOpInterface
เช่นOp::inferReturnTypes()
หรือOp::inferReturnTypeComponents
อาจมีรหัสยืนยันเพื่อตรวจสอบโอเปอแรนด์/แอตทริบิวต์/ผลลัพธ์ การแยกส่วนเริ่มต้นอาจเป็นดังนี้ ให้ผู้ตรวจสอบตรวจสอบตัวถูกดำเนินการ/แอตทริบิวต์ จากนั้นอนุญาตให้ฟังก์ชันรูปร่างคำนวณเฉพาะประเภทผลลัพธ์ที่อนุมาน และตรวจสอบความเข้ากันได้กับประเภทผลลัพธ์จริง แต่ในความเป็นจริงแล้วการแยกนี้มีปัญหาอยู่ 2-3 ข้อคือ
- ฟังก์ชัน
build()
ที่สร้างขึ้นโดยอัตโนมัติสามารถเรียกใช้ฟังก์ชันรูปร่างได้โดยไม่ต้องเรียกตัวตรวจสอบก่อน ดังนั้นอินพุตที่เกี่ยวข้องจะต้องได้รับการยืนยัน ในฟังก์ชันรูปร่างด้วย - โค้ดซ้ำกัน: เช่น ในเครื่องมือยืนยัน เราจะประมวลผลตัวถูกดำเนินการ จากนั้นยืนยันผลลัพธ์ที่อยู่ระหว่างกลาง จากนั้นในรูปร่างฟังก์ชัน ผลลัพธ์ระดับกลางเหล่านี้จะเป็นประโยชน์ในการอนุมานผลลัพธ์สุดท้าย ผลลัพธ์ระดับกลางเหล่านี้ต้องมีการคำนวณ 2 ครั้ง
- ภาระในการบำรุงรักษา: การยืนยันการดำเนินการมี 2 วิธีที่แตกต่างกัน
การแก้ปัญหามีดังนี้
สำหรับการดำเนินการส่วนใหญ่ที่ไม่มีภูมิภาค (เช่น
PadOp
): ลองใส่รหัสยืนยันทั้งหมดลงในฟังก์ชันรูปร่าง และทิ้งตัวตรวจสอบทั้งหมด ในกรณีที่ไม่สามารถทำเช่นนี้ได้เนื่องจากไม่สามารถอนุมานประเภทผลลัพธ์ (เช่น ด้วยReshapeOp
หรือBroadcastInDimOp
) ให้สร้างตัวยืนยันเพื่อให้มีตรรกะการยืนยันที่จำเป็น โดยทั่วไป Ops ที่อนุมานได้ เช่นAddOp
อาจจำเป็นต้องมีตัวยืนยันเพื่อดำเนินการยืนยันเพิ่มเติม เนื่องจากเป็นการยืนยันข้อจำกัดของประเภทผลลัพธ์ที่ระบุ ซึ่งเข้าถึงในวิธีการอนุมานประเภท/รูปร่างไม่ได้สำหรับการดำเนินการที่มีเขต (เช่น
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
เพิ่มการทดสอบผลบวกรายการเดียวใน infer_stablehlo.mlir เพื่อทดสอบอินเทอร์เฟซ
(ไม่บังคับ) หากการดำเนินการมีความซับซ้อนและอาจมีการทดสอบจำนวนมาก ให้พิจารณาเพิ่มไฟล์ทดสอบแยกต่างหากที่ชื่อว่า
verify_<op_name>.mlir
หรือverify_<your_topic>.mlir
ในโฟลเดอร์เดียวกัน