From 3dbac4f47f3faca8d31700349f04a43e028cbc6d Mon Sep 17 00:00:00 2001 From: Megvii Engine Team Date: Mon, 24 Aug 2020 23:36:03 +0800 Subject: [PATCH] feat(mge): add atlas_subgraph module GitOrigin-RevId: 11530383c0a31f4648ed89d3070b2dab178ea5b2 --- python_module/megengine/functional/external.py | 11 +++++++ python_module/megengine/module/external.py | 29 +++++++++++++++++- .../test/unit/module/AtlasRuntimeOprTest.basic.om | Bin 0 -> 32916 bytes python_module/test/unit/module/test_external.py | 33 +++++++++++++++++++-- 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 python_module/test/unit/module/AtlasRuntimeOprTest.basic.om diff --git a/python_module/megengine/functional/external.py b/python_module/megengine/functional/external.py index badede8f..6c93d217 100644 --- a/python_module/megengine/functional/external.py +++ b/python_module/megengine/functional/external.py @@ -35,6 +35,17 @@ def cambricon_subgraph( @wrap_io_tensor +def atlas_subgraph(inputs: List[Tensor], data: bytes) -> List[Tensor]: + """Load a serialized Atlas subgraph (i.e. om model) and + execute the operations defined in the subgraph. + + :param inputs: List of input tensors of the subgraph. + :param data: The serialized subgraph. + """ + return mgb.opr.atlas_runtime(tuple(map(lambda x: x._symvar, inputs)), data) + + +@wrap_io_tensor def extern_opr_subgraph( inputs, output_shapes: List[tuple], dump_name: str, dump_data: bytes, ) -> List[Tensor]: diff --git a/python_module/megengine/module/external.py b/python_module/megengine/module/external.py index a5da2a14..962754e8 100644 --- a/python_module/megengine/module/external.py +++ b/python_module/megengine/module/external.py @@ -8,7 +8,11 @@ # "AS IS" BASIS, WITHOUT ARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. import numpy as np -from ..functional.external import cambricon_subgraph, extern_opr_subgraph +from ..functional.external import ( + atlas_subgraph, + cambricon_subgraph, + extern_opr_subgraph, +) from .module import Module @@ -41,6 +45,29 @@ class CambriconSubgraph(Module): return outputs +class AtlasSubgraph(Module): + r"""Load a serialized Atlas subgraph. + + See :func:`~.atlas_subgraph` for more details. + """ + + def __init__(self, data): + super(AtlasSubgraph, self).__init__() + self._data = data + + @property + def data(self): + return self._data.tobytes() + + @data.setter + def data(self, val): + self._data = np.frombuffer(val, dtype=np.uint8) + + def forward(self, inputs): + outputs = atlas_subgraph(inputs, self._data) + return outputs + + class ExternOprSubgraph(Module): r"""Load a serialized extern opr subgraph. """ diff --git a/python_module/test/unit/module/AtlasRuntimeOprTest.basic.om b/python_module/test/unit/module/AtlasRuntimeOprTest.basic.om new file mode 100644 index 0000000000000000000000000000000000000000..942fe2edff071b681433616ea0de43b30aa9cb29 GIT binary patch literal 32916 zcmV*EfNOtAO;1Ds0RR91000mG0000000000000000000000000000000000000000 z000000000000000000000000000000000000001#e*gdg0001OZ)9a`0000000000 z00000000000000000000000000000000000000000000000000000000000000000 z000020000nE-^7KdM+>k000000000000001000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z0000400000000000001;CjbBe0001;CjbBdCIA2f0001;O#lEBDgXci00026cK`se z2LJ#H1#NF+Wo!@v8VE5iF)=QBE-*ToI|>JFZ)9a`UobMb0}26T5(GqHbYUt0QV$9V zWMOn+UvznJWfB4y08$$Y5?^n1bZ~WaUv6P-WnXq-Y;|Q41quTi0RU1N3J_m!b#!ob zbYE^^ZDn6;WqA?>3Ih@Wc~Th)4Np~6P*qf4NmE}|K~fS33I-|x0H6T`QXvWzUukY| zb#z~DVQpn!X=Hd`c42IFWfBMq1{whXpaB9>6ABG!b6;j@a&vTFZf|5|5&|dzQXdKv zUukY|b#z~DVQpn!X=Hd`Yh`&72nq%g0eGMR0iXc^(g6%~a$#MO;Z*py6bP@&<1WrRpS4aU+ zfM9Y1PEb{n0-6C30U8Dh1Ox*R5F!LlLr7OD7YYq;a%pF2ZeM0^a&2LB5(W|kPD4mn zDjNz6Z*pm8X>MP0Xkl<=5(^3m8UzFb5D=gN0xA&-3v*~;aAjX|VQyz-5(07nDjo_D zZ*pm8X>MO+VRT_%ba`-P5(*LsL{wi!Oiw{nDiR6|X>Mj^a$ja|a&2LB5&{?lNC8lw zU~&UaP*s2d1Tygl3Ji2|VQzC@Lt%4tUoa8`Lt%4tDg$IXFj5!_5?^j_WMyA&Wo2Yv zV{dJ6X>4T@0w@7eA_^3Aa$#(;#A_^RI zVr5@%a9?3`Z*6H~Uw3bEYjbd6V`X1vY++{-0vG^N9SRV2Vqal&Z*6H~UvOb^VQq5~ z2?_@q0ssJ@0RmDG3JPg$aBO*Bba`-P5&{?jQa}n9baG*Cb6-PYb97%YUu$J@Ze?t4 zVQpm+B@!caWnW`qb97%~HDfh0HezNlGGk#mVlXgYG+$q9WpZw1Y%o$63K3svb6;*> zVqtV+XkT-1Y-w~70w@7eBnlf}WMOn+WOZ$DUvF}0XK8L>Y+rA1Uv6P-Wpfe*3Im`4 z0a6zV5o2#|bZKsNZ*_BDZ*_EVb#xK}C;(C$3KCy$b#!obbYE^^ZDn6}VQh6}5(Nqa z8UX-O3JL^7b97V^0vG{OAqo&*Z*_EVb#z~DVQpn!Yh`&74GIeq3144tb#!obbTCpG z3Jp(HR8Un^UrAG6RzXq{2nq%&0RW%@1X3Fc5nppAe$7y?ob3J7F#bYFCNaAgt#7y(if3Jqy0w@7e7YYt(b6;t0aCLNFV{dMAbP@#$1E2u}QWy#hNls8zR9{I`Usgd<5(o+g zDggkX0R&PM3JzapWnXD+aBO*Bba`-P5&{?oQWgpjV{dMBX>N6Ib#q^7Zg6#U5&|dy zQVt3TbaHiWV_|e<5&|dyQXvWzUukY|b#z~DVQpn!X=Hd`c42IFWfBMq1{whXpaB9> zCJG63c5Pp6VP|P$5*ZQ~QdD0=MOI%zNlrmhSzk>-M@d6pMNCFg3JL^Ma${5y0vG^N zCJGZ@X>M?JbYE^^ZDn6+WO!d|WqA@03JnqnUtei%aCLMrpaB7(0RgB10lEPjZe@30 zb9G{0XL4b1Xfa<a%pF2 zZeMd~VQ^&<3knGu1Ox*R5TF49NC8lwFmeM@0vG~P7YYt(b6;t0aCLNFV{dMAbP@#$1E2u}QWy#hNls8zR9{I`Usgd<5(o+g zDggkX0R&PM3JzapWnXD+aBO*Bba`-P5&{?oQWgpjV{dMBX>N6Ib#q^7Zg6#U5&|dy zQXvWzUukY|b#z~DVQpn!X=Hd`c42IFWfBMq1{whXpaB9>5(*4yZg6#UUuJJ|ZDDj0 z0vG^NCJG63c5Pp6VP|P$5*ZQ~QdD0=MOI%zNlrmhSzk>-M@d6pMNCFgCJGZ@X>M?J zbYE^^ZDn6+WO!d|WqA@03JnqnUtei%aCLMrpaB6=7zz?!Zf|5|Uv6b(WM5-%ZE$I9 zWfB4?0a79g9CTu3UvF?(t0Ut(c&V`yJ?2TnsV zNLNEJpaB7>0Rp-K40Li~ZgXElVRLj}Fv0;0baG*Cb6-PYb97%Y$^iiY(g6iyZ*F!m z+5rIo;sFDIgaYaT0RV~ucMt*^1_}fO0}v1*1WrRpS1KC{3~zF2XK8LMP0Xkl<=5(^3m8UzFb z5D=gN0!RT+pnw8$15Qv?fB^+Eq5}#KWO;63ZE0g)V{dMAbYC(O1w(Icb97Q93L9T! zVRT_+b!~88Z*pm8X>MU`UvF?(s`Zg6#UUt@1>b952~ z3Im`41X3Fc5?^n1bZ~WaUv6P-WnXq-Y;|Q41quTi0RU1V3J_m!b#!obbYE^^ZDn6; zWqA?}3JVemUte!^bZ~WaFj5%`4Np~6P*qf4NmE}|K~fS33I-|x0H6T`QW6RbX>(s} zVRLj}Zf|5|5&|dzQfUeWc42IFWfEXwUJ6_g0vZMi1PKBV5F!aiQb9vhK}=s-DjNz6 zZ*pm8X>MP0Xkl<=5(^3m8Uzso0|TG|0xA~@4R3O3XK8LtE0qOw(0FnY&5CR$o3IquP5D+2> zMp8jTR6$H%S}Gd~3~zF2XK8Lb97%aIxtcf3K3svb6;*>VqtV+XkT-1Y-w~7 z0w@7e7YY$$Z*FvHZgp>Ub6;5)45}V{dY0MQ&$lZe>y$3KU;yb6;j@a&vTFY+-q2 za$jR_Zgvs^C;?JC3J_y&Zgw$WYh`k7Wo&L?ZDkTC5+!tHUt@1>b~0pNVl`tmGB#pn zFfwCdIbtv{Uoc-^Yh`k7Wo$4~6AA=yVPta>3knGu1ONa40H6T^QW**mUvG7EaCLNF zZeeX@Uu$J~5(Nqa5&?Nq843+gRa8(_R9{I`Usgd<5(o+gDggkX0R&PT3Jhj-b7^mG zUvpz`aAgt;82|tO|NsC0|Nj9}777P*baH8AWpfe>3JDqn0RaI4paB9>8wwF$b7gaL zX>V>{XL4b1XkTe$5(W|kEiqp(QXUEoV{dMDF<)?DbaZ8MZW0X=3qx;ic5iHTbZKvH zQW6RbbariDVr*|?Yh-C{5&{?kQX2{mX>(s`Zg6#UUt@1>b95333I{3z00E!@1X39a z3`tHN6Ib#q^7Zg6#U5&|dyQWXjdWMOn+ zUuJJ|ZDDj01`-5LLr7OrBnlN@X>M?JbYE^^ZDn6+WO!e8VQh6}5(^3m8Uz9X0|1}_ z0#XbL24`|_b#QYM0vG{OCJG63c5Pp6VP|P$5*ZQ~QdD0=MOI%zNlrmhSzk>-M@d6p zMNCFg84440c5Po{VPj}zUvgz(WM6G>WMvWp7y(i@3KL&xZg6#UUv6P-WnXDzcwcK} zc@iKB9ufp%X<>5`24-n&bY*f92ybR)b7gd2cM<`3paB6=4hjfwW@d9`bYFN90vG^N zA_^RIVr5@%a9?3`Z*6H~Uw3bEYjbd6V`X1vY++{-0vG^N8VVG2c5Pp8a%pF2ZeM9` zaCLNFZgp)E0vG{OBMJ&%Z*X*9X>M?JbP^Q`6A}bsX<>5`2ybR)b7gd2cc1|QQXUEr zbz)y(bZ>2GV_$G#a$#+A5()|k8Up|T0H6T^QVD+9d0%vSaAgt#7y+OG0jL24 zx&aY%a$#b97%a$^ilZ0MY>wbaG*Cb6-?) zVQzCoVRT_%G}-|H0OA1x008O%1Av4Af&u~n0g3{{0T2Qj2MPrQ0T2)nA_q=GF-TWK zFe)1g3~zF2XK8L?4R3O3XK8LMp8jTR6$H%S}GR`4R3O3 zXK8LP4iF*-PD3$B zS3@u=7YYq;a%pF2ZeM0^a&2LB5(W|kPD4mnDjNz6Z*pm8X>MP0Xkl<=5(^3m8UzFp z4i2CJ0xA&-3v*~;aAjX|VQyz-5(07nDjo_DZ*pm8X>MO+VRT_%ba`-P5(*LsL{wi! zOiw{nDiR6|X>Mj^a$ja|a&2LB5&{?lNC8lwhy!v1PEb{V0R%Fp2nrE&a$#3IQWy#nUv6(?WnXS(Wn^DtZ*6dCY-JJx zC;?I;3LJD|WnXV_Utx4_ZE0g)cW-iQb8ul}WnX4&VP_Ho7ywce3Jq^{bZ~WaUuJJ| zZDDj00vG^N9SRV2Vqal&Z*6H~UvOb^VQq5~2?_@q0ssJ@0RmDG3JPg$aBO*Bba`-P z5&{?jQWpvlUukn+ZeLUb6;@0vG~P7YYt(b6;t0 zaCLNFV{dMAbP@#$1E2u}QWy#hNls8zR9{I`Usgd<5(o+gDggkX0R&PM3JzapWnXD+ zaBO*Bba`-P5&{?oQWgpjV{dMBX>N6Ib#q^7Zg6#U5&|dyQXvWzUukY|b#z~DVQpn! zX=Hd`c42IFWfBMq1{whXpaB9>5(*4yZg6#UUuJJ|ZDDj00vH2QB?=jIa$#MP0Xkl<=5(^3m8UzFp z4i2CJ0xA~@4R3O3XK8LM?JbZupA zUuMP0Xkl<=5(^3m8UzFp4i2CJ0!RT+ zz|aA515Qv?fB^(Ds0a!SbaG*Cb6-PYb97%d5(GnGb95>bbaG*Cb6-?)VQzCoVRT_% zG&(R+Bnlf}WMOn+WOZ$DUvF}0XK8L>Y+rA1Uv6P-Wpfe*3Im`40a6zV5npL@Uv6Jw zVRU0?UvqG5X><|-C;?Iz3K3&(ZggpGb#HZZUvG7EaCLMN0w@4d8wwI%Z*_EVb#z~D zVQpn!c42IFWfBDn0~!GUQVI$LM00dh5&{?iQa}n9baG*Cb6-PYb97%dUu$J@Ze?t4 zVQpm+B@!caWnW`qb97%~HDfh0HezNlGGk#mVlXgYF<)P6WpZw1Y%o$G3J_m!b#!ob zbYE^^ZDn6;WqA?}3JVemUte!^bZ~WaFj5%`4Np~6P*qf4NmE}|K~fS33I-|x0H6T` zQX&czbaG*Cb6-PYb97%dUvOb`bY*gG5(*LsMQmklS7~!)QX2{pUvp)1b7^mGUuSY* zaA;p?WD*7v1T8UNFj5i<3~6&;Y+-YBUv6(?WfB4?0a6kQ40LvFUt(-;V{2q-Z4v?) z0#XhN2xN0~UvznJWfB4y08$qU4ry~=X>M?JbYEj{ZgX@J1quV80R&PQ3Jgh3P*qf4 zNmE}|K~fS33I-|x0H6T`QWOdfUuI=rX>D+9d0%vSaAgt#7zR=f3J7#^b#7x}bY&6( zC;(Cx3J_y&ZggpGb#HZZUukY|b#xK}C;(C+3Kd^zZg6#UUv6P-WnXDzcwcs5Y;|Q4 z2nq%o0RW%@0#YUl33PUCUu|J$X=4%@5*JcbUqnS#UqVSvK~h;?O+iOVLtjNqMp6n2 z1XFTjR1yLh0a7Lk6JKd=aCLNFZeeX@Uuk4`Uu$J~5)TRu5(r;kX>M?JbTFU+0a6$W z5?^j_WMyA&Wo2YvV{dJ6X>4T@0w@7eA_^RIVr5@%a9?3`Z*6H~Uw3bEYjbd6V`X1v zY++{-0vG^N9SRV2Vqal&Z*6H~UvOb^VQq5~2?_@q0ssJ@0RmDG3JPg$aBO*Bba`-P z5&{?jpaB7>0S3AO5p;54ZgXE$a$#a%pF2ZeMd~VQ^&<3knGu1OyQd4xj-7Di;b3Z*pm8X>MO;Z*py6bP@&< z1WrRpS1KY39BFf3Wo~3&Z)RU za%pF2ZeMd~VQ^&<3knGu1OyQd4xj-7NC8mbpaXIPPEb{V0R%Fx1qu;uZ)9a`Uruji zWnWKqbZ~Wa5(!RabWe43aCLMl4s>#1ZgXElVRLj}H99a-Bnlf}WMOn+WOZ$DUvF}0 zXK8L>Y+rA1Uv6P-Wpfe*3Im`40a6+Y4ry~=X>M?JbYEj{ZgX@J2nq%&0RW%@1X36Z z3`tHwvWkqghX>MgwAqo{=X>M?JbYE^^ zZDn6+WO!e8VQh6}5(o+g8UX;H0RmDI3Jhs;UubYE_7WMvWpC;?Iv3Jqy0w@7eCJGZ@X>M?JbYE^^ZDn6+WO!d|WqA@03JnqnUtei%aCLMrpaB7( z0RgB12f6_pZe@30b9G{0XL4b1Xft0>Y+++%NN;RpWpXmY0St6H!0QkOhJQ0RV~uhXD`)8U_jk1Q8AnA_PuDNLMNw3Jh;@X=iC}Uvp?- zaAgt;3JDqn1Q8AnpaB9Z7YYq;a%pF2ZeM0^a&2LB5(W|kPD4mnDiI0`b7*03WnXe( zZf9i@0&)N<9tsd|a%pF2ZeL_!bYWj~d2nSC3K9rJR9{9+PeD{j0Z`ze19AgSP*s2d z1d;+{5CIwhA_PuDNLMNq3Jh;@X=iC}Uvp?-aAgt&3Im`40xA~@4R3O3XK8LV>{XL4b1XkTe$5(W|kEiqp(S|ADZpC;(ay3JGO)Wo~p|Zgp)E0vG^VAPN?AVRLI=XJu|*c42a9VPb4$Utwfq zauNm@fPjF2Fj^c65_Dm6YhPz&ZeLVfPfTQ5(*1H=C53JrE)a%o{=Y-L|_X?kT60vG^V6$%S zbYFCNaAgt(5(G_2PDxrG3KVo3II%98cb}^s<0a_3W3UhRF zWnpb!Zgp)E0vG{Wy$=cnbYXLAa}u);I000010sjF20000000000 z0000000000000000RI3000000000000000000000000000RI30000000000000000 z00000000000RI3000000000000000000000000000RI3000000000000000000000 z000000RI3000000000000000000000000000RI300000000062000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z000000000000000005W*h?&TYuhlA2i36em`~nIM2m&AkG6DbqH~~Td1X2nuF<&rW zV{dMDF<1g%NNPv`002M%0000uH)isxssI20f&f4P0000000000000000000000030 z|NsC0|Ns900000000001000000000000IC20001TkOBYz06+l%001C>0000100961 z000000001j06+l%001Dw000010sjF200000000000000000000000000RI3000000 z000000000000000000000RI3000000000000000000000000000RI300000000000 z0000000000000000RI3000000000000000000000000000RI30000000000000000 z00000000000RI3000000000620000000000000000000000000000000000000000 z0000000000000000000000000000000000000000000000000000000005W*h?&TY zuhlA2{Q{x^@B#`A2m&AlG6DbqH~~Td1yU9*F<&rWbaG*Cb6-?)VQzCoVRT_%G*|*) zFlsOWf&f4P00000002M%0000000000000000000000001000000000000IC20001T zkOBaL06+l%001Dw0000100961000000000006+l%002N}000010sjF20000000000 z0000000000000000RI3000000000000000000000000000RI30000000000000000 z00000000000RI3000000000000000000000000000RI3000000000000000000000 z000000RI3000000000000000000000000000RI300000000062000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z000000000000000005W*h?&TYuhlA2_yVE<>jDZ52m&AmG6DbqH~~Td22v3%F<&rW zbaG*Cb6-PYb97%dSOQ=$YA^r*06+l%0000;0YCu&0000000000000000000000960 z|NsC0|Nj6000000004530ssI2Kmh;%06=H}000310RR9100000000000000000000 z00000{{R300000000000000000000000000{{R300000000000000000000000000 z{{R300000000000000000000000000{{R300000000000000000000000000{{R30 z0000000000000000000000000{{R300000000000000000000000000{{R3000000 z00IC2000000000000000000000000000000000000000000000000000000000000 z000000000000000000000000000000000000GI-ZnaGT<)hbd85CoV4h?&TYuhlA2 z3lI~S0@%HrkFV7#Sb&%baDYr&4+;rvVPa)$Uv7165&{?iS{VuuXmw|0UvqSFWnpb! zY-w|J5(NqapaB9}6ABA$Wo>VAd0%sBdSwy>7=V}wS{w=$dS!BNUt@1@d0%a1ZEtdU zUvp`CWfB7zfMi;e0SXdyVRLI=X>Md?cwcXDUv6P-WfFY~dlC$Ea$#5VQzC@Lt%4tUo{dDZEs{{Y+p`qWMyAZb#!ob zbf5tN000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z000000000000000000000000000000000000000000000000000000000000rL>`~ z^soQ`000000000000000000000000000000S(V|QuPy)p00000000000000000000 z000000000094urkzO4WN000000000000000000000000000000k})DK*s%Zr00000 z00000000000000000000000000kj#aP%r=h000000000000000000000000000000 z!>J;)DKP*5000000000000000000000000000000@3M9=TQdLv000000000000000 z000000000000000_$gbhj5YuO000000000000000000000000000000mM~*7j<5g# z0000000000000000000000000000003$vE1$t3^)0000000000000000000000000 z000004y{i#53>LO000000000000000000000000000000F|FRNh%f*E0000000000 z00000000000000000000nlKxwNUQ(=000000000000000000000000000000o}1${ z2QvTw0000000000000000000000000000004l|@H0I>i700000000000000000000 z0000000000FsRuxC9(hj000000000000000000000000000000;Vm~TY`6db00000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z0000000000000000000000000000000000000000b1644DLDWD000000000000000 z000000000000000`K)*|dNTk3000000000000000000000000000000=q(;GtDpb? z000000000000000000000000000000z%aV4p{f7?0000000000000000000000000 z00000ZnVd?LofgU000000000000000000000000000000aIzXMzbya&0000000000 z00000000000000000000!>4hv_pSf{000000000000000000000000000000W;Uv> zl`sGR000000000000000000000000000000J+!|n`kep(00000000000000000000 z0000000000+pUDK466VD0000000000000000000000000000003@ceIp)mje00000 z00000000000000000000000004=@ER!ZH8=000000000000000000000000000000 zUbP7**E0YB000000000000000000000000000000zcVr=5ibA$000000000000000 z0000000000000008n(0}zbpU%0000000000000000000000000000000WKFV_@)2= z000000000000000000000000000000(5(731gro60000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000e>C5#zU-000000000000000000000000000000JhMzKHn0Ey00000 z0000000000000000000000000%(THXBs2g3000000000000000000000000000000 zEH+UxpE3Xd000000000000000000000000000000eXk5LHZTAH000000000000000 z000000000000000L@v`YqB8&h000000000000000000000000000000!Yu~0lB)m! z0000000000000000000000000000008nHSm0j>Z50000000000000000000000000 z00000oF)aeJ000000000000000 z000000000000000At8w%@Gk%W0000000000000000000000000000001Fn;oHfXShfHF000000000000000000000000000000)-C}v2(ADC00000 z0000000000000000000000000Ij@|mhc*BJ000000000000000000000000000000 z*eSS$bl00000000000000000000 z0000000000h%68usWSio000000000000000000000000000000G_7nlD>48800000 z00000000000000000000000000kAtaFSY;x000000000000000000000000000000 zL$N?KwlM$z000000000000000000000000000000F0q!ZQLX?0000000000000000 z000000000000000gsH8r8883<000000000000000000000000000000WUsHSy{`ZO z000000000000000000000000000000__L8LUn&3q0000000000000000000000000 z00000?=N4qB_sd<000000000000000000000000000000LM?tPE;RrE0000000000 z00000000000000000000gENmIhpqqs000000000000000000000000000000bs<$P zt*`(9000000000000000000000000000000eldG61h4=A00000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z0000000000000000000000000V6(d~wI=`o000000000000000000000000000000 zg0#A;nJxeT000000000000000000000000000000LMTHt=`{cV000000000000000 z000000000000000JgFBgTQvXx000000000000000000000000000000Ke)Xq1vLNw z0000000000000000000000000000002C5pXPOJa`0000000000000000000000000 z00000Mn{KR000000000000000000000000000000rZV<5IIjQz00000000000000000000 z0000000000Ml|!XkTC!N000000000000000000000000000000qO)fyKA`{r00000 z00000000000000000000000007%#r5^D+Pc000000000000000000000000000000 zy)B6}V!Ne8 zrnCS6000000000000000000000000000000pfcqyYOVkP00000000000000000000 z0000000000x3GJqoU8x<000000000000000000000000000000KrWjv$t(Z>00000 z00000000000000000000000000kr2SF|7aq000000000000000000000000000000 zP_e)=1Tz2t0000000000000000000000000000006t=oB|E>T4000000000000000 z000000000000000qcXcD3$6eF000000000000000000000000000000^eA4lNU#6^ z000000000000000000000000000000zCNcm3000000000000000000000000000000TC68Awk`kw z000000000000000000000000000000{4stam@)tW0000000000000000000000000 z00000FdkU50y6*r0000000000000000000000000000005VU8igtPzv0000000000 z00000000000000000000Vz5>&p)3FZ0000000000000000000000000000004>R8| zptJx0000000000000000000000000000000Q?T+jVlV&z00000000000000000000 z0000000000fUQ(50Wtsp0000000000000000000000000000001g;}D6fyt+00000 z0000000000000000000000000b}-K~hM)id000000000000000000000000000000 z!Ll5#S0w-d000000000000000000000000000000Bq`Ii4Y2?K000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z000000000000000000000000000000!m`^YJT?FT0000000000000000000000000 z00000ov$1-SEm2~000000000000000000000000000000@TVB5ucQC~0000000000 z00000000000000000000?>4ZpEhqp0000000000000000000000000000000ceBE@ z3Nioy000000000000000000000000000000q_vx_3N8Qu00000000000000000000 z0000000000E~;-dOfUcd0000000000000000000000000000003b6mEO{4$-00000 z0000000000000000000000000yEAyO(<=Y~000000000000000000000000000000 zpSOH0TCe~B000000000000000000000000000000d8LA>60iUO000000000000000 z000000000000000o;0AQAhZAg000000000000000000000000000000X0Cm#z_tJY z000000000000000000000000000000-?GdvN2CA%0000000000000000000000000 z000003AFhjVW|KB000000000000000000000000000000J2aE91S|jm0000000000 z00000000000000000000RkQo1?WzC(00000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z0000000000{cd+%3;+NC@B{z=baG*Cb6-PYb97%de??420s#R400000000000RSlw z0RR9100000000000000000000FarPp0000000000KmY&$002M$2LJ&80RR98fB*mj z!2dc2002OM0|0vmfB-;%0N6bOA^-vhfJguW0RTe>fB<@Q000OF01%)+01&`H5YWv7 zDA2_NE@A)xAkfDH7|_cD2++X;0MNq&3jiQMfG7_F0RRvOfN{0BQ^Z z4q^ZR0{|dEfan4Off51$E;0ZB3;-ZNfG7z90RRdIfI-LtKr+e#ibBQ!06GQ&000OF z4l)1$0{|dEfam}M0RaF20RRLCfFJ|{hyXx<2mnBUfH(#MH~%2tQ1M5C8-RK?6kxfCivIfCj)o01?1)fG7Y000;sC zumVB?{|^KQ3K7BpjuHR>02tsv2ml~JzPbVjt=>Zi@4kZvt=_{208qjN2vEQT004kN z003Y?05UK#FfA}PEiyD9GBP?eG&(dlAS*C9FfbrvY+-I^Aa-SPb7^mGAUG~CE-@e= zC}LrAWn>_4ZXirdR!tx{E-)@JDF6Tf00000000000000000000000000000000000 zE&u=k1OV~>00000000000000000000Q2+n{0009300000000000000000000dH?_b z0006200000000000000000000RsaA15&!}K0000000000tN{Q30000004{W8cys_R zV{dJ3Wo~o;E^cphWiCffRV{OLVPk6mE^KUeZC_zzWO8$9X8>(^Uu$J@Ze?s=V{dY0 zE@NY504{TMa&%#004{TRZFFH`03>8CF#vRBUt?i&bYEgMV>L21VrDQhV_`XBFfd;+ zUteowa&Bd8FaRWYE-(N9000000000000000000000000000000000000000000000 z00000000000000000000000000000000000K>z>%0{{R300000000000000000000 zumS)800000e*gdg0000000000000000RR910000000000000000RR910RR911^@s6 z000000000000000KmY&$00000tN{Q30000000000000001ONa4000000000000000 z2LJ#70RR91FaQ7m000000000000000>;V7(00000MgRZ+0000000000000000RR91 z000000RR91000005C8xG0RR9100000000000000000000G6Dbq000000000000000 z00000000000RR91000000000000000AOHXW15E#K0001h000000000000000umS)8 z0000000000000001^@s6000000RR91000000000000000NdN!<0ssI20000000000 z0000000000I066w00000cmMzZ000000RR911ONa42mk;8000007ytkO00000{cd+% z5dZ)HKobA}baG*Cb6-?)VQzCoVRT_%G=D`*Mgjo=00000000000096g5CH%H00000 z0000000000000000Duty000000000006+i$0000$00#g8009612Y>(o0>J+|2LJ#- zfCB(~2Y>)TfB@J%0wMqc2Y^Tb0s#O+2Y>*2bN~Pd2LKSDKmZWHKoHQ)11QkN11@3! z03guE0~pZD0|?N;0|3y&0}B8kK!7L@0s#OJ2Y_+T0zhKW0t$4@003$X0uEvT00RIZ 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 zKmZn?KmhA()2Z0(Y0097P2LM}5bN~%32Ln4N0Dw8C0s#W% z0)aUu000o6KmZWHKmY*XKmcHB0{{TvK!`DG1ONcwKp z0{{TvK#VbK1ONcwKww~M0{{TvK#nnM1ONcwK!9Ls0{{TvK#(zO1ONcwK%ii10{{Tv zK$0fKmZoNKmh<82Laa_000df2LXo=0G`zV00GAs0M7m(K!7L!0st7` zKmZ5=0z??K>#u^GB7PLHZ3wVATlyKG&DLiHy|r8I503EV{Bn=XCQWEa&u{K zZXh@=FfK75AShyCb7f>8Z*Cw=Ojb=GI4&?QF)0850000000000000000000000000 z000000000004@Lk00aQ>{{R3000000000000000008sz{00003000000000000000 z000000Dk}g000020000000000000000000009F7101^NK00000000000Q3(400000 z001s@Wq5P|E@N+PZDnqB04{ECbY(6_PE{>)bYWv_04{87c5Po_WMp!4X=ea!d0%T~ za&Bd8Ut@1_WiDf5WdJU7baHfIVgN34d2MuIVgMv$E-?UfWnXl1VQzC|VRT_%Vl`tm zGB#pnFfwCdIbtv{Uou}`Yh`k7Wo$42BzP_`000000000000000000000000000000 z000000000000000000000000000000000000000000000000000000006_o%00RI3 z000000000000000000000Qe99000000E7Sl000000000000000009610000000000 z00000009610096100sa600000000000000006+i$000000Q3(4000000000000000 z00aO400000000000000000#g70096105AXm00000000000000005lK)0000007d`+ z0000000000000000096100000009610000001yBG0096100000000000000000000 z0D2Gr00000000000000000000000000096100000000000000003ZMW00T__ZvX%Q zfB*mh00000000000Qe9900000000000000000sa60000000961000000000000000 z07(D<00IC2000000000000000000000Duqx000000C)fZ000000096100aO400;m8 z0000002lxO000000R3)vT?GID0Eh+v0Ap`%b}@fNOhy6$0RR910000000031DG&hw z000000000000000000000077Y0000000000002M$00000KmZ2-0RRC200)2o00N-@ zItKs%K!5`Pdk263K!5<)JpwWS0tbLd00IF3LkEBWdUOB)4hH}bpg;f+z(5$#(*r=z z#RIOB00219$pbLZ!viSL%>y9N(E||B!2<};%L4$=#{&xhAV7d96#@YO76*W#)B-?~ z)&h#9(f|OO5(18s00093AV7fV1_A*z1^}*O000aCAV7d94*~%I5C?#9&H_MU&;kl{ z%m4st3<3ZE4hN2700093AV7fV3Ic&p3IG5A0tc=@000XBAV7d94FUlG4hMi?%mP3{ z&H{>K$N&IJ2m+2k00093AV7fV00IF40000PECLV!3ah7zY3ipg;p4SqA_Oz(4?i*#|Ho#P9$B8V3MQ2nT=(pg;ftTL%CD90!ahNMiv3 zT?YVA9tQvbAO{R5USk3QVFv(GA_oj8Vq*Xepg_<7BnJQuz(4~aWd{HZCI`q##P9$B zC3X$JrRDhCWIL}LL0YX<-TEC-A#N@D^7Z3hf1Ok)5Ipg;f(z(4>PE(ZVr zG6%>j#P9$yvj>0(pg@Cs4gi1&pg<4+Fb9ALz(5)RaR(4AM0NmpI07I5ItQNuI0D1~ zdj|myH~L21VrDQhV_`XBFfd;*Uteowa&Bd8FaRWYE-(N9 z00000000000000000000000000000000000000000000000000000000000000000 z00000000000000000000002P%0009300000000000000000000002M)00000004mi z000000000000000000310000000000000000003100031000I6000000000000000 z002M$00000002A#000000000000000000C4000000000000000000L700031001xm z000000000000000004Xg00000002e+00000000000000000031000000003100000 z000mG0003100000000000000000000006=R000000000000000000000000000031 z000000000000000001BW0009_|8D>Q0Du4h0000000000002M)000000000000000 z000I60000000031000000000000000002n<00062000000000000000000000077X z00000004LZ0000000031000C4000O800000000;O00000008}NcU=(x000;U004Ay zVQzC@RB~Z%b3|cuVP7$SMNCEl0RaF2000000000104Wdw00000000000000000000 z000131ONa4000000000$0000006+i-00962000Mo0008O|2hW%06>5P0DA|306>5M z*gXOw00IYqNB{x>07D0W0D5!)00;*F5THN+5WqkX(9HuV(8U8TVgLXj(8mK9(8~h| z(7^)$(8B`@03bksC=UVw01yX&an1rjV$cE#bj$z%Y77DnVgLXG03bks=mG+P5&{4& zG5`P!03bksC5s06>6%I0OPX00svDG{gb`DFy-n0tN>F00aksApn2?1`-DV1PBKJ z3JM1R2n+`R5)=mj5Do_b6cz`NL;!#QAQ%UrVgP^u4hjbV3=9XbVgP^u1mHjbbpn6@ z78C~%wE}5s06>5N01yWO z08s}B2$2T>8qo(Jpi+W>7!m>i0~7}Xl@tH~01yWZ0@4D2sgwc%0@MNk1mHjc6#@Vd z02BuR2EafN096M76;O165f%V|nUVql0@4D31ONaK01^iP0aFJ76AS=>5()qSwMKLS z5*7e~69NDLwMcXj02T)U09OY95Z4EQ5THPS5WqmJ21J5@2B1Iy2B1KI2Eago#K3ZZ z6rex=2Eaf7Wl(egRYr9G4+aMS6-aadKmrGW0001h5THPS6u>}$5WqmJ21J5@2B1KI z2Eago#K3ZZC;$Qg2m%7I0zv|c5yAit5dZ)H7~nt%03blVx&jBS-a`lPzJmv?-opm~ zAi@L)Aix9w0DwUN0AN7?GB7eQEig7MGBhAEGCDLgIy5&RD=;`PFd$=WVQyz2c4cyN zX>V>II4&?QF(4o)VqtS-WFT*DAWTeFO&~ZfFfK7E0000000000000000000000000 z00000000000000k000040P+6-0000000000000000000{0000000RI30000000000 z000000001g0000000IC2000000000000000000110000I00IC2000000002Y0ssI2 z00000E_7vhbO0`6Z*6U5Zgc=HZf|sDE=NvPEpv2XV`~5|Y;1OIUtwfqa&u{C0Bw0+ zYh`k7Wo%z#Z*pZWV`F6iE^~BpbYWruE^~QpbYWruBxEiz0CZ(vbaG*Cb7Wz3VP9f3 zV>L21VrDQhV_`XBFfd;;Uteowa&Bd8FaRWYE-(N90000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000%00003 z000000000000000000000002c0{{R30001l000000000000000000010000000000 z000000000100001000060000000000000000000$000000002Y0ssI20000000000 z0000400000000000000000007000010000m0000000000000000000C0{{R30000+ z000000000000000000010000000001000000000G0000100000000000000000000 z0000|0{{R300000000000000000000000010000000000000000000W00003O#g2H z004jh00000000000002c0{{R30000000000000060000000001000000000000000 z0000<0000200000000000000000000000130{{R30001Z00000000010000400008 z000000000O000000002}Zg*V_0002U1ONbZa$#5P0DA|306>5M*gXOw00IYqNB{x>07D0W0D5!)00;*F5THN+ z5WqkX(9HuV(8U8TVgLXj(8mK9(8~h|(7^)$(8B`@03bksC=UVw01yX&an1rjV$cE# zbj$z%Y77DnVgLXG03bks=mG+P5&{4&G5`P!03bksC5U06>6%I0gbZ00;*F015{H zM8*Pu7zhFY28#!SLI?l=IR*j%00svDND2a;0ty0w5&{4a015}d080me5=L|Y015{H z7y<{M0tf;D0ssJj5THPm06>5U06>5N00ajC07VA`2!#iL5WqkH7{vz&KLUaf00akM z07VCY2B1KI2Eaf75x{bQC;$Qg2m%7I0zv}+4+IAa5yAkD5&!@I7~nt%03blVx&jBS z-a`lPzJmv?-opm~P{ITVP{0HL0DwUN0AN7?GB7eQEig7MGBhAEGCDLgIy5&RD=;`P zFd$=WVQyz2c4cyNX>V>II4&?QF(4o)VqtS-WFT*DAWTeFO&~ZfFfK7E0000000000 z000000000000000000000000k000040P+6-0000000000000000000{0000000RI3 z0000000000000000001b0000000IC2000000000000000000110000I00IC200000 z0001p0RR9100000E_7vhbO0`6Z*6U5Zgc=HZf|sDE=NvPEpv2XV`~5|Y;1OIUtwfq za&u{C0Bw0+Yh`k7Wo%z#Z*pZWV`F6iE^~BpbYWruE^~QpbYWruBxEiz0CZ(vV_|c2 zUt%?5H8M70W-u~iVL4(jFkduZUu$J@Ze?sR03>)WFaQ7m00000000000000000000 z00000000000000000000000000000000000000000000000000000000000%00003 z000000000000000000000001p0ssI20001g000000000000000000010000000000 z000000000100001000060000000000000000000$000000001p0RR910000000000 z0000400000000000000000007000010000m0000000000000000002U0RR910000+ z000000000000000000010000000001000000000G0000100000000000000000000 z0000E0ssI200000000000000000000000010000000000000000000W00003O#g2H z004jh00000000000001p0ssI20000000000000060000000001000000000000000 z0000<00002000000000000000000000000G0ssI20001Z00000000010000400008 z000000000O000000000|3lIaC0*IN&jIY%yQuqR*0qX(^4G01t0Wtyr05}0c0Rd7G zEiqp(UvzR|ZgXElVRLj}FjxX$FlsOW8UjE800000f&f4P00030|NsC0|Ns9000000 z000000000000000000000001TkOBaL06+l%001Bu000010sjC1000000000000000 z00000000000RI3000000000000000000000000000RI3000000000000000000000 z000000RI3000000000000000000000000000RI300000000000000000000000000 z0RI3000000000000000000000000000RI3000000000000000000000000000RI30 z00000000620000000000000000000000000000000000000000000000000000000 z0000000000000000000000000000000000000000005W*h?&TYuhlA2{Q{x^@B#`A z2m&AiG6DbqH~~Td0#X(&F<&rWbaG*Cb6-?)VQzCoVRT_%F<1g%FlsOWf&f4P00000 z002M%0000000000000000000000001000000000000IC20001TkOBaL06+l%001Bu z0000100000000000000006+l%001C>000010sjF20000000000000000000000000 z0RI3000000000000000000000000000RI3000000000000000000000000000RI30 z00000000000000000000000000RI3000000000000000000000000000RI3000000 z000000000000000000000RI300000000062000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z005W*h?&TYuhlA2i36em`~nIM2m&AkG6DbqH~~Td1X2nuF<&rWV{dMDF<1g%NNPv` z002M%0000uH)isxssI20f&f4P0000000000000000000000030|NsC0|Ns9000000 z00001000000000000IC20001TkOBYz06+l%001C>0000100961000000001j06+l% z001Dw000010sjF200000000000000000000000000RI3000000000000000000000 z000000RI3000000000000000000000000000RI300000000000000000000000000 z0RI3000000000000000000000000000RI3000000000000000000000000000RI30 z00000000620000000000000000000000000000000000000000000000000000000 z0000000000000000000000000000000000000000005W*h?&TYuhlA2{Q{x^@B#`A z2m&AlG6DbqH~~Td1yU9*F<&rWbaG*Cb6-?)VQzCoVRT_%G*|*)FlsOWf&f4P00000 z002M%0000000000000000000000001000000000000IC20001TkOBaL06+l%001Dw z0000100961000000000006+l%002N}000010sjF20000000000000000000000000 z0RI3000000000000000000000000000RI3000000000000000000000000000RI30 z00000000000000000000000000RI3000000000000000000000000000RI3000000 z000000000000000000000RI300000000062000000000000000000000000000000 z00000000000000000000000000000000000000000000000000000000000000000 z005W*h?&TYuhlA2_yVE<>jDZ52m&AmG6DbqH~~Td22v3%F<&rWbaG*Cb6-PYb97%d zSOQ=$YA^r*06+l%0000;0YCu&0000000000000000000000960|NsC0|Nj6000000 z004530ssI2Kmh;%06=H}000310RR910000000000000000000000000{{R3000000 z00000000000000000000{{R300000000000000000000000000{{R300000000000 z000000000000000{{R300000000000000000000000000{{R30000000000000000 z0000000000{{R300000000000000000000000000{{R300000000IC20000000000 z00000000000000000000000000000000000000000000000000000000000000000 z000000000000000000000GI-ZnaGT<)hbd85CoV4h?&TYuhlA23lI~S0@%HrkFV7# PSb&%baDYq!00960#e~Bm literal 0 KcmV+b0RR6000031 diff --git a/python_module/test/unit/module/test_external.py b/python_module/test/unit/module/test_external.py index 3a4e6d7f..44f5cf21 100644 --- a/python_module/test/unit/module/test_external.py +++ b/python_module/test/unit/module/test_external.py @@ -13,10 +13,10 @@ import numpy as np import megengine as mge from megengine import tensor from megengine.module import Module -from megengine.module.external import CambriconSubgraph +from megengine.module.external import AtlasSubgraph, CambriconSubgraph -class MyModule(Module): +class CambriconModule(Module): def __init__(self, data): super().__init__() self.cambricon = CambriconSubgraph(data, "subnet0", True) @@ -31,7 +31,7 @@ def test_cambricon_module(): model = os.path.join(os.path.dirname(__file__), model) with open(model, "rb") as f: data = f.read() - m = MyModule(data) + m = CambriconModule(data) inputs = [] inputs.append(tensor(dtype=np.float16, device="cambricon0")) inputs[0].set_value(np.random.normal(size=(1, 64, 32, 32)).astype(np.float16)) @@ -41,3 +41,30 @@ def test_cambricon_module(): return pred pred = inference(inputs) + + +class AtlasModule(Module): + def __init__(self, data): + super().__init__() + self.atlas = AtlasSubgraph(data) + + def forward(self, inputs): + out = self.atlas(inputs) + return out + + +def test_atlas_module(): + model = "AtlasRuntimeOprTest.basic.om" + model = os.path.join(os.path.dirname(__file__), model) + with open(model, "rb") as f: + data = f.read() + m = AtlasModule(data) + inputs = [] + inputs.append(tensor(dtype=np.float32, device="atlas0")) + inputs[0].set_value(np.random.normal(size=(4, 3, 16, 16)).astype(np.float32)) + + def inference(inps): + pred = m(inps) + return pred + + pred = inference(inputs)