Ë
    cQêjO:  ã                   óœ  — d Z ddlZddlZddlZddlZddlZddlmZ ddlZddl	Z	ddl
Z
ddl	mZ d„ Zdej                  fd„Zd"ded	edz  fd
„Zdej                  dedefd„Zdej                  dedefd„Zdej                  dedej                  fd„Zdede	j.                  defd„Zdej                  dededededefd„Zdej                  dedededef
d„Z e	j8                  «       ded	edz  dededef
d„«       Zd „ Zed!k(  rF e«       Z  ee jB                  e jD                  e jF                  e jH                  e jJ                  «       yy)#z
Export LLM to onnx
é    N)ÚPath)Únnc                  ó  — d„ t         j                  j                  _        d„ t         j                  j                  _        d„ t         j                  j                  _        d„ t         j                  j                  _        d„ t         j                  j                  _        d„ t         j                  j                  _        d„ t         j                  j                  _	        d„ t         j                  j                  _
        y	)
z1do not init model twice as it slow initializationc                 ó   — | S ©N© ©ÚxÚargsÚkwargss      úr/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/transformers/large_model_exporter.pyú<lambda>z*disable_huggingface_init.<locals>.<lambda>   s   € À€ ó    c                 ó   — | S r   r   r	   s      r   r   z*disable_huggingface_init.<locals>.<lambda>   s   € ¸€ r   c                 ó   — | S r   r   r	   s      r   r   z*disable_huggingface_init.<locals>.<lambda>   s   € °q€ r   c                 ó   — | S r   r   r	   s      r   r   z*disable_huggingface_init.<locals>.<lambda>   s   € ¸€ r   c                 ó   — | S r   r   r	   s      r   r   z*disable_huggingface_init.<locals>.<lambda>   ó   € ¸q€ r   c                 ó   — | S r   r   r	   s      r   r   z*disable_huggingface_init.<locals>.<lambda>   s   € ¸a€ r   c                 ó   — | S r   r   r	   s      r   r   z*disable_huggingface_init.<locals>.<lambda>    r   r   c                 ó   — | S r   r   r	   s      r   r   z*disable_huggingface_init.<locals>.<lambda>!   s   € ¸1€ r   N)Útorchr   ÚinitÚkaiming_uniform_Úuniform_Únormal_Ú	constant_Úxavier_uniform_Úxavier_normal_Úkaiming_normal_Úorthogonal_r   r   r   Údisable_huggingface_initr"      s…   € ñ &B„E‡H�H‡M�MÔ"Ù9„E‡H�H‡M�MÔÙ8„E‡H�H‡M�MÔÙ:„E‡H�H‡M�MÔÙ$@„E‡H�H‡M�MÔ!Ù#?„E‡H�H‡M�MÔ Ù$@„E‡H�H‡M�MÔ!Ù <„E‡H�H‡M�MÕr   Úmodelc                 ó\  — d}d}| j                  «       D ]9  }||j                  «       |j                  «       z  z  }||j                  «       z  }Œ; d}d}| j                  «       D ]9  }||j                  «       |j                  «       z  z  }||j                  «       z  }Œ; ||z   dz  dz  }|S )z-to calculate how much memory this model needsr   é   )Ú
parametersÚnelementÚelement_sizeÚbuffers)r#   Ú
param_sizeÚ	param_sumÚparamÚbuffer_sizeÚ
buffer_sumÚbufferÚall_sizes           r   Úget_model_parameter_sizer1   $   sÀ   € à€JØ€IØ×!Ñ!Ó#ò &ˆØ�e—n‘nÓ&¨×);Ñ);Ó)=Ñ=Ñ=ˆ
Ø�U—^‘^Ó%Ñ%‰	ð&ð €KØ€JØ—-‘-“/ò (ˆØ�v—‘Ó(¨6×+>Ñ+>Ó+@Ñ@Ñ@ˆØ�f—o‘oÓ'Ñ'‰
ð(ð ˜[Ñ(¨DÑ0°4Ñ7€HØ€Or   Úhf_modelÚ	cache_dirc                 ó  — t        «        t        j                  j                  | t        j
                  |d¬«      }|€| }t        j                  j                  |«      }t         |dd¬«      j                  «       «      }||fS )zU
    get the pretrained torch model from hugginface,
    and sample model-inputs
    T)Útorch_dtyper3   Útrust_remote_codezHello, my dog is cuteÚpt)Úreturn_tensors)	r"   ÚtransformersÚAutoModelForCausalLMÚfrom_pretrainedr   Úfloat16ÚAutoTokenizerÚtupleÚvalues)r2   r3   Ú	tokenizerr#   Úsample_inputss        r   Ú"initialize_model_and_sample_inputsrB   4   s|   € ô Ôä×-Ñ-×=Ñ=ØœeŸm™m°yÐTXð >ó €Eð ÐØˆ	Ü×*Ñ*×:Ñ:¸9ÓE€Iä™)Ð$;ÈDÔQ×XÑXÓZÓ[€MØ�-ÐÐr   ÚgpulistrA   c                 ó‚  ‡— d„ }ˆfd„Š| j                  «       } g }|j                  | j                  |d¬«      «       t        t	        | j                  «       «      «      d   }| j                  «       D �]Ž  \  }}|j                  «       D �]%  \  }}	|j                  |	j                  |d¬«      «       t        |	«      t        j                  j                  fv r¬t        j                  t        |	«      t        |«      z  «      }
t        |	«      D ]s  \  }}|j                  |j                  |d¬«      «       |t        ||
z  t        |«      «         }|j                  |«        ‰||«       t!        d|› d|› d|› d|› �«       Œu Œû|	j                  |d   «       t!        d|› d|› d|d   › �«       �Œ( t        t#        |j                  «       «      «      dk(  s�Œg|j                  |d   «       t!        d|› d|d   › �«       �Œ‘ t        j$                  «       5   | |d   |d	   ¬
«       ddd«       | S # 1 sw Y   | S xY w)z/Make the model executable across multiple GPUs.c           	      óÔ  — g }d }|D �]Š  }t        |«      t        j                  ur|j                  |«       �nFt	        | d«      r6|j                  |j                  | j                  j                  «      «       �nt	        | d«      rEt        | j                  «       |«      j                  }|j                  |j                  |«      «       n³t	        t        | j                  «       d «      d«      rL|j                  |j                  t        | j                  «       «      j                  j                  «      «       nC|�0|j                  |k7  r!|j                  |j                  |«      «       n|j                  |«       |��Œ||d   j                  }�Œ� |j                  «       D ]5  \  }}t        |«      t        j                  u sŒ"|j                  |«      ||<   Œ7 t        |«      |fS )NÚweightr&   r   )Útyper   ÚTensorÚappendÚhasattrÚtorF   ÚdeviceÚnextr&   ÚchildrenÚitemsr>   )	ÚmodÚinputsr   Úmodifyed_inputsÚ	first_devÚlayer_inputrL   ÚkeyÚvalues	            r   Úinput_gpu_device_hookz5auto_pipeline_parallel.<locals>.input_gpu_device_hookJ   s�  € ØˆØˆ	Ø!ó 	6ˆKÜ�KÓ ¬¯©Ñ4Ø×&Ñ& {Ö3Ü˜˜hÔ'Ø×&Ñ& {§~¡~°c·j±j×6GÑ6GÓ'HÖIÜ˜˜lÔ+Ü˜cŸn™nÓ.°Ó<×CÑC�Ø×&Ñ& {§~¡~°fÓ'=Õ>Üœ˜cŸl™l›n¨dÓ3°XÔ>Ø×&Ñ& {§~¡~´d¸3¿<¹<»>Ó6J×6QÑ6Q×6XÑ6XÓ'YÕZØÐ&¨;×+=Ñ+=ÀÒ+JØ×&Ñ& {§~¡~°iÓ'@ÕAà×&Ñ& {Ô3ØÒ Ø+¨AÑ.×5Ñ5’	ð	6ð  !Ÿ,™,›.ò 	2‰JˆC�Ü�E‹{œeŸl™lÒ*Ø#Ÿh™h yÓ1��s’ð	2ô �oÓ&¨Ð/Ð/r   c                 ój   •— | j                  |«       | j                  «       D ]  } ‰|d   |«       Œ y )Né   )rK   Únamed_children)rP   ÚdevÚlayerÚmove_layer_to_device_rurcs      €r   r]   z9auto_pipeline_parallel.<locals>.move_layer_to_device_rurcc   s4   ø€ Ø�‰ˆsŒØ×'Ñ'Ó)ò 	5ˆEÙ% e¨A¡h°Õ4ñ	5r   T©Úwith_kwargsr   zmove ú.z to rY   ©Úattention_maskN)ÚhalfrI   Úregister_forward_pre_hookrM   ÚiterrZ   rG   r   r   Ú
ModuleListÚmathÚfloorÚlenÚ	enumerateÚminrK   ÚprintÚlistÚno_grad)r#   rC   rA   rW   Ú	all_hooksÚpre_fixÚtop_nameÚ
top_moduleÚnameÚmoduleÚnum_layers_on_each_gpuÚidxÚ
attn_layerÚto_devr]   s                 @r   Úauto_pipeline_parallelry   G   s+  ø€ ò0ô25ð
 �J‰J‹L€EØ€IØ×Ñ�U×4Ñ4Ð5JÐX\Ð4Ó]Ô^Ü”4˜×,Ñ,Ó.Ó/Ó0°Ñ3€GØ %× 4Ñ 4Ó 6ó 6Ñˆ�*Ø&×5Ñ5Ó7ó 	@‰LˆD�&Ø×Ñ˜V×=Ñ=Ð>SÐaeÐ=ÓfÔgÜ�F‹|¤§¡× 3Ñ 3Ð4Ñ4Ü)-¯©´C¸³KÄ#ÀgÃ,Ñ4NÓ)OÐ&Ü'0°Ó'8ò F‘O�C˜Ø×$Ñ$ Z×%IÑ%IÐJ_ÐmqÐ%IÓ%rÔsà$¤S¨Ð0FÑ)FÌÈGËÓ%UÑV�FØ—M‘M &Ô)Ù-¨j¸&ÔAÜ˜E ' ¨!¨D¨6°°3°%°t¸F¸8ÐDÕEñFð —	‘	˜' !™*Ô%Ü˜˜g˜Y a¨ v¨T°'¸!±*°Ð>Ö?ð	@ô Œt�J×-Ñ-Ó/Ó0Ó1°QÔ6Ø�M‰M˜' !™*Ô%Ü�E˜(˜ 4¨°©
 |Ð4Ö5ð#6ô& 
�‰‹ñ AÙˆm˜AÑ¨}¸QÑ/?Õ@÷Aà€L÷Aà€Lús   ÈH4È4H>Ú	with_pastc                 ó  ‡— g Šˆfd„}| j                  |d¬«      }t        j                  | j                  «      j                  }t        |j                  «       «      }|D �cg c]  }|j                  |«      j                  ‘Œ }} | |d   |d   ¬«      }	|j                  «        ‰d   Š|}
t        ‰d   «      D ]  \  }}‰d   |   |
|<   Œ ‰d   j                  «       D ]  \  }}|j                  |«      }||
|<   Œ t        t        ||
d¬«      «      D ]]  \  }\  }}t        |«      t        j                   u r|j#                  | j$                  «       d	|v sŒD||
|<   |r | |d   |d   |¬
«      n|	}	Œ_ ||
|	j&                  fS c c}w )zn
    auto retrieve onnx inputs from torch model as we can't enumlate all possibilities
    for all models
    c                 ó4   •— ‰j                  ||f«       ‰d   S )Nr   )rI   )Ú_rQ   r   Úuser_inputss      €r   Úhook_for_inputsz-retrieve_onnx_inputs.<locals>.hook_for_inputs‹   s    ø€ Ø×Ñ˜F FÐ+Ô,Ø˜1‰~Ðr   Tr^   r   rY   ra   F)ÚstrictÚ	use_cache)rb   r�   )rd   ÚinspectÚ	signatureÚforwardr&   rm   ÚkeysÚgetÚdefaultÚremoverj   rO   ÚindexÚziprG   r   rH   rK   rL   Úpast_key_values)r#   rA   rz   r   Úhook_handleÚforward_paramsÚ
input_keysrU   Údefault_valuesÚoutÚonnx_inputsrv   Ú_valrV   r~   s                 @r   Úretrieve_onnx_inputsr“   „   s¥  ø€ ð
 €Kôð ×1Ñ1°/ÈtÐ1ÓT€Kä×&Ñ& u§}¡}Ó5×@Ñ@€NÜ�n×)Ñ)Ó+Ó,€JØAKÖL¸#�n×(Ñ(¨Ó-×5Ó5ÐL€NÐLÙ
�˜aÑ °¸qÑ1AÔ
B€CØ×ÑÔØ˜a‘.€KØ €KÜ˜{¨1™~Ó.ò /‰	ˆˆTØ& q™>¨#Ñ.ˆ�CÒð/à! !‘n×*Ñ*Ó,ò !‰
ˆˆUØ×Ñ˜sÓ#ˆØ ˆ�CÒð!ô '¤s¨:°{È5Ô'QÓRò vÑˆ‰\ˆc�5Ü�‹;œ%Ÿ,™,Ñ&Ø�H‰H�U—\‘\Ô"Ø˜#ÒØ(ˆK˜ÑÙcl‘%˜ aÑ(¸ÀqÑ9IÐU^Õ_Ðru‰Cðvð �{ C×$7Ñ$7Ð7Ð7ùò# Ms   Á""FÚsample_inputs_tpÚreturnc                 óˆ  — t         j                  j                  d«      j                  dz  dz  }t	        dt        | «      dz  › d�«       t	        d|dz  › d�«       t        | «      |dz  kD  r¦t        t         j                  j                  «       «      D �cg c]  }t        j                  |«      ‘Œ }}t        |«      dkD  r&t	        t        |«      › d�«       t        | ||«      } | S t	        d	«       | j                  «       j                  «       } | S t	        d
«       | j                  «       j                  «       } | S c c}w )a	  
    According to the model size, we will upload it to
    CPU if has no GPU or enough GPU memory,
    Single GPU if has only one GPU in local or model size is enough to fit one GPU
    Multiple GPU if there is more than one gpu in local and model is too large
    r   r%   zModel_Size = z GBztotal_mem_per_cpu = gÍÌÌÌÌÌÜ?rY   zk GPUs are used to export onnx,                    Please set CUDA_VISIBLE_DEVICES to use specific GPU groupz5!!!! convert model to float and export onnx using CPUzExport model on a single GPU)r   ÚcudaÚget_device_propertiesÚtotal_memoryrl   r1   ÚrangeÚdevice_countrL   ri   ry   ÚcpuÚfloatrc   )r#   r”   Útotal_mem_per_cpuÚiÚdevice_collections        r   Úmove_to_appropriate_devicer¡   §   s8  € ô Ÿ
™
×8Ñ8¸Ó;×HÑHÈ4ÑOÐRVÑVÐä	ˆMÔ2°5Ó9¸DÑ@ÐAÀÐ
EÔFÜ	Ð Ð!2°TÑ!9Ð :¸#Ð
>Ô?Ü Ó&Ð):¸TÑ)AÒAÜ6;¼E¿J¹J×<SÑ<SÓ<UÓ6VÖW°œUŸ\™\¨!�_ÐWÐÐWÜÐ Ó! AÒ%ÜÜÐ(Ó)Ð*ð +Mð Nôô +¨5Ð2CÐEUÓVˆEð €Lô ÐIÔJØ—I‘I“K×%Ñ%Ó'ˆEð €Lô 	Ð,Ô-Ø—
‘
“×!Ñ!Ó#ˆØ€Lùò Xs   ÂD?rL   c                 óÂ   — g }| D ]N  }t        |t        j                  «      r!|j                  |j	                  |«      «       Œ>|j                  |«       ŒP t        |«      S )zmove inputs to device)Ú
isinstancer   rH   rI   rK   r>   )rA   rL   Úsample_inputs_Ú
sample_ints       r   Úadapt_inputs_to_devicer¦   Ã   sV   € à€NØ#ò .ˆ
Ü�j¤%§,¡,Ô/Ø×!Ñ! *§-¡-°Ó"7Õ8à×!Ñ! *Õ-ð	.ô
 �Ó Ð r   r‘   Útorch_input_namesr‹   Úinput_with_pastc           	      óÊ  — d}ddi}|�‰t        |«      }t        j                  |d   d   j                  «      |d   j                  d   k(  j	                  «       j                  d«      }|j                  «       dk(  sJ ‚dd|j                  «       di}|s| j                  j                  }t        t        t        |«      «      D �	cg c]%  }	t        ||	   t        j                  «      sŒ!||	   ‘Œ' c}	«      }
d|
v rd|
v sJ d	«       ‚d
}dddœdddœdœ}t        |
«      D ]>  \  }}||vsŒt        ||   j                  «       «      D �	ci c]
  }	|	|› d|	› �“Œ }}	|||<   Œ@ |r4t        |«      D ]&  }	|
d|	› d�fz  }
|
d|	› d�fz  }
|||
d   <   |||
d   <   Œ( |s|r$t        |«      D ]  }	|d|	› d�fz  }|d|	› d�fz  }Œ t        |«      D ]Œ  \  }}|sŒ	|dk(  r|||<   Œ|dk(  r[||   }t        j                   |t        j"                  |j                  d   df|j$                  |j&                  ¬«      fd¬«      ||<   Œt|dk(  sŒz||   }|dd…dd…f   ||<   ŒŽ |
||fS c c}	w c c}	w )z"fetch onnx inputs and outputs namer   Ú
batch_sizeNéÿÿÿÿrY   Úseq_lenÚ	input_idsrb   z6input_ids and attention_mask must be existed in inputs)Úlogits)r   rY   )r­   rb   Ú__unknown_dims__zpast_key_values.z.keyz.valueéþÿÿÿzpresent.r‹   )rL   Údtype)Údim)ri   r   ÚtensorÚshapeÚnonzeroÚviewÚnumelÚitemÚconfigÚnum_hidden_layersr>   rš   r£   rH   rj   r²   ÚcatÚonesrL   r±   )r#   r‘   r§   r‹   rz   r¨   Únum_of_past_keyÚkv_cache_axisÚ	seq_indexrŸ   Úonnx_inp_namesÚonnx_out_namesÚonnx_dynamic_axesrv   rs   Úunknown_dimsÚ	attn_maskr­   s                     r   Úfetch_onnx_inputs_outputs_namerÅ   Î   s  € ð €OØ˜Ð%€MàÐ"Ü˜oÓ.ˆÜ—\‘\ /°!Ñ"4°QÑ"7×"=Ñ"=Ó>À+ÈaÁ.×BVÑBVÐWYÑBZÑZ×cÑcÓe×jÑjÐkmÓnˆ	Ø�‰Ó  AÒ%Ð%Ð%Ø˜L¨)¯.©.Ó*:¸IÐFˆáØŸ,™,×8Ñ8ˆô Ü',¬SÐ1BÓ-CÓ'DÖq !Ì
ÐS^Ð_`ÑSaÔch×coÑcoÕHpÐ	˜1Ó	Òqó€Nð ˜.Ñ(Ð-=ÀÑ-Oð Ø@óÐOð !€Nà%¨)Ñ4Ø*¨yÑ9ñÐô
 ˜~Ó.ò 3‰	ˆˆTØÐ(Ò(ÜDIÈ+ÐVYÑJZ×J^ÑJ^ÓJ`ÓDaÖb¸q˜A # Ð&6°q°cÐ:Ñ:ÐbˆLÐbØ&2Ð˜dÒ#ð3ñ Ü�Ó'ò 	BˆAØÐ!1°!°°DÐ9Ð;Ñ;ˆNØÐ!1°!°°FÐ;Ð=Ñ=ˆNà4AÐ˜n¨RÑ0Ñ1Ø4AÐ˜n¨RÑ0Ò1ð	Bñ ‘OÜ�Ó'ò 	6ˆAØ ¨!¨¨DÐ1Ð3Ñ3ˆNØ ¨!¨¨FÐ3Ð5Ñ5‰Nð	6ô Ð0Ó1ò 5‰	ˆˆTÚØÐ(Ò(Ø#2�˜CÒ ØÐ)Ò)Ø'¨Ñ,�	Ü#(§9¡9Ø¤§
¡
¨I¯O©O¸AÑ,>ÀÐ+BÈ9×K[ÑK[Ðcl×crÑcrÔ sÐtØô$�˜CÒ ð ˜Ó$Ø'¨Ñ,�	Ø#,ªQ°±¨VÑ#4�˜CÒ ð5ð ˜>Ð+<Ð<Ð<ùòU 	rùò cs   Ã"IÃ(IÅI Úonnx_io_tupleÚ	onnx_pathÚopsetc                 óN  — |j                   }|\  }}}t        j                  «       5 }	t        j                  j                  |	d«      }
t        j                  j                  | t        |«      |
d||||d¬«	       |j                  d¬«       |j                  |› d�z  j                  d¬«       t        j                  t        |
«      «      }t        j                  |t        |«      t        t        j                   |	«      «      dkD  d|› d�dd¬	«       d
d
d
«       y
# 1 sw Y   y
xY w)z do export with torch.onnx.exportztmp.onnxF)	r#   r   ÚfÚverboseÚopset_versionÚinput_namesÚoutput_namesÚdynamic_axesÚdynamoT)Ú
missing_okz	_ext.datarY   r%   )Úsave_as_external_dataÚall_tensors_to_one_fileÚlocationÚsize_thresholdÚconvert_attributeN)rs   ÚtempfileÚTemporaryDirectoryÚosÚpathÚjoinr   ÚonnxÚexportr>   ÚunlinkÚparentÚloadÚstrÚ
save_modelri   Úlistdir)r#   rÆ   r‘   rÇ   rÈ   Úonnx_model_namerÀ   rÁ   rÂ   Ú
tmpdirnameÚtmp_onnxÚ
onnx_models               r   Údo_export_internalrè     s  € à—n‘n€OØ8EÑ5€N�NÐ$5ô 
×	$Ñ	$Ó	&ð 
¨*Ü—7‘7—<‘< 
¨JÓ7ˆä�
‰
×ÑØÜ�{Ó#ØØØØ&Ø'Ø*Øð 	ô 
	
ð 	×Ñ DÐÔ)Ø	×	Ñ	˜Ð/¨yÐ9Ñ	9×AÑAÈTÐAÔRä—Y‘Yœs 8›}Ó-ˆ
Ü�‰ØÜ�	‹NÜ#&¤r§z¡z°*Ó'=Ó#>ÀÑ#BØ$(Ø'Ð(¨	Ð2ØØ#õ	
÷'
÷ 
ñ 
ús   §C+DÄD$Úonnx_path_strc                 ó¸  — t        | |«      \  }}t        ||«      }t        |t        |j	                  «       «      j
                  «      }t        |||«      \  }}	}
t        ||	||
|d«      }d}t        |«      j                  «       }|j                  dk7  r||z  }t        |||	||«       |syt        ||	||
|d«      }d}|j                  |z  }t        |||	||«       y)z„
    do export
    model: torch model
    onnx_path: where the onnx model saved to
    sample_inputs_tp: inputs for torch model
    Fz
model.onnxz.onnxNTzmodel_with_past.onnx)rB   r¡   r¦   rM   r&   rL   r“   rÅ   r   ÚabsoluteÚsuffixrè   rß   )r2   r3   ré   rz   rÈ   r#   r”   rA   rŽ   r‘   Úpast_key_valuerÆ   rä   rÇ   s                 r   Úexport_onnxrî   7  s÷   € ô AÀÈ9ÓUÑ€EÐä& uÐ.>Ó?€Eä*Ð+;¼TÀ%×BRÑBRÓBTÓ=U×=\Ñ=\Ó]€Mô /CÀ5È-ÐYbÓ.cÑ+€J�˜^ä2°5¸+ÀzÐSaÐclÐnsÓt€Mà"€OÜ˜=Ó)×2Ñ2Ó4€IØ×Ñ˜7Ò"Ø Ñ/ˆ	ä�u˜m¨[¸)ÀUÔKÙØä2°5¸+ÀzÐSaÐclÐnrÓs€Mà,€OØ× Ñ  ?Ñ2€Iä�u˜m¨[¸)ÀUÕKr   c                  óJ  — t        j                  «       } | j                  dddt        dgd¬«       | j                  ddd	t        d
d¬«       | j                  dd	t        dd¬«       | j                  ddd	d¬«       | j                  dd	t        dd¬«       | j                  «       S )zarguments parsing.z-mz--modelTzmeta-llama/Llama-2-70b-hfz+Pre-trained models in huggingface model hub)ÚrequiredrG   r‡   Úhelpz-sz--saved_pathFz./onnx_models/z"where the onnx model will be savedz--cache_dirNz[cache directly of huggingface, by setting this to avoid useless downloading if you have onez--with_pastÚ
store_truez;The tool will export onnx without past-key-value by default)Úactionr‡   rñ   z--opseté   zothe opset to save onnx model,               try to increase it if this opset doens't have new features you want)ÚargparseÚArgumentParserÚadd_argumentrá   ÚintÚ
parse_args)Úparsers    r   Úparse_argumentsrû   [  sÜ   € ä×$Ñ$Ó&€Fà
×ÑØØØÜØ,Ð-Ø:ð ô ð ×ÑØØØÜØ Ø1ð ô ð ×ÑØØÜØØkð ô ð ×ÑØØØØKð	 ô ð ×ÑØØÜØðSð ô 	ð ×ÑÓÐr   Ú__main__r   )&Ú__doc__rõ   r‚   rg   rÙ   r×   Úpathlibr   rÜ   r   r9   r   r"   ÚModuler1   rá   rB   rm   r>   ry   Úboolr“   r¡   rL   r¦   rÅ   rø   rè   rn   rî   rû   Ú__name__r   r#   r3   Ú
saved_pathrz   rÈ   r   r   r   ú<module>r     sÚ  ðñó Û Û Û 	Û Ý ã Û Û Ý ò
=ð B§I¡Ió ñ  °ð  ÀÀtÁó  ð&: "§)¡)ð :°dð :È5ó :ðz 8 §	¡	ð  8¸%ð  8ÈDó  8ðF b§i¡ið À5ð ÈRÏYÉYó ð8!¨%ð !¸¿¹ð !È%ó !ðA=Ø�9‰9ðA=àðA=ð ðA=ð ð	A=ð
 ðA=ð óA=ðH"
˜bŸi™ið "
¸ð "
ÈEð "
Ð^bð "
Ðknó "
ðJ €‡�ƒð L˜#ð  L¨#°©*ð  LÀSð  LÐUYð  LÐbeò  Ló ð LòF+ð\ ˆzÒÙÓ€Dá�—
‘
˜DŸN™N¨D¯O©O¸T¿^¹^ÈTÏZÉZÕXð r   