From 00ff0e15047fa90cad1428ae7f02609af60141e5 Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Tue, 15 Apr 2025 13:54:36 +0800 Subject: [PATCH 01/12] front:remotefunc --- .../functional/remotetensorfunc/__init__.py | 25 ++++ .../remotetensorfunc/changeshape.py | 23 ++++ .../remotetensorfunc/elementwise.py | 119 ++++++++++++++++++ .../nn/functional/remotetensorfunc/init.py | 19 +++ .../nn/functional/remotetensorfunc/io.py | 18 +++ .../nn/functional/remotetensorfunc/matmul.py | 8 ++ .../nn/functional/remotetensorfunc/new.py | 18 +++ .../nn/functional/remotetensorfunc/reduce.py | 24 ++++ 8 files changed, 254 insertions(+) create mode 100644 front/py/deepx/nn/functional/remotetensorfunc/__init__.py create mode 100644 front/py/deepx/nn/functional/remotetensorfunc/changeshape.py create mode 100644 front/py/deepx/nn/functional/remotetensorfunc/elementwise.py create mode 100644 front/py/deepx/nn/functional/remotetensorfunc/init.py create mode 100644 front/py/deepx/nn/functional/remotetensorfunc/io.py create mode 100644 front/py/deepx/nn/functional/remotetensorfunc/matmul.py create mode 100644 front/py/deepx/nn/functional/remotetensorfunc/new.py create mode 100644 front/py/deepx/nn/functional/remotetensorfunc/reduce.py diff --git a/front/py/deepx/nn/functional/remotetensorfunc/__init__.py b/front/py/deepx/nn/functional/remotetensorfunc/__init__.py new file mode 100644 index 00000000..b341c4e1 --- /dev/null +++ b/front/py/deepx/nn/functional/remotetensorfunc/__init__.py @@ -0,0 +1,25 @@ +from .elementwise import * +from .new import * +from .io import * +from .matmul import * +from .init import * +from .reduce import * +from .changeshape import * +__all__ = [ + "newtensor", + #io + "printtensor", + #init + "constant", "uniform","arange" , + #elementwise + "add","addscalar","sub","subscalar","mul","mulscalar","div","divscalar","rdivscalar", + "sqrt","pow","powscalar","exp","log","rsqrt", + "sin","cos","tan", + "compare","max","maxscalar","min","minscalar", + #matmul + "matmul", + #reduce + "sum","prod" ,"reducemax","reducemin", + #changeshape + "reshape", "transpose","concat","broadcastTo", +] \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/changeshape.py b/front/py/deepx/nn/functional/remotetensorfunc/changeshape.py new file mode 100644 index 00000000..b9589b31 --- /dev/null +++ b/front/py/deepx/nn/functional/remotetensorfunc/changeshape.py @@ -0,0 +1,23 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR +from deepx.scheduler import send + +def reshape(t:Tensor,shape:list[int],out:Tensor,author='miaobyte')->Tensor: + ir=DeepxIR("reshape", [t.node.name,shape], [out.node.name],author) + send(ir) + return out + +def transpose(t:Tensor,dimorder:list[int],out:Tensor,author='miaobyte')->Tensor: + ir=DeepxIR("transpose", [t.node.name,dimorder], [out.node.name],author) + send(ir) + return out + +def concat(tensors:list[Tensor],dim:int,out:Tensor,author='miaobyte')->Tensor: + ir=DeepxIR("concat", [[t.node.name for t in tensors], dim], [out.node.name],author) + send(ir) + return out + +def broadcastTo(t:Tensor,new_shape:tuple[int],out:Tensor,author='miaobyte')->Tensor: + ir=DeepxIR("broadcastTo", [t.node.name,new_shape], [out.node.name],author) + send(ir) + return out diff --git a/front/py/deepx/nn/functional/remotetensorfunc/elementwise.py b/front/py/deepx/nn/functional/remotetensorfunc/elementwise.py new file mode 100644 index 00000000..627d479a --- /dev/null +++ b/front/py/deepx/nn/functional/remotetensorfunc/elementwise.py @@ -0,0 +1,119 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR +from deepx.scheduler import send + +def add(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("add", [a.node.name, b.node.name], [out.node.name], author) + send(ir) + return out + +def add_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("addscalar", [a.node.name, b], [out.node.name], author) + send(ir) + return out + +def sub(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("sub", [a.node.name, b.node.name], [out.node.name], author) + send(ir) + return out + +def sub_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("subscalar", [a.node.name, b], [out.node.name], author) + send(ir) + return out + +def mul(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("mul", [a.node.name, b.node.name], [out.node.name], author) + send(ir) + return out + +def mul_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("mulscalar", [a.node.name, b], [out.node.name], author) + send(ir) + return out + +def div(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("div", [a.node.name, b.node.name], [out.node.name], author) + send(ir) + return out + +def div_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("divscalar", [a.node.name, b], [out.node.name], author) + send(ir) + return out + +def rdiv_scalar(a:float, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("rdivscalar", [a, b.node.name], [out.node.name], author) + send(ir) + return out + + +def sqrt(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("sqrt", [a.node.name], [out.node.name], author) + send(ir) + return out + +def pow(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("pow", [a.node.name, b.node.name], [out.node.name], author) + send(ir) + return out + +def pow_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("powscalar", [a.node.name, b], [out.node.name], author) + send(ir) + return out + +def exp(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("exp", [a.node.name], [out.node.name], author) + send(ir) + return out + +def log(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("log", [a.node.name], [out.node.name], author) + send(ir) + return out + +def rsqrt(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("rsqrt", [a.node.name], [out.node.name], author) + send(ir) + return out + +def sin(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("sin", [a.node.name], [out.node.name], author) + send(ir) + return out + +def cos(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("cos", [a.node.name], [out.node.name], author) + send(ir) + return out + +def tan(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("tan", [a.node.name], [out.node.name], author) + send(ir) + return out + +def compare(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("compare", [a.node.name, b.node.name], [out.node.name], author) + send(ir) + return out + +def max(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("max", [a.node.name, b.node.name], [out.node.name], author) + send(ir) + return out + +def max_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("maxscalar", [a.node.name, b], [out.node.name], author) + send(ir) + return out + +def min(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("min", [a.node.name, b.node.name], [out.node.name], author) + send(ir) + return out + +def min_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + ir=DeepxIR("minscalar", [a.node.name, b], [out.node.name], author) + send(ir) + return out \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/init.py b/front/py/deepx/nn/functional/remotetensorfunc/init.py new file mode 100644 index 00000000..35dda5d9 --- /dev/null +++ b/front/py/deepx/nn/functional/remotetensorfunc/init.py @@ -0,0 +1,19 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR +from deepx.scheduler import send +from typing import Union,Optional + +def constant(t:Tensor,value:Union[float,int]=0,author='miaobyte')->Tensor: + ir=DeepxIR("constant", [t.node.name,value], [],author) + send(ir) + return t + +def arange(t:Tensor,start:Optional[Union[float,int]]=0,step:Optional[Union[float,int]]=1,author='miaobyte')->Tensor: + ir=DeepxIR("arange",[t.node.name,start,step], [],author) + send(ir) + return t + +def uniform(t:Tensor,low=0, high=1,seed:int=0,author='miaobyte')->Tensor: + ir=DeepxIR("uniform",[t.node.name,low, high,seed], [],author) + send(ir) + return t \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/io.py b/front/py/deepx/nn/functional/remotetensorfunc/io.py new file mode 100644 index 00000000..de75156d --- /dev/null +++ b/front/py/deepx/nn/functional/remotetensorfunc/io.py @@ -0,0 +1,18 @@ +from deepx.tensor import Tensor +from deepx.nn import DeepxIR +from deepx.scheduler import send + +def printtensor(t:Tensor,format='',author='miaobyte'): + ir=DeepxIR("print",[t.node.name,format], [],author) + send(ir) + return '' + +def load(t:Tensor,path:str,author='miaobyte'): + ir=DeepxIR("load",[t.node.name,path], [],author) + send(ir) + return t + +def save(t:Tensor,path:str,author='miaobyte'): + ir=DeepxIR("save",[t.node.name,path], [],author) + send(ir) + return t \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/matmul.py b/front/py/deepx/nn/functional/remotetensorfunc/matmul.py new file mode 100644 index 00000000..3c092689 --- /dev/null +++ b/front/py/deepx/nn/functional/remotetensorfunc/matmul.py @@ -0,0 +1,8 @@ +from deepx.tensor import Tensor +from deepx.nn import DeepxIR +from deepx.scheduler import send + +def matmul(a:Tensor,b:Tensor,out: Tensor ,author='cublas'): + ir=DeepxIR("matmul", [a.node.name,b.node.name], [out.node.name], author) + send(ir) + return out \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/new.py b/front/py/deepx/nn/functional/remotetensorfunc/new.py new file mode 100644 index 00000000..cbf6e140 --- /dev/null +++ b/front/py/deepx/nn/functional/remotetensorfunc/new.py @@ -0,0 +1,18 @@ +from deepx.tensor import Tensor +from deepx.autograd.graph import Graph,default_graph +from deepx.nn.deepxir import DeepxIR,Param +from deepx.scheduler import send + +def newtensor(t:Tensor,name:str=None): + ir2=DeepxIR("newtensor",[Param(t.shape)], [Param(t._node.name,category='tensor',precision=t.dtype)]) + send(ir2) + return t + +def copytensor(t:Tensor,out:Tensor): + + ir2=DeepxIR("copytensor", t.dtype, [t.node.name], [out.node.name]) + send(ir2) +def deltensor(t:Tensor): + + ir2=DeepxIR("deltensor",'', [t.node.name], []) + send(ir2) diff --git a/front/py/deepx/nn/functional/remotetensorfunc/reduce.py b/front/py/deepx/nn/functional/remotetensorfunc/reduce.py new file mode 100644 index 00000000..7b321842 --- /dev/null +++ b/front/py/deepx/nn/functional/remotetensorfunc/reduce.py @@ -0,0 +1,24 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR,Param +from deepx.scheduler import send + +def sum(a:Tensor,dim:tuple[int],keepdim:bool,out: Tensor, author:str='miaobyte')->Tensor: + ir2=DeepxIR("sum",[a.node.name,dim,keepdim], [out.node.name], author) + send(ir2) + return out + +def prod(a:Tensor,dim:tuple[int],keepdim:bool,out:Tensor, author:str='miaobyte')->Tensor: + ir2=DeepxIR("prod",[a.node.name,dim,keepdim], [out.node.name], author) + send(ir2) + return out + +def reducemax(a:Tensor,dim:tuple[int],keepdim:bool,out:Tensor, author:str='miaobyte')->Tensor: + ir2=DeepxIR("reducemax",[a.node.name,dim,keepdim], [out.node.name], author) + send(ir2) + return out + +def reducemin(a:Tensor,dim:tuple[int],keepdim:bool,out:Tensor, author:str='miaobyte')->Tensor: + ir2=DeepxIR("reducemin",[a.node.name,dim,keepdim], [out.node.name], author) + send(ir2) + return out + \ No newline at end of file From 22eac03a7e970f5a87c34c2797bf6d8f4c88d6c2 Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Tue, 15 Apr 2025 20:08:57 +0800 Subject: [PATCH 02/12] =?UTF-8?q?excuter:common/=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E5=A4=9A=E4=BD=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excuter/cpp-common/src/deepx/tf/arg.hpp | 9 --------- excuter/cpp-common/src/deepx/tf/new.hpp | 9 --------- 2 files changed, 18 deletions(-) delete mode 100644 excuter/cpp-common/src/deepx/tf/arg.hpp delete mode 100644 excuter/cpp-common/src/deepx/tf/new.hpp diff --git a/excuter/cpp-common/src/deepx/tf/arg.hpp b/excuter/cpp-common/src/deepx/tf/arg.hpp deleted file mode 100644 index 0afbb7d8..00000000 --- a/excuter/cpp-common/src/deepx/tf/arg.hpp +++ /dev/null @@ -1,9 +0,0 @@ -class ArgSet : public TF -{ -public: - // ... 其他现有代码 ... - - shared_ptr clone() const override { - return make_shared(*this); - } -}; \ No newline at end of file diff --git a/excuter/cpp-common/src/deepx/tf/new.hpp b/excuter/cpp-common/src/deepx/tf/new.hpp deleted file mode 100644 index b4f9d286..00000000 --- a/excuter/cpp-common/src/deepx/tf/new.hpp +++ /dev/null @@ -1,9 +0,0 @@ -class NewTensor : public TF -{ -public: - // ... 其他现有代码 ... - - shared_ptr clone() const override { - return make_shared(*this); - } -}; \ No newline at end of file From 132b9350fbff19e6af0dd478e6b044451ad64b74 Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Tue, 15 Apr 2025 20:10:30 +0800 Subject: [PATCH 03/12] =?UTF-8?q?front:2=E7=A7=8D=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.eager不构建计算图,tensorname通过tensor_id(t)得到 2.各个框架,统一通过deepxIR,来构建计算图 --- front/py/deepx/autograd/graph.py | 37 ++--- front/py/deepx/nn/deepxir.py | 52 ++++-- front/py/deepx/nn/functional/__init__.py | 4 +- front/py/deepx/nn/functional/elementwise.py | 96 +++-------- .../deepx/nn/functional/{print.py => io.py} | 6 +- front/py/deepx/nn/functional/leaffunc.py | 7 + ...changeshape.py => leaffunc_changeshape.py} | 48 ++---- .../py/deepx/nn/functional/leaffunc_reduce.py | 0 .../remotetensorfunc/changeshape.py | 23 --- .../models/llama/modeling_llama.py | 1 + front/py/examples/0_pyenv/binsearch.py | 15 ++ front/py/examples/2_ir/1_init_zeroones.dot | 76 ++++----- .../py/examples/2_ir/1_init_zeroones.dot.svg | 152 +++++++++--------- front/py/examples/2_ir/1_init_zeroones.py | 2 +- front/py/examples/2_ir/2_elementwise_add.dot | 40 ++--- .../examples/2_ir/2_elementwise_add.dot.svg | 80 ++++----- 16 files changed, 295 insertions(+), 344 deletions(-) rename front/py/deepx/nn/functional/{print.py => io.py} (67%) create mode 100644 front/py/deepx/nn/functional/leaffunc.py rename front/py/deepx/nn/functional/{changeshape.py => leaffunc_changeshape.py} (90%) create mode 100644 front/py/deepx/nn/functional/leaffunc_reduce.py delete mode 100644 front/py/deepx/nn/functional/remotetensorfunc/changeshape.py create mode 100644 front/py/examples/0_pyenv/binsearch.py diff --git a/front/py/deepx/autograd/graph.py b/front/py/deepx/autograd/graph.py index 332407a3..9199c6ca 100644 --- a/front/py/deepx/autograd/graph.py +++ b/front/py/deepx/autograd/graph.py @@ -1,26 +1,9 @@ from ._datanode import DataNode from ._opnode import OpNode from ._controlflownode import ControlFlowNode - -class Graph: - # 类属性存储默认实例 - _default_graph = None - - - @classmethod - def get_default(cls): - """获取或创建默认计算图(线程不安全)""" - if cls._default_graph is None: - cls._default_graph = Graph() - return cls._default_graph - - @classmethod - def set_default(cls, graph): - """设置新的默认计算图(用于上下文管理)""" - if not isinstance(graph, Graph): - raise TypeError("Must be a Graph instance") - cls._default_graph = graph + +class Graph: def __init__(self,eager=True): self.nodes = [] self.inputs = [] @@ -29,7 +12,16 @@ def __init__(self,eager=True): self.tensor_counter = 0 self.control_flow_counter = 0 self.eager=eager - + self.tracegraph=True + + + @property + def tracegraph(self): + return self._tracegraph + @tracegraph.setter + def tracegraph(self,value:bool): + self._tracegraph=value + @property def eager(self): return self._eager @@ -87,7 +79,4 @@ def graph_method(f): setattr(Graph, f.__name__, f) return f - - -# 初始化默认图 -Graph._default_graph = Graph() \ No newline at end of file + \ No newline at end of file diff --git a/front/py/deepx/nn/deepxir.py b/front/py/deepx/nn/deepxir.py index 4aa08ca5..9f9d2d83 100644 --- a/front/py/deepx/nn/deepxir.py +++ b/front/py/deepx/nn/deepxir.py @@ -1,18 +1,10 @@ from typing import Tuple, List, Optional,Union import time from datetime import datetime # 添加datetime模块 - +from deepx.tensor import Tensor class Param: - def __init__(self, value:Optional[Union[str,int,float,list,tuple]], category:str=None,precision:str=None): - if isinstance(value,str): - self._textvalue=value - elif isinstance(value,int) or isinstance(value,float): - self._textvalue=str(value) - elif isinstance(value,list) or isinstance(value,tuple): - self._textvalue='['+' '.join(str(v) for v in value)+']' - else: - raise ValueError(f"Invalid value type: {type(value)}") - + def __init__(self,textvalue:str, category:str=None,precision:str=None): + self._textvalue=textvalue self._category=category self._precision=precision @@ -24,7 +16,45 @@ def __str__(self): return f"{self._category} {self._textvalue}" else: return self._textvalue + + @classmethod + def tensorName(cls,name:str,dtype:str): + return Param(name,category="tensor",precision=dtype) + + @classmethod + def tensor(cls,t:Tensor): + tid=id(t) + name=f"tensor_{tid}" + return Param(name,category="tensor",precision=t.dtype) + + + @classmethod + def varnum(cls,value:Union[float,int]): + precision=None + if isinstance(value,float): + precision="float" + elif isinstance(value,int): + precision="int" + return Param(str(value),category="var",precision=precision) + + @classmethod + def varbool(cls,value:bool): + return Param(str(value),category="var",precision="bool") + + @classmethod + def varstr(cls,value:str): + return Param(value,category="var",precision="string") + @classmethod + def vector(cls,value:tuple,dtype:str): + textvalue='['+' '.join(str(v) for v in value)+']' + return Param(textvalue,category="vector",precision=dtype) + + @classmethod + def tensorlist(cls,value:tuple[str],dtype:str): + textvalue='['+' '.join(v for v in value)+']' + return Param(textvalue,category="tensorlist",precision=dtype) + class DeepxIR: def __init__(self, name:str, diff --git a/front/py/deepx/nn/functional/__init__.py b/front/py/deepx/nn/functional/__init__.py index 46dac20d..2d9eaf50 100644 --- a/front/py/deepx/nn/functional/__init__.py +++ b/front/py/deepx/nn/functional/__init__.py @@ -1,10 +1,10 @@ from .elementwise import * from .new import newtensor,deltensor -from .print import printtensor +from .io import printtensor from .matmul import matmul from .init import * from .reduce import reduce_max,reduce_min,sum,prod,mean -from .changeshape import * +from .leaffunc_changeshape import * from .activite import relu,sigmoid,swish __all__ = [ "newtensor", diff --git a/front/py/deepx/nn/functional/elementwise.py b/front/py/deepx/nn/functional/elementwise.py index 459a21a0..51d4ea9a 100644 --- a/front/py/deepx/nn/functional/elementwise.py +++ b/front/py/deepx/nn/functional/elementwise.py @@ -1,7 +1,7 @@ from typing import Optional, Union from deepx import Tensor -from deepx.autograd import Graph,DataNode,OpNode,Function,Context -from deepx.nn import DeepxIR,Param +from deepx.autograd import Function,Context +from deepx.nn import DeepxIR from deepx.scheduler import send def _A_elementwiseop_C( @@ -36,7 +36,7 @@ def _A_B_elementwiseop_C( A,B=a,b if a.shape != b.shape: broadcastshape=broadcast_shape(a.shape,b.shape) - from .changeshape import broadcast_to + from .leaffunc_changeshape import broadcast_to if a.shape != broadcastshape: A=broadcast_to(a,broadcastshape) if b.shape != broadcastshape: @@ -100,7 +100,7 @@ def _a_B_elementwiseop_C( return outtensor #add -OpNode.register("add") + class Add(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -109,7 +109,7 @@ def forward(ctx:Context, a, b,out,author='miaobyte'): @staticmethod def backward(ctx:Context,out_grad): return out_grad, out_grad -OpNode.register("addscalar") + class AddScalar(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -131,7 +131,7 @@ def add( #sub -OpNode.register("sub") + class Sub(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -140,8 +140,7 @@ def forward(ctx:Context, a, b,out,author='miaobyte'): @staticmethod def backward(ctx:Context, grad_output): return grad_output, -grad_output - -OpNode.register("subscalar") + class SubScalar(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -162,7 +161,7 @@ def sub( return SubScalar.apply(a,b,out,author,requires_grad=requires_grad) #mul -OpNode.register("mul") + class Mul(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -174,8 +173,7 @@ def forward(ctx:Context, a, b,out,author='miaobyte'): def backward(ctx:Context, out_grad): a,b=ctx.get_tensor return out_grad * b, out_grad * a - -OpNode.register("mulscalar") + class MulScalar(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -199,7 +197,7 @@ def mul( #div -OpNode.register("div") + class Div(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -212,7 +210,7 @@ def backward(ctx:Context, out_grad): a,b=ctx.get_tensor return out_grad / b, -out_grad * a / b / b -OpNode.register("divscalar") + class DivScalar(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -224,8 +222,7 @@ def forward(ctx:Context, a, b,out,author='miaobyte'): def backward(ctx:Context, out_grad): b=ctx.get_data('b') return out_grad / b, None - -OpNode.register("rdivscalar") + class RDivScalar(Function): @staticmethod def forward(ctx:Context, a,b,out,author='miaobyte'): @@ -252,17 +249,14 @@ def div( else: #C=a/B return RDivScalar.apply(a,b,out,author,requires_grad=requires_grad) - -OpNode.register("compare") + class Compare(Function): @staticmethod def forward(ctx:Context,a,b,out,author='miaobyte'): if ctx.requires_grad: ctx.save_tensors(a,b) return _A_B_elementwiseop_C(a,b,"compare",out,author) - -OpNode.register("max") class Max(Function): @staticmethod def forward(ctx:Context,a,b,out,author='miaobyte'): @@ -276,9 +270,7 @@ def backward(ctx:Context,out_grad): mask_a=ctx.get_tensor mask_b=1-mask_a return out_grad*mask_a, out_grad*mask_b - - -OpNode.register("maxscalar") + class MaxScalar(Function): @staticmethod def forward(ctx:Context,a,b,out,author='miaobyte'): @@ -303,8 +295,7 @@ def max( else: return Max.apply(a,b,out,author,requires_grad=requires_grad) - -OpNode.register("min") + class Min(Function): @staticmethod def forward(ctx:Context,a,b,out,author='miaobyte'): @@ -316,8 +307,7 @@ def forward(ctx:Context,a,b,out,author='miaobyte'): def backward(ctx:Context,out_grad): a,b=ctx.get_tensors() return out_grad, out_grad - -OpNode.register("minscalar") + class MinScalar(Function): @staticmethod def forward(ctx:Context,a,b,out,author='miaobyte'): @@ -344,7 +334,7 @@ def min( #clamp,TODO #sqrt -OpNode.register("sqrt") + class Sqrt(Function): @staticmethod def forward(ctx:Context, a,out,author='miaobyte'): @@ -364,7 +354,7 @@ def sqrt( author='miaobyte')->Tensor: return Sqrt.apply(input,out,author,requires_grad=requires_grad) -OpNode.register("pow") + class Pow(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -376,8 +366,7 @@ def forward(ctx:Context, a, b,out,author='miaobyte'): def backward(ctx:Context, out_grad): a,b=ctx.get_tensor return out_grad * b * pow(a,b-1), out_grad * pow(a,b) * log(a) - -OpNode.register("powscalar") + class PowScalar(Function): @staticmethod def forward(ctx:Context, a, b,out,author='miaobyte'): @@ -402,7 +391,7 @@ def pow( return Pow.apply(a,b,out,author,requires_grad=requires_grad) #exp -OpNode.register("exp") + class Exp(Function): @staticmethod def forward(ctx:Context, a,out,author='miaobyte'): @@ -422,7 +411,7 @@ def exp( author='miaobyte')->Tensor: return Exp.apply(a,out,author,requires_grad=requires_grad) #log -OpNode.register("log") + class Log(Function): @staticmethod def forward(ctx:Context, a,out,author='miaobyte'): @@ -441,8 +430,7 @@ def log( requires_grad:bool=False, author='miaobyte')->Tensor: return Log.apply(a,out,author,requires_grad=requires_grad) - -OpNode.register("rsqrt") + class Rsqrt(Function): @staticmethod def forward(ctx:Context, a,out,author='miaobyte'): @@ -462,42 +450,4 @@ def rsqrt( author='miaobyte')->Tensor: return Rsqrt.apply(input,out,author,requires_grad=requires_grad) - - - -# OpNode.register("Placeholder", 102) -# OpNode.register("Neg", 103) -# NodeType.register("Less", 104) -# NodeType.register("Equal", 105) - -# NodeType.register("Tanh", 107) - - -# def placeholder(name=None, shape=None): -# node = OpNode("Placeholder", name) -# if shape: -# node.set_attr("shape", shape) -# return node - -# def neg(x): -# node = OpNode("Neg") -# node.add_input("x", x) -# return node - -# def less(a, b): -# node = OpNode("Less") -# node.add_input("a", a) -# node.add_input("b", b) -# return node - -# def equal(a, b): -# node = OpNode("Equal") -# node.add_input("a", a) -# node.add_input("b", b) -# return node - -# def tanh(x): -# node = OpNode("Tanh") -# node.add_input("x", x) -# return node - \ No newline at end of file + \ No newline at end of file diff --git a/front/py/deepx/nn/functional/print.py b/front/py/deepx/nn/functional/io.py similarity index 67% rename from front/py/deepx/nn/functional/print.py rename to front/py/deepx/nn/functional/io.py index 2eb2bb25..56e9e4bc 100644 --- a/front/py/deepx/nn/functional/print.py +++ b/front/py/deepx/nn/functional/io.py @@ -3,9 +3,9 @@ from deepx.nn import DeepxIR from deepx.scheduler import send -OpNode.register("print") + def printtensor(t:Tensor,format='',author='miaobyte'): - ir=DeepxIR("print",[t.node.name,format], [],author) - send(ir) + from .rtf_io import rtf_printtensor + rtf_printtensor(t,format,author) return '' diff --git a/front/py/deepx/nn/functional/leaffunc.py b/front/py/deepx/nn/functional/leaffunc.py new file mode 100644 index 00000000..3254ea01 --- /dev/null +++ b/front/py/deepx/nn/functional/leaffunc.py @@ -0,0 +1,7 @@ +from typing import Union,Tuple +from deepx.tensor import Tensor,Shape +from deepx.nn.deepxir import DeepxIR +from deepx.scheduler import send +from deepx.autograd import OpNode,Function,Context + +def buildgraph(a:Tensor,dim:tuple[int],keepdim:bool=False,out:Tensor, author:str='miaobyte')->Tensor: \ No newline at end of file diff --git a/front/py/deepx/nn/functional/changeshape.py b/front/py/deepx/nn/functional/leaffunc_changeshape.py similarity index 90% rename from front/py/deepx/nn/functional/changeshape.py rename to front/py/deepx/nn/functional/leaffunc_changeshape.py index bf4b7f53..c59a58ae 100644 --- a/front/py/deepx/nn/functional/changeshape.py +++ b/front/py/deepx/nn/functional/leaffunc_changeshape.py @@ -2,27 +2,9 @@ from deepx.tensor import Tensor,Shape from deepx.nn.deepxir import DeepxIR from deepx.scheduler import send -from deepx.autograd import OpNode,Function,Context - -def _A_v_elementwiseop_C( - a:Tensor, - b: list[int] , - op:str=None, - out:Tensor=None, - author='miaobyte')->Tensor: - g=a.graph - opnode = g.add_op(op) - opnode.add_input(a.node) - opnode.add_input(g.add_vector("",b)) - - outtensor=out - outtensor.node.add_input(opnode) - if g.eager: - ir=DeepxIR(op, [a.node.name,b], [outtensor.node.name],author) - send(ir) - return outtensor - -OpNode.register("reshape") +from deepx.autograd import Function,Context + + class Reshape(Function): @staticmethod def forward(ctx:Context,t:Tensor,shape:list[int],out,author='miaobyte'): @@ -33,23 +15,26 @@ def forward(ctx:Context,t:Tensor,shape:list[int],out,author='miaobyte'): if isinstance(out,str): outshape=shape outtensor=Tensor(shape=outshape, dtype=t.dtype, device=t.device) - outtensor.addtograph(out) - outtensor._shape=Shape(shape) - return _A_v_elementwiseop_C(t,shape,"reshape",outtensor,author) + if outtensor.shape!=shape: + raise ValueError(f"reshape失败:{t.shape} 无法reshape为 {shape} ") + from .rtf_changeshape import rtf_reshape + rtf_reshape(t,shape,outtensor,author) + return outtensor @staticmethod - def backward(ctx:Context,out_grad): + def backward(ctx:Context,t_grad:Tensor,out_grad:Tensor): oldshape=ctx.get_data('oldshape') t=ctx.get_tensor('t') - return _A_v_elementwiseop_C(out_grad,oldshape,"reshape",t.node.name,author) + from .rtf_changeshape import rtf_reshape + rtf_reshape(out_grad,oldshape,t_grad.node.name) + return t_grad def reshape(t:Tensor,shape:list[int],out:Union[Tensor,str]='',author='miaobyte',requires_grad:bool=False)->Tensor: if t.shape==shape: return t return Reshape.apply(t,shape,out,author,requires_grad=requires_grad) - -OpNode.register("transpose") + class Permute(Function): @staticmethod def forward(ctx:Context, @@ -90,9 +75,7 @@ def transpose(t:Tensor,out:Union[Tensor,str]='',requires_grad:bool=False,author= return Permute.apply(t,dimorder,out,author,requires_grad=requires_grad) - - -OpNode.register("concat") + class Concat(Function): @staticmethod def forward(ctx:Context, @@ -159,8 +142,7 @@ def broadcast_shape(shape_a: tuple[int], shape_b: tuple[int]) -> tuple[int]: result_shape = list(shape_b[:len_b - len_a]) + result_shape return tuple(result_shape) - -OpNode.register("broadcastTo") + class BroadcastTo(Function): @staticmethod def forward(ctx:Context, diff --git a/front/py/deepx/nn/functional/leaffunc_reduce.py b/front/py/deepx/nn/functional/leaffunc_reduce.py new file mode 100644 index 00000000..e69de29b diff --git a/front/py/deepx/nn/functional/remotetensorfunc/changeshape.py b/front/py/deepx/nn/functional/remotetensorfunc/changeshape.py deleted file mode 100644 index b9589b31..00000000 --- a/front/py/deepx/nn/functional/remotetensorfunc/changeshape.py +++ /dev/null @@ -1,23 +0,0 @@ -from deepx.tensor import Tensor -from deepx.nn.deepxir import DeepxIR -from deepx.scheduler import send - -def reshape(t:Tensor,shape:list[int],out:Tensor,author='miaobyte')->Tensor: - ir=DeepxIR("reshape", [t.node.name,shape], [out.node.name],author) - send(ir) - return out - -def transpose(t:Tensor,dimorder:list[int],out:Tensor,author='miaobyte')->Tensor: - ir=DeepxIR("transpose", [t.node.name,dimorder], [out.node.name],author) - send(ir) - return out - -def concat(tensors:list[Tensor],dim:int,out:Tensor,author='miaobyte')->Tensor: - ir=DeepxIR("concat", [[t.node.name for t in tensors], dim], [out.node.name],author) - send(ir) - return out - -def broadcastTo(t:Tensor,new_shape:tuple[int],out:Tensor,author='miaobyte')->Tensor: - ir=DeepxIR("broadcastTo", [t.node.name,new_shape], [out.node.name],author) - send(ir) - return out diff --git a/front/py/deepx/transformer/models/llama/modeling_llama.py b/front/py/deepx/transformer/models/llama/modeling_llama.py index 1ff13f3d..f9850f81 100644 --- a/front/py/deepx/transformer/models/llama/modeling_llama.py +++ b/front/py/deepx/transformer/models/llama/modeling_llama.py @@ -10,6 +10,7 @@ def __init__(self, hidden_size, eps=1e-6): super().__init__() self.weight = ones(hidden_size) self.variance_epsilon = eps + def forward(self, hidden_states:Tensor): variance = hidden_states.pow(2).mean(-1, keepdim=True) diff --git a/front/py/examples/0_pyenv/binsearch.py b/front/py/examples/0_pyenv/binsearch.py new file mode 100644 index 00000000..cf7a18f7 --- /dev/null +++ b/front/py/examples/0_pyenv/binsearch.py @@ -0,0 +1,15 @@ +# 升序有序数组,用二分查找元素定位 +def binarysearch(data:tuple[int],target:int): + left,right=0,len(data)-1 + while left<=right: + mid=(left+right)//2 + if data[mid] 129052233125168 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049975249392 -> 129049935907280 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935907424 -> 129049975250448 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935907568 -> 129049935907424 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129052233125168 -> 129049935907472 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049975250448 -> 129049935907472 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935907472 -> 129049935907760 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935907952 -> 129049935907616 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935908240 -> 129049935907952 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935907616 -> 129049935908432 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935907760 -> 129049935908432 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935908432 -> 129049935908144 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935908624 -> 129049935908576 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935909056 -> 129049935908576 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935908912 -> 129049935908624 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935909008 -> 129049935909056 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935909200 -> 129049935909056 [arrowsize=0.8 color=gray40 penwidth=1.2] - 129049935909152 -> 129049935909056 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555544580416 -> 137557518290656 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555544579360 -> 137555544580416 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542939472 -> 137555544579552 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542939616 -> 137555542939472 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137557518290656 -> 137555542939520 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555544579552 -> 137555542939520 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542939520 -> 137555542939712 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542940144 -> 137555542939232 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542940000 -> 137555542940144 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542939232 -> 137555542940096 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542939712 -> 137555542940096 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542940096 -> 137555542939760 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542940288 -> 137555542940816 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542940864 -> 137555542940816 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542940336 -> 137555542940288 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542940624 -> 137555542940864 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542940960 -> 137555542940864 [arrowsize=0.8 color=gray40 penwidth=1.2] + 137555542940720 -> 137555542940864 [arrowsize=0.8 color=gray40 penwidth=1.2] } diff --git a/front/py/examples/2_ir/1_init_zeroones.dot.svg b/front/py/examples/2_ir/1_init_zeroones.dot.svg index b5bf6542..2b4da486 100644 --- a/front/py/examples/2_ir/1_init_zeroones.dot.svg +++ b/front/py/examples/2_ir/1_init_zeroones.dot.svg @@ -9,244 +9,244 @@ %3 - + -129052233125168 +137557518290656 t1 (3, 4, 5) - + -129049935907472 +137555542939520 add - + -129052233125168->129049935907472 +137557518290656->137555542939520 - + -129049935907280 +137555544580416 constant - + -129049935907280->129052233125168 +137555544580416->137557518290656 - + -129049975249392 +137555544579360 var_1 0 - + -129049975249392->129049935907280 +137555544579360->137555544580416 - + -129049975250448 +137555544579552 t2 (3, 4, 5) - + -129049975250448->129049935907472 +137555544579552->137555542939520 - + -129049935907424 +137555542939472 constant - + -129049935907424->129049975250448 +137555542939472->137555544579552 - + -129049935907568 +137555542939616 var_2 1 - + -129049935907568->129049935907424 +137555542939616->137555542939472 - + -129049935907760 +137555542939712 t3 (3, 4, 5) - + -129049935907472->129049935907760 +137555542939520->137555542939712 - + -129049935908432 +137555542940096 add - + -129049935907760->129049935908432 +137555542939712->137555542940096 - + -129049935907616 +137555542939232 t4 (3, 4, 5) - + -129049935907616->129049935908432 +137555542939232->137555542940096 - + -129049935907952 +137555542940144 constant - + -129049935907952->129049935907616 +137555542940144->137555542939232 - + -129049935908240 +137555542940000 var_3 0.5 - + -129049935908240->129049935907952 +137555542940000->137555542940144 - + -129049935908144 +137555542939760 t5 (3, 4, 5) - + -129049935908432->129049935908144 +137555542940096->137555542939760 - + -129049935908576 +137555542940816 tensor_6 (3, 4, 5) - + -129049935908624 +137555542940288 constant - + -129049935908624->129049935908576 +137555542940288->137555542940816 - + -129049935908912 +137555542940336 var_4 0 - + -129049935908912->129049935908624 +137555542940336->137555542940288 - + -129049935909056 +137555542940864 uniform - + -129049935909056->129049935908576 +137555542940864->137555542940816 - + -129049935909008 +137555542940624 var_5 -0.5477225575051661 - + -129049935909008->129049935909056 +137555542940624->137555542940864 - + -129049935909200 +137555542940960 var_6 0.5477225575051661 - + -129049935909200->129049935909056 +137555542940960->137555542940864 - + -129049935909152 +137555542940720 var_7 0 - + -129049935909152->129049935909056 +137555542940720->137555542940864 diff --git a/front/py/examples/2_ir/1_init_zeroones.py b/front/py/examples/2_ir/1_init_zeroones.py index 54bf44d7..5b09ead3 100644 --- a/front/py/examples/2_ir/1_init_zeroones.py +++ b/front/py/examples/2_ir/1_init_zeroones.py @@ -18,7 +18,7 @@ ############-------DEEPX-------################ -from deepx import Tensor,mul,add,zeros,ones,full,kaiming_uniform_ +from deepx import zeros,ones,full,kaiming_uniform_ print() t1 = zeros([3,4,5],dtype='float32',name="t1") diff --git a/front/py/examples/2_ir/2_elementwise_add.dot b/front/py/examples/2_ir/2_elementwise_add.dot index 1c2ae8c9..63aa4be2 100644 --- a/front/py/examples/2_ir/2_elementwise_add.dot +++ b/front/py/examples/2_ir/2_elementwise_add.dot @@ -2,30 +2,30 @@ digraph { rankdir=TB node [shape=record] - 125643920431552 [label="t1 + 134156391383104 [label="t1 (2, 3, 4)" color=skyblue fillcolor=aliceblue fontname="Sans-Serif" labeljust=l shape=box style=filled] - 125643920431744 [label=constant color=darkslategray fillcolor=lightgray fontname="Courier Bold" labeljust=l shape=box style=filled] - 125643920432608 [label="var_1 + 134156391386944 [label=constant color=darkslategray fillcolor=lightgray fontname="Courier Bold" labeljust=l shape=box style=filled] + 134156679069024 [label="var_1 10" color=orange fillcolor=moccasin fontname="Sans-Serif" labeljust=l shape=box style=filled] - 125645612091328 [label="t2 + 134156679055728 [label="t2 (2, 3, 4)" color=skyblue fillcolor=aliceblue fontname="Sans-Serif" labeljust=l shape=box style=filled] - 125643918940608 [label=constant color=darkslategray fillcolor=lightgray fontname="Courier Bold" labeljust=l shape=box style=filled] - 125643918940416 [label="var_2 + 134156322789056 [label=constant color=darkslategray fillcolor=lightgray fontname="Courier Bold" labeljust=l shape=box style=filled] + 134156322789248 [label="var_2 10" color=orange fillcolor=moccasin fontname="Sans-Serif" labeljust=l shape=box style=filled] - 125643918940464 [label=add color=darkslategray fillcolor=lightgray fontname="Courier Bold" labeljust=l shape=box style=filled] - 125643918940272 [label="t3 + 134156322789200 [label=add color=darkslategray fillcolor=lightgray fontname="Courier Bold" labeljust=l shape=box style=filled] + 134156322789296 [label="t3 (2, 3, 4)" color=skyblue fillcolor=aliceblue fontname="Sans-Serif" labeljust=l shape=box style=filled] - 125643918940128 [label=addscalar color=darkslategray fillcolor=lightgray fontname="Courier Bold" labeljust=l shape=box style=filled] - 125643918939936 [label="var_3 + 134156322789872 [label=addscalar color=darkslategray fillcolor=lightgray fontname="Courier Bold" labeljust=l shape=box style=filled] + 134156322789440 [label="var_3 0.5" color=orange fillcolor=moccasin fontname="Sans-Serif" labeljust=l shape=box style=filled] - 125643920431744 -> 125643920431552 [arrowsize=0.8 color=gray40 penwidth=1.2] - 125643920432608 -> 125643920431744 [arrowsize=0.8 color=gray40 penwidth=1.2] - 125643918940608 -> 125645612091328 [arrowsize=0.8 color=gray40 penwidth=1.2] - 125643918940416 -> 125643918940608 [arrowsize=0.8 color=gray40 penwidth=1.2] - 125643920431552 -> 125643918940464 [arrowsize=0.8 color=gray40 penwidth=1.2] - 125645612091328 -> 125643918940464 [arrowsize=0.8 color=gray40 penwidth=1.2] - 125643918940464 -> 125643918940272 [arrowsize=0.8 color=gray40 penwidth=1.2] - 125643918940128 -> 125643918940272 [arrowsize=0.8 color=gray40 penwidth=1.2] - 125643918940272 -> 125643918940128 [arrowsize=0.8 color=gray40 penwidth=1.2] - 125643918939936 -> 125643918940128 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156391386944 -> 134156391383104 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156679069024 -> 134156391386944 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156322789056 -> 134156679055728 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156322789248 -> 134156322789056 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156391383104 -> 134156322789200 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156679055728 -> 134156322789200 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156322789200 -> 134156322789296 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156322789872 -> 134156322789296 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156322789296 -> 134156322789872 [arrowsize=0.8 color=gray40 penwidth=1.2] + 134156322789440 -> 134156322789872 [arrowsize=0.8 color=gray40 penwidth=1.2] } diff --git a/front/py/examples/2_ir/2_elementwise_add.dot.svg b/front/py/examples/2_ir/2_elementwise_add.dot.svg index 86968ef0..8b146b34 100644 --- a/front/py/examples/2_ir/2_elementwise_add.dot.svg +++ b/front/py/examples/2_ir/2_elementwise_add.dot.svg @@ -9,129 +9,129 @@ %3 - + -125643920431552 +134156391383104 t1 (2, 3, 4) - + -125643918940464 +134156322789200 add - + -125643920431552->125643918940464 +134156391383104->134156322789200 - + -125643920431744 +134156391386944 constant - + -125643920431744->125643920431552 +134156391386944->134156391383104 - + -125643920432608 +134156679069024 var_1 10 - + -125643920432608->125643920431744 +134156679069024->134156391386944 - + -125645612091328 +134156679055728 t2 (2, 3, 4) - + -125645612091328->125643918940464 +134156679055728->134156322789200 - + -125643918940608 +134156322789056 constant - + -125643918940608->125645612091328 +134156322789056->134156679055728 - + -125643918940416 +134156322789248 var_2 10 - + -125643918940416->125643918940608 +134156322789248->134156322789056 - + -125643918940272 +134156322789296 t3 (2, 3, 4) - + -125643918940464->125643918940272 +134156322789200->134156322789296 - + -125643918940128 +134156322789872 addscalar - + -125643918940272->125643918940128 +134156322789296->134156322789872 - + -125643918940128->125643918940272 +134156322789872->134156322789296 - + -125643918939936 +134156322789440 var_3 0.5 - + -125643918939936->125643918940128 +134156322789440->134156322789872 From eed9505f05e03de879ab5b84878e944ecd2c9cf8 Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Tue, 15 Apr 2025 20:10:53 +0800 Subject: [PATCH 04/12] =?UTF-8?q?front:2=E7=A7=8D=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.eager不构建计算图,tensorname通过tensor_id(t)得到 2.各个框架,统一通过deepxIR,来构建计算图 --- front/py/deepx/autograd/_opnode.py | 25 +--- front/py/deepx/nn/functional/init.py | 8 +- front/py/deepx/nn/functional/matmul.py | 7 +- front/py/deepx/nn/functional/new.py | 21 ++-- front/py/deepx/nn/functional/reduce.py | 12 +- .../functional/remotetensorfunc/__init__.py | 25 ---- .../remotetensorfunc/elementwise.py | 119 ------------------ .../nn/functional/remotetensorfunc/init.py | 19 --- .../nn/functional/remotetensorfunc/io.py | 18 --- .../nn/functional/remotetensorfunc/matmul.py | 8 -- .../nn/functional/remotetensorfunc/new.py | 18 --- .../nn/functional/remotetensorfunc/reduce.py | 24 ---- front/py/deepx/nn/functional/rtf.py | 28 +++++ .../py/deepx/nn/functional/rtf_changeshape.py | 30 +++++ .../py/deepx/nn/functional/rtf_elementwise.py | 99 +++++++++++++++ front/py/deepx/nn/functional/rtf_init.py | 24 ++++ front/py/deepx/nn/functional/rtf_io.py | 24 ++++ front/py/deepx/nn/functional/rtf_matmul.py | 11 ++ front/py/deepx/nn/functional/rtf_new.py | 22 ++++ front/py/deepx/nn/functional/rtf_reduce.py | 21 ++++ front/py/deepx/scheduler/client/udpconn.py | 2 +- front/py/deepx/tensor/tensor.py | 1 + 22 files changed, 281 insertions(+), 285 deletions(-) delete mode 100644 front/py/deepx/nn/functional/remotetensorfunc/__init__.py delete mode 100644 front/py/deepx/nn/functional/remotetensorfunc/elementwise.py delete mode 100644 front/py/deepx/nn/functional/remotetensorfunc/init.py delete mode 100644 front/py/deepx/nn/functional/remotetensorfunc/io.py delete mode 100644 front/py/deepx/nn/functional/remotetensorfunc/matmul.py delete mode 100644 front/py/deepx/nn/functional/remotetensorfunc/new.py delete mode 100644 front/py/deepx/nn/functional/remotetensorfunc/reduce.py create mode 100644 front/py/deepx/nn/functional/rtf.py create mode 100644 front/py/deepx/nn/functional/rtf_changeshape.py create mode 100644 front/py/deepx/nn/functional/rtf_elementwise.py create mode 100644 front/py/deepx/nn/functional/rtf_init.py create mode 100644 front/py/deepx/nn/functional/rtf_io.py create mode 100644 front/py/deepx/nn/functional/rtf_matmul.py create mode 100644 front/py/deepx/nn/functional/rtf_new.py create mode 100644 front/py/deepx/nn/functional/rtf_reduce.py diff --git a/front/py/deepx/autograd/_opnode.py b/front/py/deepx/autograd/_opnode.py index d1695c59..7ddb5c11 100644 --- a/front/py/deepx/autograd/_opnode.py +++ b/front/py/deepx/autograd/_opnode.py @@ -1,29 +1,6 @@ from .node import Node from .nodetype import NodeType - - -class OpNodeMeta(type): - """操作节点元类,负责校验操作名称""" - _registered_ops = set() # 已注册操作名称缓存 - - def __call__(cls, name: str, *args, **kwargs): - # 在实例化时进行名称校验 - if name not in cls._registered_ops: - raise ValueError( - f"Op '{name}' 未注册,请先使用OpNode.register('{name}')注册" - ) - return super().__call__(name, *args, **kwargs) - - @classmethod - def register_op(cls, name: str) -> None: - """注册新操作类型""" - if name in cls._registered_ops: - raise ValueError(f"Op '{name}' 已存在") - cls._registered_ops.add(name) -class OpNode(Node, metaclass=OpNodeMeta): +class OpNode(Node): def __init__(self, name: str): super().__init__(name=name, ntype=NodeType.OP) - @classmethod - def register(cls, name: str) -> None: - cls.__class__.register_op(name) diff --git a/front/py/deepx/nn/functional/init.py b/front/py/deepx/nn/functional/init.py index 77383dda..2d193f9d 100644 --- a/front/py/deepx/nn/functional/init.py +++ b/front/py/deepx/nn/functional/init.py @@ -6,7 +6,7 @@ from deepx.nn.deepxir import DeepxIR,Param from deepx.scheduler import send -OpNode.register("constant") + class Constant(Function): @staticmethod def forward(ctx:Context, @@ -45,8 +45,7 @@ def zeros(*shape, dtype=None, device=None, def ones(*size, dtype=None, device=None, name:Union[str]='')->Tensor: return full(*size, value=1, dtype=dtype, device=device,name=name) - -OpNode.register("arange") + class Arange(Function): @staticmethod def forward(ctx:Context, @@ -61,8 +60,7 @@ def forward(ctx:Context, return t def arange(t:Tensor,start=0,step=1,author='miaobyte')->Tensor: return Arange.apply(t,start,step,author) - -OpNode.register("uniform") + class Uniform(Function): @staticmethod def forward(ctx:Context, diff --git a/front/py/deepx/nn/functional/matmul.py b/front/py/deepx/nn/functional/matmul.py index 97356b8d..109e1dd4 100644 --- a/front/py/deepx/nn/functional/matmul.py +++ b/front/py/deepx/nn/functional/matmul.py @@ -1,12 +1,11 @@ -from typing import Optional,Union +from typing import Union from deepx import Tensor -from deepx.autograd import OpNode,Function,Context +from deepx.autograd import Function,Context from deepx.nn import DeepxIR from deepx.scheduler import send - -OpNode.register("matmul") + class Matmul(Function): @staticmethod def forward(ctx:Context, diff --git a/front/py/deepx/nn/functional/new.py b/front/py/deepx/nn/functional/new.py index 1cc14dff..bb5ed88e 100644 --- a/front/py/deepx/nn/functional/new.py +++ b/front/py/deepx/nn/functional/new.py @@ -4,19 +4,12 @@ from deepx.scheduler import send def newtensor(t:Tensor,name:str=None): - graph = Graph.get_default() - t._graph = graph - t._node=graph.add_tensor(name,t=t) - if t.graph.eager: - ir2=DeepxIR("newtensor",[Param(t.shape)], [Param(t._node.name,category='tensor',precision=t.dtype)]) - send(ir2) + from .rtf_new import rtf_newtensor + rtf_newtensor(t,name) def copytensor(t:Tensor,out:Tensor): - graph = Graph.get_default() - out.node.add_input(t.node) - if t.graph.eager: - ir2=DeepxIR("copytensor", t.dtype, [t.node.name], [out.node.name]) - send(ir2) + from .rtf_new import rtf_copytensor + rtf_copytensor(t,out) def deltensor(t:Tensor): - if t.graph.eager: - ir2=DeepxIR("deltensor",'', [t.node.name], []) - send(ir2) + from .rtf_new import rtf_deltensor + rtf_deltensor(t) + diff --git a/front/py/deepx/nn/functional/reduce.py b/front/py/deepx/nn/functional/reduce.py index 10051348..3dd5a0c7 100644 --- a/front/py/deepx/nn/functional/reduce.py +++ b/front/py/deepx/nn/functional/reduce.py @@ -3,7 +3,7 @@ from deepx.tensor import Tensor from deepx.nn.deepxir import DeepxIR from deepx.scheduler import send -from deepx.autograd import OpNode,Function,Context +from deepx.autograd import Function,Context def reduceshape(inshape: Union[list[int], tuple[int]], dim: Union[list[int], tuple[int]], @@ -67,7 +67,7 @@ def _A_v_reduceop_C( send(ir) return result #sum -OpNode.register("sum") + class Sum(Function): @staticmethod def forward(ctx:Context,a:Tensor,dim:Optional[Union[list[int],tuple[int]]]=None,keepdim:bool=False,out:Union[Tensor,str]='',author:str='miaobyte')->Tensor: @@ -96,7 +96,7 @@ def sum( return Sum.apply(a,dim,keepdim,out,author,requires_grad=requires_grad) #prod -OpNode.register("prod") + class Prod(Function): @staticmethod def forward(ctx:Context,a:Tensor,dim:Optional[Union[list[int],tuple[int]]]=None,keepdim:bool=False,out:Union[Tensor,str]='',author:str='miaobyte')->Tensor: @@ -119,7 +119,7 @@ def prod( return Prod.apply(a,dim,keepdim,out,author,requires_grad=requires_grad) #max -OpNode.register("reducemax") + class ReduceMax(Function): @staticmethod def forward(ctx:Context,a:Tensor,dim:Optional[Union[list[int],tuple[int]]]=None,keepdim:bool=False,out:Union[Tensor,str]='',author:str='miaobyte')->Tensor: @@ -138,7 +138,7 @@ def reduce_max( return ReduceMax.apply(a,dim,keepdim,out,author,requires_grad=requires_grad) #min -OpNode.register("reducemin") + class ReduceMin(Function): @staticmethod def forward(ctx:Context,a:Tensor,dim:Optional[Union[list[int],tuple[int]]]=None,keepdim:bool=False,out:Union[Tensor,str]='',author:str='miaobyte')->Tensor: @@ -159,7 +159,7 @@ def reduce_min( #mean -OpNode.register("mean") + def mean( a:Tensor, dim:Optional[Union[list[int],tuple[int]]]=None, diff --git a/front/py/deepx/nn/functional/remotetensorfunc/__init__.py b/front/py/deepx/nn/functional/remotetensorfunc/__init__.py deleted file mode 100644 index b341c4e1..00000000 --- a/front/py/deepx/nn/functional/remotetensorfunc/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -from .elementwise import * -from .new import * -from .io import * -from .matmul import * -from .init import * -from .reduce import * -from .changeshape import * -__all__ = [ - "newtensor", - #io - "printtensor", - #init - "constant", "uniform","arange" , - #elementwise - "add","addscalar","sub","subscalar","mul","mulscalar","div","divscalar","rdivscalar", - "sqrt","pow","powscalar","exp","log","rsqrt", - "sin","cos","tan", - "compare","max","maxscalar","min","minscalar", - #matmul - "matmul", - #reduce - "sum","prod" ,"reducemax","reducemin", - #changeshape - "reshape", "transpose","concat","broadcastTo", -] \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/elementwise.py b/front/py/deepx/nn/functional/remotetensorfunc/elementwise.py deleted file mode 100644 index 627d479a..00000000 --- a/front/py/deepx/nn/functional/remotetensorfunc/elementwise.py +++ /dev/null @@ -1,119 +0,0 @@ -from deepx.tensor import Tensor -from deepx.nn.deepxir import DeepxIR -from deepx.scheduler import send - -def add(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("add", [a.node.name, b.node.name], [out.node.name], author) - send(ir) - return out - -def add_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("addscalar", [a.node.name, b], [out.node.name], author) - send(ir) - return out - -def sub(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("sub", [a.node.name, b.node.name], [out.node.name], author) - send(ir) - return out - -def sub_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("subscalar", [a.node.name, b], [out.node.name], author) - send(ir) - return out - -def mul(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("mul", [a.node.name, b.node.name], [out.node.name], author) - send(ir) - return out - -def mul_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("mulscalar", [a.node.name, b], [out.node.name], author) - send(ir) - return out - -def div(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("div", [a.node.name, b.node.name], [out.node.name], author) - send(ir) - return out - -def div_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("divscalar", [a.node.name, b], [out.node.name], author) - send(ir) - return out - -def rdiv_scalar(a:float, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("rdivscalar", [a, b.node.name], [out.node.name], author) - send(ir) - return out - - -def sqrt(a:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("sqrt", [a.node.name], [out.node.name], author) - send(ir) - return out - -def pow(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("pow", [a.node.name, b.node.name], [out.node.name], author) - send(ir) - return out - -def pow_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("powscalar", [a.node.name, b], [out.node.name], author) - send(ir) - return out - -def exp(a:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("exp", [a.node.name], [out.node.name], author) - send(ir) - return out - -def log(a:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("log", [a.node.name], [out.node.name], author) - send(ir) - return out - -def rsqrt(a:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("rsqrt", [a.node.name], [out.node.name], author) - send(ir) - return out - -def sin(a:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("sin", [a.node.name], [out.node.name], author) - send(ir) - return out - -def cos(a:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("cos", [a.node.name], [out.node.name], author) - send(ir) - return out - -def tan(a:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("tan", [a.node.name], [out.node.name], author) - send(ir) - return out - -def compare(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("compare", [a.node.name, b.node.name], [out.node.name], author) - send(ir) - return out - -def max(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("max", [a.node.name, b.node.name], [out.node.name], author) - send(ir) - return out - -def max_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("maxscalar", [a.node.name, b], [out.node.name], author) - send(ir) - return out - -def min(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("min", [a.node.name, b.node.name], [out.node.name], author) - send(ir) - return out - -def min_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - ir=DeepxIR("minscalar", [a.node.name, b], [out.node.name], author) - send(ir) - return out \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/init.py b/front/py/deepx/nn/functional/remotetensorfunc/init.py deleted file mode 100644 index 35dda5d9..00000000 --- a/front/py/deepx/nn/functional/remotetensorfunc/init.py +++ /dev/null @@ -1,19 +0,0 @@ -from deepx.tensor import Tensor -from deepx.nn.deepxir import DeepxIR -from deepx.scheduler import send -from typing import Union,Optional - -def constant(t:Tensor,value:Union[float,int]=0,author='miaobyte')->Tensor: - ir=DeepxIR("constant", [t.node.name,value], [],author) - send(ir) - return t - -def arange(t:Tensor,start:Optional[Union[float,int]]=0,step:Optional[Union[float,int]]=1,author='miaobyte')->Tensor: - ir=DeepxIR("arange",[t.node.name,start,step], [],author) - send(ir) - return t - -def uniform(t:Tensor,low=0, high=1,seed:int=0,author='miaobyte')->Tensor: - ir=DeepxIR("uniform",[t.node.name,low, high,seed], [],author) - send(ir) - return t \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/io.py b/front/py/deepx/nn/functional/remotetensorfunc/io.py deleted file mode 100644 index de75156d..00000000 --- a/front/py/deepx/nn/functional/remotetensorfunc/io.py +++ /dev/null @@ -1,18 +0,0 @@ -from deepx.tensor import Tensor -from deepx.nn import DeepxIR -from deepx.scheduler import send - -def printtensor(t:Tensor,format='',author='miaobyte'): - ir=DeepxIR("print",[t.node.name,format], [],author) - send(ir) - return '' - -def load(t:Tensor,path:str,author='miaobyte'): - ir=DeepxIR("load",[t.node.name,path], [],author) - send(ir) - return t - -def save(t:Tensor,path:str,author='miaobyte'): - ir=DeepxIR("save",[t.node.name,path], [],author) - send(ir) - return t \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/matmul.py b/front/py/deepx/nn/functional/remotetensorfunc/matmul.py deleted file mode 100644 index 3c092689..00000000 --- a/front/py/deepx/nn/functional/remotetensorfunc/matmul.py +++ /dev/null @@ -1,8 +0,0 @@ -from deepx.tensor import Tensor -from deepx.nn import DeepxIR -from deepx.scheduler import send - -def matmul(a:Tensor,b:Tensor,out: Tensor ,author='cublas'): - ir=DeepxIR("matmul", [a.node.name,b.node.name], [out.node.name], author) - send(ir) - return out \ No newline at end of file diff --git a/front/py/deepx/nn/functional/remotetensorfunc/new.py b/front/py/deepx/nn/functional/remotetensorfunc/new.py deleted file mode 100644 index cbf6e140..00000000 --- a/front/py/deepx/nn/functional/remotetensorfunc/new.py +++ /dev/null @@ -1,18 +0,0 @@ -from deepx.tensor import Tensor -from deepx.autograd.graph import Graph,default_graph -from deepx.nn.deepxir import DeepxIR,Param -from deepx.scheduler import send - -def newtensor(t:Tensor,name:str=None): - ir2=DeepxIR("newtensor",[Param(t.shape)], [Param(t._node.name,category='tensor',precision=t.dtype)]) - send(ir2) - return t - -def copytensor(t:Tensor,out:Tensor): - - ir2=DeepxIR("copytensor", t.dtype, [t.node.name], [out.node.name]) - send(ir2) -def deltensor(t:Tensor): - - ir2=DeepxIR("deltensor",'', [t.node.name], []) - send(ir2) diff --git a/front/py/deepx/nn/functional/remotetensorfunc/reduce.py b/front/py/deepx/nn/functional/remotetensorfunc/reduce.py deleted file mode 100644 index 7b321842..00000000 --- a/front/py/deepx/nn/functional/remotetensorfunc/reduce.py +++ /dev/null @@ -1,24 +0,0 @@ -from deepx.tensor import Tensor -from deepx.nn.deepxir import DeepxIR,Param -from deepx.scheduler import send - -def sum(a:Tensor,dim:tuple[int],keepdim:bool,out: Tensor, author:str='miaobyte')->Tensor: - ir2=DeepxIR("sum",[a.node.name,dim,keepdim], [out.node.name], author) - send(ir2) - return out - -def prod(a:Tensor,dim:tuple[int],keepdim:bool,out:Tensor, author:str='miaobyte')->Tensor: - ir2=DeepxIR("prod",[a.node.name,dim,keepdim], [out.node.name], author) - send(ir2) - return out - -def reducemax(a:Tensor,dim:tuple[int],keepdim:bool,out:Tensor, author:str='miaobyte')->Tensor: - ir2=DeepxIR("reducemax",[a.node.name,dim,keepdim], [out.node.name], author) - send(ir2) - return out - -def reducemin(a:Tensor,dim:tuple[int],keepdim:bool,out:Tensor, author:str='miaobyte')->Tensor: - ir2=DeepxIR("reducemin",[a.node.name,dim,keepdim], [out.node.name], author) - send(ir2) - return out - \ No newline at end of file diff --git a/front/py/deepx/nn/functional/rtf.py b/front/py/deepx/nn/functional/rtf.py new file mode 100644 index 00000000..08d15f2d --- /dev/null +++ b/front/py/deepx/nn/functional/rtf.py @@ -0,0 +1,28 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR,Param +from deepx.scheduler import send +from typing import Union +def A_B_op_C(op:str,a:Tensor,b:Tensor,out:Tensor,author='miaobyte'): + args=[Param.tensor(a),Param.tensor(b)] + returns=[Param.tensor(out)] + ir=DeepxIR(op, args, returns,author) + send(ir) + +def A_scalar_op_C(op:str,a:Tensor,b:Union[float,int],out:Tensor,author='miaobyte'): + args=[Param.tensor(a),Param.varnum(b)] + returns=[Param.tensor(out)] + ir=DeepxIR(op, args, returns,author) + send(ir) + +def A_op_C(op:str,a:Tensor,out:Tensor,author='miaobyte'): + args=[Param.tensor(a)] + returns=[Param.tensor(out)] + ir=DeepxIR(op, args, returns,author) + send(ir) + +def A_b1_b2_op_C(op:str,a:Tensor,b1:tuple[int],b2:bool,out:Tensor,author='miaobyte'): + args=[Param.tensor(a),Param.vector(b1,'int32'),Param.varbool(b2)] + returns=[Param.tensor(out)] + ir=DeepxIR(op, args, returns,author) + send(ir) + diff --git a/front/py/deepx/nn/functional/rtf_changeshape.py b/front/py/deepx/nn/functional/rtf_changeshape.py new file mode 100644 index 00000000..6bdf6edb --- /dev/null +++ b/front/py/deepx/nn/functional/rtf_changeshape.py @@ -0,0 +1,30 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR,Param +from deepx.scheduler import send + +def rtf_reshape(t:Tensor,shape:tuple[int],out:Tensor,author='miaobyte'): + args=[Param.tensor(t),Param.vector(shape,'int32')] + returns=[Param.tensor(out)] + ir=DeepxIR("reshape", args, returns,author) + send(ir) + + +def rtf_transpose(t:Tensor,dimorder:tuple[int],out:Tensor,author='miaobyte'): + args=[Param.tensor(t),Param.vector(dimorder,'int32')] + returns=[Param.tensor(out)] + ir=DeepxIR("transpose", args, returns,author) + send(ir) + +def rtf_concat(tensors:tuple[Tensor],dim:int,out:Tensor,author='miaobyte'): + args=[Param.tensorlist([t for t in tensors],tensors[0].dtype),Param.varnum(dim,'int32')] + returns=[Param.tensor(out)] + ir=DeepxIR("concat", args, returns,author) + send(ir) + + +def rtf_broadcastTo(t:Tensor,new_shape:tuple[int],out:Tensor,author='miaobyte'): + args=[Param.tensor(t),Param.vector(new_shape,'int32')] + returns=[Param.tensor(out)] + ir=DeepxIR("broadcastTo", args, returns,author) + send(ir) + diff --git a/front/py/deepx/nn/functional/rtf_elementwise.py b/front/py/deepx/nn/functional/rtf_elementwise.py new file mode 100644 index 00000000..ea1a625d --- /dev/null +++ b/front/py/deepx/nn/functional/rtf_elementwise.py @@ -0,0 +1,99 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR,Param +from deepx.scheduler import send +from typing import Union +from .rtf import A_B_op_C,A_scalar_op_C,A_op_C + +def rtf_add(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_B_op_C("add",a,b,out,author) + return out + +def rtf_add_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("add",a,b,out,author) + return out + +def rtf_sub(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_B_op_C("sub",a,b,out,author) + return out + +def rtf_sub_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("sub",a,b,out,author) + return out + +def rtf_mul(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_B_op_C("mul",a,b,out,author) + return out + +def rtf_mul_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("mul",a,b,out,author) + return out + +def rtf_div(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_B_op_C("div",a,b,out,author) + return out + +def rtf_div_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("div",a,b,out,author) + return out + +def rtf_rdiv_scalar(a:float, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("rdiv",a,b,out,author) + return out + + + +def rtf_sqrt(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_op_C("sqrt",a,out,author) + return out + +def rtf_pow(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_B_op_C("pow",a,b,out,author) + return out + +def rtf_pow_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("pow",a,b,out,author) + return out + +def rtf_exp(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_op_C("exp",a,out,author) + return out + +def rtf_log(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_op_C("log",a,out,author) + return out + +def rtf_rsqrt(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_op_C("rsqrt",a,out,author) + return out + +def rtf_sin(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_op_C("sin",a,out,author) + return out + +def rtf_cos(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_op_C("cos",a,out,author) + return out + +def rtf_tan(a:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_op_C("tan",a,out,author) + return out + +def rtf_compare(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_B_op_C("compare",a,b,out,author) + return out + +def rtf_max(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_B_op_C("max",a,b,out,author) + return out + +def rtf_max_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("max",a,b,out,author) + return out + +def rtf_min(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_B_op_C("min",a,b,out,author) + return out + +def rtf_min_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("min",a,b,out,author) + return out \ No newline at end of file diff --git a/front/py/deepx/nn/functional/rtf_init.py b/front/py/deepx/nn/functional/rtf_init.py new file mode 100644 index 00000000..874c08f0 --- /dev/null +++ b/front/py/deepx/nn/functional/rtf_init.py @@ -0,0 +1,24 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR,Param +from deepx.scheduler import send +from typing import Union,Optional +from .rtf import A_B_op_C,A_scalar_op_C,A_op_C + + +def rtf_constant(t:Tensor,value:Union[float,int]=0,author='miaobyte')->Tensor: + A_scalar_op_C("constant",t,value,t,author) + return t + +def rtf_arange(t:Tensor,start:Optional[Union[float,int]]=0,step:Optional[Union[float,int]]=1,author='miaobyte')->Tensor: + args=[Param.tensor(t),Param.varnum(start),Param.varnum(step)] + returns=[Param.tensor(t)] + ir=DeepxIR("arange", args, returns,author) + send(ir) + return t + +def rtf_uniform(t:Tensor,low=0, high=1,seed:int=0,author='miaobyte')->Tensor: + args=[Param.tensor(t),Param.varnum(low),Param.varnum(high),Param.varnum(seed)] + returns=[Param.tensor(t)] + ir=DeepxIR("uniform", args, returns,author) + send(ir) + return t \ No newline at end of file diff --git a/front/py/deepx/nn/functional/rtf_io.py b/front/py/deepx/nn/functional/rtf_io.py new file mode 100644 index 00000000..02569603 --- /dev/null +++ b/front/py/deepx/nn/functional/rtf_io.py @@ -0,0 +1,24 @@ +from deepx.tensor import Tensor +from deepx.nn import DeepxIR,Param +from deepx.scheduler import send + +def rtf_printtensor(t:Tensor,format='',author='miaobyte'): + args=[Param.tensor(t),Param.varstr(format)] + returns=[] + ir=DeepxIR("print", args, returns,author) + send(ir) + return '' + +def rtf_load(t:Tensor,path:str,author='miaobyte'): + args=[Param.tensor(t),Param.varstr(path)] + returns=[] + ir=DeepxIR("load", args, returns,author) + send(ir) + return t + +def rtf_save(t:Tensor,path:str,author='miaobyte'): + args=[Param.tensor(t),Param.varstr(path)] + returns=[] + ir=DeepxIR("save", args, returns,author) + send(ir) + return t \ No newline at end of file diff --git a/front/py/deepx/nn/functional/rtf_matmul.py b/front/py/deepx/nn/functional/rtf_matmul.py new file mode 100644 index 00000000..a6a3af5d --- /dev/null +++ b/front/py/deepx/nn/functional/rtf_matmul.py @@ -0,0 +1,11 @@ +from deepx.tensor import Tensor +from deepx.nn import DeepxIR,Param +from deepx.scheduler import send +from .rtf import A_B_op_C + +def rtf_matmul(a:Tensor,b:Tensor,out: Tensor ,author='cublas'): + args=[Param.tensor(a),Param.tensor(b)] + returns=[Param.tensor(out)] + ir=DeepxIR("matmul", args, returns, author) + send(ir) + return out \ No newline at end of file diff --git a/front/py/deepx/nn/functional/rtf_new.py b/front/py/deepx/nn/functional/rtf_new.py new file mode 100644 index 00000000..01a89ab5 --- /dev/null +++ b/front/py/deepx/nn/functional/rtf_new.py @@ -0,0 +1,22 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR,Param +from deepx.scheduler import send + +def rtf_newtensor(t:Tensor,name:str=None): + args=[Param.vector(t.shape,'int32')] + returns=[Param.tensorName(name,t.dtype)] + ir=DeepxIR("newtensor", args, returns,'') + send(ir) + + +def rtf_copytensor(t:Tensor,out:Tensor): + args=[Param.tensor(t)] + returns=[Param.tensor(out)] + ir=DeepxIR("copytensor", args, returns,'') + send(ir) + +def rtf_deltensor(t:Tensor): + args=[Param.tensor(t)] + returns=[] + ir=DeepxIR("deltensor", args, returns,'') + send(ir) diff --git a/front/py/deepx/nn/functional/rtf_reduce.py b/front/py/deepx/nn/functional/rtf_reduce.py new file mode 100644 index 00000000..61da95b1 --- /dev/null +++ b/front/py/deepx/nn/functional/rtf_reduce.py @@ -0,0 +1,21 @@ +from deepx.tensor import Tensor +from deepx.nn.deepxir import DeepxIR,Param +from deepx.scheduler import send +from .rtf import A_b1_b2_op_C + + +def rtf_sum(a:Tensor,dim:tuple[int],keepdim:bool,out: Tensor, author:str='miaobyte')->Tensor: + A_b1_b2_op_C("sum",a,dim,keepdim,out,author) + + +def rtf_prod(a:Tensor,dim:tuple[int],keepdim:bool,out:Tensor, author:str='miaobyte')->Tensor: + A_b1_b2_op_C("prod",a,dim,keepdim,out,author) + + +def rtf_reducemax(a:Tensor,dim:tuple[int],keepdim:bool,out:Tensor, author:str='miaobyte')->Tensor: + A_b1_b2_op_C("reducemax",a,dim,keepdim,out,author) + + +def rtf_reducemin(a:Tensor,dim:tuple[int],keepdim:bool,out:Tensor, author:str='miaobyte')->Tensor: + A_b1_b2_op_C("reducemin",a,dim,keepdim,out,author) + \ No newline at end of file diff --git a/front/py/deepx/scheduler/client/udpconn.py b/front/py/deepx/scheduler/client/udpconn.py index 6a12c26a..a25b0963 100644 --- a/front/py/deepx/scheduler/client/udpconn.py +++ b/front/py/deepx/scheduler/client/udpconn.py @@ -3,7 +3,7 @@ import select class UDPConn: - def __init__(self, endpoint: str = "localhost:9090"): + def __init__(self, endpoint: str = "localhost:8080"): # 解析endpoint self._host, port_str = endpoint.split(':') self._port = int(port_str) diff --git a/front/py/deepx/tensor/tensor.py b/front/py/deepx/tensor/tensor.py index 91fa8f7d..2c44181e 100644 --- a/front/py/deepx/tensor/tensor.py +++ b/front/py/deepx/tensor/tensor.py @@ -154,6 +154,7 @@ def T(self) -> str: return self.transpose(1,0,out=self.node.name+".T") # 打印 + def set_format(self,format:str): self._format = format def __repr__(self) -> str: From 385338ef0cfd5f7a381c051f547e8a4154bc361f Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Tue, 15 Apr 2025 22:18:07 +0800 Subject: [PATCH 05/12] =?UTF-8?q?front:ir=E6=A0=BC=E5=BC=8F,init=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excuter/cpp-common/src/deepx/tf/tf.cpp | 98 ++++++---- front/py/deepx/nn/deepxir.py | 19 +- front/py/deepx/nn/functional/__init__.py | 14 +- front/py/deepx/nn/functional/leaffunc.py | 3 + .../functional/{init.py => leaffunc_init.py} | 171 ++++++++---------- .../nn/functional/{io.py => leaffunc_io.py} | 4 - .../nn/functional/{new.py => leaffunc_new.py} | 3 - front/py/deepx/nn/functional/rtf.py | 6 + front/py/deepx/nn/functional/rtf_init.py | 8 +- front/py/deepx/nn/functional/rtf_new.py | 5 +- front/py/deepx/scheduler/client/allclient.py | 3 +- front/py/examples/1_tensor/1_new.py | 27 ++- front/py/examples/2_ir/1_init_zeroones.py | 27 +-- 13 files changed, 198 insertions(+), 190 deletions(-) rename front/py/deepx/nn/functional/{init.py => leaffunc_init.py} (57%) rename front/py/deepx/nn/functional/{io.py => leaffunc_io.py} (64%) rename front/py/deepx/nn/functional/{new.py => leaffunc_new.py} (73%) diff --git a/excuter/cpp-common/src/deepx/tf/tf.cpp b/excuter/cpp-common/src/deepx/tf/tf.cpp index c8f0ffbc..1ea2adb4 100644 --- a/excuter/cpp-common/src/deepx/tf/tf.cpp +++ b/excuter/cpp-common/src/deepx/tf/tf.cpp @@ -30,11 +30,14 @@ namespace deepx::tf size_t space_pos = input_part.find(' '); size_t paren_pos = input_part.find('('); size_t name_end; - - if (paren_pos != string::npos && (space_pos == string::npos || paren_pos < space_pos)) { + + if (paren_pos != string::npos && (space_pos == string::npos || paren_pos < space_pos)) + { // 如果有括号且括号在空格之前,使用括号位置 name_end = paren_pos; - } else { + } + else + { // 否则使用空格位置或字符串末尾 name_end = space_pos != string::npos ? space_pos : input_part.length(); } @@ -165,38 +168,66 @@ namespace deepx::tf vector vectorvalues; bool vectorvalue = false; - // 检查是否是向量值(以]结尾) - if (param.back() == ']') + // 首先检查是否包含冒号分隔符 + size_t colon_pos = param.find(':'); + if (colon_pos != string::npos) { - size_t bracket_start = param.find_last_of('['); - if (bracket_start != string::npos) + // 使用冒号分隔类型和值 + type = param.substr(0, colon_pos); + textvalue = param.substr(colon_pos + 1); + + // 去除type两端的空格 + type.erase(0, type.find_first_not_of(" ")); + type.erase(type.find_last_not_of(" ") + 1); + + // 去除textvalue两端的空格 + textvalue.erase(0, textvalue.find_first_not_of(" ")); + textvalue.erase(textvalue.find_last_not_of(" ") + 1); + + // 检查是否是向量值(以[开头,]结尾) + if (textvalue.size() >= 2 && textvalue.front() == '[' && textvalue.back() == ']') { vectorvalue = true; - // 提取方括号内的内容作为textvalue - textvalue = param.substr(bracket_start + 1, param.length() - bracket_start - 2); - // 提取方括号前的内容作为type - type = param.substr(0, bracket_start); - // 去除type两端的空格 - type.erase(0, type.find_first_not_of(" ")); - type.erase(type.find_last_not_of(" ") + 1); + // 去除方括号,只保留内容 + textvalue = textvalue.substr(1, textvalue.length() - 2); } } - - if (!vectorvalue) + else { - // 没有方括号,按空格分割 - stringstream ss(param); - string first, second; - ss >> first; - if (ss >> second) + // 无冒号,使用原有逻辑处理 + // 检查是否是向量值(以]结尾) + if (param.back() == ']') { - // 如果能读取到两个部分 - type = first; - textvalue = second; + size_t bracket_start = param.find('['); + if (bracket_start != string::npos) + { + vectorvalue = true; + // 提取方括号内的内容作为textvalue + textvalue = param.substr(bracket_start + 1, param.length() - bracket_start - 2); + // 提取方括号前的内容作为type + type = param.substr(0, bracket_start); + // 去除type两端的空格 + type.erase(0, type.find_first_not_of(" ")); + type.erase(type.find_last_not_of(" ") + 1); + } } - else + + if (!vectorvalue) { - textvalue = first; + // 没有方括号,按空格分割 + stringstream ss(param); + string first, second; + ss >> first; + if (ss >> second) + { + // 如果能读取到两个部分 + type = first; + textvalue = second; + } + else + { + textvalue = first; + } } } @@ -220,7 +251,7 @@ namespace deepx::tf // 设置结果 if (!type.empty()) { - result.dtype = dtype(type); + result.dtype = dtype(type); } else { @@ -228,8 +259,9 @@ namespace deepx::tf if (vectorvalue) { if (!vectorvalues.empty()) - { - if (is_integer(vectorvalues[0])){ + { + if (is_integer(vectorvalues[0])) + { result.dtype = make_dtype(DataCategory::Vector, Precision::Int32); } else if (is_float(vectorvalues[0])) @@ -248,13 +280,13 @@ namespace deepx::tf } else { - result.dtype = make_dtype(DataCategory::Var|DataCategory::Tensor, Precision::Any); + result.dtype = make_dtype(DataCategory::Var | DataCategory::Tensor, Precision::Any); } } - + result.textvalue = textvalue; return result; - } + }; // 解析参数列表 vector parse_params(const string ¶ms_str) @@ -452,6 +484,4 @@ namespace deepx::tf return true; } - - } \ No newline at end of file diff --git a/front/py/deepx/nn/deepxir.py b/front/py/deepx/nn/deepxir.py index 9f9d2d83..86a0239b 100644 --- a/front/py/deepx/nn/deepxir.py +++ b/front/py/deepx/nn/deepxir.py @@ -11,9 +11,9 @@ def __init__(self,textvalue:str, category:str=None,precision:str=None): def __str__(self): if self._category is not None: if self._precision is not None: - return f"{self._category}<{self._precision}> {self._textvalue}" + return f"{self._category}<{self._precision}>:{self._textvalue}" else: - return f"{self._category} {self._textvalue}" + return f"{self._category}:{self._textvalue}" else: return self._textvalue @@ -32,9 +32,9 @@ def tensor(cls,t:Tensor): def varnum(cls,value:Union[float,int]): precision=None if isinstance(value,float): - precision="float" + precision="float32" elif isinstance(value,int): - precision="int" + precision="int32" return Param(str(value),category="var",precision=precision) @classmethod @@ -54,7 +54,16 @@ def vector(cls,value:tuple,dtype:str): def tensorlist(cls,value:tuple[str],dtype:str): textvalue='['+' '.join(v for v in value)+']' return Param(textvalue,category="tensorlist",precision=dtype) - + +# 完整IR,携带类型 +# newtensor (vector:[3 4 5]) -> (tensor tensor_136144420556608) +# // id=1 created_at=1744724799.0650852 sent_at=1744724799.0650952 + +# 简化IR +# newtensor ( [3 4 5]) -> ( tensor_136144420556608) +# // id=1 created_at=1744724799.0650852 sent_at=1744724799.0650952 + + class DeepxIR: def __init__(self, name:str, diff --git a/front/py/deepx/nn/functional/__init__.py b/front/py/deepx/nn/functional/__init__.py index 2d9eaf50..5a363f3b 100644 --- a/front/py/deepx/nn/functional/__init__.py +++ b/front/py/deepx/nn/functional/__init__.py @@ -1,15 +1,19 @@ + +from .leaffunc_new import newtensor,deltensor +from .leaffunc_io import printtensor +from .leaffunc_init import * + +from .leaffunc_changeshape import * from .elementwise import * -from .new import newtensor,deltensor -from .io import printtensor from .matmul import matmul -from .init import * + from .reduce import reduce_max,reduce_min,sum,prod,mean -from .leaffunc_changeshape import * + from .activite import relu,sigmoid,swish __all__ = [ "newtensor", "printtensor", - "constant","full","zeros","ones","uniform","arange","rand","randn","eye","kaiming_uniform_","calculate_fan_in_and_fan_out", + "constant","constant_","full","zeros","ones","uniform","uniform_","arange","arange_","kaiming_uniform","kaiming_uniform_","calculate_fan_in_and_fan_out", "add","sub","mul","div","sqrt","pow","exp","log","rsqrt", "matmul", "max","min","sum","prod","mean", diff --git a/front/py/deepx/nn/functional/leaffunc.py b/front/py/deepx/nn/functional/leaffunc.py index 3254ea01..84a20916 100644 --- a/front/py/deepx/nn/functional/leaffunc.py +++ b/front/py/deepx/nn/functional/leaffunc.py @@ -4,4 +4,7 @@ from deepx.scheduler import send from deepx.autograd import OpNode,Function,Context +# inplace操作的函数,其名为_后缀, 返回值为空 +# 非inplace操作的函数,其名为_后缀, 返回值为Tensor + def buildgraph(a:Tensor,dim:tuple[int],keepdim:bool=False,out:Tensor, author:str='miaobyte')->Tensor: \ No newline at end of file diff --git a/front/py/deepx/nn/functional/init.py b/front/py/deepx/nn/functional/leaffunc_init.py similarity index 57% rename from front/py/deepx/nn/functional/init.py rename to front/py/deepx/nn/functional/leaffunc_init.py index 2d193f9d..ef73653b 100644 --- a/front/py/deepx/nn/functional/init.py +++ b/front/py/deepx/nn/functional/leaffunc_init.py @@ -1,109 +1,76 @@ -from typing import Optional,Union +from typing import Union import math - +from .leaffunc_new import newtensor +from .rtf_init import * from deepx import Tensor -from deepx.autograd import OpNode,Function,Context -from deepx.nn.deepxir import DeepxIR,Param -from deepx.scheduler import send - -class Constant(Function): - @staticmethod - def forward(ctx:Context, - t:Tensor, - value:Optional[Union[float,int]]=None, - author='miaobyte') -> Tensor: - opnode = t.graph.add_op("constant") - argnode=t.graph.add_var('',value) - opnode.add_input(argnode) - t.node.add_input(opnode) - if t.graph.eager: - ir=DeepxIR("constant", [Param(t.node.name, 'tensor', t.dtype),Param(value)], [],author) - send(ir) - return t -def constant(t:Tensor, - value:Optional[Union[float,int]]=None, - author='miaobyte')->Tensor: - return Constant.apply(t,value,author) -def full(*shape, value=0, dtype=None, device=None, - name:Union[Tensor,str]='')->Tensor: +# 命名规则 +# inplace操作的函数,其名为_后缀, 返回值为空 +# 非inplace操作的函数,其名为_后缀, 返回值为Tensor + +def parse_shape(shape:Union[tuple,list])->tuple: if len(shape) == 1 and isinstance(shape[0], (tuple, list)): shape = shape[0] - outtensor=None - if isinstance(name,str): - outtensor=Tensor(shape=shape, dtype=dtype, device=device) - outtensor.addtograph(name) - else: - outtensor=name - return constant(outtensor, value) - -def zeros(*shape, dtype=None, device=None, - name:Union[str]='')->Tensor: - return full(*shape, value=0, dtype=dtype, device=device,name=name) + return shape -def ones(*size, dtype=None, device=None, - name:Union[str]='')->Tensor: - return full(*size, value=1, dtype=dtype, device=device,name=name) +def constant_(t:Tensor, + value: Union[float,int], + author='miaobyte')->Tensor: + rtf_constant(t,value,author) -class Arange(Function): - @staticmethod - def forward(ctx:Context, - t:Tensor, - start:Optional[Union[float,int]]=0, - step:Optional[Union[float,int]]=1, - author='miaobyte')->Tensor: - g=t.graph - if g.eager: - ir=DeepxIR("arange",[t.node.name,start,step], [],author) - send(ir) - return t -def arange(t:Tensor,start=0,step=1,author='miaobyte')->Tensor: - return Arange.apply(t,start,step,author) + +def constant(*shape, value:Union[float,int], dtype:str='float32')->Tensor: + s=parse_shape(shape) + outtensor=Tensor(shape=s, dtype=dtype) + newtensor(outtensor) + constant_(outtensor, value) + return outtensor + +def full(*shape, value:Union[float,int], dtype:str='float32')->Tensor: + return constant(*shape, value=value, dtype=dtype) + +def zeros(*shape, dtype:str='float32')->Tensor: + return constant(*shape, value=0, dtype=dtype) + +def ones(*size, dtype:str='float32')->Tensor: + return constant(*size, value=1, dtype=dtype) -class Uniform(Function): - @staticmethod - def forward(ctx:Context, - t:Tensor, - low:Optional[Union[float,int]]=0, - high:Optional[Union[float,int]]=1, - seed:Optional[int]=0,author='miaobyte')->Tensor: - if low >= high: - raise ValueError(f"low({low})必须小于high({high})") - if t is None: - raise ValueError("t不能为None") - g=t.graph - - opnode = g.add_op("uniform") - opnode.add_input(g.add_var('',low)) - opnode.add_input(g.add_var('',high)) - if seed is not None: - opnode.add_input(g.add_var('',seed)) - t.node.add_input(opnode) - if t.graph.eager: - ir=DeepxIR("uniform", [t.node.name,low, high,seed], [],author) - send(ir) - return t - - -def uniform(t:Tensor,low=0, high=1,seed:int=0,author='miaobyte')->Tensor: - return Uniform.apply(t,low,high,seed,author) - -def rand(*size, dtype=None, device=None): - #TODO - pass - -def randn(*size, dtype=None, device=None): - #TODO - pass - -def eye( - n:int, - m:Optional[int]=None, - dtype:Optional[str]=None, - device:Optional[str]=None): - #TODO - pass +def arange_(t:Tensor,start=0,step=1,author='miaobyte')->Tensor: + from .rtf_init import rtf_arange + rtf_arange(t,start,step,author) +def arange(*shape,start=0,step=1,dtype:str='float32',author='miaobyte')->Tensor: + s=parse_shape(shape) + outtensor=Tensor(shape=s, dtype=dtype) + newtensor(outtensor) + arange_(outtensor,start,step,author) + return outtensor + +def uniform_(t:Tensor,low=0, high=1,seed:int=0,author='miaobyte')->Tensor: + from .rtf_init import rtf_uniform + rtf_uniform(t,low,high,seed,author) +def uniform(*shape,low=0, high=1,seed:int=0,dtype:str='float32',author='miaobyte')->Tensor: + s=parse_shape(shape) + outtensor=Tensor(shape=s, dtype=dtype) + newtensor(outtensor) + uniform_(outtensor,low,high,seed,author) + return outtensor + +# def rand(*size, dtype=None, device=None): +# #TODO +# pass + +# def randn(*size, dtype=None, device=None): +# #TODO +# pass + +# def eye( +# n:int, +# m:Optional[int]=None, +# dtype:Optional[str]=None, +# device:Optional[str]=None): +# #TODO +# pass def calculate_fan_in_and_fan_out(tensor:Tensor)->tuple[int,int]: @@ -215,4 +182,12 @@ def kaiming_uniform_( gain = calculate_gain(nonlinearity, a) std = gain / math.sqrt(fan) bound = math.sqrt(3.0) * std # Calculate uniform bounds from standard deviation - return tensor.uniform_(-bound, bound) + return uniform_(tensor,-bound, bound) + +def kaiming_uniform(*shape,a:float=0,mode:str='fan_in',nonlinearity:str='leaky_relu',dtype:str='float32',author='miaobyte')->Tensor: + s=parse_shape(shape) + outtensor=Tensor(shape=s, dtype=dtype) + newtensor(outtensor) + kaiming_uniform_(outtensor,a,mode,nonlinearity) + return outtensor + diff --git a/front/py/deepx/nn/functional/io.py b/front/py/deepx/nn/functional/leaffunc_io.py similarity index 64% rename from front/py/deepx/nn/functional/io.py rename to front/py/deepx/nn/functional/leaffunc_io.py index 56e9e4bc..98d221da 100644 --- a/front/py/deepx/nn/functional/io.py +++ b/front/py/deepx/nn/functional/leaffunc_io.py @@ -1,9 +1,5 @@ from deepx.tensor import Tensor -from deepx.autograd import OpNode -from deepx.nn import DeepxIR -from deepx.scheduler import send - def printtensor(t:Tensor,format='',author='miaobyte'): from .rtf_io import rtf_printtensor rtf_printtensor(t,format,author) diff --git a/front/py/deepx/nn/functional/new.py b/front/py/deepx/nn/functional/leaffunc_new.py similarity index 73% rename from front/py/deepx/nn/functional/new.py rename to front/py/deepx/nn/functional/leaffunc_new.py index bb5ed88e..1399f7fb 100644 --- a/front/py/deepx/nn/functional/new.py +++ b/front/py/deepx/nn/functional/leaffunc_new.py @@ -1,7 +1,4 @@ from deepx.tensor import Tensor -from deepx.autograd.graph import Graph -from deepx.nn.deepxir import DeepxIR,Param -from deepx.scheduler import send def newtensor(t:Tensor,name:str=None): from .rtf_new import rtf_newtensor diff --git a/front/py/deepx/nn/functional/rtf.py b/front/py/deepx/nn/functional/rtf.py index 08d15f2d..d3c46d39 100644 --- a/front/py/deepx/nn/functional/rtf.py +++ b/front/py/deepx/nn/functional/rtf.py @@ -8,6 +8,12 @@ def A_B_op_C(op:str,a:Tensor,b:Tensor,out:Tensor,author='miaobyte'): ir=DeepxIR(op, args, returns,author) send(ir) +def A_scalar_op(op:str,a:Tensor,b:Union[float,int],author='miaobyte'): + args=[Param.tensor(a),Param.varnum(b)] + returns=[] + ir=DeepxIR(op, args, returns,author) + send(ir) + def A_scalar_op_C(op:str,a:Tensor,b:Union[float,int],out:Tensor,author='miaobyte'): args=[Param.tensor(a),Param.varnum(b)] returns=[Param.tensor(out)] diff --git a/front/py/deepx/nn/functional/rtf_init.py b/front/py/deepx/nn/functional/rtf_init.py index 874c08f0..aa4e5d99 100644 --- a/front/py/deepx/nn/functional/rtf_init.py +++ b/front/py/deepx/nn/functional/rtf_init.py @@ -2,23 +2,23 @@ from deepx.nn.deepxir import DeepxIR,Param from deepx.scheduler import send from typing import Union,Optional -from .rtf import A_B_op_C,A_scalar_op_C,A_op_C +from .rtf import A_scalar_op def rtf_constant(t:Tensor,value:Union[float,int]=0,author='miaobyte')->Tensor: - A_scalar_op_C("constant",t,value,t,author) + A_scalar_op("constant",t,value,author) return t def rtf_arange(t:Tensor,start:Optional[Union[float,int]]=0,step:Optional[Union[float,int]]=1,author='miaobyte')->Tensor: args=[Param.tensor(t),Param.varnum(start),Param.varnum(step)] - returns=[Param.tensor(t)] + returns=[] ir=DeepxIR("arange", args, returns,author) send(ir) return t def rtf_uniform(t:Tensor,low=0, high=1,seed:int=0,author='miaobyte')->Tensor: args=[Param.tensor(t),Param.varnum(low),Param.varnum(high),Param.varnum(seed)] - returns=[Param.tensor(t)] + returns=[] ir=DeepxIR("uniform", args, returns,author) send(ir) return t \ No newline at end of file diff --git a/front/py/deepx/nn/functional/rtf_new.py b/front/py/deepx/nn/functional/rtf_new.py index 01a89ab5..915bb307 100644 --- a/front/py/deepx/nn/functional/rtf_new.py +++ b/front/py/deepx/nn/functional/rtf_new.py @@ -4,7 +4,10 @@ def rtf_newtensor(t:Tensor,name:str=None): args=[Param.vector(t.shape,'int32')] - returns=[Param.tensorName(name,t.dtype)] + if name is not None: + returns=[Param.tensorName(name,t.dtype)] + else: + returns=[Param.tensor(t)] ir=DeepxIR("newtensor", args, returns,'') send(ir) diff --git a/front/py/deepx/scheduler/client/allclient.py b/front/py/deepx/scheduler/client/allclient.py index c23d7e6e..c479e5ef 100644 --- a/front/py/deepx/scheduler/client/allclient.py +++ b/front/py/deepx/scheduler/client/allclient.py @@ -11,6 +11,7 @@ def send(ir:DeepxIR) -> DeepxIRResp: global _id_counter _id_counter=_id_counter+1 ir._id=_id_counter - respstr=default_client.send(str(ir)) + s=str(ir) + respstr=default_client.send(s) respir=DeepxIRResp(respstr) return respir diff --git a/front/py/examples/1_tensor/1_new.py b/front/py/examples/1_tensor/1_new.py index 329dfc4c..04253283 100644 --- a/front/py/examples/1_tensor/1_new.py +++ b/front/py/examples/1_tensor/1_new.py @@ -1,7 +1,4 @@ -import sys - -from deepx.autograd import Graph - +import sys sys.path.append('/home/lipeng/code/git.array2d.com/ai/deepx/front/py') # 将项目根目录添加到Python路径 from deepx.tensor import Tensor @@ -17,25 +14,25 @@ def printall(t): print("t.dtype=", t.dtype) def newtensorwithshape(shape): t = Tensor(shape=[2,3,4]) - t.addtograph("t") + from deepx.nn.functional import newtensor + newtensor(t) printall (t) def newtensorwithdata(): t = Tensor([1,2,3]) - t.addtograph("t") - printall (t) -def main(caseid): - if caseid == 0: - newtensorwithshape([1,2,3]) - elif caseid == 1: - newtensorwithdata() - elif caseid == 2: - newtensorwithshape([1,2,3]) + from deepx.nn.functional import newtensor + newtensor(t) + printall(t) if __name__ == "__main__": args = sys.argv[1:] caseid = 0 if len(args) > 0: caseid = int(args[0]) - main(caseid) \ No newline at end of file + if caseid == 0: + newtensorwithshape([1, 2, 3]) + elif caseid == 1: + newtensorwithdata() + elif caseid == 2: + newtensorwithshape([1, 2, 3]) \ No newline at end of file diff --git a/front/py/examples/2_ir/1_init_zeroones.py b/front/py/examples/2_ir/1_init_zeroones.py index 5b09ead3..d6f63c34 100644 --- a/front/py/examples/2_ir/1_init_zeroones.py +++ b/front/py/examples/2_ir/1_init_zeroones.py @@ -4,11 +4,8 @@ import torch torch_t1 = torch.zeros(3, 4, 5, dtype=torch.float32) torch_t2 = torch.ones(3, 4, 5, dtype=torch.float32) -torch_t3 = torch_t1 + torch_t2 torch_t4 = torch.full((3, 4, 5), 0.5) -print(torch_t3) -torch_t5 = torch_t4 + torch_t3 -print(torch_t5) +print(torch_t4) torch_t6 = torch.zeros(3, 4, 5, dtype=torch.float32) torch.nn.init.kaiming_uniform_(torch_t6) @@ -18,23 +15,13 @@ ############-------DEEPX-------################ -from deepx import zeros,ones,full,kaiming_uniform_ +from deepx import zeros,ones,full,kaiming_uniform print() -t1 = zeros([3,4,5],dtype='float32',name="t1") -t2 = ones([3,4,5],dtype='float32',name="t2") -t3 = t1.add(t2,"t3") -t4=full([3,4,5],value=0.5,name="t4") -print(t3) -t5=t4.add(t3,"t5") -print(t5) +t1 = zeros([3,4,5],dtype='float32') +t2 = ones([3,4,5],dtype='float32') +t4=full([3,4,5],value=0.5) +print(t4) - -t6=zeros([3,4,5],dtype='float32') -kaiming_uniform_(t6) +t6=kaiming_uniform(3,4,5,dtype='float32') print(t6) - -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] # 获取不带后缀的脚本名 -str=t3.graph.to_dot() -str.render(script_name+".dot", format='svg') From 45151b6469a3bbc3ff159cbefc7e33f9f6b0f27d Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Wed, 16 Apr 2025 02:03:02 +0800 Subject: [PATCH 06/12] =?UTF-8?q?front:elementwise=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excuter/cpp-common/src/deepx/tf/tf.hpp | 15 +- .../src/deepx/mem/mem_ompsimd.hpp | 2 +- .../src/deepx/tf/changeshape.hpp | 16 + .../src/deepx/tf/elementwise.hpp | 14 +- excuter/op-mem-ompsimd/src/deepx/tf/init.hpp | 4 + front/py/deepx/__init__.py | 3 +- front/py/deepx/autograd/function.py | 9 +- front/py/deepx/nn/functional/__init__.py | 2 +- front/py/deepx/nn/functional/activite.py | 4 +- front/py/deepx/nn/functional/elementwise.py | 453 ------------------ .../nn/functional/leaffunc_changeshape.py | 79 ++- .../nn/functional/leaffunc_elementwise.py | 432 +++++++++++++++++ front/py/deepx/nn/functional/leaffunc_init.py | 49 +- front/py/deepx/nn/functional/leaffunc_new.py | 12 +- .../py/deepx/nn/functional/rtf_elementwise.py | 32 +- front/py/deepx/nn/functional/rtf_new.py | 2 +- front/py/deepx/tensor/__init__.py | 2 - front/py/deepx/tensor/devicetype.py | 28 -- front/py/deepx/tensor/tensor.py | 20 +- front/py/examples/1_tensor/1_new.py | 8 +- front/py/examples/2_ir/2_elementwise_add.py | 12 +- 21 files changed, 591 insertions(+), 607 deletions(-) delete mode 100644 front/py/deepx/nn/functional/elementwise.py create mode 100644 front/py/deepx/nn/functional/leaffunc_elementwise.py delete mode 100644 front/py/deepx/tensor/devicetype.py diff --git a/excuter/cpp-common/src/deepx/tf/tf.hpp b/excuter/cpp-common/src/deepx/tf/tf.hpp index 4329fb47..17b7e51e 100644 --- a/excuter/cpp-common/src/deepx/tf/tf.hpp +++ b/excuter/cpp-common/src/deepx/tf/tf.hpp @@ -28,8 +28,6 @@ namespace deepx::tf Param(const string &textvalue = "", const DataCategory &dt = DataCategory::Unknown, const Precision &prec = Precision::Any) : textvalue(textvalue), dtype(make_dtype(dt, prec)) {} - - }; // TF:Tensor Function的缩写 @@ -140,6 +138,19 @@ namespace deepx::tf return result; } + bool checktensors(const initializer_list &names, shared_ptr mem, string &error) + { + for (const auto &name : names) + { + if (!mem->gettensor(name)) + { + error = "tensor not found: " + name; + return false; + } + } + return true; + } + std::string dtypes() const; bool check_dtype(const TF &other) const; diff --git a/excuter/op-mem-ompsimd/src/deepx/mem/mem_ompsimd.hpp b/excuter/op-mem-ompsimd/src/deepx/mem/mem_ompsimd.hpp index 7488467c..b8f8d538 100644 --- a/excuter/op-mem-ompsimd/src/deepx/mem/mem_ompsimd.hpp +++ b/excuter/op-mem-ompsimd/src/deepx/mem/mem_ompsimd.hpp @@ -45,7 +45,7 @@ namespace deepx::mem { if (mem.find(name) == mem.end()) { - throw std::runtime_error("tensor not found: " + name); + return nullptr; } auto ptr = mem.at(name); auto result = make_shared>(); diff --git a/excuter/op-mem-ompsimd/src/deepx/tf/changeshape.hpp b/excuter/op-mem-ompsimd/src/deepx/tf/changeshape.hpp index e66dd538..0f93dcf2 100644 --- a/excuter/op-mem-ompsimd/src/deepx/tf/changeshape.hpp +++ b/excuter/op-mem-ompsimd/src/deepx/tf/changeshape.hpp @@ -35,6 +35,10 @@ namespace deepx::tf int run(shared_ptr mem, string &error) override { + if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision input_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; vector shape = this->getvector(1, -1); Precision output_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; @@ -95,6 +99,10 @@ namespace deepx::tf int run(shared_ptr mem, string &error) override { + if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision input_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; vector dim_order = this->getvector(1, -1); Precision output_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; @@ -154,6 +162,10 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { + if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } vector tensor_names = this->getvector(0, true); Precision input_type = mem->gettensor(tensor_names[0]).get()->shape.dtype; int axis = this->getvar(1, mem, true); @@ -256,6 +268,10 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { + if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision input_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; vector new_shape = this->getvector(1, true); Precision output_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; diff --git a/excuter/op-mem-ompsimd/src/deepx/tf/elementwise.hpp b/excuter/op-mem-ompsimd/src/deepx/tf/elementwise.hpp index c6abe07c..98573df3 100644 --- a/excuter/op-mem-ompsimd/src/deepx/tf/elementwise.hpp +++ b/excuter/op-mem-ompsimd/src/deepx/tf/elementwise.hpp @@ -32,6 +32,10 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { + if (checktensors({this->args[0].textvalue, this->args[1].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision a_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; Precision b_type = mem->gettensor(this->args[1].textvalue).get()->shape.dtype; Precision c_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; @@ -88,7 +92,11 @@ namespace deepx::tf return make_shared>(*this); } int run(shared_ptr mem, string &error) override - { + { + if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision a_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; Precision c_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; if (a_type != c_type) @@ -144,6 +152,10 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { + if (checktensors({this->args[0].textvalue, this->args[1].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision a_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; Precision b_type = mem->gettensor(this->args[1].textvalue).get()->shape.dtype; Precision c_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; diff --git a/excuter/op-mem-ompsimd/src/deepx/tf/init.hpp b/excuter/op-mem-ompsimd/src/deepx/tf/init.hpp index 3352b625..e208b540 100644 --- a/excuter/op-mem-ompsimd/src/deepx/tf/init.hpp +++ b/excuter/op-mem-ompsimd/src/deepx/tf/init.hpp @@ -33,6 +33,10 @@ namespace deepx::tf { string name = this->args[0].textvalue; auto tensor = mem->gettensor(name).get(); + if (tensor==nullptr) { + error = "tensor not found: " + name; + return 1; + } auto type = tensor->shape.dtype; switch (type) { diff --git a/front/py/deepx/__init__.py b/front/py/deepx/__init__.py index f8b9ec67..355a250b 100644 --- a/front/py/deepx/__init__.py +++ b/front/py/deepx/__init__.py @@ -1,4 +1,4 @@ -from .tensor import Tensor,Shape,Device,DeviceType +from .tensor import Tensor,Shape from deepx.nn.functional import * # 导入所有functional函数 from deepx.nn.functional import __all__ as _func_all # 获取functional的导出列表 @@ -6,7 +6,6 @@ #tensor 'Tensor', 'Shape', - 'Device','DeviceType', *_func_all ] diff --git a/front/py/deepx/autograd/function.py b/front/py/deepx/autograd/function.py index 98f63def..ac89f52a 100644 --- a/front/py/deepx/autograd/function.py +++ b/front/py/deepx/autograd/function.py @@ -4,7 +4,7 @@ def __init__(self,requires_grad=False): self._requires_grad = requires_grad self._saved_tensors = [] self._non_tensor_data = {} - + self._authormap = {} def save_tensors(self, *tensors): self._saved_tensors.extend(tensors) @@ -18,6 +18,13 @@ def save_data(self, key, value): def get_data(self, key): return self._non_tensor_data.get(key) + def set_authormap(self,authormap:dict): + self._authormap = authormap + + @property + def authormap(self): + return self._authormap + @property def requires_grad(self): return self._requires_grad diff --git a/front/py/deepx/nn/functional/__init__.py b/front/py/deepx/nn/functional/__init__.py index 5a363f3b..9a721309 100644 --- a/front/py/deepx/nn/functional/__init__.py +++ b/front/py/deepx/nn/functional/__init__.py @@ -4,7 +4,7 @@ from .leaffunc_init import * from .leaffunc_changeshape import * -from .elementwise import * +from .leaffunc_elementwise import * from .matmul import matmul from .reduce import reduce_max,reduce_min,sum,prod,mean diff --git a/front/py/deepx/nn/functional/activite.py b/front/py/deepx/nn/functional/activite.py index 6ef43513..7a90b2e3 100644 --- a/front/py/deepx/nn/functional/activite.py +++ b/front/py/deepx/nn/functional/activite.py @@ -5,7 +5,7 @@ def relu( t: Tensor, inplace:bool=False, out:Union[Tensor,str]='')->Tensor: - from .elementwise import max as max_func + from .leaffunc_elementwise import max as max_func return max_func(t,0,out) # 数学公式:σ(x) = 1 / (1 + exp(-x)) @@ -35,7 +35,7 @@ def sigmoid( outtensor.addtograph(out) else: outtensor=out - from .elementwise import exp + from .leaffunc_elementwise import exp outtensor = 1 / ((t*-1).exp()+1) return outtensor diff --git a/front/py/deepx/nn/functional/elementwise.py b/front/py/deepx/nn/functional/elementwise.py deleted file mode 100644 index 51d4ea9a..00000000 --- a/front/py/deepx/nn/functional/elementwise.py +++ /dev/null @@ -1,453 +0,0 @@ -from typing import Optional, Union -from deepx import Tensor -from deepx.autograd import Function,Context -from deepx.nn import DeepxIR -from deepx.scheduler import send - -def _A_elementwiseop_C( - a:Tensor, - op:str=None, - out:Union[Tensor,str]="",author='miaobyte')->Tensor: - g=a.graph - - opnode = g.add_op(op) - opnode.add_input(a.node) - outtensor=None - if isinstance(out,str): - outtensor=Tensor(shape=a.shape, dtype=a.dtype, device=a.device) - outtensor.addtograph(out) - else: - outtensor=out - outtensor.node.add_input(opnode) - if g.eager: - ir=DeepxIR(op, [a.node.name], [outtensor.node.name],author) - send(ir) - return outtensor - -def _A_B_elementwiseop_C( - a:Tensor, - b: Tensor, - op:str=None, - out:Union[Tensor,str]="",author='miaobyte')->Tensor: - g=a.graph - if g is None: - g=b.graph - - A,B=a,b - if a.shape != b.shape: - broadcastshape=broadcast_shape(a.shape,b.shape) - from .leaffunc_changeshape import broadcast_to - if a.shape != broadcastshape: - A=broadcast_to(a,broadcastshape) - if b.shape != broadcastshape: - B= broadcast_to(b,broadcastshape) - - opnode = g.add_op(op) - opnode.add_input(A.node) - opnode.add_input(B.node) - outtensor=None - if isinstance(out,str): - outtensor=Tensor(shape=A.shape, dtype=A.dtype, device=A.device) - outtensor.addtograph(out) - else: - outtensor=out - outtensor.node.add_input(opnode) - if g.eager: - ir=DeepxIR(op, [A.node.name, B.node.name], [outtensor.node.name],author) - send(ir) - return outtensor -def _A_b_elementwiseop_C( - a:Tensor, - b: Union[ float, int] , - op:str=None, - out:Union[Tensor,str]="",author='miaobyte')->Tensor: - g=a.graph - opnode = g.add_op(op) - opnode.add_input(a.node) - opnode.add_input(g.add_var("",b)) - - outtensor=None - if isinstance(out,str): - outtensor=Tensor(shape=a.shape, dtype=a.dtype, device=a.device) - outtensor.addtograph(out) - else: - outtensor=out - outtensor.node.add_input(opnode) - if g.eager: - ir=DeepxIR(op, [a.node.name,b], [outtensor.node.name],author) - send(ir) - return outtensor -def _a_B_elementwiseop_C( - a: Union[ float, int] , - b: Tensor, - op:str=None, - out:Union[Tensor,str]="",author='miaobyte')->Tensor: - g=b.graph - opnode = g.add_op(op) - opnode.add_input(g.add_var("",a)) - opnode.add_input(b.node) - - outtensor=None - if isinstance(out,str): - outtensor=Tensor(shape=b.shape, dtype=b.dtype, device=b.device) - outtensor.addtograph(out) - else: - outtensor=out - outtensor.node.add_input(opnode) - if g.eager: - ir=DeepxIR(op, [a,b.node.name], [outtensor.node.name],author) - send(ir) - return outtensor - -#add - -class Add(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - return _A_B_elementwiseop_C(a, b, "add", out,author) - - @staticmethod - def backward(ctx:Context,out_grad): - return out_grad, out_grad - -class AddScalar(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - return _A_b_elementwiseop_C(a, b, "addscalar", out,author) - - @staticmethod - def backward(ctx:Context, grad_output): - return grad_output, None -def add( - a:Tensor, - b: Optional[Union[Tensor, float, int]] = None, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - if isinstance(b,Tensor): - return Add.apply(a,b,out,author,requires_grad=requires_grad) - else: - return AddScalar.apply(a,b,out,author,requires_grad=requires_grad) - - -#sub - -class Sub(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - return _A_B_elementwiseop_C(a, b, "sub", out,author) - - @staticmethod - def backward(ctx:Context, grad_output): - return grad_output, -grad_output - -class SubScalar(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - return _A_b_elementwiseop_C(a, b, "subscalar", out,author) - - @staticmethod - def backward(ctx:Context, grad_output): - return grad_output, None -def sub( - a:Tensor, - b: Optional[Union[Tensor, float, int]] = None, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - if isinstance(b,Tensor): - return Sub.apply(a,b,out,author,requires_grad=requires_grad) - else: - return SubScalar.apply(a,b,out,author,requires_grad=requires_grad) - -#mul - -class Mul(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_tensors(a,b) - return _A_B_elementwiseop_C(a, b, "mul", out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - a,b=ctx.get_tensor - return out_grad * b, out_grad * a - -class MulScalar(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_data('b',b) - return _A_b_elementwiseop_C(a, b, "mulscalar", out,author) - @staticmethod - def backward(ctx:Context, out_grad): - b=ctx.get_data('b') - return out_grad * b, None -def mul( - a:Tensor, - b: Optional[Union[Tensor, float, int]] = None, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - if isinstance(b,Tensor): - return Mul.apply(a,b,out,author,requires_grad=requires_grad) - else: - return MulScalar.apply(a,b,out,author,requires_grad=requires_grad) - - -#div - -class Div(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_tensors(a,b) - return _A_B_elementwiseop_C(a, b, "div", out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - a,b=ctx.get_tensor - return out_grad / b, -out_grad * a / b / b - - -class DivScalar(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_data('b',b) - return _A_b_elementwiseop_C(a, b, "divscalar", out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - b=ctx.get_data('b') - return out_grad / b, None - -class RDivScalar(Function): - @staticmethod - def forward(ctx:Context, a,b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_data('b',b) - return _a_B_elementwiseop_C(a, b, "rdivscalar", out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - b=ctx.get_data('b') - return out_grad * b, None -def div( - a: Optional[Union[Tensor, float, int]] = None, - b: Optional[Union[Tensor, float, int]] = None, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - if isinstance(b,Tensor) and isinstance(a,Tensor): - return Div.apply(a,b,out,author,requires_grad=requires_grad) - else: - if isinstance(a,Tensor): - #C=A/b - return DivScalar.apply(a,b,out,author,requires_grad=requires_grad) - else: - #C=a/B - return RDivScalar.apply(a,b,out,author,requires_grad=requires_grad) - -class Compare(Function): - @staticmethod - def forward(ctx:Context,a,b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_tensors(a,b) - return _A_B_elementwiseop_C(a,b,"compare",out,author) - -class Max(Function): - @staticmethod - def forward(ctx:Context,a,b,out,author='miaobyte'): - if ctx.requires_grad: - mask=_A_B_elementwiseop_C(a,b,"compare",'mask',author) - ctx.save_tensors(mask) - return _A_B_elementwiseop_C(a,b,"max",out,author) - - @staticmethod - def backward(ctx:Context,out_grad): - mask_a=ctx.get_tensor - mask_b=1-mask_a - return out_grad*mask_a, out_grad*mask_b - -class MaxScalar(Function): - @staticmethod - def forward(ctx:Context,a,b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_data('b',b) - return _A_b_elementwiseop_C(a,b,"maxscalar",out,author) - - @staticmethod - def backward(ctx:Context,out_grad): - b=ctx.get_data('b') - return out_grad, out_grad - - -def max( - a:Tensor, - b:Union[int,float,Tensor,]=0, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - if isinstance(b,int) or isinstance(b,float): - return MaxScalar.apply(a,b,out,author,requires_grad) - else: - return Max.apply(a,b,out,author,requires_grad=requires_grad) - - -class Min(Function): - @staticmethod - def forward(ctx:Context,a,b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_tensors(a,b) - return _A_B_elementwiseop_C(a,b,"min",out,author) - - @staticmethod - def backward(ctx:Context,out_grad): - a,b=ctx.get_tensors() - return out_grad, out_grad - -class MinScalar(Function): - @staticmethod - def forward(ctx:Context,a,b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_data('b',b) - return _A_b_elementwiseop_C(a,b,"minscalar",out,author) - - @staticmethod - def backward(ctx:Context,out_grad): - b=ctx.get_data('b') - return out_grad, out_grad - -def min( - a:Tensor, - b:Union[int,float,Tensor,]=0, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - if isinstance(b,int) or isinstance(b,float): - return MinScalar.apply(a,b,out,author,requires_grad=requires_grad) - else: - return Min.apply(a,b,out,author,requires_grad=requires_grad) - -#clamp,TODO - -#sqrt - -class Sqrt(Function): - @staticmethod - def forward(ctx:Context, a,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_tensors(a) - return _A_elementwiseop_C(a,"sqrt",out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - a=ctx.get_tensor - return out_grad / (2 * sqrt(a)), None - -def sqrt( - input:Tensor, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - return Sqrt.apply(input,out,author,requires_grad=requires_grad) - - -class Pow(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_tensors(a,b) - return _A_B_elementwiseop_C(a, b, "pow", out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - a,b=ctx.get_tensor - return out_grad * b * pow(a,b-1), out_grad * pow(a,b) * log(a) - -class PowScalar(Function): - @staticmethod - def forward(ctx:Context, a, b,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_data('b',b) - return _A_b_elementwiseop_C(a, b, "powscalar", out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - b=ctx.get_data('b') - return out_grad * b * pow(a,b-1), out_grad * pow(a,b) * log(a) - -def pow( - a:Tensor, - b:Union[int,float,Tensor,]=0, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - if isinstance(b,int) or isinstance(b,float): - return PowScalar.apply(a,b,out,author,requires_grad=requires_grad) - else: - return Pow.apply(a,b,out,author,requires_grad=requires_grad) - -#exp - -class Exp(Function): - @staticmethod - def forward(ctx:Context, a,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_tensors(a) - return _A_elementwiseop_C(a,"exp",out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - a=ctx.get_tensor - return out_grad * exp(a), None - -def exp( - a:Tensor, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - return Exp.apply(a,out,author,requires_grad=requires_grad) -#log - -class Log(Function): - @staticmethod - def forward(ctx:Context, a,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_tensors(a) - return _A_elementwiseop_C(a,"log",out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - a=ctx.get_tensor - return out_grad / a, None - -def log( - a:Tensor, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - return Log.apply(a,out,author,requires_grad=requires_grad) - -class Rsqrt(Function): - @staticmethod - def forward(ctx:Context, a,out,author='miaobyte'): - if ctx.requires_grad: - ctx.save_tensors(a) - return _A_elementwiseop_C(a,"rsqrt",out,author) - - @staticmethod - def backward(ctx:Context, out_grad): - a=ctx.get_tensor - return -out_grad / (2 * a * sqrt(a)), None - -def rsqrt( - input:Tensor, - out:Union[Tensor,str]='', - requires_grad:bool=False, - author='miaobyte')->Tensor: - return Rsqrt.apply(input,out,author,requires_grad=requires_grad) - - \ No newline at end of file diff --git a/front/py/deepx/nn/functional/leaffunc_changeshape.py b/front/py/deepx/nn/functional/leaffunc_changeshape.py index c59a58ae..6c3ab092 100644 --- a/front/py/deepx/nn/functional/leaffunc_changeshape.py +++ b/front/py/deepx/nn/functional/leaffunc_changeshape.py @@ -3,22 +3,24 @@ from deepx.nn.deepxir import DeepxIR from deepx.scheduler import send from deepx.autograd import Function,Context - - + +from .leaffunc_new import newtensor + class Reshape(Function): @staticmethod - def forward(ctx:Context,t:Tensor,shape:list[int],out,author='miaobyte'): + def forward(ctx:Context,t:Tensor,shape:list[int],out:Union[Tensor,str],authormap:dict): if ctx.requires_grad: ctx.save_data('oldshape',t.shape) ctx.save_tensors('t',t) + ctx.set_authormap(authormap) outtensor=out if isinstance(out,str): outshape=shape - outtensor=Tensor(shape=outshape, dtype=t.dtype, device=t.device) + outtensor=newtensor(outshape,dtype=t.dtype,name=out) if outtensor.shape!=shape: raise ValueError(f"reshape失败:{t.shape} 无法reshape为 {shape} ") from .rtf_changeshape import rtf_reshape - rtf_reshape(t,shape,outtensor,author) + rtf_reshape(t,shape,outtensor,ctx.authormap['reshape']) return outtensor @staticmethod @@ -26,13 +28,11 @@ def backward(ctx:Context,t_grad:Tensor,out_grad:Tensor): oldshape=ctx.get_data('oldshape') t=ctx.get_tensor('t') from .rtf_changeshape import rtf_reshape - rtf_reshape(out_grad,oldshape,t_grad.node.name) + rtf_reshape(out_grad,oldshape,t_grad,ctx.authormap['reshape']) return t_grad -def reshape(t:Tensor,shape:list[int],out:Union[Tensor,str]='',author='miaobyte',requires_grad:bool=False)->Tensor: - if t.shape==shape: - return t - return Reshape.apply(t,shape,out,author,requires_grad=requires_grad) +def reshape(t:Tensor,shape:list[int],out:Union[Tensor,str]='',requires_grad:bool=False,author='miaobyte')->Tensor: + return Reshape.apply(t,shape,out,{'reshape':author},requires_grad=requires_grad) class Permute(Function): @@ -41,23 +41,29 @@ def forward(ctx:Context, t:Tensor, dimorder:list[int], out:Union[Tensor,str]='', - author='miaobyte')->Tensor: + authormap:dict={'transpose':'miaobyte'})->Tensor: if ctx.requires_grad: ctx.save_data('dimorder',dimorder) + ctx.set_authormap(authormap) outtensor=out if isinstance(out,str): outshape = [t.shape[dim] for dim in dimorder] - outtensor=Tensor(shape=outshape, dtype=t.dtype, device=t.device) - outtensor.addtograph(out) - return _A_v_elementwiseop_C(t,dimorder,"transpose",outtensor,author) + outtensor=newtensor(outshape,dtype=t.dtype,name=out) + + from .rtf_changeshape import rtf_transpose + rtf_transpose(t,dimorder,outtensor,ctx.authormap['transpose']) + return outtensor + @staticmethod - def backward(ctx:Context,in_grad,out_grad,author='miaobyte'): + def backward(ctx:Context,in_grad,out_grad): dimorder=ctx.get_data('dimorder') inverse_dimorder = [0] * len(dimorder) for i, j in enumerate(dimorder): inverse_dimorder[j] = i - return _A_v_elementwiseop_C(out_grad,inverse_dimorder,"transpose",in_grad,author) + from .rtf_changeshape import rtf_transpose + rtf_transpose(out_grad,inverse_dimorder,in_grad,ctx.authormap['transpose']) + return in_grad def permute(t:Tensor, dimorder:list[int], @@ -67,12 +73,12 @@ def permute(t:Tensor, if t.dim!=len(dimorder): raise ValueError(f"shape参数不合法,当前输入维度数:{len(dimorder)},张量维度数:{t.dim}") dimorder = [d % t.ndim for d in dimorder] - return Permute.apply(t,dimorder,out,requires_grad=requires_grad) + return Permute.apply(t,dimorder,out,{'transpose':author},requires_grad=requires_grad) def transpose(t:Tensor,out:Union[Tensor,str]='',requires_grad:bool=False,author='miaobyte')->Tensor: dimorder = list(range(t.ndim)) dimorder[-1],dimorder[-2]=dimorder[-2],dimorder[-1] - return Permute.apply(t,dimorder,out,author,requires_grad=requires_grad) + return Permute.apply(t,dimorder,out,{'transpose':author},requires_grad=requires_grad) @@ -82,32 +88,23 @@ def forward(ctx:Context, tensors:list[Tensor], dim:int, out:Union[Tensor,str]='', - author='miaobyte')->Tensor: + authormap:dict={'concat':'miaobyte'})->Tensor: if ctx.requires_grad: ctx.save_data('dim',dim) + ctx.set_authormap(authormap) outtensor=out if isinstance(out,str): outshape=list(tensors[0].shape) outshape[dim]=sum(t.shape[dim] for t in tensors) - outtensor=Tensor(shape=outshape, dtype=tensors[0].dtype, device=tensors[0].device) - outtensor.addtograph(out) - - g=tensors[0].graph - opnode = g.add_op("concat") - for t in tensors: - opnode.add_input(t.node) - opnode.add_input(g.add_var("",dim)) - - outtensor.node.add_input(opnode) - if g.eager: - ir=DeepxIR("concat", [[t.node.name for t in tensors], dim], [outtensor.node.name],author) - send(ir) + outtensor=newtensor(outshape,dtype=tensors[0].dtype,name=out) + from .rtf_changeshape import rtf_concat + rtf_concat(tensors,dim,outtensor,ctx.authormap['concat']) return outtensor @staticmethod - def backward(ctx:Context,out_grad,author='miaobyte'): + def backward(ctx:Context,out_grad): dim=ctx.get_data('dim') - return _A_v_elementwiseop_C(out_grad,dim,"concat",t.node.name,author) + #todo: 反向传播 def concat(t:Tensor,dim:int,out:Union[Tensor,str]='',requires_grad:bool=False,author='miaobyte')->Tensor: return Concat.apply(t,dim,out,author,requires_grad=requires_grad) @@ -148,7 +145,8 @@ class BroadcastTo(Function): def forward(ctx:Context, t:Tensor, new_shape:tuple[int], - out:Union[Tensor,str]='',author='miaobyte')->Tensor: + out:Union[Tensor,str]='', + authormap:dict={'broadcastTo':'miaobyte'})->Tensor: bshape=broadcast_shape(t.shape,new_shape) if bshape!=new_shape: raise ValueError(f"广播失败:{t.shape} 无法广播为 {new_shape} ") @@ -158,15 +156,16 @@ def forward(ctx:Context, outtensor=out if isinstance(out,str): outshape=new_shape - outtensor=Tensor(shape=outshape, dtype=t.dtype, device=t.device) - outtensor.addtograph(out) - return _A_v_elementwiseop_C(t,new_shape,"broadcastTo",outtensor,author) + outtensor=newtensor(outshape,dtype=t.dtype,name=out) + from .rtf_changeshape import rtf_broadcastTo + rtf_broadcastTo(t,new_shape,outtensor,ctx.authormap['broadcastTo']) + return outtensor #todo: 反向传播 @staticmethod - def backward(ctx:Context,out_grad,author='miaobyte'): + def backward(ctx:Context,out_grad): new_shape=ctx.get_data('new_shape') - return _A_v_elementwiseop_C(out_grad,new_shape,"broadcastTo",t.node.name,author) + #todo: 反向传播 def broadcast_to(t:Tensor,new_shape:tuple[int],out:Union[Tensor,str]='',requires_grad:bool=False,author='miaobyte')->Tensor: return BroadcastTo.apply(t,new_shape,out,author,requires_grad=requires_grad) diff --git a/front/py/deepx/nn/functional/leaffunc_elementwise.py b/front/py/deepx/nn/functional/leaffunc_elementwise.py new file mode 100644 index 00000000..b2cc260d --- /dev/null +++ b/front/py/deepx/nn/functional/leaffunc_elementwise.py @@ -0,0 +1,432 @@ +from typing import Optional, Union +from deepx import Tensor +from deepx.autograd import Function,Context + +from .leaffunc_new import newtensor + + +class Add(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:Tensor,out:Union[Tensor,str],authormap:dict={'add':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_add + rtf_add(a,b,outtensor,ctx.authormap['add']) + return outtensor + @staticmethod + def backward(ctx:Context,out_grad): + return out_grad, out_grad + +class AddScalar(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:float,out:Union[Tensor,str],authormap:dict={'addscalar':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_addscalar + rtf_addscalar(a,b,outtensor,ctx.authormap['addscalar']) + return outtensor + + @staticmethod + def backward(ctx:Context, grad_output): + return grad_output, None +def add( + a:Tensor, + b: Optional[Union[Tensor, float, int]] = None, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + if isinstance(b,Tensor): + return Add.apply(a,b,out,{'add':author},requires_grad=requires_grad) + else: + return AddScalar.apply(a,b,out,{'addscalar':author},requires_grad=requires_grad) + + +#sub + +class Sub(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:Tensor,out:Union[Tensor,str],authormap:dict={'sub':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_sub + rtf_sub(a,b,outtensor,ctx.authormap['sub']) + return outtensor + + @staticmethod + def backward(ctx:Context, grad_output): + return grad_output, -grad_output + +class SubScalar(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:float,out:Union[Tensor,str],authormap:dict={'subscalar':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_subscalar + rtf_subscalar(a,b,outtensor,ctx.authormap['subscalar']) + return outtensor + + @staticmethod + def backward(ctx:Context, grad_output): + return grad_output, None +def sub( + a:Tensor, + b: Optional[Union[Tensor, float, int]] = None, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + if isinstance(b,Tensor): + return Sub.apply(a,b,out,{'sub':author},requires_grad=requires_grad) + else: + return SubScalar.apply(a,b,out,{'subscalar':author},requires_grad=requires_grad) + +#mul + +class Mul(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:Tensor,out:Union[Tensor,str],authormap:dict={'mul':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_mul + rtf_mul(a,b,outtensor,ctx.authormap['mul']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + a,b=ctx.get_tensor + return out_grad * b, out_grad * a + +class MulScalar(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:float,out:Union[Tensor,str],authormap:dict={'mulscalar':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_mulscalar + rtf_mulscalar(a,b,outtensor,ctx.authormap['mulscalar']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + b=ctx.get_data('b') + return out_grad * b, None +def mul( + a:Tensor, + b: Optional[Union[Tensor, float, int]] = None, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + if isinstance(b,Tensor): + return Mul.apply(a,b,out,{'mul':author},requires_grad=requires_grad) + else: + return MulScalar.apply(a,b,out,{'mulscalar':author},requires_grad=requires_grad) + + +#div + +class Div(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:Tensor,out:Union[Tensor,str],authormap:dict={'div':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_div + rtf_div(a,b,outtensor,ctx.authormap['div']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + a,b=ctx.get_tensor + return out_grad / b, -out_grad * a / b / b + +class DivScalar(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:float,out:Union[Tensor,str],authormap:dict={'divscalar':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_divscalar + rtf_divscalar(a,b,outtensor,ctx.authormap['divscalar']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + b=ctx.get_data('b') + return out_grad / b, None + +class RDivScalar(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:float,out:Union[Tensor,str],authormap:dict={'rdivscalar':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_rdivscalar + rtf_rdivscalar(a,b,outtensor,ctx.authormap['rdivscalar']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + b=ctx.get_data('b') + return out_grad * b, None +def div( + a: Optional[Union[Tensor, float, int]] = None, + b: Optional[Union[Tensor, float, int]] = None, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + if isinstance(b,Tensor) and isinstance(a,Tensor): + return Div.apply(a,b,out,{'div':author},requires_grad=requires_grad) + else: + if isinstance(a,Tensor): + #C=A/b + return DivScalar.apply(a,b,out,{'divscalar':author},requires_grad=requires_grad) + else: + #C=a/B + return RDivScalar.apply(a,b,out,{'rdivscalar':author},requires_grad=requires_grad) + + + +class Max(Function): + @staticmethod + def forward(ctx:Context,a:Tensor, b:Tensor,out:Union[Tensor,str],authormap:dict={'max':'miaobyte'})->Tensor : + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_max + rtf_max(a,b,outtensor,ctx.authormap['max']) + return outtensor + + @staticmethod + def backward(ctx:Context,out_grad): + mask_a=ctx.get_tensor + mask_b=1-mask_a + return out_grad*mask_a, out_grad*mask_b + +class MaxScalar(Function): + @staticmethod + def forward(ctx:Context,a:Tensor, b:float,out:Union[Tensor,str],authormap:dict={'maxscalar':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_maxscalar + rtf_maxscalar(a,b,outtensor,ctx.authormap['maxscalar']) + return outtensor + + @staticmethod + def backward(ctx:Context,out_grad): + b=ctx.get_data('b') + return out_grad, out_grad + + +def max( + a:Tensor, + b:Union[int,float,Tensor,]=0, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + if isinstance(b,int) or isinstance(b,float): + return MaxScalar.apply(a,b,out,{'maxscalar':author},requires_grad=requires_grad) + else: + return Max.apply(a,b,out,{'max':author},requires_grad=requires_grad) + + +class Min(Function): + @staticmethod + def forward(ctx:Context,a:Tensor, b:Tensor,out:Union[Tensor,str],authormap:dict={'min':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_min + rtf_min(a,b,outtensor,ctx.authormap['min']) + return outtensor + + @staticmethod + def backward(ctx:Context,out_grad): + a,b=ctx.get_tensor + return out_grad, out_grad + +class MinScalar(Function): + @staticmethod + def forward(ctx:Context,a:Tensor, b:float,out:Union[Tensor,str],authormap:dict={'minscalar':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_minscalar + rtf_minscalar(a,b,outtensor,ctx.authormap['minscalar']) + return outtensor + + @staticmethod + def backward(ctx:Context,out_grad): + b=ctx.get_data('b') + return out_grad, out_grad + +def min( + a:Tensor, + b:Union[int,float,Tensor,]=0, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + if isinstance(b,int) or isinstance(b,float): + return MinScalar.apply(a,b,out,{'minscalar':author},requires_grad=requires_grad) + else: + return Min.apply(a,b,out,{'min':author},requires_grad=requires_grad) + +#sqrt + +class Sqrt(Function): + @staticmethod + def forward(ctx:Context, a:Tensor,out:Union[Tensor,str],authormap:dict={'sqrt':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_sqrt + rtf_sqrt(a,outtensor,ctx.authormap['sqrt']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + a=ctx.get_tensor + return out_grad / (2 * sqrt(a)), None + +def sqrt( + input:Tensor, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + return Sqrt.apply(input,out,{'sqrt':author},requires_grad=requires_grad) + + +class Pow(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:Tensor,out:Union[Tensor,str],authormap:dict={'pow':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_pow + rtf_pow(a,b,outtensor,ctx.authormap['pow']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + a,b=ctx.get_tensor + return out_grad * b * pow(a,b-1), out_grad * pow(a,b) * log(a) + +class PowScalar(Function): + @staticmethod + def forward(ctx:Context, a:Tensor, b:float,out:Union[Tensor,str],authormap:dict={'powscalar':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_powscalar + rtf_powscalar(a,b,outtensor,ctx.authormap['powscalar']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + b=ctx.get_data('b') + return out_grad * b * pow(a,b-1), out_grad * pow(a,b) * log(a) + +def pow( + a:Tensor, + b:Union[int,float,Tensor,]=0, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + if isinstance(b,int) or isinstance(b,float): + return PowScalar.apply(a,b,out,{'powscalar':author},requires_grad=requires_grad) + else: + return Pow.apply(a,b,out,{'pow':author},requires_grad=requires_grad) + +#exp + +class Exp(Function): + @staticmethod + def forward(ctx:Context, a:Tensor,out:Union[Tensor,str],authormap:dict={'exp':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_exp + rtf_exp(a,outtensor,ctx.authormap['exp']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + a=ctx.get_tensor + return out_grad * exp(a), None + +def exp( + a:Tensor, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + return Exp.apply(a,out,{'exp':author},requires_grad=requires_grad) +#log + +class Log(Function): + @staticmethod + def forward(ctx:Context, a:Tensor,out:Union[Tensor,str],authormap:dict={'log':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_log + rtf_log(a,outtensor,ctx.authormap['log']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + a=ctx.get_tensor + return out_grad / a, None + +def log( + a:Tensor, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + return Log.apply(a,out,{'log':author},requires_grad=requires_grad) + +class Rsqrt(Function): + @staticmethod + def forward(ctx:Context, a:Tensor,out:Union[Tensor,str],authormap:dict={'rsqrt':'miaobyte'})->Tensor: + ctx.set_authormap(authormap) + outtensor=out + if isinstance(out,str): + outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + from .rtf_elementwise import rtf_rsqrt + rtf_rsqrt(a,outtensor,ctx.authormap['rsqrt']) + return outtensor + + @staticmethod + def backward(ctx:Context, out_grad): + a=ctx.get_tensor + return -out_grad / (2 * a * sqrt(a)), None + +def rsqrt( + input:Tensor, + out:Union[Tensor,str]=None, + requires_grad:bool=False, + author='miaobyte')->Tensor: + return Rsqrt.apply(input,out,{'rsqrt':author},requires_grad=requires_grad) + + \ No newline at end of file diff --git a/front/py/deepx/nn/functional/leaffunc_init.py b/front/py/deepx/nn/functional/leaffunc_init.py index ef73653b..eb3d7792 100644 --- a/front/py/deepx/nn/functional/leaffunc_init.py +++ b/front/py/deepx/nn/functional/leaffunc_init.py @@ -1,6 +1,6 @@ from typing import Union import math -from .leaffunc_new import newtensor +from .leaffunc_new import newtensor,parse_shape from .rtf_init import * from deepx import Tensor @@ -9,50 +9,45 @@ # inplace操作的函数,其名为_后缀, 返回值为空 # 非inplace操作的函数,其名为_后缀, 返回值为Tensor -def parse_shape(shape:Union[tuple,list])->tuple: - if len(shape) == 1 and isinstance(shape[0], (tuple, list)): - shape = shape[0] - return shape - def constant_(t:Tensor, value: Union[float,int], author='miaobyte')->Tensor: rtf_constant(t,value,author) -def constant(*shape, value:Union[float,int], dtype:str='float32')->Tensor: - s=parse_shape(shape) - outtensor=Tensor(shape=s, dtype=dtype) - newtensor(outtensor) +def constant(*shape, value:Union[float,int], dtype:str='float32',name:str)->Tensor: + s = parse_shape(shape) + outtensor=newtensor(s,dtype=dtype,name=name) constant_(outtensor, value) return outtensor -def full(*shape, value:Union[float,int], dtype:str='float32')->Tensor: - return constant(*shape, value=value, dtype=dtype) +def full(*shape, value:Union[float,int], dtype:str='float32',name:str=None)->Tensor: + s = parse_shape(shape) + return constant(s, value=value, dtype=dtype,name=name) -def zeros(*shape, dtype:str='float32')->Tensor: - return constant(*shape, value=0, dtype=dtype) +def zeros(*shape, dtype:str='float32',name:str=None)->Tensor: + s = parse_shape(shape) + return constant(s, value=0, dtype=dtype,name=name) -def ones(*size, dtype:str='float32')->Tensor: - return constant(*size, value=1, dtype=dtype) +def ones(*shape, dtype:str='float32',name:str=None)->Tensor: + s = parse_shape(shape) + return constant(s, value=1, dtype=dtype,name=name) def arange_(t:Tensor,start=0,step=1,author='miaobyte')->Tensor: from .rtf_init import rtf_arange rtf_arange(t,start,step,author) -def arange(*shape,start=0,step=1,dtype:str='float32',author='miaobyte')->Tensor: - s=parse_shape(shape) - outtensor=Tensor(shape=s, dtype=dtype) - newtensor(outtensor) +def arange(*shape,start=0,step=1,dtype:str='float32',name:str=None,author='miaobyte')->Tensor: + s = parse_shape(shape) + outtensor=newtensor(s,dtype=dtype,name=name) arange_(outtensor,start,step,author) return outtensor def uniform_(t:Tensor,low=0, high=1,seed:int=0,author='miaobyte')->Tensor: from .rtf_init import rtf_uniform rtf_uniform(t,low,high,seed,author) -def uniform(*shape,low=0, high=1,seed:int=0,dtype:str='float32',author='miaobyte')->Tensor: - s=parse_shape(shape) - outtensor=Tensor(shape=s, dtype=dtype) - newtensor(outtensor) +def uniform(*shape,low=0, high=1,seed:int=0,dtype:str='float32',name:str=None,author='miaobyte')->Tensor: + s = parse_shape(shape) + outtensor=newtensor(s,dtype=dtype,name=name) uniform_(outtensor,low,high,seed,author) return outtensor @@ -184,10 +179,8 @@ def kaiming_uniform_( bound = math.sqrt(3.0) * std # Calculate uniform bounds from standard deviation return uniform_(tensor,-bound, bound) -def kaiming_uniform(*shape,a:float=0,mode:str='fan_in',nonlinearity:str='leaky_relu',dtype:str='float32',author='miaobyte')->Tensor: - s=parse_shape(shape) - outtensor=Tensor(shape=s, dtype=dtype) - newtensor(outtensor) +def kaiming_uniform(*shape,a:float=0,mode:str='fan_in',nonlinearity:str='leaky_relu',dtype:str='float32',name:str=None,author='miaobyte')->Tensor: + outtensor=newtensor(shape,dtype=dtype,name=name) kaiming_uniform_(outtensor,a,mode,nonlinearity) return outtensor diff --git a/front/py/deepx/nn/functional/leaffunc_new.py b/front/py/deepx/nn/functional/leaffunc_new.py index 1399f7fb..8b05a5c0 100644 --- a/front/py/deepx/nn/functional/leaffunc_new.py +++ b/front/py/deepx/nn/functional/leaffunc_new.py @@ -1,8 +1,18 @@ from deepx.tensor import Tensor +from typing import Union -def newtensor(t:Tensor,name:str=None): +def parse_shape(shape:Union[tuple,list])->tuple[int, ...]: + if len(shape) == 1 and isinstance(shape[0], (tuple, list)): + shape = shape[0] + return tuple(int(dim) for dim in shape) + +def newtensor(*shape,dtype:str='float32',name:str=None): + s=parse_shape(shape) + t=Tensor(shape=s,dtype=dtype) from .rtf_new import rtf_newtensor rtf_newtensor(t,name) + return t + def copytensor(t:Tensor,out:Tensor): from .rtf_new import rtf_copytensor rtf_copytensor(t,out) diff --git a/front/py/deepx/nn/functional/rtf_elementwise.py b/front/py/deepx/nn/functional/rtf_elementwise.py index ea1a625d..67654602 100644 --- a/front/py/deepx/nn/functional/rtf_elementwise.py +++ b/front/py/deepx/nn/functional/rtf_elementwise.py @@ -8,36 +8,36 @@ def rtf_add(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: A_B_op_C("add",a,b,out,author) return out -def rtf_add_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - A_scalar_op_C("add",a,b,out,author) +def rtf_addscalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("addscalar",a,b,out,author) return out def rtf_sub(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: A_B_op_C("sub",a,b,out,author) return out -def rtf_sub_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - A_scalar_op_C("sub",a,b,out,author) +def rtf_subscalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("subscalar",a,b,out,author) return out def rtf_mul(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: A_B_op_C("mul",a,b,out,author) return out -def rtf_mul_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - A_scalar_op_C("mul",a,b,out,author) +def rtf_mulscalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("mulscalar",a,b,out,author) return out def rtf_div(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: A_B_op_C("div",a,b,out,author) return out -def rtf_div_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - A_scalar_op_C("div",a,b,out,author) +def rtf_divscalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("divscalar",a,b,out,author) return out -def rtf_rdiv_scalar(a:float, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - A_scalar_op_C("rdiv",a,b,out,author) +def rtf_rdivscalar(a:float, b:Tensor, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("rdivscalar",a,b,out,author) return out @@ -50,8 +50,8 @@ def rtf_pow(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: A_B_op_C("pow",a,b,out,author) return out -def rtf_pow_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - A_scalar_op_C("pow",a,b,out,author) +def rtf_powscalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("powscalar",a,b,out,author) return out def rtf_exp(a:Tensor, out:Tensor, author='miaobyte')->Tensor: @@ -86,14 +86,14 @@ def rtf_max(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: A_B_op_C("max",a,b,out,author) return out -def rtf_max_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - A_scalar_op_C("max",a,b,out,author) +def rtf_maxscalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("maxscalar",a,b,out,author) return out def rtf_min(a:Tensor, b:Tensor, out:Tensor, author='miaobyte')->Tensor: A_B_op_C("min",a,b,out,author) return out -def rtf_min_scalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: - A_scalar_op_C("min",a,b,out,author) +def rtf_minscalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: + A_scalar_op_C("minscalar",a,b,out,author) return out \ No newline at end of file diff --git a/front/py/deepx/nn/functional/rtf_new.py b/front/py/deepx/nn/functional/rtf_new.py index 915bb307..cb372cd3 100644 --- a/front/py/deepx/nn/functional/rtf_new.py +++ b/front/py/deepx/nn/functional/rtf_new.py @@ -4,7 +4,7 @@ def rtf_newtensor(t:Tensor,name:str=None): args=[Param.vector(t.shape,'int32')] - if name is not None: + if name is not None and name != '': returns=[Param.tensorName(name,t.dtype)] else: returns=[Param.tensor(t)] diff --git a/front/py/deepx/tensor/__init__.py b/front/py/deepx/tensor/__init__.py index 37d41996..70f2f16f 100644 --- a/front/py/deepx/tensor/__init__.py +++ b/front/py/deepx/tensor/__init__.py @@ -1,6 +1,5 @@ from .tensor import Tensor,tensor_method from .shape import Shape -from .devicetype import Device,DeviceType from .elementwise import * # 导入所有包含@tensor_method装饰的方法 from .matmul import * # 导入矩阵乘法相关方法 from .changeshape import * # 导入转置方法 @@ -8,7 +7,6 @@ from .reduce import * __all__ = [ - 'Device','DeviceType', 'Shape', 'Tensor', 'tensor_method', diff --git a/front/py/deepx/tensor/devicetype.py b/front/py/deepx/tensor/devicetype.py deleted file mode 100644 index 71fc755c..00000000 --- a/front/py/deepx/tensor/devicetype.py +++ /dev/null @@ -1,28 +0,0 @@ -from enum import Enum - -class DeviceType(Enum): - CPU = 'cpu' - CUDA = 'cuda' -class Device: - def __init__(self, type: DeviceType, device_index=0): - self.type = type - self.device_index = device_index # 仅对CUDA有效 - - @classmethod - def from_string(cls, device_str): - """解析字符串格式:'cuda:0' 或 'cpu'""" - if ':' in device_str: - type_str, index_str = device_str.split(':') - return cls(DeviceType(type_str), int(index_str)) - return cls(DeviceType(device_str)) - - def __eq__(self, other): - return self.type == other.type and self.device_index == other.device_index - - def __repr__(self): - if self.type == DeviceType.CPU: - return 'Device(type=cpu)' - return f'Device(type={self.type.value}, index={self.device_index})' - -Device.CPU = Device(DeviceType.CPU) -Device.CUDA = Device(DeviceType.CUDA) \ No newline at end of file diff --git a/front/py/deepx/tensor/tensor.py b/front/py/deepx/tensor/tensor.py index 2c44181e..72337a44 100644 --- a/front/py/deepx/tensor/tensor.py +++ b/front/py/deepx/tensor/tensor.py @@ -1,6 +1,5 @@ from typing import Optional from .shape import Shape -from .devicetype import Device from .dtype import infer_dtype,default_dtype class Tensor: @@ -8,10 +7,9 @@ class Tensor: #生命周期 def __init__( self, - data=None, shape=None, - device=None, dtype:Optional[str]=None, + data=None, ): # data if data is not None: @@ -45,14 +43,7 @@ def __init__( self._shape = shape else: raise ValueError("Invalid shape") - - # device - if isinstance(device, str): - self._device = Device.from_string(device) - elif isinstance(device, Device): - self._device = device - else: - self._device = Device.CPU # 默认设备 + self._graph = None self._node = None @@ -103,15 +94,12 @@ def numel(self)->int: return self._shape.numel() if self._shape else None - #dtype device + #dtype @property def dtype(self): return self._dtype - @property - def device(self): - return self._device - + # 计算图 def addtograph(self,name:str)->'Tensor': diff --git a/front/py/examples/1_tensor/1_new.py b/front/py/examples/1_tensor/1_new.py index 04253283..6800e9dd 100644 --- a/front/py/examples/1_tensor/1_new.py +++ b/front/py/examples/1_tensor/1_new.py @@ -13,16 +13,16 @@ def printall(t): print("t.numel=",t.numel()) print("t.dtype=", t.dtype) def newtensorwithshape(shape): - t = Tensor(shape=[2,3,4]) + from deepx.nn.functional import newtensor - newtensor(t) + t=newtensor( 2,3,4 ) printall (t) def newtensorwithdata(): - t = Tensor([1,2,3]) + from deepx.nn.functional import newtensor - newtensor(t) + t=newtensor(1,2,3) printall(t) if __name__ == "__main__": diff --git a/front/py/examples/2_ir/2_elementwise_add.py b/front/py/examples/2_ir/2_elementwise_add.py index f68f4edd..e16ceef8 100644 --- a/front/py/examples/2_ir/2_elementwise_add.py +++ b/front/py/examples/2_ir/2_elementwise_add.py @@ -2,7 +2,7 @@ import torch torch_t1 = torch.full((2,3,4, ), 10, dtype=torch.float32) -torch_t2 = torch.full((2,3,4, ), 10, dtype=torch.float32) +torch_t2 = torch.full((2,3,4, ), 5, dtype=torch.float32) torch_t3 = torch_t1 + torch_t2 torch_t3.add_(0.5) print() @@ -15,12 +15,8 @@ print() -t1 = full(2,3,4, value=10,dtype="float32",name="t1") -t2 = full(2,3,4, value=10,dtype="float32",name="t2") -t3 = t1.add(t2,"t3") +t1 = full(2,3,4, value=10,dtype="float32") +t2 = full(2,3,4, value=5,dtype="float32") +t3 = t1+t2 t3.add_(0.5) print(t3) - -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] -str=t3.graph.to_dot() -str.render(script_name+".dot", format='svg') From 46f131489e210fd9e3b886db0d4cbf086ccb395e Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Wed, 16 Apr 2025 12:33:53 +0800 Subject: [PATCH 07/12] =?UTF-8?q?excuter&front:tensor.name=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- front/py/examples/1_tensor/1_print.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 front/py/examples/1_tensor/1_print.py diff --git a/front/py/examples/1_tensor/1_print.py b/front/py/examples/1_tensor/1_print.py new file mode 100644 index 00000000..c2475364 --- /dev/null +++ b/front/py/examples/1_tensor/1_print.py @@ -0,0 +1,24 @@ +import sys +sys.path.append('/home/lipeng/code/git.array2d.com/ai/deepx/front/py') # 将项目根目录添加到Python路径 + +from deepx.tensor import Tensor +def printall(t): + print("t=",t) + print("t.name",t.name) + print("t.shape=",t.shape) + print("t.shape[0]=",t.shape[0]) + print("t.stride=",t.stride) + print("t.stride[0]=",t.stride[0]) + print("t.dim=",t.dim()) + print("t.ndimension=",t.ndimension) + print("t.numel=",t.numel()) + print("t.dtype=", t.dtype) + +def newtensor(): + + from deepx.nn.functional import newtensor + t=newtensor(1,2,3) + printall(t) + +if __name__ == "__main__": + newtensor() From a038b0fe3838e77f4c4c8c3ecfa09182fb3a392e Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Wed, 16 Apr 2025 12:33:58 +0800 Subject: [PATCH 08/12] =?UTF-8?q?excuter&front:tensor.name=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excuter/op-mem-ompsimd/src/client/main.cpp | 1 + .../src/deepx/tf/elementwise.hpp | 22 +++++- front/py/deepx/nn/deepxir.py | 9 ++- front/py/deepx/nn/functional/leaffunc_new.py | 4 +- front/py/deepx/nn/functional/rtf_new.py | 7 +- front/py/deepx/tensor/dtype.py | 50 ------------ front/py/deepx/tensor/tensor.py | 77 ++++++++----------- front/py/examples/1_tensor/1_new.py | 20 +---- front/py/examples/1_tensor/1_print.py | 15 +--- front/py/examples/2_ir/2_elementwise_add.py | 4 +- 10 files changed, 69 insertions(+), 140 deletions(-) delete mode 100644 front/py/deepx/tensor/dtype.py diff --git a/excuter/op-mem-ompsimd/src/client/main.cpp b/excuter/op-mem-ompsimd/src/client/main.cpp index bba6b426..7f0378d9 100644 --- a/excuter/op-mem-ompsimd/src/client/main.cpp +++ b/excuter/op-mem-ompsimd/src/client/main.cpp @@ -79,6 +79,7 @@ int main() { opresp.error(opresp.message); server.resp(opresp.to_string()); + cerr< mem, string &error) override { - if (checktensors({this->args[0].textvalue, this->args[1].textvalue, this->returns[0].textvalue}, mem, error)!=0) + if (!checktensors({this->args[0].textvalue, this->args[1].textvalue, this->returns[0].textvalue}, mem, error)!=0) { return 1; } @@ -93,7 +93,7 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { - if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + if (!checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) { return 1; } @@ -152,7 +152,7 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { - if (checktensors({this->args[0].textvalue, this->args[1].textvalue, this->returns[0].textvalue}, mem, error)!=0) + if (!checktensors({this->args[0].textvalue, this->args[1].textvalue, this->returns[0].textvalue}, mem, error)!=0) { return 1; } @@ -213,6 +213,10 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { + if (!checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision a_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; Precision c_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; if (a_type != c_type) @@ -269,6 +273,10 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { + if (!checktensors({this->args[0].textvalue, this->args[1].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision a_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; Precision b_type = mem->gettensor(this->args[1].textvalue).get()->shape.dtype; Precision c_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; @@ -326,6 +334,10 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { + if (!checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision a_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; Precision c_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; if (a_type != c_type) @@ -382,6 +394,10 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { + if (!checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } Precision a_type = mem->gettensor(this->args[0].textvalue).get()->shape.dtype; Precision b_type = mem->gettensor(this->args[1].textvalue).get()->shape.dtype; Precision c_type = mem->gettensor(this->returns[0].textvalue).get()->shape.dtype; diff --git a/front/py/deepx/nn/deepxir.py b/front/py/deepx/nn/deepxir.py index 86a0239b..4e52e18c 100644 --- a/front/py/deepx/nn/deepxir.py +++ b/front/py/deepx/nn/deepxir.py @@ -23,9 +23,12 @@ def tensorName(cls,name:str,dtype:str): @classmethod def tensor(cls,t:Tensor): - tid=id(t) - name=f"tensor_{tid}" - return Param(name,category="tensor",precision=t.dtype) + name=None + if t.name is not None: + name=t.name + else: + name=id(t) + return Param(name, category="tensor", precision=t.dtype) @classmethod diff --git a/front/py/deepx/nn/functional/leaffunc_new.py b/front/py/deepx/nn/functional/leaffunc_new.py index 8b05a5c0..af65fcd8 100644 --- a/front/py/deepx/nn/functional/leaffunc_new.py +++ b/front/py/deepx/nn/functional/leaffunc_new.py @@ -8,9 +8,9 @@ def parse_shape(shape:Union[tuple,list])->tuple[int, ...]: def newtensor(*shape,dtype:str='float32',name:str=None): s=parse_shape(shape) - t=Tensor(shape=s,dtype=dtype) + t=Tensor(shape=s,dtype=dtype,name=name) from .rtf_new import rtf_newtensor - rtf_newtensor(t,name) + rtf_newtensor(t) return t def copytensor(t:Tensor,out:Tensor): diff --git a/front/py/deepx/nn/functional/rtf_new.py b/front/py/deepx/nn/functional/rtf_new.py index cb372cd3..a0f8ab75 100644 --- a/front/py/deepx/nn/functional/rtf_new.py +++ b/front/py/deepx/nn/functional/rtf_new.py @@ -2,12 +2,9 @@ from deepx.nn.deepxir import DeepxIR,Param from deepx.scheduler import send -def rtf_newtensor(t:Tensor,name:str=None): +def rtf_newtensor(t:Tensor): args=[Param.vector(t.shape,'int32')] - if name is not None and name != '': - returns=[Param.tensorName(name,t.dtype)] - else: - returns=[Param.tensor(t)] + returns=[Param.tensor(t)] ir=DeepxIR("newtensor", args, returns,'') send(ir) diff --git a/front/py/deepx/tensor/dtype.py b/front/py/deepx/tensor/dtype.py deleted file mode 100644 index 416738ff..00000000 --- a/front/py/deepx/tensor/dtype.py +++ /dev/null @@ -1,50 +0,0 @@ -import numpy as np -from typing import Any - -DTYPE_MAP = { - 'float16': np.float16, - 'float32': np.float32, - 'float64': np.float64, - 'int8': np.int8, - 'int16': np.int16, - 'int32': np.int32, - 'int64': np.int64, -} -default_dtype = 'float32' - -def infer_dtype(data: Any) -> str: - """ - 推断数组元素的深度学习数据类型 - - 支持类型优先级(从高到低): - float32 > float64 > int32 > int64 > bool - - Args: - data: 输入数据,支持Python原生类型、Numpy数组、列表等 - - Returns: - str: 数据类型名称('float32', 'int32'等) - - Raises: - TypeError: 当包含不支持的数据类型时 - """ - # 转换为numpy数组进行类型推断 - arr = np.asarray(data) - - # 根据数值范围自动选择精度 - if np.issubdtype(arr.dtype, np.integer): - if arr.itemsize <= 4: - return 'int32' if arr.min() >= np.iinfo(np.int32).min else 'int64' - return 'int64' - - if np.issubdtype(arr.dtype, np.floating): - return 'float32' if arr.itemsize <= 4 else 'float64' - - # 处理特殊类型(如对象数组) - if arr.dtype == np.object_: - unique_types = {type(x) for x in arr.flat} - if {int, float} == unique_types: - return 'float32' - raise TypeError(f"混合类型或不支持的类型: {unique_types}") - - raise TypeError(f"不支持的数据类型: {arr.dtype}") \ No newline at end of file diff --git a/front/py/deepx/tensor/tensor.py b/front/py/deepx/tensor/tensor.py index 72337a44..c121e4c2 100644 --- a/front/py/deepx/tensor/tensor.py +++ b/front/py/deepx/tensor/tensor.py @@ -1,48 +1,30 @@ -from typing import Optional +import uuid +from typing import Optional,Union from .shape import Shape -from .dtype import infer_dtype,default_dtype + class Tensor: #生命周期 - def __init__( - self, - shape=None, - dtype:Optional[str]=None, - data=None, - ): - # data - if data is not None: - import numpy as np - if not isinstance(data, np.ndarray): - data = np.array(data) - self.data = data - self._shape = Shape(data.shape) - + def __init__(self,shape:Union[tuple[int],list[int],Shape],dtype:str='float32',name:str=None): + # name + + self._name = name + if name =='': + self._name =None # dtype - if dtype is None: - if data is not None: - self._dtype = infer_dtype(data) - else: - self._dtype = default_dtype - else: - self._dtype = str(dtype) + self._dtype = dtype # format - if self._dtype == 'float32' or self._dtype == 'float64' or self._dtype == 'float16' or self._dtype == 'bfloat16': - self._format = '%.4f' - elif self._dtype == 'int32' or self._dtype == 'int64' or self._dtype == 'int8' or self._dtype == 'int16': - self._format = '%d' - else: - self._format = '%s' + self.autoformat() # shape - if shape is not None: - if isinstance(shape, (tuple, list)) and all(isinstance(i, int) for i in shape): - self._shape = Shape(shape) # 这里会将列表/元组转换为Shape对象 - elif isinstance(shape, Shape): - self._shape = shape - else: - raise ValueError("Invalid shape") + + if isinstance(shape, (tuple, list)) and all(isinstance(i, int) for i in shape): + self._shape = Shape(shape) # 这里会将列表/元组转换为Shape对象 + elif isinstance(shape, Shape): + self._shape = shape + else: + raise ValueError("Invalid shape") self._graph = None self._node = None @@ -55,7 +37,12 @@ def __del__(self): deltensor(self) except: pass - + + # name + @property + def name(self): + return self._name + # shape @property def shape(self,dim:int=None): @@ -98,16 +85,8 @@ def numel(self)->int: @property def dtype(self): return self._dtype - - # 计算图 - def addtograph(self,name:str)->'Tensor': - # graph - from deepx.nn.functional import newtensor - newtensor(self,name) - return self - @property def graph(self): return self._graph @@ -142,7 +121,13 @@ def T(self) -> str: return self.transpose(1,0,out=self.node.name+".T") # 打印 - + def autoformat(self): + if self._dtype == 'float32' or self._dtype == 'float64' or self._dtype == 'float16' or self._dtype == 'bfloat16': + self._format = '%.4f' + elif self._dtype == 'int32' or self._dtype == 'int64' or self._dtype == 'int8' or self._dtype == 'int16': + self._format = '%d' + else: + self._format = '%s' def set_format(self,format:str): self._format = format def __repr__(self) -> str: diff --git a/front/py/examples/1_tensor/1_new.py b/front/py/examples/1_tensor/1_new.py index 6800e9dd..c2475364 100644 --- a/front/py/examples/1_tensor/1_new.py +++ b/front/py/examples/1_tensor/1_new.py @@ -4,6 +4,7 @@ from deepx.tensor import Tensor def printall(t): print("t=",t) + print("t.name",t.name) print("t.shape=",t.shape) print("t.shape[0]=",t.shape[0]) print("t.stride=",t.stride) @@ -12,27 +13,12 @@ def printall(t): print("t.ndimension=",t.ndimension) print("t.numel=",t.numel()) print("t.dtype=", t.dtype) -def newtensorwithshape(shape): - from deepx.nn.functional import newtensor - t=newtensor( 2,3,4 ) - printall (t) - - -def newtensorwithdata(): +def newtensor(): from deepx.nn.functional import newtensor t=newtensor(1,2,3) printall(t) if __name__ == "__main__": - args = sys.argv[1:] - caseid = 0 - if len(args) > 0: - caseid = int(args[0]) - if caseid == 0: - newtensorwithshape([1, 2, 3]) - elif caseid == 1: - newtensorwithdata() - elif caseid == 2: - newtensorwithshape([1, 2, 3]) \ No newline at end of file + newtensor() diff --git a/front/py/examples/1_tensor/1_print.py b/front/py/examples/1_tensor/1_print.py index c2475364..1bfebe9c 100644 --- a/front/py/examples/1_tensor/1_print.py +++ b/front/py/examples/1_tensor/1_print.py @@ -2,23 +2,12 @@ sys.path.append('/home/lipeng/code/git.array2d.com/ai/deepx/front/py') # 将项目根目录添加到Python路径 from deepx.tensor import Tensor -def printall(t): - print("t=",t) - print("t.name",t.name) - print("t.shape=",t.shape) - print("t.shape[0]=",t.shape[0]) - print("t.stride=",t.stride) - print("t.stride[0]=",t.stride[0]) - print("t.dim=",t.dim()) - print("t.ndimension=",t.ndimension) - print("t.numel=",t.numel()) - print("t.dtype=", t.dtype) def newtensor(): from deepx.nn.functional import newtensor - t=newtensor(1,2,3) - printall(t) + t=newtensor(1,2,3,name='t') + print(t) if __name__ == "__main__": newtensor() diff --git a/front/py/examples/2_ir/2_elementwise_add.py b/front/py/examples/2_ir/2_elementwise_add.py index e16ceef8..5e4c896b 100644 --- a/front/py/examples/2_ir/2_elementwise_add.py +++ b/front/py/examples/2_ir/2_elementwise_add.py @@ -11,12 +11,14 @@ ############-------DEEPX-------################ from deepx import Tensor,full -import os print() t1 = full(2,3,4, value=10,dtype="float32") +print(t1) t2 = full(2,3,4, value=5,dtype="float32") +print(t2) t3 = t1+t2 +print(t3) t3.add_(0.5) print(t3) From c232dfdd51ca646f7d2d78845c1515e158bcac6a Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Wed, 16 Apr 2025 13:02:06 +0800 Subject: [PATCH 09/12] excuter&front:leaffunc_elementwise --- front/py/deepx/nn/functional/leaffunc_elementwise.py | 4 ++-- front/py/deepx/nn/functional/rtf_elementwise.py | 7 ++++--- front/py/deepx/tensor/elementwise.py | 6 ++---- front/py/examples/2_ir/2_elementwise_operator.py | 5 +---- front/py/examples/2_ir/2_elementwise_sqrtlog.py | 6 +----- 5 files changed, 10 insertions(+), 18 deletions(-) diff --git a/front/py/deepx/nn/functional/leaffunc_elementwise.py b/front/py/deepx/nn/functional/leaffunc_elementwise.py index b2cc260d..75b0f546 100644 --- a/front/py/deepx/nn/functional/leaffunc_elementwise.py +++ b/front/py/deepx/nn/functional/leaffunc_elementwise.py @@ -168,11 +168,11 @@ def backward(ctx:Context, out_grad): class RDivScalar(Function): @staticmethod - def forward(ctx:Context, a:Tensor, b:float,out:Union[Tensor,str],authormap:dict={'rdivscalar':'miaobyte'})->Tensor: + def forward(ctx:Context, a:float,b:Tensor,out:Union[Tensor,str],authormap:dict={'rdivscalar':'miaobyte'})->Tensor: ctx.set_authormap(authormap) outtensor=out if isinstance(out,str): - outtensor=newtensor(a.shape,dtype=a.dtype,name=out) + outtensor=newtensor(b.shape,dtype=b.dtype,name=out) from .rtf_elementwise import rtf_rdivscalar rtf_rdivscalar(a,b,outtensor,ctx.authormap['rdivscalar']) return outtensor diff --git a/front/py/deepx/nn/functional/rtf_elementwise.py b/front/py/deepx/nn/functional/rtf_elementwise.py index 67654602..414c09f6 100644 --- a/front/py/deepx/nn/functional/rtf_elementwise.py +++ b/front/py/deepx/nn/functional/rtf_elementwise.py @@ -37,11 +37,12 @@ def rtf_divscalar(a:Tensor, b:float, out:Tensor, author='miaobyte')->Tensor: return out def rtf_rdivscalar(a:float, b:Tensor, out:Tensor, author='miaobyte')->Tensor: - A_scalar_op_C("rdivscalar",a,b,out,author) + args = [ Param.varnum(a),Param.tensor(b)] + returns = [Param.tensor(out)] + ir = DeepxIR("rdivscalar", args, returns, author) + send(ir) return out - - def rtf_sqrt(a:Tensor, out:Tensor, author='miaobyte')->Tensor: A_op_C("sqrt",a,out,author) return out diff --git a/front/py/deepx/tensor/elementwise.py b/front/py/deepx/tensor/elementwise.py index 39e1536b..ce56d7c8 100644 --- a/front/py/deepx/tensor/elementwise.py +++ b/front/py/deepx/tensor/elementwise.py @@ -40,11 +40,9 @@ def mul_(self, other): @tensor_method def div(self, other:Union[Tensor,float,int], out:Union[Tensor,str]='')->Tensor: - result = Tensor(dtype=self.dtype,shape=self.shape) - result.addtograph(out) from deepx.nn.functional import div as div_func - div_func(self,other,result) - return result + return div_func(self,other,out) + @tensor_method diff --git a/front/py/examples/2_ir/2_elementwise_operator.py b/front/py/examples/2_ir/2_elementwise_operator.py index 80ecd6f6..c5870c79 100644 --- a/front/py/examples/2_ir/2_elementwise_operator.py +++ b/front/py/examples/2_ir/2_elementwise_operator.py @@ -33,9 +33,6 @@ print(t7) t8=t7.mul(t2,out='t8') print(t8) -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] # 获取不带后缀的脚本名 -str=t3.graph.to_dot() -str.render(script_name+".dot", format='svg') + diff --git a/front/py/examples/2_ir/2_elementwise_sqrtlog.py b/front/py/examples/2_ir/2_elementwise_sqrtlog.py index 908efd69..feb8e9f2 100644 --- a/front/py/examples/2_ir/2_elementwise_sqrtlog.py +++ b/front/py/examples/2_ir/2_elementwise_sqrtlog.py @@ -19,7 +19,7 @@ import deepx print() -t1 = deepx.arange(end=3*4*5,dtype='float32',name="t1") +t1 = deepx.arange(3*4*5,dtype='float32',name="t1") t2 = deepx.full([3*4*5],value=2,dtype='float32',name="t2") t3 = deepx.sqrt(t1,out='t3') print(t3) @@ -30,9 +30,5 @@ t6 = deepx.pow(t5,t3,out='t6') print(t6) -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] # 获取不带后缀的脚本名 -str=t3.graph.to_dot() -str.render(script_name+".dot", format='svg') From a2f6ea97c74a177efa12c10b6bc9e55446f468e2 Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Wed, 16 Apr 2025 19:28:58 +0800 Subject: [PATCH 10/12] excuter&front:leaffunc_changeshape --- doc/excuter/op-mem-ompsimd/list.md | 2 +- excuter/cpp-common/src/deepx/dtype.hpp | 99 +++++++++- excuter/cpp-common/src/deepx/tf/tf.cpp | 177 ++++------------- excuter/cpp-common/src/deepx/tf/tf.hpp | 8 +- excuter/cpp-common/src/stdutil/string.cpp | 16 ++ excuter/cpp-common/src/stdutil/string.hpp | 16 ++ .../op-mem-cuda/src/deepx/tf/changeshape.hpp | 9 + excuter/op-mem-cuda/src/deepx/tf/new.hpp | 21 +-- excuter/op-mem-ompsimd/src/client/tfs.cpp | 2 +- .../src/deepx/tf/changeshape.hpp | 16 +- excuter/op-mem-ompsimd/src/deepx/tf/new.hpp | 22 +-- front/py/deepx/nn/deepxir.py | 13 +- front/py/deepx/nn/functional/__init__.py | 17 +- .../nn/functional/leaffunc_changeshape.py | 16 +- .../py/deepx/nn/functional/leaffunc_matmul.py | 40 ++++ .../py/deepx/nn/functional/leaffunc_reduce.py | 175 +++++++++++++++++ front/py/deepx/nn/functional/matmul.py | 41 ---- front/py/deepx/nn/functional/reduce.py | 178 ++---------------- .../py/deepx/nn/functional/rtf_changeshape.py | 2 +- front/py/deepx/tensor/changeshape.py | 6 +- front/py/deepx/tensor/matmul.py | 4 +- front/py/deepx/tensor/shape.py | 4 +- front/py/examples/2_ir/3_matmul.py | 4 - .../examples/2_ir/4_changeshape_broadcast.py | 17 +- .../2_ir/4_changeshape_broadcast_add.py | 14 +- .../py/examples/2_ir/4_changeshape_concat.py | 5 - 26 files changed, 471 insertions(+), 453 deletions(-) create mode 100644 excuter/cpp-common/src/stdutil/string.cpp create mode 100644 excuter/cpp-common/src/stdutil/string.hpp create mode 100644 front/py/deepx/nn/functional/leaffunc_matmul.py delete mode 100644 front/py/deepx/nn/functional/matmul.py diff --git a/doc/excuter/op-mem-ompsimd/list.md b/doc/excuter/op-mem-ompsimd/list.md index c9d51f4f..2466718d 100644 --- a/doc/excuter/op-mem-ompsimd/list.md +++ b/doc/excuter/op-mem-ompsimd/list.md @@ -6,7 +6,7 @@ |-----------|--------|------------|--------------|----------------| | reducemax | miaobyte | reducemax(tensor A, vector axis, var keepdims)->(tensor B) | B = reducemax(A, axis=[1 2], keepdims=false) | reducemax(tensor A, vector axis, var keepdims)->(tensor B) | | broadcastTo | miaobyte | broadcastTo(tensor A, vector new_shape)->(tensor B) | T2 = T1.broadcastTo(new_shape=[4,3,2]) | broadcastTo(tensor A, vector new_shape)->(tensor B) | -| concat | miaobyte | concat(listtensor tensors, var axis)->(tensor result) | Tresult = concat([T1, T2...], axis=3) | concat(listtensor tensors, var axis)->(tensor result) | +| concat | miaobyte | concat(listtensor tensors, var dim)->(tensor result) | Tresult = concat([T1, T2...], axis=3) | concat(listtensor tensors, var dim)->(tensor result) | | transpose | miaobyte | transpose(tensor A, vector dim_order)->(tensor C) | T1.transpose(dimorder=[1,0])->T2 | transpose(tensor A, vector dim_order)->(tensor C) | | add | cblas | add(tensor a, tensor b)->(tensor c) | T3=T1+T2 | add(tensor a, tensor b)->(tensor c) | | add | miaobyte | add(tensor a, tensor b)->(tensor c) | T3=T1+T2 | add(tensor a, tensor b)->(tensor c) | diff --git a/excuter/cpp-common/src/deepx/dtype.hpp b/excuter/cpp-common/src/deepx/dtype.hpp index e1ca3627..ae69e4ab 100644 --- a/excuter/cpp-common/src/deepx/dtype.hpp +++ b/excuter/cpp-common/src/deepx/dtype.hpp @@ -4,9 +4,14 @@ #include #include #include +#include +#include "stdutil/string.hpp" +#include "stdutil/num.hpp" namespace deepx { + using namespace std; + template T to(const std::string &textvalue) { @@ -134,7 +139,7 @@ namespace deepx Bool = 1 << 13, // 0010 0000 0000 0000 String = 1 << 15, // 0100 0000 0000 0000 // 常用组合 - Any = 0xFFFF, // 1111 1111 1111 1111 + Any = 0xFFFF, // 1111 1111 1111 1111 Float = Float64 | Float32 | Float16 | BFloat16 | Float8E5M2 | Float8E4M3 | Float4E2M1, Float8 = Float8E5M2 | Float8E4M3, // 所有FP8格式 Int = Int64 | Int32 | Int16 | Int8 | Int4 @@ -372,5 +377,97 @@ namespace deepx precision(precision_str)); } + inline TypeDef autodtype(const std::string ¶m) + { + std::string type; + std::string textvalue; + std::vector vectorvalues; + bool vectorvalue = false; + if (param.back() == ']') + { + size_t bracket_start = param.find('['); + if (bracket_start != string::npos) + { + vectorvalue = true; + // 提取方括号内的内容作为textvalue + textvalue = param.substr(bracket_start + 1, param.length() - bracket_start - 2); + // 提取方括号前的内容作为type + type = param.substr(0, bracket_start); + // 去除type两端的空格 + stdutil::trim(type); + } + } + + if (!vectorvalue) + { + // 没有方括号,按空格分割 + stringstream ss(param); + string first, second; + ss >> first; + if (ss >> second) + { + // 如果能读取到两个部分 + type = first; + textvalue = second; + } + else + { + textvalue = first; + } + } + // 处理向量值 + if (vectorvalue) + { + // 分割字符串为向量 + stringstream ss(textvalue); + string item; + while (getline(ss, item, ' ')) + { + item.erase(0, item.find_first_not_of(" ")); + item.erase(item.find_last_not_of(" ") + 1); + if (!item.empty()) + { + vectorvalues.push_back(item); + } + } + } + + // 设置结果 + if (!type.empty()) + { + return dtype(type); + } + else + { + // 没有显式类型声明,根据值推断 + if (vectorvalue) + { + if (!vectorvalues.empty()) + { + if (is_integer(vectorvalues[0])) + { + return make_dtype(DataCategory::Vector, Precision::Int32); + } + else if (is_float(vectorvalues[0])) + { + return make_dtype(DataCategory::Vector, Precision::Float64); + } + else + { + return make_dtype(DataCategory::ListTensor, Precision::Any); + } + } + else + { + return make_dtype(DataCategory::Vector, Precision::Any); + } + } + else + { + return make_dtype(DataCategory::Var | DataCategory::Tensor, Precision::Any); + } + } + } + } // namespace deepx #endif diff --git a/excuter/cpp-common/src/deepx/tf/tf.cpp b/excuter/cpp-common/src/deepx/tf/tf.cpp index 1ea2adb4..d8bce199 100644 --- a/excuter/cpp-common/src/deepx/tf/tf.cpp +++ b/excuter/cpp-common/src/deepx/tf/tf.cpp @@ -4,8 +4,41 @@ #include "deepx/tf/tf.hpp" #include "stdutil/time.hpp" +#include "stdutil/string.hpp" namespace deepx::tf -{ +{ + + + void Param::parse(const string ¶m) + { + //1. 按:分割类型和值 + size_t colon_pos = param.find(':'); + string type, textvalue; + if (colon_pos != string::npos) + { + type = param.substr(0, colon_pos); + stdutil::trimspace(type); + textvalue = param.substr(colon_pos + 1); + stdutil::trimspace(textvalue); + } + else + { + textvalue = param; + stdutil::trimspace(textvalue); + } + if (!type.empty()) + { + this->dtype = deepx::dtype(type); + this->textvalue = textvalue; + } + else + { + this->dtype = deepx::dtype(textvalue); + this->textvalue = textvalue; + } + + } + // 分割主体和元数据 std::pair split_body_metadata(const string &input) { size_t meta_pos = input.find("//"); @@ -153,141 +186,7 @@ namespace deepx::tf return value_str; // 默认作为字符串处理 } - // 主参数解析函数,param已经去除两侧空格 - Param parse_param(const string ¶m) - { - Param result; - if (param.empty()) - { - return result; - } - - // 初始化变量 - string type; - string textvalue; - vector vectorvalues; - bool vectorvalue = false; - - // 首先检查是否包含冒号分隔符 - size_t colon_pos = param.find(':'); - if (colon_pos != string::npos) - { - // 使用冒号分隔类型和值 - type = param.substr(0, colon_pos); - textvalue = param.substr(colon_pos + 1); - - // 去除type两端的空格 - type.erase(0, type.find_first_not_of(" ")); - type.erase(type.find_last_not_of(" ") + 1); - - // 去除textvalue两端的空格 - textvalue.erase(0, textvalue.find_first_not_of(" ")); - textvalue.erase(textvalue.find_last_not_of(" ") + 1); - - // 检查是否是向量值(以[开头,]结尾) - if (textvalue.size() >= 2 && textvalue.front() == '[' && textvalue.back() == ']') - { - vectorvalue = true; - // 去除方括号,只保留内容 - textvalue = textvalue.substr(1, textvalue.length() - 2); - } - } - else - { - // 无冒号,使用原有逻辑处理 - // 检查是否是向量值(以]结尾) - if (param.back() == ']') - { - size_t bracket_start = param.find('['); - if (bracket_start != string::npos) - { - vectorvalue = true; - // 提取方括号内的内容作为textvalue - textvalue = param.substr(bracket_start + 1, param.length() - bracket_start - 2); - // 提取方括号前的内容作为type - type = param.substr(0, bracket_start); - // 去除type两端的空格 - type.erase(0, type.find_first_not_of(" ")); - type.erase(type.find_last_not_of(" ") + 1); - } - } - - if (!vectorvalue) - { - // 没有方括号,按空格分割 - stringstream ss(param); - string first, second; - ss >> first; - if (ss >> second) - { - // 如果能读取到两个部分 - type = first; - textvalue = second; - } - else - { - textvalue = first; - } - } - } - - // 处理向量值 - if (vectorvalue) - { - // 分割字符串为向量 - stringstream ss(textvalue); - string item; - while (getline(ss, item, ' ')) - { - item.erase(0, item.find_first_not_of(" ")); - item.erase(item.find_last_not_of(" ") + 1); - if (!item.empty()) - { - vectorvalues.push_back(item); - } - } - } - - // 设置结果 - if (!type.empty()) - { - result.dtype = dtype(type); - } - else - { - // 没有显式类型声明,根据值推断 - if (vectorvalue) - { - if (!vectorvalues.empty()) - { - if (is_integer(vectorvalues[0])) - { - result.dtype = make_dtype(DataCategory::Vector, Precision::Int32); - } - else if (is_float(vectorvalues[0])) - { - result.dtype = make_dtype(DataCategory::Vector, Precision::Float64); - } - else - { - result.dtype = make_dtype(DataCategory::ListTensor, Precision::Any); - } - } - else - { - result.dtype = make_dtype(DataCategory::Vector, Precision::Any); - } - } - else - { - result.dtype = make_dtype(DataCategory::Var | DataCategory::Tensor, Precision::Any); - } - } - - result.textvalue = textvalue; - return result; - }; - + // 解析参数列表 vector parse_params(const string ¶ms_str) { @@ -298,14 +197,14 @@ namespace deepx::tf while (getline(params_ss, param, ',')) { // 去除首尾空格 - param.erase(0, param.find_first_not_of(" ")); - param.erase(param.find_last_not_of(" ") + 1); + stdutil::trimspace(param); if (param.empty()) continue; // 解析单个参数 - Param parsed_param = parse_param(param); + Param parsed_param; + parsed_param.parse(param); params.push_back(parsed_param); } diff --git a/excuter/cpp-common/src/deepx/tf/tf.hpp b/excuter/cpp-common/src/deepx/tf/tf.hpp index 17b7e51e..95c2956d 100644 --- a/excuter/cpp-common/src/deepx/tf/tf.hpp +++ b/excuter/cpp-common/src/deepx/tf/tf.hpp @@ -15,6 +15,7 @@ #include "stdutil/error.hpp" #include "stdutil/num.hpp" +#include "stdutil/string.hpp" namespace deepx::tf { using mem::MemBase; @@ -28,6 +29,8 @@ namespace deepx::tf Param(const string &textvalue = "", const DataCategory &dt = DataCategory::Unknown, const Precision &prec = Precision::Any) : textvalue(textvalue), dtype(make_dtype(dt, prec)) {} + + void parse(const string ¶m); }; // TF:Tensor Function的缩写 @@ -124,7 +127,8 @@ namespace deepx::tf } vector result; - string textvalue = vars[idx].textvalue; + string textvalue =vars[idx].textvalue; + stdutil::trim(textvalue,"[]"); if (textvalue.empty()) { throw std::invalid_argument("Invalid argument index"); @@ -138,7 +142,7 @@ namespace deepx::tf return result; } - bool checktensors(const initializer_list &names, shared_ptr mem, string &error) + bool checktensors(const vector &names, shared_ptr mem, string &error) { for (const auto &name : names) { diff --git a/excuter/cpp-common/src/stdutil/string.cpp b/excuter/cpp-common/src/stdutil/string.cpp new file mode 100644 index 00000000..d254d349 --- /dev/null +++ b/excuter/cpp-common/src/stdutil/string.cpp @@ -0,0 +1,16 @@ +#include "string.hpp" + +namespace stdutil +{ + void trimspace(string &str) + { + str.erase(0, str.find_first_not_of(" ")); + str.erase(str.find_last_not_of(" ") + 1); + } + + void trim(string &str,const string &chars) + { + str.erase(0, str.find_first_not_of(chars)); + str.erase(str.find_last_not_of(chars) + 1); + } +} // namespace stdutil \ No newline at end of file diff --git a/excuter/cpp-common/src/stdutil/string.hpp b/excuter/cpp-common/src/stdutil/string.hpp new file mode 100644 index 00000000..1b353ded --- /dev/null +++ b/excuter/cpp-common/src/stdutil/string.hpp @@ -0,0 +1,16 @@ +#ifndef STDUTIL_STRING_HPP +#define STDUTIL_STRING_HPP + +#include + +namespace stdutil +{ + using std::string; + + void trimspace(string &str); + void trim(string &str,const string &chars=" \t\n\r\f\v"); + +} + + +#endif diff --git a/excuter/op-mem-cuda/src/deepx/tf/changeshape.hpp b/excuter/op-mem-cuda/src/deepx/tf/changeshape.hpp index b375ce71..8b6bba4d 100644 --- a/excuter/op-mem-cuda/src/deepx/tf/changeshape.hpp +++ b/excuter/op-mem-cuda/src/deepx/tf/changeshape.hpp @@ -160,7 +160,16 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { + if (!checktensors({ this->returns[0].textvalue}, mem, error)!=0) + { + return 1; + } + vector tensor_names = this->getvector(0, true); + if (!checktensors(tensor_names, mem, error)!=0) + { + return 1; + } Precision input_type = mem->gettensor(tensor_names[0]).get()->shape.dtype; int axis = this->getvar(1, mem, true); switch (input_type) diff --git a/excuter/op-mem-cuda/src/deepx/tf/new.hpp b/excuter/op-mem-cuda/src/deepx/tf/new.hpp index 13312188..26c9bd61 100644 --- a/excuter/op-mem-cuda/src/deepx/tf/new.hpp +++ b/excuter/op-mem-cuda/src/deepx/tf/new.hpp @@ -38,25 +38,8 @@ namespace deepx::tf error = "newtensor: return type must include tensor category"; return 1; } - vector shape; - if (this->args.size() == 1 && !is_positive_integer(this->args[0].textvalue)) - { - shape = mem->getvector(this->args[0].textvalue); - } - else - { - vector value_strs; - stringstream ss(this->args[0].textvalue); - string item; - while (ss >> item) { - value_strs.push_back(item); - } - vector values; - for (const auto &str : value_strs) { - values.push_back(stoi(str)); - } - shape=values; - } + vector shape=this->getvector(0); + switch (type.precision()) { case Precision::Float32: diff --git a/excuter/op-mem-ompsimd/src/client/tfs.cpp b/excuter/op-mem-ompsimd/src/client/tfs.cpp index 2c675170..f992497b 100644 --- a/excuter/op-mem-ompsimd/src/client/tfs.cpp +++ b/excuter/op-mem-ompsimd/src/client/tfs.cpp @@ -367,7 +367,7 @@ namespace deepx::tf tffactory.add_tf(std::make_shared>(vector( { Param("tensors", DataCategory::ListTensor, Precision::Any), - Param("axis", DataCategory::Var, Precision::Int32), + Param("dim", DataCategory::Var, Precision::Int32), }), vector( { diff --git a/excuter/op-mem-ompsimd/src/deepx/tf/changeshape.hpp b/excuter/op-mem-ompsimd/src/deepx/tf/changeshape.hpp index 0f93dcf2..784abfc0 100644 --- a/excuter/op-mem-ompsimd/src/deepx/tf/changeshape.hpp +++ b/excuter/op-mem-ompsimd/src/deepx/tf/changeshape.hpp @@ -35,7 +35,8 @@ namespace deepx::tf int run(shared_ptr mem, string &error) override { - if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + + if (!checktensors({ this->returns[0].textvalue}, mem, error)!=0) { return 1; } @@ -99,7 +100,7 @@ namespace deepx::tf int run(shared_ptr mem, string &error) override { - if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + if (!checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) { return 1; } @@ -161,12 +162,17 @@ namespace deepx::tf return make_shared(*this); } int run(shared_ptr mem, string &error) override - { - if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + { + if (!checktensors({ this->returns[0].textvalue}, mem, error)!=0) { return 1; } + vector tensor_names = this->getvector(0, true); + if (!checktensors(tensor_names, mem, error)!=0) + { + return 1; + } Precision input_type = mem->gettensor(tensor_names[0]).get()->shape.dtype; int axis = this->getvar(1, mem, true); switch (input_type) @@ -268,7 +274,7 @@ namespace deepx::tf } int run(shared_ptr mem, string &error) override { - if (checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) + if (!checktensors({this->args[0].textvalue, this->returns[0].textvalue}, mem, error)!=0) { return 1; } diff --git a/excuter/op-mem-ompsimd/src/deepx/tf/new.hpp b/excuter/op-mem-ompsimd/src/deepx/tf/new.hpp index 856e95c3..3c40fedf 100644 --- a/excuter/op-mem-ompsimd/src/deepx/tf/new.hpp +++ b/excuter/op-mem-ompsimd/src/deepx/tf/new.hpp @@ -36,27 +36,7 @@ namespace deepx::tf error = "newtensor: return type must include tensor category"; return 1; } - vector shape; - if (this->args.size() == 1 && !is_positive_integer(this->args[0].textvalue)) - { - shape = mem->getvector(this->args[0].textvalue); - } - else - { - vector value_strs; - stringstream ss(this->args[0].textvalue); - string item; - while (ss >> item) - { - value_strs.push_back(item); - } - vector values; - for (const auto &str : value_strs) - { - values.push_back(stoi(str)); - } - shape = values; - } + vector shape=this->getvector(0); switch (type.precision()) { case Precision::Float32: diff --git a/front/py/deepx/nn/deepxir.py b/front/py/deepx/nn/deepxir.py index 4e52e18c..830a7452 100644 --- a/front/py/deepx/nn/deepxir.py +++ b/front/py/deepx/nn/deepxir.py @@ -54,9 +54,16 @@ def vector(cls,value:tuple,dtype:str): return Param(textvalue,category="vector",precision=dtype) @classmethod - def tensorlist(cls,value:tuple[str],dtype:str): - textvalue='['+' '.join(v for v in value)+']' - return Param(textvalue,category="tensorlist",precision=dtype) + def listtensor(cls,value:tuple[Tensor]): + tensorNames=[] + for t in value: + if t.name is not None: + tensorNames.append(t.name) + else: + tensorNames.append(id(t)) + textvalue='['+' '.join(tensorNames)+']' + dtype=value[0].dtype + return Param(textvalue,category="listtensor",precision=dtype) # 完整IR,携带类型 # newtensor (vector:[3 4 5]) -> (tensor tensor_136144420556608) diff --git a/front/py/deepx/nn/functional/__init__.py b/front/py/deepx/nn/functional/__init__.py index 9a721309..1aee9d1e 100644 --- a/front/py/deepx/nn/functional/__init__.py +++ b/front/py/deepx/nn/functional/__init__.py @@ -2,22 +2,25 @@ from .leaffunc_new import newtensor,deltensor from .leaffunc_io import printtensor from .leaffunc_init import * - from .leaffunc_changeshape import * from .leaffunc_elementwise import * -from .matmul import matmul +from .leaffunc_matmul import matmul +from .leaffunc_reduce import reducemax,reducemin,sum,prod -from .reduce import reduce_max,reduce_min,sum,prod,mean +from .reduce import mean from .activite import relu,sigmoid,swish __all__ = [ + #leaffunc "newtensor", "printtensor", "constant","constant_","full","zeros","ones","uniform","uniform_","arange","arange_","kaiming_uniform","kaiming_uniform_","calculate_fan_in_and_fan_out", "add","sub","mul","div","sqrt","pow","exp","log","rsqrt", - "matmul", - "max","min","sum","prod","mean", - "reshape","permute","transpose","concat","broadcast_to", + "leaffunc_matmul", + "reducemax","reducemin","sum","prod", + "reshape","permute","transpose","concat","broadcastTo", "relu","sigmoid","swish", - + + #func + "mean", ] \ No newline at end of file diff --git a/front/py/deepx/nn/functional/leaffunc_changeshape.py b/front/py/deepx/nn/functional/leaffunc_changeshape.py index 6c3ab092..3876fa4e 100644 --- a/front/py/deepx/nn/functional/leaffunc_changeshape.py +++ b/front/py/deepx/nn/functional/leaffunc_changeshape.py @@ -12,7 +12,7 @@ def forward(ctx:Context,t:Tensor,shape:list[int],out:Union[Tensor,str],authormap if ctx.requires_grad: ctx.save_data('oldshape',t.shape) ctx.save_tensors('t',t) - ctx.set_authormap(authormap) + ctx.set_authormap(authormap) outtensor=out if isinstance(out,str): outshape=shape @@ -44,7 +44,7 @@ def forward(ctx:Context, authormap:dict={'transpose':'miaobyte'})->Tensor: if ctx.requires_grad: ctx.save_data('dimorder',dimorder) - ctx.set_authormap(authormap) + ctx.set_authormap(authormap) outtensor=out if isinstance(out,str): outshape = [t.shape[dim] for dim in dimorder] @@ -91,7 +91,7 @@ def forward(ctx:Context, authormap:dict={'concat':'miaobyte'})->Tensor: if ctx.requires_grad: ctx.save_data('dim',dim) - ctx.set_authormap(authormap) + ctx.set_authormap(authormap) outtensor=out if isinstance(out,str): outshape=list(tensors[0].shape) @@ -107,7 +107,7 @@ def backward(ctx:Context,out_grad): #todo: 反向传播 def concat(t:Tensor,dim:int,out:Union[Tensor,str]='',requires_grad:bool=False,author='miaobyte')->Tensor: - return Concat.apply(t,dim,out,author,requires_grad=requires_grad) + return Concat.apply(t,dim,out,{"concat":author},requires_grad=requires_grad) def broadcast_shape(shape_a: tuple[int], shape_b: tuple[int]) -> tuple[int]: """计算两个形状的广播后形状""" @@ -153,6 +153,7 @@ def forward(ctx:Context, if ctx.requires_grad: ctx.save_data('new_shape',new_shape) + ctx.set_authormap(authormap) outtensor=out if isinstance(out,str): outshape=new_shape @@ -167,9 +168,10 @@ def backward(ctx:Context,out_grad): new_shape=ctx.get_data('new_shape') #todo: 反向传播 -def broadcast_to(t:Tensor,new_shape:tuple[int],out:Union[Tensor,str]='',requires_grad:bool=False,author='miaobyte')->Tensor: - return BroadcastTo.apply(t,new_shape,out,author,requires_grad=requires_grad) - +def broadcastTo(t:Tensor,new_shape:tuple[int],out:Union[Tensor,str]='',requires_grad:bool=False,author='miaobyte')->Tensor: + return BroadcastTo.apply(t,new_shape,out,{'broadcastTo':author},requires_grad=requires_grad) + +broadcast_to = broadcastTo # def unsqueeze(t:Tensor,dim:int)->Tensor: # # 确保dim是有效的 diff --git a/front/py/deepx/nn/functional/leaffunc_matmul.py b/front/py/deepx/nn/functional/leaffunc_matmul.py new file mode 100644 index 00000000..73d5303c --- /dev/null +++ b/front/py/deepx/nn/functional/leaffunc_matmul.py @@ -0,0 +1,40 @@ +from typing import Union + +from deepx import Tensor +from deepx.autograd import Function,Context +from .leaffunc_new import newtensor + +class Matmul(Function): + @staticmethod + def forward(ctx:Context, + a:Tensor, + b: Tensor, + out:Union[Tensor,str]='', + authormap:dict={'matmul':'cublas'}): + ctx.save_tensors(a,b) + ctx.set_authormap(authormap) + + outtensor=None + if isinstance(out,str): + matmulshape=a.Shape.matmul(b.shape) + outtensor=newtensor(matmulshape, dtype=a.dtype,name=out) + else: + outtensor=out + + from .rtf_matmul import rtf_matmul + rtf_matmul(a,b,outtensor,ctx.authormap['matmul']) + return outtensor + + @staticmethod + def backward(ctx:Context,out_grad:Tensor,a_grad:Union[Tensor,str],b_grad:Union[Tensor,str]): + a,b=ctx.get_tensors() + if isinstance(a_grad,str): + a_grad=newtensor(shape=a.shape,dtype=a.dtype,name=a_grad) + if isinstance(b_grad,str): + b_grad=newtensor(shape=b.shape,dtype=b.dtype,name=b_grad) + from .rtf_matmul import rtf_matmul_backward + rtf_matmul_backward(out_grad,a,b,a_grad,b_grad,ctx.authormap['matmul']) + return a_grad,b_grad + +def matmul(a:Tensor,b:Tensor,out:Union[Tensor,str]='',author:str='cublas')->Tensor: + return Matmul.apply(a,b,out,author) diff --git a/front/py/deepx/nn/functional/leaffunc_reduce.py b/front/py/deepx/nn/functional/leaffunc_reduce.py index e69de29b..6ae00a4e 100644 --- a/front/py/deepx/nn/functional/leaffunc_reduce.py +++ b/front/py/deepx/nn/functional/leaffunc_reduce.py @@ -0,0 +1,175 @@ +from typing import Optional, Union + +from deepx.tensor import Tensor +from deepx.autograd import Function,Context +from .leaffunc_new import newtensor +def reduceshape(inshape: Union[list[int], tuple[int]], + dim: Union[list[int], tuple[int]], + keepdim: bool) -> tuple[int]: + """计算维度缩减后的形状 + + Args: + inshape: 输入形状,如(2,3,4) + dim: 要缩减的维度列表,支持负数索引,如[-1] + keepdim: 是否保留缩减后的维度为1 + + Returns: + 缩减后的形状元组 + + Example: + >>> reduceshape((2,3,4), [1], True) + (2, 1, 4) + >>> reduceshape((2,3,4), [1], False) + (2, 4) + """ + ndim = len(inshape) + # 处理负数维度 + normalized_dim = [d % ndim for d in dim] + # 去重并排序 + unique_dim = sorted(set(normalized_dim)) + + if keepdim: + return tuple(1 if i in unique_dim else s + for i, s in enumerate(inshape)) + else: + return tuple(s for i, s in enumerate(inshape) + if i not in unique_dim) + +#sum + +class Sum(Function): + @staticmethod + def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Union[Tensor,str]='',authormap:dict={'sum':'miaobyte'})->Tensor: + if ctx.requires_grad: + ctx.save_tensors('a',a) + ctx.save_data('dims',dims) + ctx.save_data('keepdim',keepdim) + if dims is None: + dims=tuple(range(a.ndim)) + + result=out + if isinstance(out,str): + resultshape=reduceshape(a.shape,dims,keepdim) + result=newtensor(resultshape, dtype=a.dtype,name=out) + from .rtf_reduce import rtf_sum + rtf_sum(a,dims,result,ctx.authormap['sum']) + return result + + @staticmethod + def backward(ctx:Context,out_grad): + pass + + + +def sum( + a:Tensor, + dims:list[int], + keepdim:bool=False, + out:Union[Tensor,str]='', + author:str='miaobyte', + requires_grad:bool=False)->Tensor: + return Sum.apply(a,dims,keepdim,out,{'sum':author},requires_grad=requires_grad) + +#prod + +class Prod(Function): + @staticmethod + def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Union[Tensor,str]='',authormap:dict={'prod':'miaobyte'})->Tensor: + if ctx.requires_grad: + ctx.save_tensors('a',a) + ctx.save_data('dims',dims) + ctx.save_data('keepdim',keepdim) + if dims is None: + dims=tuple(range(a.ndim)) + + result=out + if isinstance(out,str): + resultshape=reduceshape(a.shape,dims,keepdim) + result=newtensor(resultshape, dtype=a.dtype,name=out) + from .rtf_reduce import rtf_prod + rtf_prod(a,dims,result,ctx.authormap['prod']) + return result + + @staticmethod + def backward(ctx:Context,out_grad): + pass + +def prod( + a:Tensor, + dims:list[int], + keepdim:bool=False, + out:Union[Tensor,str]='', + author:str='miaobyte', + requires_grad:bool=False)->Tensor: + return Prod.apply(a,dims,keepdim,out,{'prod':author},requires_grad=requires_grad) + +#max + +class ReduceMax(Function): + @staticmethod + def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Union[Tensor,str]='',authormap:dict={'reducemax':'miaobyte'})->Tensor: + if ctx.requires_grad: + ctx.save_tensors('a',a) + ctx.save_data('dims',dims) + ctx.save_data('keepdim',keepdim) + if dims is None: + dims=tuple(range(a.ndim)) + + result=out + if isinstance(out,str): + resultshape=reduceshape(a.shape,dims,keepdim) + result=newtensor(resultshape, dtype=a.dtype,name=out) + from .rtf_reduce import rtf_reducemax + rtf_reducemax(a,dims,result,ctx.authormap['reducemax']) + return result + + @staticmethod + def backward(ctx:Context,out_grad): + pass + + + +def reducemax( + a:Tensor, + dims:list[int], + keepdim:bool=False, + out:Union[Tensor,str]='', + author:str='miaobyte', + requires_grad:bool=False)->Tensor: + return ReduceMax.apply(a,dims,keepdim,out,{'reducemax':author},requires_grad=requires_grad) + +#min +class ReduceMin(Function): + @staticmethod + def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Union[Tensor,str]='',authormap:dict={'reducemin':'miaobyte'})->Tensor: + if ctx.requires_grad: + ctx.save_tensors('a',a) + ctx.save_data('dims',dims) + ctx.save_data('keepdim',keepdim) + if dims is None: + dims=tuple(range(a.ndim)) + + result=out + if isinstance(out,str): + resultshape=reduceshape(a.shape,dims,keepdim) + result=newtensor(resultshape, dtype=a.dtype,name=out) + from .rtf_reduce import rtf_reducemin + rtf_reducemin(a,dims,result,ctx.authormap['reducemin']) + return result + + @staticmethod + def backward(ctx:Context,out_grad): + pass + + + +def reducemin( + a:Tensor, + dims:list[int], + keepdim:bool=False, + out:Union[Tensor,str]='', + author:str='miaobyte', + requires_grad:bool=False)->Tensor: + return ReduceMin.apply(a,dims,keepdim,out,{'reducemin':author},requires_grad=requires_grad) + + \ No newline at end of file diff --git a/front/py/deepx/nn/functional/matmul.py b/front/py/deepx/nn/functional/matmul.py deleted file mode 100644 index 109e1dd4..00000000 --- a/front/py/deepx/nn/functional/matmul.py +++ /dev/null @@ -1,41 +0,0 @@ -from typing import Union - -from deepx import Tensor -from deepx.autograd import Function,Context -from deepx.nn import DeepxIR -from deepx.scheduler import send - - -class Matmul(Function): - @staticmethod - def forward(ctx:Context, - a:Tensor, - b: Tensor, - out:Union[Tensor,str]='', - author:str='cublas'): - ctx.save_tensors(a,b) - - opnode = a.graph.add_op("matmul") - opnode.add_input(a.node) - opnode.add_input(b.node) - - outtensor=None - if isinstance(out,str): - matmulshape=a.Shape.matmul(b.shape) - outtensor=Tensor(shape=matmulshape, dtype=a.dtype, device=a.device) - outtensor.addtograph(out) - else: - outtensor=out - outtensor.node.add_input(opnode) - if a.graph.eager: - ir=DeepxIR("matmul", [a.node.name,b.node.name], [outtensor.node.name], author=author) - send(ir) - return outtensor - - @staticmethod - def backward(ctx:Context,out_grad): - a,b=ctx.get_tensors() - return out_grad @ b.T, a.T @ out_grad - -def matmul(a:Tensor,b:Tensor,out:Union[Tensor,str]='',author:str='cublas')->Tensor: - return Matmul.apply(a,b,out,author) diff --git a/front/py/deepx/nn/functional/reduce.py b/front/py/deepx/nn/functional/reduce.py index 3dd5a0c7..6d8a20a2 100644 --- a/front/py/deepx/nn/functional/reduce.py +++ b/front/py/deepx/nn/functional/reduce.py @@ -1,181 +1,25 @@ -from typing import Optional, Union - from deepx.tensor import Tensor -from deepx.nn.deepxir import DeepxIR -from deepx.scheduler import send -from deepx.autograd import Function,Context - -def reduceshape(inshape: Union[list[int], tuple[int]], - dim: Union[list[int], tuple[int]], - keepdim: bool) -> tuple[int]: - """计算维度缩减后的形状 - - Args: - inshape: 输入形状,如(2,3,4) - dim: 要缩减的维度列表,支持负数索引,如[-1] - keepdim: 是否保留缩减后的维度为1 - - Returns: - 缩减后的形状元组 - - Example: - >>> reduceshape((2,3,4), [1], True) - (2, 1, 4) - >>> reduceshape((2,3,4), [1], False) - (2, 4) - """ - ndim = len(inshape) - # 处理负数维度 - normalized_dim = [d % ndim for d in dim] - # 去重并排序 - unique_dim = sorted(set(normalized_dim)) - - if keepdim: - return tuple(1 if i in unique_dim else s - for i, s in enumerate(inshape)) - else: - return tuple(s for i, s in enumerate(inshape) - if i not in unique_dim) - -def _A_v_reduceop_C( - a:Tensor, - dim: Union[list[int],tuple[int]]=None, - keepdim:bool=False, - op:str=None, - out:Union[Tensor,str]='', - author:str='miaobyte')->Tensor: - - if dim is None: - dim=list(range(a.ndim)) - - result=None - if isinstance(out,str): - resultshape=reduceshape(a.shape,dim,keepdim) - result=Tensor(shape=resultshape, dtype=a.dtype, device=a.device) - result.addtograph(out) - else: - result=out - - vector_node=a.graph.add_vector("",dim) - opnode = a.graph.add_op(op) - opnode.add_input(a.node) - opnode.add_input(vector_node) - result.node.add_input(opnode) - - if a.graph.eager: - ir=DeepxIR(op, [a.node.name,dim,"true" if keepdim else "false"], [result.node.name],author) - send(ir) - return result -#sum - -class Sum(Function): - @staticmethod - def forward(ctx:Context,a:Tensor,dim:Optional[Union[list[int],tuple[int]]]=None,keepdim:bool=False,out:Union[Tensor,str]='',author:str='miaobyte')->Tensor: - if ctx.requires_grad: - ctx.save_tensors('a',a) - ctx.save_data('dim',dim) - ctx.save_data('keepdim',keepdim) - return _A_v_reduceop_C(a,dim,keepdim,"sum",out,author) - - @staticmethod - def backward(ctx:Context,out_grad): - pass - - - -def sum( - a:Tensor, - dim:Optional[Union[ - list[int], - tuple[int], - ]]=None, - keepdim:bool=False, - out:Union[Tensor,str]='', - author:str='miaobyte', - requires_grad:bool=False)->Tensor: - return Sum.apply(a,dim,keepdim,out,author,requires_grad=requires_grad) - -#prod - -class Prod(Function): - @staticmethod - def forward(ctx:Context,a:Tensor,dim:Optional[Union[list[int],tuple[int]]]=None,keepdim:bool=False,out:Union[Tensor,str]='',author:str='miaobyte')->Tensor: - return _A_v_reduceop_C(a,dim,keepdim,"prod",out,author) - - @staticmethod - def backward(ctx:Context,out_grad): - pass - -def prod( - a:Tensor, - dim:Optional[Union[ - list[int], - tuple[int], - ]]=None, - keepdim:bool=False, - out:Union[Tensor,str]='', - author:str='miaobyte', - requires_grad:bool=False)->Tensor: - return Prod.apply(a,dim,keepdim,out,author,requires_grad=requires_grad) - -#max - -class ReduceMax(Function): - @staticmethod - def forward(ctx:Context,a:Tensor,dim:Optional[Union[list[int],tuple[int]]]=None,keepdim:bool=False,out:Union[Tensor,str]='',author:str='miaobyte')->Tensor: - return _A_v_reduceop_C(a,dim,keepdim,"reducemax",out,author) - - @staticmethod - def backward(ctx:Context,out_grad): - pass -def reduce_max( - a:Tensor, - dim:list[int] = None, - keepdim=False, - out:Union[Tensor,str]='', - author:str='miaobyte', - requires_grad:bool=False)->Tensor: - return ReduceMax.apply(a,dim,keepdim,out,author,requires_grad=requires_grad) - -#min - -class ReduceMin(Function): - @staticmethod - def forward(ctx:Context,a:Tensor,dim:Optional[Union[list[int],tuple[int]]]=None,keepdim:bool=False,out:Union[Tensor,str]='',author:str='miaobyte')->Tensor: - return _A_v_reduceop_C(a,dim,keepdim,"reducemin",out,author) - - @staticmethod - def backward(ctx:Context,out_grad): - pass -def reduce_min( - a:Tensor, - dim:list[int] = None, - keepdim=False, - out:Union[Tensor,str]='', - author:str='miaobyte', - requires_grad:bool=False)->Tensor: - return ReduceMin.apply(a,dim,keepdim,out,author,requires_grad=requires_grad) - - +from typing import Optional,Union +from .leaffunc_reduce import sum #mean def mean( a:Tensor, - dim:Optional[Union[list[int],tuple[int]]]=None, + dims:Optional[Union[list[int],tuple[int]]]=None, keepdim:bool=False, out:Union[str]='')->Tensor: # 如果dim为None,则对所有维度求平均 - if dim is None: - dim = list(range(a.ndim)) - elif isinstance(dim, int): - dim = [dim] + if dims is None: + dims = list(range(a.ndim)) + elif isinstance(dims, int): + dims = [dims] else: - dim = list(dim) + dims = list(dims) total = 1 - for i in dim: + for i in dims: if i < 0: - dim[i] = i + a.dim() + dims[i] = i + a.dim() total *= a.shape[i] - result = sum(a, dim, keepdim, out)/total + result = sum(a, dims, keepdim, out)/total return result diff --git a/front/py/deepx/nn/functional/rtf_changeshape.py b/front/py/deepx/nn/functional/rtf_changeshape.py index 6bdf6edb..2f9e7e2d 100644 --- a/front/py/deepx/nn/functional/rtf_changeshape.py +++ b/front/py/deepx/nn/functional/rtf_changeshape.py @@ -16,7 +16,7 @@ def rtf_transpose(t:Tensor,dimorder:tuple[int],out:Tensor,author='miaobyte'): send(ir) def rtf_concat(tensors:tuple[Tensor],dim:int,out:Tensor,author='miaobyte'): - args=[Param.tensorlist([t for t in tensors],tensors[0].dtype),Param.varnum(dim,'int32')] + args=[Param.listtensor(tensors),Param.varnum(dim)] returns=[Param.tensor(out)] ir=DeepxIR("concat", args, returns,author) send(ir) diff --git a/front/py/deepx/tensor/changeshape.py b/front/py/deepx/tensor/changeshape.py index 782e6fe7..fafd6ea5 100644 --- a/front/py/deepx/tensor/changeshape.py +++ b/front/py/deepx/tensor/changeshape.py @@ -44,9 +44,9 @@ def broadcastshape(self,other:Tensor)->tuple[int]: return result @tensor_method -def broadcast_to(self,shape:tuple[int],out:Union[Tensor,str]='')->Tensor: - from deepx.nn.functional import broadcast_to as broadcast_to_func - result=broadcast_to_func(self,shape,out) +def broadcastTo(self,shape:tuple[int],out:Union[Tensor,str]='')->Tensor: + from deepx.nn.functional import broadcastTo as broadcastTo_func + result=broadcastTo_func(self,shape,out) return result diff --git a/front/py/deepx/tensor/matmul.py b/front/py/deepx/tensor/matmul.py index 3d4bb0d6..9388873f 100644 --- a/front/py/deepx/tensor/matmul.py +++ b/front/py/deepx/tensor/matmul.py @@ -3,6 +3,6 @@ from .tensor import Tensor,tensor_method @tensor_method -def matmul(self,other,out:Optional[Union[str]]=""): +def matmul(self,other,out:Union[Tensor,str]='',author='miaobyte'): from deepx.nn.functional import matmul as matmul_func - return matmul_func(self,other,out) \ No newline at end of file + return matmul_func(self,other,out,author) \ No newline at end of file diff --git a/front/py/deepx/tensor/shape.py b/front/py/deepx/tensor/shape.py index 46a77ab1..020ccd66 100644 --- a/front/py/deepx/tensor/shape.py +++ b/front/py/deepx/tensor/shape.py @@ -110,7 +110,7 @@ def matmul(self,other:'Shape')->'Shape': raise ValueError(f"matmul: self.ndimension()!=other.ndimension()") if self[-1]!=other[-2]: raise ValueError(f"matmul: self.shape[-1]!=other.shape[-2]") - resultshape=list(self) + resultshape=list(self._shape) resultshape[-1]=other[-1] - return Shape(resultshape) + return tuple(resultshape) \ No newline at end of file diff --git a/front/py/examples/2_ir/3_matmul.py b/front/py/examples/2_ir/3_matmul.py index 81580ac7..5cc0cffd 100644 --- a/front/py/examples/2_ir/3_matmul.py +++ b/front/py/examples/2_ir/3_matmul.py @@ -18,10 +18,6 @@ t3 = t1 @ t2 print(t3) -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] # 获取不带后缀的脚本名 -str=t3.graph.to_dot() -str.render(script_name+".dot", format='svg') \ No newline at end of file diff --git a/front/py/examples/2_ir/4_changeshape_broadcast.py b/front/py/examples/2_ir/4_changeshape_broadcast.py index 523e4941..9811201e 100644 --- a/front/py/examples/2_ir/4_changeshape_broadcast.py +++ b/front/py/examples/2_ir/4_changeshape_broadcast.py @@ -6,22 +6,15 @@ b=torch.arange(2*1).reshape(2,1) bb_torch = torch.broadcast_to(b, (4,2,3)) print(bb_torch) -c_torch=a+bb_torch -print(c_torch) ########====DEEPX====######## -from deepx import Tensor,arange,broadcast_to +from deepx import Tensor,arange,broadcastTo -a=arange(end=4*2*3 ,name="a").reshape_(4,2,3) -b=arange(end=2*1 ,name='b').reshape_(2,1) -bb=b.broadcast_to( a.shape,out="b.broadcasted") +a=arange(4,2,3,name="a") +b=arange(2,1,name='b') +bb=b.broadcastTo( a.shape,out="b.broadcasted") print(bb) -c=a+bb -print(c) -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] # 获取不带后缀的脚本名 -str=b.graph.to_dot() -str.render(script_name+".dot", format='svg') + diff --git a/front/py/examples/2_ir/4_changeshape_broadcast_add.py b/front/py/examples/2_ir/4_changeshape_broadcast_add.py index 65e02980..229f1332 100644 --- a/front/py/examples/2_ir/4_changeshape_broadcast_add.py +++ b/front/py/examples/2_ir/4_changeshape_broadcast_add.py @@ -3,19 +3,13 @@ a=ones( 4,2,3 ,name="a") b=ones( 2,1 ,name='b') - c=a+b - print(c) -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] # 获取不带后缀的脚本名 -str=b.graph.to_dot() -str.render(script_name+".dot", format='svg') ########====pytorch====######## import torch -a=torch.ones(4,2,3) -b=torch.ones(2,1) -c=a+b -print(c) +torch_a=torch.ones(4,2,3) +torch_b=torch.ones(2,1) +torch_c=torch_a+torch_b +print(torch_c) diff --git a/front/py/examples/2_ir/4_changeshape_concat.py b/front/py/examples/2_ir/4_changeshape_concat.py index af068303..24a8c9a4 100644 --- a/front/py/examples/2_ir/4_changeshape_concat.py +++ b/front/py/examples/2_ir/4_changeshape_concat.py @@ -21,8 +21,3 @@ t=concat([t1,t2,t3],dim=1,out='t') print(t) - -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] # 获取不带后缀的脚本名 -str=t.graph.to_dot() -str.render(script_name+".dot", format='svg') \ No newline at end of file From ed756d87f05e8831e879de849ce65c22131630ab Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Wed, 16 Apr 2025 19:46:50 +0800 Subject: [PATCH 11/12] =?UTF-8?q?excuter&front:leaffunc=5Freduce=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E5=AE=8C=E6=88=90=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deepx/nn/functional/leaffunc_changeshape.py | 11 +++++++++-- front/py/deepx/nn/functional/leaffunc_reduce.py | 12 ++++++++---- front/py/deepx/tensor/init.py | 2 +- front/py/examples/2_ir/4_changeshape_reshape.py | 5 ----- .../py/examples/2_ir/4_changeshape_transpose.py | 5 ----- front/py/examples/2_ir/5_reduce_sum_keepdim.py | 16 ++++------------ front/py/examples/2_ir/5_reduce_sumprod.py | 15 ++++----------- 7 files changed, 26 insertions(+), 40 deletions(-) diff --git a/front/py/deepx/nn/functional/leaffunc_changeshape.py b/front/py/deepx/nn/functional/leaffunc_changeshape.py index 3876fa4e..6f830bc2 100644 --- a/front/py/deepx/nn/functional/leaffunc_changeshape.py +++ b/front/py/deepx/nn/functional/leaffunc_changeshape.py @@ -13,12 +13,19 @@ def forward(ctx:Context,t:Tensor,shape:list[int],out:Union[Tensor,str],authormap ctx.save_data('oldshape',t.shape) ctx.save_tensors('t',t) ctx.set_authormap(authormap) + + total_size=1 + for i in shape: + total_size*=i + if total_size!=t.numel(): + raise ValueError(f"reshape失败:{t.shape} 无法reshape为 {shape} ") outtensor=out if isinstance(out,str): outshape=shape outtensor=newtensor(outshape,dtype=t.dtype,name=out) - if outtensor.shape!=shape: - raise ValueError(f"reshape失败:{t.shape} 无法reshape为 {shape} ") + else: + outtensor=out + outtensor._shape=Shape(shape) from .rtf_changeshape import rtf_reshape rtf_reshape(t,shape,outtensor,ctx.authormap['reshape']) return outtensor diff --git a/front/py/deepx/nn/functional/leaffunc_reduce.py b/front/py/deepx/nn/functional/leaffunc_reduce.py index 6ae00a4e..0c51ea0a 100644 --- a/front/py/deepx/nn/functional/leaffunc_reduce.py +++ b/front/py/deepx/nn/functional/leaffunc_reduce.py @@ -44,6 +44,7 @@ def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Uni ctx.save_tensors('a',a) ctx.save_data('dims',dims) ctx.save_data('keepdim',keepdim) + ctx.set_authormap(authormap) if dims is None: dims=tuple(range(a.ndim)) @@ -52,7 +53,7 @@ def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Uni resultshape=reduceshape(a.shape,dims,keepdim) result=newtensor(resultshape, dtype=a.dtype,name=out) from .rtf_reduce import rtf_sum - rtf_sum(a,dims,result,ctx.authormap['sum']) + rtf_sum(a,dims,keepdim,result,ctx.authormap['sum']) return result @staticmethod @@ -79,6 +80,7 @@ def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Uni ctx.save_tensors('a',a) ctx.save_data('dims',dims) ctx.save_data('keepdim',keepdim) + ctx.set_authormap(authormap) if dims is None: dims=tuple(range(a.ndim)) @@ -87,7 +89,7 @@ def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Uni resultshape=reduceshape(a.shape,dims,keepdim) result=newtensor(resultshape, dtype=a.dtype,name=out) from .rtf_reduce import rtf_prod - rtf_prod(a,dims,result,ctx.authormap['prod']) + rtf_prod(a,dims,keepdim,result,ctx.authormap['prod']) return result @staticmethod @@ -112,6 +114,7 @@ def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Uni ctx.save_tensors('a',a) ctx.save_data('dims',dims) ctx.save_data('keepdim',keepdim) + ctx.set_authormap(authormap) if dims is None: dims=tuple(range(a.ndim)) @@ -120,7 +123,7 @@ def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Uni resultshape=reduceshape(a.shape,dims,keepdim) result=newtensor(resultshape, dtype=a.dtype,name=out) from .rtf_reduce import rtf_reducemax - rtf_reducemax(a,dims,result,ctx.authormap['reducemax']) + rtf_reducemax(a,dims,keepdim,result,ctx.authormap['reducemax']) return result @staticmethod @@ -146,6 +149,7 @@ def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Uni ctx.save_tensors('a',a) ctx.save_data('dims',dims) ctx.save_data('keepdim',keepdim) + ctx.set_authormap(authormap) if dims is None: dims=tuple(range(a.ndim)) @@ -154,7 +158,7 @@ def forward(ctx:Context,a:Tensor,dims:tuple[int]=None,keepdim:bool=False,out:Uni resultshape=reduceshape(a.shape,dims,keepdim) result=newtensor(resultshape, dtype=a.dtype,name=out) from .rtf_reduce import rtf_reducemin - rtf_reducemin(a,dims,result,ctx.authormap['reducemin']) + rtf_reducemin(a,dims,keepdim,result,ctx.authormap['reducemin']) return result @staticmethod diff --git a/front/py/deepx/tensor/init.py b/front/py/deepx/tensor/init.py index f5738829..41e7cdd8 100644 --- a/front/py/deepx/tensor/init.py +++ b/front/py/deepx/tensor/init.py @@ -32,7 +32,7 @@ def randn_(self): @tensor_method def arange_(self,start=0,step=1,author='miaobyte'): - from deepx.nn.functional import arange as arange_func + from deepx.nn.functional import arange_ as arange_func arange_func(self,start,step,author) @tensor_method diff --git a/front/py/examples/2_ir/4_changeshape_reshape.py b/front/py/examples/2_ir/4_changeshape_reshape.py index 53c35131..151dc842 100644 --- a/front/py/examples/2_ir/4_changeshape_reshape.py +++ b/front/py/examples/2_ir/4_changeshape_reshape.py @@ -21,8 +21,3 @@ t3=ones([4,5],dtype='float32').reshape_(20) print(t3) - -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] # 获取不带后缀的脚本名 -str=t3.graph.to_dot() -str.render(script_name+".dot", format='svg') diff --git a/front/py/examples/2_ir/4_changeshape_transpose.py b/front/py/examples/2_ir/4_changeshape_transpose.py index e2ee5f96..8ced7ade 100644 --- a/front/py/examples/2_ir/4_changeshape_transpose.py +++ b/front/py/examples/2_ir/4_changeshape_transpose.py @@ -24,8 +24,3 @@ t3=ones([2,3,4],dtype='float32',name='t3') t4=t3.transpose(out='t4') print(t4) - -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] # 获取不带后缀的脚本名 -str=t4.graph.to_dot() -str.render(script_name+".dot", format='svg') \ No newline at end of file diff --git a/front/py/examples/2_ir/5_reduce_sum_keepdim.py b/front/py/examples/2_ir/5_reduce_sum_keepdim.py index 902904c7..28222941 100644 --- a/front/py/examples/2_ir/5_reduce_sum_keepdim.py +++ b/front/py/examples/2_ir/5_reduce_sum_keepdim.py @@ -19,27 +19,19 @@ from deepx import Tensor,ones,zeros,arange from deepx.nn.functional import sum,prod -t=Tensor(shape=(3,4,5)) -t.addtograph("t") -t.arange_(0,1) +t=arange(3,4,5,name='t') t.set_format("%.0f") print(t) -s=sum(t,dim=[0,2],out="s",keepdim=True) +s=sum(t,dims=[0,2],out="s",keepdim=True) s.set_format("%.0f") print(s) -p=prod(t,dim=[1],out="p",keepdim=True) +p=prod(t,dims=[1],out="p",keepdim=True) p.set_format("%.0f") print(p) t1=ones(4,5,6,name="t1") t1.set_format("%.0f") print(t1) -t2=sum(t1,dim=[0,1],out='t2',keepdim=True) +t2=sum(t1,dims=[0,1],out='t2',keepdim=True) t2.set_format("%.0f") print(t2) - - -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] -str=t2.graph.to_dot() -str.render(script_name+".dot", format='svg') \ No newline at end of file diff --git a/front/py/examples/2_ir/5_reduce_sumprod.py b/front/py/examples/2_ir/5_reduce_sumprod.py index eea1e71b..ca969655 100644 --- a/front/py/examples/2_ir/5_reduce_sumprod.py +++ b/front/py/examples/2_ir/5_reduce_sumprod.py @@ -19,27 +19,20 @@ from deepx import Tensor,ones,zeros,arange from deepx.nn.functional import sum,prod -t=Tensor(shape=(3,4,5)) -t.addtograph("t") +t=arange(3,4,5,name='t') t.arange_(0,1) t.set_format("%.0f") print(t) -s=sum(t,dim=[0,2],out="s") +s=sum(t,dims=[0,2],out="s") s.set_format("%.0f") print(s) -p=prod(t,dim=[1],out="p") +p=prod(t,dims=[1],out="p") p.set_format("%.0f") print(p) t1=ones(4,5,6,name="t1") t1.set_format("%.0f") print(t1) -t2=sum(t1,dim=[0,1],out='t2') +t2=sum(t1,dims=[0,1],out='t2') t2.set_format("%.0f") print(t2) - - -import os -script_name = os.path.splitext(os.path.basename( os.path.abspath(__file__)))[0] -str=t2.graph.to_dot() -str.render(script_name+".dot", format='svg') \ No newline at end of file From 16bcf7cef186af019306f9ffe85c034aa61f39d2 Mon Sep 17 00:00:00 2001 From: lipeng <734991033@qq.com> Date: Wed, 16 Apr 2025 19:55:10 +0800 Subject: [PATCH 12/12] =?UTF-8?q?excuter&front:leaffunc=5Freduce=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E5=AE=8C=E6=88=90=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- excuter/op-mem-cuda/src/client/main.cpp | 1 + excuter/op-mem-cuda/src/client/tfs.cpp | 9 +++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/excuter/op-mem-cuda/src/client/main.cpp b/excuter/op-mem-cuda/src/client/main.cpp index 7219a7d8..8c00a50a 100644 --- a/excuter/op-mem-cuda/src/client/main.cpp +++ b/excuter/op-mem-cuda/src/client/main.cpp @@ -68,6 +68,7 @@ int main() { opresp.error("op" + op.name + " not found"); server.resp(opresp.to_string()); + cerr<>(vector( { Param("A", DataCategory::Tensor, Precision::Any), @@ -342,7 +342,7 @@ namespace deepx::tf { Param("B", DataCategory::Tensor, Precision::Any), }))); - + // transpose tffactory.add_tf(std::make_shared>(vector( { Param("A", DataCategory::Tensor, Precision::Any), @@ -352,16 +352,17 @@ namespace deepx::tf { Param("C", DataCategory::Tensor, Precision::Any), }))); - + // concat tffactory.add_tf(std::make_shared>(vector( { Param("tensors", DataCategory::ListTensor, Precision::Any), - Param("axis", DataCategory::Var, Precision::Int32), + Param("dim", DataCategory::Var, Precision::Int32), }), vector( { Param("result", DataCategory::Tensor, Precision::Any), }))); + // broadcastTo tffactory.add_tf(std::make_shared>(vector( { Param("A", DataCategory::Tensor, Precision::Any),