-sdy-close-shardings
ปิดการแยกกลุ่มเทนเซอร์และลบแกนที่ทำซ้ำ
-sdy-constant-merger
ผสานค่าคงที่ที่เหมือนกันกับการแยกข้อมูลซึ่งตรงกัน
ดำเนินการ CSE แบบเบากับค่าคงที่ที่มีการแยกข้อมูลเหมือนกัน
ไปป์ไลน์การนําเข้าจะแยกและทําซ้ำค่าคงที่เพื่อไม่ให้มีการแยกข้อมูลระหว่างการใช้การคํานวณย่อยแบบคงที่ที่แตกต่างกัน หากค่าคงที่มีการแยกส่วนเดียวกันหลังจากการนำไปใช้งาน ระยะนี้จะผสานค่าเหล่านั้นเพื่อประหยัดเวลาในการคอมไพล์
-sdy-drop-sharding-rules
นำ OpShardingRuleAttr
ออกจากการดำเนินการที่ลงทะเบียนทั้งหมด
-sdy-insert-explicit-reshards
แทรกการแยกส่วนใหม่อย่างชัดเจนเพื่อให้การดำเนินการทั้งหมดมีการแยกส่วนที่เข้ากันได้
โดยทั่วไปแล้ว การแยกส่วนที่เข้ากันได้หมายความว่าการดำเนินการจะยอมรับโอเปอเรนด์ที่แยกส่วนและสร้างผลลัพธ์ที่แยกส่วนได้โดยไม่ต้องมีการแยกส่วนการสื่อสาร (โปรดทราบว่าการดำเนินการอาจยังคงต้องมีการสื่อสาร เช่น การลดข้อมูลทั้งหมดหรือการเปลี่ยนข้อมูลส่วนกลาง)
หลังจากการนำไปใช้งานแล้ว การดำเนินการบางอย่างอาจยังคงมีการแยกส่วนที่ไม่เข้ากันได้
โปรดทราบว่าเมื่อใช้แกน (หรือแกนย่อย) เพื่อแบ่งกลุ่มมิติข้อมูลที่ไม่ใช่คู่กัน (เช่น มิติข้อมูลที่ไม่ใช่การรวมใน matmul) ในเทนเซอร์หลายรายการ หรือเมื่อแกนแบ่งกลุ่มมิติข้อมูลในเทนเซอร์หนึ่ง แต่ไม่ได้แบ่งกลุ่มมิติข้อมูลที่เกี่ยวข้องในเทนเซอร์อีกรายการหนึ่ง ระบบจะถือว่าการดำเนินการดังกล่าวมีความขัดแย้งในการแบ่งกลุ่ม ดังนั้น หลังจากผ่านขั้นตอนนี้ การดำเนินการจะไม่เกิดข้อขัดแย้ง
พาสนี้จะแทรกการดำเนินการแยกกลุ่มใหม่อย่างชัดเจนเพื่อให้มิติข้อมูลที่เกี่ยวข้องได้รับการแยกกลุ่มในลักษณะเดียวกันสำหรับการดำเนินการแต่ละรายการ ในทุกโอเปอเรนดและผลลัพธ์ และทุกแกน (หรือแกนย่อย) จะใช้เพื่อแยกกลุ่มมิติข้อมูลประเภทเดียวได้เท่านั้น
ตัวอย่าง
อินพุต:
mesh = <"x"=4, "y"=2>
%lhs : tensor<8x32xf32> {sdy.sharding=<@mesh, \[{"x"}, {"y"}\]>}
%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>
ในตัวอย่างข้างต้น lhs
และ rhs
ต่างก็มีการแยกกลุ่มตามแกน "x" ในมิติข้อมูลที่ไม่มีการหดตัว ซึ่งใช้ร่วมกันไม่ได้ พาสจะแทรกการแยกส่วนใหม่อย่างชัดเจนใน rhs
ก่อนการดำเนินการด้วยเครื่องหมายจุด เพื่อให้การดำเนินการด้วยเครื่องหมายจุดมีการแยกส่วนที่เข้ากันได้
-sdy-remove-sharding-groups
นํา ShardingGroupOps ออกหลังจากการนำไปใช้งาน
-sdy-reshard-to-collectives
แปลง ReshardOp เป็นการดำเนินการแบบรวมของ Shardy ต่างๆ
จับคู่การดำเนินการ reshard และเขียนใหม่เป็นการดำเนินการแบบรวมของ Shardy ต่างๆ หลังจากผ่านขั้นตอนนี้ จะไม่มีการดำเนินการเปลี่ยนการแบ่งกลุ่มใหม่ในโมดูล พาสนี้ถือว่ามีการแทรกการแยกกลุ่มใหม่อย่างชัดเจนแล้ว (sdy-insert-explicit-reshards
)
ตัวอย่าง
อินพุต:
mesh = <"x"=2, "y"=2, "z"=2>
%0 : tensor<16x2xf32> {sdy.sharding<@mesh, \[{"x", "y", "z"}, {}\]>
%1 = sdy.reshard %arg0 <@mesh, \[{"x"}, {}\]> : tensor<16x2xf32>
เอาต์พุต:
mesh = <"x"=2, "y"=2, "z"=2>
%0 : tensor<16x2xf32> {sdy.sharding<@mesh, \[{"x", "y", "z"}, {}\]>
%1 = sdy.all_gather \[{"y", "z"}, {}\] %arg0 out_sharding=<@mesh, \[{"x"}, {}\]> : tensor<16x2xf32>
ในตัวอย่างข้างต้น เทนเซอร์ %0 : tensor<16x2xf32>
จะแบ่งออกเป็น
\[{"x", "y", "z"}, {}\]
จากนั้นมี reshard
op เปลี่ยนการแบ่งกลุ่มเป็น
\[{"x"}, {}\]
ในแกนแรก เนื่องจากมีการนําส่วนต่อท้าย {"y", "z"}
ออกหลังจากการแยกกลุ่มใหม่ เราจึงอนุมานได้ว่าเราได้รวบรวม {"y", "z"}
ทั้งหมดแล้ว มิติข้อมูลที่สองจะไม่มีการเปลี่ยนแปลง
-sdy-sharding-constraint-to-reshard
แปลง ShardingConstraintOp เป็น ReshardOp
-sdy-sink-data-flow-edges
ส่งออก DataFlowEdgeOp
ทั้งหมดไปยังอินพุต
ย้ายการแยกส่วน DataFlowEdgeOp
แต่ละรายการไปยังอินพุต (เป้าหมายรูทของขอบ) และแทนที่การดำเนินการด้วยอินพุต
ตัวเลือก
-sink-debug-sharding-origins : Whether to sink the debug sharding origins info. See `debug-sharding-origins` option in propagation for more info.
-sink-debug-propagation-edge-sharding : Whether to sink the debug propagation edge sharding info. See `debug-propagation-edge-sharding` option in propagation for more info.
-sdy-temp-explicit-reshards-for-optimizations
แทรกการแยกกลุ่มใหม่อย่างชัดแจ้งสําหรับการเพิ่มประสิทธิภาพที่เฉพาะเจาะจง
บัตรนี้เป็นวิธีแก้ปัญหาชั่วคราวจนกว่าเราจะเปิดใช้บัตร sdy-insert-explicit-reshards
โดยค่าเริ่มต้นได้
ซึ่งช่วยให้เราแทรกการแยกกลุ่มใหม่อย่างชัดแจ้งในการดำเนินการบางอย่างเพื่อการเพิ่มประสิทธิภาพได้
-sdy-update-non-divisible-input-output-shardings
ทำให้อินพุต/เอาต์พุต FuncOp มีการแบ่งกลุ่มอย่างสม่ำเสมอ จึงไม่จำเป็นต้องมีการเติมค่าเนื่องจากมีการแบ่งกลุ่มที่หารกันไม่ได้
ผู้ใช้ Shardy คาดหวังว่าอินพุต/เอาต์พุตของฟังก์ชันจะหารได้อย่างสม่ำเสมอ/แยกได้ เพื่อหลีกเลี่ยงการต้องเพิ่มค่าให้กับ Tensor การนำไปใช้งานอาจทําให้อินพุต/เอาต์พุตมีการแยกข้อมูลที่ไม่แบ่งได้ ดังนั้นการผ่านนี้จะอัปเดตอินพุต/เอาต์พุตเป็นคำนำหน้าการแยกข้อมูลมิติข้อมูลขนาดใหญ่ที่สุดของการแยกข้อมูลเดิมที่มีการแยกข้อมูลอย่างสม่ำเสมอ