Ë
    ÜÓ^j˜L  ã                   ó  — d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 dd	lmZmZmZ dd
lmZ ddlmZmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZ ddlm Z  ddl!m"Z"  ejF                  e$«      Z% ed¬«      e G d„ de«      «       «       Z& ed¬«      e G d„ de«      «       «       Z' G d„ dejP                  «      Z)e G d„ de«      «       Z* ed¬«       G d„ d e*«      «       Z+ ed¬«       G d!„ d"e*e
«      «       Z,g d#¢Z-y)$zPyTorch PaliGemmamodel.é    )Ú	dataclassN)Únné   )ÚCache)ÚPreTrainedConfig)ÚGenerationMixin)Úcreate_causal_maskÚcreate_masks_for_generateÚ!create_sliding_window_causal_mask)ÚFlashAttentionKwargs)ÚBaseModelOutputWithPastÚBaseModelOutputWithPooling)ÚPreTrainedModel)ÚUnpack)ÚModelOutputÚTransformersKwargsÚauto_docstringÚcan_return_tupleÚloggingÚtorch_compilable_checké   )Ú	AutoModelé   )ÚPaliGemmaConfigzN
    Base class for Paligemma outputs, with hidden states and attentions.
    ©Úcustom_introc                   ó:   — e Zd ZU dZdZej                  dz  ed<   y)ÚPaligemmaModelOutputWithPasta  
    image_hidden_states (`torch.FloatTensor`, *optional*):
        A `torch.FloatTensor` of size `(batch_size, num_images, sequence_length, hidden_size)`.
        image_hidden_states of the model produced by the vision encoder and after projecting the last hidden state.
    NÚimage_hidden_states)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚtorchÚFloatTensorÚ__annotations__© ó    ú{/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/transformers/models/paligemma/modeling_paligemma.pyr   r   ,   s   … ñð 59Ð˜×*Ñ*¨TÑ1Ô8r(   r   zU
    Base class for PaliGemma causal language model (or autoregressive) outputs.
    c                   óú   — e Zd ZU dZdZej                  dz  ed<   dZej                  dz  ed<   dZ	e
dz  ed<   dZeej                     dz  ed<   dZeej                     dz  ed<   dZej                  dz  ed<   y)	ÚPaliGemmaCausalLMOutputWithPasta8  
    loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided):
        Language modeling loss (for next-token prediction).
    logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.text_config.vocab_size)`):
        Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
    past_key_values (`Cache`, *optional*, returned when `use_cache=True` is passed or when `config.use_cache=True`):
        It is a [`~cache_utils.Cache`] instance. For more details, see our [kv cache guide](https://huggingface.co/docs/transformers/en/kv_cache).

        Contains pre-computed hidden-states (key and values in the self-attention blocks) that can be used (see
        `past_key_values` input) to speed up sequential decoding.
    image_hidden_states (`torch.FloatTensor`, *optional*):
        A `torch.FloatTensor` of size `(batch_size, num_images, sequence_length, hidden_size)`.
        image_hidden_states of the model produced by the vision encoder after projecting last hidden state.
    NÚlossÚlogitsÚpast_key_valuesÚhidden_statesÚ
attentionsr   )r    r!   r"   r#   r,   r$   r%   r&   r-   r.   r   r/   Útupler0   r   r'   r(   r)   r+   r+   <   s‹   … ñð &*€Dˆ%×
Ñ
˜dÑ
"Ó)Ø'+€FˆE×Ñ Ñ$Ó+Ø$(€O�U˜T‘\Ó(Ø59€M�5˜×*Ñ*Ñ+¨dÑ2Ó9Ø26€J��e×'Ñ'Ñ(¨4Ñ/Ó6Ø48Ð˜×*Ñ*¨TÑ1Ô8r(   r+   c                   ó*   ‡ — e Zd Zdefˆ fd„Zd„ Zˆ xZS )ÚPaliGemmaMultiModalProjectorÚconfigc                 ó¬   •— t         ‰| �  «        t        j                  |j                  j
                  |j                  j                  d¬«      | _        y )NT©Úbias)ÚsuperÚ__init__r   ÚLinearÚvision_configÚhidden_sizeÚprojection_dimÚlinear©Úselfr4   Ú	__class__s     €r)   r9   z%PaliGemmaMultiModalProjector.__init__[   s;   ø€ Ü‰ÑÔÜ—i‘i × 4Ñ 4× @Ñ @À&×BVÑBV×BeÑBeÐlpÔqˆ�r(   c                 ó(   — | j                  |«      }|S ©N)r>   )r@   Úimage_featuresr/   s      r)   Úforwardz$PaliGemmaMultiModalProjector.forward_   s   € ØŸ™ NÓ3ˆàÐr(   )r    r!   r"   r   r9   rE   Ú__classcell__©rA   s   @r)   r3   r3   Z   s   ø„ ðr˜õ rör(   r3   c                   óD   — e Zd ZU eed<   dZdZdZdgZdgZ	dZ
dZdZdZdZy)	ÚPaliGemmaPreTrainedModelr4   Úmodel)ÚimageÚtextTr3   r.   FN)r    r!   r"   r   r&   Úbase_model_prefixÚinput_modalitiesÚsupports_gradient_checkpointingÚ_no_split_modulesÚ_skip_keys_device_placementÚ_can_compile_fullgraphÚ_supports_flash_attnÚ_supports_sdpaÚ_supports_flex_attnÚ_supports_attention_backendr'   r(   r)   rI   rI   e   sI   … àÓØÐØ(ÐØ&*Ð#Ø7Ð8ÐØ#4Ð"5ÐØ"ÐØÐØ€NØÐØ"&Ñr(   rI   z|
    The Base Paligemma model which consists of a vision backbone and a language model without language modeling head.,
    c                   óø  ‡ — e Zd ZdZdefˆ fd„Ze ed¬«      dej                  de
e   deez  fd	„«       «       Zd
ej                  dej                  dej                  fd„Zee	 	 	 	 	 	 	 	 	 dd
ej                  dz  dej                  dz  dej"                  dz  dej                  dz  dedz  dej                  dz  dej                  dz  dej                  dz  dedz  de
e   deez  fd„«       «       Zˆ xZS )ÚPaliGemmaModelFr4   c                 ó   •— t         ‰| �  |«       t        j                  |j                  ¬«      | _        t        |«      | _        |j                  j                  | _	        t        j                  |j                  ¬«      }|| _
        | j                  j                  «       j                  xs | j                  | _        | j                  «        y )N)r4   )r8   r9   r   Úfrom_configr;   Úvision_towerr3   Úmulti_modal_projectorÚtext_configÚ
vocab_sizeÚlanguage_modelr4   Úget_text_configÚdtypeÚtext_config_dtypeÚ	post_init)r@   r4   r_   rA   s      €r)   r9   zPaliGemmaModel.__init__}   s•   ø€ Ü‰Ñ˜Ô Ü%×1Ñ1¸×9MÑ9MÔNˆÔÜ%AÀ&Ó%IˆÔ"Ø ×,Ñ,×7Ñ7ˆŒä"×.Ñ.°f×6HÑ6HÔIˆØ,ˆÔà!%§¡×!<Ñ!<Ó!>×!DÑ!DÒ!RÈÏ
É
ˆÔØ�‰Õr(   zWObtains image last hidden states from the vision tower and apply multimodal projection.r   Úpixel_valuesÚkwargsÚreturnc                 ót   —  | j                   |fi |¤Ž}|j                  }| j                  |«      }||_        |S rC   )r[   Úlast_hidden_stater\   Úpooler_output)r@   rd   re   Úimage_outputsÚselected_image_featurerD   s         r)   Úget_image_featuresz!PaliGemmaModel.get_image_features‰   sF   € ð *˜×)Ñ)¨,ÑA¸&ÑAˆØ!.×!@Ñ!@ÐØ×3Ñ3Ð4JÓKˆØ&4ˆÔ#àÐr(   Ú	input_idsÚinputs_embedsrD   c                 ó.  — |€m| | j                  «       t        j                  | j                  j                  t        j
                  |j                  ¬«      «      k(  }|j                  d«      }n|| j                  j                  k(  }|j                  «       }|j                  d   |j                  d   z  }|j                  d«      j                  |j                  «      }t        ||j                  d   z  |j                  «       k(  d|› d|› �«       |S )zï
        Obtains multimodal placeholder mask from `input_ids` or `inputs_embeds`, and checks that the placeholder token count is
        equal to the length of multimodal features. If the lengths are different, an error is raised.
        )ra   Údeviceéÿÿÿÿr   r   z6Image features and image tokens do not match, tokens: z, features: )Úget_input_embeddingsr$   Útensorr4   Úimage_token_idÚlongrp   ÚallÚsumÚshapeÚ	unsqueezeÚtor   Únumel)r@   rm   rn   rD   Úspecial_image_maskÚn_image_tokensÚn_image_featuress          r)   Úget_placeholder_maskz#PaliGemmaModel.get_placeholder_mask—   s  € ð ÐØ!.Ð2M°$×2KÑ2KÓ2MÜ—‘˜TŸ[™[×7Ñ7¼u¿z¹zÐR_×RfÑRfÔgó3ñ "Ðð "4×!7Ñ!7¸Ó!;Ñà!*¨d¯k©k×.HÑ.HÑ!HÐà+×/Ñ/Ó1ˆØ)×/Ñ/°Ñ2°^×5IÑ5IÈ!Ñ5LÑLÐØ/×9Ñ9¸"Ó=×@Ñ@À×AUÑAUÓVÐÜØ˜]×0Ñ0°Ñ4Ñ4¸×8LÑ8LÓ8NÑNØDÀ^ÐDTÐT`ÐaqÐ`rÐsô	
ð "Ð!r(   NÚattention_maskÚposition_idsr.   Útoken_type_idsÚlabelsÚ	use_cachec
           	      óˆ  — |du |duz  rt        d«      ‚|�R| j                  j                  | j                  k\  r/|| j                  j                  k(  }|j	                  «       }d||<   n|}|€ | j                  «       |«      }|€Y|�|j                  «       nd}t        j                  |j                  d   |j                  ¬«      |z   }|j                  d«      dz   }|�g| j                  |«      j                  }|j                  |j                  |j                  «      }| j!                  |||¬«      }|j#                  ||«      }| j                  j%                  «       ||||dœ}|du xs |j&                   xs |du}|�|rt        j(                  |dk(  dd«      |d	<   t+        di |¤Ž}t-        | j                  j.                  d
d«      �|j1                  «       }|t3        di |¤Ždœ} | j4                  d|||||	dœ|
¤Ž}t7        |j8                  |j:                  |j<                  |j>                  |�¬«      S d¬«      S )áº  
        labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
            Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
            config.text_config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored
            (masked), the loss is only computed for the tokens with labels in `[0, ..., config.text_config.vocab_size]`.

        Example:

        ```python
        >>> from PIL import Image
        >>> import httpx
        >>> from io import BytesIO
        >>> from transformers import AutoProcessor, PaliGemmaForConditionalGeneration

        >>> model = PaliGemmaForConditionalGeneration.from_pretrained("google/paligemma2-3b-mix-224")
        >>> processor = AutoProcessor.from_pretrained("google/paligemma2-3b-mix-224")

        >>> prompt = "Where is the cat standing?"
        >>> url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
        >>> with httpx.stream("GET", url) as response:
        ...     image = Image.open(BytesIO(response.read()))

        >>> inputs = processor(images=image, text=prompt,  return_tensors="pt")

        >>> # Generate
        >>> generate_ids = model.generate(**inputs,)
        >>> processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
        "Where is the cat standing?\nsnow"
        ```Nz:You must specify exactly one of input_ids or inputs_embedsr   r   ©rp   )rn   rD   )r4   rn   r€   r.   r�   rq   Úblock_sequence_idsÚsliding_window)Úfull_attentionÚsliding_attention)r€   r�   r.   rn   r„   )rh   r.   r/   r0   r   r'   ) Ú
ValueErrorr4   rt   r^   Úclonerr   Úget_seq_lengthr$   Úarangerx   rp   ry   rl   ri   rz   ra   r   Úmasked_scatterr`   Úis_initializedÚwherer	   Úgetattrr]   Úcopyr   r_   r   rh   r.   r/   r0   )r@   rm   rd   r€   r�   r.   r‚   rn   rƒ   r„   re   r|   Úllm_input_idsÚpast_seen_tokensrD   Úmask_kwargsÚis_first_iterationÚcausal_maskÚsliding_mask_kwargsÚoutputss                       r)   rE   zPaliGemmaModel.forward¯   s“  € ðZ ˜Ð -°tÐ";Ò<ÜÐYÓZÐZð Ð  T§[¡[×%?Ñ%?À4Ç?Á?Ò%RØ!*¨d¯k©k×.HÑ.HÑ!HÐØ%ŸO™OÓ-ˆMØ01ˆMÐ,Ò-à%ˆMàÐ Ø7˜D×5Ñ5Ó7¸ÓFˆMàÐØCRÐC^˜×=Ñ=Ô?ÐdeÐÜ Ÿ<™<¨×(;Ñ(;¸AÑ(>À}×G[ÑG[Ô\Ð_oÑoˆLØ'×1Ñ1°!Ó4°qÑ8ˆLð Ð#Ø!×4Ñ4°\ÓB×PÑPˆNØ+×.Ñ.¨}×/CÑ/CÀ]×EXÑEXÓYˆNØ!%×!:Ñ!:Ø¨À~ð ";ó "Ðð *×8Ñ8Ð9KÈ^Ó\ˆMð —k‘k×1Ñ1Ó3Ø*Ø,Ø.Ø(ñ
ˆð -°Ð4Òv¸O×<ZÑ<ZÐ8ZÒvÐ^jÐrvÐ^vÐØÐ%Ñ*<ä05·±¸NÈaÑ<OÐQRÐTVÓ0WˆKÐ,Ñ-ô )Ñ7¨;Ñ7ˆÜ�4—;‘;×*Ñ*Ð,<¸dÓCÐOØ"-×"2Ñ"2Ó"4Ðà"-Ü%FÑ%]ÐI\Ñ%]ñˆKð
 &�$×%Ñ%ð 
Ø&Ø%Ø+Ø'Øñ
ð ñ
ˆô ,Ø%×7Ñ7Ø#×3Ñ3Ø!×/Ñ/Ø×)Ñ)Ø2>Ð2J ô
ð 	
ð
 QUô
ð 	
r(   )	NNNNNNNNN)r    r!   r"   Úaccepts_loss_kwargsr   r9   r   r   r$   r%   r   r   r1   r   rl   Ú
LongTensorr   ÚTensorr   Úboolr   r   rE   rF   rG   s   @r)   rX   rX   t   s¥  ø„ ð  Ðð
˜õ 
ð ÙØnôðØ!×-Ñ-ðØ9?Ð@RÑ9Sðà	Ð+Ñ	+òóó ðð"Ø×)Ñ)ð"Ø:?×:KÑ:Kð"Ø]b×]nÑ]nó"ð0 Øð .2Ø15Ø.2Ø04Ø(,Ø26Ø26Ø*.Ø!%ñl
à×#Ñ# dÑ*ðl
ð ×'Ñ'¨$Ñ.ðl
ð Ÿ™ tÑ+ð	l
ð
 ×&Ñ&¨Ñ-ðl
ð  ™ðl
ð ×(Ñ(¨4Ñ/ðl
ð ×(Ñ(¨4Ñ/ðl
ð × Ñ  4Ñ'ðl
ð ˜$‘;ðl
ð Ð-Ñ.ðl
ð 
Ð-Ñ	-òl
ó ó ôl
r(   rX   c                   óp  ‡ — e Zd ZddiZdefˆ fd„Zedej                  de	e
   fd„«       Zee	 	 	 	 	 	 	 	 	 	 dd	ej                  dz  dej                  dz  d
ej                  dz  dej                  dz  dedz  dej                  dz  dej                  dz  dej                  dz  dedz  deej                  z  de	e
   deez  fd„«       «       Z	 	 	 	 	 	 	 	 	 	 dˆ fd„	Ze	 	 ddedej                  d
ej                  dz  dedz  dej                  dz  dej                  dz  dedz  defd„«       Zˆ xZS )Ú!PaliGemmaForConditionalGenerationzlm_head.weightz(model.language_model.embed_tokens.weightr4   c                 óî   •— t         ‰| �  |«       t        |«      | _        t	        j
                  |j                  j                  |j                  j                  d¬«      | _	        | j                  «        y )NFr6   )r8   r9   rX   rJ   r   r:   r]   r<   r^   Úlm_headrc   r?   s     €r)   r9   z*PaliGemmaForConditionalGeneration.__init__(  sS   ø€ Ü‰Ñ˜Ô Ü# FÓ+ˆŒ
Ü—y‘y ×!3Ñ!3×!?Ñ!?À×ASÑAS×A^ÑA^ÐejÔkˆŒØ�‰Õr(   rd   re   c                 ó<   —  | j                   j                  |fi |¤ŽS rC   )rJ   rl   )r@   rd   re   s      r)   rl   z4PaliGemmaForConditionalGeneration.get_image_features.  s   € à,ˆt�z‰z×,Ñ,¨\ÑD¸VÑDÐDr(   Nrm   r€   r�   r.   r‚   rn   rƒ   r„   Úlogits_to_keeprf   c                 óš  —  | j                   d||||||||	|dœ	|¤Ž}|d   }t        |
t        «      rt        |
 d«      n|
}| j	                  |dd…|dd…f   «      }d}|�4 | j
                  d||| j                  j                  j                  dœ|¤Ž}t        |||j                  |j                  |j                  |j                  ¬«      S )r†   )	rm   rd   r‚   r€   r�   r.   rn   r„   rƒ   r   N)r-   rƒ   r^   )r,   r-   r.   r/   r0   r   r'   )rJ   Ú
isinstanceÚintÚslicer£   Úloss_functionr4   r]   r^   r+   r.   r/   r0   r   )r@   rm   rd   r€   r�   r.   r‚   rn   rƒ   r„   r¥   re   r›   r/   Úslice_indicesr-   r,   s                    r)   rE   z)PaliGemmaForConditionalGeneration.forward2  sù   € ðZ �$—*‘*ð 
ØØ%Ø)Ø)Ø%Ø+Ø'ØØñ
ð ñ
ˆð   ™
ˆä8BÀ>ÔSVÔ8Wœ˜~˜o¨tÔ4Ð]kˆØ—‘˜mªA¨}ºaÐ,?Ñ@ÓAˆàˆØÐØ%�4×%Ñ%ð Ø f¸¿¹×9PÑ9P×9[Ñ9[ñØ_eñˆDô /ØØØ#×3Ñ3Ø!×/Ñ/Ø×)Ñ)Ø '× ;Ñ ;ô
ð 	
r(   c                 ó„   •— t        ‰| �  |f||||||	||dœ|¤Ž}|j                  d«      �|d   dz   |d<   |s|s||d<   |S )N)r.   rn   r€   r�   r„   r¥   r‚   r˜   r�   r   rd   )r8   Úprepare_inputs_for_generationÚget)r@   rm   r.   rn   r�   rd   r€   r‚   r„   r¥   rƒ   r˜   re   Úmodel_inputsrA   s                 €r)   r­   z?PaliGemmaForConditionalGeneration.prepare_inputs_for_generation€  s|   ø€ ô  ‘wÑ<Øð
à+Ø'Ø)Ø%ØØ)Ø)Ø1ñ
ð ñ
ˆð ×Ñ˜NÓ+Ð7à+7¸Ñ+GÈ!Ñ+KˆL˜Ñ(ñ ¡YØ+7ˆL˜Ñ(àÐr(   r˜   c                 óâ   — t        j                  g |j                  «       d d ¢d|j                  ¬«      }|�t        j                  |dk(  dd«      }t        | j                  «       |||||¬«      S )Nrq   r‡   r   )r4   rn   rˆ   r€   r.   r�   )r$   ÚfullÚsizerp   r’   r
   r`   )	r4   rn   r€   r.   r�   r‚   r˜   re   Ú	group_idss	            r)   r
   z;PaliGemmaForConditionalGeneration.create_masks_for_generate«  sy   € ô —J‘JÐ; ×!3Ñ!3Ó!5°c°rÐ!:Ð;¸RÈ×H\ÑH\Ô]ˆ	ØÐ%ô Ÿ™ N°aÑ$7¸¸BÓ?ˆIä(Ø×)Ñ)Ó+Ø'Ø(Ø)Ø+Ø%ô
ð 	
r(   )
NNNNNNNNNr   )
NNNNNNTNNF)NF)r    r!   r"   Ú_tied_weights_keysr   r9   r   r$   r%   r   r   rl   r   r�   rž   r   rŸ   r¨   r1   r+   rE   r­   Ústaticmethodr   Údictr
   rF   rG   s   @r)   r¡   r¡      s-  ø„ ð +Ð,VÐWÐð˜õ ð ðE¨u×/@Ñ/@ð EÈFÐSeÑLfò Eó ðEð Øð .2Ø15Ø.2Ø04Ø(,Ø26Ø26Ø*.Ø!%Ø-.ñJ
à×#Ñ# dÑ*ðJ
ð ×'Ñ'¨$Ñ.ðJ
ð Ÿ™ tÑ+ð	J
ð
 ×&Ñ&¨Ñ-ðJ
ð  ™ðJ
ð ×(Ñ(¨4Ñ/ðJ
ð ×(Ñ(¨4Ñ/ðJ
ð × Ñ  4Ñ'ðJ
ð ˜$‘;ðJ
ð ˜eŸl™lÑ*ðJ
ð Ð+Ñ,ðJ
ð 
Ð0Ñ	0òJ
ó ó ðJ
ð^ ØØØØØØØØØ õ)ðV ð /3Ø*/ñ
Ø ð
à—|‘|ð
ð Ÿ™ tÑ+ð
ð  ™ð	
ð
 —l‘l TÑ)ð
ð Ÿ™ tÑ+ð
ð ! 4™Kð
ð 
ò
ó ô
r(   r¡   )r¡   rI   rX   ).r#   Údataclassesr   r$   r   Úcache_utilsr   Úconfiguration_utilsr   Ú
generationr   Úmasking_utilsr	   r
   r   Úmodeling_flash_attention_utilsr   Úmodeling_outputsr   r   Úmodeling_utilsr   Úprocessing_utilsr   Úutilsr   r   r   r   r   r   Úautor   Úconfiguration_paligemmar   Ú
get_loggerr    Úloggerr   r+   ÚModuler3   rI   rX   r¡   Ú__all__r'   r(   r)   ú<module>rÇ      s<  ðñ å !ã Ý å  Ý 3Ý )ß mÑ mÝ Bß SÝ -Ý &÷÷ õ Ý 4ð 
ˆ×	Ñ	˜HÓ	%€ñ ðôð
 ô9Ð#:ó 9ó óð9ñ ðôð
 ô9 kó 9ó óð9ô0 2§9¡9ô ð ô'˜ó 'ó ð'ñ ðôô
d
Ð-ó d
óð
d
ñN ðôô
^
Ð(@À/ó ^
óð
^
òB ^�r(   