From fa33f53fed6852f8f6c50892ca49f4c85ecfe5c9 Mon Sep 17 00:00:00 2001 From: ModelHub XC Date: Mon, 22 Jun 2026 07:07:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=EF=BC=8C=E7=94=B1ModelHub=20XC=E7=A4=BE=E5=8C=BA=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Model: NexaAIDev/octopus-planning Source: Original Platform --- .gitattributes | 39 + 1-demo.png | 3 + README.md | 69 ++ added_tokens.json | 15 + config.json | 140 +++ configuration.json | 1 + configuration_phi3.py | 213 ++++ generation_config.json | 11 + logo.png | Bin 0 -> 179002 bytes model-00001-of-00002.safetensors | 3 + model-00002-of-00002.safetensors | 3 + model.safetensors.index.json | 202 ++++ modeling_phi3.py | 1606 ++++++++++++++++++++++++++++++ special_tokens_map.json | 34 + tokenizer.json | 3 + tokenizer.model | 3 + tokenizer_config.json | 150 +++ 17 files changed, 2495 insertions(+) create mode 100644 .gitattributes create mode 100644 1-demo.png create mode 100644 README.md create mode 100644 added_tokens.json create mode 100644 config.json create mode 100644 configuration.json create mode 100644 configuration_phi3.py create mode 100644 generation_config.json create mode 100644 logo.png create mode 100644 model-00001-of-00002.safetensors create mode 100644 model-00002-of-00002.safetensors create mode 100644 model.safetensors.index.json create mode 100644 modeling_phi3.py create mode 100644 special_tokens_map.json create mode 100644 tokenizer.json create mode 100644 tokenizer.model create mode 100644 tokenizer_config.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..10ea177 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,39 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +1-demo.png filter=lfs diff=lfs merge=lfs -text +tokenizer.json filter=lfs diff=lfs merge=lfs -text +model-00001-of-00002.safetensors filter=lfs diff=lfs merge=lfs -text +model-00002-of-00002.safetensors filter=lfs diff=lfs merge=lfs -text diff --git a/1-demo.png b/1-demo.png new file mode 100644 index 0000000..08fef87 --- /dev/null +++ b/1-demo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a80997c530a55bb2bf8daa41c9af6179da63fb576afd1167509fe3592c8c92f9 +size 4965771 diff --git a/README.md b/README.md new file mode 100644 index 0000000..50dc185 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +--- +license: cc-by-nc-4.0 +--- +# Octo-planner: On-device Language Model for Planner-Action Agents Framework + +We're thrilled to introduce the Octo-planner, the latest breakthrough in on-device language models from Nexa AI. Developed for the Planner-Action Agents Framework, Octo-planner enables rapid and efficient planning without the need for cloud connectivity, this model together with [Octopus-V2](https://huggingface.co/NexaAIDev/Octopus-v2) can work on edge devices locally to support AI Agent usages. + +### Key Features of Octo-planner: +- **Efficient Planning**: Utilizes fine-tuned plan model based on Phi-3 Mini (3.82 billion parameters) for high efficiency and low power consumption. +- **Agent Framework**: Separates planning and action, allowing for specialized optimization and improved scalability. +- **Enhanced Accuracy**: Achieves a planning success rate of 98.1% on benchmark dataset, providing reliable and effective performance. +- **On-device Operation**: Designed for edge devices, ensuring fast response times and enhanced privacy by processing data locally. + + +## Example Usage +Below is a demo of Octo-planner: +

+ondevice +

+ + +Run below code to use Octopus Planner for a given question: +```python +import torch +from transformers import AutoModelForCausalLM, AutoTokenizer + +model_id = "NexaAIDev/octopus-planning" +model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", torch_dtype=torch.bfloat16, trust_remote_code=True) +tokenizer = AutoTokenizer.from_pretrained(model_id) + +question = "Find my presentation for tomorrow's meeting, connect to the conference room projector via Bluetooth, increase the screen brightness, take a screenshot of the final summary slide, and email it to all participants" +inputs = f"<|user|>{question}<|end|><|assistant|>" +input_ids = tokenizer(inputs, return_tensors="pt").to(model.device) +outputs = model.generate( + input_ids=input_ids["input_ids"], + max_length=1024, + do_sample=False) +res = tokenizer.decode(outputs.tolist()[0]) +print(f"=== inference result ===\n{res}") +``` + +## Training Data +We wrote 10 Android API descriptions to used to train the models, see this file for details. Below is one Android API description example +``` +def send_email(recipient, title, content): + """ + Sends an email to a specified recipient with a given title and content. + + Parameters: + - recipient (str): The email address of the recipient. + - title (str): The subject line of the email. This is a brief summary or title of the email's purpose or content. + - content (str): The main body text of the email. It contains the primary message, information, or content that is intended to be communicated to the recipient. + """ +``` + +## Contact Us +For support or to provide feedback, please [contact us](mailto:octopus@nexa4ai.com). + +## License and Citation +Refer to our [license page](https://www.nexa4ai.com/licenses/v2) for usage details. Please cite our work using the below reference for any academic or research purposes. +``` +@article{chen2024octoplannerondevicelanguagemodel, + title={Octo-planner: On-device Language Model for Planner-Action Agents}, + author={Wei Chen and Zhiyuan Li and Zhen Guo and Yikang Shen}, + year={2024}, + eprint={2406.18082}, + url={https://arxiv.org/abs/2406.18082}, +} +``` \ No newline at end of file diff --git a/added_tokens.json b/added_tokens.json new file mode 100644 index 0000000..15052a7 --- /dev/null +++ b/added_tokens.json @@ -0,0 +1,15 @@ +{ + "": 32012, + "": 32011, + "<|assistant|>": 32001, + "<|endoftext|>": 32000, + "<|end|>": 32007, + "<|placeholder1|>": 32002, + "<|placeholder2|>": 32003, + "<|placeholder3|>": 32004, + "<|placeholder4|>": 32005, + "<|placeholder5|>": 32008, + "<|placeholder6|>": 32009, + "<|system|>": 32006, + "<|user|>": 32010 +} diff --git a/config.json b/config.json new file mode 100644 index 0000000..c250a4d --- /dev/null +++ b/config.json @@ -0,0 +1,140 @@ +{ + "_name_or_path": "./checkpoints-functions-full", + "architectures": [ + "Phi3ForCausalLM" + ], + "attention_bias": false, + "attention_dropout": 0.0, + "auto_map": { + "AutoConfig": "configuration_phi3.Phi3Config", + "AutoModelForCausalLM": "modeling_phi3.Phi3ForCausalLM", + "AutoModelForSequenceClassification": "microsoft/Phi-3-mini-128k-instruct--modeling_phi3.Phi3ForSequenceClassification", + "AutoModelForTokenClassification": "microsoft/Phi-3-mini-128k-instruct--modeling_phi3.Phi3ForTokenClassification" + }, + "bos_token_id": 1, + "embd_pdrop": 0.0, + "eos_token_id": 32000, + "hidden_act": "silu", + "hidden_size": 3072, + "initializer_range": 0.02, + "intermediate_size": 8192, + "max_position_embeddings": 131072, + "model_type": "phi3", + "num_attention_heads": 32, + "num_hidden_layers": 32, + "num_key_value_heads": 32, + "original_max_position_embeddings": 4096, + "pad_token_id": 32000, + "resid_pdrop": 0.0, + "rms_norm_eps": 1e-05, + "rope_scaling": { + "long_factor": [ + 1.0299999713897705, + 1.0499999523162842, + 1.0499999523162842, + 1.0799999237060547, + 1.2299998998641968, + 1.2299998998641968, + 1.2999999523162842, + 1.4499999284744263, + 1.5999999046325684, + 1.6499998569488525, + 1.8999998569488525, + 2.859999895095825, + 3.68999981880188, + 5.419999599456787, + 5.489999771118164, + 5.489999771118164, + 9.09000015258789, + 11.579999923706055, + 15.65999984741211, + 15.769999504089355, + 15.789999961853027, + 18.360000610351562, + 21.989999771118164, + 23.079999923706055, + 30.009998321533203, + 32.35000228881836, + 32.590003967285156, + 35.56000518798828, + 39.95000457763672, + 53.840003967285156, + 56.20000457763672, + 57.95000457763672, + 59.29000473022461, + 59.77000427246094, + 59.920005798339844, + 61.190006256103516, + 61.96000671386719, + 62.50000762939453, + 63.3700065612793, + 63.48000717163086, + 63.48000717163086, + 63.66000747680664, + 63.850006103515625, + 64.08000946044922, + 64.760009765625, + 64.80001068115234, + 64.81001281738281, + 64.81001281738281 + ], + "short_factor": [ + 1.05, + 1.05, + 1.05, + 1.1, + 1.1, + 1.1500000000000001, + 1.2000000000000002, + 1.2500000000000002, + 1.3000000000000003, + 1.3500000000000003, + 1.5000000000000004, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.000000000000001, + 2.0500000000000007, + 2.0500000000000007, + 2.0500000000000007, + 2.1000000000000005, + 2.1000000000000005, + 2.1000000000000005, + 2.1500000000000004, + 2.1500000000000004, + 2.3499999999999996, + 2.549999999999999, + 2.5999999999999988, + 2.5999999999999988, + 2.7499999999999982, + 2.849999999999998, + 2.849999999999998, + 2.9499999999999975 + ], + "type": "su" + }, + "rope_theta": 10000.0, + "sliding_window": 262144, + "tie_word_embeddings": false, + "torch_dtype": "bfloat16", + "transformers_version": "4.39.3", + "use_cache": false, + "vocab_size": 32064 +} diff --git a/configuration.json b/configuration.json new file mode 100644 index 0000000..bbeeda1 --- /dev/null +++ b/configuration.json @@ -0,0 +1 @@ +{"framework": "pytorch", "task": "text-generation", "allow_remote": true} \ No newline at end of file diff --git a/configuration_phi3.py b/configuration_phi3.py new file mode 100644 index 0000000..f4553db --- /dev/null +++ b/configuration_phi3.py @@ -0,0 +1,213 @@ +# coding=utf-8 +# Copyright 2024 Microsoft and the HuggingFace Inc. team. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" Phi-3 model configuration""" + + +from transformers.configuration_utils import PretrainedConfig +from transformers.utils import logging + + +logger = logging.get_logger(__name__) + +PHI3_PRETRAINED_CONFIG_ARCHIVE_MAP = { + "microsoft/Phi-3-mini-4k-instruct": "https://huggingface.co/microsoft/Phi-3-mini-4k-instruct/resolve/main/config.json", + "microsoft/Phi-3-mini-128k-instruct": "https://huggingface.co/microsoft/Phi-3-mini-128k-instruct/resolve/main/config.json", +} + + +class Phi3Config(PretrainedConfig): + r""" + This is the configuration class to store the configuration of a [`Phi3Model`]. It is used to instantiate a Phi-3 + model according to the specified arguments, defining the model architecture. Instantiating a configuration with the + defaults will yield a similar configuration to that of the + [microsoft/Phi-3-mini-4k-instruct](https://huggingface.co/microsoft/Phi-3-mini-4k-instruct). + + Configuration objects inherit from [`PretrainedConfig`] and can be used to control the model outputs. Read the + documentation from [`PretrainedConfig`] for more information. + + Args: + vocab_size (`int`, *optional*, defaults to 32064): + Vocabulary size of the Phi-3 model. Defines the number of different tokens that can be represented by the + `inputs_ids` passed when calling [`Phi3Model`]. + hidden_size (`int`, *optional*, defaults to 3072): + Dimension of the hidden representations. + intermediate_size (`int`, *optional*, defaults to 8192): + Dimension of the MLP representations. + num_hidden_layers (`int`, *optional*, defaults to 32): + Number of hidden layers in the Transformer decoder. + num_attention_heads (`int`, *optional*, defaults to 32): + Number of attention heads for each attention layer in the Transformer decoder. + num_key_value_heads (`int`, *optional*): + This is the number of key_value heads that should be used to implement Grouped Query Attention. If + `num_key_value_heads=num_attention_heads`, the model will use Multi Head Attention (MHA), if + `num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When + converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed + by meanpooling all the original heads within that group. For more details checkout [this + paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to + `num_attention_heads`. + resid_pdrop (`float`, *optional*, defaults to 0.0): + Dropout probability for mlp outputs. + embd_pdrop (`int`, *optional*, defaults to 0.0): + The dropout ratio for the embeddings. + attention_dropout (`float`, *optional*, defaults to 0.0): + The dropout ratio after computing the attention scores. + hidden_act (`str` or `function`, *optional*, defaults to `"silu"`): + The non-linear activation function (function or string) in the decoder. + max_position_embeddings (`int`, *optional*, defaults to 4096): + The maximum sequence length that this model might ever be used with. + original_max_position_embeddings (`int`, *optional*, defaults to 4096): + The maximum sequence length that this model was trained with. This is used to determine the size of the + original RoPE embeddings when using long scaling. + initializer_range (`float`, *optional*, defaults to 0.02): + The standard deviation of the truncated_normal_initializer for initializing all weight matrices. + rms_norm_eps (`float`, *optional*, defaults to 1e-05): + The epsilon value used for the RMSNorm. + use_cache (`bool`, *optional*, defaults to `True`): + Whether or not the model should return the last key/values attentions (not used by all models). Only + relevant if `config.is_decoder=True`. Whether to tie weight embeddings or not. + tie_word_embeddings (`bool`, *optional*, defaults to `False`): + Whether to tie weight embeddings + rope_theta (`float`, *optional*, defaults to 10000.0): + The base period of the RoPE embeddings. + rope_scaling (`dict`, *optional*): + The scaling strategy for the RoPE embeddings. If `None`, no scaling is applied. If a dictionary, it must + contain the following keys: `type`, `short_factor` and `long_factor`. The `type` must be either `su` or `yarn` and + the `short_factor` and `long_factor` must be lists of numbers with the same length as the hidden size + divided by the number of attention heads divided by 2. + bos_token_id (`int`, *optional*, defaults to 1): + The id of the "beginning-of-sequence" token. + eos_token_id (`int`, *optional*, defaults to 32000): + The id of the "end-of-sequence" token. + pad_token_id (`int`, *optional*, defaults to 32000): + The id of the padding token. + sliding_window (`int`, *optional*): + Sliding window attention window size. If `None`, no sliding window is applied. + + Example: + + ```python + >>> from transformers import Phi3Model, Phi3Config + + >>> # Initializing a Phi-3 style configuration + >>> configuration = Phi3Config.from_pretrained("microsoft/Phi-3-mini-4k-instruct") + + >>> # Initializing a model from the configuration + >>> model = Phi3Model(configuration) + + >>> # Accessing the model configuration + >>> configuration = model.config + ```""" + + model_type = "phi3" + keys_to_ignore_at_inference = ["past_key_values"] + + def __init__( + self, + vocab_size=32064, + hidden_size=3072, + intermediate_size=8192, + num_hidden_layers=32, + num_attention_heads=32, + num_key_value_heads=None, + resid_pdrop=0.0, + embd_pdrop=0.0, + attention_dropout=0.0, + hidden_act="silu", + max_position_embeddings=4096, + original_max_position_embeddings=4096, + initializer_range=0.02, + rms_norm_eps=1e-5, + use_cache=True, + tie_word_embeddings=False, + rope_theta=10000.0, + rope_scaling=None, + bos_token_id=1, + eos_token_id=32000, + pad_token_id=32000, + sliding_window=None, + **kwargs, + ): + self.vocab_size = vocab_size + self.hidden_size = hidden_size + self.intermediate_size = intermediate_size + self.num_hidden_layers = num_hidden_layers + self.num_attention_heads = num_attention_heads + + if num_key_value_heads is None: + num_key_value_heads = num_attention_heads + + self.num_key_value_heads = num_key_value_heads + self.resid_pdrop = resid_pdrop + self.embd_pdrop = embd_pdrop + self.attention_dropout = attention_dropout + self.hidden_act = hidden_act + self.max_position_embeddings = max_position_embeddings + self.original_max_position_embeddings = original_max_position_embeddings + self.initializer_range = initializer_range + self.rms_norm_eps = rms_norm_eps + self.use_cache = use_cache + self.rope_theta = rope_theta + self.rope_scaling = rope_scaling + self._rope_scaling_validation() + self.sliding_window = sliding_window + + super().__init__( + bos_token_id=bos_token_id, + eos_token_id=eos_token_id, + pad_token_id=pad_token_id, + tie_word_embeddings=tie_word_embeddings, + **kwargs, + ) + + def _rope_scaling_validation(self): + """ + Validate the `rope_scaling` configuration. + """ + if self.rope_scaling is None: + return + + if not isinstance(self.rope_scaling, dict) or len(self.rope_scaling) != 3: + raise ValueError( + "`rope_scaling` must be a dictionary with three fields, `type`, `short_factor` and `long_factor`, " + f"got {self.rope_scaling}" + ) + rope_scaling_type = self.rope_scaling.get("type", None) + rope_scaling_short_factor = self.rope_scaling.get("short_factor", None) + rope_scaling_long_factor = self.rope_scaling.get("long_factor", None) + if rope_scaling_type is None or rope_scaling_type not in ["su", "yarn"]: + raise ValueError(f"`rope_scaling`'s type field must be one of ['su', 'yarn'], got {rope_scaling_type}") + if not ( + isinstance(rope_scaling_short_factor, list) + and all(isinstance(x, (int, float)) for x in rope_scaling_short_factor) + ): + raise ValueError( + f"`rope_scaling`'s short_factor field must be a list of numbers, got {rope_scaling_short_factor}" + ) + if not len(rope_scaling_short_factor) == self.hidden_size // self.num_attention_heads // 2: + raise ValueError( + f"`rope_scaling`'s short_factor field must have length {self.hidden_size // self.num_attention_heads // 2}, got {len(rope_scaling_short_factor)}" + ) + if not ( + isinstance(rope_scaling_long_factor, list) + and all(isinstance(x, (int, float)) for x in rope_scaling_long_factor) + ): + raise ValueError( + f"`rope_scaling`'s long_factor field must be a list of numbers, got {rope_scaling_long_factor}" + ) + if not len(rope_scaling_long_factor) == self.hidden_size // self.num_attention_heads // 2: + raise ValueError( + f"`rope_scaling`'s long_factor field must have length {self.hidden_size // self.num_attention_heads // 2}, got {len(rope_scaling_long_factor)}" + ) diff --git a/generation_config.json b/generation_config.json new file mode 100644 index 0000000..af0a96c --- /dev/null +++ b/generation_config.json @@ -0,0 +1,11 @@ +{ + "_from_model_config": true, + "bos_token_id": 1, + "eos_token_id": [ + 32000, + 32001, + 32007 + ], + "pad_token_id": 32000, + "transformers_version": "4.39.3" +} diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cbf1bda7604cc139dba1431b91a1ef4ad1639365 GIT binary patch literal 179002 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 KT_Phi3 +class Phi3RMSNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-6): + """ + Phi3RMSNorm is equivalent to T5LayerNorm + """ + super().__init__() + self.weight = nn.Parameter(torch.ones(hidden_size)) + self.variance_epsilon = eps + + def forward(self, hidden_states): + input_dtype = hidden_states.dtype + hidden_states = hidden_states.to(torch.float32) + variance = hidden_states.pow(2).mean(-1, keepdim=True) + hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon) + return self.weight * hidden_states.to(input_dtype) + + +# Copied from transformers.models.llama.modeling_llama._get_unpad_data +def _get_unpad_data(attention_mask): + seqlens_in_batch = attention_mask.sum(dim=-1, dtype=torch.int32) + indices = torch.nonzero(attention_mask.flatten(), as_tuple=False).flatten() + max_seqlen_in_batch = seqlens_in_batch.max().item() + cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.int32), (1, 0)) + return ( + indices, + cu_seqlens, + max_seqlen_in_batch, + ) + + +# Copied from transformers.models.gemma.modeling_gemma.GemmaRotaryEmbedding with gemma->phi3, Gemma->Phi3 +class Phi3RotaryEmbedding(nn.Module): + def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None): + super().__init__() + + self.dim = dim + self.max_position_embeddings = max_position_embeddings + self.base = base + self.register_buffer("inv_freq", None, persistent=False) + + @torch.no_grad() + def forward(self, x, position_ids, seq_len=None): + # x: [bs, num_attention_heads, seq_len, head_size] + if self.inv_freq is None: + self.inv_freq = 1.0 / ( + self.base ** (torch.arange(0, self.dim, 2, dtype=torch.int64, device=x.device).float() / self.dim) + ) + inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1) + position_ids_expanded = position_ids[:, None, :].float() + # Force float32 since bfloat16 loses precision on long contexts + # See https://github.com/huggingface/transformers/pull/29285 + device_type = x.device.type + device_type = device_type if isinstance(device_type, str) and device_type != "mps" else "cpu" + with torch.autocast(device_type=device_type, enabled=False): + freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2) + emb = torch.cat((freqs, freqs), dim=-1) + cos = emb.cos() + sin = emb.sin() + return cos.to(dtype=x.dtype), sin.to(dtype=x.dtype) + + +class Phi3SuScaledRotaryEmbedding(Phi3RotaryEmbedding): + def __init__(self, dim, config, device=None): + super().__init__(dim, config.max_position_embeddings, config.rope_theta, device) + + self.short_factor = config.rope_scaling["short_factor"] + self.long_factor = config.rope_scaling["long_factor"] + self.original_max_position_embeddings = config.original_max_position_embeddings + + @torch.no_grad() + def forward(self, x, position_ids, seq_len=None): + seq_len = torch.max(position_ids) + 1 + if seq_len > self.original_max_position_embeddings: + ext_factors = torch.tensor(self.long_factor, dtype=torch.float32, device=x.device) + else: + ext_factors = torch.tensor(self.short_factor, dtype=torch.float32, device=x.device) + + inv_freq_shape = torch.arange(0, self.dim, 2, dtype=torch.int64, device=x.device).float() / self.dim + self.inv_freq = 1.0 / (ext_factors * self.base**inv_freq_shape) + + inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1) + position_ids_expanded = position_ids[:, None, :].float() + + # Force float32 since bfloat16 loses precision on long contexts + # See https://github.com/huggingface/transformers/pull/29285 + device_type = x.device.type + device_type = device_type if isinstance(device_type, str) and device_type != "mps" else "cpu" + with torch.autocast(device_type=device_type, enabled=False): + freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2) + emb = torch.cat((freqs, freqs), dim=-1) + + scale = self.max_position_embeddings / self.original_max_position_embeddings + if scale <= 1.0: + scaling_factor = 1.0 + else: + scaling_factor = math.sqrt(1 + math.log(scale) / math.log(self.original_max_position_embeddings)) + + cos = emb.cos() * scaling_factor + sin = emb.sin() * scaling_factor + return cos.to(dtype=x.dtype), sin.to(dtype=x.dtype) + + +class Phi3YarnScaledRotaryEmbedding(Phi3RotaryEmbedding): + def __init__(self, dim, config, device=None): + super().__init__(dim, config.max_position_embeddings, config.rope_theta, device) + + self.short_factor = config.rope_scaling["short_factor"] + self.long_factor = config.rope_scaling["long_factor"] + self.original_max_position_embeddings = config.original_max_position_embeddings + + @torch.no_grad() + def forward(self, x, position_ids, seq_len=None): + seq_len = torch.max(position_ids) + 1 + if seq_len > self.original_max_position_embeddings: + ext_factors = torch.tensor(self.long_factor, dtype=torch.float32, device=x.device) + else: + ext_factors = torch.tensor(self.short_factor, dtype=torch.float32, device=x.device) + + inv_freq_shape = torch.arange(0, self.dim, 2, dtype=torch.int64, device=x.device).float() / self.dim + self.inv_freq = 1.0 / (ext_factors * self.base**inv_freq_shape) + + inv_freq_expanded = self.inv_freq[None, :, None].float().expand(position_ids.shape[0], -1, 1) + position_ids_expanded = position_ids[:, None, :].float() + + # Force float32 since bfloat16 loses precision on long contexts + # See https://github.com/huggingface/transformers/pull/29285 + device_type = x.device.type + device_type = device_type if isinstance(device_type, str) and device_type != "mps" else "cpu" + with torch.autocast(device_type=device_type, enabled=False): + freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2) + emb = torch.cat((freqs, freqs), dim=-1) + + scale = self.max_position_embeddings / self.original_max_position_embeddings + if scale <= 1.0: + scaling_factor = 1.0 + else: + scaling_factor = 0.1 * math.log(scale) + 1.0 + + cos = emb.cos() * scaling_factor + sin = emb.sin() * scaling_factor + return cos.to(dtype=x.dtype), sin.to(dtype=x.dtype) + + +# Copied from transformers.models.llama.modeling_llama.rotate_half +def rotate_half(x): + """Rotates half the hidden dims of the input.""" + x1 = x[..., : x.shape[-1] // 2] + x2 = x[..., x.shape[-1] // 2 :] + return torch.cat((-x2, x1), dim=-1) + + +# Copied from transformers.models.llama.modeling_llama.apply_rotary_pos_emb +def apply_rotary_pos_emb(q, k, cos, sin, position_ids=None, unsqueeze_dim=1): + """Applies Rotary Position Embedding to the query and key tensors. + + Args: + q (`torch.Tensor`): The query tensor. + k (`torch.Tensor`): The key tensor. + cos (`torch.Tensor`): The cosine part of the rotary embedding. + sin (`torch.Tensor`): The sine part of the rotary embedding. + position_ids (`torch.Tensor`, *optional*): + Deprecated and unused. + unsqueeze_dim (`int`, *optional*, defaults to 1): + The 'unsqueeze_dim' argument specifies the dimension along which to unsqueeze cos[position_ids] and + sin[position_ids] so that they can be properly broadcasted to the dimensions of q and k. For example, note + that cos[position_ids] and sin[position_ids] have the shape [batch_size, seq_len, head_dim]. Then, if q and + k have the shape [batch_size, heads, seq_len, head_dim], then setting unsqueeze_dim=1 makes + cos[position_ids] and sin[position_ids] broadcastable to the shapes of q and k. Similarly, if q and k have + the shape [batch_size, seq_len, heads, head_dim], then set unsqueeze_dim=2. + Returns: + `tuple(torch.Tensor)` comprising of the query and key tensors rotated using the Rotary Position Embedding. + """ + cos = cos.unsqueeze(unsqueeze_dim) + sin = sin.unsqueeze(unsqueeze_dim) + q_embed = (q * cos) + (rotate_half(q) * sin) + k_embed = (k * cos) + (rotate_half(k) * sin) + return q_embed, k_embed + + +class Phi3MLP(nn.Module): + def __init__(self, config): + super().__init__() + + self.config = config + self.gate_up_proj = nn.Linear(config.hidden_size, 2 * config.intermediate_size, bias=False) + self.down_proj = nn.Linear(config.intermediate_size, config.hidden_size, bias=False) + + self.activation_fn = ACT2FN[config.hidden_act] + + def forward(self, hidden_states: torch.FloatTensor) -> torch.FloatTensor: + up_states = self.gate_up_proj(hidden_states) + + gate, up_states = up_states.chunk(2, dim=-1) + up_states = up_states * self.activation_fn(gate) + + return self.down_proj(up_states) + + +# Copied from transformers.models.llama.modeling_llama.repeat_kv with llama->phi +def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor: + """ + This is the equivalent of torch.repeat_interleave(x, dim=1, repeats=n_rep). The hidden states go from (batch, + num_key_value_heads, seqlen, head_dim) to (batch, num_attention_heads, seqlen, head_dim) + """ + batch, num_key_value_heads, slen, head_dim = hidden_states.shape + if n_rep == 1: + return hidden_states + hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim) + return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim) + + +class Phi3Attention(nn.Module): + """Multi-headed attention from 'Attention Is All You Need' paper""" + + def __init__(self, config: Phi3Config, layer_idx: Optional[int] = None): + super().__init__() + self.config = config + self.layer_idx = layer_idx + if layer_idx is None: + logger.warning_once( + f"Instantiating {self.__class__.__name__} without passing a `layer_idx` is not recommended and will " + "lead to errors during the forward call if caching is used. Please make sure to provide a `layer_idx` " + "when creating this class." + ) + + self.attention_dropout = config.attention_dropout + self.hidden_size = config.hidden_size + self.num_heads = config.num_attention_heads + self.head_dim = self.hidden_size // self.num_heads + self.num_key_value_heads = config.num_key_value_heads + self.num_key_value_groups = self.num_heads // self.num_key_value_heads + self.max_position_embeddings = config.max_position_embeddings + self.original_max_position_embeddings = config.original_max_position_embeddings + self.rope_theta = config.rope_theta + self.rope_scaling = config.rope_scaling + self.is_causal = True + + if (self.head_dim * self.num_heads) != self.hidden_size: + raise ValueError( + f"hidden_size must be divisible by num_heads (got `hidden_size`: {self.hidden_size}" + f" and `num_heads`: {self.num_heads})." + ) + + op_size = self.num_heads * self.head_dim + 2 * (self.num_key_value_heads * self.head_dim) + self.o_proj = nn.Linear(self.num_heads * self.head_dim, self.hidden_size, bias=False) + self.qkv_proj = nn.Linear(self.hidden_size, op_size, bias=False) + self._init_rope() + + def _init_rope(self): + if self.rope_scaling is None: + self.rotary_emb = Phi3RotaryEmbedding( + self.head_dim, + max_position_embeddings=self.max_position_embeddings, + base=self.rope_theta, + ) + else: + scaling_type = self.config.rope_scaling["type"] + if scaling_type == "su": + self.rotary_emb = Phi3SuScaledRotaryEmbedding(self.head_dim, self.config) + elif scaling_type == "yarn": + self.rotary_emb = Phi3YarnScaledRotaryEmbedding(self.head_dim, self.config) + else: + raise ValueError(f"Unknown RoPE scaling type {scaling_type}") + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + logger.warning_once("You are not running the flash-attention implementation, expect numerical differences.") + + bsz, q_len, _ = hidden_states.size() + + qkv = self.qkv_proj(hidden_states) + query_pos = self.num_heads * self.head_dim + query_states = qkv[..., :query_pos] + key_states = qkv[..., query_pos : query_pos + self.num_key_value_heads * self.head_dim] + value_states = qkv[..., query_pos + self.num_key_value_heads * self.head_dim :] + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + cos, sin = self.rotary_emb(value_states, position_ids, seq_len=kv_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) / math.sqrt(self.head_dim) + + if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len): + raise ValueError( + f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is" + f" {attn_weights.size()}" + ) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + attn_weights = attn_weights + attention_mask + + # upcast attention to fp32 + attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(value_states.dtype) + attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training) + + attn_output = torch.matmul(attn_weights, value_states) + + if attn_output.size() != (bsz, self.num_heads, q_len, self.head_dim): + raise ValueError( + f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.head_dim)}, but is" + f" {attn_output.size()}" + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + +class Phi3FlashAttention2(Phi3Attention): + """ + Phi-3 flash attention module. This module inherits from `Phi3Attention` as the weights of the module stays + untouched. The only required change would be on the forward pass where it needs to correctly call the public API of + flash attention and deal with padding tokens in case the input contains any of them. + """ + + # Copied from transformers.models.llama.modeling_llama.LlamaFlashAttention2.__init__ + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # TODO: Should be removed once Flash Attention for RoCm is bumped to 2.1. + # flash_attn<2.1 generates top-left aligned causal mask, while what is needed here is bottom-right alignement, that was made default for flash_attn>=2.1. This attribute is used to handle this difference. Reference: https://github.com/Dao-AILab/flash-attention/releases/tag/v2.1.0. + # Beware that with flash_attn<2.1, using q_seqlen != k_seqlen (except for the case q_seqlen == 1) produces a wrong mask (top-left). + self._flash_attn_uses_top_left_mask = not is_flash_attn_greater_or_equal_2_10() + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.LongTensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + **kwargs, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + # Phi3FlashAttention2 attention does not support output_attentions + + if not _flash_supports_window_size: + logger.warning_once( + "The current flash attention version does not support sliding window attention. Please use `attn_implementation='eager'` or upgrade flash-attn library." + ) + raise ValueError("The current flash attention version does not support sliding window attention.") + + output_attentions = False + + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + + # overwrite attention_mask with padding_mask + attention_mask = kwargs.pop("padding_mask") + + bsz, q_len, _ = hidden_states.size() + + qkv = self.qkv_proj(hidden_states) + query_pos = self.num_heads * self.head_dim + query_states = qkv[..., :query_pos] + key_states = qkv[..., query_pos : query_pos + self.num_key_value_heads * self.head_dim] + value_states = qkv[..., query_pos + self.num_key_value_heads * self.head_dim :] + + # Flash attention requires the input to have the shape + # batch_size x seq_length x head_dim x hidden_dim + # therefore we just need to keep the original shape + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + if self.layer_idx is None: + raise ValueError( + f"The cache structure has changed since version v4.36. If you are using {self.__class__.__name__} " + "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class " + "with a layer index." + ) + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + + # Because the input can be padded, the absolute sequence length depends on the max position id. + rotary_seq_len = max(kv_seq_len, position_ids[:, -1].max().item()) + 1 + cos, sin = self.rotary_emb(value_states, position_ids, seq_len=rotary_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + use_sliding_windows = ( + _flash_supports_window_size + and getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + ) + + if past_key_value is not None: + # Activate slicing cache only if the config has a value `sliding_windows` attribute + cache_has_contents = past_key_value.get_seq_length(self.layer_idx) > 0 + if ( + getattr(self.config, "sliding_window", None) is not None + and kv_seq_len > self.config.sliding_window + and cache_has_contents + ): + slicing_tokens = 1 - self.config.sliding_window + + past_key = past_key_value[self.layer_idx][0] + past_value = past_key_value[self.layer_idx][1] + + past_key = past_key[:, :, slicing_tokens:, :].contiguous() + past_value = past_value[:, :, slicing_tokens:, :].contiguous() + + if past_key.shape[-2] != self.config.sliding_window - 1: + raise ValueError( + f"past key must have a shape of (`batch_size, num_heads, self.config.sliding_window-1, head_dim`), got" + f" {past_key.shape}" + ) + + if attention_mask is not None: + attention_mask = attention_mask[:, slicing_tokens:] + attention_mask = torch.cat([attention_mask, torch.ones_like(attention_mask[:, -1:])], dim=-1) + + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + # repeat k/v heads if n_kv_heads < n_heads + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + attn_dropout = self.attention_dropout if self.training else 0.0 + + # In PEFT, usually we cast the layer norms in float32 for training stability reasons + # therefore the input hidden states gets silently casted in float32. Hence, we need + # cast them back in the correct dtype just to be sure everything works as expected. + # This might slowdown training & inference so it is recommended to not cast the LayerNorms + # in fp32. + + if query_states.dtype == torch.float32: + if torch.is_autocast_enabled(): + target_dtype = torch.get_autocast_gpu_dtype() + # Handle the case where the model is quantized + elif hasattr(self.config, "_pre_quantization_dtype"): + target_dtype = self.config._pre_quantization_dtype + else: + target_dtype = self.qkv_proj.weight.dtype + + logger.warning_once( + f"The input hidden states seems to be silently casted in float32, this might be related to" + f" the fact you have upcasted embedding or layer norm layers in float32. We will cast back the input in" + f" {target_dtype}." + ) + + query_states = query_states.to(target_dtype) + key_states = key_states.to(target_dtype) + value_states = value_states.to(target_dtype) + + # Reashape to the expected shape for Flash Attention + query_states = query_states.transpose(1, 2) + key_states = key_states.transpose(1, 2) + value_states = value_states.transpose(1, 2) + + attn_output = self._flash_attention_forward( + query_states, + key_states, + value_states, + attention_mask, + q_len, + dropout=attn_dropout, + use_sliding_windows=use_sliding_windows, + ) + + attn_output = attn_output.reshape(bsz, q_len, self.hidden_size).contiguous() + attn_output = self.o_proj(attn_output) + + if not output_attentions: + attn_weights = None + + return attn_output, attn_weights, past_key_value + + # Copied from transformers.models.mistral.modeling_mistral.MistralFlashAttention2._flash_attention_forward + def _flash_attention_forward( + self, + query_states, + key_states, + value_states, + attention_mask, + query_length, + dropout=0.0, + softmax_scale=None, + use_sliding_windows=False, + ): + """ + Calls the forward method of Flash Attention - if the input hidden states contain at least one padding token + first unpad the input, then computes the attention scores and pad the final attention scores. + + Args: + query_states (`torch.Tensor`): + Input query states to be passed to Flash Attention API + key_states (`torch.Tensor`): + Input key states to be passed to Flash Attention API + value_states (`torch.Tensor`): + Input value states to be passed to Flash Attention API + attention_mask (`torch.Tensor`): + The padding mask - corresponds to a tensor of size `(batch_size, seq_len)` where 0 stands for the + position of padding tokens and 1 for the position of non-padding tokens. + dropout (`float`): + Attention dropout + softmax_scale (`float`, *optional*): + The scaling of QK^T before applying softmax. Default to 1 / sqrt(head_dim) + use_sliding_windows (`bool`, *optional*): + Whether to activate sliding window attention. + """ + if not self._flash_attn_uses_top_left_mask: + causal = self.is_causal + else: + # TODO: Remove the `query_length != 1` check once Flash Attention for RoCm is bumped to 2.1. For details, please see the comment in LlamaFlashAttention2 __init__. + causal = self.is_causal and query_length != 1 + + # Contains at least one padding token in the sequence + if attention_mask is not None: + batch_size = query_states.shape[0] + query_states, key_states, value_states, indices_q, cu_seq_lens, max_seq_lens = self._upad_input( + query_states, key_states, value_states, attention_mask, query_length + ) + + cu_seqlens_q, cu_seqlens_k = cu_seq_lens + max_seqlen_in_batch_q, max_seqlen_in_batch_k = max_seq_lens + + if not use_sliding_windows: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output_unpad = flash_attn_varlen_func( + query_states, + key_states, + value_states, + cu_seqlens_q=cu_seqlens_q, + cu_seqlens_k=cu_seqlens_k, + max_seqlen_q=max_seqlen_in_batch_q, + max_seqlen_k=max_seqlen_in_batch_k, + dropout_p=dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + attn_output = pad_input(attn_output_unpad, indices_q, batch_size, query_length) + else: + if not use_sliding_windows: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + ) + else: + attn_output = flash_attn_func( + query_states, + key_states, + value_states, + dropout, + softmax_scale=softmax_scale, + causal=causal, + window_size=(self.config.sliding_window, self.config.sliding_window), + ) + + return attn_output + + # Copied from transformers.models.mistral.modeling_mistral.MistralFlashAttention2._upad_input + def _upad_input(self, query_layer, key_layer, value_layer, attention_mask, query_length): + batch_size, kv_seq_len, num_heads, head_dim = key_layer.shape + + # On the first iteration we need to properly re-create the padding mask + # by slicing it on the proper place + if kv_seq_len != attention_mask.shape[-1]: + attention_mask_num_tokens = attention_mask.shape[-1] + attention_mask = attention_mask[:, attention_mask_num_tokens - kv_seq_len :] + + indices_k, cu_seqlens_k, max_seqlen_in_batch_k = _get_unpad_data(attention_mask) + + key_layer = index_first_axis(key_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + value_layer = index_first_axis(value_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k) + + if query_length == kv_seq_len: + query_layer = index_first_axis( + query_layer.reshape(batch_size * kv_seq_len, num_heads, head_dim), indices_k + ) + cu_seqlens_q = cu_seqlens_k + max_seqlen_in_batch_q = max_seqlen_in_batch_k + indices_q = indices_k + elif query_length == 1: + max_seqlen_in_batch_q = 1 + cu_seqlens_q = torch.arange( + batch_size + 1, dtype=torch.int32, device=query_layer.device + ) # There is a memcpy here, that is very bad. + indices_q = cu_seqlens_q[:-1] + query_layer = query_layer.squeeze(1) + else: + # The -q_len: slice assumes left padding. + attention_mask = attention_mask[:, -query_length:] + query_layer, indices_q, cu_seqlens_q, max_seqlen_in_batch_q = unpad_input(query_layer, attention_mask) + + return ( + query_layer, + key_layer, + value_layer, + indices_q, + (cu_seqlens_q, cu_seqlens_k), + (max_seqlen_in_batch_q, max_seqlen_in_batch_k), + ) + + +# copied from transformers.models.llama.modeling_llama.LlamaSdpaAttention with Llama->Phi3 +# TODO @Arthur no longer copied from LLama after static cache +class Phi3SdpaAttention(Phi3Attention): + """ + Phi3 attention module using torch.nn.functional.scaled_dot_product_attention. This module inherits from + `Phi3Attention` as the weights of the module stays untouched. The only changes are on the forward pass to adapt to + SDPA API. + """ + + # Adapted from Phi3Attention.forward + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Cache] = None, + output_attentions: bool = False, + use_cache: bool = False, + ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]: + if output_attentions: + # TODO: Improve this warning with e.g. `model.config.attn_implementation = "manual"` once this is implemented. + logger.warning_once( + "Phi3Model is using Phi3SdpaAttention, but `torch.nn.functional.scaled_dot_product_attention` does not support `output_attentions=True`. Falling back to the manual attention implementation, " + 'but specifying the manual implementation will be required from Transformers version v5.0.0 onwards. This warning can be removed using the argument `attn_implementation="eager"` when loading the model.' + ) + return super().forward( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + bsz, q_len, _ = hidden_states.size() + + qkv = self.qkv_proj(hidden_states) + query_pos = self.num_heads * self.head_dim + query_states = qkv[..., :query_pos] + key_states = qkv[..., query_pos : query_pos + self.num_key_value_heads * self.head_dim] + value_states = qkv[..., query_pos + self.num_key_value_heads * self.head_dim :] + + query_states = query_states.view(bsz, q_len, self.num_heads, self.head_dim).transpose(1, 2) + key_states = key_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + value_states = value_states.view(bsz, q_len, self.num_key_value_heads, self.head_dim).transpose(1, 2) + + kv_seq_len = key_states.shape[-2] + if past_key_value is not None: + kv_seq_len += past_key_value.get_usable_length(kv_seq_len, self.layer_idx) + cos, sin = self.rotary_emb(value_states, position_ids, seq_len=kv_seq_len) + + query_states, key_states = apply_rotary_pos_emb(query_states, key_states, cos, sin, position_ids) + + if past_key_value is not None: + cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models + key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs) + + key_states = repeat_kv(key_states, self.num_key_value_groups) + value_states = repeat_kv(value_states, self.num_key_value_groups) + + if attention_mask is not None: + if attention_mask.size() != (bsz, 1, q_len, kv_seq_len): + raise ValueError( + f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}" + ) + + # SDPA with memory-efficient backend is currently (torch==2.1.2) bugged with non-contiguous inputs with custom attn_mask, + # Reference: https://github.com/pytorch/pytorch/issues/112577. + if query_states.device.type == "cuda" and attention_mask is not None: + query_states = query_states.contiguous() + key_states = key_states.contiguous() + value_states = value_states.contiguous() + + attn_output = torch.nn.functional.scaled_dot_product_attention( + query_states, + key_states, + value_states, + attn_mask=attention_mask, + dropout_p=self.attention_dropout if self.training else 0.0, + # The q_len > 1 is necessary to match with AttentionMaskConverter.to_causal_4d that does not create a causal mask in case q_len == 1. + is_causal=self.is_causal and attention_mask is None and q_len > 1, + ) + + attn_output = attn_output.transpose(1, 2).contiguous() + attn_output = attn_output.view(bsz, q_len, self.hidden_size) + + attn_output = self.o_proj(attn_output) + + return attn_output, None, past_key_value + + +PHI3_ATTENTION_CLASSES = { + "eager": Phi3Attention, + "flash_attention_2": Phi3FlashAttention2, + "sdpa": Phi3SdpaAttention, +} + + +class Phi3DecoderLayer(nn.Module): + def __init__(self, config: Phi3Config, layer_idx: int): + super().__init__() + + self.config = config + self.self_attn = PHI3_ATTENTION_CLASSES[config._attn_implementation](config, layer_idx=layer_idx) + + self.mlp = Phi3MLP(config) + self.input_layernorm = Phi3RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.resid_attn_dropout = nn.Dropout(config.resid_pdrop) + self.resid_mlp_dropout = nn.Dropout(config.resid_pdrop) + self.post_attention_layernorm = Phi3RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + def forward( + self, + hidden_states: torch.Tensor, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_value: Optional[Tuple[torch.Tensor]] = None, + output_attentions: Optional[bool] = False, + use_cache: Optional[bool] = False, + **kwargs, + ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]: + if "padding_mask" in kwargs: + warnings.warn( + "Passing `padding_mask` is deprecated and will be removed in v4.37. Please make sure use `attention_mask` instead.`" + ) + """ + Args: + hidden_states (`torch.FloatTensor`): + input to the layer of shape `(batch, seq_len, embed_dim)` + attention_mask (`torch.FloatTensor`, *optional*): attention mask of size + `(batch, 1, tgt_len, src_len)` where padding elements are indicated by very large negative values. + position_ids (`torch.LongTensor` of shape `({0})`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range + `[0, config.n_positions - 1]`. [What are position IDs?](../glossary#position-ids) + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under + returned tensors for more detail. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding + (see `past_key_values`). + past_key_value (`Tuple(torch.FloatTensor)`, *optional*): cached past key and value projection states + """ + + residual = hidden_states + + hidden_states = self.input_layernorm(hidden_states) + + # Self Attention + attn_outputs, self_attn_weights, present_key_value = self.self_attn( + hidden_states=hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_value, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = residual + self.resid_attn_dropout(attn_outputs) + + residual = hidden_states + hidden_states = self.post_attention_layernorm(hidden_states) + hidden_states = self.mlp(hidden_states) + hidden_states = residual + self.resid_mlp_dropout(hidden_states) + + outputs = (hidden_states,) + + if output_attentions: + outputs += (self_attn_weights,) + + if use_cache: + outputs += (present_key_value,) + + return outputs + + +PHI3_START_DOCSTRING = r""" + This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the + library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads + etc.) + + This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. + Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage + and behavior. + + Parameters: + config ([`Phi3Config`]): + Model configuration class with all the parameters of the model. Initializing with a config file does not + load the weights associated with the model, only the configuration. Check out the + [`~PreTrainedModel.from_pretrained`] method to load the model weights. +""" + + +@add_start_docstrings( + "The bare Phi-3 model outputting raw hidden-states without any specific head on top.", + PHI3_START_DOCSTRING, +) +class Phi3PreTrainedModel(PreTrainedModel): + config_class = Phi3Config + base_model_prefix = "model" + supports_gradient_checkpointing = True + _no_split_modules = ["Phi3DecoderLayer"] + _skip_keys_device_placement = "past_key_values" + _supports_flash_attn_2 = True + _supports_sdpa = False + _supports_cache_class = True + + _version = "0.0.5" + + def _init_weights(self, module): + std = self.config.initializer_range + if isinstance(module, nn.Linear): + module.weight.data.normal_(mean=0.0, std=std) + if module.bias is not None: + module.bias.data.zero_() + elif isinstance(module, nn.Embedding): + module.weight.data.normal_(mean=0.0, std=std) + if module.padding_idx is not None: + module.weight.data[module.padding_idx].zero_() + + +PHI3_INPUTS_DOCSTRING = r""" + Args: + input_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`): + Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide + it. + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + [What are input IDs?](../glossary#input-ids) + attention_mask (`torch.Tensor` of shape `(batch_size, sequence_length)`, *optional*): + Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: + + - 1 for tokens that are **not masked**, + - 0 for tokens that are **masked**. + + [What are attention masks?](../glossary#attention-mask) + + Indices can be obtained using [`AutoTokenizer`]. See [`PreTrainedTokenizer.encode`] and + [`PreTrainedTokenizer.__call__`] for details. + + If `past_key_values` is used, optionally only the last `input_ids` have to be input (see + `past_key_values`). + + If you want to change padding behavior, you should read [`modeling_opt._prepare_decoder_attention_mask`] + and modify to your needs. See diagram 1 in [the paper](https://arxiv.org/abs/1910.13461) for more + information on the default strategy. + + - 1 indicates the head is **not masked**, + - 0 indicates the head is **masked**. + position_ids (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): + Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, + config.n_positions - 1]`. + + [What are position IDs?](../glossary#position-ids) + past_key_values (`Cache` or `tuple(tuple(torch.FloatTensor))`, *optional*): + Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention + blocks) that can be used to speed up sequential decoding. This typically consists in the `past_key_values` + returned by the model at a previous stage of decoding, when `use_cache=True` or `config.use_cache=True`. + + Two formats are allowed: + - a [`~cache_utils.Cache`] instance; + - Tuple of `tuple(torch.FloatTensor)` of length `config.n_layers`, with each tuple having 2 tensors of + shape `(batch_size, num_heads, sequence_length, embed_size_per_head)`). This is also known as the legacy + cache format. + + The model will output the same cache format that is fed as input. If no `past_key_values` are passed, the + legacy cache format will be returned. + + If `past_key_values` are used, the user can optionally input only the last `input_ids` (those that don't + have their past key value states given to this model) of shape `(batch_size, 1)` instead of all `input_ids` + of shape `(batch_size, sequence_length)`. + inputs_embeds (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`, *optional*): + Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This + is useful if you want more control over how to convert `input_ids` indices into associated vectors than the + model's internal embedding lookup matrix. + use_cache (`bool`, *optional*): + If set to `True`, `past_key_values` key value states are returned and can be used to speed up decoding (see + `past_key_values`). + output_attentions (`bool`, *optional*): + Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned + tensors for more detail. + output_hidden_states (`bool`, *optional*): + Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for + more detail. + return_dict (`bool`, *optional*): + Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. +""" + + +@add_start_docstrings( + "The bare Phi-3 model outputting raw hidden-states without any specific head on top.", + PHI3_START_DOCSTRING, +) +class Phi3Model(Phi3PreTrainedModel): + """ + Transformer decoder consisting of *config.num_hidden_layers* layers. Each layer is a [`Phi3DecoderLayer`] + + Args: + config: Phi3Config + """ + + def __init__(self, config: Phi3Config): + super().__init__(config) + self.padding_idx = config.pad_token_id + self.vocab_size = config.vocab_size + + self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx) + self.embed_dropout = nn.Dropout(config.embd_pdrop) + self.layers = nn.ModuleList( + [Phi3DecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)] + ) + self._attn_implementation = config._attn_implementation + self.norm = Phi3RMSNorm(config.hidden_size, eps=config.rms_norm_eps) + + self.gradient_checkpointing = False + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.embed_tokens + + def set_input_embeddings(self, value): + self.embed_tokens = value + + @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, BaseModelOutputWithPast]: + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + use_cache = use_cache if use_cache is not None else self.config.use_cache + + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # retrieve input_ids and inputs_embeds + if input_ids is not None and inputs_embeds is not None: + raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time") + elif input_ids is not None: + batch_size, seq_length = input_ids.shape[:2] + elif inputs_embeds is not None: + batch_size, seq_length = inputs_embeds.shape[:2] + else: + raise ValueError("You have to specify either input_ids or inputs_embeds") + + past_key_values_length = 0 + + if self.gradient_checkpointing and self.training: + if use_cache: + logger.warning_once( + "`use_cache=True` is incompatible with gradient checkpointing. Setting `use_cache=False`..." + ) + use_cache = False + + if use_cache: + use_legacy_cache = not isinstance(past_key_values, Cache) + if use_legacy_cache: + past_key_values = DynamicCache.from_legacy_cache(past_key_values) + past_key_values_length = past_key_values.get_usable_length(seq_length) + + if position_ids is None: + device = input_ids.device if input_ids is not None else inputs_embeds.device + position_ids = torch.arange( + past_key_values_length, seq_length + past_key_values_length, dtype=torch.long, device=device + ) + position_ids = position_ids.unsqueeze(0).view(-1, seq_length) + else: + position_ids = position_ids.view(-1, seq_length).long() + + if inputs_embeds is None: + inputs_embeds = self.embed_tokens(input_ids) + + if attention_mask is not None and self._attn_implementation == "flash_attention_2" and use_cache: + is_padding_right = attention_mask[:, -1].sum().item() != batch_size + if is_padding_right: + raise ValueError( + "You are attempting to perform batched generation with padding_side='right'" + " this may lead to unexpected behaviour for Flash Attention version of Phi3. Make sure to " + " call `tokenizer.padding_side = 'left'` before tokenizing the input. " + ) + + if self._attn_implementation == "flash_attention_2": + # 2d mask is passed through the layers + attention_mask = attention_mask if (attention_mask is not None and 0 in attention_mask) else None + else: + # 4d mask is passed through the layers + attention_mask = _prepare_4d_causal_attention_mask( + attention_mask, + (batch_size, seq_length), + inputs_embeds, + past_key_values_length, + sliding_window=self.config.sliding_window, + ) + + hidden_states = inputs_embeds + + # decoder layers + all_hidden_states = () if output_hidden_states else None + all_self_attns = () if output_attentions else None + next_decoder_cache = None + + for decoder_layer in self.layers: + if output_hidden_states: + all_hidden_states += (hidden_states,) + + if self.gradient_checkpointing and self.training: + layer_outputs = self._gradient_checkpointing_func( + decoder_layer.__call__, + hidden_states, + attention_mask, + position_ids, + past_key_values, + output_attentions, + use_cache, + ) + else: + layer_outputs = decoder_layer( + hidden_states, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_value=past_key_values, + output_attentions=output_attentions, + use_cache=use_cache, + ) + + hidden_states = layer_outputs[0] + + if use_cache: + next_decoder_cache = layer_outputs[2 if output_attentions else 1] + + if output_attentions: + all_self_attns += (layer_outputs[1],) + + hidden_states = self.norm(hidden_states) + + # add hidden states from the last decoder layer + if output_hidden_states: + all_hidden_states += (hidden_states,) + + next_cache = None + if use_cache: + next_cache = next_decoder_cache.to_legacy_cache() if use_legacy_cache else next_decoder_cache + if not return_dict: + return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None) + return BaseModelOutputWithPast( + last_hidden_state=hidden_states, + past_key_values=next_cache, + hidden_states=all_hidden_states, + attentions=all_self_attns, + ) + + +class Phi3ForCausalLM(Phi3PreTrainedModel): + _tied_weights_keys = ["lm_head.weight"] + + # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.__init__ with Llama->Phi3 + def __init__(self, config): + super().__init__(config) + self.model = Phi3Model(config) + self.vocab_size = config.vocab_size + self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.get_input_embeddings + def get_input_embeddings(self): + return self.model.embed_tokens + + # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.set_input_embeddings + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.get_output_embeddings + def get_output_embeddings(self): + return self.lm_head + + # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.set_output_embeddings + def set_output_embeddings(self, new_embeddings): + self.lm_head = new_embeddings + + # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.set_decoder + def set_decoder(self, decoder): + self.model = decoder + + # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM.get_decoder + def get_decoder(self): + return self.model + + # Ignore copy + @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING) + @replace_return_docstrings(output_type=CausalLMOutputWithPast, config_class=_CONFIG_FOR_DOC) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, CausalLMOutputWithPast]: + r""" + Args: + 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.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.vocab_size]`. + + Returns: + + Example: + + ```python + >>> from transformers import AutoTokenizer, Phi3ForCausalLM + + >>> model = Phi3ForCausalLM.from_pretrained("microsoft/phi-3-mini-4k-instruct") + >>> tokenizer = AutoTokenizer.from_pretrained("microsoft/phi-3-mini-4k-instruct") + + >>> prompt = "This is an example script ." + >>> inputs = tokenizer(prompt, return_tensors="pt") + + >>> # Generate + >>> generate_ids = model.generate(inputs.input_ids, max_length=30) + >>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] + 'This is an example script .\n Certainly! Below is a sample script that demonstrates a simple task, such as calculating the sum' + ```""" + + output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions + output_hidden_states = ( + output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states + ) + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + # decoder outputs consists of (dec_features, layer_state, dec_hidden, dec_attn) + outputs = self.model( + input_ids=input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = outputs[0] + logits = self.lm_head(hidden_states) + logits = logits.float() + + loss = None + if labels is not None: + # Shift so that tokens < n predict n + shift_logits = logits[..., :-1, :].contiguous() + shift_labels = labels[..., 1:].contiguous() + # Flatten the tokens + loss_fct = CrossEntropyLoss() + shift_logits = shift_logits.view(-1, self.config.vocab_size) + shift_labels = shift_labels.view(-1) + # Enable model parallelism + shift_labels = shift_labels.to(shift_logits.device) + loss = loss_fct(shift_logits, shift_labels) + + if not return_dict: + output = (logits,) + outputs[1:] + return (loss,) + output if loss is not None else output + + return CausalLMOutputWithPast( + loss=loss, + logits=logits, + past_key_values=outputs.past_key_values, + hidden_states=outputs.hidden_states, + attentions=outputs.attentions, + ) + + # Copied from transformers.models.persimmon.modeling_persimmon.PersimmonForCausalLM.prepare_inputs_for_generation + def prepare_inputs_for_generation( + self, input_ids, past_key_values=None, attention_mask=None, inputs_embeds=None, **kwargs + ): + if past_key_values is not None: + if isinstance(past_key_values, Cache): + cache_length = past_key_values.get_seq_length() + past_length = past_key_values.seen_tokens + max_cache_length = past_key_values.get_max_length() + else: + cache_length = past_length = past_key_values[0][0].shape[2] + max_cache_length = None + + # Keep only the unprocessed tokens: + # 1 - If the length of the attention_mask exceeds the length of input_ids, then we are in a setting where + # some of the inputs are exclusively passed as part of the cache (e.g. when passing input_embeds as + # input) + if attention_mask is not None and attention_mask.shape[1] > input_ids.shape[1]: + input_ids = input_ids[:, -(attention_mask.shape[1] - past_length) :] + # 2 - If the past_length is smaller than input_ids', then input_ids holds all input tokens. We can discard + # input_ids based on the past_length. + elif past_length < input_ids.shape[1]: + input_ids = input_ids[:, past_length:] + # 3 - Otherwise (past_length >= input_ids.shape[1]), let's assume input_ids only has unprocessed tokens. + + # If we are about to go beyond the maximum cache length, we need to crop the input attention mask. + if ( + max_cache_length is not None + and attention_mask is not None + and cache_length + input_ids.shape[1] > max_cache_length + ): + attention_mask = attention_mask[:, -max_cache_length:] + + position_ids = kwargs.get("position_ids", None) + if attention_mask is not None and position_ids is None: + # create position_ids on the fly for batch generation + position_ids = attention_mask.long().cumsum(-1) - 1 + position_ids.masked_fill_(attention_mask == 0, 1) + if past_key_values: + position_ids = position_ids[:, -input_ids.shape[1] :] + + # if `inputs_embeds` are passed, we only want to use them in the 1st generation step + if inputs_embeds is not None and past_key_values is None: + model_inputs = {"inputs_embeds": inputs_embeds} + else: + model_inputs = {"input_ids": input_ids} + + model_inputs.update( + { + "position_ids": position_ids, + "past_key_values": past_key_values, + "use_cache": kwargs.get("use_cache"), + "attention_mask": attention_mask, + } + ) + return model_inputs + + @staticmethod + # Copied from transformers.models.llama.modeling_llama.LlamaForCausalLM._reorder_cache + def _reorder_cache(past_key_values, beam_idx): + reordered_past = () + for layer_past in past_key_values: + reordered_past += ( + tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past), + ) + return reordered_past + + +@add_start_docstrings( + """ + The [`Phi3Model`] with a sequence classification head on top (linear layer). + + [`Phi3ForSequenceClassification`] uses the last token in order to do the classification, as other causal models + (e.g. GPT-2) do. + + Since it does classification on the last token, it requires to know the position of the last token. If a + `pad_token_id` is defined in the configuration, it finds the last token that is not a padding token in each row. If + no `pad_token_id` is defined, it simply takes the last value in each row of the batch. Since it cannot guess the + padding tokens when `inputs_embeds` are passed instead of `input_ids`, it does the same (take the last value in + each row of the batch). + """, + PHI3_START_DOCSTRING, +) +# Copied from transformers.models.llama.modeling_llama.LlamaForSequenceClassification with Llama->Phi3, LLAMA->PHI3, self.transformer->self.model, transformer_outputs->model_outputs +class Phi3ForSequenceClassification(Phi3PreTrainedModel): + def __init__(self, config): + super().__init__(config) + self.num_labels = config.num_labels + self.model = Phi3Model(config) + self.score = nn.Linear(config.hidden_size, self.num_labels, bias=False) + + # Initialize weights and apply final processing + self.post_init() + + def get_input_embeddings(self): + return self.model.embed_tokens + + def set_input_embeddings(self, value): + self.model.embed_tokens = value + + @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING) + def forward( + self, + input_ids: torch.LongTensor = None, + attention_mask: Optional[torch.Tensor] = None, + position_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[List[torch.FloatTensor]] = None, + inputs_embeds: Optional[torch.FloatTensor] = None, + labels: Optional[torch.LongTensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + ) -> Union[Tuple, SequenceClassifierOutputWithPast]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + model_outputs = self.model( + input_ids, + attention_mask=attention_mask, + position_ids=position_ids, + past_key_values=past_key_values, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + hidden_states = model_outputs[0] + logits = self.score(hidden_states) + + if input_ids is not None: + batch_size = input_ids.shape[0] + else: + batch_size = inputs_embeds.shape[0] + + if self.config.pad_token_id is None and batch_size != 1: + raise ValueError("Cannot handle batch sizes > 1 if no padding token is defined.") + if self.config.pad_token_id is None: + sequence_lengths = -1 + else: + if input_ids is not None: + # if no pad token found, use modulo instead of reverse indexing for ONNX compatibility + sequence_lengths = torch.eq(input_ids, self.config.pad_token_id).int().argmax(-1) - 1 + sequence_lengths = sequence_lengths % input_ids.shape[-1] + sequence_lengths = sequence_lengths.to(logits.device) + else: + sequence_lengths = -1 + + pooled_logits = logits[torch.arange(batch_size, device=logits.device), sequence_lengths] + + loss = None + if labels is not None: + labels = labels.to(logits.device) + if self.config.problem_type is None: + if self.num_labels == 1: + self.config.problem_type = "regression" + elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): + self.config.problem_type = "single_label_classification" + else: + self.config.problem_type = "multi_label_classification" + + if self.config.problem_type == "regression": + loss_fct = MSELoss() + if self.num_labels == 1: + loss = loss_fct(pooled_logits.squeeze(), labels.squeeze()) + else: + loss = loss_fct(pooled_logits, labels) + elif self.config.problem_type == "single_label_classification": + loss_fct = CrossEntropyLoss() + loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1)) + elif self.config.problem_type == "multi_label_classification": + loss_fct = BCEWithLogitsLoss() + loss = loss_fct(pooled_logits, labels) + if not return_dict: + output = (pooled_logits,) + model_outputs[1:] + return ((loss,) + output) if loss is not None else output + + return SequenceClassifierOutputWithPast( + loss=loss, + logits=pooled_logits, + past_key_values=model_outputs.past_key_values, + hidden_states=model_outputs.hidden_states, + attentions=model_outputs.attentions, + ) + + +@add_start_docstrings( + """ + [`Phi3Model`] with a token classification head on top (a linear layer on top of the hidden-states output) e.g. for + Named-Entity-Recognition (NER) tasks. + """, + PHI3_START_DOCSTRING, +) +# Copied from transformers.models.mpt.modeling_mpt.MptForTokenClassification with Mpt->Phi3,MPT->PHI3,self.transformer->self.model,transformer_outputs->model_outputs +class Phi3ForTokenClassification(Phi3PreTrainedModel): + def __init__(self, config: Phi3Config): + super().__init__(config) + self.num_labels = config.num_labels + + self.model = Phi3Model(config) + if hasattr(config, "classifier_dropout") and config.classifier_dropout is not None: + classifier_dropout = config.classifier_dropout + elif hasattr(config, "hidden_dropout") and config.hidden_dropout is not None: + classifier_dropout = config.hidden_dropout + else: + classifier_dropout = 0.1 + self.dropout = nn.Dropout(classifier_dropout) + self.classifier = nn.Linear(config.hidden_size, config.num_labels) + + # Initialize weights and apply final processing + self.post_init() + + @add_start_docstrings_to_model_forward(PHI3_INPUTS_DOCSTRING) + @add_code_sample_docstrings( + checkpoint=_CHECKPOINT_FOR_DOC, + output_type=TokenClassifierOutput, + config_class=_CONFIG_FOR_DOC, + ) + def forward( + self, + input_ids: Optional[torch.LongTensor] = None, + past_key_values: Optional[Tuple[Tuple[torch.Tensor, torch.Tensor], ...]] = None, + attention_mask: Optional[torch.Tensor] = None, + inputs_embeds: Optional[torch.Tensor] = None, + labels: Optional[torch.Tensor] = None, + use_cache: Optional[bool] = None, + output_attentions: Optional[bool] = None, + output_hidden_states: Optional[bool] = None, + return_dict: Optional[bool] = None, + **deprecated_arguments, + ) -> Union[Tuple[torch.Tensor], TokenClassifierOutput]: + r""" + labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): + Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., + config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If + `config.num_labels > 1` a classification loss is computed (Cross-Entropy). + """ + return_dict = return_dict if return_dict is not None else self.config.use_return_dict + + model_outputs = self.model( + input_ids, + past_key_values=past_key_values, + attention_mask=attention_mask, + inputs_embeds=inputs_embeds, + use_cache=use_cache, + output_attentions=output_attentions, + output_hidden_states=output_hidden_states, + return_dict=return_dict, + ) + + hidden_states = model_outputs[0] + hidden_states = self.dropout(hidden_states) + logits = self.classifier(hidden_states) + + loss = None + if labels is not None: + # move labels to correct device to enable model parallelism + labels = labels.to(logits.device) + batch_size, seq_length = labels.shape + loss_fct = CrossEntropyLoss() + loss = loss_fct( + logits.view(batch_size * seq_length, self.num_labels), labels.view(batch_size * seq_length) + ) + + if not return_dict: + output = (logits,) + model_outputs[2:] + return ((loss,) + output) if loss is not None else output + + return TokenClassifierOutput( + loss=loss, + logits=logits, + hidden_states=model_outputs.hidden_states, + attentions=model_outputs.attentions, + ) diff --git a/special_tokens_map.json b/special_tokens_map.json new file mode 100644 index 0000000..bc18685 --- /dev/null +++ b/special_tokens_map.json @@ -0,0 +1,34 @@ +{ + "additional_special_tokens": [ + "", + "" + ], + "bos_token": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + }, + "eos_token": { + "content": "<|endoftext|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + }, + "pad_token": { + "content": "<|endoftext|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + }, + "unk_token": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false + } +} diff --git a/tokenizer.json b/tokenizer.json new file mode 100644 index 0000000..1bb1206 --- /dev/null +++ b/tokenizer.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6796f846dff17e049ed0f60a0aa09a38b18b1d6b62d3adad2ae93a3b81ad81f1 +size 1845214 diff --git a/tokenizer.model b/tokenizer.model new file mode 100644 index 0000000..6c00c74 --- /dev/null +++ b/tokenizer.model @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e556afd44213b6bd1be2b850ebbbd98f5481437a8021afaf58ee7fb1818d347 +size 499723 diff --git a/tokenizer_config.json b/tokenizer_config.json new file mode 100644 index 0000000..c67c0c4 --- /dev/null +++ b/tokenizer_config.json @@ -0,0 +1,150 @@ +{ + "add_bos_token": true, + "add_eos_token": false, + "added_tokens_decoder": { + "0": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "1": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "2": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": false + }, + "32000": { + "content": "<|endoftext|>", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32001": { + "content": "<|assistant|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32002": { + "content": "<|placeholder1|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32003": { + "content": "<|placeholder2|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32004": { + "content": "<|placeholder3|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32005": { + "content": "<|placeholder4|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32006": { + "content": "<|system|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32007": { + "content": "<|end|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32008": { + "content": "<|placeholder5|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32009": { + "content": "<|placeholder6|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32010": { + "content": "<|user|>", + "lstrip": false, + "normalized": false, + "rstrip": true, + "single_word": false, + "special": true + }, + "32011": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + }, + "32012": { + "content": "", + "lstrip": false, + "normalized": false, + "rstrip": false, + "single_word": false, + "special": true + } + }, + "additional_special_tokens": [ + "", + "" + ], + "bos_token": "", + "chat_template": "{{ bos_token }}{% for message in messages %}{% if (message['role'] == 'user') %}{{'<|user|>' + '\n' + message['content'] + '<|end|>' + '\n' + '<|assistant|>' + '\n'}}{% elif (message['role'] == 'assistant') %}{{message['content'] + '<|end|>' + '\n'}}{% endif %}{% endfor %}", + "clean_up_tokenization_spaces": false, + "eos_token": "<|endoftext|>", + "legacy": false, + "model_max_length": 131072, + "pad_token": "<|endoftext|>", + "padding_side": "left", + "sp_model_kwargs": {}, + "tokenizer_class": "LlamaTokenizer", + "unk_token": "", + "use_default_system_prompt": false +}