From b166b55f05a4762022292a56dc3857a36ccec0ba Mon Sep 17 00:00:00 2001 From: William Wen Date: Thu, 5 Oct 2023 08:19:24 -0700 Subject: [PATCH 001/378] Update compile and export tutorials for 2.1 (#2591) * update compile and export tutorials * fix typo in constrain_as_* examples --- intermediate_source/torch_compile_tutorial.py | 26 ++++++------------- intermediate_source/torch_export_tutorial.py | 8 ++++-- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/intermediate_source/torch_compile_tutorial.py b/intermediate_source/torch_compile_tutorial.py index aff14f19674..739eeee422d 100644 --- a/intermediate_source/torch_compile_tutorial.py +++ b/intermediate_source/torch_compile_tutorial.py @@ -20,11 +20,8 @@ # # **Contents** # -# - Basic Usage -# - Demonstrating Speedups -# - Comparison to TorchScript and FX Tracing -# - TorchDynamo and FX Graphs -# - Conclusion +# .. contents:: +# :local: # # **Required pip Dependencies** # @@ -485,19 +482,12 @@ def bar(a, b): print(opt_model(generate_data(16)[0])) ###################################################################### -# -# -# Finally, if we simply want TorchDynamo to output the FX graph for export, -# we can use ``torch._dynamo.export``. Note that ``torch._dynamo.export``, like -# ``fullgraph=True``, raises an error if TorchDynamo breaks the graph. - -try: - torch._dynamo.export(bar)(torch.randn(10), torch.randn(10)) -except: - tb.print_exc() - -model_exp = torch._dynamo.export(init_model())(generate_data(16)[0]) -print(model_exp[0](generate_data(16)[0])) +# We can use ``torch.export`` (from PyTorch 2.1+) to extract a single, exportable +# FX graph from the input PyTorch program. The exported graph is intended to be +# run on different (i.e. Python-less) environments. One important restriction +# is that the ``torch.export`` does not support graph breaks. Please check +# `this tutorial `__ +# for more details on ``torch.export``. ###################################################################### # Conclusion diff --git a/intermediate_source/torch_export_tutorial.py b/intermediate_source/torch_export_tutorial.py index 20f6e100684..cec4733e992 100644 --- a/intermediate_source/torch_export_tutorial.py +++ b/intermediate_source/torch_export_tutorial.py @@ -423,7 +423,7 @@ def constraints_example4(x, y): exported_constraints_example4 = export(constraints_example4, (torch.randn(3, 3), torch.tensor([4]))) print(exported_constraints_example4(torch.randn(3, 3), torch.tensor([5]))) try: - exported_constraints_example4(torch.randn(3, 3), torch.randn([2])) + exported_constraints_example4(torch.randn(3, 3), torch.tensor([2])) except Exception: tb.print_exc() @@ -441,7 +441,7 @@ def constraints_example5(x, y): exported_constraints_example5 = export(constraints_example5, (torch.randn(2, 2), torch.tensor([4]))) print(exported_constraints_example5(torch.randn(2, 2), torch.tensor([5]))) try: - exported_constraints_example5(torch.randn(2, 2), torch.randn([1])) + exported_constraints_example5(torch.randn(2, 2), torch.tensor([1])) except Exception: tb.print_exc() @@ -496,6 +496,10 @@ def custom_op_example(x): # Note in the above outputs that the custom op is included in the exported graph. # And when we call the exported graph as a function, the original custom op is called, # as evidenced by the ``print`` call. +# +# If you have a custom operator implemented in C++, please refer to +# `this document `__ +# to make it compatible with ``torch.export``. ###################################################################### # ExportDB From 31bccdc1a6bf68bec989dae5869c25ac4ab9039f Mon Sep 17 00:00:00 2001 From: Svetlana Karslioglu Date: Thu, 5 Oct 2023 12:11:39 -0700 Subject: [PATCH 002/378] Pull 2.1 stable binaries (#2587) --- .jenkins/build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.jenkins/build.sh b/.jenkins/build.sh index f8f3f35690d..ddb83ad5c16 100755 --- a/.jenkins/build.sh +++ b/.jenkins/build.sh @@ -25,9 +25,9 @@ pip install --progress-bar off -r $DIR/../requirements.txt #Install PyTorch Nightly for test. # Nightly - pip install --pre torch torchvision torchaudio -f https://download.pytorch.org/whl/nightly/cu102/torch_nightly.html # Install 2.1 for testing -pip uninstall -y torch torchvision torchaudio torchtext torchdata -pip3 install torch torchvision torchaudio --no-cache-dir --index-url https://download.pytorch.org/whl/test/cu121 -pip3 install torchdata torchtext --index-url https://download.pytorch.org/whl/test/cpu +# pip uninstall -y torch torchvision torchaudio torchtext torchdata +# pip3 install torch torchvision torchaudio --no-cache-dir --index-url https://download.pytorch.org/whl/test/cu121 +# pip3 install torchdata torchtext --index-url https://download.pytorch.org/whl/test/cpu # Install two language tokenizers for Translation with TorchText tutorial python -m spacy download en_core_web_sm From 0bcfce21a6d0d9ed205d1eb54dd4ccb034853fc0 Mon Sep 17 00:00:00 2001 From: Nikita Shulga <2453524+malfet@users.noreply.github.com> Date: Thu, 5 Oct 2023 13:37:42 -0700 Subject: [PATCH 003/378] Pin torchrl deps to 0.2.0 (#2594) As latests seems to be incompatible with latest tensordict release, see https://github.com/pytorch/rl/issues/1606 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d323e7a1409..78d0af566f7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,7 +25,7 @@ tensorboard jinja2==3.0.3 pytorch-lightning torchx -torchrl +torchrl==0.2.0 ax-platform nbformat>=4.2.0 datasets From c7c45d132c6d2d243def57745cc406ffe824cff4 Mon Sep 17 00:00:00 2001 From: Thiago Crepaldi Date: Fri, 6 Oct 2023 11:58:55 -0400 Subject: [PATCH 004/378] [ONNX 3] Add ONNX registry tutorial (#2595) * [ONNX 3] Add ONNX registry tutorial Co-authored-by: Thiago Crepaldi Co-authored-by: AllenTiTaiWang --- .../img/onnx/custom_addandround_function.png | Bin 0 -> 34769 bytes _static/img/onnx/custom_addandround_model.png | Bin 0 -> 7544 bytes _static/img/onnx/custom_aten_add_function.png | Bin 0 -> 12731 bytes _static/img/onnx/custom_aten_add_model.png | Bin 0 -> 8613 bytes .../img/onnx/custom_aten_gelu_function.png | Bin 0 -> 22646 bytes _static/img/onnx/custom_aten_gelu_model.png | Bin 0 -> 6960 bytes .../super_resolution_with_onnxruntime.py | 6 +- beginner_source/onnx/README.txt | 6 +- .../export_simple_model_to_onnx_tutorial.py | 9 +- beginner_source/onnx/intro_onnx.py | 27 +- .../onnx/onnx_registry_tutorial.py | 468 ++++++++++++++++++ beginner_source/onnx/onnx_toc.txt | 3 +- en-wordlist.txt | 1 + index.rst | 7 + 14 files changed, 515 insertions(+), 12 deletions(-) create mode 100644 _static/img/onnx/custom_addandround_function.png create mode 100644 _static/img/onnx/custom_addandround_model.png create mode 100644 _static/img/onnx/custom_aten_add_function.png create mode 100644 _static/img/onnx/custom_aten_add_model.png create mode 100644 _static/img/onnx/custom_aten_gelu_function.png create mode 100644 _static/img/onnx/custom_aten_gelu_model.png create mode 100644 beginner_source/onnx/onnx_registry_tutorial.py diff --git a/_static/img/onnx/custom_addandround_function.png b/_static/img/onnx/custom_addandround_function.png new file mode 100644 index 0000000000000000000000000000000000000000..a0c7000161e9585859c331b73497557814345855 GIT binary patch literal 34769 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 z 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 literal 0 HcmV?d00001 diff --git a/_static/img/onnx/custom_aten_add_model.png b/_static/img/onnx/custom_aten_add_model.png new file mode 100644 index 0000000000000000000000000000000000000000..e5ef1c71742ccff347d84c65c6b7f5d15e960654 GIT binary patch literal 8613 zcmb_?WmH_vwk;$C2@o8DLkJ$Af#A>t57M~1Yk&lI0t8KPZyZA75Zoah+#NpL-QAnJ z^UiqhjPvi^``(WpyKC=SRcr5BRkh}v6|Sr(gZ+~1B@z-6w(LhqRp7dXgoMnEjtcyv zKk|7T}tUY==P}tCsX*q*qbdfzR5ZCV4id7YFn`dQ? z4*W#7v6`K)V;4=@oT<5m2u#pXkaWY<>yfhYPzXLqpfh|8!Bs%QrcFU269*x`|7QHm z8Xb-@iW`WLP5a-f5WLXW(DsDz7W8{)NLS1dl$t3wP>bH#Y}zl+1N+|f?!wX>RP*m{ zujUP0*Y9_x`8 zma! zZ{)QSfMz|KE#`7Q#HaS@Qz>BFz$@ysflkT)`Rm!)S)oMetAyBCF=l4wJ<@5@TVul} zmvAb-8HhHw$6X0aRe)yC& zIAyWPwfbRtkqRv+%}6+g=u?aE`r6v0zV*s+2RTJar3=UtMRD8r>yU{bHNpYj&Es0g zHnP;}J<%7>SOkMfCjt%!-7dN>t2DbE0%jn)C*z8b3r5>`M|Jk|#c`v*n<1}{?<(=- z(FkbN{~fM(DjG}bo=CO!x{CD06h5B?lVQ@3{DlcyumVkr-=7?X6wa8J#U(|$3Zct_ zAI$KEx8_?H>H?ZYBF{8b_{Bhvx!(}NbXi=YvW({+nsz2r6J&L2%<5T?IMh{+_H`1@ zrcH{$36N=FtVKQ(!a;mp!#YZXg}qJqtcsgCZ-a2BXWa|TqaU|{!a*y;(b zts$9QhY?Nx996C>?2{>Up!17oWt>IsC!O#^O<^!k1wy5IkT-Q;0r5l!WhgI$xvS<) z`P^Wn8EbAHW;aOGSu!ZS;4mN4u3Y2Cx2WhDGw~aq3pc$4r4>rfx>jV!ZknY-wce!M zuCMprrldBsnd%wo9{u_g5)tRR`Cg4}U~jJ@0b-M2LISqw)7G8Un)F%|u3ygy z_axaet*GI75r)hHmQ{; zDsrkjSc`h1?RL|RRU~HZz#r4c3vJUsVNJW+bp21&^7@}oSKpb%E-DS)cFo#vd|MQf zOzX5E#T@(cd`biqEDI`Oa))XMIE)k!R?F_G@AC}0N}WZV_mkqQ`}<9EO*&47>ZZ({?N#kgXyT3LV$QE81M@4?O55-_E}Hyf~Wp zsb?j+`UD-OPkRtZcLyasx|3uN88^!fPvYrzU|K%3Gsx0PtXG|8i555z$H1;576%`K zo-^D*&AOxuWh)76wlHrKl5Fbjx+Z2qQb8D7l3p?w%+=k60a^0{Hn33N!JSF>PtBT> zG%^Vuvs`>atr=O#C&`3@rEZPi(rI^dm1Gm#nspf}dQ<{{$~mNU2CNucXA9tk?+Cw} zUl)B1H~OL(g08uxr8IoO9xllpi|ODbH0fw6h>eYn(@SE6$ks2D4(q#%-HTqj=)!TD z)iHx5e~PczvsZ`nHm7S{XYamg3JOW2{OG?+J}@(N8FMtJ=6)+vk%j~RB;LnWV8k0% zCUjgq;3FuRR)pNuTy}udy54r9KGvg#MLZ zhscK@L7xz}?q#-=n}j#Qss5s%TxRyZ@^*HHc@8INHTeKHTdlCK#jf$0&3*gL8YU0P zYvDpOA*#vrXZ84;ZRXF`&j(P+jZ_0iSjj(1a33VoD+TNpqq^i|5Tdk{oGB2LglPRG80LNUcLx@MH$D&(smFur7f7^WBX@2(>vPU*Lf+Tt-B$N2C28%rtB%lU^~9^Vky7 zGcr#63C6UUfI-Z=7OR9moC5pQfSt-Pl;?YSJHqSo2ThoJkB0=L!h&sOj2VpY3U zKQ4bihkz3c>@ude<zMli#5Km+q|-oS|PIhM%HO3)rD z+jg2`TMmhlPpq7r+|H8saiSJg^`A>lPtP;b1JQ>Q37vcA$Ud!0U|2 z_;!|mx!gsMRoqjblHZ%Oil#`4vzKiSi-Ig1^~1+vP435v(cn9#$Ft;ib^2*SRrvc; zDbK6pWhDy>3zy414UN6D&4J_rgV%^AaZa40&xa1dtahgkks{t#qm^bo>fw$agpWgf z%L&M9vBv&8QzgmznSwKWOXz*ZsL!54&n-r7Uv{mKw-vuO+Dz?1xv2_T=|2k+Maub~ zQKz&$G{3)g!{f3e&3GiqU*j6?7i_FuzavG!*_!58Y3;kd#c)#`pWh zJrMoGhX^&kGoUA;lFfhFK@(IEzi;j6#IosAM&$tOzc$Qi-1F1EZHkE!(KgXbGA-_% zmG7V$#*?2Vd2_&eVF*QsEnjB$oilv*Pc)=sb{!8*xW=K@%&&0X+3gFm8GFV^`T z4Q9=-LH153)V-`FsEF=<<&^jw+d#RD@z_+)1;s%kzx8a5u%jxB8nrivO_R&onzKZcA<|A^dK!J!p{H7|RMRxE_}TjC}F#^(qeZA!^o?BA&_6WJzcD zE>J|JUEG)U_YAj0$8!P#a@725 z{OGoCydG&%sB9OTYMZu^D>W2(&{*rD-kP-C6164LiJ87euJ5F!DbzOy&3 zc25mH3J=!}S;VALd!Cx=s;Y0=d$xwsG{W5@h+|Hbqt3@`5+?$4o94ZUx|?LL21ab0 zJj$t*&AbXBX}m6*{X`>nLkzv({9@*KjUk)m?V1YuLD|yJZ#Cb1S)Qxi0VdQY8;6>I zkzHE^*;uK-{(X8~dC>aVySTin?-5dp3`>#^*F8@5SoK73OH=EL@^XejiM8zW4K{`6U%=oeS`49Kiy&i-ozML>hrou0Nb|26Z zZzn8mRT0Mb8pg_hr%mNrob>8DFP*On!<}mKpR=TO=#8PBEYaeaYxt6#j>ZGSqLleDqAZ!H^XUQ%LX7&%~1)4w3lC)s`E|)0kf94 zvo}>@`^qPPtl9=07CM@6N$o6<+x_Wv;BF3pGsfJPeG9gJlWaL{SiC%DH)j(fzN0_^vtBx*4A1N-yzSW zv)@f7|1gp2oAK zH8O%)3!p=el*c#KStv{EWCV``fNO@J`U~q}UTVilWiwuE_=R}8-{Vdt%n@ z46rX0e1E{L@ho%AIEq3bPS9m1TP~Xx9hThCy-^0PFkcY>V;vhk-6b#l68r0u>%l*< zAvn~E0PIkvU%_zpd_1rcjjtc&N2w+qA0OXYfd>`xh;$|=X}5S(E@XH0^pvPtW3k7M zVzu--v_HCeJ{)9Whks ziV4$C`!a5m1^z-SCGf3eqPQCFpe2_b1c5P;BN19CpUl38_lpmJhPqYe7`E~pInlEU z3qA(bme@e56p`t*$E@-4ivI^k`$N@1JYB+)SmZ7+KJTDH?(Aho?S{Pe@DM%x`b9T# z1NTK&mzCeho|u^uAm7gK$C=(ov1k;Z$c)zSk3fQ)~9~+V?pS*%rf!7!g z(WrfBa0DBU+wKbigd>9A)<6`SoGb%4CB>BX-A>_TQS|9nN#gy?55QNl?U5|4{8dIF zp)@_?ZnJ0+m|V61u7W5F6B9_c-oZW$R`z9goL#;IaoaF}1Fu9z+Mgv1bJOHGNM5FTf-Qaau%u<_3LQGsNU{_LB#sdt)Wcm=WT49f+ z^L0m(Z=ba0c#ig5aD)FbzTBI7tEuk!`zjcd#JsUk)@CeM>a1<*RE%hIbJI3zN6G(= z0FnX5)gtoG_vXUFk0Kq=hB^f~xj43G zyuc9LwgRBoT))LbB`M%o*$lP!=5$^5Tg+b|?7r|tW-&aMgk7J>u`I&>t)Z?ii=C7M z<%x<2N83&ALiBgvL`2YI3NnMOyqv6T4uGuFB_rPqcq}hviv?}?vaV_b^Kso@9mXf~ zuN=q6$J6nNuNW0_KK~Z&Gu!0KYGGxiR`0O5p_HY7N&HUvy3}GIiH$4ahyTqWni?S? z;V3{D$jd}iC2p=z16C_QQh3I%3)W2VC*C@GX_Do4S48oy5+8i{)04rK0LS(e{vZ*8 z6}x=~Hwj0K<-#{~Ee_{u&s<_;q9|hZOsoZb2;(33a7lOn$zEf%Jzrlvxu5vERzdg{ zB{48CoH_^&xH)RHK>|OjtwvyuZMV`_8UT56-voaBL9GE66%_?@-X4Bo-U{T5krab# zU(Z6q^q%_=hZx($8auUrXDsKuwNm>VG0{jKArc)ut4{T_qa*}d)LuY18iZUN`#&|a zV3%g&AWr(?1QL8+emtt6Nyrugrv#$a-^^v6Z;xo@2M|pfJE7n1kT}$7s;d{OB0Zi~ zgfzJJ$hg?g)yO8IDk=vx`rf6j`1ZE^5B!h=5~ z$aAd|Lj#{*44dJaqcP)^u?EE;K;odbOp#0)Q;GWNPp2ShcCFL>;4r562vkDyK>atv z^z3cM%i{9US^E*ylHQQ0vdHYP+4&uPdmj6={D==PmyOGr>DL!{EAO;>in)S@iFCIK z>TMSz$OeDL8&i=$4LuZ(?m$0Ob@TgO2~kC&-J$B2R-|N(BdpeuhwJzj{Z9J+}){ zV#Ibrxk~k?q@DJL7H~#g26v}sHLJ=@?8VDup_b%B-@T_Jfn)>@AM`6)WDQDTRLZ zy9rHGSreNjGaICoz(yhOf3IS<=Da5*T~{YUWgO0FN~=kgw`psrXG)7YMCra@(%IR0 z@}wRgzk?R0mCoHM2kX})&9^A|bUhQMv9iD`QA*)Dk{tbAE6jLq%gUah!eQmoH12r$ zw|7`#L)(w1q>lR-TFuWzM~+3?=>(3u`j$^k-LQ*4sx$2-*Pc?pvG71WBi-@m%U^Dr z>t;B6EY`PL$x<{E6Up9m+b%6`e>QN~;&Sp>+LMrG^RJu5lit^il{Vkd>xQ$=nCqB$ z+2v{cy!C@9`Jjp$X65GQE`X05xJ2VO&is#OCmWruZryB^`Ua2ZQN+W{7@yGhU9SeoGhC{oW*#UH*id>m7qZ@l~?+meZT|o!lr(8tH6QOn8 z4V5&QD<9^_72_TEU2j5uPlb(SAK5A_gJBhv7g{nZ^|Qh1@h3m+gU>+OL_G%H)C194 zCs1}%DyCw`CR5O1#!z0csqX%6{jnUK)<4h86qOhXLm$L1DGOrB`hH|v)i)cC4K6x4 zYl!t2)(+(3GvDWmfmkz5C#^;^+Ta&5xcuo(7P=4%3T2!>yX7I6Hy<-gZ~HqVmLsJ- zTgOlK)l&`&Bt;L=SEl75v?BAJrC)b6;GTizZ@Xzk-L9e~hvxzwmnr`s7{@{PvDTu__3c{h z(Sq3T_!=u!u2UaM4VW#zLbb-#jO;7x}5Eo$`P{;ufFLiYg20|u$qUqZKu0Q38&K7()&++ zI4VSZHux=RrOD^*C}@<5UIGAUYq^`)9;9c_aD{Bh$<`I^YNaf-u{ z?}_>dTymEwX4|W4rG-J@8<&0Rqdv_$>y|p{{2HPrf#7ZN{=HaOnh_$cXFyfmsw6TK zYcPWcQIb(0Po)4?+@v|kB<_o*J>Cm)6u?B&?p1a}7(%Z}Ds(oFY83~XT_W$>_38)d zPahB5?83ha3fEWm-K*$uJc*K}{PA(eU{HuuGDMrOXm>k@oh%vP2TDR{WfTkwlE5)@ zw_$Y6eQ9|?x=8-gR6Dlm0&601EYrMJpUW(0QpC7K#)f)}(sl1X?CmCOTsem`$2{(3 z>nP?m&9*7Uaol$Wy(@$tOcdY%=tXe|SsNz{IrDUr^ciy@TtQJWsUQ{Ygv4PORSh6I zHeA(i@V^BRP8y$CEHrcFkZcf-PP&)jLv}qcQoudtQ zk#tTo)UNJs)hEQGg*LKFck=2!K+aQ8V@zAz>0SJ(t+pJBv#RM1wu9?6e6~kQP4?no zWsRSq#=3a%5m~s4O@L}cRzU%)LcTTV>GV>@6SLiASGB*lS2=&RLqG9Q#?H=e@hSZs z7uQZJf5pz@E>g?y0GFlUKgce8yRZJe-~9iSJpPj?z%olb&Y#YBn_5tsv4?DQFnG4? z9n6Ws{YgW0HCDYCgym_2yuKkgmzFLkU{n&CmLKP&IjC_BCqcLTXHP7C8$$fV(kiXG z_Y;Ttm^!iew|C;P2t*C_U9OZZ6%+@Kf)=#CpUXmY{7&Hfz69pGEGcu$0<8QLZmb@pIp{B`gk4p#c3roo`uO~u~64C-8KHA2Yz^Jo1A!J!pG(0<#+4m9rA$Gx>xyXXDkTFtat0%AK4xOB};4M z8LJpb0%azqv9ZxM%KW^xrA0r4uoMk4i+c*lWqsVmX+WNjD~Bl&Nh%J^!w=NH7kIU{ zQxR>5J3Ew#Ke!6m>B63IQPiUB1>Z?HidBy_)YX*%A?osIF)h<$4MStEwYT?UL}X+> zpx!C__z2fJE*pwGg9jSdWz)$-jXIBr$S^9VE7RZEEH?2xZt=C}Fss1|@zGIHs)K!Q zRzqt%PEDH-cl*0zGSvA1FPVCGeXK+&=%PGgt|H9N@@)e01g1kedlxWfQw{npWSmVTV#FAI-J!e03I{{Plk z2bHV61*D|d3h;U6W8y4S2y07=ti>lUZ=9@-8AVXfzZ9;)ZHkDzM6;^NJcd^m&+_SsCR=A# z+gNQ%U8Aya2uFH)GqOHVi?{&hge|YuC8KFdO?TmCM&fngBBL%sDn4` zl4|;KO_;jkARdc-AqHi{b4%yC50fd1-90MlP4g)UZJENDE`i3jMG1am(~ zs~!fk6gauobKV+xp1m8z2rQzbH0&Hc| z7}nH^KNkR}E~8D+#fMCuO6trHacYmv3@YUL@Gy2M{!HcAP}8+^@ZE9aa3{5oRLqb~ zrOsE8HuQZjpCoXpB_@OpOUkub(;X|&=hDP}c&mInQT|s;31v$}|sJK%g-yo{{NSrK?X< z#+jo2hMBTU{Z_ZtFM(LP>DRel^5(FgtqNv0YAcm1qvPOE%3O84*cmHEdG-R1Ri#sH zsRDsuw?1CY7k84~RGqdoZ)>&RCDM<)apXa_jB(wcj?}2Hf!Vz7N*} z-4b&R6YI3gcu1acrx2Kc?_KxQbq4BfCZrR^vuRVvR!Y870ys}m@L+u-cKx4!v~}dW zdwSFWJU&H-`|j@<1JKR$|K@pu|6FkYbs~W>_X$m8llk04+h-U!T7e`hr6^f0ZXEbu D>9(|{ literal 0 HcmV?d00001 diff --git a/_static/img/onnx/custom_aten_gelu_function.png b/_static/img/onnx/custom_aten_gelu_function.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb573e7dcb559480e00fb24e4878733d1aca9d0 GIT binary patch literal 22646 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 literal 0 HcmV?d00001 diff --git a/_static/img/onnx/custom_aten_gelu_model.png b/_static/img/onnx/custom_aten_gelu_model.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc46337b48b07ed2e617770c10046c2b1404f35 GIT binary patch literal 6960 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 HM`8Z~tPeaL literal 0 HcmV?d00001 diff --git a/advanced_source/super_resolution_with_onnxruntime.py b/advanced_source/super_resolution_with_onnxruntime.py index f0a18948961..466c124fe67 100644 --- a/advanced_source/super_resolution_with_onnxruntime.py +++ b/advanced_source/super_resolution_with_onnxruntime.py @@ -2,11 +2,11 @@ (optional) Exporting a Model from PyTorch to ONNX and Running it using ONNX Runtime =================================================================================== -.. Note:: +.. note:: As of PyTorch 2.1, there are two versions of ONNX Exporter. - * ``torch.onnx.dynamo_export`is the newest (still in beta) exporter based on the TorchDynamo technology released with PyTorch 2.0 - * ``torch.onnx.export`` is based on TorchScript backend and has been available since PyTorch 1.2.0 + * ``torch.onnx.dynamo_export`is the newest (still in beta) exporter based on the TorchDynamo technology released with PyTorch 2.0. + * ``torch.onnx.export`` is based on TorchScript backend and has been available since PyTorch 1.2.0. In this tutorial, we describe how to convert a model defined in PyTorch into the ONNX format using the TorchScript ``torch.onnx.export` ONNX exporter. diff --git a/beginner_source/onnx/README.txt b/beginner_source/onnx/README.txt index f73ed11bc8f..61485869c99 100644 --- a/beginner_source/onnx/README.txt +++ b/beginner_source/onnx/README.txt @@ -6,5 +6,9 @@ ONNX https://pytorch.org/tutorials/onnx/intro_onnx.html 2. export_simple_model_to_onnx_tutorial.py - Export a PyTorch model to ONNX + Exporting a PyTorch model to ONNX https://pytorch.org/tutorials/beginner/onnx/export_simple_model_to_onnx_tutorial.html + +3. onnx_registry_tutorial.py + Extending the ONNX Registry + https://pytorch.org/tutorials/beginner/onnx/onnx_registry_tutorial.html diff --git a/beginner_source/onnx/export_simple_model_to_onnx_tutorial.py b/beginner_source/onnx/export_simple_model_to_onnx_tutorial.py index fa09dc86abc..48937fbd250 100644 --- a/beginner_source/onnx/export_simple_model_to_onnx_tutorial.py +++ b/beginner_source/onnx/export_simple_model_to_onnx_tutorial.py @@ -1,7 +1,8 @@ # -*- coding: utf-8 -*- """ `Introduction to ONNX `_ || -**Export a PyTorch model to ONNX** +**Exporting a PyTorch model to ONNX** || +`Extending the ONNX Registry `_ Export a PyTorch model to ONNX ============================== @@ -104,7 +105,7 @@ def forward(self, x): export_output.save("my_image_classifier.onnx") ###################################################################### -# The ONNX file can be loaded back into memory and checked if it is well formed with the following code: +# You can load the ONNX file back into memory and check if it is well formed with the following code: import onnx onnx_model = onnx.load("my_image_classifier.onnx") @@ -167,9 +168,9 @@ def to_numpy(tensor): onnxruntime_outputs = ort_session.run(None, onnxruntime_input) -###################################################################### +#################################################################### # 7. Compare the PyTorch results with the ones from the ONNX Runtime -# ----------------------------------------------------------------- +# ------------------------------------------------------------------ # # The best way to determine whether the exported model is looking good is through numerical evaluation # against PyTorch, which is our source of truth. diff --git a/beginner_source/onnx/intro_onnx.py b/beginner_source/onnx/intro_onnx.py index 05ad3090cc8..b5cbafc1c64 100644 --- a/beginner_source/onnx/intro_onnx.py +++ b/beginner_source/onnx/intro_onnx.py @@ -1,6 +1,7 @@ """ **Introduction to ONNX** || -`Export a PyTorch model to ONNX `_ +`Exporting a PyTorch model to ONNX `_ || +`Extending the ONNX Registry `_ Introduction to ONNX ==================== @@ -32,10 +33,13 @@ Dependencies ------------ +PyTorch 2.1.0 or newer is required. + The ONNX exporter depends on extra Python packages: - - `ONNX `_ - - `ONNX Script `_ + - `ONNX `_ standard library + - `ONNX Script `_ library that enables developers to author ONNX operators, + functions and models using a subset of Python in an expressive, and yet simple fashion. They can be installed through `pip `_: @@ -43,6 +47,23 @@ pip install --upgrade onnx onnxscript +To validate the installation, run the following commands: + +.. code-block:: python + + import torch + print(torch.__version__) + + import onnxscript + print(onnxscript.__version__) + + from onnxscript import opset18 # opset 18 is the latest (and only) supported version for now + + import onnxruntime + print(onnxruntime.__version__) + +Each `import` must succeed without any errors and the library versions must be printed out. + Further reading --------------- diff --git a/beginner_source/onnx/onnx_registry_tutorial.py b/beginner_source/onnx/onnx_registry_tutorial.py new file mode 100644 index 00000000000..63e2b91975d --- /dev/null +++ b/beginner_source/onnx/onnx_registry_tutorial.py @@ -0,0 +1,468 @@ +# -*- coding: utf-8 -*- + +""" +`Introduction to ONNX `_ || +`Exporting a PyTorch model to ONNX `_ || +**Extending the ONNX Registry** + +Extending the ONNX Registry +=========================== + +**Authors:** Ti-Tai Wang (titaiwang@microsoft.com) +""" + + +############################################################################### +# Overview +# -------- +# +# This tutorial is an introduction to ONNX registry, which empowers users to implement new ONNX operators +# or even replace existing operators with a new implementation. +# +# During the model export to ONNX, the PyTorch model is lowered to an intermediate +# representation composed of `ATen operators `_. +# While ATen operators are maintained by PyTorch core team, it is the responsibility of the ONNX exporter team +# to independently implement each of these operators to ONNX through `ONNX Script `_. +# The users can also replace the behavior implemented by the ONNX exporter team with their own implementation +# to fix bugs or improve performance for a specific ONNX runtime. +# +# The ONNX Registry manages the mapping between PyTorch operators and the ONNX operators counterparts and provides +# APIs to extend the registry. +# +# In this tutorial, we will cover three scenarios that require extending the ONNX registry with custom operators: +# +# * Unsupported ATen operators +# * Custom operators with existing ONNX Runtime support +# * Custom operators without ONNX Runtime support +# +# Unsupported ATen operators +# -------------------------- +# +# Although the ONNX exporter team does their best efforts to support all ATen operators, some of them +# might not be supported yet. In this section, we will demonstrate how you can add +# unsupported ATen operators to the ONNX Registry. +# +# .. note:: +# The steps to implement unsupported ATen operators are the same to replace the implementation of an existing +# ATen operator with a custom implementation. +# Because we don't actually have an unsupported ATen operator to use in this tutorial, we are going to leverage +# this and replace the implementation of ``aten::add.Tensor`` with a custom implementation the same way we would +# if the operator was not present in the ONNX Registry. +# +# When a model cannot be exported to ONNX due to an unsupported operator, the ONNX exporter will show an error message +# similar to: +# +# .. code-block:: python +# +# RuntimeErrorWithDiagnostic: Unsupported FX nodes: {'call_function': ['aten.add.Tensor']}. +# +# The error message indicates that the fully qualified name of unsupported ATen operator is ``aten::add.Tensor``. +# The fully qualified name of an operator is composed of the namespace, operator name, and overload following +# the format ``namespace::operator_name.overload``. +# +# To add support for an unsupported ATen operator or to replace the implementation for an existing one, we need: +# +# * The fully qualified name of the ATen operator (e.g. ``aten::add.Tensor``). +# This information is always present in the error message as show above. +# * The implementation of the operator using `ONNX Script `__. +# ONNX Script is a prerequisite for this tutorial. Please make sure you have read the +# `ONNX Script tutorial `_ +# before proceeding. +# +# Because ``aten::add.Tensor`` is already supported by the ONNX Registry, we will demonstrate how to replace it with a +# custom implementation, but keep in mind that the same steps apply to support new unsupported ATen operators. +# +# This is possible because the :class:`OnnxRegistry` allows users to override an operator registration. +# We will override the registration of ``aten::add.Tensor`` with our custom implementation and verify it exists. +# + +import torch +import onnxruntime +import onnxscript +from onnxscript import opset18 # opset 18 is the latest (and only) supported version for now + +class Model(torch.nn.Module): + def forward(self, input_x, input_y): + return torch.ops.aten.add(input_x, input_y) # generates a aten::add.Tensor node + +input_add_x = torch.randn(3, 4) +input_add_y = torch.randn(3, 4) +aten_add_model = Model() + + +# Now we create a ONNX Script function that implements ``aten::add.Tensor``. +# The function name (e.g. ``custom_aten_add``) is displayed in the ONNX graph, so we recommend to use intuitive names. +custom_aten = onnxscript.values.Opset(domain="custom.aten", version=1) + +# NOTE: The function signature must match the signature of the unsupported ATen operator. +# https://github.com/pytorch/pytorch/blob/main/aten/src/ATen/native/native_functions.yaml +# NOTE: All attributes must be annotated with type hints. +@onnxscript.script(custom_aten) +def custom_aten_add(input_x, input_y, alpha: float = 1.0): + alpha = opset18.CastLike(alpha, input_y) + input_y = opset18.Mul(input_y, alpha) + return opset18.Add(input_x, input_y) + + +# Now we have everything we need to support unsupported ATen operators. +# Let's register the ``custom_aten_add`` function to ONNX registry, and export the model to ONNX again. +onnx_registry = torch.onnx.OnnxRegistry() +onnx_registry.register_op( + namespace="aten", op_name="add", overload="Tensor", function=custom_aten_add + ) +print(f"aten::add.Tensor is supported by ONNX registry: \ + {onnx_registry.is_registered_op(namespace='aten', op_name='add', overload='Tensor')}" + ) +export_options = torch.onnx.ExportOptions(onnx_registry=onnx_registry) +export_output = torch.onnx.dynamo_export( + aten_add_model, input_add_x, input_add_y, export_options=export_options + ) + +###################################################################### +# Now let's inspect the model and verify the model has a ``custom_aten_add`` instead of ``aten::add.Tensor``. +# The graph has one graph node for ``custom_aten_add``, and inside of it there are four function nodes, one for each +# operator, and one for constant attribute. +# + +# graph node domain is the custom domain we registered +assert export_output.model_proto.graph.node[0].domain == "custom.aten" +assert len(export_output.model_proto.graph.node) == 1 +# graph node name is the function name +assert export_output.model_proto.graph.node[0].op_type == "custom_aten_add" +# function node domain is empty because we use standard ONNX operators +assert export_output.model_proto.functions[0].node[3].domain == "" +# function node name is the standard ONNX operator name +assert export_output.model_proto.functions[0].node[3].op_type == "Add" + + +###################################################################### +# This is how ``custom_aten_add_model`` looks in the ONNX graph using Netron: +# +# .. image:: /_static/img/onnx/custom_aten_add_model.png +# :width: 70% +# :align: center +# +# Inside the ``custom_aten_add`` function, we can see the three ONNX nodes we +# used in the function (``CastLike``, ``Add``, and ``Mul``), and one ``Constant`` attribute: +# +# .. image:: /_static/img/onnx/custom_aten_add_function.png +# :width: 70% +# :align: center +# +# This was all that we needed to register the new ATen operator into the ONNX Registry. +# As an additional step, we can use ONNX Runtime to run the model, and compare the results with PyTorch. +# + + +# Use ONNX Runtime to run the model, and compare the results with PyTorch +export_output.save("./custom_add_model.onnx") +ort_session = onnxruntime.InferenceSession( + "./custom_add_model.onnx", providers=['CPUExecutionProvider'] + ) + +def to_numpy(tensor): + return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy() + +onnx_input = export_output.adapt_torch_inputs_to_onnx(input_add_x, input_add_y) +onnxruntime_input = {k.name: to_numpy(v) for k, v in zip(ort_session.get_inputs(), onnx_input)} +onnxruntime_outputs = ort_session.run(None, onnxruntime_input) + +torch_outputs = aten_add_model(input_add_x, input_add_y) +torch_outputs = export_output.adapt_torch_outputs_to_onnx(torch_outputs) + +assert len(torch_outputs) == len(onnxruntime_outputs) +for torch_output, onnxruntime_output in zip(torch_outputs, onnxruntime_outputs): + torch.testing.assert_close(torch_output, torch.tensor(onnxruntime_output)) + + +###################################################################### +# Custom operators with existing ONNX Runtime support +# --------------------------------------------------- +# +# In this case, the user creates a model with standard PyTorch operators, but the ONNX runtime +# (e.g. Microsoft's ONNX Runtime) can provide a custom implementation for that kernel, effectively replacing the +# existing implementation in the ONNX Registry. Another use case is when the user wants to use a custom implementation +# of an existing ONNX operator to fix a bug or improve performance of a specific operator. +# To achieve this, we only need to register the new implementation with the existing ATen fully qualified name. +# +# In the following example, we use the ``com.microsoft.Gelu`` from ONNX Runtime, +# which is not the same ``Gelu`` from ONNX spec. Thus, we register the Gelu with +# the namespace ``com.microsoft`` and operator name ``Gelu``. +# +# Before we begin, let's check whether ``aten::gelu.default`` is really supported by the ONNX registry. + +onnx_registry = torch.onnx.OnnxRegistry() +print(f"aten::gelu.default is supported by ONNX registry: \ + {onnx_registry.is_registered_op(namespace='aten', op_name='gelu', overload='default')}") + + +###################################################################### +# In our example, ``aten::gelu.default`` operator is supported by the ONNX registry, +# so :meth:`onnx_registry.is_registered_op` returns ``True``. + +class CustomGelu(torch.nn.Module): + def forward(self, input_x): + return torch.ops.aten.gelu(input_x) + +# com.microsoft is an official ONNX Runtime namspace +custom_ort = onnxscript.values.Opset(domain="com.microsoft", version=1) + +# NOTE: The function signature must match the signature of the unsupported ATen operator. +# https://github.com/pytorch/pytorch/blob/main/aten/src/ATen/native/native_functions.yaml +# NOTE: All attributes must be annotated with type hints. +@onnxscript.script(custom_ort) +def custom_aten_gelu(input_x, approximate: str = "none"): + # We know com.microsoft::Gelu is supported by ONNX Runtime + # It's only not supported by ONNX + return custom_ort.Gelu(input_x) + + +onnx_registry = torch.onnx.OnnxRegistry() +onnx_registry.register_op( + namespace="aten", op_name="gelu", overload="default", function=custom_aten_gelu) +export_options = torch.onnx.ExportOptions(onnx_registry=onnx_registry) + +aten_gelu_model = CustomGelu() +input_gelu_x = torch.randn(3, 3) + +export_output = torch.onnx.dynamo_export( + aten_gelu_model, input_gelu_x, export_options=export_options + ) + + +###################################################################### +# Let's inspect the model and verify the model uses :func:`custom_aten_gelu` instead of +# :class:`aten::gelu`. Note the graph has one graph nodes for +# ``custom_aten_gelu``, and inside ``custom_aten_gelu``, there is a function +# node for ``Gelu`` with namespace ``com.microsoft``. +# + +# graph node domain is the custom domain we registered +assert export_output.model_proto.graph.node[0].domain == "com.microsoft" +# graph node name is the function name +assert export_output.model_proto.graph.node[0].op_type == "custom_aten_gelu" +# function node domain is the custom domain we registered +assert export_output.model_proto.functions[0].node[0].domain == "com.microsoft" +# function node name is the node name used in the function +assert export_output.model_proto.functions[0].node[0].op_type == "Gelu" + + +###################################################################### +# The following diagram shows ``custom_aten_gelu_model`` ONNX graph using Netron: +# +# .. image:: /_static/img/onnx/custom_aten_gelu_model.png +# :width: 70% +# :align: center +# +# Inside the ``custom_aten_gelu`` function, we can see the ``Gelu`` node from module +# ``com.microsoft`` used in the function: +# +# .. image:: /_static/img/onnx/custom_aten_gelu_function.png +# +# That is all we need to do. As an additional step, we can use ONNX Runtime to run the model, +# and compare the results with PyTorch. +# + +export_output.save("./custom_gelu_model.onnx") +ort_session = onnxruntime.InferenceSession( + "./custom_gelu_model.onnx", providers=['CPUExecutionProvider'] + ) + +def to_numpy(tensor): + return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy() + +onnx_input = export_output.adapt_torch_inputs_to_onnx(input_gelu_x) +onnxruntime_input = {k.name: to_numpy(v) for k, v in zip(ort_session.get_inputs(), onnx_input)} +onnxruntime_outputs = ort_session.run(None, onnxruntime_input) + +torch_outputs = aten_gelu_model(input_gelu_x) +torch_outputs = export_output.adapt_torch_outputs_to_onnx(torch_outputs) + +assert len(torch_outputs) == len(onnxruntime_outputs) +for torch_output, onnxruntime_output in zip(torch_outputs, onnxruntime_outputs): + torch.testing.assert_close(torch_output, torch.tensor(onnxruntime_output)) + +###################################################################### +# Custom operators without ONNX Runtime support +# --------------------------------------------- +# +# In this case, the operator is not supported by any ONNX runtime, but we +# would like to use it as custom operator in ONNX graph. Therefore, we need to implement +# the operator in three places: +# +# 1. PyTorch FX graph +# 2. ONNX Registry +# 3. ONNX Runtime +# +# In the following example, we would like to use a custom operator +# that takes one tensor input, and returns one output. The operator adds +# the input to itself, and returns the rounded result. +# +# +# Custom Ops Registration in PyTorch FX Graph (Beta) +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# Firstly, we need to implement the operator in PyTorch FX graph. +# This can be done by using ``torch._custom_op``. +# + +# NOTE: This is a beta feature in PyTorch, and is subject to change. +from torch._custom_op import impl as custom_op + +@custom_op.custom_op("mylibrary::addandround_op") +def addandround_op(tensor_x: torch.Tensor) -> torch.Tensor: + ... + +@addandround_op.impl_abstract() +def addandround_op_impl_abstract(tensor_x): + return torch.empty_like(tensor_x) + +@addandround_op.impl("cpu") +def addandround_op_impl(tensor_x): + return torch.round(tensor_x + tensor_x) # add x to itself, and round the result + +torch._dynamo.allow_in_graph(addandround_op) + +class CustomFoo(torch.nn.Module): + def forward(self, tensor_x): + return addandround_op(tensor_x) + +input_addandround_x = torch.randn(3) +custom_addandround_model = CustomFoo() + + +###################################################################### +# +# Custom Ops Registration in ONNX Registry +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# For the step 2 and 3, we need to implement the operator in ONNX registry. +# In this example, we will implement the operator in ONNX registry +# with the namespace ``test.customop`` and operator name ``CustomOpOne``, +# and ``CustomOpTwo``. These two ops are registered and built in +# `cpu_ops.cc `__. +# + + +custom_opset = onnxscript.values.Opset(domain="test.customop", version=1) + +# NOTE: The function signature must match the signature of the unsupported ATen operator. +# https://github.com/pytorch/pytorch/blob/main/aten/src/ATen/native/native_functions.yaml +# NOTE: All attributes must be annotated with type hints. +@onnxscript.script(custom_opset) +def custom_addandround(input_x): + # The same as opset18.Add(x, x) + add_x = custom_opset.CustomOpOne(input_x, input_x) + # The same as opset18.Round(x, x) + round_x = custom_opset.CustomOpTwo(add_x) + # Cast to FLOAT to match the ONNX type + return opset18.Cast(round_x, to=1) + + +onnx_registry = torch.onnx.OnnxRegistry() +onnx_registry.register_op( + namespace="mylibrary", op_name="addandround_op", overload="default", function=custom_addandround + ) + +export_options = torch.onnx.ExportOptions(onnx_registry=onnx_registry) +export_output = torch.onnx.dynamo_export( + custom_addandround_model, input_addandround_x, export_options=export_options + ) +export_output.save("./custom_addandround_model.onnx") + + +###################################################################### +# The ``export_output`` exposes the exported model as protobuf through ``export_output.model_proto``. +# The graph has one graph nodes for ``custom_addandround``, and inside ``custom_addandround``, +# there are two function nodes, one for each operator. +# + +assert export_output.model_proto.graph.node[0].domain == "test.customop" +assert export_output.model_proto.graph.node[0].op_type == "custom_addandround" +assert export_output.model_proto.functions[0].node[0].domain == "test.customop" +assert export_output.model_proto.functions[0].node[0].op_type == "CustomOpOne" +assert export_output.model_proto.functions[0].node[1].domain == "test.customop" +assert export_output.model_proto.functions[0].node[1].op_type == "CustomOpTwo" + + +###################################################################### +# This is how ``custom_addandround_model`` ONNX graph looks using Netron: +# +# .. image:: /_static/img/onnx/custom_addandround_model.png +# :width: 70% +# :align: center +# +# Inside the ``custom_addandround`` function, we can see the two custom operators we +# used in the function (``CustomOpOne``, and ``CustomOpTwo``), and they are from module +# ``test.customop``: +# +# .. image:: /_static/img/onnx/custom_addandround_function.png +# +# Custom Ops Registration in ONNX Runtime +# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# +# To link your custom op library to ONNX Runtime, you need to +# compile your C++ code into a shared library and link it to ONNX Runtime. +# Follow the instructions below: +# +# 1. Implement your custom op in C++ by following +# `ONNX Runtime instructions <`https://github.com/microsoft/onnxruntime/blob/gh-pages/docs/reference/operators/add-custom-op.md>`__. +# 2. Download ONNX Runtime source distribution from +# `ONNX Runtime releases `__. +# 3. Compile and link your custom op library to ONNX Runtime, for example: +# +# .. code-block:: bash +# +# $ gcc -shared -o libcustom_op_library.so custom_op_library.cc -L /path/to/downloaded/ort/lib/ -lonnxruntime -fPIC +# +# 4. Run the model with ONNX Runtime Python API and compare the results with PyTorch. +# +# .. code-block:: python +# +# ort_session_options = onnxruntime.SessionOptions() +# +# # NOTE: Link the custom op library to ONNX Runtime and replace the path +# # with the path to your custom op library +# ort_session_options.register_custom_ops_library( +# "/path/to/libcustom_op_library.so" +# ) +# ort_session = onnxruntime.InferenceSession( +# "./custom_addandround_model.onnx", providers=['CPUExecutionProvider'], sess_options=ort_session_options) +# +# def to_numpy(tensor): +# return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy() +# +# onnx_input = export_output.adapt_torch_inputs_to_onnx(input_addandround_x) +# onnxruntime_input = {k.name: to_numpy(v) for k, v in zip(ort_session.get_inputs(), onnx_input)} +# onnxruntime_outputs = ort_session.run(None, onnxruntime_input) +# +# torch_outputs = custom_addandround_model(input_addandround_x) +# torch_outputs = export_output.adapt_torch_outputs_to_onnx(torch_outputs) +# +# assert len(torch_outputs) == len(onnxruntime_outputs) +# for torch_output, onnxruntime_output in zip(torch_outputs, onnxruntime_outputs): +# torch.testing.assert_close(torch_output, torch.tensor(onnxruntime_output)) +# +# Conclusion +# ---------- +# +# Congratulations! In this tutorial, we explored the :class:`ONNXRegistry` API and +# discovered how to create custom implementations for unsupported or existing ATen operators +# using ONNX Script. +# Finally, we leveraged ONNX Runtime to execute the model and compare the results with PyTorch, +# providing us with a comprehensive understanding of handling unsupported +# operators in the ONNX ecosystem. +# +# Further reading +# --------------- +# +# The list below refers to tutorials that ranges from basic examples to advanced scenarios, +# not necessarily in the order they are listed. +# Feel free to jump directly to specific topics of your interest or +# sit tight and have fun going through all of them to learn all there is about the ONNX exporter. +# +# .. include:: /beginner_source/onnx/onnx_toc.txt +# +# .. toctree:: +# :hidden: +# diff --git a/beginner_source/onnx/onnx_toc.txt b/beginner_source/onnx/onnx_toc.txt index 2386430ba7b..674f7752c5d 100644 --- a/beginner_source/onnx/onnx_toc.txt +++ b/beginner_source/onnx/onnx_toc.txt @@ -1 +1,2 @@ -| 1. `Export a PyTorch model to ONNX `_ \ No newline at end of file +| 1. `Exporting a PyTorch model to ONNX `_ +| 2. `Extending the ONNX registry `_ diff --git a/en-wordlist.txt b/en-wordlist.txt index 4a6d3a06226..01597460c9d 100644 --- a/en-wordlist.txt +++ b/en-wordlist.txt @@ -157,6 +157,7 @@ Numpy's ONNX ONNX's ONNX Runtime +ONNX Script OpenAI OpenMP Ornstein diff --git a/index.rst b/index.rst index 355e1646b4d..fb2ce3bd6f9 100644 --- a/index.rst +++ b/index.rst @@ -282,6 +282,13 @@ What's new in PyTorch tutorials? :link: beginner/onnx/export_simple_model_to_onnx_tutorial.html :tags: Production,ONNX,Backends +.. customcarditem:: + :header: Introduction to ONNX Registry + :card_description: Demonstrate end-to-end how to address unsupported operators by using ONNX Registry. + :image: _static/img/thumbnails/cropped/Exporting-PyTorch-Models-to-ONNX-Graphs.png + :link: advanced/onnx_registry_tutorial.html + :tags: Production,ONNX,Backends + .. Reinforcement Learning .. customcarditem:: From d98606855d3c8c5bd78d55b95717be5a02960363 Mon Sep 17 00:00:00 2001 From: mikaylagawarecki Date: Fri, 6 Oct 2023 12:57:51 -0400 Subject: [PATCH 005/378] Fix rendering on related tutorials link (#2589) Co-authored-by: Svetlana Karslioglu --- beginner_source/basics/saveloadrun_tutorial.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/beginner_source/basics/saveloadrun_tutorial.py b/beginner_source/basics/saveloadrun_tutorial.py index 8c50249a089..16a9f037417 100644 --- a/beginner_source/basics/saveloadrun_tutorial.py +++ b/beginner_source/basics/saveloadrun_tutorial.py @@ -60,5 +60,5 @@ ####################### # Related Tutorials # ----------------- -# `Saving and Loading a General Checkpoint in PyTorch `_ -# `Tips for loading an `nn.Module` from a checkpoint `_ +# - `Saving and Loading a General Checkpoint in PyTorch `_ +# - `Tips for loading an nn.Module from a checkpoint `_ From c28def9e17987d266953955350602adeb7a0b264 Mon Sep 17 00:00:00 2001 From: William Wen Date: Tue, 10 Oct 2023 11:41:09 -0700 Subject: [PATCH 006/378] fix compile tutorial (#2596) --- intermediate_source/torch_compile_tutorial.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/intermediate_source/torch_compile_tutorial.py b/intermediate_source/torch_compile_tutorial.py index 739eeee422d..1093f7577e1 100644 --- a/intermediate_source/torch_compile_tutorial.py +++ b/intermediate_source/torch_compile_tutorial.py @@ -139,8 +139,7 @@ def init_model(): # ``mode`` argument, which we will discuss below. def evaluate(mod, inp): - with torch.no_grad(): - return mod(inp) + return mod(inp) model = init_model() @@ -151,8 +150,9 @@ def evaluate(mod, inp): evaluate_opt = torch.compile(evaluate, mode="reduce-overhead") inp = generate_data(16)[0] -print("eager:", timed(lambda: evaluate(model, inp))[1]) -print("compile:", timed(lambda: evaluate_opt(model, inp))[1]) +with torch.no_grad(): + print("eager:", timed(lambda: evaluate(model, inp))[1]) + print("compile:", timed(lambda: evaluate_opt(model, inp))[1]) ###################################################################### # Notice that ``torch.compile`` takes a lot longer to complete @@ -165,7 +165,8 @@ def evaluate(mod, inp): eager_times = [] for i in range(N_ITERS): inp = generate_data(16)[0] - _, eager_time = timed(lambda: evaluate(model, inp)) + with torch.no_grad(): + _, eager_time = timed(lambda: evaluate(model, inp)) eager_times.append(eager_time) print(f"eager eval time {i}: {eager_time}") @@ -174,7 +175,8 @@ def evaluate(mod, inp): compile_times = [] for i in range(N_ITERS): inp = generate_data(16)[0] - _, compile_time = timed(lambda: evaluate_opt(model, inp)) + with torch.no_grad(): + _, compile_time = timed(lambda: evaluate_opt(model, inp)) compile_times.append(compile_time) print(f"compile eval time {i}: {compile_time}") print("~" * 10) @@ -183,6 +185,7 @@ def evaluate(mod, inp): eager_med = np.median(eager_times) compile_med = np.median(compile_times) speedup = eager_med / compile_med +assert(speedup > 1) print(f"(eval) eager median: {eager_med}, compile median: {compile_med}, speedup: {speedup}x") print("~" * 10) @@ -239,6 +242,7 @@ def train(mod, data): eager_med = np.median(eager_times) compile_med = np.median(compile_times) speedup = eager_med / compile_med +assert(speedup > 1) print(f"(train) eager median: {eager_med}, compile median: {compile_med}, speedup: {speedup}x") print("~" * 10) From 127d2398b7dc6f7f7063dae4dcdc379066174f6d Mon Sep 17 00:00:00 2001 From: Svetlana Karslioglu Date: Tue, 10 Oct 2023 17:02:15 -0700 Subject: [PATCH 007/378] Update tocyt.txt (#2600) Removing Production Inference Deployment with PyTorch as outdated. --- beginner_source/introyt/tocyt.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/beginner_source/introyt/tocyt.txt b/beginner_source/introyt/tocyt.txt index f956671c11b..24b47e48913 100644 --- a/beginner_source/introyt/tocyt.txt +++ b/beginner_source/introyt/tocyt.txt @@ -5,4 +5,3 @@ 5. `PyTorch TensorBoard Support `_ 6. `Training with PyTorch `_ 7. `Model Understanding with Captum `_ -8. `Production Inference Deployment with PyTorch `_ (video only) From 500354220abc18c588e9ad2425ed4de11fa6eea3 Mon Sep 17 00:00:00 2001 From: Aaron Shi Date: Wed, 11 Oct 2023 13:07:44 -0400 Subject: [PATCH 008/378] Update tensorboard_profiler_tutorial.py to work (#2602) There is a bug when combining with_stack=True and repeat>1. So we set repeat=1 for this example. Also, I've added notes that tensorboard plugin is being deprecated, and replaced by HTA. We will have a new tutorial for using HTA in the upcoming months. --- .../tensorboard_profiler_tutorial.py | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/intermediate_source/tensorboard_profiler_tutorial.py b/intermediate_source/tensorboard_profiler_tutorial.py index 2b241071b7f..ba88c370270 100644 --- a/intermediate_source/tensorboard_profiler_tutorial.py +++ b/intermediate_source/tensorboard_profiler_tutorial.py @@ -96,12 +96,12 @@ def train(data): # - ``schedule`` - callable that takes step (int) as a single parameter # and returns the profiler action to perform at each step. # -# In this example with ``wait=1, warmup=1, active=3, repeat=2``, +# In this example with ``wait=1, warmup=1, active=3, repeat=1``, # profiler will skip the first step/iteration, # start warming up on the second, # record the following three iterations, # after which the trace will become available and on_trace_ready (when set) is called. -# In total, the cycle repeats twice. Each cycle is called a "span" in TensorBoard plugin. +# In total, the cycle repeats once. Each cycle is called a "span" in TensorBoard plugin. # # During ``wait`` steps, the profiler is disabled. # During ``warmup`` steps, the profiler starts tracing but the results are discarded. @@ -120,31 +120,31 @@ def train(data): # clicking a stack frame will navigate to the specific code line. with torch.profiler.profile( - schedule=torch.profiler.schedule(wait=1, warmup=1, active=3, repeat=2), + schedule=torch.profiler.schedule(wait=1, warmup=1, active=3, repeat=1), on_trace_ready=torch.profiler.tensorboard_trace_handler('./log/resnet18'), record_shapes=True, profile_memory=True, with_stack=True ) as prof: for step, batch_data in enumerate(train_loader): - if step >= (1 + 1 + 3) * 2: + prof.step() # Need to call this at each step to notify profiler of steps' boundary. + if step >= 1 + 1 + 3: break train(batch_data) - prof.step() # Need to call this at the end of each step to notify profiler of steps' boundary. ###################################################################### # Alternatively, the following non-context manager start/stop is supported as well. prof = torch.profiler.profile( - schedule=torch.profiler.schedule(wait=1, warmup=1, active=3, repeat=2), + schedule=torch.profiler.schedule(wait=1, warmup=1, active=3, repeat=1), on_trace_ready=torch.profiler.tensorboard_trace_handler('./log/resnet18'), record_shapes=True, with_stack=True) prof.start() for step, batch_data in enumerate(train_loader): - if step >= (1 + 1 + 3) * 2: + prof.step() + if step >= 1 + 1 + 3: break train(batch_data) - prof.step() prof.stop() ###################################################################### @@ -158,6 +158,10 @@ def train(data): # 4. Use TensorBoard to view results and analyze model performance # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # +# .. note:: +# TensorBoard Plugin support has been deprecated, so some of these functions may not +# work as previously. Please take a look at the replacement, `HTA `_. +# # Install PyTorch Profiler TensorBoard Plugin. # # .. code-block:: @@ -395,5 +399,6 @@ def train(data): # Take a look at the following documents to continue your learning, # and feel free to open an issue `here `_. # -# - `Pytorch TensorBoard Profiler github `_ +# - `PyTorch TensorBoard Profiler Github `_ # - `torch.profiler API `_ +# - `HTA `_ From 3e9e8f68cc904f9eb37c862348cc2216611faadd Mon Sep 17 00:00:00 2001 From: William Wen Date: Wed, 11 Oct 2023 13:46:40 -0700 Subject: [PATCH 009/378] Small fixes to torch.compile tutorial (#2601) * small fixes to torch.compile tutorial * Update intermediate_source/torch_compile_tutorial.py --- intermediate_source/torch_compile_tutorial.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/intermediate_source/torch_compile_tutorial.py b/intermediate_source/torch_compile_tutorial.py index 1093f7577e1..b6ac9ee3436 100644 --- a/intermediate_source/torch_compile_tutorial.py +++ b/intermediate_source/torch_compile_tutorial.py @@ -138,21 +138,18 @@ def init_model(): # Note that in the call to ``torch.compile``, we have have the additional # ``mode`` argument, which we will discuss below. -def evaluate(mod, inp): - return mod(inp) - model = init_model() # Reset since we are using a different mode. import torch._dynamo torch._dynamo.reset() -evaluate_opt = torch.compile(evaluate, mode="reduce-overhead") +model_opt = torch.compile(model, mode="reduce-overhead") inp = generate_data(16)[0] with torch.no_grad(): - print("eager:", timed(lambda: evaluate(model, inp))[1]) - print("compile:", timed(lambda: evaluate_opt(model, inp))[1]) + print("eager:", timed(lambda: model(inp))[1]) + print("compile:", timed(lambda: model_opt(inp))[1]) ###################################################################### # Notice that ``torch.compile`` takes a lot longer to complete @@ -166,7 +163,7 @@ def evaluate(mod, inp): for i in range(N_ITERS): inp = generate_data(16)[0] with torch.no_grad(): - _, eager_time = timed(lambda: evaluate(model, inp)) + _, eager_time = timed(lambda: model(inp)) eager_times.append(eager_time) print(f"eager eval time {i}: {eager_time}") @@ -176,7 +173,7 @@ def evaluate(mod, inp): for i in range(N_ITERS): inp = generate_data(16)[0] with torch.no_grad(): - _, compile_time = timed(lambda: evaluate_opt(model, inp)) + _, compile_time = timed(lambda: model_opt(inp)) compile_times.append(compile_time) print(f"compile eval time {i}: {compile_time}") print("~" * 10) @@ -250,6 +247,10 @@ def train(mod, data): # Again, we can see that ``torch.compile`` takes longer in the first # iteration, as it must compile the model, but in subsequent iterations, we see # significant speedups compared to eager. +# +# We remark that the speedup numbers presented in this tutorial are for +# demonstration purposes only. Official speedup values can be seen at the +# `TorchInductor performance dashboard `__. ###################################################################### # Comparison to TorchScript and FX Tracing From 71c21c8fc677b98fe79f4be1ef86bedc7567a547 Mon Sep 17 00:00:00 2001 From: William Wen Date: Mon, 16 Oct 2023 09:30:06 -0700 Subject: [PATCH 010/378] Add torch.export nightly tutorial (#2603) * add torch.export nightly tutorial * add sample outputs to nightly tutorial; add script the tutorial was based on (not run) * fix validate_tutorials_built.py * fix export nightly tutorial rst * tell sphinx-gallery to ignore _torch_export_nightly_tutorial.py * update torch.export nightly tutorial with decomp section and other small fixes * add credit :) --- .jenkins/validate_tutorials_built.py | 3 +- conf.py | 3 +- .../_torch_export_nightly_tutorial.py | 617 +++++++++++++ .../torch_export_nightly_tutorial.rst | 858 ++++++++++++++++++ intermediate_source/torch_export_tutorial.py | 4 + 5 files changed, 1483 insertions(+), 2 deletions(-) create mode 100644 intermediate_source/_torch_export_nightly_tutorial.py create mode 100644 intermediate_source/torch_export_nightly_tutorial.rst diff --git a/.jenkins/validate_tutorials_built.py b/.jenkins/validate_tutorials_built.py index 596ab1700c9..f90b94a47a8 100644 --- a/.jenkins/validate_tutorials_built.py +++ b/.jenkins/validate_tutorials_built.py @@ -22,10 +22,11 @@ "beginner_source/former_torchies/tensor_tutorial_old", "beginner_source/examples_autograd/polynomial_autograd", "beginner_source/examples_autograd/polynomial_custom_function", - "beginner_source/t5_tutorial", # re-enable after this is fixed: https://github.com/pytorch/text/issues/1756 + "beginner_source/t5_tutorial", # re-enable after this is fixed: https://github.com/pytorch/text/issues/1756 "intermediate_source/parametrizations", "intermediate_source/mnist_train_nas", # used by ax_multiobjective_nas_tutorial.py "intermediate_source/fx_conv_bn_fuser", + "intermediate_source/_torch_export_nightly_tutorial", # does not work on release "advanced_source/super_resolution_with_onnxruntime", "advanced_source/ddp_pipeline", # requires 4 gpus "prototype_source/fx_graph_mode_ptq_dynamic", diff --git a/conf.py b/conf.py index a4d8ca1af99..23c4fb1d7df 100644 --- a/conf.py +++ b/conf.py @@ -106,7 +106,8 @@ def reset_seeds(gallery_conf, fname): 'first_notebook_cell': ("# For tips on running notebooks in Google Colab, see\n" "# https://pytorch.org/tutorials/beginner/colab\n" "%matplotlib inline"), - 'reset_modules': (reset_seeds) + 'reset_modules': (reset_seeds), + 'ignore_pattern': r'_torch_export_nightly_tutorial.py' } if os.getenv('GALLERY_PATTERN'): diff --git a/intermediate_source/_torch_export_nightly_tutorial.py b/intermediate_source/_torch_export_nightly_tutorial.py new file mode 100644 index 00000000000..e471b428480 --- /dev/null +++ b/intermediate_source/_torch_export_nightly_tutorial.py @@ -0,0 +1,617 @@ +# -*- coding: utf-8 -*- + +""" +torch.export Nightly Tutorial +================ +**Author:** William Wen, Zhengxu Chen, Angela Yi +""" + +###################################################################### +# +# .. warning:: +# +# ``torch.export`` and its related features are in prototype status and are subject to backwards compatibility +# breaking changes. This tutorial provides a snapshot of ``torch.export`` usage as of PyTorch 2.1. +# +# :func:`torch.export` is the PyTorch 2.X way to export PyTorch models into +# standardized model representations, intended +# to be run on different (i.e. Python-less) environments. +# +# In this tutorial, you will learn how to use :func:`torch.export` to extract +# ``ExportedProgram``'s (i.e. single-graph representations) from PyTorch programs. +# We also detail some considerations/modifications that you may need +# to make in order to make your model compatible with ``torch.export``. +# +# **Contents** +# +# .. contents:: +# :local: + +###################################################################### +# Basic Usage +# ----------- +# +# ``torch.export`` extracts single-graph representations from PyTorch programs +# by tracing the target function, given example inputs. +# ``torch.export.export()`` is the main entrypoint for ``torch.export``. +# +# In this tutorial, ``torch.export`` and ``torch.export.export()`` are practically synonymous, +# though ``torch.export`` generally refers to the PyTorch 2.X export process, and ``torch.export.export()`` +# generally refers to the actual function call. +# +# The signature of ``torch.export.export()`` is: +# +# .. code:: python +# +# export( +# f: Callable, +# args: Tuple[Any, ...], +# kwargs: Optional[Dict[str, Any]] = None, +# *, +# dynamic_shapes: Optional[Dict[str, Dict[int, Dim]]] = None +# ) -> ExportedProgram +# +# ``torch.export.export()`` traces the tensor computation graph from calling ``f(*args, **kwargs)`` +# and wraps it in an ``ExportedProgram``, which can be serialized or executed later with +# different inputs. Note that while the output ``ExportedGraph`` is callable and can be +# called in the same way as the original input callable, it is not a ``torch.nn.Module``. +# We will detail the ``dynamic_shapes`` argument later in the tutorial. + +import torch +from torch.export import export + +class MyModule(torch.nn.Module): + def __init__(self): + super().__init__() + self.lin = torch.nn.Linear(100, 10) + + def forward(self, x, y): + return torch.nn.functional.relu(self.lin(x + y), inplace=True) + +mod = MyModule() +exported_mod = export(mod, (torch.randn(8, 100), torch.randn(8, 100))) +print(type(exported_mod)) +print(exported_mod(torch.randn(8, 100), torch.randn(8, 100))) + +###################################################################### +# Let's review some attributes of ``ExportedProgram`` that are of interest. +# +# The ``graph`` attribute is an `FX graph `__ +# traced from the function we exported, that is, the computation graph of all PyTorch operations. +# The FX graph has some important properties: +# +# - The operations are "ATen-level" operations. +# - The graph is "functionalized", meaning that no operations are mutations. +# +# The ``graph_module`` attribute is the ``GraphModule`` that wraps the ``graph`` attribute +# so that it can be ran as a ``torch.nn.Module``. + +print(exported_mod) +print(exported_mod.graph_module) + +###################################################################### +# The printed code shows that FX graph only contains ATen-level ops (such as ``torch.ops.aten``) +# and that mutations were removed. For example, the mutating op ``torch.nn.functional.relu(..., inplace=True)`` +# is represented in the printed code by ``torch.ops.aten.relu.default``, which does not mutate. +# Future uses of input to the original mutating ``relu`` op are replaced by the additional new output +# of the replacement non-mutating ``relu`` op. +# +# Other attributes of interest in ``ExportedProgram`` include: +# +# - ``graph_signature`` -- the inputs, outputs, parameters, buffers, etc. of the exported graph. +# - ``range_constraints`` and ``equality_constraints`` -- constraints, covered later + +print(exported_mod.graph_signature) + +###################################################################### +# See the ``torch.export`` `documentation `__ +# for more details. + +###################################################################### +# Graph Breaks +# ------------ +# +# Although ``torch.export`` shares components with ``torch.compile``, +# the key limitation of ``torch.export``, especially when compared to ``torch.compile``, is that it does not +# support graph breaks. This is because handling graph breaks involves interpreting +# the unsupported operation with default Python evaluation, which is incompatible +# with the export use case. Therefore, in order to make your model code compatible +# with ``torch.export``, you will need to modify your code to remove graph breaks. +# +# A graph break is necessary in cases such as: +# +# - data-dependent control flow + +def bad1(x): + if x.sum() > 0: + return torch.sin(x) + return torch.cos(x) + +import traceback as tb +try: + export(bad1, (torch.randn(3, 3),)) +except Exception: + tb.print_exc() + +###################################################################### +# - accessing tensor data with ``.data`` + +def bad2(x): + x.data[0, 0] = 3 + return x + +try: + export(bad2, (torch.randn(3, 3),)) +except Exception: + tb.print_exc() + +###################################################################### +# - calling unsupported functions (such as many built-in functions) + +def bad3(x): + x = x + 1 + return x + id(x) + +try: + export(bad3, (torch.randn(3, 3),)) +except Exception: + tb.print_exc() + +###################################################################### +# - unsupported Python language features (e.g. throwing exceptions, match statements) + +def bad4(x): + try: + x = x + 1 + raise RuntimeError("bad") + except: + x = x + 2 + return x + +try: + export(bad4, (torch.randn(3, 3),)) +except Exception: + tb.print_exc() + +###################################################################### +# The sections below demonstrate some ways you can modify your code +# in order to remove graph breaks. + +###################################################################### +# Control Flow Ops +# ---------------- +# +# ``torch.export`` actually does support data-dependent control flow. +# But these need to be expressed using control flow ops. For example, +# we can fix the control flow example above using the ``cond`` op, like so: + +from functorch.experimental.control_flow import cond + +def bad1_fixed(x): + def true_fn(x): + return torch.sin(x) + def false_fn(x): + return torch.cos(x) + return cond(x.sum() > 0, true_fn, false_fn, [x]) + +exported_bad1_fixed = export(bad1_fixed, (torch.randn(3, 3),)) +print(exported_bad1_fixed(torch.ones(3, 3))) +print(exported_bad1_fixed(-torch.ones(3, 3))) + +###################################################################### +# There are limitations to ``cond`` that one should be aware of: +# +# - The predicate (i.e. ``x.sum() > 0``) must result in a boolean or a single-element tensor. +# - The operands (i.e. ``[x]``) must be tensors. +# - The branch function (i.e. ``true_fn`` and ``false_fn``) signature must match with the +# operands and they must both return a single tensor with the same metadata (for example, ``dtype``, ``shape``, etc.). +# - Branch functions cannot mutate input or global variables. +# - Branch functions cannot access closure variables, except for ``self`` if the function is +# defined in the scope of a method. +# +# For more details about ``cond``, check out the `documentation `__. + +###################################################################### +# .. +# [NOTE] map is not documented at the moment +# We can also use ``map``, which applies a function across the first dimension +# of the first tensor argument. +# +# from functorch.experimental.control_flow import map +# +# def map_example(xs): +# def map_fn(x, const): +# def true_fn(x): +# return x + const +# def false_fn(x): +# return x - const +# return control_flow.cond(x.sum() > 0, true_fn, false_fn, [x]) +# return control_flow.map(map_fn, xs, torch.tensor([2.0])) +# +# exported_map_example= export(map_example, (torch.randn(4, 3),)) +# inp = torch.cat((torch.ones(2, 3), -torch.ones(2, 3))) +# print(exported_map_example(inp)) + +###################################################################### +# Constraints/Dynamic Shapes +# -------------------------- +# +# Ops can have different specializations/behaviors for different tensor shapes, so by default, +# ``torch.export`` requires inputs to ``ExportedProgram`` to have the same shape as the respective +# example inputs given to the initial ``torch.export.export()`` call. +# If we try to run the ``ExportedProgram`` in the example below with a tensor +# with a different shape, we get an error: + +class MyModule2(torch.nn.Module): + def __init__(self): + super().__init__() + self.lin = torch.nn.Linear(100, 10) + + def forward(self, x, y): + return torch.nn.functional.relu(self.lin(x + y), inplace=True) + +mod2 = MyModule2() +exported_mod2 = export(mod2, (torch.randn(8, 100), torch.randn(8, 100))) + +try: + exported_mod2(torch.randn(10, 100), torch.randn(10, 100)) +except Exception: + tb.print_exc() + +###################################################################### +# We can relax this constraint using the ``dynamic_shapes`` argument of +# ``torch.export.export()``, which allows us to specify, using ``torch.export.Dim`` +# (`documentation `__), +# which dimensions of the input tensors are dynamic. +# +# For each tensor argument of the input callable, we can specify a mapping from the dimension +# to a ``torch.export.Dim``. +# A ``torch.export.Dim`` is essentially a named symbolic integer with optional +# minimum and maximum bounds. +# +# Then, the format of ``torch.export.export()``'s ``dynamic_shapes`` argument is a mapping +# from the input callable's tensor argument names, to dimension --> dim mappings as described above. +# If there is no ``torch.export.Dim`` given to a tensor argument's dimension, then that dimension is +# assumed to be static. +# +# The first argument of ``torch.export.Dim`` is the name for the symbolic integer, used for debugging. +# Then we can specify an optional minimum and maximum bound (inclusive). Below, we show example usage. +# +# In the example below, our input +# ``inp1`` has an unconstrained first dimension, but the size of the second +# dimension must be in the interval [4, 18]. + +from torch.export import Dim + +inp1 = torch.randn(10, 10, 2) + +def dynamic_shapes_example1(x): + x = x[:, 2:] + return torch.relu(x) + +inp1_dim0 = Dim("inp1_dim0") +inp1_dim1 = Dim("inp1_dim1", min=4, max=18) +dynamic_shapes1 = { + "x": {0: inp1_dim0, 1: inp1_dim1}, +} + +exported_dynamic_shapes_example1 = export(dynamic_shapes_example1, (inp1,), dynamic_shapes=dynamic_shapes1) + +print(exported_dynamic_shapes_example1(torch.randn(5, 5, 2))) + +try: + exported_dynamic_shapes_example1(torch.randn(8, 1, 2)) +except Exception: + tb.print_exc() + +try: + exported_dynamic_shapes_example1(torch.randn(8, 20, 2)) +except Exception: + tb.print_exc() + +try: + exported_dynamic_shapes_example1(torch.randn(8, 8, 3)) +except Exception: + tb.print_exc() + +###################################################################### +# Note that if our example inputs to ``torch.export`` do not satisfy the constraints +# given by ``dynamic_shapes``, then we get an error. + +inp1_dim1_bad = Dim("inp1_dim1_bad", min=11, max=18) +dynamic_shapes1_bad = { + "x": {0: inp1_dim0, 1: inp1_dim1_bad}, +} + +try: + export(dynamic_shapes_example1, (inp1,), dynamic_shapes=dynamic_shapes1_bad) +except Exception: + tb.print_exc() + +###################################################################### +# We can enforce that equalities between dimensions of different tensors +# by using the same ``torch.export.Dim`` object, for example, in matrix multiplication: + +inp2 = torch.randn(4, 8) +inp3 = torch.randn(8, 2) + +def dynamic_shapes_example2(x, y): + return x @ y + +inp2_dim0 = Dim("inp2_dim0") +inner_dim = Dim("inner_dim") +inp3_dim1 = Dim("inp3_dim1") + +dynamic_shapes2 = { + "x": {0: inp2_dim0, 1: inner_dim}, + "y": {0: inner_dim, 1: inp3_dim1}, +} + +exported_dynamic_shapes_example2 = export(dynamic_shapes_example2, (inp2, inp3), dynamic_shapes=dynamic_shapes2) + +print(exported_dynamic_shapes_example2(torch.randn(2, 16), torch.randn(16, 4))) + +try: + exported_dynamic_shapes_example2(torch.randn(4, 8), torch.randn(4, 2)) +except Exception: + tb.print_exc() + +###################################################################### +# We can actually use ``torch.export`` to guide us as to which ``dynamic_shapes`` constraints +# are necessary. We can do this by relaxing all constraints (recall that if we +# do not provide constraints for a dimension, the default behavior is to constrain +# to the exact shape value of the example input) and letting ``torch.export`` +# error out. + +inp4 = torch.randn(8, 16) +inp5 = torch.randn(16, 32) + +def dynamic_shapes_example3(x, y): + if x.shape[0] <= 16: + return x @ y[:, :16] + return y + +dynamic_shapes3 = { + "x": {i: Dim(f"inp4_dim{i}") for i in range(inp4.dim())}, + "y": {i: Dim(f"inp5_dim{i}") for i in range(inp5.dim())}, +} + +try: + export(dynamic_shapes_example3, (inp4, inp5), dynamic_shapes=dynamic_shapes3) +except Exception: + tb.print_exc() + +###################################################################### +# We can see that the error message gives us suggested fixes to our +# dynamic shape constraints. Let us follow those suggestions (exact +# suggestions may differ slightly): + +def suggested_fixes(): + inp4_dim1 = Dim('shared_dim') + # suggested fixes below + inp4_dim0 = Dim('inp4_dim0', max=16) + inp5_dim1 = Dim('inp5_dim1', min=17) + inp5_dim0 = inp4_dim1 + # end of suggested fixes + return { + "x": {0: inp4_dim0, 1: inp4_dim1}, + "y": {0: inp5_dim0, 1: inp5_dim1}, + } + +dynamic_shapes3_fixed = suggested_fixes() +exported_dynamic_shapes_example3 = export(dynamic_shapes_example3, (inp4, inp5), dynamic_shapes=dynamic_shapes3_fixed) +print(exported_dynamic_shapes_example3(torch.randn(4, 32), torch.randn(32, 64))) + +###################################################################### +# Note that in the example above, because we constrained the value of ``x.shape[0]`` in +# ``dynamic_shapes_example3``, the exported program is sound even though there is a +# raw ``if`` statement. +# +# If you want to see why ``torch.export`` generated these constraints, you can +# re-run the script with the environment variable ``TORCH_LOGS=dynamic,dynamo``, +# or use ``torch._logging.set_logs``. + +import logging +torch._logging.set_logs(dynamic=logging.INFO, dynamo=logging.INFO) +exported_dynamic_shapes_example3 = export(dynamic_shapes_example3, (inp4, inp5), dynamic_shapes=dynamic_shapes3_fixed) + +# reset to previous values +torch._logging.set_logs(dynamic=logging.WARNING, dynamo=logging.WARNING) + +###################################################################### +# We can view an ``ExportedProgram``'s constraints using the ``range_constraints`` and +# ``equality_constraints`` attributes. The logging above reveals what the symbols ``s0, s1, ...`` +# represent. + +print(exported_dynamic_shapes_example3.range_constraints) +print(exported_dynamic_shapes_example3.equality_constraints) + +###################################################################### +# Custom Ops +# ---------- +# +# ``torch.export`` can export PyTorch programs with custom operators. +# +# +# Currently, the steps to register a custom op for use by ``torch.export`` are: +# +# - Define the custom op using ``torch.library`` (`reference `__) +# as with any other custom op + +from torch.library import Library, impl + +m = Library("my_custom_library", "DEF") + +m.define("custom_op(Tensor input) -> Tensor") + +@impl(m, "custom_op", "CompositeExplicitAutograd") +def custom_op(x): + print("custom_op called!") + return torch.relu(x) + +###################################################################### +# - Define a ``"Meta"`` implementation of the custom op that returns an empty +# tensor with the same shape as the expected output + +@impl(m, "custom_op", "Meta") +def custom_op_meta(x): + return torch.empty_like(x) + +###################################################################### +# - Call the custom op from the code you want to export using ``torch.ops`` + +def custom_op_example(x): + x = torch.sin(x) + x = torch.ops.my_custom_library.custom_op(x) + x = torch.cos(x) + return x + +###################################################################### +# - Export the code as before + +exported_custom_op_example = export(custom_op_example, (torch.randn(3, 3),)) +exported_custom_op_example.graph_module.print_readable() +print(exported_custom_op_example(torch.randn(3, 3))) + +###################################################################### +# Note in the above outputs that the custom op is included in the exported graph. +# And when we call the exported graph as a function, the original custom op is called, +# as evidenced by the ``print`` call. +# +# If you have a custom operator implemented in C++, please refer to +# `this document `__ +# to make it compatible with ``torch.export``. + +###################################################################### +# Decompositions +# -------------- +# +# The graph produced by ``torch.export`` by default returns a graph containing +# only functional ATen operators. This functional ATen operator set (or "opset") contains around 2000 +# operators, all of which are functional, that is, they do not +# mutate or alias inputs. You can find a list of all ATen operators +# `here `__ +# and you can inspect if an operator is functional by checking +# ``op._schema.is_mutable``, for example: + +print(torch.ops.aten.add.Tensor._schema.is_mutable) +print(torch.ops.aten.add_.Tensor._schema.is_mutable) + +###################################################################### +# By default, the environment in which you want to run the exported graph +# should support all ~2000 of these operators. +# However, you can use the following API on the exported program +# if your specific environment is only able to support a subset of +# the ~2000 operators. +# +# .. code:: python +# +# def run_decompositions( +# self: ExportedProgram, +# decomposition_table: Optional[Dict[torch._ops.OperatorBase, Callable]] +# ) -> ExportedProgram +# +# ``run_decompositions`` takes in a decomposition table, which is a mapping of +# operators to a function specifying how to reduce, or decompose, that operator +# into an equivalent sequence of other ATen operators. +# +# The default decomposition table for ``run_decompositions`` is the +# `Core ATen decomposition table `__ +# which will decompose the all ATen operators to the +# `Core ATen Operator Set `__ +# which consists of only ~180 operators. + +class M(torch.nn.Module): + def __init__(self): + super().__init__() + self.linear = torch.nn.Linear(3, 4) + + def forward(self, x): + return self.linear(x) + +ep = export(M(), (torch.randn(2, 3),)) +print(ep.graph) + +core_ir_ep = ep.run_decompositions() +print(core_ir_ep.graph) + +###################################################################### +# Notice that after running ``run_decompositions`` the +# ``torch.ops.aten.t.default`` operator, which is not part of the Core ATen +# Opset, has been replaced with ``torch.ops.aten.permute.default`` which is part +# of the Core ATen Opset. + +###################################################################### +# Most ATen operators already have decompositions, which are located +# `here `__. +# If you would like to use some of these existing decomposition functions, +# you can pass in a list of operators you would like to decompose to the +# :func:`get_decompositions `__ +# function, which will return a decomposition table using the pre-implemented +# decompositions. + +class M(torch.nn.Module): + def __init__(self): + super().__init__() + self.linear = torch.nn.Linear(3, 4) + + def forward(self, x): + return self.linear(x) + +ep = export(M(), (torch.randn(2, 3),)) +print(ep.graph) + +from torch._decomp import get_decompositions +decomp_table = get_decompositions([torch.ops.aten.t.default, torch.ops.aten.transpose.int]) +core_ir_ep = ep.run_decompositions(decomp_table) +print(core_ir_ep.graph) + +###################################################################### +# If there is no existing decomposition function for an ATen operator that you would +# like to decompose, feel free to send a pull request into PyTorch +# implementing the decomposition! + +###################################################################### +# ExportDB +# -------- +# +# ``torch.export`` will only ever export a single computation graph from a PyTorch program. Because of this requirement, +# there will be Python or PyTorch features that are not compatible with ``torch.export``, which will require users to +# rewrite parts of their model code. We have seen examples of this earlier in the tutorial -- for example, rewriting +# if-statements using ``cond``. +# +# `ExportDB `__ is the standard reference that documents +# supported and unsupported Python/PyTorch features for ``torch.export``. It is essentially a list a program samples, each +# of which represents the usage of one particular Python/PyTorch feature and its interaction with ``torch.export``. +# Examples are also tagged by category so that they can be more easily searched. +# +# For example, let's use ExportDB to get a better understanding of how the predicate works in the ``cond`` operator. +# We can look at the example called ``cond_predicate``, which has a ``torch.cond`` tag. The example code looks like: + +def cond_predicate(x): + """ + The conditional statement (aka predicate) passed to ``cond()`` must be one of the following: + - torch.Tensor with a single element + - boolean expression + NOTE: If the `pred` is test on a dim with batch size < 2, it will be specialized. + """ + pred = x.dim() > 2 and x.shape[2] > 10 + return cond(pred, lambda x: x.cos(), lambda y: y.sin(), [x]) + +###################################################################### +# More generally, ExportDB can be used as a reference when one of the following occurs: +# +# 1. Before attempting ``torch.export``, you know ahead of time that your model uses some tricky Python/PyTorch features +# and you want to know if ``torch.export`` covers that feature. +# 2. When attempting ``torch.export``, there is a failure and it's unclear how to work around it. +# +# ExportDB is not exhaustive, but is intended to cover all use cases found in typical PyTorch code. Feel free to reach +# out if there is an important Python/PyTorch feature that should be added to ExportDB or supported by ``torch.export``. + +###################################################################### +# Conclusion +# ---------- +# +# We introduced ``torch.export``, the new PyTorch 2.X way to export single computation +# graphs from PyTorch programs. In particular, we demonstrate several code modifications +# and considerations (control flow ops, constraints, etc.) that need to be made in order to export a graph. diff --git a/intermediate_source/torch_export_nightly_tutorial.rst b/intermediate_source/torch_export_nightly_tutorial.rst new file mode 100644 index 00000000000..fe571fd24a4 --- /dev/null +++ b/intermediate_source/torch_export_nightly_tutorial.rst @@ -0,0 +1,858 @@ +torch.export Nightly Tutorial +============================= +**Author:** William Wen, Zhengxu Chen, Angela Yi + + +.. warning:: + + ``torch.export`` and its related features are in prototype status and are subject to backwards compatibility + breaking changes. + +.. note:: + Outputs (e.g. from print statements) are only samples. + +:func:`torch.export` is the PyTorch 2.X way to export PyTorch models into +standardized model representations, intended +to be run on different (i.e. Python-less) environments. + +In this tutorial, you will learn how to use :func:`torch.export` to extract +``ExportedProgram``'s (i.e. single-graph representations) from PyTorch programs. +We also detail some considerations/modifications that you may need +to make in order to make your model compatible with ``torch.export``. + +**Contents** + +.. contents:: + :local: + +Basic Usage +----------- + +``torch.export`` extracts single-graph representations from PyTorch programs +by tracing the target function, given example inputs. +``torch.export.export()`` is the main entrypoint for ``torch.export``. + +In this tutorial, ``torch.export`` and ``torch.export.export()`` are practically synonymous, +though ``torch.export`` generally refers to the PyTorch 2.X export process, and ``torch.export.export()`` +generally refers to the actual function call. + +The signature of ``torch.export.export()`` is: + +.. code-block:: python + + export( + f: Callable, + args: Tuple[Any, ...], + kwargs: Optional[Dict[str, Any]] = None, + *, + dynamic_shapes: Optional[Dict[str, Dict[int, Dim]]] = None + ) -> ExportedProgram + +``torch.export.export()`` traces the tensor computation graph from calling ``f(*args, **kwargs)`` +and wraps it in an ``ExportedProgram``, which can be serialized or executed later with +different inputs. Note that while the output ``ExportedGraph`` is callable and can be +called in the same way as the original input callable, it is not a ``torch.nn.Module``. +We will detail the ``dynamic_shapes`` argument later in the tutorial. + +.. code-block:: python + + import torch + from torch.export import export + + class MyModule(torch.nn.Module): + def __init__(self): + super().__init__() + self.lin = torch.nn.Linear(100, 10) + + def forward(self, x, y): + return torch.nn.functional.relu(self.lin(x + y), inplace=True) + + mod = MyModule() + exported_mod = export(mod, (torch.randn(8, 100), torch.randn(8, 100))) + print(type(exported_mod)) + print(exported_mod(torch.randn(8, 100), torch.randn(8, 100))) + +.. code-block:: bash + + + tensor([[0.0000, 1.2178, 0.0000, 0.4397, 0.4774, 0.0000, 0.0000, 0.0943, 0.0000, + 0.4656], + [0.8333, 0.0000, 0.5912, 0.0000, 1.4689, 0.2122, 0.1996, 0.4628, 0.0000, + 0.7495], + [0.0000, 0.0000, 0.3900, 0.0000, 0.0000, 0.0000, 0.4515, 0.0000, 0.8187, + 0.8938], + [0.5753, 0.7709, 0.0000, 0.0000, 0.0000, 0.8081, 0.0000, 0.0000, 0.8002, + 0.9441], + [0.0000, 0.0000, 0.0000, 0.0000, 0.5711, 1.0921, 0.3438, 0.3268, 0.4640, + 0.0000], + [0.0000, 0.0000, 0.0000, 0.2434, 0.7253, 0.6886, 0.0000, 0.6982, 0.5100, + 0.0000], + [0.2279, 0.0000, 1.2951, 1.1055, 0.0000, 0.0000, 0.0000, 0.2088, 0.0000, + 0.5022], + [0.0000, 0.0000, 1.1468, 0.0000, 0.5220, 1.1592, 0.9096, 0.0000, 0.4248, + 1.2142]], grad_fn=) + +Let's review some attributes of ``ExportedProgram`` that are of interest. + +The ``graph`` attribute is an `FX graph `__ +traced from the function we exported, that is, the computation graph of all PyTorch operations. +The FX graph has some important properties: + +- The operations are "ATen-level" operations. +- The graph is "functionalized", meaning that no operations are mutations. + +The ``graph_module`` attribute is the ``GraphModule`` that wraps the ``graph`` attribute +so that it can be ran as a ``torch.nn.Module``. + +.. code-block:: python + + print(exported_mod) + print(exported_mod.graph_module) + +.. code-block:: bash + + ExportedProgram: + class GraphModule(torch.nn.Module): + def forward(self, arg0_1: f32[10, 100], arg1_1: f32[10], arg2_1: f32[8, 100], arg3_1: f32[8, 100]): + # File: torch_export_nightly_tutorial.py:69, code: return torch.nn.functional.relu(self.lin(x + y), inplace=True) + add: f32[8, 100] = torch.ops.aten.add.Tensor(arg2_1, arg3_1); arg2_1 = arg3_1 = None + t: f32[100, 10] = torch.ops.aten.t.default(arg0_1); arg0_1 = None + addmm: f32[8, 10] = torch.ops.aten.addmm.default(arg1_1, add, t); arg1_1 = add = t = None + relu: f32[8, 10] = torch.ops.aten.relu.default(addmm); addmm = None + return (relu,) + + Graph signature: ExportGraphSignature(input_specs=[InputSpec(kind=, arg=TensorArgument(name='arg0_1'), target='lin.weight'), InputSpec(kind=, arg=TensorArgument(name='arg1_1'), target='lin.bias'), InputSpec(kind=, arg=TensorArgument(name='arg2_1'), target=None), InputSpec(kind=, arg=TensorArgument(name='arg3_1'), target=None)], output_specs=[OutputSpec(kind=, arg=TensorArgument(name='relu'), target=None)]) + Range constraints: {} + Equality constraints: [] + + GraphModule() + + + + def forward(self, arg0_1, arg1_1, arg2_1, arg3_1): + add = torch.ops.aten.add.Tensor(arg2_1, arg3_1); arg2_1 = arg3_1 = None + t = torch.ops.aten.t.default(arg0_1); arg0_1 = None + addmm = torch.ops.aten.addmm.default(arg1_1, add, t); arg1_1 = add = t = None + relu = torch.ops.aten.relu.default(addmm); addmm = None + return (relu,) + +The printed code shows that FX graph only contains ATen-level ops (such as ``torch.ops.aten``) +and that mutations were removed. For example, the mutating op ``torch.nn.functional.relu(..., inplace=True)`` +is represented in the printed code by ``torch.ops.aten.relu.default``, which does not mutate. +Future uses of input to the original mutating ``relu`` op are replaced by the additional new output +of the replacement non-mutating ``relu`` op. + +Other attributes of interest in ``ExportedProgram`` include: + +- ``graph_signature`` -- the inputs, outputs, parameters, buffers, etc. of the exported graph. +- ``range_constraints`` and ``equality_constraints`` -- constraints, covered later + +.. code-block:: python + + print(exported_mod.graph_signature) + +.. code-block:: bash + + ExportGraphSignature(parameters=['lin.weight', 'lin.bias'], buffers=[], user_inputs=['arg2_1', 'arg3_1'], user_outputs=['relu'], inputs_to_parameters={'arg0_1': 'lin.weight', 'arg1_1': 'lin.bias'}, inputs_to_buffers={}, buffers_to_mutate={}, backward_signature=None, assertion_dep_token=None) + +See the ``torch.export`` `documentation `__ +for more details. + +Graph Breaks +------------ + +Although ``torch.export`` shares components with ``torch.compile``, +the key limitation of ``torch.export``, especially when compared to ``torch.compile``, is that it does not +support graph breaks. This is because handling graph breaks involves interpreting +the unsupported operation with default Python evaluation, which is incompatible +with the export use case. Therefore, in order to make your model code compatible +with ``torch.export``, you will need to modify your code to remove graph breaks. + +A graph break is necessary in cases such as: + +- data-dependent control flow + +.. code-block:: python + + def bad1(x): + if x.sum() > 0: + return torch.sin(x) + return torch.cos(x) + + import traceback as tb + try: + export(bad1, (torch.randn(3, 3),)) + except Exception: + tb.print_exc() + +.. code-block:: bash + + torch._dynamo.exc.UserError: Dynamic control flow is not supported at the moment. Please use functorch.experimental.control_flow.cond to explicitly capture the control flow + + from user code: + File "torch_export_nightly_tutorial.py", line 126, in bad1 + if x.sum() > 0: + +- accessing tensor data with ``.data`` + +.. code-block:: python + + def bad2(x): + x.data[0, 0] = 3 + return x + + try: + export(bad2, (torch.randn(3, 3),)) + except Exception: + tb.print_exc() + +.. code-block:: bash + + RuntimeError: + Found following user inputs located at [0] are mutated. This is currently banned in the aot_export workflow. + +- calling unsupported functions (such as many built-in functions) + +.. code-block:: python + + def bad3(x): + x = x + 1 + return x + id(x) + + try: + export(bad3, (torch.randn(3, 3),)) + except Exception: + tb.print_exc() + +.. code-block:: bash + + torch._dynamo.exc.Unsupported: call_id with args (TensorVariable(),) + + from user code: + File "torch_export_nightly_tutorial.py", line 155, in bad3 + return x + id(x) + +- unsupported Python language features (e.g. throwing exceptions, match statements) + +.. code-block:: python + + def bad4(x): + try: + x = x + 1 + raise RuntimeError("bad") + except: + x = x + 2 + return x + + try: + export(bad4, (torch.randn(3, 3),)) + except Exception: + tb.print_exc() + +.. code-block:: bash + + torch._dynamo.exc.Unsupported: call_function BuiltinVariable(RuntimeError) [ConstantVariable(str)] {} + + from user code: + File "torch_export_nightly_tutorial.py", line 168, in bad4 + raise RuntimeError("bad") + +The sections below demonstrate some ways you can modify your code +in order to remove graph breaks. + +Control Flow Ops +---------------- + +``torch.export`` actually does support data-dependent control flow. +But these need to be expressed using control flow ops. For example, +we can fix the control flow example above using the ``cond`` op, like so: + +.. code-block:: python + + from functorch.experimental.control_flow import cond + + def bad1_fixed(x): + def true_fn(x): + return torch.sin(x) + def false_fn(x): + return torch.cos(x) + return cond(x.sum() > 0, true_fn, false_fn, [x]) + + exported_bad1_fixed = export(bad1_fixed, (torch.randn(3, 3),)) + print(exported_bad1_fixed(torch.ones(3, 3))) + print(exported_bad1_fixed(-torch.ones(3, 3))) + +.. code-block:: bash + + tensor([[0.8415, 0.8415, 0.8415], + [0.8415, 0.8415, 0.8415], + [0.8415, 0.8415, 0.8415]]) + tensor([[0.5403, 0.5403, 0.5403], + [0.5403, 0.5403, 0.5403], + [0.5403, 0.5403, 0.5403]]) + +There are limitations to ``cond`` that one should be aware of: + +- The predicate (i.e. ``x.sum() > 0``) must result in a boolean or a single-element tensor. +- The operands (i.e. ``[x]``) must be tensors. +- The branch function (i.e. ``true_fn`` and ``false_fn``) signature must match with the + operands and they must both return a single tensor with the same metadata (for example, ``dtype``, ``shape``, etc.). +- Branch functions cannot mutate input or global variables. +- Branch functions cannot access closure variables, except for ``self`` if the function is + defined in the scope of a method. + +For more details about ``cond``, check out the `documentation `__. + +.. + [NOTE] map is not documented at the moment + We can also use ``map``, which applies a function across the first dimension + of the first tensor argument. + + from functorch.experimental.control_flow import map + + def map_example(xs): + def map_fn(x, const): + def true_fn(x): + return x + const + def false_fn(x): + return x - const + return control_flow.cond(x.sum() > 0, true_fn, false_fn, [x]) + return control_flow.map(map_fn, xs, torch.tensor([2.0])) + + exported_map_example= export(map_example, (torch.randn(4, 3),)) + inp = torch.cat((torch.ones(2, 3), -torch.ones(2, 3))) + print(exported_map_example(inp)) + +Constraints/Dynamic Shapes +-------------------------- + +Ops can have different specializations/behaviors for different tensor shapes, so by default, +``torch.export`` requires inputs to ``ExportedProgram`` to have the same shape as the respective +example inputs given to the initial ``torch.export.export()`` call. +If we try to run the ``ExportedProgram`` in the example below with a tensor +with a different shape, we get an error: + +.. code-block:: python + + class MyModule2(torch.nn.Module): + def __init__(self): + super().__init__() + self.lin = torch.nn.Linear(100, 10) + + def forward(self, x, y): + return torch.nn.functional.relu(self.lin(x + y), inplace=True) + + mod2 = MyModule2() + exported_mod2 = export(mod2, (torch.randn(8, 100), torch.randn(8, 100))) + + try: + exported_mod2(torch.randn(10, 100), torch.randn(10, 100)) + except Exception: + tb.print_exc() + +.. code-block:: bash + + RuntimeError: Input arg3_1.shape[0] is specialized at 8 + +We can relax this constraint using the ``dynamic_shapes`` argument of +``torch.export.export()``, which allows us to specify, using ``torch.export.Dim`` +(`documentation `__), +which dimensions of the input tensors are dynamic. + +For each tensor argument of the input callable, we can specify a mapping from the dimension +to a ``torch.export.Dim``. +A ``torch.export.Dim`` is essentially a named symbolic integer with optional +minimum and maximum bounds. + +Then, the format of ``torch.export.export()``'s ``dynamic_shapes`` argument is a mapping +from the input callable's tensor argument names, to dimension --> dim mappings as described above. +If there is no ``torch.export.Dim`` given to a tensor argument's dimension, then that dimension is +assumed to be static. + +The first argument of ``torch.export.Dim`` is the name for the symbolic integer, used for debugging. +Then we can specify an optional minimum and maximum bound (inclusive). Below, we show example usage. + +In the example below, our input +``inp1`` has an unconstrained first dimension, but the size of the second +dimension must be in the interval [4, 18]. + +.. code-block:: python + + from torch.export import Dim + + inp1 = torch.randn(10, 10, 2) + + def dynamic_shapes_example1(x): + x = x[:, 2:] + return torch.relu(x) + + inp1_dim0 = Dim("inp1_dim0") + inp1_dim1 = Dim("inp1_dim1", min=4, max=18) + dynamic_shapes1 = { + "x": {0: inp1_dim0, 1: inp1_dim1}, + } + + exported_dynamic_shapes_example1 = export(dynamic_shapes_example1, (inp1,), dynamic_shapes=dynamic_shapes1) + + print(exported_dynamic_shapes_example1(torch.randn(5, 5, 2))) + + try: + exported_dynamic_shapes_example1(torch.randn(8, 1, 2)) + except Exception: + tb.print_exc() + + try: + exported_dynamic_shapes_example1(torch.randn(8, 20, 2)) + except Exception: + tb.print_exc() + + try: + exported_dynamic_shapes_example1(torch.randn(8, 8, 3)) + except Exception: + tb.print_exc() + +.. code-block:: bash + + tensor([[[0.0000, 0.0828], + [0.8190, 0.0000], + [0.0037, 0.0221]], + + [[0.0000, 2.0898], + [0.0000, 0.0000], + [0.8182, 2.9165]], + + [[1.3572, 0.7422], + [0.4423, 0.0000], + [0.0000, 0.0000]], + + [[0.0000, 0.2497], + [0.0000, 0.1912], + [0.0000, 0.0000]], + + [[0.0000, 1.0522], + [0.4442, 0.0000], + [1.4188, 0.8161]]]) + + RuntimeError: Input arg0_1.shape[1] is outside of specified dynamic range [4, 18] + + RuntimeError: Input arg0_1.shape[1] is outside of specified dynamic range [4, 18] + + RuntimeError: Input arg0_1.shape[2] is specialized at 2 + +Note that if our example inputs to ``torch.export`` do not satisfy the constraints +given by ``dynamic_shapes``, then we get an error. + +.. code-block:: python + + inp1_dim1_bad = Dim("inp1_dim1_bad", min=11, max=18) + dynamic_shapes1_bad = { + "x": {0: inp1_dim0, 1: inp1_dim1_bad}, + } + + try: + export(dynamic_shapes_example1, (inp1,), dynamic_shapes=dynamic_shapes1_bad) + except Exception: + tb.print_exc() + +.. code-block:: python + + torch._dynamo.exc.UserError: 10 not in range [11, 18] + +We can enforce that equalities between dimensions of different tensors +by using the same ``torch.export.Dim`` object, for example, in matrix multiplication: + +.. code-block:: python + + inp2 = torch.randn(4, 8) + inp3 = torch.randn(8, 2) + + def dynamic_shapes_example2(x, y): + return x @ y + + inp2_dim0 = Dim("inp2_dim0") + inner_dim = Dim("inner_dim") + inp3_dim1 = Dim("inp3_dim1") + + dynamic_shapes2 = { + "x": {0: inp2_dim0, 1: inner_dim}, + "y": {0: inner_dim, 1: inp3_dim1}, + } + + exported_dynamic_shapes_example2 = export(dynamic_shapes_example2, (inp2, inp3), dynamic_shapes=dynamic_shapes2) + + print(exported_dynamic_shapes_example2(torch.randn(2, 16), torch.randn(16, 4))) + + try: + exported_dynamic_shapes_example2(torch.randn(4, 8), torch.randn(4, 2)) + except Exception: + tb.print_exc() + +.. code-block:: bash + + tensor([[ 7.5352, -4.3836, -2.8961, 4.3412], + [ 2.3891, 4.9101, -7.4326, -0.1697]]) + + RuntimeError: Input arg0_1.shape[1] is not equal to input arg1_1.shape[0] + +We can actually use ``torch.export`` to guide us as to which ``dynamic_shapes`` constraints +are necessary. We can do this by relaxing all constraints (recall that if we +do not provide constraints for a dimension, the default behavior is to constrain +to the exact shape value of the example input) and letting ``torch.export`` +error out. + +.. code-block:: python + + inp4 = torch.randn(8, 16) + inp5 = torch.randn(16, 32) + + def dynamic_shapes_example3(x, y): + if x.shape[0] <= 16: + return x @ y[:, :16] + return y + + dynamic_shapes3 = { + "x": {i: Dim(f"inp4_dim{i}") for i in range(inp4.dim())}, + "y": {i: Dim(f"inp5_dim{i}") for i in range(inp5.dim())}, + } + + try: + export(dynamic_shapes_example3, (inp4, inp5), dynamic_shapes=dynamic_shapes3) + except Exception: + tb.print_exc() + +.. code-block:: bash + + torch._dynamo.exc.UserError: Constraints violated (inp4_dim0, inp5_dim0, inp5_dim1)! For more information, run with TORCH_LOGS=dynamic. + - The values of inp5_dim0 = L['y'].size()[0] and inp4_dim1 = L['x'].size()[1] must always be equal. + - Not all values of inp5_dim1 = L['y'].size()[1] in the specified range satisfy the generated guard Ne(L['y'].size()[1], 16). + - Not all values of inp4_dim0 = L['x'].size()[0] in the specified range satisfy the generated guard L['x'].size()[0] <= 16. + - Not all values of inp5_dim1 = L['y'].size()[1] in the specified range satisfy the generated guard L['y'].size()[1] >= 16. + + Suggested fixes: + inp4_dim0 = Dim('inp4_dim0', max=16) + inp5_dim1 = Dim('inp5_dim1', min=17) + inp5_dim0 = inp4_dim1 + +We can see that the error message gives us suggested fixes to our +dynamic shape constraints. Let us follow those suggestions (exact +suggestions may differ slightly): + +.. code-block:: python + + def suggested_fixes(): + inp4_dim1 = Dim('shared_dim') + # suggested fixes below + inp4_dim0 = Dim('inp4_dim0', max=16) + inp5_dim1 = Dim('inp5_dim1', min=17) + inp5_dim0 = inp4_dim1 + # end of suggested fixes + return { + "x": {0: inp4_dim0, 1: inp4_dim1}, + "y": {0: inp5_dim0, 1: inp5_dim1}, + } + + dynamic_shapes3_fixed = suggested_fixes() + exported_dynamic_shapes_example3 = export(dynamic_shapes_example3, (inp4, inp5), dynamic_shapes=dynamic_shapes3_fixed) + print(exported_dynamic_shapes_example3(torch.randn(4, 32), torch.randn(32, 64))) + +.. code-block:: python + + tensor([[ 4.1510, -4.1174, 3.4397, 1.5075, -4.3566, 4.2102, 7.2033, + 0.3611, -3.9041, 8.2987, -3.5751, -7.1508, 0.4470, 2.2460, + -0.9288, -8.1764], + [ -1.5879, -4.5107, -11.0845, -10.3962, -1.4359, 1.2877, -10.2839, + 7.3742, -0.5569, -2.0485, 3.1028, -2.4692, -1.3837, 6.8744, + -9.4191, -5.9387], + [ -3.4660, 2.8480, -2.9857, 11.7783, 0.2220, -5.5934, 1.9793, + 6.1118, 1.9817, -7.6156, 8.2070, -6.6976, -4.8177, -5.4002, + 9.3291, -7.0860], + [ -0.7406, -0.6509, 3.1847, -1.6311, 5.8144, 12.0439, 12.9141, + 8.8778, -9.5971, 4.1847, 5.8781, 0.1364, -7.3096, -4.0822, + -9.0587, 5.3681]]) + +Note that in the example above, because we constrained the value of ``x.shape[0]`` in +``dynamic_shapes_example3``, the exported program is sound even though there is a +raw ``if`` statement. + +If you want to see why ``torch.export`` generated these constraints, you can +re-run the script with the environment variable ``TORCH_LOGS=dynamic,dynamo``, +or use ``torch._logging.set_logs``. + +.. code-block:: python + + import logging + torch._logging.set_logs(dynamic=logging.INFO, dynamo=logging.INFO) + exported_dynamic_shapes_example3 = export(dynamic_shapes_example3, (inp4, inp5), dynamic_shapes=dynamic_shapes3_fixed) + + # reset to previous values + torch._logging.set_logs(dynamic=logging.WARNING, dynamo=logging.WARNING) + +.. code-block:: bash + + [2023-10-12 11:24:01,657] [12/0] torch._dynamo.symbolic_convert: [INFO] Step 1: torchdynamo start tracing dynamic_shapes_example3 torch_export_nightly_tutorial.py:374 + [2023-10-12 11:24:01,658] [12/0] torch.fx.experimental.symbolic_shapes: [INFO] create_env + [2023-10-12 11:24:01,663] [12/0] torch.fx.experimental.symbolic_shapes: [INFO] create_symbol s0 = 8 for L['x'].size()[0] [2, 16] + [2023-10-12 11:24:01,665] [12/0] torch.fx.experimental.symbolic_shapes: [INFO] create_symbol s1 = 16 for L['x'].size()[1] [2, 9223372036854775806] + [2023-10-12 11:24:01,677] [12/0] torch.fx.experimental.symbolic_shapes: [INFO] create_symbol s2 = 16 for L['y'].size()[0] [2, 9223372036854775806] + [2023-10-12 11:24:01,680] [12/0] torch.fx.experimental.symbolic_shapes: [INFO] create_symbol s3 = 32 for L['y'].size()[1] [17, 9223372036854775806] + [2023-10-12 11:24:01,734] [12/0] torch.fx.experimental.symbolic_shapes: [INFO] eval Eq(s1, s2) [guard added] at torch_export_nightly_tutorial.py:376 in dynamic_shapes_example3 (_meta_registrations.py:1891 in meta_mm) + [2023-10-12 11:24:01,738] [12/0] torch._dynamo.symbolic_convert: [INFO] Step 1: torchdynamo done tracing dynamic_shapes_example3 (RETURN_VALUE) + [2023-10-12 11:24:01,743] [12/0] torch._dynamo.output_graph: [INFO] Step 2: calling compiler function dynamo_normalization_capturing_compiler + [2023-10-12 11:24:01,743] [12/0] torch._dynamo.output_graph: [INFO] Step 2: done compiler function dynamo_normalization_capturing_compiler + [2023-10-12 11:24:01,747] [12/0] torch.fx.experimental.symbolic_shapes: [INFO] produce_guards + [2023-10-12 11:24:01,839] torch._dynamo.eval_frame: [INFO] Summary of dimension constraints: + [2023-10-12 11:24:01,839] torch._dynamo.eval_frame: [INFO] Suggested fixes: + [2023-10-12 11:24:01,839] torch._dynamo.eval_frame: [INFO] + [2023-10-12 11:24:01,847] torch.fx.experimental.symbolic_shapes: [INFO] create_env + +We can view an ``ExportedProgram``'s constraints using the ``range_constraints`` and +``equality_constraints`` attributes. The logging above reveals what the symbols ``s0, s1, ...`` +represent. + +.. code-block:: python + + print(exported_dynamic_shapes_example3.range_constraints) + print(exported_dynamic_shapes_example3.equality_constraints) + +.. code-block:: bash + + {s0: RangeConstraint(min_val=2, max_val=16), s1: RangeConstraint(min_val=2, max_val=9223372036854775806), s2: RangeConstraint(min_val=2, max_val=9223372036854775806), s3: RangeConstraint(min_val=17, max_val=9223372036854775806)} + [(InputDim(input_name='arg0_1', dim=1), InputDim(input_name='arg1_1', dim=0))] + +Custom Ops +---------- + +``torch.export`` can export PyTorch programs with custom operators. + +Currently, the steps to register a custom op for use by ``torch.export`` are: + +- Define the custom op using ``torch.library`` (`reference `__) + as with any other custom op + +.. code-block:: python + + from torch.library import Library, impl + + m = Library("my_custom_library", "DEF") + + m.define("custom_op(Tensor input) -> Tensor") + + @impl(m, "custom_op", "CompositeExplicitAutograd") + def custom_op(x): + print("custom_op called!") + return torch.relu(x) + +- Define a ``"Meta"`` implementation of the custom op that returns an empty + tensor with the same shape as the expected output + +.. code-block:: python + + @impl(m, "custom_op", "Meta") + def custom_op_meta(x): + return torch.empty_like(x) + +- Call the custom op from the code you want to export using ``torch.ops`` + +.. code-block:: python + + def custom_op_example(x): + x = torch.sin(x) + x = torch.ops.my_custom_library.custom_op(x) + x = torch.cos(x) + return x + +- Export the code as before + +.. code-block:: python + + exported_custom_op_example = export(custom_op_example, (torch.randn(3, 3),)) + exported_custom_op_example.graph_module.print_readable() + print(exported_custom_op_example(torch.randn(3, 3))) + +.. code-block:: bash + + custom_op called! + tensor([[0.5947, 0.8062, 0.6231], + [1.0000, 1.0000, 0.6615], + [0.5412, 1.0000, 1.0000]]) + +Note in the above outputs that the custom op is included in the exported graph. +And when we call the exported graph as a function, the original custom op is called, +as evidenced by the ``print`` call. + +If you have a custom operator implemented in C++, please refer to +`this document `__ +to make it compatible with ``torch.export``. + +Decompositions +-------------- + +The graph produced by ``torch.export`` by default returns a graph containing +only functional ATen operators. This functional ATen operator set (or "opset") contains around 2000 +operators, all of which are functional, that is, they do not +mutate or alias inputs. You can find a list of all ATen operators +`here `__ +and you can inspect if an operator is functional by checking +``op._schema.is_mutable``, for example: + +.. code-block:: python + + print(torch.ops.aten.add.Tensor._schema.is_mutable) + print(torch.ops.aten.add_.Tensor._schema.is_mutable) + +.. code-block:: bash + + False + True + +By default, the environment in which you want to run the exported graph +should support all ~2000 of these operators. +However, you can use the following API on the exported program +if your specific environment is only able to support a subset of +the ~2000 operators. + +.. code-block:: python + + def run_decompositions( + self: ExportedProgram, + decomposition_table: Optional[Dict[torch._ops.OperatorBase, Callable]] + ) -> ExportedProgram + +``run_decompositions`` takes in a decomposition table, which is a mapping of +operators to a function specifying how to reduce, or decompose, that operator +into an equivalent sequence of other ATen operators. + +The default decomposition table for ``run_decompositions`` is the +`Core ATen decomposition table `__ +which will decompose the all ATen operators to the +`Core ATen Operator Set `__ +which consists of only ~180 operators. + +.. code-block:: python + + class M(torch.nn.Module): + def __init__(self): + super().__init__() + self.linear = torch.nn.Linear(3, 4) + + def forward(self, x): + return self.linear(x) + + ep = export(M(), (torch.randn(2, 3),)) + print(ep.graph) + + core_ir_ep = ep.run_decompositions() + print(core_ir_ep.graph) + +.. code-block:: bash + + graph(): + %arg0_1 : [num_users=1] = placeholder[target=arg0_1] + %arg1_1 : [num_users=1] = placeholder[target=arg1_1] + %arg2_1 : [num_users=1] = placeholder[target=arg2_1] + %t : [num_users=1] = call_function[target=torch.ops.aten.t.default](args = (%arg0_1,), kwargs = {}) + %addmm : [num_users=1] = call_function[target=torch.ops.aten.addmm.default](args = (%arg1_1, %arg2_1, %t), kwargs = {}) + return (addmm,) + graph(): + %arg0_1 : [num_users=1] = placeholder[target=arg0_1] + %arg1_1 : [num_users=1] = placeholder[target=arg1_1] + %arg2_1 : [num_users=1] = placeholder[target=arg2_1] + %permute : [num_users=1] = call_function[target=torch.ops.aten.permute.default](args = (%arg0_1, [1, 0]), kwargs = {}) + %addmm : [num_users=1] = call_function[target=torch.ops.aten.addmm.default](args = (%arg1_1, %arg2_1, %permute), kwargs = {}) + return (addmm,) + +Notice that after running ``run_decompositions`` the +``torch.ops.aten.t.default`` operator, which is not part of the Core ATen +Opset, has been replaced with ``torch.ops.aten.permute.default`` which is part +of the Core ATen Opset. + +Most ATen operators already have decompositions, which are located +`here `__. +If you would like to use some of these existing decomposition functions, +you can pass in a list of operators you would like to decompose to the +:func:`get_decompositions `__ +function, which will return a decomposition table using the pre-implemented +decompositions. + +.. code-block:: python + + class M(torch.nn.Module): + def __init__(self): + super().__init__() + self.linear = torch.nn.Linear(3, 4) + + def forward(self, x): + return self.linear(x) + + ep = export(M(), (torch.randn(2, 3),)) + print(ep.graph) + + from torch._decomp import get_decompositions + decomp_table = get_decompositions([torch.ops.aten.t.default, torch.ops.aten.transpose.int]) + core_ir_ep = ep.run_decompositions(decomp_table) + print(core_ir_ep.graph) + +.. code-block:: bash + + graph(): + %arg0_1 : [num_users=1] = placeholder[target=arg0_1] + %arg1_1 : [num_users=1] = placeholder[target=arg1_1] + %arg2_1 : [num_users=1] = placeholder[target=arg2_1] + %t : [num_users=1] = call_function[target=torch.ops.aten.t.default](args = (%arg0_1,), kwargs = {}) + %addmm : [num_users=1] = call_function[target=torch.ops.aten.addmm.default](args = (%arg1_1, %arg2_1, %t), kwargs = {}) + return (addmm,) + graph(): + %arg0_1 : [num_users=1] = placeholder[target=arg0_1] + %arg1_1 : [num_users=1] = placeholder[target=arg1_1] + %arg2_1 : [num_users=1] = placeholder[target=arg2_1] + %permute : [num_users=1] = call_function[target=torch.ops.aten.permute.default](args = (%arg0_1, [1, 0]), kwargs = {}) + %addmm : [num_users=1] = call_function[target=torch.ops.aten.addmm.default](args = (%arg1_1, %arg2_1, %permute), kwargs = {}) + return (addmm,) + +If there is no existing decomposition function for an ATen operator that you would +like to decompose, feel free to send a pull request into PyTorch +implementing the decomposition! + +ExportDB +-------- + +``torch.export`` will only ever export a single computation graph from a PyTorch program. Because of this requirement, +there will be Python or PyTorch features that are not compatible with ``torch.export``, which will require users to +rewrite parts of their model code. We have seen examples of this earlier in the tutorial -- for example, rewriting +if-statements using ``cond``. + +`ExportDB `__ is the standard reference that documents +supported and unsupported Python/PyTorch features for ``torch.export``. It is essentially a list a program samples, each +of which represents the usage of one particular Python/PyTorch feature and its interaction with ``torch.export``. +Examples are also tagged by category so that they can be more easily searched. + +For example, let's use ExportDB to get a better understanding of how the predicate works in the ``cond`` operator. +We can look at the example called ``cond_predicate``, which has a ``torch.cond`` tag. The example code looks like: + +.. code-block:: python + + def cond_predicate(x): + """ + The conditional statement (aka predicate) passed to ``cond()`` must be one of the following: + - torch.Tensor with a single element + - boolean expression + NOTE: If the `pred` is test on a dim with batch size < 2, it will be specialized. + """ + pred = x.dim() > 2 and x.shape[2] > 10 + return cond(pred, lambda x: x.cos(), lambda y: y.sin(), [x]) + +More generally, ExportDB can be used as a reference when one of the following occurs: + +1. Before attempting ``torch.export``, you know ahead of time that your model uses some tricky Python/PyTorch features + and you want to know if ``torch.export`` covers that feature. +2. When attempting ``torch.export``, there is a failure and it's unclear how to work around it. + +ExportDB is not exhaustive, but is intended to cover all use cases found in typical PyTorch code. Feel free to reach +out if there is an important Python/PyTorch feature that should be added to ExportDB or supported by ``torch.export``. + +Conclusion +---------- + +We introduced ``torch.export``, the new PyTorch 2.X way to export single computation +graphs from PyTorch programs. In particular, we demonstrate several code modifications +and considerations (control flow ops, constraints, etc.) that need to be made in order to export a graph. diff --git a/intermediate_source/torch_export_tutorial.py b/intermediate_source/torch_export_tutorial.py index cec4733e992..f88a0e02f42 100644 --- a/intermediate_source/torch_export_tutorial.py +++ b/intermediate_source/torch_export_tutorial.py @@ -13,6 +13,10 @@ # ``torch.export`` and its related features are in prototype status and are subject to backwards compatibility # breaking changes. This tutorial provides a snapshot of ``torch.export`` usage as of PyTorch 2.1. # +# .. note:: +# The `torch.export nightly tutorial `__ +# demonstrates some APIs that are present in the nightly binaries, but are not present in the PyTorch 2.1 release. +# # :func:`torch.export` is the PyTorch 2.X way to export PyTorch models into # standardized model representations, intended # to be run on different (i.e. Python-less) environments. From 7164a65a5d59f470e311fba27a72464a3270f7bf Mon Sep 17 00:00:00 2001 From: William Wen Date: Wed, 18 Oct 2023 13:44:34 -0700 Subject: [PATCH 011/378] Fix link to get_decompositions in torch.export nightly tutorial; Fix spelling (#2609) * fix link to get_decompositions in torch.export nightly tutorial * fix spelling * try fixing spelling again --- en-wordlist.txt | 5 +++++ intermediate_source/_torch_export_nightly_tutorial.py | 8 ++++---- intermediate_source/torch_export_nightly_tutorial.rst | 8 ++++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/en-wordlist.txt b/en-wordlist.txt index 01597460c9d..cf2390040d9 100644 --- a/en-wordlist.txt +++ b/en-wordlist.txt @@ -52,6 +52,7 @@ CPUs CPython CUDA Caffe +callable's Captum Captum's CartPole @@ -72,6 +73,8 @@ DQN DataPipe DataPipes DataLoaders +Decompositions +decompositions DeepMind DeiT DenseNet @@ -160,6 +163,8 @@ ONNX Runtime ONNX Script OpenAI OpenMP +Opset +opset Ornstein OU PIL diff --git a/intermediate_source/_torch_export_nightly_tutorial.py b/intermediate_source/_torch_export_nightly_tutorial.py index e471b428480..696f97b71bf 100644 --- a/intermediate_source/_torch_export_nightly_tutorial.py +++ b/intermediate_source/_torch_export_nightly_tutorial.py @@ -33,7 +33,7 @@ # # ``torch.export`` extracts single-graph representations from PyTorch programs # by tracing the target function, given example inputs. -# ``torch.export.export()`` is the main entrypoint for ``torch.export``. +# ``torch.export.export()`` is the main entry point for ``torch.export``. # # In this tutorial, ``torch.export`` and ``torch.export.export()`` are practically synonymous, # though ``torch.export`` generally refers to the PyTorch 2.X export process, and ``torch.export.export()`` @@ -546,9 +546,9 @@ def forward(self, x): # `here `__. # If you would like to use some of these existing decomposition functions, # you can pass in a list of operators you would like to decompose to the -# :func:`get_decompositions `__ -# function, which will return a decomposition table using the pre-implemented -# decompositions. +# `get_decompositions `__ +# function, which will return a decomposition table using existing +# decomposition implementations. class M(torch.nn.Module): def __init__(self): diff --git a/intermediate_source/torch_export_nightly_tutorial.rst b/intermediate_source/torch_export_nightly_tutorial.rst index fe571fd24a4..78c710a3449 100644 --- a/intermediate_source/torch_export_nightly_tutorial.rst +++ b/intermediate_source/torch_export_nightly_tutorial.rst @@ -30,7 +30,7 @@ Basic Usage ``torch.export`` extracts single-graph representations from PyTorch programs by tracing the target function, given example inputs. -``torch.export.export()`` is the main entrypoint for ``torch.export``. +``torch.export.export()`` is the main entry point for ``torch.export``. In this tutorial, ``torch.export`` and ``torch.export.export()`` are practically synonymous, though ``torch.export`` generally refers to the PyTorch 2.X export process, and ``torch.export.export()`` @@ -770,9 +770,9 @@ Most ATen operators already have decompositions, which are located `here `__. If you would like to use some of these existing decomposition functions, you can pass in a list of operators you would like to decompose to the -:func:`get_decompositions `__ -function, which will return a decomposition table using the pre-implemented -decompositions. +`get_decompositions `__ +function, which will return a decomposition table using existing +decomposition implementations. .. code-block:: python From 4e25f97c47fc8fc355dddeadd777261a583770c5 Mon Sep 17 00:00:00 2001 From: Sergii Dymchenko Date: Fri, 20 Oct 2023 14:01:32 -0700 Subject: [PATCH 012/378] Fix "Model Optimziation" typo (#2615) The typo causes menu issues, reported by a user. Fixes https://github.com/pytorch/pytorch/issues/111643 --- prototype_source/prototype_index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/prototype_source/prototype_index.rst b/prototype_source/prototype_index.rst index 92a1f5f32ca..1f303e7d159 100644 --- a/prototype_source/prototype_index.rst +++ b/prototype_source/prototype_index.rst @@ -97,7 +97,7 @@ Prototype features are not available as part of binary distributions like PyPI o :card_description: Prune BERT to be 2:4 sparse and accelerate for inference. :image: _static/img/thumbnails/cropped/generic-pytorch-logo.png :link: prototype/semi_structured_sparse.html - :tags: Model-Optimziation + :tags: Model-Optimiziation .. Mobile From ce275777a5db48cd404832763ba9f53ebbee0ee6 Mon Sep 17 00:00:00 2001 From: Jerry Zhang Date: Mon, 23 Oct 2023 11:52:11 -0700 Subject: [PATCH 013/378] [quant] Add IR related recommendations for Quantizer tutorial (#2608) * [quant] Add IR related recommendations for Quantizer tutorial --------- Co-authored-by: Svetlana Karslioglu --- prototype_source/pt2e_quantizer.rst | 70 +++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/prototype_source/pt2e_quantizer.rst b/prototype_source/pt2e_quantizer.rst index 5305760cde9..df666b1f6af 100644 --- a/prototype_source/pt2e_quantizer.rst +++ b/prototype_source/pt2e_quantizer.rst @@ -302,6 +302,76 @@ functions that are used in the example: `get_bias_qspec `__ can be used to get the ``QuantizationSpec`` from ``QuantizationConfig`` for a specific pattern. +A Note on IR for PT2E Quantization Flow +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +IR means the intermediate representation of the model, for example, ``torch`` IR (``torch.nn`` modules, ``torch.nn.functional`` ops) or ``aten`` IR (``torch.ops.aten.linear``, ...). PT2E Quantization Flow is using pre autograd aten IR (the output of `torch.export` API) so that we support training. As is shown before, we need to match the operator or operator patterns before we can attach annotations on them, So the question is how do we match the pattern? + +Motivation: Problem of Matching ``aten`` IR directly +-------------------------------------------------------- + +The most straightforward way might be matching ``aten`` IR directly. + +Example:: + + for n in gm.graph.nodes: + if n.op != "call_function" or n.target not in [ + torch.ops.aten.relu.default, + torch.ops.aten.relu_.default, + ]: + continue + relu_node = n + maybe_conv_node = n.args[0] + if ( + not isinstance(maybe_conv_node, Node) + or maybe_conv_node.op != "call_function" + or maybe_conv_node.target + not in [ + torch.ops.aten.conv1d.default, + torch.ops.aten.conv2d.default, + ] + ): + continue + + # annotate conv and relu nodes + ... + +However one problem for using this IR is that the representation might change if the PyTorch implementation for modules or functional ops changed. But this could be unexpected since modeling users typically assume that when the eager mode model code doesn't change, they should get the same model representation after program capture as well. One concrete effect for this problem is that if a ``Quantizer`` do annotations based on recognizing ``aten`` IR patterns, then it may fail to recognzing the pattern after PyTorch version update, and the same eager mode floating point may be left unquantized. + +Recommendation: Use ``SubgraphMatcherWithNameNodeMap`` for pattern matching +----------------------------------------------------------------------------- +Because of this, we recommend people to recognize the pattern through ``SubgraphMatcherWithNameNodeMap`` (an improved version of ``SubgraphMatcher`` that makes it easier to query the nodes that people want to annotate), through capturing a ``torch`` IR pattern (with the same program capture used for capturing the floating point model), instead of using the ``aten`` IR pattern directly. + +Example:: + + def conv_relu_pattern(input, weight, bias): + conv = torch.nn.functional.conv2d(input, weight, bias) + output = torch.nn.functional.relu(conv) + # returns an additional dict that includes a map from name to node that we want to annotate + return relu, {"input": input, "weight": weight, "bias": bias, "output": output} + + matcher = SubgraphMatcherWithNameNodeMap(conv_relu_pattern) + matches = matcher.match(model) + for match in matches: + # find input and output of the pattern + # annotate the nodes + name_node_map = match.name_node_map + input_node = name_node_map["input"] + weight_node = name_node_map["weight"] + bias_node = name_node_map["bias"] + output_node = name_node_map["relu"] + input_node.users[0].meta["quantization_annotation"] = ... + weight_node.users[0].meta["quantization_annotation"] = ... + bias_node.users[0].meta["quantization_annotation"] = ... + output_node.meta["quantization_annotation"] = ... + +With this, the ``Quantizer`` will still be valid even when the implementation for nn modules and functionals changes, the ``aten`` IR for floating point model will change, but since we capture the pattern again instead of hardcoding the ``aten`` IR for the pattern, we'll get the updated ``aten`` IR as well and will still be able to match the pattern. + +One caveat is that if inputs of the pattern has multiple users, we don't have a good way to identify which user node we want to annotate except for checking the aten op target. + +Another caveat is that we need to make sure we have an exhaustive list of examples (e.g. 2D, 3D, 4D inputs, real v.s. symbolic inputs, training=True v.s. training=False etc.) for the pattern to make sure cover different possible ``aten`` IR outcomes captured from the ``torch`` IR pattern. + +Note: We may provide some (pattern, list of example_inputs) or some pre-generated matcher object so people can just use them directly in the future. + Conclusion ^^^^^^^^^^^^^^^^^^^ From 377123d841273531fa574ce9fc811ed31a4c4baa Mon Sep 17 00:00:00 2001 From: Sergii Dymchenko Date: Mon, 23 Oct 2023 12:21:14 -0700 Subject: [PATCH 014/378] Remove redundant period in torch_compile_tutorial.py (#2614) Co-authored-by: Svetlana Karslioglu --- intermediate_source/torch_compile_tutorial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intermediate_source/torch_compile_tutorial.py b/intermediate_source/torch_compile_tutorial.py index b6ac9ee3436..0ef64cdbc51 100644 --- a/intermediate_source/torch_compile_tutorial.py +++ b/intermediate_source/torch_compile_tutorial.py @@ -54,7 +54,7 @@ # Basic Usage # ------------ # -# ``torch.compile`` is included in the latest PyTorch.. +# ``torch.compile`` is included in the latest PyTorch. # Running TorchInductor on GPU requires Triton, which is included with the PyTorch 2.0 nightly # binary. If Triton is still missing, try installing ``torchtriton`` via pip # (``pip install torchtriton --extra-index-url "https://download.pytorch.org/whl/nightly/cu117"`` From f1b27b44242bb0a3ff440794cdf629e799299687 Mon Sep 17 00:00:00 2001 From: Danielle Pintz <38207072+daniellepintz@users.noreply.github.com> Date: Mon, 23 Oct 2023 15:23:42 -0400 Subject: [PATCH 015/378] Grammar fixes to FSDP_tutorial.rst (#2607) * Some grammar and readability improvements * Remove outdated version mention --------- Co-authored-by: Svetlana Karslioglu --- intermediate_source/FSDP_tutorial.rst | 37 +++++++++++++-------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/intermediate_source/FSDP_tutorial.rst b/intermediate_source/FSDP_tutorial.rst index d69a03b68be..26988eda900 100644 --- a/intermediate_source/FSDP_tutorial.rst +++ b/intermediate_source/FSDP_tutorial.rst @@ -8,7 +8,7 @@ Getting Started with Fully Sharded Data Parallel(FSDP) Training AI models at a large scale is a challenging task that requires a lot of compute power and resources. It also comes with considerable engineering complexity to handle the training of these very large models. -`Pytorch FSDP `__, released in PyTorch 1.11 makes this easier. +`PyTorch FSDP `__, released in PyTorch 1.11 makes this easier. In this tutorial, we show how to use `FSDP APIs `__, for simple MNIST models that can be extended to other larger models such as `HuggingFace BERT models `__, `GPT 3 models up to 1T parameters `__ . The sample DDP MNIST code has been borrowed from `here `__. @@ -18,7 +18,7 @@ How FSDP works -------------- In `DistributedDataParallel `__, (DDP) training, each process/ worker owns a replica of the model and processes a batch of data, finally it uses all-reduce to sum up gradients over different workers. In DDP the model weights and optimizer states are replicated across all workers. FSDP is a type of data parallelism that shards model parameters, optimizer states and gradients across DDP ranks. -FSDP GPU memory footprint would be smaller than DDP across all workers. This makes the training of some very large models feasible and helps to fit larger models or batch sizes for our training job. This would come with the cost of increased communication volume. The communication overhead is reduced by internal optimizations like communication and computation overlapping. +When training with FSDP, the GPU memory footprint is smaller than when training with DDP across all workers. This makes the training of some very large models feasible by allowing larger models or batch sizes to fit on device. This comes with the cost of increased communication volume. The communication overhead is reduced by internal optimizations like overlapping communication and computation. .. figure:: /_static/img/distributed/fsdp_workflow.png :width: 100% @@ -27,7 +27,7 @@ FSDP GPU memory footprint would be smaller than DDP across all workers. This mak FSDP Workflow -At high level FSDP works as follow: +At a high level FSDP works as follow: *In constructor* @@ -48,11 +48,11 @@ At high level FSDP works as follow: How to use FSDP -------------- -Here we use a toy model to run training on MNIST dataset for demonstration purposes. Similarly the APIs and logic can be applied to larger models for training. +Here we use a toy model to run training on the MNIST dataset for demonstration purposes. The APIs and logic can be applied to training larger models as well. *Setup* -1.1 Install Pytorch along with Torchvision +1.1 Install PyTorch along with Torchvision .. code-block:: bash @@ -139,7 +139,7 @@ We add the following code snippets to a python script “FSDP_mnist.py”. output = F.log_softmax(x, dim=1) return output -2.2 define a train function +2.2 Define a train function .. code-block:: python @@ -189,7 +189,7 @@ We add the following code snippets to a python script “FSDP_mnist.py”. 2.4 Define a distributed train function that wraps the model in FSDP -**Note: to save the FSDP model, we need to call the state_dict on each rank then on Rank 0 save the overall states. This is only available in Pytorch nightlies, current Pytorch release is 1.11 at the moment.** +**Note: to save the FSDP model, we need to call the state_dict on each rank then on Rank 0 save the overall states.** .. code-block:: python @@ -250,7 +250,6 @@ We add the following code snippets to a python script “FSDP_mnist.py”. if args.save_model: # use a barrier to make sure training is done on all ranks dist.barrier() - # state_dict for FSDP model is only available on Nightlies for now states = model.state_dict() if rank == 0: torch.save(states, "mnist_cnn.pt") @@ -259,7 +258,7 @@ We add the following code snippets to a python script “FSDP_mnist.py”. -2.5 Finally parsing the arguments and setting the main function +2.5 Finally parse the arguments and set the main function .. code-block:: python @@ -319,7 +318,7 @@ Alternatively, we will look at adding the fsdp_auto_wrap_policy next and will di ) ) -Following is the peak memory usage from FSDP MNIST training on g4dn.12.xlarge AWS EC2 instance with 4 gpus captured from Pytorch Profiler. +The following is the peak memory usage from FSDP MNIST training on g4dn.12.xlarge AWS EC2 instance with 4 GPUs captured from PyTorch Profiler. .. figure:: /_static/img/distributed/FSDP_memory.gif @@ -329,7 +328,7 @@ Following is the peak memory usage from FSDP MNIST training on g4dn.12.xlarge AW FSDP Peak Memory Usage -*Applying fsdp_auto_wrap_policy* in FSDP otherwise, FSDP will put the entire model in one FSDP unit, which will reduce computation efficiency and memory efficiency. +Applying *fsdp_auto_wrap_policy* in FSDP otherwise, FSDP will put the entire model in one FSDP unit, which will reduce computation efficiency and memory efficiency. The way it works is that, suppose your model contains 100 Linear layers. If you do FSDP(model), there will only be one FSDP unit which wraps the entire model. In that case, the allgather would collect the full parameters for all 100 linear layers, and hence won't save CUDA memory for parameter sharding. Also, there is only one blocking allgather call for the all 100 linear layers, there will not be communication and computation overlapping between layers. @@ -354,7 +353,7 @@ Finding an optimal auto wrap policy is challenging, PyTorch will add auto tuning model = FSDP(model, fsdp_auto_wrap_policy=my_auto_wrap_policy) -Applying the FSDP_auto_wrap_policy, the model would be as follows: +Applying the fsdp_auto_wrap_policy, the model would be as follows: .. code-block:: bash @@ -381,7 +380,7 @@ Applying the FSDP_auto_wrap_policy, the model would be as follows: CUDA event elapsed time on training loop 41.89130859375sec -Following is the peak memory usage from FSDP with auto_wrap policy of MNIST training on g4dn.12.xlarge AWS EC2 instance with 4 gpus captured from Pytorch Profiler. +The following is the peak memory usage from FSDP with auto_wrap policy of MNIST training on a g4dn.12.xlarge AWS EC2 instance with 4 GPUs captured from PyTorch Profiler. It can be observed that the peak memory usage on each device is smaller compared to FSDP without auto wrap policy applied, from ~75 MB to 66 MB. .. figure:: /_static/img/distributed/FSDP_autowrap.gif @@ -391,11 +390,11 @@ It can be observed that the peak memory usage on each device is smaller compared FSDP Peak Memory Usage using Auto_wrap policy -*CPU Off-loading*: In case the model is very large that even with FSDP wouldn't fit into gpus, then CPU offload can be helpful here. +*CPU Off-loading*: In case the model is very large that even with FSDP wouldn't fit into GPUs, then CPU offload can be helpful here. Currently, only parameter and gradient CPU offload is supported. It can be enabled via passing in cpu_offload=CPUOffload(offload_params=True). -Note that this currently implicitly enables gradient offloading to CPU in order for params and grads to be on the same device to work with the optimizer. This API is subject to change. Default is None in which case there will be no offloading. +Note that this currently implicitly enables gradient offloading to CPU in order for params and grads to be on the same device to work with the optimizer. This API is subject to change. The default is None in which case there will be no offloading. Using this feature may slow down the training considerably, due to frequent copying of tensors from host to device, but it could help improve memory efficiency and train larger scale models. @@ -409,7 +408,7 @@ In 2.4 we just add it to the FSDP wrapper cpu_offload=CPUOffload(offload_params=True)) -Compare it with DDP, if in 2.4 we just normally wrap the model in ddp, saving the changes in “DDP_mnist.py”. +Compare it with DDP, if in 2.4 we just normally wrap the model in DPP, saving the changes in “DDP_mnist.py”. .. code-block:: python @@ -423,7 +422,7 @@ Compare it with DDP, if in 2.4 we just normally wrap the model in ddp, saving th CUDA event elapsed time on training loop 39.77766015625sec -Following is the peak memory usage from DDP MNIST training on g4dn.12.xlarge AWS EC2 instance with 4 gpus captured from Pytorch profiler. +The following is the peak memory usage from DDP MNIST training on g4dn.12.xlarge AWS EC2 instance with 4 GPUs captured from PyTorch profiler. .. figure:: /_static/img/distributed/DDP_memory.gif :width: 100% @@ -434,8 +433,8 @@ Following is the peak memory usage from DDP MNIST training on g4dn.12.xlarge AWS Considering the toy example and tiny MNIST model we defined here, we can observe the difference between peak memory usage of DDP and FSDP. -In DDP each process holds a replica of the model, so the memory footprint is higher compared to FSDP that shards the model parameter, optimizer states and gradients over DDP ranks. +In DDP each process holds a replica of the model, so the memory footprint is higher compared to FSDP which shards the model parameters, optimizer states and gradients over DDP ranks. The peak memory usage using FSDP with auto_wrap policy is the lowest followed by FSDP and DDP. -Also, looking at timings, considering the small model and running the training on a single machine, FSDP with/out auto_wrap policy performed almost as fast as DDP. +Also, looking at timings, considering the small model and running the training on a single machine, FSDP with and without auto_wrap policy performed almost as fast as DDP. This example does not represent most of the real applications, for detailed analysis and comparison between DDP and FSDP please refer to this `blog post `__ . From a39f7b5b67dcd1263daa339b1516a8f3644455bc Mon Sep 17 00:00:00 2001 From: Nils Melchert <36985893+nilsmelchert@users.noreply.github.com> Date: Mon, 23 Oct 2023 21:28:05 +0200 Subject: [PATCH 016/378] Update tensors_deeper_tutorial.py (#2606) Correction of a small spelling mistake Co-authored-by: Svetlana Karslioglu --- beginner_source/introyt/tensors_deeper_tutorial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/beginner_source/introyt/tensors_deeper_tutorial.py b/beginner_source/introyt/tensors_deeper_tutorial.py index 8b2c1630aff..6ef9d805622 100644 --- a/beginner_source/introyt/tensors_deeper_tutorial.py +++ b/beginner_source/introyt/tensors_deeper_tutorial.py @@ -378,7 +378,7 @@ # # - The multiplication operation that created ``b`` was # broadcast over every “layer” of ``a``. -# - For ``c``, the operation was broadcast over ever layer and row of +# - For ``c``, the operation was broadcast over every layer and row of # ``a`` - every 3-element column is identical. # - For ``d``, we switched it around - now every *row* is identical, # across layers and columns. From b51f2b8ce2235879495c3df70fcd31e4331f8ce0 Mon Sep 17 00:00:00 2001 From: Svetlana Karslioglu Date: Tue, 24 Oct 2023 12:20:17 -0700 Subject: [PATCH 017/378] Update docathon-assign.yml (#2618) Update to use the H2 label --- .github/workflows/docathon-assign.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docathon-assign.yml b/.github/workflows/docathon-assign.yml index 1810872303b..1b6e9e77b64 100644 --- a/.github/workflows/docathon-assign.yml +++ b/.github/workflows/docathon-assign.yml @@ -36,7 +36,7 @@ jobs: repo: context.repo.repo, issue_number: issueNumber }); - const hasLabel = issue.labels.some(label => label.name === 'docathon-h1-2023'); + const hasLabel = issue.labels.some(label => label.name === 'docathon-h2-2023'); if (hasLabel) { if (issue.assignee !== null) { await octokit.issues.createComment({ From 8b1ed83f87de3e4db155414ba12c58e5c9b6518f Mon Sep 17 00:00:00 2001 From: Iurii Makarov <107990314+lvoursl@users.noreply.github.com> Date: Tue, 24 Oct 2023 22:29:24 +0100 Subject: [PATCH 018/378] added fixes to semi-strutctured sparse tutorial (#2616) Co-authored-by: Svetlana Karslioglu --- prototype_source/semi_structured_sparse.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/prototype_source/semi_structured_sparse.rst b/prototype_source/semi_structured_sparse.rst index 463a5f5d7b2..4044888b583 100644 --- a/prototype_source/semi_structured_sparse.rst +++ b/prototype_source/semi_structured_sparse.rst @@ -315,6 +315,7 @@ Now that those are defined, we just need one additional helper function, which w We will get started by loading our model and tokenizer, and then setting up our dataset. .. code:: python + # load model model_name = "bert-base-cased" tokenizer = transformers.AutoTokenizer.from_pretrained(model_name) @@ -344,6 +345,7 @@ Running the following code gives me an F1 score of 86.9. This is quite close to training_args = transformers.TrainingArguments( "trainer", num_train_epochs=1, + lr_scheduler_type="constant", per_device_train_batch_size=64, per_device_eval_batch_size=512, ) @@ -446,7 +448,7 @@ We will also evaluate the model to show the accuracy degradation of zero-shot pr with torch.inference_mode(): predictions = trainer.predict(tokenized_squad_dataset["validation"]) pruned = compute_metrics( - *predictions.predictions + *predictions.predictions, tokenized_squad_dataset["validation"], squad_dataset["validation"], ) @@ -498,7 +500,7 @@ Now that we have a model in this format, we can accelerate it for inference just print("sparse eval metrics: ", metrics_sparse) sparse_perf = measure_execution_time( model, - batch_sizes_perf_cuda, + batch_sizes, tokenized_squad_dataset["validation"], ) print("sparse perf metrics: ", sparse_perf) From a7e56bb78119bb2c76d4bb285c0179a45a0d05df Mon Sep 17 00:00:00 2001 From: William Wen Date: Wed, 25 Oct 2023 13:56:41 -0400 Subject: [PATCH 019/378] Small update to modes on torch.compile tutorial and explain why 2nd run in slower (#2619) * make some updates to torch.compile mode and explain why 2nd run is slower --- intermediate_source/torch_compile_tutorial.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/intermediate_source/torch_compile_tutorial.py b/intermediate_source/torch_compile_tutorial.py index 0ef64cdbc51..5de08bc4dda 100644 --- a/intermediate_source/torch_compile_tutorial.py +++ b/intermediate_source/torch_compile_tutorial.py @@ -195,11 +195,15 @@ def init_model(): # GPU compute and the observed speedup may be less significant. # # You may also see different speedup results depending on the chosen ``mode`` -# argument. Since our model and data are small, we want to reduce overhead as -# much as possible, and so we chose ``"reduce-overhead"``. For your own models, +# argument. The ``"reduce-overhead"`` mode uses CUDA graphs to further reduce +# the overhead of Python. For your own models, # you may need to experiment with different modes to maximize speedup. You can # read more about modes `here `__. # +# You may might also notice that the second time we run our model with ``torch.compile`` is significantly +# slower than the other runs, although it is much faster than the first run. This is because the ``"reduce-overhead"`` +# mode runs a few warm-up iterations for CUDA graphs. +# # For general PyTorch benchmarking, you can try using ``torch.utils.benchmark`` instead of the ``timed`` # function we defined above. We wrote our own timing function in this tutorial to show # ``torch.compile``'s compilation latency. From dcf314d651fd533639fe6a159038a647f1b4c03b Mon Sep 17 00:00:00 2001 From: Svetlana Karslioglu Date: Wed, 25 Oct 2023 11:14:06 -0700 Subject: [PATCH 020/378] Update docathon-assign.yml --- .github/workflows/docathon-assign.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docathon-assign.yml b/.github/workflows/docathon-assign.yml index 1b6e9e77b64..d0f44c8c033 100644 --- a/.github/workflows/docathon-assign.yml +++ b/.github/workflows/docathon-assign.yml @@ -43,7 +43,7 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, issue_number: issueNumber, - body: "The issue is already assigned. Please pick an opened and unnasigned issue with the [docathon-h1-2023 label](https://github.com/pytorch/tutorials/issues?q=is%3Aopen+is%3Aissue+label%3Adocathon-h1-2023)." + body: "The issue is already assigned. Please pick an opened and unnasigned issue with the [docathon-h2-2023 label](https://github.com/pytorch/tutorials/issues?q=is%3Aopen+is%3Aissue+label%3Adocathon-h2-2023)." }); } else { octokit.issues.addAssignees({ @@ -54,7 +54,7 @@ jobs: }); } } else { - const commmentMessage = "This issue does not have the correct label. Please pick an opened and unnasigned issue with the [docathon-h1-2023 label](https://github.com/pytorch/tutorials/issues?q=is%3Aopen+is%3Aissue+label%3Adocathon-h1-2023)." + const commmentMessage = "This issue does not have the correct label. Please pick an opened and unnasigned issue with the [docathon-h2-2023 label](https://github.com/pytorch/tutorials/issues?q=is%3Aopen+is%3Aissue+label%3Adocathon-h2-2023)." await octokit.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, From b55fdc81ded565f33d2d69011b6377565bada6d6 Mon Sep 17 00:00:00 2001 From: Svetlana Karslioglu Date: Wed, 25 Oct 2023 11:15:00 -0700 Subject: [PATCH 021/378] Update docathon-label-sync.py --- .github/scripts/docathon-label-sync.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/scripts/docathon-label-sync.py b/.github/scripts/docathon-label-sync.py index 5da80f24f5b..48b5d35d2ae 100644 --- a/.github/scripts/docathon-label-sync.py +++ b/.github/scripts/docathon-label-sync.py @@ -25,11 +25,11 @@ def main(): issue_number = int(re.findall(r'#(\d{1,5})', pull_request_body)[0]) issue = repo.get_issue(issue_number) issue_labels = issue.labels - docathon_label_present = any(label.name == 'docathon-h1-2023' for label in issue_labels) + docathon_label_present = any(label.name == 'docathon-h2-2023' for label in issue_labels) # if the issue has a docathon label, add all labels from the issue to the PR. if not docathon_label_present: - print("The 'docathon-h1-2023' label is not present in the issue.") + print("The 'docathon-h2-2023' label is not present in the issue.") return pull_request_labels = pull_request.get_labels() issue_label_names = [label.name for label in issue_labels] From 62468fa612da5796dbb74194b03b27896a378590 Mon Sep 17 00:00:00 2001 From: Michael Mykhaylov Date: Wed, 25 Oct 2023 13:10:35 -0700 Subject: [PATCH 022/378] Replace deprecated CUDA check (#2621) Co-authored-by: Svetlana Karslioglu --- intermediate_source/reinforcement_ppo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intermediate_source/reinforcement_ppo.py b/intermediate_source/reinforcement_ppo.py index 6501e98971e..1b75e21e51a 100644 --- a/intermediate_source/reinforcement_ppo.py +++ b/intermediate_source/reinforcement_ppo.py @@ -137,7 +137,7 @@ # actually return ``frame_skip`` frames). # -device = "cpu" if not torch.has_cuda else "cuda:0" +device = "cpu" if not torch.cuda.is_available() else "cuda:0" num_cells = 256 # number of cells in each layer i.e. output dim. lr = 3e-4 max_grad_norm = 1.0 From c94e289c100a020aa2b89860109794a26d955eaf Mon Sep 17 00:00:00 2001 From: Svetlana Karslioglu Date: Thu, 26 Oct 2023 12:40:33 -0700 Subject: [PATCH 023/378] Add instructions on asking questions and submitting bugs (#2626) * Update README.md * Update README.md * Update README.md --------- Co-authored-by: Nikita Shulga <2453524+malfet@users.noreply.github.com> --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index d9fda75a019..9fe515b47a2 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,16 @@ All the tutorials are now presented as sphinx style documentation at: ## [https://pytorch.org/tutorials](https://pytorch.org/tutorials) +# Asking a question +If you have a question about a tutorial, post in https://dev-discuss.pytorch.org/ rather than creating an issue in this repo. Your question will be answered much faster on the dev-discuss forum. + +# Submitting an issue + +You can submit the following types of issues: + +* Feature request - request a new tutorial to be added. Please explain why this tutorial is needed and how it demonstrates PyTorch value. +* Bug report - report a failiure or outdated information in an existing tutorial. When submitting a bug report, please run: `python3 -m torch.utils.collect_env` to get information about your environment and add the output to the bug report. # Contributing From fec23587121b1f12bc0beaf305aa383b324c6d54 Mon Sep 17 00:00:00 2001 From: Elliot Waite Date: Thu, 26 Oct 2023 13:57:58 -0700 Subject: [PATCH 024/378] Add explanation video to `torch.autograd` tutorial (#2625) This PR adds an explanation video to the [A Gentle Introduction to `torch.autograd`](https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html) page. Fixes #1024 --- beginner_source/blitz/autograd_tutorial.py | 1 + 1 file changed, 1 insertion(+) diff --git a/beginner_source/blitz/autograd_tutorial.py b/beginner_source/blitz/autograd_tutorial.py index 3b33ffca9a8..b6d4007303f 100644 --- a/beginner_source/blitz/autograd_tutorial.py +++ b/beginner_source/blitz/autograd_tutorial.py @@ -321,3 +321,4 @@ # # - `In-place operations & Multithreaded Autograd `__ # - `Example implementation of reverse-mode autodiff `__ +# - `Video: PyTorch Autograd Explained - In-depth Tutorial `__ From feeca535c9a1a5a0112c142a93576da94ed26a39 Mon Sep 17 00:00:00 2001 From: Nikita Shulga <2453524+malfet@users.noreply.github.com> Date: Fri, 27 Oct 2023 21:29:38 -0700 Subject: [PATCH 025/378] Pin tensordict to 0.2.0 (#2628) See https://github.com/pytorch/tensordict/issues/547 Should fix https://github.com/pytorch/tutorials/actions/runs/6659680370/job/18099294856 and prevent tutorials CI regress from the sudden updates of the dependencies --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 78d0af566f7..30799894689 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,6 +26,7 @@ jinja2==3.0.3 pytorch-lightning torchx torchrl==0.2.0 +tensordict==0.2.0 ax-platform nbformat>=4.2.0 datasets From 623b93dc62b7576988fa31e1c6f397eef70669b1 Mon Sep 17 00:00:00 2001 From: leslie-fang-intel Date: Tue, 31 Oct 2023 04:01:35 +0800 Subject: [PATCH 026/378] Add x86InductorQuantizer Performance Number (#2617) Co-authored-by: Svetlana Karslioglu --- prototype_source/pt2e_quant_ptq_x86_inductor.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/prototype_source/pt2e_quant_ptq_x86_inductor.rst b/prototype_source/pt2e_quant_ptq_x86_inductor.rst index 915148be81e..1a6e152c996 100644 --- a/prototype_source/pt2e_quant_ptq_x86_inductor.rst +++ b/prototype_source/pt2e_quant_ptq_x86_inductor.rst @@ -180,6 +180,10 @@ For example: TORCHINDUCTOR_FREEZING=1 python example_x86inductorquantizer_pytorch_2_1.py +With PyTorch 2.1 release, all CNN models from TorchBench test suite have been measured and proven effective comparing with Inductor FP32 inference path. Please refer +to `this document `_ +for detail benchmark number. + 4. Conclusion --------------- From bd9b57fa8896c88c431e932b84543e410bd55755 Mon Sep 17 00:00:00 2001 From: Svetlana Karslioglu Date: Tue, 31 Oct 2023 13:34:31 -0700 Subject: [PATCH 027/378] Update docathon-assign.yml --- .github/workflows/docathon-assign.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/docathon-assign.yml b/.github/workflows/docathon-assign.yml index d0f44c8c033..582f1f609cd 100644 --- a/.github/workflows/docathon-assign.yml +++ b/.github/workflows/docathon-assign.yml @@ -16,6 +16,7 @@ jobs: - name: Install @octokit/core run: | npm i @octokit/core @octokit/rest + npm install cross-fetch - name: Check for "/assigntome" in comment uses: actions/github-script@v4 env: @@ -30,6 +31,9 @@ jobs: const { Octokit } = require("@octokit/rest"); const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN, + request: { + fetch: require('cross-fetch'), + }, }); const { data: issue } = await octokit.issues.get({ owner: context.repo.owner, From 104af60bb5557aea6ae298fa9beffa528f4a7376 Mon Sep 17 00:00:00 2001 From: Svetlana Karslioglu Date: Tue, 31 Oct 2023 14:37:15 -0700 Subject: [PATCH 028/378] Update docathon-assign.yml --- .github/workflows/docathon-assign.yml | 41 ++++++++++----------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/.github/workflows/docathon-assign.yml b/.github/workflows/docathon-assign.yml index 582f1f609cd..4948faacd68 100644 --- a/.github/workflows/docathon-assign.yml +++ b/.github/workflows/docathon-assign.yml @@ -9,16 +9,8 @@ jobs: assign: runs-on: ubuntu-latest steps: - - name: Install Dependencies - uses: actions/setup-node@v3 - with: - node-version: '18' - - name: Install @octokit/core - run: | - npm i @octokit/core @octokit/rest - npm install cross-fetch - name: Check for "/assigntome" in comment - uses: actions/github-script@v4 + uses: actions/github-script@v6 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: @@ -28,29 +20,23 @@ jobs: if (assignRegex.test(issueComment)) { const assignee = context.payload.comment.user.login; const issueNumber = context.payload.issue.number; - const { Octokit } = require("@octokit/rest"); - const octokit = new Octokit({ - auth: process.env.GITHUB_TOKEN, - request: { - fetch: require('cross-fetch'), - }, - }); - const { data: issue } = await octokit.issues.get({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: issueNumber - }); + try { + const { data: issue } = await github.rest.issues.get({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issueNumber + }); const hasLabel = issue.labels.some(label => label.name === 'docathon-h2-2023'); if (hasLabel) { if (issue.assignee !== null) { - await octokit.issues.createComment({ + await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issueNumber, - body: "The issue is already assigned. Please pick an opened and unnasigned issue with the [docathon-h2-2023 label](https://github.com/pytorch/tutorials/issues?q=is%3Aopen+is%3Aissue+label%3Adocathon-h2-2023)." + body: "The issue is already assigned. Please pick an opened and unnasigned issue with the [docathon-h2-2023 label](https://github.com/pytorch/pytorch/issues?q=is%3Aopen+is%3Aissue+label%3Adocathon-h2-2023)." }); } else { - octokit.issues.addAssignees({ + await github.rest.issues.addAssignees({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issueNumber, @@ -58,12 +44,15 @@ jobs: }); } } else { - const commmentMessage = "This issue does not have the correct label. Please pick an opened and unnasigned issue with the [docathon-h2-2023 label](https://github.com/pytorch/tutorials/issues?q=is%3Aopen+is%3Aissue+label%3Adocathon-h2-2023)." - await octokit.issues.createComment({ + const commmentMessage = "This issue does not have the correct label. Please pick an opened and unnasigned issue with the [docathon-h2-2023 label](https://github.com/pytorch/pytorch/issues?q=is%3Aopen+is%3Aissue+label%3Adocathon-h2-2023)." + await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: issueNumber, body: commmentMessage }); + } + } catch (error) { + console.error(error); } } From 5d69b493ec2e15ff7bc21fa2a2d3d3ac31038427 Mon Sep 17 00:00:00 2001 From: Sahdev Zala Date: Wed, 1 Nov 2023 15:55:45 -0400 Subject: [PATCH 029/378] Change links to the newest examples (#2635) The current links are poiting to older examples on an individual repo. This PR replaces those links with the PyTorch upstream examples repo. Also, adding consistency in how examples are referenced to point to the links. Signed-off-by: Sahdev Zala --- intermediate_source/FSDP_adavnced_tutorial.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/intermediate_source/FSDP_adavnced_tutorial.rst b/intermediate_source/FSDP_adavnced_tutorial.rst index 748c8593306..5a0cb5376da 100644 --- a/intermediate_source/FSDP_adavnced_tutorial.rst +++ b/intermediate_source/FSDP_adavnced_tutorial.rst @@ -74,8 +74,8 @@ summarization using WikiHow dataset. The main focus of this tutorial is to highlight different available features in FSDP that are helpful for training large scale model above 3B parameters. Also, we cover specific features for Transformer based models. The code for this tutorial is available in `Pytorch -Examples -`__. +examples +`__. *Setup* @@ -97,13 +97,13 @@ Please create a `data` folder, download the WikiHow dataset from `wikihowAll.csv `wikihowSep.cs `__, and place them in the `data` folder. We will use the wikihow dataset from `summarization_dataset -`__. +`__. Next, we add the following code snippets to a Python script “T5_training.py”. .. note:: The full source code for this tutorial is available in `PyTorch examples - `__. + `__. 1.3 Import necessary packages: From 53e41420e0fa2bfb69e151d16a366da36236a4b3 Mon Sep 17 00:00:00 2001 From: Mark Sturdevant Date: Wed, 1 Nov 2023 12:57:19 -0700 Subject: [PATCH 030/378] Remove broken links in tuning guide (#2636) A couple of "for more details" links to external sites are no longer finding details. Better to remove them. Signed-off-by: markstur Co-authored-by: Svetlana Karslioglu --- recipes_source/recipes/tuning_guide.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/recipes_source/recipes/tuning_guide.py b/recipes_source/recipes/tuning_guide.py index dd615714a24..39fa667bc1a 100644 --- a/recipes_source/recipes/tuning_guide.py +++ b/recipes_source/recipes/tuning_guide.py @@ -193,15 +193,12 @@ def fused_gelu(x): # # numactl --cpunodebind=N --membind=N python -############################################################################### -# More detailed descriptions can be found `here `_. - ############################################################################### # Utilize OpenMP # ~~~~~~~~~~~~~~ # OpenMP is utilized to bring better performance for parallel computation tasks. # ``OMP_NUM_THREADS`` is the easiest switch that can be used to accelerate computations. It determines number of threads used for OpenMP computations. -# CPU affinity setting controls how workloads are distributed over multiple cores. It affects communication overhead, cache line invalidation overhead, or page thrashing, thus proper setting of CPU affinity brings performance benefits. ``GOMP_CPU_AFFINITY`` or ``KMP_AFFINITY`` determines how to bind OpenMP* threads to physical processing units. Detailed information can be found `here `_. +# CPU affinity setting controls how workloads are distributed over multiple cores. It affects communication overhead, cache line invalidation overhead, or page thrashing, thus proper setting of CPU affinity brings performance benefits. ``GOMP_CPU_AFFINITY`` or ``KMP_AFFINITY`` determines how to bind OpenMP* threads to physical processing units. ############################################################################### # With the following command, PyTorch run the task on N OpenMP threads. From 70785d09dde45498267abf9a991ef6364973683d Mon Sep 17 00:00:00 2001 From: Harsh Kumar <73221930+ChanBong@users.noreply.github.com> Date: Thu, 2 Nov 2023 14:30:30 +0530 Subject: [PATCH 031/378] change kernel size to 5x5 in Pruning example (#2639) --- intermediate_source/pruning_tutorial.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/intermediate_source/pruning_tutorial.py b/intermediate_source/pruning_tutorial.py index ba6701c8c35..346200502d5 100644 --- a/intermediate_source/pruning_tutorial.py +++ b/intermediate_source/pruning_tutorial.py @@ -44,9 +44,9 @@ class LeNet(nn.Module): def __init__(self): super(LeNet, self).__init__() - # 1 input image channel, 6 output channels, 3x3 square conv kernel - self.conv1 = nn.Conv2d(1, 6, 3) - self.conv2 = nn.Conv2d(6, 16, 3) + # 1 input image channel, 6 output channels, 5x5 square conv kernel + self.conv1 = nn.Conv2d(1, 6, 5) + self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) # 5x5 image dimension self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) From 586b3daa53e2abf95a5805091e10a8af661f53f8 Mon Sep 17 00:00:00 2001 From: Mark Sturdevant Date: Thu, 2 Nov 2023 10:43:12 -0700 Subject: [PATCH 032/378] Update static quantization tutorial code link to go to mobilenetv2.py (#2638) The link says most of the code is from "here", but it goes to mobilenet.py which is just imports. Most of the code comes from mobilenetv2.py. Signed-off-by: markstur Co-authored-by: Svetlana Karslioglu --- advanced_source/static_quantization_tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced_source/static_quantization_tutorial.rst b/advanced_source/static_quantization_tutorial.rst index 66c2aa4e2fd..6f4118079be 100644 --- a/advanced_source/static_quantization_tutorial.rst +++ b/advanced_source/static_quantization_tutorial.rst @@ -59,7 +59,7 @@ to enable quantization: - Replace ReLU6 with ReLU Note: this code is taken from -`here `_. +`here `_. .. code:: python From 3ac15b13fd695ba85bdde433d2dc74701d6742d8 Mon Sep 17 00:00:00 2001 From: Andrew Hoblitzell Date: Fri, 3 Nov 2023 17:50:12 -0400 Subject: [PATCH 033/378] Update mario_rl_tutorial.py (#2640) Fixes https://github.com/pytorch/tutorials/issues/2627 --- intermediate_source/mario_rl_tutorial.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/intermediate_source/mario_rl_tutorial.py b/intermediate_source/mario_rl_tutorial.py index e4bfd869160..74a08a47b37 100755 --- a/intermediate_source/mario_rl_tutorial.py +++ b/intermediate_source/mario_rl_tutorial.py @@ -32,6 +32,9 @@ # # %%bash # pip install gym-super-mario-bros==7.4.0 +# pip install tensordict==0.2.0 +# pip install torchrl==0.2.0 +# import torch from torch import nn From e7563f6bd6a39b8509c294f4a036fc90eb521a00 Mon Sep 17 00:00:00 2001 From: Andrew Hoblitzell Date: Fri, 3 Nov 2023 20:39:57 -0400 Subject: [PATCH 034/378] Update parametrizations.py (#2642) * Update parametrizations.py For PyTorch 2, torch.solve => torch.linalg.solve * Apply suggestions from code review Co-authored-by: Svetlana Karslioglu --------- Co-authored-by: Nikita Shulga <2453524+malfet@users.noreply.github.com> Co-authored-by: Svetlana Karslioglu --- intermediate_source/parametrizations.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/intermediate_source/parametrizations.py b/intermediate_source/parametrizations.py index 096836e933b..2f8e90b9e41 100644 --- a/intermediate_source/parametrizations.py +++ b/intermediate_source/parametrizations.py @@ -227,7 +227,7 @@ def __init__(self, n): def forward(self, X): # (I + X)(I - X)^{-1} - return torch.solve(self.Id + X, self.Id - X).solution + return torch.linalg.solve(self.Id - X, self.Id + X) layer = nn.Linear(3, 3) parametrize.register_parametrization(layer, "weight", Skew()) @@ -301,13 +301,13 @@ def __init__(self, n): def forward(self, X): # Assume X skew-symmetric # (I + X)(I - X)^{-1} - return torch.solve(self.Id + X, self.Id - X).solution + return torch.linalg.solve(self.Id - X, self.Id + X) def right_inverse(self, A): # Assume A orthogonal # See https://en.wikipedia.org/wiki/Cayley_transform#Matrix_map # (X - I)(X + I)^{-1} - return torch.solve(X - self.Id, self.Id + X).solution + return torch.linalg.solve(X + self.Id, self.Id - X) layer_orthogonal = nn.Linear(3, 3) parametrize.register_parametrization(layer_orthogonal, "weight", Skew()) From 77aec058e3989747afd42eadc08bd8cce909023b Mon Sep 17 00:00:00 2001 From: Andrew Hoblitzell Date: Sun, 5 Nov 2023 14:00:41 -0500 Subject: [PATCH 035/378] Update super_resolution_with_onnxruntime.py (#2647) add install for onnx Fixes #2646 Description Install ONNX to avoid dependency issues --------- Co-authored-by: Nikita Shulga <2453524+malfet@users.noreply.github.com> --- advanced_source/super_resolution_with_onnxruntime.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced_source/super_resolution_with_onnxruntime.py b/advanced_source/super_resolution_with_onnxruntime.py index 466c124fe67..c9de728d8f6 100644 --- a/advanced_source/super_resolution_with_onnxruntime.py +++ b/advanced_source/super_resolution_with_onnxruntime.py @@ -26,7 +26,7 @@ .. code-block:: bash %%bash - pip install onnxruntime + pip install onnx onnxruntime ONNX Runtime recommends using the latest stable runtime for PyTorch. From 0f33d66d13fab280884bea89b7660f4f87850f68 Mon Sep 17 00:00:00 2001 From: Thiago Crepaldi Date: Mon, 6 Nov 2023 14:56:06 -0500 Subject: [PATCH 036/378] Rename torch.onnx.ExportOutput to torch.onnx.ONNXProgram (#2654) Follows https://github.com/pytorch/pytorch/pull/112263 --- .../export_simple_model_to_onnx_tutorial.py | 10 ++-- .../onnx/onnx_registry_tutorial.py | 56 +++++++++---------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/beginner_source/onnx/export_simple_model_to_onnx_tutorial.py b/beginner_source/onnx/export_simple_model_to_onnx_tutorial.py index 48937fbd250..760c40ab43c 100644 --- a/beginner_source/onnx/export_simple_model_to_onnx_tutorial.py +++ b/beginner_source/onnx/export_simple_model_to_onnx_tutorial.py @@ -90,11 +90,11 @@ def forward(self, x): torch_model = MyModel() torch_input = torch.randn(1, 1, 32, 32) -export_output = torch.onnx.dynamo_export(torch_model, torch_input) +onnx_program = torch.onnx.dynamo_export(torch_model, torch_input) ###################################################################### # As we can see, we didn't need any code change to the model. -# The resulting ONNX model is stored within ``torch.onnx.ExportOutput`` as a binary protobuf file. +# The resulting ONNX model is stored within ``torch.onnx.ONNXProgram`` as a binary protobuf file. # # 4. Save the ONNX model in a file # -------------------------------- @@ -102,7 +102,7 @@ def forward(self, x): # Although having the exported model loaded in memory is useful in many applications, # we can save it to disk with the following code: -export_output.save("my_image_classifier.onnx") +onnx_program.save("my_image_classifier.onnx") ###################################################################### # You can load the ONNX file back into memory and check if it is well formed with the following code: @@ -155,7 +155,7 @@ def forward(self, x): import onnxruntime -onnx_input = export_output.adapt_torch_inputs_to_onnx(torch_input) +onnx_input = onnx_program.adapt_torch_inputs_to_onnx(torch_input) print(f"Input length: {len(onnx_input)}") print(f"Sample input: {onnx_input}") @@ -179,7 +179,7 @@ def to_numpy(tensor): # Before comparing the results, we need to convert the PyTorch's output to match ONNX's format. torch_outputs = torch_model(torch_input) -torch_outputs = export_output.adapt_torch_outputs_to_onnx(torch_outputs) +torch_outputs = onnx_program.adapt_torch_outputs_to_onnx(torch_outputs) assert len(torch_outputs) == len(onnxruntime_outputs) for torch_output, onnxruntime_output in zip(torch_outputs, onnxruntime_outputs): diff --git a/beginner_source/onnx/onnx_registry_tutorial.py b/beginner_source/onnx/onnx_registry_tutorial.py index 63e2b91975d..dfb54d60974 100644 --- a/beginner_source/onnx/onnx_registry_tutorial.py +++ b/beginner_source/onnx/onnx_registry_tutorial.py @@ -114,7 +114,7 @@ def custom_aten_add(input_x, input_y, alpha: float = 1.0): {onnx_registry.is_registered_op(namespace='aten', op_name='add', overload='Tensor')}" ) export_options = torch.onnx.ExportOptions(onnx_registry=onnx_registry) -export_output = torch.onnx.dynamo_export( +onnx_program = torch.onnx.dynamo_export( aten_add_model, input_add_x, input_add_y, export_options=export_options ) @@ -125,14 +125,14 @@ def custom_aten_add(input_x, input_y, alpha: float = 1.0): # # graph node domain is the custom domain we registered -assert export_output.model_proto.graph.node[0].domain == "custom.aten" -assert len(export_output.model_proto.graph.node) == 1 +assert onnx_program.model_proto.graph.node[0].domain == "custom.aten" +assert len(onnx_program.model_proto.graph.node) == 1 # graph node name is the function name -assert export_output.model_proto.graph.node[0].op_type == "custom_aten_add" +assert onnx_program.model_proto.graph.node[0].op_type == "custom_aten_add" # function node domain is empty because we use standard ONNX operators -assert export_output.model_proto.functions[0].node[3].domain == "" +assert onnx_program.model_proto.functions[0].node[3].domain == "" # function node name is the standard ONNX operator name -assert export_output.model_proto.functions[0].node[3].op_type == "Add" +assert onnx_program.model_proto.functions[0].node[3].op_type == "Add" ###################################################################### @@ -155,7 +155,7 @@ def custom_aten_add(input_x, input_y, alpha: float = 1.0): # Use ONNX Runtime to run the model, and compare the results with PyTorch -export_output.save("./custom_add_model.onnx") +onnx_program.save("./custom_add_model.onnx") ort_session = onnxruntime.InferenceSession( "./custom_add_model.onnx", providers=['CPUExecutionProvider'] ) @@ -163,12 +163,12 @@ def custom_aten_add(input_x, input_y, alpha: float = 1.0): def to_numpy(tensor): return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy() -onnx_input = export_output.adapt_torch_inputs_to_onnx(input_add_x, input_add_y) +onnx_input = onnx_program.adapt_torch_inputs_to_onnx(input_add_x, input_add_y) onnxruntime_input = {k.name: to_numpy(v) for k, v in zip(ort_session.get_inputs(), onnx_input)} onnxruntime_outputs = ort_session.run(None, onnxruntime_input) torch_outputs = aten_add_model(input_add_x, input_add_y) -torch_outputs = export_output.adapt_torch_outputs_to_onnx(torch_outputs) +torch_outputs = onnx_program.adapt_torch_outputs_to_onnx(torch_outputs) assert len(torch_outputs) == len(onnxruntime_outputs) for torch_output, onnxruntime_output in zip(torch_outputs, onnxruntime_outputs): @@ -225,7 +225,7 @@ def custom_aten_gelu(input_x, approximate: str = "none"): aten_gelu_model = CustomGelu() input_gelu_x = torch.randn(3, 3) -export_output = torch.onnx.dynamo_export( +onnx_program = torch.onnx.dynamo_export( aten_gelu_model, input_gelu_x, export_options=export_options ) @@ -238,13 +238,13 @@ def custom_aten_gelu(input_x, approximate: str = "none"): # # graph node domain is the custom domain we registered -assert export_output.model_proto.graph.node[0].domain == "com.microsoft" +assert onnx_program.model_proto.graph.node[0].domain == "com.microsoft" # graph node name is the function name -assert export_output.model_proto.graph.node[0].op_type == "custom_aten_gelu" +assert onnx_program.model_proto.graph.node[0].op_type == "custom_aten_gelu" # function node domain is the custom domain we registered -assert export_output.model_proto.functions[0].node[0].domain == "com.microsoft" +assert onnx_program.model_proto.functions[0].node[0].domain == "com.microsoft" # function node name is the node name used in the function -assert export_output.model_proto.functions[0].node[0].op_type == "Gelu" +assert onnx_program.model_proto.functions[0].node[0].op_type == "Gelu" ###################################################################### @@ -263,7 +263,7 @@ def custom_aten_gelu(input_x, approximate: str = "none"): # and compare the results with PyTorch. # -export_output.save("./custom_gelu_model.onnx") +onnx_program.save("./custom_gelu_model.onnx") ort_session = onnxruntime.InferenceSession( "./custom_gelu_model.onnx", providers=['CPUExecutionProvider'] ) @@ -271,12 +271,12 @@ def custom_aten_gelu(input_x, approximate: str = "none"): def to_numpy(tensor): return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy() -onnx_input = export_output.adapt_torch_inputs_to_onnx(input_gelu_x) +onnx_input = onnx_program.adapt_torch_inputs_to_onnx(input_gelu_x) onnxruntime_input = {k.name: to_numpy(v) for k, v in zip(ort_session.get_inputs(), onnx_input)} onnxruntime_outputs = ort_session.run(None, onnxruntime_input) torch_outputs = aten_gelu_model(input_gelu_x) -torch_outputs = export_output.adapt_torch_outputs_to_onnx(torch_outputs) +torch_outputs = onnx_program.adapt_torch_outputs_to_onnx(torch_outputs) assert len(torch_outputs) == len(onnxruntime_outputs) for torch_output, onnxruntime_output in zip(torch_outputs, onnxruntime_outputs): @@ -365,24 +365,24 @@ def custom_addandround(input_x): ) export_options = torch.onnx.ExportOptions(onnx_registry=onnx_registry) -export_output = torch.onnx.dynamo_export( +onnx_program = torch.onnx.dynamo_export( custom_addandround_model, input_addandround_x, export_options=export_options ) -export_output.save("./custom_addandround_model.onnx") +onnx_program.save("./custom_addandround_model.onnx") ###################################################################### -# The ``export_output`` exposes the exported model as protobuf through ``export_output.model_proto``. +# The ``onnx_program`` exposes the exported model as protobuf through ``onnx_program.model_proto``. # The graph has one graph nodes for ``custom_addandround``, and inside ``custom_addandround``, # there are two function nodes, one for each operator. # -assert export_output.model_proto.graph.node[0].domain == "test.customop" -assert export_output.model_proto.graph.node[0].op_type == "custom_addandround" -assert export_output.model_proto.functions[0].node[0].domain == "test.customop" -assert export_output.model_proto.functions[0].node[0].op_type == "CustomOpOne" -assert export_output.model_proto.functions[0].node[1].domain == "test.customop" -assert export_output.model_proto.functions[0].node[1].op_type == "CustomOpTwo" +assert onnx_program.model_proto.graph.node[0].domain == "test.customop" +assert onnx_program.model_proto.graph.node[0].op_type == "custom_addandround" +assert onnx_program.model_proto.functions[0].node[0].domain == "test.customop" +assert onnx_program.model_proto.functions[0].node[0].op_type == "CustomOpOne" +assert onnx_program.model_proto.functions[0].node[1].domain == "test.customop" +assert onnx_program.model_proto.functions[0].node[1].op_type == "CustomOpTwo" ###################################################################### @@ -432,12 +432,12 @@ def custom_addandround(input_x): # def to_numpy(tensor): # return tensor.detach().cpu().numpy() if tensor.requires_grad else tensor.cpu().numpy() # -# onnx_input = export_output.adapt_torch_inputs_to_onnx(input_addandround_x) +# onnx_input = onnx_program.adapt_torch_inputs_to_onnx(input_addandround_x) # onnxruntime_input = {k.name: to_numpy(v) for k, v in zip(ort_session.get_inputs(), onnx_input)} # onnxruntime_outputs = ort_session.run(None, onnxruntime_input) # # torch_outputs = custom_addandround_model(input_addandround_x) -# torch_outputs = export_output.adapt_torch_outputs_to_onnx(torch_outputs) +# torch_outputs = onnx_program.adapt_torch_outputs_to_onnx(torch_outputs) # # assert len(torch_outputs) == len(onnxruntime_outputs) # for torch_output, onnxruntime_output in zip(torch_outputs, onnxruntime_outputs): From 4eb448367cbf3589c8466340f134de9644c82aad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alperen=20=C3=9CNL=C3=9C?= <97191996+alperenunlu@users.noreply.github.com> Date: Mon, 6 Nov 2023 23:13:18 +0300 Subject: [PATCH 037/378] Fix mario_rl_tutorial.py (#2649) Co-authored-by: Svetlana Karslioglu --- intermediate_source/mario_rl_tutorial.py | 32 +++++++++++++----------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/intermediate_source/mario_rl_tutorial.py b/intermediate_source/mario_rl_tutorial.py index 74a08a47b37..20f1b618773 100755 --- a/intermediate_source/mario_rl_tutorial.py +++ b/intermediate_source/mario_rl_tutorial.py @@ -43,7 +43,7 @@ import numpy as np from pathlib import Path from collections import deque -import random, datetime, os, copy +import random, datetime, os # Gym is an OpenAI toolkit for RL import gym @@ -424,20 +424,10 @@ def __init__(self, input_dim, output_dim): if w != 84: raise ValueError(f"Expecting input width: 84, got: {w}") - self.online = nn.Sequential( - nn.Conv2d(in_channels=c, out_channels=32, kernel_size=8, stride=4), - nn.ReLU(), - nn.Conv2d(in_channels=32, out_channels=64, kernel_size=4, stride=2), - nn.ReLU(), - nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1), - nn.ReLU(), - nn.Flatten(), - nn.Linear(3136, 512), - nn.ReLU(), - nn.Linear(512, output_dim), - ) + self.online = self.__build_cnn(c, output_dim) - self.target = copy.deepcopy(self.online) + self.target = self.__build_cnn(c, output_dim) + self.target.load_state_dict(self.online.state_dict()) # Q_target parameters are frozen. for p in self.target.parameters(): @@ -449,6 +439,20 @@ def forward(self, input, model): elif model == "target": return self.target(input) + def __build_cnn(self, c, output_dim): + return nn.Sequential( + nn.Conv2d(in_channels=c, out_channels=32, kernel_size=8, stride=4), + nn.ReLU(), + nn.Conv2d(in_channels=32, out_channels=64, kernel_size=4, stride=2), + nn.ReLU(), + nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1), + nn.ReLU(), + nn.Flatten(), + nn.Linear(3136, 512), + nn.ReLU(), + nn.Linear(512, output_dim), + ) + ###################################################################### # TD Estimate & TD Target From 105e9528feba023cad70327f3d2bdaf93cba8b27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alperen=20=C3=9CNL=C3=9C?= <97191996+alperenunlu@users.noreply.github.com> Date: Tue, 7 Nov 2023 19:26:52 +0300 Subject: [PATCH 038/378] Add logging to last episode (#2656) --- intermediate_source/mario_rl_tutorial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intermediate_source/mario_rl_tutorial.py b/intermediate_source/mario_rl_tutorial.py index 20f1b618773..ffb4a54ac01 100755 --- a/intermediate_source/mario_rl_tutorial.py +++ b/intermediate_source/mario_rl_tutorial.py @@ -778,7 +778,7 @@ def record(self, episode, epsilon, step): logger.log_episode() - if e % 20 == 0: + if (e % 20 == 0) or (e == episodes - 1): logger.record(episode=e, epsilon=mario.exploration_rate, step=mario.curr_step) From 88e017e37ab8aabe56e59194575b7c34617d7078 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alperen=20=C3=9CNL=C3=9C?= <97191996+alperenunlu@users.noreply.github.com> Date: Tue, 7 Nov 2023 22:36:10 +0300 Subject: [PATCH 039/378] Enable antialias on marioRL (#2660) --- intermediate_source/mario_rl_tutorial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/intermediate_source/mario_rl_tutorial.py b/intermediate_source/mario_rl_tutorial.py index ffb4a54ac01..67d50b121dc 100755 --- a/intermediate_source/mario_rl_tutorial.py +++ b/intermediate_source/mario_rl_tutorial.py @@ -199,7 +199,7 @@ def __init__(self, env, shape): def observation(self, observation): transforms = T.Compose( - [T.Resize(self.shape), T.Normalize(0, 255)] + [T.Resize(self.shape, antialias=True), T.Normalize(0, 255)] ) observation = transforms(observation).squeeze(0) return observation From 789fc091ac7dc47f3ef5d37d4f0305cdd5a2be4b Mon Sep 17 00:00:00 2001 From: Vidit Agarwal Date: Wed, 8 Nov 2023 04:13:28 +0530 Subject: [PATCH 040/378] corrected comment regarding .train and .eval (#2659) Co-authored-by: Svetlana Karslioglu --- beginner_source/introyt/tensorboardyt_tutorial.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/beginner_source/introyt/tensorboardyt_tutorial.py b/beginner_source/introyt/tensorboardyt_tutorial.py index 29e83066726..146747410ab 100644 --- a/beginner_source/introyt/tensorboardyt_tutorial.py +++ b/beginner_source/introyt/tensorboardyt_tutorial.py @@ -214,13 +214,14 @@ def forward(self, x): # Check against the validation set running_vloss = 0.0 - net.train(False) # Don't need to track gradents for validation + # In evaluation mode some model specific operations can be omitted eg. dropout layer + net.train(False) # Switching to evaluation mode, eg. turning off regularisation for j, vdata in enumerate(validation_loader, 0): vinputs, vlabels = vdata voutputs = net(vinputs) vloss = criterion(voutputs, vlabels) running_vloss += vloss.item() - net.train(True) # Turn gradients back on for training + net.train(True) # Switching back to training mode, eg. turning on regularisation avg_loss = running_loss / 1000 avg_vloss = running_vloss / len(validation_loader) From ab4e99a3653325d03c5ed96159a78a334ff21ade Mon Sep 17 00:00:00 2001 From: Mark Sturdevant Date: Wed, 8 Nov 2023 08:40:08 -0800 Subject: [PATCH 041/378] Add Recurrent DQN: Training recurrent policies (#2643) * Add Recurrent DQN: Training recurrent policies Fixes: #2349 --------- Signed-off-by: markstur Co-authored-by: Svetlana Karslioglu --- _static/img/rollout_recurrent.png | Bin 0 -> 346286 bytes en-wordlist.txt | 1 + index.rst | 9 +- intermediate_source/dqn_with_rnn_tutorial.py | 441 +++++++++++++++++++ requirements.txt | 4 +- 5 files changed, 451 insertions(+), 4 deletions(-) create mode 100644 _static/img/rollout_recurrent.png create mode 100644 intermediate_source/dqn_with_rnn_tutorial.py diff --git a/_static/img/rollout_recurrent.png b/_static/img/rollout_recurrent.png new file mode 100644 index 0000000000000000000000000000000000000000..2ce24d40d23305895605fa1a25ac6b2b781b4f43 GIT binary patch literal 346286 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

KQ!H-YV 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

Hf<^&hw8&IK9)10(a6 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 |7EFK!e`(noif4FbF`nZu?vx2zt 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 T=?8y?g0y?O`njxgN@xNA^qhwz literal 0 HcmV?d00001 diff --git a/en-wordlist.txt b/en-wordlist.txt index cf2390040d9..18ba658a331 100644 --- a/en-wordlist.txt +++ b/en-wordlist.txt @@ -62,6 +62,7 @@ Colab Conv ConvNet ConvNets +customizable DCGAN DCGANs DDP diff --git a/index.rst b/index.rst index fb2ce3bd6f9..4c798e1f1c9 100644 --- a/index.rst +++ b/index.rst @@ -312,6 +312,13 @@ What's new in PyTorch tutorials? :link: intermediate/mario_rl_tutorial.html :tags: Reinforcement-Learning +.. customcarditem:: + :header: Recurrent DQN + :card_description: Use TorchRL to train recurrent policies + :image: _static/img/rollout_recurrent.png + :link: intermediate/dqn_with_rnn_tutorial.html + :tags: Reinforcement-Learning + .. customcarditem:: :header: Code a DDPG Loss :card_description: Use TorchRL to code a DDPG Loss @@ -319,8 +326,6 @@ What's new in PyTorch tutorials? :link: advanced/coding_ddpg.html :tags: Reinforcement-Learning - - .. Deploying PyTorch Models in Production diff --git a/intermediate_source/dqn_with_rnn_tutorial.py b/intermediate_source/dqn_with_rnn_tutorial.py new file mode 100644 index 00000000000..55afbbe5e45 --- /dev/null +++ b/intermediate_source/dqn_with_rnn_tutorial.py @@ -0,0 +1,441 @@ +# -*- coding: utf-8 -*- + +""" +Recurrent DQN: Training recurrent policies +========================================== + +**Author**: `Vincent Moens `_ + +.. grid:: 2 + + .. grid-item-card:: :octicon:`mortar-board;1em;` What you will learn + + * How to incorporating an RNN in an actor in TorchRL + * How to use that memory-based policy with a replay buffer and a loss module + + .. grid-item-card:: :octicon:`list-unordered;1em;` Prerequisites + + * PyTorch v2.0.0 + * gym[mujoco] + * tqdm +""" + +######################################################################### +# Overview +# -------- +# +# Memory-based policies are crucial not only when the observations are partially +# observable but also when the time dimension must be taken into account to +# make informed decisions. +# +# Recurrent neural network have long been a popular tool for memory-based +# policies. The idea is to keep a recurrent state in memory between two +# consecutive steps, and use this as an input to the policy along with the +# current observation. +# +# This tutorial shows how to incorporate an RNN in a policy using TorchRL. +# +# Key learnings: +# +# - Incorporating an RNN in an actor in TorchRL; +# - Using that memory-based policy with a replay buffer and a loss module. +# +# The core idea of using RNNs in TorchRL is to use TensorDict as a data carrier +# for the hidden states from one step to another. We'll build a policy that +# reads the previous recurrent state from the current TensorDict, and writes the +# current recurrent states in the TensorDict of the next state: +# +# .. figure:: /_static/img/rollout_recurrent.png +# :alt: Data collection with a recurrent policy +# +# As this figure shows, our environment populates the TensorDict with zeroed recurrent +# states which are read by the policy together with the observation to produce an +# action, and recurrent states that will be used for the next step. +# When the :func:`~torchrl.envs.utils.step_mdp` function is called, the recurrent states +# from the next state are brought to the current TensorDict. Let's see how this +# is implemented in practice. + +###################################################################### +# If you are running this in Google Colab, make sure you install the following dependencies: +# +# .. code-block:: bash +# +# !pip3 install torchrl +# !pip3 install gym[mujoco] +# !pip3 install tqdm +# +# Setup +# ----- +# + +import torch +import tqdm +from tensordict.nn import TensorDictModule as Mod, TensorDictSequential as Seq +from torch import nn +from torchrl.collectors import SyncDataCollector +from torchrl.data import LazyMemmapStorage, TensorDictReplayBuffer +from torchrl.envs import ( + Compose, + ExplorationType, + GrayScale, + InitTracker, + ObservationNorm, + Resize, + RewardScaling, + set_exploration_type, + StepCounter, + ToTensorImage, + TransformedEnv, +) +from torchrl.envs.libs.gym import GymEnv +from torchrl.modules import ConvNet, EGreedyWrapper, LSTMModule, MLP, QValueModule +from torchrl.objectives import DQNLoss, SoftUpdate + +device = torch.device(0) if torch.cuda.device_count() else torch.device("cpu") + +###################################################################### +# Environment +# ----------- +# +# As usual, the first step is to build our environment: it helps us +# define the problem and build the policy network accordingly. For this tutorial, +# we'll be running a single pixel-based instance of the CartPole gym +# environment with some custom transforms: turning to grayscale, resizing to +# 84x84, scaling down the rewards and normalizing the observations. +# +# .. note:: +# The :class:`~torchrl.envs.transforms.StepCounter` transform is accessory. Since the CartPole +# task goal is to make trajectories as long as possible, counting the steps +# can help us track the performance of our policy. +# +# Two transforms are important for the purpose of this tutorial: +# +# - :class:`~torchrl.envs.transforms.InitTracker` will stamp the +# calls to :meth:`~torchrl.envs.EnvBase.reset` by adding a ``"is_init"`` +# boolean mask in the TensorDict that will track which steps require a reset +# of the RNN hidden states. +# - The :class:`~torchrl.envs.transforms.TensorDictPrimer` transform is a bit more +# technical. It is not required to use RNN policies. However, it +# instructs the environment (and subsequently the collector) that some extra +# keys are to be expected. Once added, a call to `env.reset()` will populate +# the entries indicated in the primer with zeroed tensors. Knowing that +# these tensors are expected by the policy, the collector will pass them on +# during collection. Eventually, we'll be storing our hidden states in the +# replay buffer, which will help us bootstrap the computation of the +# RNN operations in the loss module (which would otherwise be initiated +# with 0s). In summary: not including this transform will not impact hugely +# the training of our policy, but it will make the recurrent keys disappear +# from the collected data and the replay buffer, which will in turn lead to +# a slightly less optimal training. +# Fortunately, the :class:`~torchrl.modules.LSTMModule` we propose is +# equipped with a helper method to build just that transform for us, so +# we can wait until we build it! +# + +env = TransformedEnv( + GymEnv("CartPole-v1", from_pixels=True, device=device), + Compose( + ToTensorImage(), + GrayScale(), + Resize(84, 84), + StepCounter(), + InitTracker(), + RewardScaling(loc=0.0, scale=0.1), + ObservationNorm(standard_normal=True, in_keys=["pixels"]), + ), +) + +###################################################################### +# As always, we need to initialize manually our normalization constants: +# +env.transform[-1].init_stats(1000, reduce_dim=[0, 1, 2], cat_dim=0, keep_dims=[0]) +td = env.reset() + +###################################################################### +# Policy +# ------ +# +# Our policy will have 3 components: a :class:`~torchrl.modules.ConvNet` +# backbone, an :class:`~torchrl.modules.LSTMModule` memory layer and a shallow +# :class:`~torchrl.modules.MLP` block that will map the LSTM output onto the +# action values. +# +# Convolutional network +# ~~~~~~~~~~~~~~~~~~~~~ +# +# We build a convolutional network flanked with a :class:`torch.nn.AdaptiveAvgPool2d` +# that will squash the output in a vector of size 64. The :class:`~torchrl.modules.ConvNet` +# can assist us with this: +# + +feature = Mod( + ConvNet( + num_cells=[32, 32, 64], + squeeze_output=True, + aggregator_class=nn.AdaptiveAvgPool2d, + aggregator_kwargs={"output_size": (1, 1)}, + device=device, + ), + in_keys=["pixels"], + out_keys=["embed"], +) +###################################################################### +# we execute the first module on a batch of data to gather the size of the +# output vector: +# +n_cells = feature(env.reset())["embed"].shape[-1] + +###################################################################### +# LSTM Module +# ~~~~~~~~~~~ +# +# TorchRL provides a specialized :class:`~torchrl.modules.LSTMModule` class +# to incorporate LSTMs in your code-base. It is a :class:`~tensordict.nn.TensorDictModuleBase` +# subclass: as such, it has a set of ``in_keys`` and ``out_keys`` that indicate +# what values should be expected to be read and written/updated during the +# execution of the module. The class comes with customizable predefined +# values for these attributes to facilitate its construction. +# +# .. note:: +# *Usage limitations*: The class supports almost all LSTM features such as +# dropout or multi-layered LSTMs. +# However, to respect TorchRL's conventions, this LSTM must have the ``batch_first`` +# attribute set to ``True`` which is **not** the default in PyTorch. However, +# our :class:`~torchrl.modules.LSTMModule` changes this default +# behavior, so we're good with a native call. +# +# Also, the LSTM cannot have a ``bidirectional`` attribute set to ``True`` as +# this wouldn't be usable in online settings. In this case, the default value +# is the correct one. +# + +lstm = LSTMModule( + input_size=n_cells, + hidden_size=128, + device=device, + in_key="embed", + out_key="embed", +) + +###################################################################### +# Let us look at the LSTM Module class, specifically its in and out_keys: +print("in_keys", lstm.in_keys) +print("out_keys", lstm.out_keys) + +###################################################################### +# We can see that these values contain the key we indicated as the in_key (and out_key) +# as well as recurrent key names. The out_keys are preceded by a "next" prefix +# that indicates that they will need to be written in the "next" TensorDict. +# We use this convention (which can be overridden by passing the in_keys/out_keys +# arguments) to make sure that a call to :func:`~torchrl.envs.utils.step_mdp` will +# move the recurrent state to the root TensorDict, making it available to the +# RNN during the following call (see figure in the intro). +# +# As mentioned earlier, we have one more optional transform to add to our +# environment to make sure that the recurrent states are passed to the buffer. +# The :meth:`~torchrl.modules.LSTMModule.make_tensordict_primer` method does +# exactly that: +# +env.append_transform(lstm.make_tensordict_primer()) + +###################################################################### +# and that's it! We can print the environment to check that everything looks good now +# that we have added the primer: +print(env) + +###################################################################### +# MLP +# ~~~ +# +# We use a single-layer MLP to represent the action values we'll be using for +# our policy. +# +mlp = MLP( + out_features=2, + num_cells=[ + 64, + ], + device=device, +) +###################################################################### +# and fill the bias with zeros: + +mlp[-1].bias.data.fill_(0.0) +mlp = Mod(mlp, in_keys=["embed"], out_keys=["action_value"]) + +###################################################################### +# Using the Q-Values to select an action +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# The last part of our policy is the Q-Value Module. +# The Q-Value module :class:`~torchrl.modules.tensordict_module.QValueModule` +# will read the ``"action_values"`` key that is produced by our MLP and +# from it, gather the action that has the maximum value. +# The only thing we need to do is to specify the action space, which can be done +# either by passing a string or an action-spec. This allows us to use +# Categorical (sometimes called "sparse") encoding or the one-hot version of it. +# +qval = QValueModule(action_space=env.action_spec) + +###################################################################### +# .. note:: +# TorchRL also provides a wrapper class :class:`torchrl.modules.QValueActor` that +# wraps a module in a Sequential together with a :class:`~torchrl.modules.tensordict_module.QValueModule` +# like we are doing explicitly here. There is little advantage to do this +# and the process is less transparent, but the end results will be similar to +# what we do here. +# +# We can now put things together in a :class:`~tensordict.nn.TensorDictSequential` +# +stoch_policy = Seq(feature, lstm, mlp, qval) + +###################################################################### +# DQN being a deterministic algorithm, exploration is a crucial part of it. +# We'll be using an :math:`\epsilon`-greedy policy with an epsilon of 0.2 decaying +# progressively to 0. +# This decay is achieved via a call to :meth:`~torchrl.modules.EGreedyWrapper.step` +# (see training loop below). +# +stoch_policy = EGreedyWrapper( + stoch_policy, annealing_num_steps=1_000_000, spec=env.action_spec, eps_init=0.2 +) + +###################################################################### +# Using the model for the loss +# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +# +# The model as we've built it is well equipped to be used in sequential settings. +# However, the class :class:`torch.nn.LSTM` can use a cuDNN-optimized backend +# to run the RNN sequence faster on GPU device. We would not want to miss +# such an opportunity to speed up our training loop! +# To use it, we just need to tell the LSTM module to run on "recurrent-mode" +# when used by the loss. +# As we'll usually want to have two copies of the LSTM module, we do this by +# calling a :meth:`~torchrl.modules.LSTMModule.set_recurrent_mode` method that +# will return a new instance of the LSTM (with shared weights) that will +# assume that the input data is sequential in nature. +# +policy = Seq(feature, lstm.set_recurrent_mode(True), mlp, qval) + +###################################################################### +# Because we still have a couple of uninitialized parameters we should +# initialize them before creating an optimizer and such. +# +policy(env.reset()) + +###################################################################### +# DQN Loss +# -------- +# +# Out DQN loss requires us to pass the policy and, again, the action-space. +# While this may seem redundant, it is important as we want to make sure that +# the :class:`~torchrl.objectives.DQNLoss` and the :class:`~torchrl.modules.tensordict_module.QValueModule` +# classes are compatible, but aren't strongly dependent on each other. +# +# To use the Double-DQN, we ask for a ``delay_value`` argument that will +# create a non-differentiable copy of the network parameters to be used +# as a target network. +loss_fn = DQNLoss(policy, action_space=env.action_spec, delay_value=True) + +###################################################################### +# Since we are using a double DQN, we need to update the target parameters. +# We'll use a :class:`~torchrl.objectives.SoftUpdate` instance to carry out +# this work. +# +updater = SoftUpdate(loss_fn, eps=0.95) + +optim = torch.optim.Adam(policy.parameters(), lr=3e-4) + +###################################################################### +# Collector and replay buffer +# --------------------------- +# +# We build the simplest data collector there is. We'll try to train our algorithm +# with a million frames, extending the buffer with 50 frames at a time. The buffer +# will be designed to store 20 thousands trajectories of 50 steps each. +# At each optimization step (16 per data collection), we'll collect 4 items +# from our buffer, for a total of 200 transitions. +# We'll use a :class:`~torchrl.data.replay_buffers.LazyMemmapStorage` storage to keep the data +# on disk. +# +# .. note:: +# For the sake of efficiency, we're only running a few thousands iterations +# here. In a real setting, the total number of frames should be set to 1M. +# +collector = SyncDataCollector(env, stoch_policy, frames_per_batch=50, total_frames=200) +rb = TensorDictReplayBuffer( + storage=LazyMemmapStorage(20_000), batch_size=4, prefetch=10 +) + +###################################################################### +# Training loop +# ------------- +# +# To keep track of the progress, we will run the policy in the environment once +# every 50 data collection, and plot the results after training. +# + +utd = 16 +pbar = tqdm.tqdm(total=1_000_000) +longest = 0 + +traj_lens = [] +for i, data in enumerate(collector): + if i == 0: + print( + "Let us print the first batch of data.\nPay attention to the key names " + "which will reflect what can be found in this data structure, in particular: " + "the output of the QValueModule (action_values, action and chosen_action_value)," + "the 'is_init' key that will tell us if a step is initial or not, and the " + "recurrent_state keys.\n", + data, + ) + pbar.update(data.numel()) + # it is important to pass data that is not flattened + rb.extend(data.unsqueeze(0).to_tensordict().cpu()) + for _ in range(utd): + s = rb.sample().to(device, non_blocking=True) + loss_vals = loss_fn(s) + loss_vals["loss"].backward() + optim.step() + optim.zero_grad() + longest = max(longest, data["step_count"].max().item()) + pbar.set_description( + f"steps: {longest}, loss_val: {loss_vals['loss'].item(): 4.4f}, action_spread: {data['action'].sum(0)}" + ) + stoch_policy.step(data.numel()) + updater.step() + + with set_exploration_type(ExplorationType.MODE), torch.no_grad(): + rollout = env.rollout(10000, stoch_policy) + traj_lens.append(rollout.get(("next", "step_count")).max().item()) + +###################################################################### +# Let's plot our results: +# +if traj_lens: + from matplotlib import pyplot as plt + + plt.plot(traj_lens) + plt.xlabel("Test collection") + plt.title("Test trajectory lengths") + +###################################################################### +# Conclusion +# ---------- +# +# We have seen how an RNN can be incorporated in a policy in TorchRL. +# You should now be able: +# +# - Create an LSTM module that acts as a :class:`~tensordict.nn.TensorDictModule` +# - Indicate to the LSTM module that a reset is needed via an :class:`~torchrl.envs.transforms.InitTracker` +# transform +# - Incorporate this module in a policy and in a loss module +# - Make sure that the collector is made aware of the recurrent state entries +# such that they can be stored in the replay buffer along with the rest of +# the data +# +# Further Reading +# --------------- +# +# - The TorchRL documentation can be found `here `_. diff --git a/requirements.txt b/requirements.txt index 30799894689..36b5945380d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -25,8 +25,8 @@ tensorboard jinja2==3.0.3 pytorch-lightning torchx -torchrl==0.2.0 -tensordict==0.2.0 +torchrl==0.2.1 +tensordict==0.2.1 ax-platform nbformat>=4.2.0 datasets From 9c27f579fd244653899ff4397e2969a9f5fa7529 Mon Sep 17 00:00:00 2001 From: Jing Xu Date: Thu, 9 Nov 2023 01:42:48 +0900 Subject: [PATCH 042/378] update out-of-date URL for Intel optimization guide (#2657) Co-authored-by: Svetlana Karslioglu --- recipes_source/recipes/tuning_guide.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/recipes_source/recipes/tuning_guide.py b/recipes_source/recipes/tuning_guide.py index 39fa667bc1a..d23f3fe666e 100644 --- a/recipes_source/recipes/tuning_guide.py +++ b/recipes_source/recipes/tuning_guide.py @@ -193,12 +193,15 @@ def fused_gelu(x): # # numactl --cpunodebind=N --membind=N python +############################################################################### +# More detailed descriptions can be found `here `_. + ############################################################################### # Utilize OpenMP # ~~~~~~~~~~~~~~ # OpenMP is utilized to bring better performance for parallel computation tasks. # ``OMP_NUM_THREADS`` is the easiest switch that can be used to accelerate computations. It determines number of threads used for OpenMP computations. -# CPU affinity setting controls how workloads are distributed over multiple cores. It affects communication overhead, cache line invalidation overhead, or page thrashing, thus proper setting of CPU affinity brings performance benefits. ``GOMP_CPU_AFFINITY`` or ``KMP_AFFINITY`` determines how to bind OpenMP* threads to physical processing units. +# CPU affinity setting controls how workloads are distributed over multiple cores. It affects communication overhead, cache line invalidation overhead, or page thrashing, thus proper setting of CPU affinity brings performance benefits. ``GOMP_CPU_AFFINITY`` or ``KMP_AFFINITY`` determines how to bind OpenMP* threads to physical processing units. Detailed information can be found `here `_. ############################################################################### # With the following command, PyTorch run the task on N OpenMP threads. @@ -283,7 +286,7 @@ def fused_gelu(x): traced_model(*sample_input) ############################################################################### -# While the JIT fuser for oneDNN Graph also supports inference with ``BFloat16`` datatype, +# While the JIT fuser for oneDNN Graph also supports inference with ``BFloat16`` datatype, # performance benefit with oneDNN Graph is only exhibited by machines with AVX512_BF16 # instruction set architecture (ISA). # The following code snippets serves as an example of using ``BFloat16`` datatype for inference with oneDNN Graph: From 66eaf6a29c15e7c072b1a247d7c9942e4c49e3dd Mon Sep 17 00:00:00 2001 From: Svetlana Karslioglu Date: Wed, 8 Nov 2023 13:13:45 -0800 Subject: [PATCH 043/378] Update .pyspelling.yml (#2664) Exclude :meth: and :obj: from spellcheck. --- .pyspelling.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pyspelling.yml b/.pyspelling.yml index d09b401bdc0..7ceeab175b7 100644 --- a/.pyspelling.yml +++ b/.pyspelling.yml @@ -19,7 +19,7 @@ matrix: - open: '\.\.\s+(figure|literalinclude|math|image|grid)::' close: '\n' # Exclude roles: - - open: ':(?:(class|py:mod|mod|func)):`' + - open: ':(?:(class|py:mod|mod|func|meth|obj)):`' content: '[^`]*' close: '`' # Exclude reStructuredText hyperlinks @@ -70,7 +70,7 @@ matrix: - open: ':figure:.*' close: '\n' # Ignore reStructuredText roles - - open: ':(?:(class|file|func|math|ref|octicon)):`' + - open: ':(?:(class|file|func|math|ref|octicon|meth|obj)):`' content: '[^`]*' close: '`' - open: ':width:' From a668406dbd7db64d446d2f569d81b4b505773bfd Mon Sep 17 00:00:00 2001 From: BJ Hargrave Date: Thu, 9 Nov 2023 11:35:31 -0500 Subject: [PATCH 044/378] Fix static_quantization_tutorial error in qat_model (#2661) We need to use the qat variant of the fuse_modules method. After this fix, the tutorial runs to completion on a linux x86 system. Fixes https://github.com/pytorch/tutorials/issues/1269 Signed-off-by: BJ Hargrave Co-authored-by: Svetlana Karslioglu --- advanced_source/static_quantization_tutorial.rst | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/advanced_source/static_quantization_tutorial.rst b/advanced_source/static_quantization_tutorial.rst index 6f4118079be..7b0df08362a 100644 --- a/advanced_source/static_quantization_tutorial.rst +++ b/advanced_source/static_quantization_tutorial.rst @@ -206,14 +206,15 @@ Note: this code is taken from # Fuse Conv+BN and Conv+BN+Relu modules prior to quantization # This operation does not change the numerics - def fuse_model(self): + def fuse_model(self, is_qat=False): + fuse_modules = torch.ao.quantization.fuse_modules_qat if is_qat else torch.ao.quantization.fuse_modules for m in self.modules(): if type(m) == ConvBNReLU: - torch.ao.quantization.fuse_modules(m, ['0', '1', '2'], inplace=True) + fuse_modules(m, ['0', '1', '2'], inplace=True) if type(m) == InvertedResidual: for idx in range(len(m.conv)): if type(m.conv[idx]) == nn.Conv2d: - torch.ao.quantization.fuse_modules(m.conv, [str(idx), str(idx + 1)], inplace=True) + fuse_modules(m.conv, [str(idx), str(idx + 1)], inplace=True) 2. Helper functions ------------------- @@ -533,7 +534,7 @@ We fuse modules as before .. code:: python qat_model = load_model(saved_model_dir + float_model_file) - qat_model.fuse_model() + qat_model.fuse_model(is_qat=True) optimizer = torch.optim.SGD(qat_model.parameters(), lr = 0.0001) # The old 'fbgemm' is still available but 'x86' is the recommended default. From 16e4f2a15d0b2ede32b6c38bb41e8383addefd7e Mon Sep 17 00:00:00 2001 From: Krishna Kalyan Date: Thu, 9 Nov 2023 21:47:04 +0100 Subject: [PATCH 045/378] Port TorchRL Pendulum tutorial from pytorch.org/rl to pytorch.org/tutorials (#2653) Port the Pendulum tutorial from pytorch.org/rl. ---- Co-authored-by: Svetlana Karslioglu --- _static/img/pendulum.gif | Bin 0 -> 125364 bytes advanced_source/pendulum.py | 912 ++++++++++++++++++++++++++++++++++++ index.rst | 8 + 3 files changed, 920 insertions(+) create mode 100644 _static/img/pendulum.gif create mode 100644 advanced_source/pendulum.py diff --git a/_static/img/pendulum.gif b/_static/img/pendulum.gif new file mode 100644 index 0000000000000000000000000000000000000000..a7adf181fc8a4037591849b1c9d17bec88ed7ad2 GIT binary patch literal 125364 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