CollectiveOpInterface (Sdy_CollectiveOpInterface
)
Schnittstelle für alle kollektiven Vorgänge. Kapselt gängige „get/set“-Vorgänge für das Attribut „outSharding“ ein.
Einschränkungen:
- Der Operand muss ein Sharding haben oder
allowMissingInputSharding()
muss „wahr“ zurückgeben. out_sharding
ist für den entsprechenden Typ gültig.- Operand und Ergebnis-Sharding müssen dasselbe Mesh haben, wenn
allowDifferentMeshes()
„falsch“ zurückgibt. - Gleicher Rang für den Operanden und das Ergebnis-Sharding.
Methoden:
getOutSharding
::mlir::sdy::TensorShardingAttr getOutSharding();
Gibt die Sharding-Informationen für den Ausgabetensor der kollektiven Operation zurück.
setOutShardingAttr
void setOutShardingAttr(::mlir::sdy::TensorShardingAttr sharding);
Legt das Sharding des Ausgabetensors der kollektiven Operation fest.
getTensor
::mlir::TypedValue<::mlir::TensorType> getTensor();
Ruft den Tensoroperanden der kollektiven Operation ab.
getType
::mlir::Type getType();
Ruft den Typ des Ergebnisses der kollektiven Operation ab.
allowDifferentMeshes
bool allowDifferentMeshes();
Gibt an, ob die Sharding-Meshes für Eingabe und Ausgabe bei der kollektiven Operation unterschiedlich sein dürfen.
allowMissingInputSharding
bool allowMissingInputSharding();
Gibt an, ob die Eingabe bei der kollektiven Operation nicht geSharded werden darf, d. h. implizit vollständig repliziert werden muss.
ShardableDataFlowOpInterface (Sdy_ShardableDataFlowOpInterface
)
Eine Vorgangsschnittstelle, die es Shardy ermöglicht, Shardings über Datenflusskanten von Vorgängen zu propagieren, die diese Schnittstelle erweitern.
Eine Datenflusskante eines bestimmten Vorgangs X definiert eine Brücke zwischen einer Gruppe von Quellen (jede ist entweder ein Operand von X oder ein Operand des Blockterminators von X) und einer Gruppe von Zielen (jedes ist entweder ein Ergebnis von X oder ein Blockargument von X), sodass alle Quellen und Ziele auf dieselbe Weise geSharded werden sollten. Ein Vorgang kann mehrere Datenflusskanten haben, die orthogonal zueinander sind.
Ein Inhaber ist ein vom Nutzer angegebenes Ziel der Datenflusskante, das von der Shardy-Replikation verwendet wird. Der Nutzer kann sie frei wählen, sie muss aber statisch sein.
Beispiel:
y_1, ..., y_n = custom_op (x_1, ..., x_n)
((body_arg_1,..., body_arg_n) {
...
return return_value_1, ..., return_value_n
})
Dieser custom_op hat zwei Typen für Datenflusskanten: jeweils n Kanten zwischen return_value_i
(Quellen) und y_i
(Ziele) und n Kanten zwischen x_i
(Quellen) und body_arg_i
(Ziele). In diesem Fall sind die Edge-Inhaber mit den Zielen identisch.
Hier ein Beispiel für eine Operation mit mehreren Zielen:
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
})
Diese While-Operation hat n Datenflusskanten. Die i. Datenflusskante verläuft zwischen den Quellen x_i
, return_value_i
und den Zielen y_i
, pred_arg_i
, body_arg_i
.
Methoden:
getBlockArgumentEdgeOwnerShardings
mlir::SmallVector<mlir::sdy::TensorShardingAttr> getBlockArgumentEdgeOwnerShardings();
Gibt die Shardings aller Blockargument-Datenflusskanteneigentümer zurück.
setBlockArgumentEdgeOwnerShardings
void setBlockArgumentEdgeOwnerShardings(mlir::ArrayRef<mlir::sdy::TensorShardingAttr> shardings);
Legt shardings
für alle Blockargument-Kanteneigentümer fest.
getOpResultEdgeOwnerShardings
mlir::SmallVector<mlir::sdy::TensorShardingAttr> getOpResultEdgeOwnerShardings();
Gibt die Shardings aller Inhaber von Kanten des Ergebnisdatenflusses zurück.
setOpResultEdgeOwnerShardings
void setOpResultEdgeOwnerShardings(mlir::ArrayRef<mlir::sdy::TensorShardingAttr> shardings);
Legt shardings
aller Edge-Inhaber von Ergebnisoperatoren fest.
transformTargetSharding
mlir::sdy::TensorShardingAttr transformTargetSharding(mlir::Value target, mlir::sdy::TensorShardingAttr sharding, mlir::sdy::DataFlowShardingTransformType transformType);
Transformiert die sharding
des Ziels in Abhängigkeit von transformType
Weitere Informationen findest du unter DataFlowShardingTransformType
.
getBlockArgumentEdgeOwners
mlir::ArrayRef<mlir::BlockArgument> getBlockArgumentEdgeOwners();
Alle Edge-Inhaber des Blockierungsarguments abrufen
getOpResultEdgeOwners
mlir::ResultRange getOpResultEdgeOwners();
Alle Inhaber von Ergebniskanten für die Optimierung abrufen
getEdgeSources
mlir::SmallVector<mlir::OpOperand*> getEdgeSources(mlir::Value owner);
Ruft die Datenflusskantenquellen für die Kante owner
ab.
getEdgeOwnerFromTarget
mlir::Value getEdgeOwnerFromTarget(mlir::Value target);
Ruft den Inhaber target
einer Datenflusskante für eine target
ab, die möglicherweise der Inhaber ist.
getEdgeOwnerFromSource
mlir::Value getEdgeOwnerFromSource(mlir::OpOperand&source);
Ruft das Inhaberziel einer Datenflusskante für eine source
ab.
getNonEdgeOwnerTargets
mlir::SmallVector<mlir::Value> getNonEdgeOwnerTargets(mlir::Value owner);
Ruft die Ziele eines Datenfluss-Ecks ab, die nicht dem Inhaber gehören, und gibt das Eck owner
an.
ShardingRuleOpInterface (Sdy_ShardingRuleOpInterface
)
Eine Benutzeroberfläche, mit der der Operator seine eigene Sharding-Regel definieren kann.
Mit einer Sharding-Regel wird angegeben, wie ein Vorgang gemäß verschiedenen Eigenschaften des Vorgangs partitioniert werden kann, z. B. Attribute, die Form der Operanden oder die Form der Ergebnisse. Weitere Informationen finden Sie unter OpShardingRuleAttr
.
Methoden:
getShardingRule
mlir::sdy::OpShardingRuleAttr getShardingRule();
Gibt die Sharding-Regel der Operation zurück.