Skip to content
Snippets Groups Projects
Commit 4e15652f authored by Cyril Moineau's avatar Cyril Moineau
Browse files

Adapt Export serialize to refactor.

parent 9b322f59
No related branches found
No related tags found
3 merge requests!279v0.4.0,!253v0.4.0,!163Export refactor
...@@ -10,6 +10,5 @@ SPDX-License-Identifier: EPL-2.0 ...@@ -10,6 +10,5 @@ SPDX-License-Identifier: EPL-2.0
from aidge_core.aidge_core import * # import so generated by PyBind from aidge_core.aidge_core import * # import so generated by PyBind
import aidge_core.export_utils import aidge_core.export_utils
import aidge_core.utils import aidge_core.utils
# TODO: Commented for dev the new register system from aidge_core.aidge_export_aidge import serialize_to_cpp
# from aidge_core.aidge_export_aidge import serialize_to_cpp
from ._version import * from ._version import *
...@@ -78,22 +78,19 @@ def serialize_to_cpp(export_folder: str, ...@@ -78,22 +78,19 @@ def serialize_to_cpp(export_folder: str,
continue continue
# Next nodes to treat are children of current node # Next nodes to treat are children of current node
open_nodes += list(node.get_children()) open_nodes += list(node.get_children())
node.get_operator().set_backend(ExportSerialize._name)
op_impl = node.get_operator().get_impl() op_impl = node.get_operator().get_impl()
if op_impl is None: if op_impl is None:
raise RuntimeError(f"Operator {node.name()}[{node.type()}] doesn't have an implementation.") raise RuntimeError(f"Operator {node.name()}[{node.type()}] doesn't have an implementation.")
if not isinstance(op_impl, ExportSerialize): if not isinstance(op_impl, ExportSerialize):
raise RuntimeError(f"Operator {node.name()}[{node.type()}] doesn't have an exportable backend ({op_impl}).") raise RuntimeError(f"Operator {node.name()}[{node.type()}] doesn't have an exportable backend ({op_impl}).")
node.get_operator().set_backend(ExportSerialize._name)
required_specs = op_impl.get_required_spec() required_specs = op_impl.get_required_spec()
specs = op_impl.get_best_match(required_specs) specs = op_impl.get_best_match(required_specs)
export_node = op_impl.get_export_node(specs) export_node = op_impl.get_export_node(specs)
if export_node is None: if export_node is None:
raise RuntimeError(f"Could not find export node for {node.name()}[{node.type()}].") raise RuntimeError(f"Could not find export node for {node.name()}[{node.type()}].")
op = export_node( op = export_node(
node, [], False, False) # Note: is_input and is_output is not used for this export node, None, False, False) # Note: is_input and is_output is not used for this export
set_operator.add(node.type()) set_operator.add(node.type())
......
from aidge_core.aidge_export_aidge.registry import ExportSerialize from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp, operator_register from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register(ExportSerialize, "Conv") @ExportSerialize.register(["Conv1D", "Conv2D"], ImplSpec(IOSpec(dtype.any)))
class Conv(ExportNodeCpp): class Conv(ExportNodeCpp):
def __init__(self, node): def __init__(self, node, mem_info, is_input, is_output):
super().__init__(node) super().__init__(node, mem_info, is_input, is_output)
self.config_template = str( self.config_template = str(
ROOT_EXPORT / "templates/attributes/conv.jinja") ROOT_EXPORT / "templates/attributes/conv.jinja")
self.forward_template = str( self.forward_template = str(
...@@ -14,28 +15,3 @@ class Conv(ExportNodeCpp): ...@@ -14,28 +15,3 @@ class Conv(ExportNodeCpp):
self.kernels_to_copy = [] self.kernels_to_copy = []
self.config_path = "include/parameters" self.config_path = "include/parameters"
self.config_extension = "hpp" self.config_extension = "hpp"
@classmethod
def exportable(cls, node):
return True
# def export(self, export_folder:Path, list_configs:list):
# include_path = f"attributes/{self.name}.hpp"
# filepath = export_folder / f"include/{include_path}"
# generate_file(
# filepath,
# ROOT_EXPORT / "templates/attributes/conv.jinja",
# name=self.name,
# **self.attributes
# )
# list_configs.append(include_path)
# return list_configs
# def forward(self, list_actions:list):
# list_actions.append(generate_str(
# ROOT_EXPORT /"templates/graph_ctor/conv.jinja",
# name=self.name,
# inputs=parse_node_input(self.node.inputs()),
# **self.attributes
# ))
# return list_actions
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.aidge_export_aidge.registry import ExportSerialize from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
from aidge_core.export_utils import ExportNodeCpp, operator_register
from pathlib import Path
@operator_register(ExportSerialize, "FC") @ExportSerialize.register("FC", ImplSpec(IOSpec(dtype.any)))
class FC(ExportNodeCpp): class FC(ExportNodeCpp):
def __init__(self, node): def __init__(self, node, mem_info, is_input, is_output):
super().__init__(node) super().__init__(node, mem_info, is_input, is_output)
self.config_template = str( self.config_template = str(
ROOT_EXPORT / "templates/attributes/fc.jinja") ROOT_EXPORT / "templates/attributes/fc.jinja")
self.forward_template = str( self.forward_template = str(
...@@ -16,33 +16,3 @@ class FC(ExportNodeCpp): ...@@ -16,33 +16,3 @@ class FC(ExportNodeCpp):
self.kernels_to_copy = [] self.kernels_to_copy = []
self.config_path = "include/parameters" self.config_path = "include/parameters"
self.config_extension = "hpp" self.config_extension = "hpp"
@classmethod
def exportable(cls, node):
return True
# def export(self, export_folder:Path, list_configs:list):
# include_path = f"attributes/{self.name}.hpp"
# filepath = export_folder / f"include/{include_path}"
# generate_file(
# filepath,
# ROOT_EXPORT / "templates/attributes/fc.jinja",
# name=self.name,
# InChannels=self.inputs_dims[1][1],
# OutChannels=self.operator.out_channels(),
# **self.attributes
# )
# list_configs.append(include_path)
# return list_configs
# def forward(self, list_actions:list):
# list_actions.append(generate_str(
# ROOT_EXPORT / "templates/graph_ctor/fc.jinja",
# name=self.name,
# inputs=parse_node_input(self.node.inputs()),
# **self.attributes
# ))
# return list_actions
from aidge_core.aidge_export_aidge.registry import ExportSerialize from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp, operator_register from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register(ExportSerialize,"MaxPooling") @ExportSerialize.register(["MaxPooling1D", "MaxPooling2D", "MaxPooling3D"], ImplSpec(IOSpec(dtype.any)))
class MaxPooling(ExportNodeCpp): class MaxPooling(ExportNodeCpp):
def __init__(self, node): def __init__(self, node, mem_info, is_input, is_output):
super().__init__(node) super().__init__(node, mem_info, is_input, is_output)
self.config_template = str( self.config_template = str(
ROOT_EXPORT / "templates/attributes/maxpooling.jinja") ROOT_EXPORT / "templates/attributes/maxpooling.jinja")
self.forward_template = str( self.forward_template = str(
...@@ -14,28 +15,3 @@ class MaxPooling(ExportNodeCpp): ...@@ -14,28 +15,3 @@ class MaxPooling(ExportNodeCpp):
self.kernels_to_copy = [] self.kernels_to_copy = []
self.config_path = "include/parameters" self.config_path = "include/parameters"
self.config_extension = "hpp" self.config_extension = "hpp"
@classmethod
def exportable(cls, node):
return True
# def export(self, export_folder:Path, list_configs:list):
# include_path = f"attributes/{self.name}.hpp"
# filepath = export_folder / f"include/{include_path}"
# generate_file(
# filepath,
# ROOT_EXPORT / "templates/attributes/maxpooling.jinja",
# name=self.name,
# **self.attributes
# )
# list_configs.append(include_path)
# return list_configs
# def forward(self, list_actions:list):
# list_actions.append(generate_str(
# ROOT_EXPORT / "templates/graph_ctor/maxpooling.jinja",
# name=self.name,
# inputs=parse_node_input(self.node.inputs()),
# **self.attributes
# ))
# return list_actions
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.export_utils import ExportNodeCpp, operator_register
import numpy as np import numpy as np
from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register(ExportSerialize, "Producer") @ExportSerialize.register("Producer", ImplSpec(IOSpec(dtype.any)))
class Producer(ExportNodeCpp): class Producer(ExportNodeCpp):
""" """
If there is a standardization of the export operators If there is a standardization of the export operators
then this class should be just a inheritance of ProducerCPP then this class should be just a inheritance of ProducerCPP
""" """
def __init__(self, node): def __init__(self, node, mem_info, is_input, is_output):
super().__init__(node) super().__init__(node, mem_info, is_input, is_output)
child, in_idx = self.node.output(0)[0] child, in_idx = self.node.output(0)[0]
self.values = np.array(self.operator.get_output(0)) self.values = np.array(self.operator.get_output(0))
...@@ -26,34 +27,4 @@ class Producer(ExportNodeCpp): ...@@ -26,34 +27,4 @@ class Producer(ExportNodeCpp):
self.kernels_to_copy = [] self.kernels_to_copy = []
self.config_path = "include/parameters" self.config_path = "include/parameters"
self.config_extension = "hpp" self.config_extension = "hpp"
@classmethod
def exportable(cls, node):
return True
# def export(self, export_folder:Path, list_configs:list):
# assert(len(self.node.output(0)) == 1)
# include_path = f"parameters/{self.tensor_name}.hpp"
# filepath = export_folder / f"include/{include_path}"
# aidge_tensor = self.operator.get_output(0)
# datatype = aidge2c(aidge_tensor.dtype())
# generate_file(
# filepath,
# ROOT_EXPORT / "templates/parameter.jinja",
# dims = aidge_tensor.dims(),
# data_t = datatype,
# name = self.tensor_name,
# values = str(aidge_tensor)
# )
# list_configs.append(include_path)
# return list_configs
# def forward(self, list_actions:list):
# list_actions.append(generate_str(
# ROOT_EXPORT / "templates/graph_ctor/producer.jinja",
# name=self.name,
# tensor_name=self.tensor_name,
# **self.attributes
# ))
# return list_actions
from aidge_core.aidge_export_aidge.registry import ExportSerialize from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp, operator_register from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register(ExportSerialize, "ReLU") @ExportSerialize.register("ReLU", ImplSpec(IOSpec(dtype.any)))
class ReLU(ExportNodeCpp): class ReLU(ExportNodeCpp):
def __init__(self, node): def __init__(self, node, mem_info, is_input, is_output):
super().__init__(node) super().__init__(node, mem_info, is_input, is_output)
self.config_template = "" self.config_template = ""
self.forward_template = str( self.forward_template = str(
ROOT_EXPORT / "templates/graph_ctor/relu.jinja") ROOT_EXPORT / "templates/graph_ctor/relu.jinja")
self.include_list = [] self.include_list = []
self.kernels_to_copy = [] self.kernels_to_copy = []
@classmethod
def exportable(cls, node):
return True
# def export(self, export_folder:Path, list_configs:list):
# return list_configs
# def forward(self, list_actions:list):
# list_actions.append(generate_str(
# ROOT_EXPORT / "templates/graph_ctor/relu.jinja",
# name=self.name,
# inputs=parse_node_input(self.node.inputs()),
# **self.attributes
# ))
# return list_actions
from aidge_core.aidge_export_aidge.registry import ExportSerialize from aidge_core.aidge_export_aidge.registry import ExportSerialize
from aidge_core.aidge_export_aidge import ROOT_EXPORT from aidge_core.aidge_export_aidge import ROOT_EXPORT
from aidge_core.export_utils import ExportNodeCpp, operator_register from aidge_core.export_utils import ExportNodeCpp
from aidge_core import ImplSpec, IOSpec, dtype
@operator_register(ExportSerialize, "Sub") @ExportSerialize.register("Sub", ImplSpec(IOSpec(dtype.any)))
class Sub(ExportNodeCpp): class Sub(ExportNodeCpp):
def __init__(self, node): def __init__(self, node, mem_info, is_input, is_output):
super().__init__(node) super().__init__(node, mem_info, is_input, is_output)
self.config_template = "" self.config_template = ""
self.forward_template = str( self.forward_template = str(
ROOT_EXPORT / "templates/graph_ctor/sub.jinja") ROOT_EXPORT / "templates/graph_ctor/sub.jinja")
self.include_list = [] self.include_list = []
self.kernels_to_copy = [] self.kernels_to_copy = []
@classmethod
def exportable(cls, node):
return True
# def export(self, export_folder:Path, list_configs:list):
# return list_configs
# def forward(self, list_actions:list):
# list_actions.append(generate_str(
# ROOT_EXPORT / "templates/graph_ctor/sub.jinja",
# name=self.name,
# inputs=parse_node_input(self.node.inputs()),
# **self.attributes
# ))
# return list_actions
from aidge_core.export_utils import ExportLib from aidge_core.export_utils import ExportLib
from . import ROOT_EXPORT from . import ROOT_EXPORT
import aidge_core
class ExportSerialize(ExportLib): class ExportSerialize(ExportLib):
name="export_serialize" _name="export_serialize"
aidge_core.register_Tensor(["export_serialize", aidge_core.dtype.float32],
aidge_core.get_key_value_Tensor(["cpu", aidge_core.dtype.float32]))
...@@ -203,8 +203,7 @@ class ExportNode(ABC): ...@@ -203,8 +203,7 @@ class ExportNode(ABC):
self.operator.input_category(idx) == aidge_core.InputCategory.OptionalData: self.operator.input_category(idx) == aidge_core.InputCategory.OptionalData:
pass pass
else: else:
print(self.operator.input_category(idx)) aidge_core.Log.notice(f"No input for {self.node.name()} at input {idx}")
raise RuntimeError(f"No input for {self.node.name()} at input {idx}")
for idx, list_child_node_in_id in enumerate(self.node.outputs()): for idx, list_child_node_in_id in enumerate(self.node.outputs()):
self.outputs += [node_in_id[0] self.outputs += [node_in_id[0]
for node_in_id in list_child_node_in_id] for node_in_id in list_child_node_in_id]
...@@ -257,7 +256,7 @@ class ExportNode(ABC): ...@@ -257,7 +256,7 @@ class ExportNode(ABC):
else: else:
self.attributes["mem_info_wrap_size"][idx] = 0 self.attributes["mem_info_wrap_size"][idx] = 0
else: else:
print(f"No output for {self.node.name()}") aidge_core.Log.notice(f"No output for {self.node.name()}")
class ExportNodeCpp(ExportNode): class ExportNodeCpp(ExportNode):
# Path to the template defining how to export the node definition # Path to the template defining how to export the node definition
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment