ภาษาถิ่น Shardy (SDY)
ภาษา Shardy (SDY) กำหนดการแสดงผลการแบ่งพาร์ติชันเทนเซอร์ตามแกน และคอมโพเนนต์ API เพิ่มเติมเพื่อแนบการแบ่งพาร์ติชันกับเทนเซอร์
บันทึกเวอร์ชัน 0.0.1: เพิ่มแกนที่ไม่ได้ลดลงใน TensorShardingAttr
การดำเนินการ
sdy.all_gather (sdy::AllGatherOp)
ดำเนินการสื่อสารแบบ All-Gather ตามแกน
ไวยากรณ์:
operation ::= `sdy.all_gather` $gathering_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
รวบรวมกลุ่มของเทนเซอร์ตามแกนที่ระบุใน gathering_axes
gathering_axes คือรายการของรายการแกน รายการด้านนอกอยู่เหนือ
มิติข้อมูลของ Tensor แต่ละลิสต์ด้านในจะระบุแกนที่จะใช้ดำเนินการรวบรวมแยกต่างหากในมิติข้อมูลที่เกี่ยวข้อง โดยจะใช้กับ Sharding ของตัวถูกดำเนินการ (tensor) เพื่อรับ Sharding ของผลลัพธ์ (out_sharding)
โปรดทราบว่าระบบไม่ได้ใช้ out_sharding ในการกำหนดการแบ่งส่วนของผลลัพธ์
แต่การแบ่งกลุ่มผลลัพธ์จะกำหนดโดยการแบ่งกลุ่มของ
ตัวถูกดำเนินการและ gathering_axes และ out_sharding ต้องตรงกับการแบ่งกลุ่มที่อนุมานนี้
ตัวอย่าง
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "b", "c"}, {}, {"d"}\]>]>} : tensor<8x8x8xf32>
%2 = sdy.all_gather [{"b", "c"}, {}, {"d"}\] %1 out_sharding=<@mesh, [{"a"}, {}, {}\]> : tensor<8x8x8xf32>
ข้อจำกัด:
- ต้องเป็นไปตามข้อจำกัดที่ระบุไว้ใน
Sdy_CollectiveOpInterface - องค์ประกอบใน
gathering_axesต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในAxisRefListAttr - การใช้
gathering_axesกับการแบ่งข้อมูลตัวถูกดำเนินการจะทำให้ได้out_sharding
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: InferTypeOpInterface, Sdy_CollectiveOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
gathering_axes | ::mlir::sdy::ListOfAxisRefListsAttr | รายการรายการอ้างอิงแกน |
out_sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
tensor |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.all_reduce (sdy::AllReduceOp)
Perform an all-reduce comunication along axes
ไวยากรณ์:
operation ::= `sdy.all_reduce` ($reduction_op^)? $reduction_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
ลดขนาดก้อนของเทนเซอร์ตามแกนที่ระบุใน reduction_axes
ลำดับของ reduction_axes ไม่สำคัญต่อผลลัพธ์ แต่สามารถ
ส่งผลต่อลำดับของกลุ่มรีพลิเคชันที่เกี่ยวข้องได้
ข้อจำกัด:
- ต้องเป็นไปตามข้อจำกัดที่ระบุไว้ใน
Sdy_CollectiveOpInterface reduction_axesต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในAxisRefListAttr- ต้องจัดเรียง
reduction_axesตามตาข่าย - การแบ่งพาร์ติชันตัวถูกดำเนินการและ
out_shardingต้องมีการแบ่งพาร์ติชันมิติข้อมูลที่เทียบเท่ากัน reduction_axesต้องไม่ซ้อนทับกับการแบ่งมิติข้อมูลตัวถูกดำเนินการและ แกนที่จำลอง (ซ้อนทับกับแกนที่ไม่ได้ลดได้)reduction_axesต้องไม่ทับซ้อนกับแกนที่ไม่ได้ลดของout_shardingกล่าวอีกนัยหนึ่งคือout_shardingต้องทำซ้ำตามreduction_axes(โดยนัยหรือโดยชัดแจ้ง)
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: CollectiveOpInterface, InferTypeOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
reduction_axes | ::mlir::sdy::AxisRefListAttr | รายการอ้างอิงแกน |
reduction_op | ::mlir::sdy::ReductionOpAttr | enum การดำเนินการลด |
out_sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
tensor |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.all_slice (sdy::AllSliceOp)
ดำเนินการ Slice แบบไดนามิกตามแกน
ไวยากรณ์:
operation ::= `sdy.all_slice` $slicing_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
แบ่งกลุ่มของเทนเซอร์ตามแกนที่ระบุใน slicing_axes มีความสัมพันธ์แบบคู่ภาคีเชิงพีชคณิตระหว่าง sdy.all_slice กับ sdy.all_gather
slicing_axes คือรายการของรายการแกน รายการด้านนอกอยู่เหนือ
มิติข้อมูลของ Tensor แต่ละรายการด้านในจะระบุแกนที่จะใช้ในการ
ตัดชิ้นมิติข้อมูลที่เกี่ยวข้อง โดยจะใช้กับการแบ่งกลุ่มของตัวถูกดำเนินการ (tensor) เพื่อให้ได้การแบ่งกลุ่มของผลลัพธ์ (out_sharding)
โปรดทราบว่าระบบไม่ได้ใช้ out_sharding ในการกำหนดการแบ่งส่วนของผลลัพธ์
แต่การแบ่งกลุ่มผลลัพธ์จะกำหนดโดยการแบ่งกลุ่มของ
ตัวถูกดำเนินการและ slicing_axes และ out_sharding ต้องตรงกับการแบ่งกลุ่มที่อนุมานนี้
ตัวอย่าง
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a"}, {}, {}\]>]>} : tensor<8x8x8xf32>
%2 = sdy.all_slice [{"b", "c"}, {}, {"d"}\] %1 out_sharding=<@mesh, [{"a", "b", "c"}, {}, {"d"}\]> : tensor<8x8x8xf32>
ข้อจำกัด:
- ต้องเป็นไปตามข้อจำกัดที่ระบุไว้ใน
Sdy_CollectiveOpInterface - องค์ประกอบใน
slicing_axesต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในAxisRefListAttr - การใช้
slicing_axesกับการแบ่งข้อมูลตัวถูกดำเนินการจะทำให้ได้out_sharding
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: CollectiveOpInterface, InferTypeOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
slicing_axes | ::mlir::sdy::ListOfAxisRefListsAttr | รายการรายการอ้างอิงแกน |
out_sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
tensor |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.all_to_all (sdy::AllToAllOp)
ดำเนินการสื่อสารแบบทั้งหมดต่อทั้งหมดตามแกน
ไวยากรณ์:
operation ::= `sdy.all_to_all` $params $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
สำหรับแต่ละทูเพิล (axes, src_dim, tgt_dim) ในรายการพารามิเตอร์ การดำเนินการนี้จะแบ่งกลุ่มของ Tensor ตามมิติข้อมูล tgt_dim และแกนที่ระบุใน axes กระจายกลุ่มเหล่านั้นตามแกน และต่อกันตามมิติข้อมูล src_dim
การดำเนินการนี้เป็นการรวมกันของ all-gather ตาม src_dim
และ axes ตามด้วย all-slice ตาม tgt_dim และ axes กล่าวคือ
ต่อท้ายมิติข้อมูลการแบ่งส่วนแกน src_dim ในเทนเซอร์อินพุต
จะต่อท้ายมิติข้อมูลการแบ่งส่วนแกน tgt_dim ในเทนเซอร์เอาต์พุต
การสื่อสารแบบทั้งหมดต่อทั้งหมดจะใช้กับการแยกส่วนของตัวถูกดำเนินการ (tensor) เพื่อ
รับการแยกส่วนของผลลัพธ์ (out_sharding)
โปรดทราบว่าระบบไม่ได้ใช้ out_sharding ในการกำหนดการแบ่งส่วนของผลลัพธ์
แต่การแบ่งกลุ่มของผลลัพธ์จะกำหนดโดยการแบ่งกลุ่มของ
ตัวถูกดำเนินการ src_dim, tgt_dim และ axes และ out_sharding ต้องตรงกับ
การแบ่งกลุ่มที่สรุปนี้
ตัวอย่าง
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "b"}, {"c"}, {}, {}\]>]>} : tensor<8x8x4x4x32>
%2 = sdy.all_to_all [{"b"}: 0->2, {"c"}: 1->3] %1 out_sharding=<@mesh, [{"a"}, {}, {"b"}, {"c"}\]> : tensor<8x8x4x4x32>
ข้อจำกัด:
- ต้องเป็นไปตามข้อจำกัดที่ระบุไว้ใน
Sdy_CollectiveOpInterface - ต้องระบุรายการพารามิเตอร์
- สำหรับพารามิเตอร์แต่ละรายการใน
paramsให้ทำดังนี้- องค์ประกอบใน
axesต้องเป็นไปตามข้อจำกัดของAxisRefAttr src_dimและtgt_dimต้องเป็นมิติข้อมูลที่ถูกต้อง (ไม่ใช่ค่าลบและน้อยกว่า อันดับของเทนเซอร์)src_dimหรือtgt_dimต้องไม่ซ้ำกันในพารามิเตอร์ทั้งหมดsrc_dimต้องจัดเรียงจากน้อยไปมากในพารามิเตอร์ทั้งหมด
- องค์ประกอบใน
- การย้าย
axesจากsrc_dimไปยังtgt_dimในการแบ่งส่วนตัวถูกดำเนินการจะทำให้ได้out_sharding
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: InferTypeOpInterface, Sdy_CollectiveOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
params | ::mlir::sdy::AllToAllParamListAttr | รายการพารามิเตอร์แบบทั้งหมดต่อทั้งหมด |
out_sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
tensor |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.collective_permute (sdy::CollectivePermuteOp)
ดำเนินการสื่อสารแบบ collective-permute เพื่อแทนที่แกน
ไวยากรณ์:
operation ::= `sdy.collective_permute` $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
ส่งกลุ่มของเทนเซอร์อินพุตจากแต่ละอุปกรณ์ไปยังอีกอุปกรณ์หนึ่งเพื่อ จัดลำดับใหม่/แทนที่แกนที่แยกส่วนเทนเซอร์
การสับเปลี่ยนแบบกลุ่มสามารถเปลี่ยนการแบ่งข้อมูลอินพุตเพื่อให้แต่ละมิติข้อมูลต้องได้รับการแบ่งข้อมูลเหมือนกับก่อนหน้านี้ กล่าวคือ ต้องได้รับการแบ่งข้อมูลตามแกนที่มีผลคูณของขนาดตรงกับแกนที่แบ่งข้อมูลเทนเซอร์ก่อนหน้านี้
ซึ่งมีประโยชน์ในการจัดเรียงแกนใหม่ในมิติข้อมูลเดียวหรือในมิติข้อมูลต่างๆ และสลับแกนที่แชร์กับแกนที่จำลอง
ในตัวอย่างด้านล่าง ขนาดของเทนเซอร์ที่แยกส่วนคือ tensor<1x4x2xf32> และ
การสับเปลี่ยนแบบกลุ่มจะรักษาขนาดนี้ไว้
ตัวอย่าง
sdy.mesh @mesh = <["a"=2, "b"=2, "c"=4, "d"=2, "e"=2, "f"=2]>
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "c"}, {"f"}, {"d", "e"}\]>]>} : tensor<8x8x8xf32>
%2 = sdy.collective_permute %1 out_sharding=<@mesh, [{"c":(1)2, "b", "f"}, {"a"}, {"e", "d"}\]> : tensor<8x8x8xf32>
ข้อจำกัด:
- ต้องเป็นไปตามข้อจำกัดที่ระบุไว้ใน
Sdy_CollectiveOpInterface - หากการแบ่งพาร์ติชันอินพุตและเอาต์พุตมี Mesh ที่แตกต่างกัน Mesh เหล่านั้นต้องมีแกนที่เหมือนกันทุกประการและมีลำดับรหัสอุปกรณ์ที่แตกต่างกัน
- สำหรับแต่ละมิติข้อมูล ผลคูณของขนาดแกนการแยกส่วนใน
out_shardingต้องตรงกับผลคูณของการแยกส่วนมิติข้อมูลตัวถูกดำเนินการที่เกี่ยวข้อง
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: CollectiveOpInterface, InferTypeOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
out_sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
tensor |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.constant (sdy::ConstantOp)
การดำเนินการคงที่
สร้างเทนเซอร์ output จากค่าคงที่ value
ดูข้อมูลได้ที่ https://github.com/openxla/stablehlo/blob/main/docs/spec.md#constant
ตัวอย่าง
%output = sdy.constant dense<[[0.0, 1.0], [2.0, 3.0]]> : tensor<2x2xf32>
ลักษณะ: AlwaysSpeculatableImplTrait
อินเทอร์เฟซ: ConditionallySpeculatable, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface)
ผลกระทบ: MemoryEffects::Effect{}
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
value | ::mlir::ElementsAttr | แอตทริบิวต์เวกเตอร์/เทนเซอร์คงที่ |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
output |
เทนเซอร์ที่มีรูปร่างคงที่ของค่าประเภทที่ไม่ใช่โทเค็น |
sdy.data_flow_edge (sdy::DataFlowEdgeOp)
การดำเนินการที่ขอบของโฟลว์ข้อมูล
ไวยากรณ์:
operation ::= `sdy.data_flow_edge` $input (`sharding````=``` $sharding^)? attr-dict `:` type($result)
ขอบโฟลว์ข้อมูลของ Op X บางรายการจะกําหนดบริดจ์ระหว่างชุดแหล่งที่มา (แต่ละรายการเป็นตัวถูกดําเนินการของ X หรือตัวถูกดําเนินการของตัวสิ้นสุดบล็อกของ X) และชุดเป้าหมาย (แต่ละรายการเป็นผลลัพธ์ของ X หรืออาร์กิวเมนต์บล็อกของ X) เพื่อให้แหล่งที่มาและเป้าหมายทั้งหมดควรได้รับการ Shard ในลักษณะเดียวกัน
Op สามารถมีขอบโฟลว์ข้อมูลหลายรายการที่ตั้งฉากกัน
เช่น
y_0, ..., y_n = while (x_0, ..., x_n)
((pred_arg_0,... , pred_arg_n) { ... })
((body_arg_0,..., body_arg_n) {
...
return return_value_0, ..., return_value_n
})
ในขณะที่การดำเนินการนี้มีขอบโฟลว์ข้อมูล n ขอบ ขอบโฟลว์ข้อมูลที่ i จะอยู่ระหว่างแหล่งที่มา x_i, return_value_i และเป้าหมาย y_i, pred_arg_i
body_arg_i
sdy.data_flow_edge รับอินพุตเป็นเจ้าของของขอบ (อาจเป็นเป้าหมายใดก็ได้ แต่ควรเป็นผลลัพธ์ของโอเปอเรชันมากกว่าอาร์กิวเมนต์บล็อก) ซึ่งไม่ควรมีการใช้งานอื่นๆ การดำเนินการนี้ไม่บริสุทธิ์เนื่องจาก
สามารถรับอินพุตที่เดิมไม่มีการใช้งานใดๆ
sdy.data_flow_edge ยังมีการแบ่งข้อมูลที่ไม่บังคับสำหรับเป้าหมายทั้งหมดของ
Edge และควรมีการอัปเดตการแบ่งข้อมูลนั้นแทนการแบ่งข้อมูลของเป้าหมาย (หากแนบได้) ในระหว่างการเผยแพร่ ซึ่งจะมีประโยชน์เมื่อการดำเนินการมีขอบจำนวนมาก เนื่องจากมีประสิทธิภาพมากกว่าในการทำสิ่งต่อไปนี้
- เผยแพร่ผ่านแต่ละ Edge แยกกัน
- อัปเดตการแบ่งข้อมูลของแต่ละ Edge แยกกันแทนที่จะอัปเดตเป้าหมายทั้งหมดพร้อมกัน
(เช่น การดำเนินการมี
TensorShardingPerValueAttrเดียวที่ไม่เปลี่ยนแปลงสำหรับผลลัพธ์ การแบ่งข้อมูล) - เพิ่มแต่ละขอบลงในรายการงานแยกกันเมื่อการแบ่งส่วนของแหล่งที่มามีการเปลี่ยนแปลง
การส่งต่อจะส่งต่อการแบ่งข้อมูลระหว่างแหล่งที่มาและเป้าหมายทั้งหมดของ sdy.data_flow_edge ราวกับว่าเป็นการดำเนินการปกติที่มีแหล่งที่มาเป็นตัวถูกดำเนินการ
และเป้าหมายเป็นผลลัพธ์ และมี sdy.op_sharding_rule เป็นตัวระบุ ซึ่งหมายความว่า
การส่งต่อคือจากแหล่งที่มาไปยังเป้าหมาย และการส่งย้อนกลับ
คือจากเป้าหมายไปยังแหล่งที่มา
เราไม่อนุญาตให้กำหนดอินพุตของ sdy.data_flow_edge โดยSdyDialect op ดังนั้นเราจึงถือว่าอินพุตดังกล่าวกำหนดโดย op ที่มีแอตทริบิวต์ sdy.sharding ที่ไม่ได้ลงทะเบียน
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: InferTypeOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
input |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.func_data_flow_edge (sdy::FuncDataFlowEdgeOp)
การดำเนินการที่ขอบของโฟลว์ข้อมูลอินพุต/เอาต์พุตของฟังก์ชัน
ไวยากรณ์:
operation ::= `sdy.func_data_flow_edge` $operand attr-dict `:` type($result)
การดำเนินการขอบของโฟลว์ข้อมูล แต่สําหรับอาร์กิวเมนต์ฟังก์ชันหรือผลลัพธ์การเรียก เมื่อตัวถูกดำเนินการเป็น BlockArgument จะเป็นสะพานจากอาร์กิวเมนต์ callOp ของผู้เรียกไปยังผู้ใช้ของอาร์กิวเมนต์ func มีขอบโฟลว์ข้อมูลฟังก์ชัน 1 รายการ สําหรับอาร์กิวเมนต์ฟังก์ชันแต่ละรายการ เมื่อตัวถูกดำเนินการเป็น OpResult จะเป็นบริดจ์ จากค่าที่ส่งคืนของ funcOp ที่เรียกไปยังผู้ใช้ผลการเรียก มีขอบโฟลว์ข้อมูลฟังก์ชัน 1 รายการสำหรับผลการเรียกแต่ละรายการ
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: InferTypeOpInterface, SymbolUserOpInterface
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
operand |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.manual_computation (sdy::ManualComputationOp)
การดำเนินการแบบคู่ขนานหลายอุปกรณ์ด้วยการรวบรวมข้อมูลด้วยตนเอง
ไวยากรณ์:
operation ::= `sdy.manual_computation` `(`operands`)`
`in_shardings````=```custom<StrippedTensorShardingPerValueAttr>($in_shardings)
`out_shardings````=```custom<StrippedTensorShardingPerValueAttr>($out_shardings)
`manual_axes````=```$manual_axes
custom<SingleBlockRegionNoBlockId>($body)
attr-dict
`:`
functional-type(operands, results)
เข้าสู่รีเจียนที่เขียนในรูปแบบของโค้ดภายในต่ออุปกรณ์ที่มี Collective ที่ชัดเจน ซึ่งรูปร่างเชิงตรรกะตรงกับรูปร่างบัฟเฟอร์จริงภายในต่ออุปกรณ์ และ Collective ตรงกับการสื่อสารจริงข้ามอุปกรณ์
โดยที่ body เป็นแบบโลคัลเทียบกับ manual_axes การแพร่กระจายจะเกิดขึ้นผ่าน บอดี้บนแกนอิสระใดๆ ซึ่งไม่ได้อยู่ในรายการ manual_axes
โปรดทราบว่าเทนเซอร์ที่ไม่ได้จัดอันดับควรมีการแบ่งกลุ่มที่มีอันดับเป็น 0 กล่าวคือมีการจำลองแบบเต็ม
ข้อจำกัด:
- องค์ประกอบใน
in_shardingsและout_shardingsต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในTensorShardingAttr - จำนวนอินพุต/เอาต์พุตของเทนเซอร์ส่วนกลางและเทนเซอร์ภายในของภูมิภาค Op ต้องตรงกัน
- แกนแบบกำหนดเองต้องอยู่ก่อนแกนอิสระในแต่ละการแบ่งกลุ่มมิติข้อมูล
- แกนแบบกำหนดเองจะเพิ่มระยะเว้นไม่ได้ กล่าวคือ ขนาดของมิติข้อมูลต้องหารด้วยขนาดแกนที่กำหนดเองที่เกี่ยวข้องได้
- อาร์กิวเมนต์/ผลลัพธ์ของรูปร่างส่วนกลางและรูปร่างในเครื่องของภูมิภาคการดำเนินการต้องตรงกัน
ลักษณะ: IsolatedFromAbove, RecursiveMemoryEffects, SingleBlockImplicitTerminator<ReturnOp>, SingleBlock
อินเทอร์เฟซ: ShardableDataFlowOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
in_shardings | ::mlir::sdy::TensorShardingPerValueAttr | การแบ่ง Tensor ตามตัวถูกดำเนินการ/ผลลัพธ์ของ Op |
out_shardings | ::mlir::sdy::TensorShardingPerValueAttr | การแบ่ง Tensor ตามตัวถูกดำเนินการ/ผลลัพธ์ของ Op |
manual_axes | ::mlir::sdy::ManualAxesAttr | รายการแกนที่ ManualComputationOp เป็นแบบกำหนดเอง |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
tensors |
variadic ของประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
results |
variadic ของประเภทที่ไม่ใช่โทเค็น |
sdy.mesh (sdy::MeshOp)
ตาข่ายที่มีชื่อ
ไวยากรณ์:
operation ::= `sdy.mesh` $sym_name `=` $mesh attr-dict
กำหนดตาข่ายใหม่ที่มีชื่อ Mesh ทั้งหมดในโมดูลต้องมีจำนวนอุปกรณ์เท่ากัน (ยกเว้น Mesh ที่มี device_id เดียว)
Mesh คือการดำเนินการ Symbol ที่ปรากฏใน
SymbolTable ของโมดูล และสามารถอ้างอิงได้โดยใช้ name
ลักษณะ: HasParent<ModuleOp>, SymbolName
อินเทอร์เฟซ: Symbol
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
sym_name | ::mlir::StringAttr | แอตทริบิวต์สตริง |
mesh | ::mlir::sdy::MeshAttr | โครงข่าย Mesh ของแกนและรายการอุปกรณ์ |
sdy.named_computation (sdy::NamedComputationOp)
การดำเนินการคำนวณที่มีชื่อ
ไวยากรณ์:
operation ::= `sdy.named_computation` `<`$name`>` `` `(` $operands `)`
(`in_shardings````=```custom<StrippedTensorShardingPerValueAttr>($in_shardings)^)?
(`out_shardings````=```custom<StrippedTensorShardingPerValueAttr>($out_shardings)^)?
custom<SingleBlockRegionNoBlockId>($body)
attr-dict
`:` functional-type($operands, results)
จัดกลุ่มการคำนวณ เช่น บล็อกของการดำเนินการ และตั้งชื่อให้ การเผยแพร่จะไหลเข้า/ออกจากภูมิภาคราวกับว่าทุกอย่างอยู่ในบรรทัด
ซึ่งใช้เพื่อจัดการการเผยแพร่ผ่านวิธีการเรียกไปยังฟังก์ชันอื่นๆ ได้
ผู้ใช้ Shardy ทุกคนควรเขียนการส่งออก/นำเข้าที่
แปลงการดำเนินการเรียกใช้เป็นsdy.named_computation โดยการทำซ้ำ/คัดลอก
เนื้อหาของฟังก์ชันที่เรียกใช้ไปยังเนื้อหาของ named_computation
ประเภทของอาร์กิวเมนต์บล็อกแต่ละรายการและค่าที่แสดงผลในรีเจียนต้องเหมือนกับประเภทตัวถูกดำเนินการและประเภทผลลัพธ์ของ Op
ตัวอย่าง
%1 = sdy.named_computation<"foo">(%0) (%arg1: tensor<16x32xf32>) {
sdy.return %arg1 : tensor<16x32xf32>
} : (tensor<16x32xf32>) -> tensor<16x32xf32>
ลักษณะ: IsolatedFromAbove, RecursiveMemoryEffects, RecursivelySpeculatableImplTrait, SingleBlockImplicitTerminator<ReturnOp>, SingleBlock
อินเทอร์เฟซ: ConditionallySpeculatable, InferTypeOpInterface, ShardableDataFlowOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
name | ::mlir::StringAttr | แอตทริบิวต์สตริง |
in_shardings | ::mlir::sdy::TensorShardingPerValueAttr | การแบ่ง Tensor ตามตัวถูกดำเนินการ/ผลลัพธ์ของ Op |
out_shardings | ::mlir::sdy::TensorShardingPerValueAttr | การแบ่ง Tensor ตามตัวถูกดำเนินการ/ผลลัพธ์ของ Op |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
operands |
variadic ของประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
| «ไม่มีชื่อ» | variadic ของประเภทที่ไม่ใช่โทเค็น |
sdy.propagation_barrier (sdy::PropagationBarrierOp)
การทำงานของแผงกั้นการแพร่กระจาย
ไวยากรณ์:
operation ::= `sdy.propagation_barrier` $input `allowed_direction````=```$allowed_direction attr-dict `:` type($input)
Op นี้ทำงานเหมือน Op ระบุ โดยจะแสดงผลค่าเดียวกับที่รับเป็น อินพุต แต่ในแง่ของการเผยแพร่ การดำเนินการนี้จะอนุญาตให้การเผยแพร่ไหลผ่านในทิศทางหนึ่งเท่านั้น
ซึ่งจะป้องกันไม่ให้มีการเผยแพร่การแบ่งส่วนระหว่างการใช้ผลลัพธ์ ของ Op Barrier และตัวถูกดำเนินการ
FORWARDหมายความว่าการแบ่งกลุ่มจะไหลจากตัวถูกดำเนินการไปยังผลลัพธ์เท่านั้นBACKWARDหมายความว่าการแบ่งพาร์ติชันจะไหลจากผลลัพธ์ไปยังตัวถูกดำเนินการได้เท่านั้นNONEหมายความว่าการแบ่งข้อมูลไม่สามารถแพร่กระจายผ่านการดำเนินการนี้ได้- ระบุ
BOTHไม่ได้เนื่องจากจะทำให้การดำเนินการนี้ซ้ำซ้อน
ลักษณะ: AlwaysSpeculatableImplTrait, SameOperandsAndResultType
อินเทอร์เฟซ: ConditionallySpeculatable, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface)
ผลกระทบ: MemoryEffects::Effect{}
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
allowed_direction | ::mlir::sdy::PropagationDirectionAttr | การแจงนับทิศทางการขยายพันธุ์ |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
input |
Tensor ที่จัดอันดับของค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
Tensor ที่จัดอันดับของค่าประเภทที่ไม่ใช่โทเค็น |
sdy.reduce_scatter (sdy::ReduceScatterOp)
ดำเนินการสื่อสารแบบลดการกระจายตามแกน
ไวยากรณ์:
operation ::= `sdy.reduce_scatter` ($reduction_op^)? $reduce_scatter_axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
ลดขนาดก้อนของเทนเซอร์ตามแกนที่ระบุใน reduce_scatter_axes
แล้วกระจายผลลัพธ์ตามแกนเดียวกัน การดำเนินการนี้
โดยพื้นฐานแล้วเป็นการรวมกันของ sdy.all_reduce ตามด้วย
sdy.all_slice ใน reduce_scatter_axes เดียวกัน
ข้อจำกัด:
- ต้องเป็นไปตามข้อจำกัดที่ระบุไว้ใน
Sdy_CollectiveOpInterface - องค์ประกอบใน
reduce_scatter_axesต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในAxisRefListAttr - การใช้
reduce_scatter_axesกับการแบ่งข้อมูลตัวถูกดำเนินการจะทำให้ได้out_sharding
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: CollectiveOpInterface, InferTypeOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
reduce_scatter_axes | ::mlir::sdy::ListOfAxisRefListsAttr | รายการรายการอ้างอิงแกน |
reduction_op | ::mlir::sdy::ReductionOpAttr | enum การดำเนินการลด |
out_sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
tensor |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.replicated_to_unreduced (sdy::ReplicatedToUnreducedOp)
ย้ายแกนที่จำลองแบบโดยนัยหรือโดยชัดแจ้งไปยังแกนที่ไม่ได้ลด
ไวยากรณ์:
operation ::= `sdy.replicated_to_unreduced` $axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
axes ควรจำลองในตัวถูกดำเนินการโดยนัยหรืออย่างชัดเจน
การดำเนินการนี้จะทำให้ค่าดังกล่าวไม่ลดลงในผลลัพธ์ เรามีความสัมพันธ์ดังนี้
all-reduce(replicated-to-unreduced(x, axes), axes) = x
ตัวอย่าง
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"b"}, {}, {}\], replicated={"c", "d"}, unreduced={"e"}>]>} : tensor<8x8x8xf32>
%2 = sdy.replicated_to_unreduced {"a", "c", "f"} %1 out_sharding=<@mesh, [{"b"}, {}, {}\], replicated={"d"}, unreduced={"a", "c", "e", "f"}> : tensor<8x8x8xf32>
ข้อจำกัด:
- ต้องเป็นไปตามข้อจำกัดที่ระบุไว้ใน
Sdy_CollectiveOpInterface axesต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในAxisRefListAttr- ต้องจัดเรียง
axesตามตาข่าย axesไม่ว่างเปล่า- การแบ่งข้อมูลอินพุตและเอาต์พุตต้องมีการแบ่งข้อมูลมิติข้อมูลเดียวกัน
axesต้องจำลองโดยนัยหรือโดยชัดแจ้งในการแบ่งส่วนตัวถูกดำเนินการ- inUnreducedAxes + axes = outUnreducedAxes
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: InferTypeOpInterface, Sdy_CollectiveOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
axes | ::mlir::sdy::AxisRefListAttr | รายการอ้างอิงแกน |
out_sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
tensor |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.reshard (sdy::ReshardOp)
เปลี่ยนชาร์ดดิ้งของ Tensor เป็นชาร์ดดิ้งอื่น
ไวยากรณ์:
operation ::= `sdy.reshard` $input $sharding attr-dict `:` type($result)
แบ่งพาร์ติชันใหม่ให้กับอินพุตเทนเซอร์ด้วยการแบ่งพาร์ติชันที่ระบุ ซึ่งแตกต่าง จากการแบ่งพาร์ติชันที่มีอยู่ของอินพุตเทนเซอร์
ทั้ง ShardingConstraintOp และ ReshardOp จะแนบการแบ่งกลุ่มกับเทนเซอร์ อายุการใช้งานของคุกกี้มีดังนี้
- ก่อนการเผยแพร่การแยกส่วน ผู้ใช้จะเพิ่ม ShardingConstraintOp
- การเผยแพร่การแยกส่วนจะใช้ ShardingConstraintOp ไม่มี ShardingConstraintOp ในผลลัพธ์ของการเผยแพร่การแบ่งข้อมูล แต่จะเพิ่ม ReshardOp หากจำเป็น
- ตัวแบ่งพาร์ติชันจะแปลง ReshardOp เป็นการดำเนินการแบบกลุ่ม (หรือการดำเนินการระบุตัวตน) ไม่ควรมี ReshardOp ในผลลัพธ์ของตัวแบ่งพาร์ติชัน
ลักษณะ: AlwaysSpeculatableImplTrait, SameOperandsAndResultType
อินเทอร์เฟซ: ConditionallySpeculatable, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface), SymbolUserOpInterface
ผลกระทบ: MemoryEffects::Effect{}
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
input |
ประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
ประเภทที่ไม่ใช่โทเค็น |
sdy.return (sdy::ReturnOp)
การดำเนินการ sdy.return จะสิ้นสุดภูมิภาคที่แนบมากับ
sdy การดำเนินการตามภูมิภาคและการดำเนินการตามภูมิภาคอื่นๆ ของ Shardy เป็น
variadic: รับรายการค่าเป็นอาร์กิวเมนต์ ซึ่งมีประเภทเป็นอะไรก็ได้ (แต่
เป็นประเภทเดียวกัน เช่น AnyTensor) จึงนำไปใช้ซ้ำได้ในระดับต่างๆ
ของสแต็ก Shardy IR
ไวยากรณ์:
operation ::= `sdy.return` attr-dict ($results^ `:` type($results))?
ลักษณะ: AlwaysSpeculatableImplTrait, ReturnLike, Terminator
อินเทอร์เฟซ: ConditionallySpeculatable, NoMemoryEffect (MemoryEffectOpInterface), RegionBranchTerminatorOpInterface
ผลกระทบ: MemoryEffects::Effect{}
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
results |
variadic ของประเภทที่ไม่ใช่โทเค็น |
sdy.sharded_to_unreduced (sdy::ShardedToUnreducedOp)
ย้ายแกนที่แยกส่วนของตัวถูกดำเนินการไปยังแกนที่ไม่ได้ลดของผลลัพธ์
ไวยากรณ์:
operation ::= `sdy.sharded_to_unreduced` $axes $tensor `out_sharding````=```$out_sharding attr-dict `:` type($result)
ควรใช้ axes เพื่อแยกส่วนตัวถูกดำเนินการ การดำเนินการนี้จะทำให้ค่าเหล่านั้น
ไม่ลดในผลลัพธ์ เรามีความสัมพันธ์ดังนี้
all-gather(x, axes) = all-reduce(sharded-to-unreduced(x, axes), axes) โดยที่ all-gather, sharded-to-unreduced, all-reduce จะใช้กับแกนเดียวกัน
ตัวอย่าง
%1 = stablehlo.tanh(%0) {sdy.sharding = #sdy.sharding_per_value<[<@mesh, [{"a", "b", "c"}, {}, {"d"}\], unreduced={"e"}>]>} : tensor<8x8x8xf32>
%2 = sdy.sharded_to_unreduced [{"b", "c"}, {}, {"d"}\] %1 out_sharding=<@mesh, [{"a"}, {}, {}\], unreduced={"b", "c", "d", "e"}> : tensor<8x8x8xf32>
ข้อจำกัด:
- ต้องเป็นไปตามข้อจำกัดที่ระบุไว้ใน
Sdy_CollectiveOpInterface - องค์ประกอบใน
axesต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในAxisRefListAttr - การใช้
axesกับการแบ่งข้อมูลตัวถูกดำเนินการจะทำให้ได้out_sharding
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: InferTypeOpInterface, Sdy_CollectiveOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
axes | ::mlir::sdy::ListOfAxisRefListsAttr | รายการรายการอ้างอิงแกน |
out_sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
tensor |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
มีรูปร่างเป็นค่าประเภทที่ไม่ใช่โทเค็น |
sdy.sharding_constraint (sdy::ShardingConstraintOp)
จำกัด Tensor ให้เป็นชาร์ดดิ้งที่ระบุ
ไวยากรณ์:
operation ::= `sdy.sharding_constraint` $input $sharding attr-dict `:` type($result)
แนบการแบ่งพาร์ติชันกับเทนเซอร์กลาง (เช่น ผลลัพธ์ของ MatMul) เพื่อระบุว่าควรแบ่งพาร์ติชันเทนเซอร์นั้นหรือชุดย่อยของการใช้งานอย่างไร
หากการแบ่งพาร์ติชันมีมิติข้อมูลที่เปิดอยู่และแกนที่ไม่มีข้อจำกัด แสดงว่า เทนเซอร์สามารถแบ่งพาร์ติชันเพิ่มเติมตามมิติข้อมูลที่เปิดอยู่ได้
โดยการดำเนินการนี้จะทำได้ 2 วิธี ดังนี้
- ไม่มีการใช้งาน (ค้างอยู่) ซึ่งหมายความว่าการชาร์ดดิ้งที่แนบมาคือวิธีที่ควรแยกส่วน Tensor อินพุตเอง
- มีการใช้งาน ซึ่งหมายความว่าการแยกส่วนที่แนบมาคือวิธีที่ควรแยกส่วนการใช้งานของ ตัวดำเนินการข้อจำกัดการแยกส่วน ในขณะที่การใช้งานอื่นๆ ของอินพุต เทนเซอร์อาจมีการแยกส่วนที่แตกต่างกัน (หากเทนเซอร์อินพุตไม่มีการใช้งานอื่นๆ ลักษณะการทำงานจะเหมือนกับกรณีที่ไม่มีการใช้งาน)
ลักษณะ: SameOperandsAndResultType
อินเทอร์เฟซ: InferTypeOpInterface, SymbolUserOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
sharding | ::mlir::sdy::TensorShardingAttr | การแบ่ง Tensor |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
input |
ประเภทที่ไม่ใช่โทเค็น |
ผลลัพธ์:
| ผลลัพธ์ | คำอธิบาย |
|---|---|
result |
ประเภทที่ไม่ใช่โทเค็น |
sdy.sharding_group (sdy::ShardingGroupOp)
จำกัดเทนเซอร์ในกลุ่มให้มีการแบ่งข้อมูลเดียวกัน
ไวยากรณ์:
operation ::= `sdy.sharding_group` $input `group_id````=```$group_id attr-dict `:` type($input)
Op นี้มีอินเทอร์เฟซสำหรับกำหนด Tensor ให้กับกลุ่ม Sharding ( กลุ่มของ Tensor ที่จะบังคับให้มีการ Sharding เหมือนกัน) ในระหว่างการเผยแพร่ ทันทีที่มีการแบ่งกลุ่มองค์ประกอบกลุ่มหนึ่ง สมาชิกอื่นๆ ทั้งหมด จะได้รับการแบ่งกลุ่มในลักษณะเดียวกัน การดำเนินการนี้จะใช้รหัสกลุ่มอาร์กิวเมนต์และไม่แสดงผลลัพธ์ แต่จะแก้ไขการแสดงกลุ่ม Sharding ภายในเพื่อเพิ่มเทนเซอร์อินพุตไปยังกลุ่มที่มีรหัสที่ระบุแทน
อินเทอร์เฟซ: InferTypeOpInterface
แอตทริบิวต์
| แอตทริบิวต์ | ประเภท MLIR | คำอธิบาย |
|---|---|---|
group_id | ::mlir::IntegerAttr | แอตทริบิวต์จำนวนเต็มแบบไม่มีเครื่องหมาย 64 บิต |
ตัวถูกดำเนินการ:
| ตัวถูกดำเนินการ | คำอธิบาย |
|---|---|
input |
Tensor ที่จัดอันดับของค่าประเภทที่ไม่ใช่โทเค็น |
Attributes
AllToAllParamAttr
พารามิเตอร์แบบทั้งหมดต่อทั้งหมด
ไวยากรณ์:
#sdy.all_to_all_param<
::llvm::ArrayRef<AxisRefAttr>, # axes
int64_t, # src_dim
int64_t # tgt_dim
>
ทูเพิลที่มีแกนและมิติข้อมูลต้นทาง/เป้าหมายเพื่อดำเนินการ แบบทั้งหมดต่อทั้งหมด
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| แกน | ::llvm::ArrayRef<AxisRefAttr> |
แกนที่จะดำเนินการแบบทั้งหมดต่อทั้งหมด |
| src_dim | int64_t |
ดัชนีมิติข้อมูลแหล่งที่มา |
| tgt_dim | int64_t |
ดัชนีมิติข้อมูลเป้าหมาย |
AllToAllParamListAttr
รายการพารามิเตอร์แบบทั้งหมดต่อทั้งหมด
ไวยากรณ์:
#sdy.all_to_all_param_list<
::llvm::ArrayRef<AllToAllParamAttr> # value
>
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| value | ::llvm::ArrayRef<AllToAllParamAttr> |
AxisRefAttr
การอ้างอิงถึงแกนแบบเต็มหรือแกนย่อยที่แยก
ไวยากรณ์:
#sdy.axis_ref<
::llvm::StringRef, # name
SubAxisInfoAttr # sub_axis_info
>
ข้อจำกัด:
nameต้องอยู่ในMeshAttrที่ผูกไว้- หากมี
sub_axis_infoจะต้องเป็นไปตามข้อจำกัดของSubAxisInfoAttr
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| name | ::llvm::StringRef |
ชื่อของแกนนี้ |
| sub_axis_info | SubAxisInfoAttr |
ข้อมูลเพิ่มเติมหากนี่คือแกนย่อย |
AxisRefListAttr
รายการอ้างอิงแกน
ไวยากรณ์:
#sdy.axis_ref_list<
::llvm::ArrayRef<AxisRefAttr> # value
>
ข้อจำกัด:
- องค์ประกอบใน
valueต้องเป็นไปตามข้อจำกัดของAxisRefAttr - ไม่มีการอ้างอิงแกนหรือแกนย่อยที่ซ้ำกันซึ่งทับซ้อนกัน
- ไม่มีการอ้างอิงแกน 2 รายการที่อยู่ติดกันซึ่งเป็นแกนย่อยที่ต่อเนื่องของแกนแบบเต็มเดียวกัน กล่าวคือ สามารถผสานรวมเป็นแกนย่อยหรือแกนแบบเต็มได้
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| value | ::llvm::ArrayRef<AxisRefAttr> |
AxisToPropagationDetailsAttr
รายละเอียดโฟลว์ขอบการเผยแพร่สำหรับแกนและแหล่งที่มาที่เฉพาะเจาะจง
ไวยากรณ์:
#sdy.axis_to_propagation_details<
::mlir::sdy::AxisRefAttr, # axis_name
::mlir::sdy::EdgeValueRefAttr, # source
::llvm::ArrayRef<EdgeValueRefAttr> # targets
>
จับคู่การอ้างอิงค่าแหล่งที่มากับรายการการอ้างอิงค่าเป้าหมายตามแกนที่เฉพาะเจาะจง
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| axis_name | ::mlir::sdy::AxisRefAttr |
การอ้างอิงถึงแกนแบบเต็มหรือแกนย่อยที่แยก |
| source | ::mlir::sdy::EdgeValueRefAttr |
การอ้างอิงถึงดัชนีที่เฉพาะเจาะจงของขอบค่าประเภท type |
| เป้าหมาย | ::llvm::ArrayRef<EdgeValueRefAttr> |
รายการค่าเป้าหมายของ Edge |
DimMappingAttr
รายการดัชนีปัจจัยสำหรับมิติข้อมูล
รายการที่ว่างเปล่าแสดงว่าเป็นการแมปค่าว่าง (ระบบจะแยกวิเคราะห์/พิมพ์ค่านี้
ด้วย *) กล่าวคือ ไม่ได้แมปมิติข้อมูลกับปัจจัยใดๆ
ข้อจำกัด:
- มีดัชนีปัจจัยอย่างน้อย 1 รายการ
- ดัชนีปัจจัยต้องอยู่ในช่วง [0,
$factor_sizes) - หากมีหลายปัจจัย จะต้องไม่มีปัจจัยใดมีขนาดเป็น 1
- ไม่มีดัชนีปัจจัยที่ซ้ำกัน
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| factor_indices | ::llvm::ArrayRef<int64_t> |
ปัจจัยที่มิติข้อมูลนี้แมปอยู่ |
DimensionShardingAttr
การแบ่งมิติข้อมูล
รายการชื่อแกนที่จะแบ่งมิติข้อมูลของ Tensor จากเมเจอร์ไปเป็นไมเนอร์ บูลีนที่ระบุว่ามิติข้อมูลสามารถแบ่งย่อยได้อีกหรือไม่ และจำนวนเต็มที่ไม่บังคับซึ่งระบุลำดับความสำคัญของการแบ่งมิติข้อมูลนี้ ซึ่งจะได้รับการพิจารณาในระหว่างการเผยแพร่การแบ่ง ลำดับความสำคัญมาจากคำอธิบายประกอบการแบ่งกลุ่มผู้ใช้ และค่าที่ต่ำกว่าจะหมายถึงลำดับความสำคัญที่สูงกว่า ระบบจะถือว่ามีลำดับความสำคัญสูงสุดเมื่อไม่มีลำดับความสำคัญในคำอธิบายประกอบ
ข้อจำกัด:
- องค์ประกอบใน
axesต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในAxisRefListAttr - หากการแยกมิติข้อมูลมีลำดับความสำคัญ ให้ทำดังนี้
- ลำดับความสำคัญมากกว่าหรือเท่ากับ 0
- มิติข้อมูลมีแกนอย่างน้อย 1 แกนหากปิดอยู่
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| แกน | ::llvm::ArrayRef<AxisRefAttr> |
การอ้างอิงแกน |
| is_closed | bool |
ไม่ว่าจะไม่สามารถแบ่งมิติข้อมูลนี้ออกเป็นส่วนๆ ได้อีก |
| ลำดับความสำคัญ | std::optional<int64_t> |
ลำดับความสำคัญที่ใช้ระหว่างการเผยแพร่ตามลำดับความสำคัญของผู้ใช้ |
EdgeValueRefAttr
การอ้างอิงถึงดัชนีที่เฉพาะเจาะจงของขอบค่าประเภท type
ไวยากรณ์:
#sdy.edge_value_ref<
`operand` | `result`, # type
int64_t # index
>
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| ประเภท | ::mlir::sdy::EdgeNodeType |
enum ของประเภท EdgeNodeType |
| ดัชนี | int64_t |
ดัชนีจำนวนเต็ม (0, 1, 2 ฯลฯ) |
ListOfAxisRefListsAttr
รายการอ้างอิงของแกน
ไวยากรณ์:
#sdy.list_of_axis_ref_lists<
::llvm::ArrayRef<AxisRefListAttr> # value
>
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| value | ::llvm::ArrayRef<AxisRefListAttr> |
ManualAxesAttr
รายการแกนที่ ManualComputationOp เป็นแบบกำหนดเอง
ไวยากรณ์:
#sdy.manual_axes<
::llvm::ArrayRef<StringAttr> # value
>
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| value | ::llvm::ArrayRef<StringAttr> |
MeshAttr
Mesh ของแกนและรายการอุปกรณ์
ไวยากรณ์:
#sdy.mesh<
::llvm::ArrayRef<MeshAxisAttr>, # axes
::llvm::ArrayRef<int64_t> # device_ids
>
Mesh คือรายการแกนและรายการรหัสอุปกรณ์ที่ไม่บังคับซึ่งระบุลำดับอุปกรณ์
หากรายการแกนว่างเปล่า
- หากไม่ได้ระบุ
device_idsจะถือว่าเป็นตาข่ายว่าง - หากระบุ
device_idsจะต้องเป็นจำนวนเต็มที่ไม่ใช่ค่าลบ รายการเดียว ซึ่งเราเรียกว่าตาข่ายการแยกส่วนสูงสุด
หากระบุรายการแกน
- หากระบุรายการรหัสอุปกรณ์ ผลคูณของขนาดแกนควร ตรงกับจำนวนอุปกรณ์
- หากไม่ได้ระบุรายการรหัสอุปกรณ์ รายการรหัสอุปกรณ์โดยนัยจะเป็น iota(product(axes)) เพื่อความสะดวก เราจึงไม่อนุญาตให้ระบุรายการรหัสอุปกรณ์ที่เหมือนกับ iota(product(axes)) ในกรณีนี้ ไม่ควรระบุรายการรหัสอุปกรณ์
- ไม่ใช่ตาข่ายการแบ่งส่วนสูงสุดแม้ว่าขนาดรวมของแกนจะเป็น 1
ตัวอย่างของ Mesh มีดังนี้
- Mesh ว่างแสดงถึง Mesh ตัวยึดตำแหน่งที่สามารถแทนที่ได้ในระหว่าง การเผยแพร่: <[]>
- Mesh ที่ไม่มีรายการแกนและมีรหัสอุปกรณ์ที่ไม่เป็นลบเพียงรายการเดียว ซึ่งเป็น Mesh ที่มีการแยกส่วนสูงสุด: <[], device_ids=[3]>
- Mesh ที่มี 2 แกนและรหัสอุปกรณ์โดยนัย iota(6): <["a"=2, "b"=3]>
- กริดที่มี 2 แกนและรหัสอุปกรณ์ที่ชัดเจนซึ่งระบุลำดับอุปกรณ์ <["a"=3, "b"=2], device_ids=[0, 2, 4, 1, 3, 5]>
ข้อจำกัด:
- องค์ประกอบใน
device_idsต้องไม่เป็นค่าลบ - หาก
axesว่างเปล่า ขนาดของdevice_idsจะเป็น 0 (ตาข่ายว่างเปล่า) หรือ 1 (ตาข่ายการแยกข้อมูลสูงสุด) ก็ได้ - หาก
axesไม่ว่างเปล่า ให้ทำดังนี้- องค์ประกอบใน
axesต้องไม่มีชื่อซ้ำกัน - หากระบุ
device_idsแล้วdevice_idsเดิมจะไม่ใช่iota(product(axis_sizes))และdevice_idsที่จัดเรียงแล้วจะเป็นiota(product(axis_sizes))
- องค์ประกอบใน
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| แกน | ::llvm::ArrayRef<MeshAxisAttr> |
แกนของตาข่าย |
| device_ids | ::llvm::ArrayRef<int64_t> |
การเรียงลำดับอุปกรณ์ที่ชัดเจนหรือรหัสอุปกรณ์สูงสุด |
MeshAxisAttr
แกนที่มีชื่อในตาข่าย
ไวยากรณ์:
#sdy.mesh_axis<
::llvm::StringRef, # name
int64_t # size
>
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| name | ::llvm::StringRef |
name |
| ขนาด | int64_t |
ขนาดของแกนนี้ |
OpShardingRuleAttr
ระบุวิธีแบ่งพาร์ติชันการดำเนินการ
ไวยากรณ์:
#sdy.op_sharding_rule<
::llvm::ArrayRef<int64_t>, # factor_sizes
::llvm::ArrayRef<TensorMappingAttr>, # operand_mappings
::llvm::ArrayRef<TensorMappingAttr>, # result_mappings
::llvm::ArrayRef<int64_t>, # reduction_factors
::llvm::ArrayRef<int64_t>, # need_replication_factors
::llvm::ArrayRef<int64_t>, # permutation_factors
::llvm::ArrayRef<int64_t>, # blocked_propagation_factors
bool # is_custom_rule
>
กฎการแบ่งข้อมูลระบุวิธีแบ่งการดำเนินการตามพร็อพเพอร์ตี้ต่างๆ ในการดำเนินการ เช่น แอตทริบิวต์ รูปร่างของตัวถูกดำเนินการ รูปร่างของผลลัพธ์ เป็นต้น ตัวอย่างเช่น
%0 = stablehlo.add %arg0, %arg1 {
sdy.sharding_rule = #sdy.op_sharding_rule<
([i, j],[i, j])->([i, j])
{i=8, j=8}>
} : tensor<8x8xf32>
%1 = stablehlo.dot_general %arg2, %arg3, contracting_dims = [1] x [0] {
sdy.sharding_rule = #sdy.op_sharding_rule<
([i, k],[k, j])->([i, j])
{i=8, j=16, k=8}>
}: (tensor<8x8xf32>, tensor<8x16xf32>) -> tensor<8x16xf32>
โปรดทราบว่าเราอนุญาตให้ใช้ปัจจัยที่มีขนาด 1 แม้ว่าจะไม่สามารถแยกส่วนได้ ซึ่งส่วนใหญ่เป็นไปเพื่อให้สมบูรณ์เนื่องจาก Op หลายรายการ เช่น Op แบบ Pointwise มีขนาด มิติข้อมูล 1 ที่สอดคล้องกันในตัวถูกดำเนินการและผลลัพธ์
ประเภทปัจจัย:
reduction_factorsมีดัชนีของแฟกเตอร์ที่ต้องลด เช่น มิติข้อมูลการทำสัญญาในการดำเนินการแบบจุด ปัจจัยเหล่านี้อาจอยู่ในตัวถูกดำเนินการแต่ไม่อยู่ในผลลัพธ์need_replication_factorsมีดัชนีของปัจจัยที่ต้องมีการจำลองแบบเต็ม เช่น มิติข้อมูลที่จัดเรียงในการดำเนินการจัดเรียงpermutation_factorsมีดัชนีของปัจจัยที่ต้องใช้ collective-permute หากมีการแบ่งส่วน เช่น มิติข้อมูลการเพิ่มพื้นที่ใน การดำเนินการ pad- ปัจจัยอื่นๆ ทั้งหมดถือเป็นปัจจัยแบบส่งผ่าน ซึ่งหมายถึงปัจจัย ที่ไม่ต้องมีการสื่อสารใดๆ หากมีการแบ่งข้อมูลในลักษณะเดียวกันในเทนเซอร์ทั้งหมด ที่แมปกับปัจจัยเหล่านั้น
blocked_propagation_factors มีปัจจัยที่ไม่อนุญาตให้เผยแพร่การแบ่งพาร์ติชัน ซึ่งตั้งฉากกับประเภทปัจจัย กล่าวคือ ปัจจัยการส่งต่อที่ถูกบล็อกอาจเป็นปัจจัยประเภทใดก็ได้
is_custom_rule อธิบายว่านี่คือกฎที่ผู้ใช้กำหนดหรือไม่ ผู้ใช้
สามารถกำหนดกฎการแบ่งข้อมูลสำหรับคอลที่กำหนดเองหรือเขียนทับ
กฎการแบ่งข้อมูลที่กำหนดไว้ล่วงหน้าสำหรับการดำเนินการมาตรฐาน ระบบจะเก็บรักษากฎที่กำหนดเองไว้เสมอ/ไม่นำออก
ข้อจำกัด:
- จำนวนการแมปตัวถูกดำเนินการ/ผลลัพธ์ต้องตรงกับจำนวนตัวถูกดำเนินการ/ผลลัพธ์ของ Op
- มีการแมปอย่างน้อย 1 รายการ (ต้องมีกฎสำหรับการดำเนินการที่ไม่มีตัวถูกดำเนินการ/ผลลัพธ์)
- แรงค์ของแต่ละ
TensorMappingAttrจะตรงกับแรงค์ของ ประเภทเทนเซอร์ที่เกี่ยวข้อง - สำหรับแต่ละกลุ่มของปัจจัย (
reduction_factors,need_replication_factors,permutation_factors) ให้ทำดังนี้- องค์ประกอบต้องอยู่ในช่วง [0,
$factor_sizes] - ไม่มีดัชนีปัจจัยที่ซ้ำกันภายในแต่ละกลุ่มและในกลุ่มต่างๆ
- องค์ประกอบต้องอยู่ในช่วง [0,
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| factor_sizes | ::llvm::ArrayRef<int64_t> |
ขนาดของปัจจัยทั้งหมดในกฎนี้ |
| operand_mappings | ::llvm::ArrayRef<TensorMappingAttr> |
การแมปตัวถูกดำเนินการ |
| result_mappings | ::llvm::ArrayRef<TensorMappingAttr> |
การแมปผลลัพธ์ |
| reduction_factors | ::llvm::ArrayRef<int64_t> |
ปัจจัยที่ต้องลด |
| need_replication_factors | ::llvm::ArrayRef<int64_t> |
ปัจจัยที่ต้องมีการจำลองแบบเต็ม |
| permutation_factors | ::llvm::ArrayRef<int64_t> |
ปัจจัยที่ต้องใช้ collective-permute |
| blocked_propagation_factors | ::llvm::ArrayRef<int64_t> |
ปัจจัยที่ไม่ได้เผยแพร่การแบ่งข้อมูล |
| is_custom_rule | bool |
ไม่ว่ากฎนั้นจะใช้กับ stablehlo.custom_call หรือไม่ |
PropagationEdgesAttr
ข้อมูลเมตาของ Edge การเผยแพร่สำหรับขั้นตอนการเผยแพร่ทั้งหมด
ไวยากรณ์:
#sdy.propagation_edges<
::llvm::ArrayRef<PropagationOneStepAttr> # value
>
รายการรายละเอียดการแพร่กระจายต่อแกนสำหรับค่า โดยจัดกลุ่มตามดัชนีขั้นตอน
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| value | ::llvm::ArrayRef<PropagationOneStepAttr> |
PropagationOneStepAttr
ข้อมูลเมตาการเผยแพร่ต่อขั้นตอน
ไวยากรณ์:
#sdy.propagation_one_step<
int64_t, # step_index
::llvm::ArrayRef<AxisToPropagationDetailsAttr> # axis_entries
>
รายละเอียดการขยายสำหรับแกนทั้งหมดในขั้นตอนการขยายเดียว
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| step_index | int64_t |
ดัชนีขั้นตอน |
| axis_entries | ::llvm::ArrayRef<AxisToPropagationDetailsAttr> |
รายละเอียดการส่งต่อแกนตามการตัดสินใจในการส่งต่อ |
SubAxisInfoAttr
ข้อมูลเกี่ยวกับวิธีที่แกนย่อยนี้ได้มาจากแกนเต็ม
ไวยากรณ์:
#sdy.sub_axis_info<
int64_t, # pre_size
int64_t # size
>
เมื่อแยกแกนแบบเต็มออกเป็นแกนย่อย n แกน ระบบจะปรับรูปร่างแกนเป็น [k_1,...,k_n] และแกนย่อยที่ i จะแสดงได้ด้วยผลคูณของขนาดแกนทั้งหมดทางด้านซ้าย m=prod(k_1,...,k_(i-1)) (หรือที่เรียกว่าขนาดก่อนหน้า) และขนาด k_i ดังนั้น แอตทริบิวต์ sub-axis-info จึงมีตัวเลข 2 ตัวดังกล่าวและแสดงดังนี้ (m)k สำหรับขนาดก่อนหน้า m และขนาด k
ข้อจำกัด:
pre-sizeมีค่าอย่างน้อย 1sizeมากกว่า 1pre-sizeต้องหารขนาดของแกนเต็ม นั่นคือทั้งpre-sizeและsizeหารขนาดของแกนเต็ม และแกนย่อยต้องไม่เกินแกนเต็ม- ขนาดของแกนย่อยไม่เท่ากับขนาดของแกนเต็มที่สอดคล้องกัน ในกรณีนี้ควรใช้แกนเต็มแทน
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| pre_size | int64_t |
ผลคูณของขนาดแกนย่อยทางด้านซ้ายของแกนย่อยนี้ |
| ขนาด | int64_t |
ขนาดของแกนย่อยนี้ |
TensorMappingAttr
การแมปปัจจัยสำหรับแต่ละมิติของเทนเซอร์
ไวยากรณ์:
#sdy.tensor_mapping<
::llvm::ArrayRef<DimMappingAttr> # dim_mappings
>
ข้อจำกัด:
- องค์ประกอบใน
dim_mappingsต้องเป็นไปตามข้อจำกัดในDimMappingAttr - ไม่มีดัชนีปัจจัยที่ซ้ำกันในมิติข้อมูล
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| dim_mappings | ::llvm::ArrayRef<DimMappingAttr> |
การแมปมิติข้อมูล |
TensorShardingAttr
การแบ่งส่วนเทนเซอร์
ไวยากรณ์:
#sdy.sharding<
::mlir::Attribute, # mesh_or_ref
::llvm::ArrayRef<DimensionShardingAttr>, # dim_shardings
::llvm::ArrayRef<AxisRefAttr>, # replicated_axes
::llvm::ArrayRef<AxisRefAttr>, # unreduced_axes
`sum` | `max` | `min` # reduction_op
>
การแบ่งพาร์ติชัน Tensor จะเชื่อมโยงกับ Mesh ที่เฉพาะเจาะจง และอ้างอิงได้เฉพาะชื่อแกนจาก Mesh นั้น การแบ่งมิติข้อมูลจะบอกเราสำหรับแต่ละมิติข้อมูลของ Tensor ตามแกน (หรือแกนย่อย) ที่มีการแบ่งจากแกนหลักไป แกนรอง แกนอื่นๆ ทั้งหมดที่ไม่ได้แชร์มิติข้อมูลจะจำลองโดยนัยหรือ โดยชัดแจ้ง (หากปรากฏในรายการแกนที่จำลอง)
โปรดทราบว่าการไม่มีแอตทริบิวต์การแยกส่วนในเทนเซอร์จะเทียบเท่ากับการแยกส่วนเทนเซอร์แบบเปิดอย่างเต็มรูปแบบ
คุณระบุ Mesh ที่การแบ่งข้อมูลนี้เชื่อมโยงได้โดยใช้สัญลักษณ์
name ซึ่งอ้างอิงถึงสัญลักษณ์ MeshOp ที่เกี่ยวข้อง หรือใช้ MeshAttr แบบอินไลน์
การแยกส่วนอาจมีแกนที่ไม่ได้ลด (ระบุโดย unreduced_axes) ซึ่งหมายความว่า
เทนเซอร์ไม่ได้ลดตามแกนเหล่านี้ เช่น หากมิติข้อมูลการทำสัญญาของ matmul มีการแบ่งพาร์ติชันตามแกน x ทั้งใน lhs และ rhs ผลลัพธ์จะไม่มีการลดตาม x การใช้ all-reduce กับ Tensor ตามแกนที่ไม่ได้ลดจะทำให้ Tensor จำลองตามแกนเหล่านั้น
อย่างไรก็ตาม Tensor ที่มีแกนที่ไม่ได้ลดไม่จำเป็นต้องลดทั้งหมดทันที แต่สามารถคงสถานะไม่ได้ลดไว้เมื่อส่งไปยังการดำเนินการเชิงเส้น เช่น stablehlo.add (ตราบใดที่ทั้ง lhs และ rhs ไม่ได้ลด) และลดทั้งหมดในภายหลัง เราถือว่าประเภทการลดคือผลรวม ส่วนการลดอื่นๆ อาจ
รองรับในอนาคต
ข้อจำกัด:
- องค์ประกอบใน
dim_shardingsต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในDimensionShardingAttr - องค์ประกอบใน
replicated_axesต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในAxisRefListAttr - องค์ประกอบใน
unreduced_axesต้องเป็นไปตามข้อจำกัดที่ระบุไว้ในAxisRefListAttr - หากประเภท Tensor ที่เกี่ยวข้องไม่ใช่
ShapedTypeการชาร์ดดิ้งต้องมีอันดับเป็น 0 และไม่มีแกนที่จำลอง - หากเป็น
ShapedTypeให้ทำดังนี้- เทนเซอร์ควรมีอันดับ
- จำนวนการแบ่งมิติข้อมูลเท่ากับอันดับของเทนเซอร์
- ระบบจะไม่แยกมิติข้อมูลที่มีขนาด 0
- ไม่มีการอ้างอิงแกนหรือแกนย่อยที่ซ้ำกันซึ่งทับซ้อนกัน
ใน
dim_shardings,replicated_axesและunreduced_axes - รายการใน
replicated_axesและunreduced_axesจะเรียงตามmesh_or_ref(ดูAxisRefAttr::getMeshComparator)
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| mesh_or_ref | ::mlir::Attribute |
แอตทริบิวต์ของตาข่ายหรือแอตทริบิวต์อ้างอิงสัญลักษณ์ของตาข่ายแบน |
| dim_shardings | ::llvm::ArrayRef<DimensionShardingAttr> |
การแบ่งมิติข้อมูล |
| replicated_axes | ::llvm::ArrayRef<AxisRefAttr> |
การอ้างอิงแกน |
| unreduced_axes | ::llvm::ArrayRef<AxisRefAttr> |
การอ้างอิงแกน |
| reduction_op | ::mlir::sdy::ReductionOp |
enum ของประเภท ReductionOp |
TensorShardingPerValueAttr
การแยกส่วน Tensor ต่อตัวถูกดำเนินการ/ผลลัพธ์ของ Op
ไวยากรณ์:
#sdy.sharding_per_value<
::llvm::ArrayRef<TensorShardingAttr> # shardings
>
รายการของ TensorShardingAttr โดยมี 1 รายการสำหรับตัวถูกดำเนินการ/ผลลัพธ์แต่ละรายการของ Op
ข้อจำกัด:
- องค์ประกอบใน
shardingsต้องเป็นไปตามข้อจำกัดของTensorShardingAttr
พารามิเตอร์ ได้แก่
| พารามิเตอร์ | ประเภท C++ | คำอธิบาย |
|---|---|---|
| การแบ่งส่วน | ::llvm::ArrayRef<TensorShardingAttr> |
การแบ่งข้อมูลตามค่า |
Enum
EdgeNodeType
Edge node type enum
เคส
| สัญลักษณ์ | ค่า | สตริง |
|---|---|---|
| OPERAND | 0 |
ตัวถูกดำเนินการ |
| ผลลัพธ์ | 1 |
ผลลัพธ์ |
PropagationDirection
การแจงนับทิศทางการเผยแพร่
เคส
| สัญลักษณ์ | ค่า | สตริง |
|---|---|---|
| ไม่มี | 0 |
ไม่มี |
| ส่งต่อ | 1 |
ส่งต่อ |
| ย้อนกลับ | 2 |
ย้อนกลับ |
| ทั้งสองฝ่าย | 3 |
ทั้งสองฝ่าย |
ReductionOp
Reduction op enum
เคส
| สัญลักษณ์ | ค่า | สตริง |
|---|---|---|
| SUM | 0 |
รวม |
| สูงสุด | 1 |
สูงสุด |
| นาที | 2 |
นาที |