-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 การนำไปใช้งานอาจทําให้อินพุต/เอาต์พุตมีการแยกส่วนที่ไม่แบ่งได้ ดังนั้นการผ่านนี้จะอัปเดตอินพุต/เอาต์พุตเป็นคำนำหน้าการแยกมิติข้อมูลขนาดใหญ่ที่สุดของการแยกส่วนเดิมที่มีการแยกส่วนอย่างสม่ำเสมอ