
    bi*                        d dl mZ d dlZd dlmZ d dlmZmZ d dlZ	d dl
Z
d dlZd dl
mZ d dlmZ ddZeddd       Zdd	Zddd
ZddZd ZddZeddd       Zeddd       Zed        Zd Zy)    )annotationsN)contextmanager)LiteralOptional)nn)is_xpu_availablec                     t         j                  j                  t        j                        t         j                  j                  d      k\  rddlm}   |        S ddlm}   |        S )Nz4.33.0r   is_deepspeed_zero3_enabled)	packagingversionparsetransformers__version__transformers.integrationsr   transformers.deepspeedr
   s    R/home/cdr/jupyterlab/.venv/lib/python3.12/site-packages/peft/utils/integrations.pycheck_deepspeed_zero3_enabledr      sP    |778I<M<M<S<ST\<]]H &'' 	F%''    c              #     K   t               sd yddl}|j                  j                  | ||      5  d ddd       y# 1 sw Y   yxY ww)z`Call DeepSpeed GatheredParameters context manager if DeepSpeed is enabled, otherwise do nothing.Nr   )modifier_rank
fwd_module)r   	deepspeedzeroGatheredParameters)paramr   r   r   s       r   gather_params_ctxr   %   sI      )*		*	*5Zd	*	e 

s   2AA	AAAc                   t        | d      r| j                         }|S t        | j                        j                  j                  d      r| j                  j                         }|S | j                  }t        |t        j                  j                        s4t        |t        j                        r|S t        dt        |       d      |j                  j                  }|dvr|S t        | dd      }|j                  }|j                  t        j                  d      j                  k(  }t!        ||	      }|r | j                  j#                  |      | _        |S )
z
    Helper function to dequantize a quantized weight.

    This function should be extended if more quantization schemes are added to the library.

    If the weight is not quantized, it will be returned as is.
    W_qztorchao.z1Input weight should be of type nn.Parameter, got z instead)
Params4bit
Int8ParamsstateNcpu)r"   )hasattr
dequantizetypeweight
__module__
startswith
isinstancetorchr   	ParameterTensor	TypeError	__class____name__getattrdevicedequantize_bnb_weightto)moduler'   cls_namequant_stater2   is_cpus         r   dequantize_module_weightr9   4   s    vu""$	fmm		'	'	2	2:	>))+]]Ffehh001fell+MKDQWL>Yabcc((H33&'40K]]F[[ELL/444F"6=F((0Mr   c                j   ddl }| j                  }|j                  t        j                  d      j                  k(  }|rqt        j                  j                         r%| j                  t        j                  d            } n.t               r$| j                  t        j                  d            } | j                  j                  }|dk(  rE|j                  j                  | j                  | j                        }|r|j                  |      }|S |j                  | j                  |_        t        |j                  d      r1|j                  j!                  | j                  |j                        }n,| j                  |j                  j#                  dd	      z  d
z  }|r|j                  |      }|S )zHelper function to dequantize 4bit or 8bit bnb weights.

    Since dequantization is not supported on CPU, the weight will be temporarily moved to CUDA if necessary.
    r   Nr#   cudaxpur    int8_vectorwise_dequant   g   @ ?)bitsandbytesr2   r&   r+   r;   is_availabler4   r   r/   r0   
functionaldequantize_4bitdatar7   SCBr$   r=   view)r'   r"   bnbr2   r8   r6   dequantizeds          r   r3   r3   Y   sD   
  ]]F[[ELL/444F::""$YYu||F34FYYu||E23F((H<nn44V[[&BTBTU%..0KyyJJ	s~~89nn<<V[[%))T kkEIINN2q$99<PP!nnV,r   c                l    | j                   j                  dk(  ry| j                   j                  dk(  ryy)z>Returns '4bit' or '8bit' if bitsandbytes parameter, else Falser    4bitr!   8bitF)r/   r0   )r   s    r   get_bnb_param_typerL      s/    </</r   c                j   | j                   j                         D cg c]	  }|dvs| c}d   }| j                   j                         D ci c]  \  }}||dv r|n| }}}|yt        |      dk(  r5d|v r1t	        | j
                  j                        D ci c]  }||d   
 c}S i }|D ];  }t	        | j
                  j                        D ]  }d| d| dv s||   ||<    ; = t	        | j
                  j                        D ]  }||vst        d| d       |S c c}w c c}}w c c}w )	z<
    Derive the device map for the layers of the model.
    )r#   diskr   Nr?    .zlayer z! has not been mapped to a device.)hf_device_mapvaluesitemslenrangeconfignum_hidden_layersRuntimeError)	modeldmain_devicenamer2   execution_device_mapidxlayer_device_maplayers	            r   get_layer_device_mapra      sq    $1188:Wa>V1WXYZK X]WjWjWpWpWrGStVV6kFB  #
 A%"0D*D9>u||?]?]9^_#)"--__% 778 	C3%qzwa[((<U(C %	
 U\\334 P&&u,MNOOP + X `s   	D%D%D*D0c                   t        |t        j                        rt        | d      syt        |t        j                        rt        | |j                         yt        |       }t        | j                  j                        D ]]  }||   }|j                  |   j                  |      |j                  |<   |j                  |   j                  |      |j                  |<   _ y)zp
    Ensure that the key and value cache of the model are on the same device as their corresponding layers.
    rQ   N)r*   r   Cacher$   EncoderDecoderCachemap_cache_to_layer_device_mapself_attention_cachera   rU   rV   rW   	key_cacher4   value_cache)rY   cacher_   r^   layer_devices        r   re   re      s     ul001ge_6U%99:%eU-G-GH+E2U\\334 I',$s366|D!&!2!23!7!:!:<!H#Ir   c              #  ~   K   t        t        j                  d      |       5 }| d d d        y # 1 sw Y   y xY ww)Nmeta)include_buffers)_init_on_devicer+   r2   )rm   fs     r   init_empty_weightsrp      s7      
f-	O ST  s   !=1	=:=c              #  &   	K   t         j                  j                  	|rt         j                  j                   	fd}d fd	}|rdD ci c]  }|t	        t
        |       }}ni } fd}	 |t         j                  _        |r|t         j                  _        |j                         D ]'  }t        t
        | |t	        t
        |                   ) d  	t         j                  _        |rt         j                  _        |j                         D ]  \  }}t        t
        ||        y c c}w # 	t         j                  _        |rt         j                  _        |j                         D ]  \  }}t        t
        ||        w xY ww)Nc                ,    | ||       |t        t        dd      durst        | j                  |         }| j                  |   j                  }|j
                  |d<    || j                  |   j                        fi || j                  |<   y y y )N_skipFTrequires_grad)r1   rn   r&   _parameters__dict__rt   r4   )r5   r\   r   	param_clskwargsr2   old_register_parameters        r   register_empty_parameterz1_init_on_device.<locals>.register_empty_parameter   s     	vtU3GOWe$LTX$XV//56I''-66F&+&9&9F?#'01C1CD1I1L1LV1T'_X^'_Ft$	 %Yr   c                z     | |||       |,| j                   |   j                        | j                   |<   y y )N)
persistent)_buffersr4   )r5   r\   bufferr|   r2   old_register_buffers       r   register_empty_bufferz._init_on_device.<locals>.register_empty_buffer   s>    FD&ZH$*OOD$9$<$<V$DFOOD! r   )emptyzerosonesfullc                      fd}|S )Nc                     |d<    | i |S )Nr2    )argsrx   r2   fns     r   wrapperzB_init_on_device.<locals>.patch_tensor_constructor.<locals>.wrapper   s    %F8t&v&&r   r   )r   r   r2   s   ` r   patch_tensor_constructorz1_init_on_device.<locals>.patch_tensor_constructor   s    	' r   )T)	r   Moduleregister_parameterregister_bufferr1   r+   keyssetattrrS   )
r2   rm   rz   r   torch_function_nametensor_constructors_to_patchr   old_torch_functionr   ry   s
   `       @@r   rn   rn      so      YY99 ii77	`E  (J(
#  0C!DD(
$ (

 (*$D'?		$(=BII%#?#D#D#F 	oE.0HQVXkIl0mn	o'=		$(;BII%7S7Y7Y7[ 	D3!3E.0BC	D3(
, (>		$(;BII%7S7Y7Y7[ 	D3!3E.0BC	Ds-   A
FD2'
F2A*D7 AF7AFFc               #     K   t        t        dd      } 	 dt        _        d  | t        _        y # | t        _        w xY ww)Nrs   FT)r1   rn   rs   )old_vals    r   _skip_init_on_devicer      s6      ow6G( $ 's   A 0 A =A c                B     t        j                          fd       }|S )z
    Ignore the init_on_device context manager when calling the decorated function.

    This is a narrow use decorator that allows us to avoid initializing on meta device even when we're inside the
    init_empty_weights context.

    c                 T    t               5   | i |cd d d        S # 1 sw Y   y xY wN)r   )r   rx   funcs     r   r   z$skip_init_on_device.<locals>.wrapper  s+    !# 	)((	) 	) 	)s   ')	functoolswraps)r   r   s   ` r   skip_init_on_devicer   
  s'     __T) ) Nr   )returnbool)r   N)r   zOptional[int]r   torch.nn.Module)r5   r   r   torch.nn.Parameterr   )r'   r   )r   r   r   zLiteral[False, '4bit', '8bit'])r   None)rm   r   )r2   ztorch.devicerm   r   )
__future__r   r   
contextlibr   typingr   r   packaging.versionr   r+   r   r   peft.import_utilsr   r   r   r9   r3   rL   ra   re   rp   rn   r   r   r   r   r   <module>r      s    #  % $     .(  "J#L<I4   2D 2Dj ( (r   