From 6a7732345397c5afebb0f0e967c3a16fbf18fa30 Mon Sep 17 00:00:00 2001 From: bhalimi <benjamin.halimi@cea.fr> Date: Tue, 11 Mar 2025 10:44:10 +0000 Subject: [PATCH 1/3] hotfix the backend issue --- src/PTQ/PTQ.cpp | 30 +++++++++--------------------- src/QAT/QAT_FixedQ.cpp | 6 ++---- 2 files changed, 11 insertions(+), 25 deletions(-) diff --git a/src/PTQ/PTQ.cpp b/src/PTQ/PTQ.cpp index 05ab485..f4396f0 100644 --- a/src/PTQ/PTQ.cpp +++ b/src/PTQ/PTQ.cpp @@ -171,7 +171,7 @@ bool insertRoundBelowProducer(std::shared_ptr<Node> node, std::shared_ptr<GraphV { std::shared_ptr<Aidge::Node> roundNode = Round(node->name() + "_Round"); roundNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - roundNode->getOperator()->setBackend(node->getOperator()->backend()); + roundNode->getOperator()->setBackend("cpu"); insertChildren(node, roundNode, graphView); roundNode->attributes()->addAttr("quantization.ptq.isProducerRounding", 0.0); @@ -268,17 +268,7 @@ static std::shared_ptr<Tensor> getBiasTensor(std::shared_ptr<Node> node) std::vector<std::shared_ptr<Node>> retrieveNodeVector(std::shared_ptr<GraphView> graphView, bool newSchedule, bool verbose) { - std::vector<std::shared_ptr<Node>> nodeVector; - - SequentialScheduler scheduler(graphView); - - if (newSchedule) - { - scheduler.resetScheduling(); - scheduler.generateScheduling(); // old way : scheduler.forward(); - } - - nodeVector = scheduler.getSequentialStaticScheduling(); + std::vector<std::shared_ptr<Node>> nodeVector = graphView->getOrderedNodes(); fixScheduling(nodeVector); nodeVector = removeMatchingNodes(nodeVector, "Producer"); @@ -348,8 +338,7 @@ bool insertScalingBelowProducer(std::shared_ptr<Node> producerNode, double scali std::shared_ptr<Node> scalingNode = createScalingNode(scalingNodeName, {"isProducerScaling"}, scalingFactor); scalingNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - auto producerOp = std::static_pointer_cast<OperatorTensor>(producerNode->getOperator()); - scalingNode->getOperator()->setBackend(producerOp->getOutput(0)->backend()); + scalingNode->getOperator()->setBackend("cpu"); insertChildren(producerNode, scalingNode, graphView); graphView->add(scalingNode->getParent(1)); // add the scaling factor producer @@ -385,7 +374,7 @@ void insertResidualScalingNodes(std::shared_ptr<GraphView> graphView) std::shared_ptr<Node> residualNode = createScalingNode(residualNodeName, {"isScaling", "isResidual"}, 1.0); residualNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - residualNode->getOperator()->setBackend(parentNode->getOperator()->backend()); + residualNode->getOperator()->setBackend("cpu"); graphView->insertParent(node, residualNode, i, 0, 0); graphView->add(residualNode->getParent(1)); // add the scaling factor producer @@ -425,7 +414,7 @@ void insertScalingNodes(std::shared_ptr<GraphView> graphView) std::shared_ptr<Node> scalingNode = createScalingNode(scalingNodeName, {"isScaling"}, 1.0); scalingNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - scalingNode->getOperator()->setBackend(parentNode->getOperator()->backend()); + scalingNode->getOperator()->setBackend("cpu"); if (parentNode->getChildren().size() > 0) { insertChildren(parentNode, scalingNode, graphView); @@ -446,12 +435,11 @@ void insertScalingNodes(std::shared_ptr<GraphView> graphView) std::shared_ptr<Node> prevScalingNode = createScalingNode(prevScalingNodeName, {"isScaling"}, 1.0); prevScalingNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - prevScalingNode->getOperator()->setBackend(parentNode->getOperator()->backend()); + prevScalingNode->getOperator()->setBackend("cpu"); graphView->insertParent(parentNode, prevScalingNode, 0, 0, 0); graphView->add(prevScalingNode->getParent(1)); // add the scaling factor producer } - } } } @@ -1009,7 +997,7 @@ void quantizeNormalizedNetwork(std::shared_ptr<GraphView> graphView, std::uint8_ std::shared_ptr<Node> quantizerNode = Quantizer(oldScalingFactor, -(signedMax + 1), signedMax, node->name()); quantizerNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - quantizerNode->getOperator()->setBackend(node->getOperator()->backend()); + quantizerNode->getOperator()->setBackend("cpu"); graphView->replace({node, node->getParent(1)}, {quantizerNode}); if (optimizeSigns) @@ -1063,7 +1051,7 @@ static void insertCompensationNodes(std::shared_ptr<GraphView> graphView, std::u mulNode->attributes()->addAttr("quantization.ptq.isCompensation", 0.0); mulNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - mulNode->getOperator()->setBackend(node->getOperator()->backend()); + mulNode->getOperator()->setBackend("cpu"); graphView->insertParent(node, mulNode, 0, 0, 0); @@ -1074,7 +1062,7 @@ static void insertCompensationNodes(std::shared_ptr<GraphView> graphView, std::u coeffProducer->getOperator()->setOutput(0, coeffTensor); coeffProducer->getOperator()->setDataType(DataType::Float64); - coeffProducer->getOperator()->setBackend(node->getOperator()->backend()); + coeffProducer->getOperator()->setBackend("cpu"); graphView->add(coeffProducer); // needed ? diff --git a/src/QAT/QAT_FixedQ.cpp b/src/QAT/QAT_FixedQ.cpp index c182d6c..b51123c 100644 --- a/src/QAT/QAT_FixedQ.cpp +++ b/src/QAT/QAT_FixedQ.cpp @@ -152,10 +152,8 @@ void QuantFixedQ::insertAndInitQuantizers(std::shared_ptr<GraphView> graphView, void QuantFixedQ::devQAT(std::shared_ptr<GraphView> graphView) { - SequentialScheduler scheduler(graphView); - scheduler.generateScheduling(); - auto s = scheduler.getSequentialStaticScheduling(); - for (std::shared_ptr<Node> node : s) + auto nodeVector = graphView->getOrderedNodes(); + for (std::shared_ptr<Node> node : nodeVector) Log::info(" name : {} ", node->name()); } -- GitLab From 302ebd0373c8bb4e9965a0cfdfd0090895b4852c Mon Sep 17 00:00:00 2001 From: bhalimi <benjamin.halimi@cea.fr> Date: Wed, 12 Mar 2025 10:12:52 +0000 Subject: [PATCH 2/3] draft the determineBackend() routine --- src/PTQ/PTQ.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/PTQ/PTQ.cpp b/src/PTQ/PTQ.cpp index f4396f0..42bac40 100644 --- a/src/PTQ/PTQ.cpp +++ b/src/PTQ/PTQ.cpp @@ -111,6 +111,35 @@ static std::shared_ptr<Aidge::Node> getUniqueChildren(std::shared_ptr<Aidge::Nod return *(childrenSet.begin()); } +static std::string determineBackend(std::shared_ptr<Aidge::Node> node) +{ + std::string backend = node->getOperator()->backend(); + + if (backend != "") + return backend; + else + { + // gather the parent backends + + std::set<std::string> parentBackends; + for (auto parent : node->getParents()) + parentBackends.insert(determineBackend(parent)); // it always answers a non empty value ! + + // check if we have two or more different backends gathered + + if (parentBackends.size() > 1) + { + Log::warn(" Unable to determine backend of node {} due to conflicting parent ones !", node->name()); + return (*parentBackends.begin()); + } + + // if all parents have the same backend return it + + if (parentBackends.size() == 1) + return (*parentBackends.begin()); + } +} + static int getInputIndex(std::shared_ptr<Node> node, std::shared_ptr<Node> parentNode) { int index = 0; -- GitLab From 2e21e5dd46cdf102f5b7400ebddbc31aa9201813 Mon Sep 17 00:00:00 2001 From: bhalimi <benjamin.halimi@cea.fr> Date: Wed, 12 Mar 2025 16:01:26 +0000 Subject: [PATCH 3/3] make use of determineBackend() --- src/PTQ/PTQ.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/PTQ/PTQ.cpp b/src/PTQ/PTQ.cpp index 42bac40..dbf4b62 100644 --- a/src/PTQ/PTQ.cpp +++ b/src/PTQ/PTQ.cpp @@ -138,6 +138,8 @@ static std::string determineBackend(std::shared_ptr<Aidge::Node> node) if (parentBackends.size() == 1) return (*parentBackends.begin()); } + + return "cpu"; // escape path when no parents are found } static int getInputIndex(std::shared_ptr<Node> node, std::shared_ptr<Node> parentNode) @@ -200,7 +202,7 @@ bool insertRoundBelowProducer(std::shared_ptr<Node> node, std::shared_ptr<GraphV { std::shared_ptr<Aidge::Node> roundNode = Round(node->name() + "_Round"); roundNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - roundNode->getOperator()->setBackend("cpu"); + roundNode->getOperator()->setBackend(determineBackend(node)); insertChildren(node, roundNode, graphView); roundNode->attributes()->addAttr("quantization.ptq.isProducerRounding", 0.0); @@ -367,7 +369,7 @@ bool insertScalingBelowProducer(std::shared_ptr<Node> producerNode, double scali std::shared_ptr<Node> scalingNode = createScalingNode(scalingNodeName, {"isProducerScaling"}, scalingFactor); scalingNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - scalingNode->getOperator()->setBackend("cpu"); + scalingNode->getOperator()->setBackend(determineBackend(producerNode)); insertChildren(producerNode, scalingNode, graphView); graphView->add(scalingNode->getParent(1)); // add the scaling factor producer @@ -403,7 +405,7 @@ void insertResidualScalingNodes(std::shared_ptr<GraphView> graphView) std::shared_ptr<Node> residualNode = createScalingNode(residualNodeName, {"isScaling", "isResidual"}, 1.0); residualNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - residualNode->getOperator()->setBackend("cpu"); + residualNode->getOperator()->setBackend(determineBackend(parentNode)); graphView->insertParent(node, residualNode, i, 0, 0); graphView->add(residualNode->getParent(1)); // add the scaling factor producer @@ -443,7 +445,7 @@ void insertScalingNodes(std::shared_ptr<GraphView> graphView) std::shared_ptr<Node> scalingNode = createScalingNode(scalingNodeName, {"isScaling"}, 1.0); scalingNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - scalingNode->getOperator()->setBackend("cpu"); + scalingNode->getOperator()->setBackend(determineBackend(parentNode)); if (parentNode->getChildren().size() > 0) { insertChildren(parentNode, scalingNode, graphView); @@ -464,7 +466,7 @@ void insertScalingNodes(std::shared_ptr<GraphView> graphView) std::shared_ptr<Node> prevScalingNode = createScalingNode(prevScalingNodeName, {"isScaling"}, 1.0); prevScalingNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - prevScalingNode->getOperator()->setBackend("cpu"); + prevScalingNode->getOperator()->setBackend(determineBackend(parentNode)); graphView->insertParent(parentNode, prevScalingNode, 0, 0, 0); graphView->add(prevScalingNode->getParent(1)); // add the scaling factor producer @@ -1026,7 +1028,7 @@ void quantizeNormalizedNetwork(std::shared_ptr<GraphView> graphView, std::uint8_ std::shared_ptr<Node> quantizerNode = Quantizer(oldScalingFactor, -(signedMax + 1), signedMax, node->name()); quantizerNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - quantizerNode->getOperator()->setBackend("cpu"); + quantizerNode->getOperator()->setBackend(determineBackend(node)); graphView->replace({node, node->getParent(1)}, {quantizerNode}); if (optimizeSigns) @@ -1080,7 +1082,7 @@ static void insertCompensationNodes(std::shared_ptr<GraphView> graphView, std::u mulNode->attributes()->addAttr("quantization.ptq.isCompensation", 0.0); mulNode->getOperator()->setDataType(DataType::Float64); // getDataType(parentNode) - mulNode->getOperator()->setBackend("cpu"); + mulNode->getOperator()->setBackend(determineBackend(node)); graphView->insertParent(node, mulNode, 0, 0, 0); @@ -1091,7 +1093,7 @@ static void insertCompensationNodes(std::shared_ptr<GraphView> graphView, std::u coeffProducer->getOperator()->setOutput(0, coeffTensor); coeffProducer->getOperator()->setDataType(DataType::Float64); - coeffProducer->getOperator()->setBackend("cpu"); + coeffProducer->getOperator()->setBackend(determineBackend(node)); graphView->add(coeffProducer); // needed ? -- GitLab