CoolFace
Apppublic

fred-dev/comfy_ui_ali

sourceHugging Facemitupdated 1y agoView on Hugging Face
0likes
model_patcher.cpython-312.pyc229 linesDownload Raw Back to __pycache__
1�

2���g6���:�dZddlmZddlmZmZddlZddlZddlZddl	Z	ddl3Z4ddlZddlZddl
ZddlZddlZddlZddlZddlZddlmZmZmZddlmZd�Zdd�Zdd	�Zdd5�Zdd�Zd�Zd
�Zd�Z Gd�d�Z!d�Z"Gd�d�Z#Gd�d�Z$Gd�d�Z%y)a�6    This file is part of ComfyUI.7    Copyright (C) 2024 Comfy8 9    This program is free software: you can redistribute it and/or modify10    it under the terms of the GNU General Public License as published by11    the Free Software Foundation, either version 3 of the License, or12    (at your option) any later version.13 14    This program is distributed in the hope that it will be useful,15    but WITHOUT ANY WARRANTY; without even the implied warranty of16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the17    GNU General Public License for more details.18 19    You should have received a copy of the GNU General Public License20    along with this program.  If not, see <https://www.gnu.org/licenses/>.21�)�annotations)�Optional�CallableN)�CallbacksMP�22WrappersMP�PatcherInjection)�UnetWrapperFunctionc��d}|D]E}t|t�rt|�}||z}td�D]}|dzr	|dz	dz}�|dz}��G|dzS)Nl����l q[)�23isinstance�str�ord�range)�data�crc�byte�_s    �^/Users/fredrodrigues/Library/CloudStorage/Dropbox/Code/comfyui_hardware/comfy/model_patcher.py�string_to_seedr&sf��24�C����d�C� ��t�9�D��t����q��A��Q�w��a�x�:�-����	��	�	�����c���|dj�}d|vri|d<n|dj�|d<||dvr	i|d|<n|d|j�|d|<|�|||f}n||f}||d||<||d<|S)N�transformer_options�patches_replace��copy)�
model_options�patch�name�25block_name�number�transformer_index�to�blocks        r�set_model_options_patch_replacer%3s���	�,�	-�	2�	2�	4�B���"� "���� "�#4� 5� :� :� <�����2�'�(�(�&(����d�#�&(�):�&;�D�&A�&F�&F�&H����d�#��$��V�%6�7���V�$��).�B���$���&�+-�M�'�(��rc�F�|jdg�|gz|d<|rd|d<|S)N�sampler_post_cfg_functionT�disable_cfg1_optimization��get)r�post_cfg_functionr(s   r�#set_model_options_post_cfg_functionr,Hs9��1>�1B�1B�C^�`b�1c�gx�fy�1y�M�-�.� �59�
�1�2��rc�F�|jdg�|gz|d<|rd|d<|S)N�sampler_pre_cfg_functionTr(r))r�pre_cfg_functionr(s   r�"set_model_options_pre_cfg_functionr0Ns9��0=�0A�0A�B\�^`�0a�eu�dv�0v�M�,�-� �59�
�1�2��rc�@�tjj|�S�N)�comfy�patcher_extension�copy_nested_dicts)�orig_model_optionss r�create_model_options_cloner7Ts���"�"�4�4�5G�H�Hrc�X�i}|D]"}i||<||D]}|||dd|||<��$|Sr2�)�orig_hook_patches�new_hook_patches�hook_ref�ks    r�create_hook_patches_cloner>WsS����%��%'���"�"�8�,�A�,=�h�,G��,J�1�,M��X�&�q�)�-�&��rc��t|d�r|j|_|`t|d�rg|_t|d�rg|_yy)N�prev_comfy_cast_weights�weight_function�
bias_function)�hasattrr@�comfy_cast_weightsrArB)�ms r�wipe_lowvram_weightrF_sJ���q�+�,� �8�8���
�%��q�#�$�����q�/�"����#rc��|�yd}t|d�r3|jD]$}t|d�s�||j|��z
}�&t|d�r3|jD]$}t|d�s�||j|��z
}�&|S)NrrA�move_to��devicerB)rCrArHrB)rErJ�memory�fs    r�move_weight_functionsrMjs���
�~��
�F��q�#�$��"�"�A��q�)�$��!�)�)�6�)�2�2��#��q�/�"����A��q�)�$��!�)�)�6�)�2�2��!��Mrc��eZdZd�Zd�Zy)�LowVramPatchc� �||_||_yr2)�key�patches)�selfrQrRs   r�__init__zLowVramPatch.__init__{s�������rc�D�|j}|tjtjtjfvr�tj}t26jjt27jj|j|j|j|�|j|��|jt|j���St28jj|j|j||j|��S)N��intermediate_dtype��seed)�dtype�torch�float32�float16�bfloat16r3�float�stochastic_rounding�lora�calculate_weightrRrQr#r)rS�weightrWs   r�__call__zLowVramPatch.__call__~s��#�\�\���e�m�m�U�]�]�E�N�N�%S�S�!&�����;�;�2�2�5�:�:�3N�3N�t�|�|�\`�\d�\d�Oe�gm�gp�gp�rD�hE�GK�GO�GO�dv�3N�4w�y�yE�yE�LZ�[_�[c�[c�Ld�2�e�
e��z�z�*�*�4�<�<����+A�6�4�8�8�hz�*�{�{rN)�__name__�29__module__�__qualname__rTrdr9rrrOrOzs
���|rrOc���d}d}|jdd�}t|�dkr!tjj	||�}n�tjj	||d�}	t|dj
|d��}	t|dj
|d��}t||d�}|� tjj	||�}|||fS#t$rY�`wxYw#t$rY�PwxYw)N�.r�rzset_{}z30convert_{})�rsplit�lenr3�utils�get_attr�getattr�format�AttributeError)�modelrQ�set_func�convert_func�op_keysrc�ops       r�get_key_weightrw�s����H��L��j�j��a� �G�31�7�|�a�����%�%�e�S�1��
�[�[�
!�
!�%����
4��	��r�8�?�?�7�1�:�#>�?�H�	�"�2�|�':�':�7�1�:�'F�G�L���W�Q�Z�(���#��[�[�)�)�%��5�F��8�\�)�)���	��	��32�	��	�s$�*C�	C,�	C)�(C)�,	C8�7C8c�"�eZdZddd�Zd�Zd�Zy)�AutoPatcherEjectorc�<�||_d|_d|_||_y�NF)rr�was_injected�prev_skip_injection�skip_and_inject_on_exit_only)rSrrr~s   rrTzAutoPatcherEjector.__init__�s!����33�!���#(�� �,H��)rc���d|_|jj|_|jrd|j_|jj34r"|jj
�d|_yy)NFT)r|rr�skip_injectionr}r~�is_injected�eject_model�rSs r�	__enter__zAutoPatcherEjector.__enter__�s[��!���#'�:�:�#<�#<�� ��,�,�(,�D�J�J�%��:�:�!�!��J�J�"�"�$� $�D��"rc�4�|jr5|j|j_|jj	�|j35r0|jjs|jj	�|j|j_yr2)r~r}rrr��inject_modelr|)rS�argss  r�__exit__zAutoPatcherEjector.__exit__�sd���,�,�(,�(@�(@�D�J�J�%��J�J�#�#�%����T�Z�Z�%>�%>��J�J�#�#�%�$(�$<�$<��36�37�!rN�F)rr�'ModelPatcher')rerfrgrTr�r�r9rrryry�s��I�%�=rryc�.�eZdZddd�Zdd�Zd	d�Zd	d�Zy)38�
MemoryCounterc� �||_||_yr2��value�minimum)rS�initialr�s   rrTzMemoryCounter.__init__�s����39���rc��|j�|j�z}|j|�r|j|�yy)NTF)�nelement�element_size�40is_useable�	decrement)rSrc�weight_sizes   r�usezMemoryCounter.use�s:���o�o�'�&�*=�*=�*?�?���?�?�;�'��N�N�;�'��rc�:�|j|z41|jkDSr2r��rS�useds  rr�zMemoryCounter.is_useable�s���z�z�D� �4�<�<�/�/rc�.�|xj|zc_yr2)r�r�s  rr�zMemoryCounter.decrement�s���42�43�d��44rN�r)r��int)rc�torch.Tensor)r�r�)rerfrgrTr�r�r�r9rrr�r��s���45�0�rr�c��eZdZdXd�Zd�Zd�Zd�Zd�Zd�ZdYd�Z	d�Z46dZd	�ZdZd47�ZdZd�Z
d[d�Zd
�Zd�Zd\d�Zd�Zd�Zd\d�Zd\d�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd]d�Z d �Z!d!�Z"d^d"�Z#d\d#�Z$d\d$�Z%d_d%�Z&d&�Z'd`d'�Z(dad(�Z)dbd)�Z*dcd*�Z+dXd+�Z,ddd,�Z-d-�Z.e/j`fd.�Z1d/�Z2ded0�Z3dfd1�Z4dgd2�Z5dgd3�Z6dhd4�Z7did5�Z8djd6�Z9dkd7�Z:dkd8�Z;dld9�Z<dmd:�Z=dmd;�Z>dmd<�Z?dnd=�Z@dmd>�ZAdmd?�ZBdod@�ZCdmdA�ZDdmdB�ZEdC�ZFdD�ZGdZdE�ZHdF�ZIdG�ZJdH�ZKdI�ZLdJ�ZMdpdK�ZNdqdL�ZO		dr	dsdM�ZPd^dtdN�ZQdudO�ZRd_dvdP�ZSdudQ�ZTdwdR�ZUdS�ZVdxdT�ZWd\dydU�ZXdV�ZYdW�ZZy)z�ModelPatcherc�p�||_||_t|jd�s'tjd�||j_n'|jj48�||j_i|_i|_i|_i|_	i|_49dii|_|j�||_
||_||_d|_t#j$�|_d|_i|_i|_t/j0�|_t5j6�|_d|_d|_i|_i|_ d|_!i|_"i|_#d|_$d|_%d|_&tNjPjRjT|_+t|jd�sd|j_,t|jd�sd|j_-t|jd�sd|j_.t|jd	�sd|j_/yy)50NrJz&Model doesn't have a device attribute.rF�model_loaded_weight_memoryr�lowvram_patch_counter�
model_lowvram�current_weight_patches_uuid)0�sizerrrC�logging�debugrJrR�backup�object_patches�object_patches_backup�weight_wrapper_patchesr�51model_size�load_device�offload_device�weight_inplace_update�force_cast_weights�uuid�uuid4�patches_uuid�parent�attachments�additional_modelsr�init_callbacks�	callbacksr�
init_wrappers�wrappersr�r��52injections�hook_patches�hook_patches_backup�hook_backup�cached_hook_patches�
current_hooks�forced_hooks�is_clipr3�hooks�EnumHookMode�MaxSpeed�	hook_moder�r�r�r�)rSrrr�r�r�r�s      rrTzModelPatcher.__init__�s�����	���53��t�z�z�8�,��M�M�B�C� .�D�J�J��
�Z�Z�
�
�
&� .�D�J�J�������� ���%'��"�&(��#�3�B�7�������&���,���%:��"�"'��� �J�J�L������&(���@B���?J�?Y�?Y�?[���>H�>V�>V�>X��
� ���#���=?���8:���?C�� �IK���Y[�� �>B���=A���������1�1�:�:����t�z�z�#?�@�45�D�J�J�1��t�z�z�#:�;�/0�D�J�J�,��t�z�z�?�3�',�D�J�J�$��t�z�z�#@�A�59�D�J�J�2�Brc��|jdkDr|jStjj|j�|_|jS�Nr)r�r3�model_management�module_sizerrr�s rr�zModelPatcher.model_size�s=���9�9�q�=��9�9���*�*�6�6�t�z�z�B��	��y�y�rc�.�|jjSr2)rrr�r�s r�loaded_sizezModelPatcher.loaded_sizes���z�z�4�4�4rc�.�|jjSr2)rrr�r�s rr�z"ModelPatcher.lowvram_patch_counters���z�z�/�/�/rc�8	�|j|j|j|j|j|j54��}i|_|jD]!}|j|dd|j|<�#|j|_|jj�|_|jj�|_55tj|j�|_|j|_
|j|_||_|j |_i|_|j"D]b}t%|j"|d�r+|j"|j'�|j"|<�G|j"||j"|<�d|j(j+�D]0\}}|D�cgc]}|j-���c}|j(|<�2|j.j+�D]L\}}i|j.|<|j+�D]%\}}|j�|j.||<�'�N|j0j+�D]L\}}i|j0|<|j+�D]%\}}|j�|j0||<�'�N|j2|_|j4|_|j6j+�D]"\}}	|	j�|j6|<�$t9|j:�|_|j<rt9|j<�n|j<|_|j>D]G}56i|j>|57<|j>|58D]$}|j>|59||j>|60|<�&�I|j@|_ |jBr|jBj-�n|jB|_!|jDr|jDj-�n|jD|_"|jF|_#|jH|_$|jKtLjN�D]}|||��
|Scc}w)N)r��on_model_patcher_clone)(�	__class__rrr�r�r�r�rRr�r�rr��deepcopyrr�r�r�r�r�rCr�r��items�cloner�r�r�r�r�r>r�r�r�r�r�r�r�r��get_all_callbacksr�ON_CLONE)rS�nr=�c�x�k1�c1�w�w1�i�group�callbacks            rr�zModelPatcher.clones����N�N�4�:�:�t�'7�'7��9L�9L�d�i�i�os�pJ�pJ�N�
K����	����A��<�<��?�1�-�A�I�I�a�L���*�*����.�.�3�3�5���#'�#>�#>�#C�#C�#E�� ��-�-��(:�(:�;����;�;���"&�"<�"<������#�6�6�����
��!�!�A��t�'�'��*�,D�E�#'�#3�#3�A�#6�#M�#M�#O��
�
�a� �#'�#3�#3�A�#6��
�
�a� �	"��*�*�0�0�2�D�A�q�9:�%;��A�a�g�g�i��%;�A����"�3��N�N�(�(�*�D�A�q��A�K�K��N��'�'�)���B�%'�W�W�Y����A��r�"�$�+�61�M�M�'�'�)�D�A�q��A�J�J�q�M��'�'�)���B�$&�G�G�I��62�63�1�
�b�!�$�*�64�(�(��
��.�.����O�O�)�)�+�D�A�q��f�f�h�A�L�L��O�,�3�4�3D�3D�E���W[�Wo�Wo� 9�$�:R�:R� S�uy�vN�vN����-�-�E�+-�A�!�!�%�(��-�-�e�4��26�2J�2J�5�2Q�RS�2T��%�%�e�,�Q�/�5�.��(�(��
�8<�8J�8J�$�,�,�2�2�4�PT�Pb�Pb���6:�6G�6G��*�*�0�0�2�T�M^�M^����L�L��	��n�n����.�.�{�/C�/C�D�H��T�1��E����?&<s�	Rc�N�t|d�r|j|juryy)NrrTF)rCrr)rS�others  r�is_clonezModelPatcher.is_cloneEs!���5�'�"�t�z�z�U�[�[�'@��rc�h�|j|�sy|j|jk7ry|j|jk7ry|jj	�|jj	�k7ry|j65j	�|j66j	�k7ry|jj	�|jj	�k7ry|jD]5}t|j|�t|j|�k7s�5y|jD]5}t|j|�t|j|�k7s�5y|jj	�|jj	�k7ryt|j�dk(rt|j�dk(ry|j|jk(rBt|j�t|j�k7rtjd�yyy)NFrTzOWARNING: something went wrong, same patch uuid but different length of patches.)r�r�r�r��keysr�r�r�rlr�r�rRr�r��warning)rSr�rQs   r�clone_has_same_weightsz#ModelPatcher.clone_has_same_weightsJs����}�}�U�#������!4�!4�4������ 2� 2�2�����!�!�#�u�'9�'9�'>�'>�'@�@����� � �"�e�&7�&7�&<�&<�&>�>���!�!�&�&�(�E�,C�,C�,H�,H�,J�J���>�>�C��4�>�>�#�&�'�3�u���s�/C�+D�D��"��=�=�C��4�=�=��%�&�#�e�n�n�S�.A�*B�B��!��?�?���!�U�%5�%5�%:�%:�%<�<���t�|�|���!�c�%�-�-�&8�A�&=������ 2� 2�2��4�<�<� �C��
�
�$6�6���� q�r��	3rc�:�|jj|��S)N)�input_shape)rr�memory_required)rSr�s  rr�zModelPatcher.memory_requiredjs���z�z�)�)�k�)�B�Brc����ttj��j�dk(r�fd�|jd<n�|jd<|rd|jd<yy)N�c�*���|d|d|d�S)N�cond�uncond�67cond_scaler9)r��sampler_cfg_functions �r�<lambda>z=ModelPatcher.set_model_sampler_cfg_function.<locals>.<lambda>os0���FZ�[_�`f�[g�im�nv�iw�y}�K�zL�GMrr�Tr()rl�inspect�	signature�68parametersr)rSr�r(s ` r�set_model_sampler_cfg_functionz+ModelPatcher.set_model_sampler_cfg_functionms`����w� � �!5�6�A�A�B�a�G�:M�D���5�6�9M�D���5�6�$�>B�D���:�;�%rc�<�t|j||�|_yr2)r,r)rSr+r(s   r�#set_model_sampler_post_cfg_functionz0ModelPatcher.set_model_sampler_post_cfg_functionus"��@��AS�AS�Uf�iB�C��rc�<�t|j||�|_yr2)r0r)rSr/r(s   r�"set_model_sampler_pre_cfg_functionz/ModelPatcher.set_model_sampler_pre_cfg_functionxs��?��@R�@R�Td�f�A��rc�"�||jd<y)N�model_function_wrapper�r)rS�unet_wrapper_functions  r�set_model_unet_function_wrapperz,ModelPatcher.set_model_unet_function_wrapper{s��7L����3�4rc�"�||jd<y)N�denoise_mask_functionr�)rSrs  r�set_model_denoise_mask_functionz,ModelPatcher.set_model_denoise_mask_function~s��6K����2�3rc�r�|jd}d|vri|d<|dj|g�|gz|d|<y)NrrR)rr*)rSrrr#s    r�set_model_patchzModelPatcher.set_model_patch�sJ��
�
�
� 5�
6���B���B�y�M� ��m�/�/��b�9�U�G�C��9�
�d�rNc�D�t|j|||||��|_y)N)r")r%r)rSrrr r!r"s      r�set_model_patch_replacez$ModelPatcher.set_model_patch_replace�s+��<�T�=O�=O�QV�X\�^h�jp�EV�W��rc�(�|j|d�y)N�attn1_patch�r�rSrs  r�set_model_attn1_patchz"ModelPatcher.set_model_attn1_patch�������U�M�2rc�(�|j|d�y)N�attn2_patchr69rs  r�set_model_attn2_patchz"ModelPatcher.set_model_attn2_patch�r
rc�.�|j|d|||�y)N�attn1�r�rSrr r!r"s     r�set_model_attn1_replacez$ModelPatcher.set_model_attn1_replace�����$�$�U�G�Z��IZ�[rc�.�|j|d|||�y)N�attn2rrs     r�set_model_attn2_replacez$ModelPatcher.set_model_attn2_replace�rrc�(�|j|d�y)N�attn1_output_patchr70rs  r�set_model_attn1_output_patchz)ModelPatcher.set_model_attn1_output_patch�������U�$8�9rc�(�|j|d�y)N�attn2_output_patchr71rs  r�set_model_attn2_output_patchz)ModelPatcher.set_model_attn2_output_patch�rrc�(�|j|d�y)N�input_block_patchr72rs  r�set_model_input_block_patchz(ModelPatcher.set_model_input_block_patch�s�����U�$7�8rc�(�|j|d�y)N�input_block_patch_after_skipr73rs  r�&set_model_input_block_patch_after_skipz3ModelPatcher.set_model_input_block_patch_after_skip�������U�$B�Crc�(�|j|d�y)N�output_block_patchr74rs  r�set_model_output_block_patchz)ModelPatcher.set_model_output_block_patch�rrc�(�|j|d�y)N�	emb_patchr75rs  r�set_model_emb_patchz ModelPatcher.set_model_emb_patch�s�����U�K�0rc�(�|j|d�y)N�forward_timestep_embed_patchr76rs  r�&set_model_forward_timestep_embed_patchz3ModelPatcher.set_model_forward_timestep_embed_patch�r'rc�"�||j|<yr2)r�)rSr�objs   r�add_object_patchzModelPatcher.add_object_patch�s��$'����D�!rc�l�|jd|�|�d|_tj�|_y)N�manual_cast_dtypeT)r3r�r�r�r�)rSrZs  r�set_model_compute_dtypez$ModelPatcher.set_model_compute_dtype�s/�����1�5�9���&*�D�#� �J�J�L��rc��|jj|g�|gz|j|<tj�|_yr2)r�r*r�r�r�)rSr�functions   r�add_weight_wrapperzModelPatcher.add_weight_wrapper�s=��,0�,G�,G�,K�,K�D�RT�,U�Ya�Xb�,b��#�#�D�)� �J�J�L��rc���||jvr|j|S||jvr|j|Stjj	|j77|�S)a�Retrieves a nested attribute from an object using dot notation considering78        object patches.79 80        Args:81            name (str): The attribute path using dot notation (e.g. "model.layer.weight")82 83        Returns:84            The value of the requested attribute85 86        Example:87            patcher = ModelPatcher()88            weight = patcher.get_model_object("layer1.conv.weight")89        )r�r�r3rmrnrr)rSrs  r�get_model_objectzModelPatcher.get_model_object�s]���4�&�&�&��&�&�t�,�,��t�1�1�1��1�1�$�7�7��{�{�+�+�D�J�J��=�=rc���|jd}d|vrQ|d}|D]G}||}tt|��D])}t||d�s�||j	|�||<�+�Id|vr?|d}|D]5}||}|D])}t||d�s�||j	|�||<�+�7d|jvr;|jd}t|d�r|j	|�|jd<yyy)NrrRr#rr�)rrrlrCr#)	rSrJr#rRr�90patch_listr�r=�	wrap_funcs	         r�model_patches_tozModelPatcher.model_patches_to�s��
�
�
� 5�
6����?���m�G���$�T�]�91��s�:��/�A��z�!�}�d�3�(2�1�
�(8�(8��(@�92�1�
�0� �93��"��*�+�G���$�T�]�94�#�A��z�!�}�d�3�(2�1�
�(8�(8��(@�95�1�
�$� �96$�t�'9�'9�9��*�*�+C�D�I��y�$�'�?H�|�|�F�?S��"�"�#;�<�(�:rc�d�t|jd�r|jj�Sy)N�	get_dtype)rCrrrAr�s r�model_dtypezModelPatcher.model_dtype�s(���4�:�:�{�+��:�:�'�'�)�)�,rc	��|j�5t�}|jj�}|D]�}d}d}t	|t97�r|}	n|d}|d}	t
|�dkDr|d}|	|vs�<|j|�|jj|	g�}98|99j||||||f�|100|j|	<��tj�|_
t|�cddd�S#1swYyxYw�Nrrrj)�use_ejected�setrr�101state_dictr
rrl�addrRr*�appendr�r�r��list)rSrR�strength_patch�strength_model�p�model_sdr=�offsetr8rQ�current_patchess           r�add_patcheszModelPatcher.add_patches�s���
�
�
�
���A��z�z�,�,�.�H��������a��%��C��q�T�F��A�$�C��1�v��z�#$�Q�4���(�?��E�E�!�H�&*�l�l�&6�&6�s�B�&?�O�#�*�*�N�G�A�J��X^�`h�+i�j�(7�D�L�L��%��"!%�102�103��D����7�+ �
�
�s�A"C8�4A:C8�8Dc��|j�}i}|D]�}|�|j|�s�|jj|d�}|jj|d�}t|j|�\}}}	|�|j}|�|d}|	�d�}	||jvr||	fg|j|z||<��||	fg||<��|S)Nrc��|Sr2r9)�a�kwargss  rr�z.ModelPatcher.get_key_patches.<locals>.<lambda>s��1r)	�model_state_dict�104startswithr�r*r�rwrrrcrR)105rS�
filter_prefixrNrMr=�bk�hbkrcrsrts106          r�get_key_patcheszModelPatcher.get_key_patches�s����(�(�*�����A��(��|�|�M�2��������D�)�B��"�"�&�&�q�$�/�C�-;�D�J�J��-J�*�F�H�l��~��������Q����#�4���D�L�L� ���.�/�$�,�,�q�/�A��!����.�/��!��#�$�rc��|j�5|jj�}t|j	��}|�*|D]%}|j|�r�|j
|��'|cddd�S#1swYyxYwr2)rErrrGrJr�rW�pop)rSrX�sdr�r=s     rrVzModelPatcher.model_state_dictsg��
�
�
�
����&�&�(�B�����	�?�D��(��A��<�<�
�6����q�	��� �
�
�s�AA<�A<�<Bc��||jvryt|j|�\}}}|jxs|}||jvrGtjdddg�|j|j|��|�|j|<|�2tjj||tjd��}n!|jtjd��}|�107||d��}tjj|j|||�}|��tj j#||j$t'|���}|r,tj(j+|j||�ytj(j-|j||�y|||t'|��	�y)108N�	Dimensionrc�inplace_update�rJrTr��inplacerX�rarY)rRrwrrr�r��collections�109namedtupler#r�r3r��cast_to_devicer[r\rarbr_r`rZrrm�
copy_to_param�set_attr_param)	rSrQ�	device_torarcrsrt�temp_weight�110out_weights	         r�patch_weight_to_devicez#ModelPatcher.patch_weight_to_device s����d�l�l�"��)7��111�112�C�)H�&���,��3�3�E�~���d�k�k�!�`�{�5�5�k�H�N^�C_�`�ag�aj�aj�rv�sF�sF�M[�aj�b\�^l� m�D�K�K���� ��0�0�?�?��	�SX�S`�S`�gk�?�l�K� �)�)�E�M�M��)�=�K��#�&�{�D�A�K��Z�Z�0�0����c�1B�K�QT�U�113������8�8��V�\�\�Xf�gj�Xk�8�l�J�����)�)�$�*�*�c�:�F����*�*�4�:�:�s�J�G��Z��^�TW�EX�Yrc��g}|jj�D]�\}}g}d}|jd��D]\}}|j|��|jd��D]
\}}||vs�d}n|r�Zt	|d�st|�dkDs�u|jtjj|�|||f���|S)NF)�recurseTrDr)	rr�
named_modules�named_parametersrIrCrlr3r�r�)rS�loadingr�rE�params�skipr�params        r�114_load_listzModelPatcher._load_list;s������J�J�,�,�.�D�A�q��F��D� �1�1�%�1�@���e��
�
�d�#� A� �1�1�$�1�?���e��v�%��D�� @��W�Q�(<�=��V��q������ 6� 6� B� B�1� E�q�!�V�T�U�/��rc	���|j�5|j�d}d}d}|j�}g}	|jd��|D�]�}115|116d}|117d}|118d}
|119d}d}dj	|�}d	j	|�}|s(t|d120�r||z|k\rd}|dz
}t|d�r�f|j}|r�t|d121�rg|_g|_||jvr5|r|j|�n!t||j�g|_|dz
}||jvr5|r|j|�n!t||j�g|_|dz
}d}n;t|d122�rt|�|s||z|kr||z
}|	j||||
f�|r$t|d123�r|j|_d|_||j vr(|jj#|j |�||j vr(|jj#|j |�|t%||�z
}���|	jd��|	D]�}124|125d}|126d}|127d}
t|d�r|j&dk(r�.|
D]%}|jd
j	||�|���'t)j*dj	||��d|_��|	D]}128|129dj-|��|dkDr>t)j.dj	|dz|dz|��d|j0_njt)j.dj	|dz|dz|��d|j0_|r+|j0j-|�|j5�}|j0xj6|z
c_||j0_||j0_|j<|j0_|jAtBjD�D]}||||||��|jG|jHd��ddd�y#1swYyxYw)NrT)�reverserrjr�F�	{}.weight�{}.biasrDr@�comfy_patched_weights�{}.{})rkz&lowvram: loaded module regularly {} {}zloaded partially {} {} {}izloaded completely {} {} {}��force_apply)%rE�
unpatch_hooksrw�sortrprCr�rArBrRrnrOrFrIrDr@r��extendrMr|r�r�r#�inforrr�r�r�rJr�r�r�r�r�ON_LOAD�apply_hooksr�)rSrk�lowvram_model_memory�force_patch_weights�	full_load�mem_counter�
patch_counter�lowvram_counterrs�load_completelyr�r�rErt�130module_mem�lowvram_weight�131weight_key�bias_key�cast_weightrvr�s                     r�loadzModelPatcher.loadJs[��
�
�
�
���� ��K��M��O��o�o�'�G� �O��L�L��L�&����a�D���a�D���1����q�T�132�!&��(�/�/��2�133�$�+�+�A�.�� �W�Q�0D�%E�"�Z�/�3G�G�)-��'�1�,��"�1�&?�@�$�"�5�5��!��q�"6�7�,.��)�*,���!�T�\�\�1�.� �7�7�134�C�1=�j�$�,�,�1W�0X�A�-�)�Q�.�M��4�<�<�/�.� �7�7��A�/;�H�d�l�l�/S�.T�A�O�)�Q�.�M�"&�K��q�"6�7�+�A�.� �K�*�$<�?S�$S�#�z�1��'�.�.�135�A�q�&�/I�J��7�1�.B�#C�01�0D�0D�A�-�+/�A�(���!<�!<�<��%�%�,�,�T�-H�-H��-T�U��t�:�:�:��O�O�*�*�4�+F�+F�x�+P�Q��4�Q�	�B�B��q�t
� � �� �.�$���a�D���a�D���1����1�5�6��.�.�$�6� �#�E��/�/����q�%�0H�T]�/�^�$��
�
�F�M�M�a�QR�S�T�*.��'�%�%���!����	�"�%���"����8�?�?�@T�Xc�@d�fq�vA�gB�DQ�R�S�+/��136�137�(����9�@�@�AU�Yd�Ae�gr�wB�hC�EN�O�P�+0��138�139�(���J�J�M�M�)�,�"&�/�/�"3�K��J�J�,�,�
�=�,� )�D�J�J��4?�D�J�J�1�59�5F�5F�D�J�J�2� �2�2�;�3F�3F�G����y�*>�@S�U^�_�H�
���T�.�.�D��A�O �
�
�s�P>Q�Q!c��|j�5|jD]X}tjj	|j140||j|�}||jvs�J||j|<�Z|dk(rd}nd}|r|j||||��ddd�|j�|j141S#1swY�%xYw)NrTF�r�r�r�)	rEr�r3rm�set_attrrrr�r�r�)rSrkr��load_weightsr�r=�oldr�s        r�patch_modelzModelPatcher.patch_model�s���
�
�
�
��(�(���k�k�*�*�4�:�:�q�$�:M�:M�a�:P�Q���D�6�6�6�47�D�.�.�q�1�)�142$�q�(� �	�!�	���	�	�)�:N�dw�DM�	�N� �	
�����z�z�� �
�s�AB>�(2B>�>Cc��|j�|�r�|j�|jjrX|jj	�D]}t||�t
|��d|j_d|j_t|jj��}|D]�}|j|}|jr6tjj|j||j��Ttjj!|j||j���d|j_|jj%�|�,|jj'|�||j_d|j_|jj	�D]}t-|d�s�|`�t|j0j��}|D]:}tjj3|j||j0|��<|j0j%�y)NFrr|)r�r�rrr��modulesrMrFr�rJr�r�rar3rmrircrjr��clearr#rJr�rCr|r�r�)rSrk�unpatch_weightsrEr�r=rYs       r�
unpatch_modelzModelPatcher.unpatch_model�s����������� ��z�z�'�'����+�+�-�A�)�!�Y�7�'��*�.�,1��143�144�(�34��145�146�0�����(�(�*�+�D����[�[��^���$�$��K�K�-�-�d�j�j�!�R�Y�Y�G��K�K�.�.�t�z�z�1�b�i�i�H��6:�D�J�J�2��K�K�����$��147�148�
�
�i�(�$-��149�150�!�45�D�J�J�1��Z�Z�'�'�)���1�5�6��/�*��D�.�.�3�3�5�6���A��K�K� � ����Q��0J�0J�1�0M�N��	
�"�"�(�(�*rc���|j�5d}d}|j�}|j�|D�]>}||kr�n6|d}|d}|d}	|d}151t|	d�}t|	d�s�9|	jdk(s�Id}|152D]�}
dj||
�}|jj|d�}|��4|sd	}n�|jr6tjj|j||j�n5tjj|j||j�|jj|���d153j|�}dj|�}|s��A|j }|	j#|�|t%|	|�z
}|r�||j&vr4|	j(j+t-||j&��|dz
}||j&vr4|	j.j+t-||j&��|dz
}d}|r|	j0|	_d|	_d	|	_||z
}t5j6dj|����Ad|j_|jxj:|z
c_|jxj<|zc_|cddd�S#1swYyxYw)
Nrrrjr�rDr|Tr}Frzr{zfreed {})rErwr�rCr|rpr�r*rar3rmrirrrcrjr]r�r#rMrRrArIrOrBrDr@r�r�r�r�r�)rSrk�memory_to_free�memory_freedr��unload_list�unloadr�r�rErt�lowvram_possible�move_weightrvrQrYr�r�r�s                   r�partially_unloadzModelPatcher.partially_unload�st��
�
�
�
��L��M��/�/�+�K�����%��!�L�0��#�A�Y�154��1�I���1�I������#*�1�.B�#C� ��1�5�6�1�;R�;R�VZ�;Z�"&�K�!'��%�n�n�Q��6��!�[�[�_�_�S�$�7���>�#3�.3�� %�!�0�0� %��� 9� 9�$�*�*�c�2�9�9� U� %��� :� :�4�:�:�s�B�I�I� V� �K�K�O�O�C�0�"(�"-�!3�!3�A�!6�J�(�/�/��2�H�"�&*�&=�&=�����Y��"�&;�A�y�&I�I�155�+�)�T�\�\�9� !� 1� 1� 8� 8��j�RV�R^�R^�9_� `� -�� 2�
�'�4�<�<�7� !��� 6� 6�|�H�d�l�l�7[� \� -�� 2�
�*.�K�&�89�8L�8L�A�5�37�A�0�27��/�$�156�2���
�
�j�&7�&7��&:�;�[&�^(,�D�J�J�$��J�J�,�,�
�=�,��J�J�1�1�\�A�1��o �
�
�s&�AK�1K�7K�9B>K�9EK�Kc�~�|jd��5|jjduxr'|jj|jk7xs|}|jj}|j|j|��|r|||jjz157z
}|jd��d}|jjdk(r@|jjdkDr'|j|jd��	ddd�y|jj|z|j�kDrd}|jj}	|j|||z||��|jj|z158cddd�S#t$r}|j�|�d}~wwxYw#1swYyxYw)	NT�r~�r�F)r�rr~r�)rErrr�r�r�r�r�r�r�r�r�r�r��	Exception�detach)	rSrk�extra_memoryr�r�r�r��current_used�es	         r�partially_loadzModelPatcher.partially_load&s���
�
�
�4�
�
@�"�j�j�D�D�D�P�j�VZ�V`�V`�V|�V|�AE�AR�AR�WR�Wi�Vi�O��:�:�8�8�D����t�2�2�O��T�����159�160�(M�(M�!M�N�����%��0��I��z�z�'�'�5�0�T�Z�Z�5Z�5Z�]^�5^�� � ��!2�!2�� �E��A�
@��z�z�4�4�|�C�d�o�o�FW�W� �	��:�:�@�@�L�
��	�	�)�,��:U�k~�KT�	�U�161�:�:�8�8�<�G�-A�
@��$�
����
����
��%A�
@�s7�C7F3�AF3�F�.F3�	F0�F+�+F0�0F3�3F<c��|j�|j|j�|r|j|j|��|j	t162j�D]}|||��
|jS)Nr�)r�r?r�r�r�r�	ON_DETACHrr)rS�unpatch_allr�s   rr�zModelPatcher.detach?sn���������d�1�1�2�����t�2�2�K��P��.�.�{�/D�/D�E�H��T�;�'�F��z�z�rc�.�|jjSr2)rrrJr�s r�current_loaded_devicez"ModelPatcher.current_loaded_deviceHs���z�z� � � rc�r�tjd�tjj	||||��S)NziThe ModelPatcher.calculate_weight function is deprecated, please use: comfy.lora.calculate_weight insteadrV)r�r�r3rarb)rSrRrcrQrWs     rrbzModelPatcher.calculate_weightKs4�����D�	E��z�z�*�*�7�F�C�Tf�*�g�grc���|j�t|jd�rd|j_|j	t163j�D]164}||��y�N�current_patcher)�clean_hooksrCrrr�r�r�165ON_CLEANUP�rSr�s  r�cleanupzModelPatcher.cleanupOsL�������4�:�:�0�1�)-�D�J�J�&��.�.�{�/E�/E�F�H��T�N�Grc�*�|j|d|�yr2)�add_callback_with_key)rS�	call_typer�s   r�add_callbackzModelPatcher.add_callbackVs���"�"�9�d�H�=rc�~�|jj|i�j|g�}|j|�yr2)r��166setdefaultrI)rSr�rQr�r�s     rr�z"ModelPatcher.add_callback_with_keyYs1���N�N�%�%�i��4�?�?��R�H��	����rc�h�|jj|i�}||vr|j|�yyr2)r�r*r])rSr�rQr�s    r�remove_callbacks_with_keyz&ModelPatcher.remove_callbacks_with_key]s/���N�N���y�"�-���!�8�
�E�E�#�J�rc�Z�|jj|i�j|g�Sr2)r�r*)rSr�rQs   r�
get_callbackszModelPatcher.get_callbacksbs&���~�~�!�!�)�R�0�4�4�S�"�=�=rc��g}|jj|i�j�D]}|j|��|Sr2)r�r*�valuesr�)rSr��c_listr�s    rr�zModelPatcher.get_all_callbackses<�������#�#�I�r�2�9�9�;�A��M�M�!��<��
rc�*�|j|d|�yr2)�add_wrapper_with_key)rS�wrapper_type�wrappers   r�add_wrapperzModelPatcher.add_wrapperks���!�!�,��g�>rc�~�|jj|i�j|g�}|j|�yr2)r�r�rI)rSr�rQr�r�s     rr�z!ModelPatcher.add_wrapper_with_keyns1���M�M�$�$�\�2�6�A�A�#�r�J��	����rc�h�|jj|i�}||vr|j|�yyr2)r�r*r])rSr�rQr�s    r�remove_wrappers_with_keyz%ModelPatcher.remove_wrappers_with_keyrs/���M�M���l�B�/���!�8�
�E�E�#�J�rc�Z�|jj|i�j|g�Sr2)r�r*)rSr�rQs   r�get_wrapperszModelPatcher.get_wrappersws&���}�}� � ��r�2�6�6�s�B�?�?rc��g}|jj|i�j�D]}|j|��|Sr2)r�r*r�r�)rSr��w_listr�s    r�get_all_wrapperszModelPatcher.get_all_wrapperszs<�������"�"�<��4�;�;�=�A��M�M�!��>��
rc�"�||j|<yr2)r�)rSrQ�167attachments   r�set_attachmentszModelPatcher.set_attachments�s�� *�����rc�X�||jvr|jj|�yyr2)r�r]�rSrQs  r�remove_attachmentszModelPatcher.remove_attachments�s)���$�"�"�"���� � ��%�#rc�:�|jj|d�Sr2)r�r*r�s  r�get_attachmentzModelPatcher.get_attachment�s�����#�#�C��.�.rc�"�||j|<yr2)r�)rSrQr�s   r�set_injectionszModelPatcher.set_injections�s��)�����rc�X�||jvr|jj|�yyr2)r�r]r�s  r�remove_injectionszModelPatcher.remove_injections�s%���$�/�/�!��O�O����$�"rc�:�|jj|d�Sr2)r�r*r�s  r�get_injectionszModelPatcher.get_injections�s�����"�"�3��-�-rc�"�||j|<yr2)r�)rSrQ�modelss   r�set_additional_modelsz"ModelPatcher.set_additional_models�s��&,����s�#rc�X�||jvr|jj|�yyr2)r�r]r�s  r�remove_additional_modelsz%ModelPatcher.remove_additional_models�s)���$�(�(�(��"�"�&�&�s�+�)rc�:�|jj|g�Sr2)r�r*r�s  r�get_additional_models_with_keyz+ModelPatcher.get_additional_models_with_key�s���%�%�)�)�#�r�2�2rc�j�g}|jj�D]}|j|��|Sr2)r�r�r�)rS�168all_modelsr�s   r�get_additional_modelsz"ModelPatcher.get_additional_models�s4���169��,�,�3�3�5�F����f�%�6��rc�^��d�fd��|j�}t|�}�||��}|S)Nc����g}|D]@}|j�}|D])}||vs�|j|�|j|��+�Bt|�dk(r|S|�||�zS)z>Make sure circular references do not cause infinite recursion.r)r�rIrHrl)�prev_models�	cache_set�next_modelsrr�170candidatesr��_evaluate_sub_additional_modelss      �rr�zRModelPatcher.get_nested_additional_models.<locals>._evaluate_sub_additional_models�st����K�$��"�8�8�:�171�#�A��	�)�#�*�*�1�-�!�
�
�a�(�$�%��;��1�$�"�"��!@��i�!X�X�Xr)r�r�)r�zlist[ModelPatcher]r�zset[ModelPatcher])r�rF)rSr��172models_set�real_all_modelsr�s    @r�get_nested_additional_modelsz)ModelPatcher.get_nested_additional_models�s5���	Y��/�/�1�173���_�174�9�j�\f�g���rc��t||��S)Nr�)ry)rSr~s  rrEzModelPatcher.use_ejected�s��!�$�Ea�b�brc�$�|js|jry|jj�D]!}|D]}|j	|�d|_��#|jr-|jtj�D]175}||��yy�NT)r�r�r�r��injectr�r�ON_INJECT_MODEL�rSr��injr�s    rr�zModelPatcher.inject_model�s~�����t�2�2���/�/�0�0�2�J�!���176�177�4� �#'�� �"�3���� �2�2�;�3N�3N�O�����P�rc���|jsy|jj�D]}|D]}|j|���d|_|j	t178j�D]179}||��yr{)r�r�r��ejectr�r�ON_EJECT_MODELr�s    rr�zModelPatcher.eject_model�sg�������/�/�0�0�2�J�!���	�	�$��"�3�!����.�.�{�/I�/I�J�H��T�N�Krc��t|jd�r||j_|jtj180�D]181}||��yr�)rCrrr�r�r�182ON_PRE_RUNr�s  r�pre_runzModelPatcher.pre_run�s@���4�:�:�0�1�)-�D�J�J�&��.�.�{�/E�/E�F�H��T�N�Grc�^�|jtj�D]}|||��
yr2)r�r�ON_PREPARE_STATE)rS�timestepr�s   r�
prepare_statezModelPatcher.prepare_state�s(���.�.�{�/K�/K�L�H��T�8�$�Mrc�N�|j�|j|_d|_yyr2)r�r�r�s r�restore_hook_patchesz!ModelPatcher.restore_hook_patches�s)���#�#�/� $� 8� 8�D��'+�D�$�0rc��||_yr2)r�)rSr�s  r�
set_hook_modezModelPatcher.set_hook_mode�s	��"��rc���|d}d}|jdi�}|jD]�}|jj||��}|s�#|j�$|jjD]}	|	|k(s�	d}nt|jj��D]/}183|184j|�s�|jj|185��1��|r|jd�yy)NrFr)�curr_trT)r*r��
hook_keyframe�prepare_current_keyframer�rJr�r��containsr]�patch_hooks)rS�t�186hook_grouprr�reset_current_hooksr�hook�changed�current_hook�cached_groups           r�%prepare_hook_patches_current_keyframez2ModelPatcher.prepare_hook_patches_current_keyframe�s����1���#��+�/�/�0E�r�J���$�$�D��(�(�A�A��ex�A�y�G���%�%�1�(,�(:�(:�(@�(@��'�4�/�26�/�!�)A�%)��)A�)A�)F�)F�)H�$I�L�#�,�,�T�2��0�0�4�4�\�B�%J�%�����T�"�rc�6�|j�|�tjj�}g}|j	tjj187j�D]=}|j|jvr|j|��-|j|��?t|�dkDr5t|j�|_
|D]}|j||||��|jt j"�D]}||||||��|Sr�)r188r3r��	HookGroup�get_type�EnumHookType�Weightr<r�rIrHrlr>r��add_hook_patchesr�r�ON_REGISTER_ALL_HOOK_PATCHES)rSr��target_dictr�189registered�weight_hooks_to_registerrr�s        r�register_all_hook_patchesz&ModelPatcher.register_all_hook_patches�s����!�!�#������.�.�0�J�AC� ��N�N�5�;�;�#;�#;�#B�#B�C�D��}�}�D�$5�$5�5�(�/�/��5����t�$�	D�190�'�(�1�,�'@��AR�AR�'S�D�$�0���%�%�d�M�;�191�S�1��.�.�{�/W�/W�X�H��T�5�+�}�j�I�Y��rc	�^�|j�5|jj|ji�}t	�}|j192j
�}|D]|}d}	d}193t|t�r|}n|d}	|d}t|�dkDr|d}194||vs�<|j|�|j|g�}|j|||||	|195f�|||<�~||j|j<tj�|_t|�cddd�S#1swYyxYwrD)rEr�r*r<rFrrrGr
rrlrHrIr�r�r�rJ)
rSrrRrKrL�current_hook_patchesrMrNr=rOr8rQrPs
             rr zModelPatcher.add_hook_patchess��
�
�
�
�37�3D�3D�3H�3H����XZ�3[� ���A��z�z�,�,�.�H��������a��%��C��q�T�F��A�$�C��1�v��z�#$�Q�4���(�?��E�E�!�H�3G�3K�3K�C�QS�3T�O�#�*�*�N�G�A�J��X^�`h�+i�j�0?�(��-�� 0D�D���d�m�m�,� $�196�197��D����7�1 �
�
�s�BD#�A?D#�#D,c���i}|��|jD]�}|jj|ji�}|j	�D]�}|j|g�}tj|jd�r|j||�nF||D]>}t|�}|dxx|jzcc<|jt|���@|||<����|S)N��?r)r�r�r*r<r��math�isclose�strengthr�rJrI�tuple)	rSr��combined_patchesrr�rQrPr�	new_patchs	         r�get_combined_hook_patchesz&ModelPatcher.get_combined_hook_patches&s�����������%)�%6�%6�%:�%:�4�=�=�"�%M��'�,�,�.�C�3C�3G�3G��R�3P�O��|�|�D�M�M�3�7�'�.�.�|�C�/@�A�&2�#�%6�E�(,�U��I�%�a�L�D�M�M�9�L�+�2�2�5��3C�D�&7�-<�$�S�)�/�$� �rc�B�|j|k(r1|r|js#|�!tjj	|||�S|j|��|j
tj�D]}|||��
tjj	|||�S)N�r�)	r�r�r3r��%create_transformer_options_from_hooksrr�r�ON_APPLY_HOOKS)rSr�rrr�s     rr�zModelPatcher.apply_hooks9s�������&��D�L�L�UZ�Ub��;�;�D�D�T�5�Re�f�f����u��%��.�.�{�/I�/I�J�H��T�5�!�K��{�{�@�@��u�Na�b�brc	���|j�5|���t|j�j��}d}|jt198jjjk(rStt199jj|j�t200jj�dz��}|jj|d�}|�ft!|�}|D]D}||vrt#j$d|���� |j'|||��|j)|��F|j+|�n�|j+�|j-|��}d}t/|�dkDr|j1�}|D]5}||vrt#j$d|���� |j3|||||���7n|j+�||_ddd�y#1swYyxYw)	Nrj)r�r�z:Cached hook could not patch. Key does not exist in model: )�cached_weightsrQ�memory_counterr2rz:Cached hook would not patch. Key does not exist in model: )r�r.rQ�original_weightsr7)rErJrVr�r�r3r�r�r�r�r��get_free_memoryr��minimum_inference_memoryr�r*rFr�r��patch_cached_hook_weights�remover�r0rlr[�patch_hook_weight_to_devicer�)	rSr��
model_sd_keysr7r6�model_sd_keys_setrQ�relevant_patchesr8s	         rrzModelPatcher.patch_hooksBs���
�
�
�
�� � $�T�%:�%:�%<�%A�%A�%C� D�
�!%���>�>�U�[�[�%=�%=�%F�%F�F�%2�5�;Q�;Q�;a�;a�bf�br�br�;s�8=�8N�8N�8g�8g�8i�jk�8k�&m�N�"&�!9�!9�!=�!=�e�T�!J��!�-�(+�M�(:�%�-���m�3�#�O�O�.h�il�hm�,n�o�$��6�6�n�Z]�n|�6�}�)�0�0��5� .��&�&�'8�9��&�&�(�'+�'E�'E�E�'E�'R�$�'+�$��+�,�q�0�+/�+?�+?�+A�(�/���m�3�#�O�O�.h�il�hm�,n�o�$��8�8�u�Wg�mp�DT�KY�9�[�	 0��"�"�$�!&�D��C �
�
�s�G	G#�#G,c��||jvr�tjj|j|�}|j201}|jtjjjk(r|j|�}|r|j}|j|d��|jf|j|<tjj|j|||dj||d���y)NTrbrrrI)r�r3rmrnrrr�r�r�r�r�r�rJr#ri)rSr6rQr7rc�
target_devicer�s       rr;z&ModelPatcher.patch_cached_hook_weightsfs����d�&�&�&�#(�;�;�#7�#7��202�203�C�#H�F� �/�/�M��~�~����!9�!9�!B�!B�B�%�)�)�&�1���$*�M�M�M�%+�Y�Y�m�$�Y�%O�QW�Q^�Q^�$_�D���S�!�
���!�!�$�*�*�c�>�#�3F�q�3I�3L�3L�Tb�cf�Tg�hi�Tj�3L�3k�lrc�Z�|jj�|jd�yr2)r�r�rr�s r�clear_cached_hook_weightsz&ModelPatcher.clear_cached_hook_weightsqs"��� � �&�&�(�����rc��||vryt|j|�\}}}||jvr�|j}	|jt204jjjk(r|j|�}205|206r|j}	|j|	d��|jf|j|<t207jj||jtjd��}|�208||d��}t209j j#|||||��}||=|�at210j$j'||j(t+|���}t211j,j/|j||�n||dt+|���|jt212jjjk(rv|j}	|j|�}213|214r|j}	|j0j3|i�|j|	d��|jf|j0||<~~~y)	NTrbrrc)r8rXreF)rwrrr�r�r�r3r�r�r�r�rJr#r�rhr[r\rarbr_r`rZrrmrir�r�)
rSr�r.rQr8r7rcrsrtrBr�rlrms
             rr=z(ModelPatcher.patch_hook_weight_to_deviceus����&�&��)7��215�216�C�)H�&���,��d�&�&�&� �/�/�M��~�~����!9�!9�!B�!B�B�%�)�)�&�1���$*�M�M�M�%+�Y�Y�m�$�Y�%O�QW�Q^�Q^�$_�D���S�!��,�,�;�;�F�F�M�M�SX�S`�S`�gk�;�l���#�&�{�D�A�K��Z�Z�0�0�1A�#�1F�1<�14�GW�1�Y�217�
�S�!������8�8��V�\�\�Xf�gj�Xk�8�l�J��K�K�%�%�d�j�j�#�z�B��Z��>�#�;N�O��>�>�U�[�[�5�5�>�>�>� �/�/�M�!�%�%�f�-�D�� &�
�
�
��$�$�/�/��r�:�4>�M�M��]b�M�4c�ek�er�er�3s�D�$�$�U�+�C�0���rc218���|j�5t|j�dk(rd|_	ddd�yt	|jj��}|r�|D]}}||vs�tjj|j||j|dj|j|d���|jj|��n�|D]]}tjj|j||j|dj|j|d����_|jj�d|_ddd�y#1swYyxYw)NrrrI)
rErlr�r�rJr�r3rmrirrr#r]r�)rS�whitelist_keys_setr�r=s    rr�zModelPatcher.unpatch_hooks�sF��
�
�
�
��4�#�#�$��)�%)��"�� �
���(�(�-�-�/�0�D�!��A��.�.����1�1�$�*�*�a��AQ�AQ�RS�AT�UV�AW�AZ�AZ�bf�br�br�st�bu�vw�bx�AZ�Ay�z��(�(�,�,�Q�/��219�A��K�K�-�-�d�j�j�!�T�=M�=M�a�=P�QR�=S�=V�=V�^b�^n�^n�op�^q�rs�^t�=V�=u�v��� � �&�&�(�%)��"� �
�
�s�!E/�.E/�*C<E/�/E8c�D�|j�|j�yr2)r�rDr�s rr�zModelPatcher.clean_hooks�s�������&�&�(rc�(�|jd��y)NF)r�)r�r�s r�__del__zModelPatcher.__del__�s�������&r)rF)r�r�r�)r�r	r2)rr�returnztorch.nn.Module)r)r)r{)NrFF)NrTFr�r�)T)r�rr�r)r�rrQrr�r)r�rrQr)r�r)r�rr�r)r�rrQrr�r)r�rrQr)r�r)rQr)rQrr�zlist[PatcherInjection])rQrr�zlist['ModelPatcher'])r�zcomfy.hooks.EnumHookMode)rr�r�comfy.hooks.HookGroupr�	dict[str])NN)r�rLr"rMr�dictr#rL)rzcomfy.hooks.WeightHook)r�rL)r�rLrrN)r6rNrQrr7r�)220r�rLr.rNrQrr8rNr7r�)rGzset[str]rK�None)[rerfrgrTr�r�r�r�r�r�r�r�r�r�rrrrrrrrrr r#r&r*r-r0r3r6r9r;r?rBrQr[rVrnrwr�r�r�r�r�r�r�r[r\rbr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rEr�r�rrr221rrr%r r0r�rr;rDr=r�r�rJr9rrr�r��s���3:�j�5�0�8�t�222�@C�C�C�A�M�L�D�W�3�3�\�\�:�:�9�D�:�1�D�(�)�)�>�,T�**��0�.�Z�6
�hB�T�"%+�N8 �tH�2�!�IN�
�
�h��>���223>��?���224@��+�&�/�*�%�.�-�,�3���&c�	���%�,�225#�#�*sw�FJ��.C��*�6 �&c�"'�H	m��%�N*�$)�'rr�r2r�)r6rN)&�__doc__�226__future__r�typingrrr[rr�r�r�rfr*�comfy.utilsr3�comfy.float�comfy.model_management�227comfy.lora�comfy.hooks�comfy.patcher_extensionrrr�comfy.comfy_typesr	rr%r,r0r7r>rFrMrOrwryr�r�r9rr�<module>rZs����$#�%��������������M�M�1���*��I��	�� 228|�229|�*�0=�=�0��&j'�j'r