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