-sdy-close-shardings
ปิดการแยกกลุ่มเทนเซอร์และลบแกนที่ทำซ้ำ
-sdy-drop-sharding-rules
นำ OpShardingRuleAttr
ออกจากการดำเนินการที่ลงทะเบียนทั้งหมด
-sdy-insert-explicit-reshards
แทรกการแยกส่วนใหม่อย่างชัดเจนเพื่อให้การดำเนินการทั้งหมดมีการแยกส่วนที่เข้ากันได้
โดยทั่วไปแล้ว การแยกส่วนที่เข้ากันได้หมายความว่าการดำเนินการจะยอมรับโอเปอเรนด์ที่แยกส่วนและสร้างผลลัพธ์ที่แยกส่วนได้โดยไม่ต้องมีการแยกส่วนการสื่อสาร (โปรดทราบว่าการดำเนินการอาจยังคงต้องมีการสื่อสาร เช่น การลดข้อมูลทั้งหมดหรือการแลกเปลี่ยนข้อมูล Halo)
หลังจากการนำไปใช้งานแล้ว การดำเนินการบางอย่างอาจยังคงมีการแยกส่วนที่ไม่เข้ากันได้
โปรดทราบว่าเมื่อใช้แกน (หรือแกนย่อย) เพื่อแบ่งกลุ่มมิติข้อมูลที่ไม่ใช่คู่กัน (เช่น มิติข้อมูลที่ไม่ใช่การรวมใน matmul) ในเทนเซอร์หลายรายการ หรือเมื่อแกนแบ่งกลุ่มมิติข้อมูลในเทนเซอร์หนึ่ง แต่ไม่ได้แบ่งกลุ่มมิติข้อมูลที่เกี่ยวข้องในเทนเซอร์อีกรายการหนึ่ง ระบบจะถือว่าการดำเนินการดังกล่าวมีความขัดแย้งในการแบ่งกลุ่ม ดังนั้น หลังจากผ่านขั้นตอนนี้ การดำเนินการจะไม่มีการทับซ้อนกัน
พาสนี้จะแทรกการดำเนินการแยกกลุ่มใหม่อย่างชัดเจนเพื่อให้มิติข้อมูลที่เกี่ยวข้องได้รับการแยกกลุ่มในลักษณะเดียวกันสำหรับการดำเนินการแต่ละรายการ ในทุกโอเปอเรนดและผลลัพธ์ และทุกแกน (หรือแกนย่อย) จะใช้เพื่อแยกกลุ่มมิติข้อมูลประเภทเดียวได้เท่านั้น
ตัวอย่างที่ชี้แจง
อินพุต:
mesh = <"x"=4, "y"=2>
%lhs : tensor<8x32xf32> {sdy.sharding=<@mesh, \[{"y"},{"x"}\]>}
%rhs : tensor<32x16xf32> {sdy.sharding=<@mesh, \[{"y"}, {"x"}\]>}
stablehlo.dot %lhs, %rhs {sdy.sharding_per_value=<[<@mesh, \[{"x"}, {}\]>]>}
: (tensor<8x32xf32>, tensor<32x16xf32>) -> tensor<8x16xf32>
เอาต์พุต:
sdy.mesh = <"x"=4, "y"=2>
%lhs : tensor<8x32xf32> {sdy.sharding=<@mesh, \[{"x"}, {"y"}\]>}
%rhs : tensor<32x16xf32> {sdy.sharding=<@mesh, \[{"y"}, {"x"}\]>}
%0 = sdy.reshard %rhs <@mesh, \[{"y"}, {}\]> : tensor<32x16xf32>
stablehlo.dot %lhs, %0 {sdy.sharding_per_value=<[<@mesh, \[{"x"}, {}\]>]>}
: (tensor<8x32xf32>, tensor<32x16xf32>) -> tensor<8x16xf32>
ในตัวอย่างข้างต้น จะเกิดข้อขัดแย้งเนื่องจากทั้ง Tensor lhs
และ rhs
มีการแบ่งกลุ่มตามแกน "x" ในมิติข้อมูลที่ไม่มีการหดตัว ในที่นี้ ระบบจะแบ่งกลุ่มเทนเซอร์ rhs
อีกครั้งก่อนการดำเนินการจุด เพื่อแบ่งกลุ่มเฉพาะในมิติข้อมูลแรกและบนแกน "x" เท่านั้น วิธีนี้จะทำให้การดำเนินการด้วยเครื่องหมายจุดเข้ากันได้
-sdy-remove-sharding-groups
นํา ShardingGroupOps ออกหลังจากการนำไปใช้งาน
-sdy-sharding-constraint-to-reshard
แปลง ShardingConstraintOp เป็น ReshardOp
-sdy-sink-data-flow-edges
ส่งออก DataFlowEdgeOp
ทั้งหมดไปยังอินพุต
ย้ายการแยกส่วน DataFlowEdgeOp
แต่ละรายการไปยังอินพุต (เป้าหมายรูทของขอบ) และแทนที่การดำเนินการด้วยอินพุต
TODO(tomnatan): พิจารณาย้ายการแยกข้อมูลไปยังเป้าหมายทั้งหมดที่แนบการแยกข้อมูลได้
-sdy-update-non-divisible-input-output-shardings
ทำให้อินพุต/เอาต์พุต FuncOp มีการแบ่งกลุ่มอย่างสม่ำเสมอ จึงไม่จำเป็นต้องมีการเติมค่าเนื่องจากมีการแบ่งกลุ่มที่หารกันไม่ได้
ผู้ใช้ Shardy คาดหวังว่าอินพุต/เอาต์พุตของฟังก์ชันจะหารได้อย่างสม่ำเสมอ/แยกได้ เพื่อหลีกเลี่ยงการต้องเพิ่มค่าให้กับ Tensor การนำไปใช้งานอาจทําให้อินพุต/เอาต์พุตมีการแยกส่วนที่ไม่แบ่งได้ ดังนั้นการผ่านนี้จะอัปเดตอินพุต/เอาต์พุตเป็นคำนำหน้าการแยกมิติข้อมูลขนาดใหญ่ที่สุดของการแยกส่วนเดิมที่มีการแยกส่วนอย่างสม่ำเสมอ