Codegeex2 tokenization fix (#11831)
* updated tokenizer file * updated tokenizer file * updated tokenizer file * updated tokenizer file * new folder
This commit is contained in:
		
							parent
							
								
									a508b0a902
								
							
						
					
					
						commit
						e07a55665c
					
				
					 2 changed files with 303 additions and 5 deletions
				
			
		| 
						 | 
					@ -16,7 +16,6 @@ conda create -n llm python=3.11
 | 
				
			||||||
conda activate llm
 | 
					conda activate llm
 | 
				
			||||||
# below command will install intel_extension_for_pytorch==2.1.10+xpu as default
 | 
					# below command will install intel_extension_for_pytorch==2.1.10+xpu as default
 | 
				
			||||||
pip install --pre --upgrade ipex-llm[xpu] --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/
 | 
					pip install --pre --upgrade ipex-llm[xpu] --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/
 | 
				
			||||||
pip install transformers==4.31.0
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#### 1.2 Installation on Windows
 | 
					#### 1.2 Installation on Windows
 | 
				
			||||||
| 
						 | 
					@ -27,10 +26,20 @@ conda activate llm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# below command will install intel_extension_for_pytorch==2.1.10+xpu as default
 | 
					# below command will install intel_extension_for_pytorch==2.1.10+xpu as default
 | 
				
			||||||
pip install --pre --upgrade ipex-llm[xpu] --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/
 | 
					pip install --pre --upgrade ipex-llm[xpu] --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/
 | 
				
			||||||
pip install transformers==4.31.0
 | 
					 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 2. Configures OneAPI environment variables for Linux
 | 
					### 2. Download Model and Replace File
 | 
				
			||||||
 | 
					If you select the codegeex2-6b model ([THUDM/codegeex-6b](https://huggingface.co/THUDM/codegeex2-6b)), please note that their code (`tokenization_chatglm.py`) initialized tokenizer after the call of `__init__` of its parent class, which may result in error during loading tokenizer. To address issue, we have provided an updated file ([tokenization_chatglm.py](./codegeex2-6b/tokenization_chatglm.py))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```python
 | 
				
			||||||
 | 
					def __init__(self, vocab_file, padding_side="left", clean_up_tokenization_spaces=False, **kwargs):
 | 
				
			||||||
 | 
					    self.tokenizer = SPTokenizer(vocab_file)
 | 
				
			||||||
 | 
					    super().__init__(padding_side=padding_side, clean_up_tokenization_spaces=clean_up_tokenization_spaces, **kwargs)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You could download the model from [THUDM/codegeex-6b](https://huggingface.co/THUDM/codegeex2-6b), and replace the file  `tokenization_chatglm.py` with [tokenization_chatglm.py](./codegeex2-6b/tokenization_chatglm.py).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 3. Configures OneAPI environment variables for Linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
> [!NOTE]
 | 
					> [!NOTE]
 | 
				
			||||||
> Skip this step if you are running on Windows.
 | 
					> Skip this step if you are running on Windows.
 | 
				
			||||||
| 
						 | 
					@ -41,7 +50,7 @@ This is a required step on Linux for APT or offline installed oneAPI. Skip this
 | 
				
			||||||
source /opt/intel/oneapi/setvars.sh
 | 
					source /opt/intel/oneapi/setvars.sh
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 3. Runtime Configurations
 | 
					### 4. Runtime Configurations
 | 
				
			||||||
For optimal performance, it is recommended to set several environment variables. Please check out the suggestions based on your device.
 | 
					For optimal performance, it is recommended to set several environment variables. Please check out the suggestions based on your device.
 | 
				
			||||||
#### 3.1 Configurations for Linux
 | 
					#### 3.1 Configurations for Linux
 | 
				
			||||||
<details>
 | 
					<details>
 | 
				
			||||||
| 
						 | 
					@ -105,7 +114,7 @@ set SYCL_CACHE_PERSISTENT=1
 | 
				
			||||||
> [!NOTE]
 | 
					> [!NOTE]
 | 
				
			||||||
> For the first time that each model runs on Intel iGPU/Intel Arc™ A300-Series or Pro A60, it may take several minutes to compile.
 | 
					> For the first time that each model runs on Intel iGPU/Intel Arc™ A300-Series or Pro A60, it may take several minutes to compile.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### 4. Running examples
 | 
					### 5. Running examples
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
python ./generate.py --repo-id-or-model-path REPO_ID_OR_MODEL_PATH --prompt PROMPT --n-predict N_PREDICT
 | 
					python ./generate.py --repo-id-or-model-path REPO_ID_OR_MODEL_PATH --prompt PROMPT --n-predict N_PREDICT
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,289 @@
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright 2016 The BigDL Authors.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# 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.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# ===========================================================================
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This file is adapted from
 | 
				
			||||||
 | 
					# https://huggingface.co/THUDM/codegeex2-6b/blob/ee1e7db429e587645bd3f0f4c3f5d8e6e843f2f6/tokenization_chatglm.py
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Apache 2.0 license
 | 
				
			||||||
 | 
					# https://huggingface.co/THUDM/codegeex2-6b/blob/main/LICENSE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
 | 
					import torch
 | 
				
			||||||
 | 
					from typing import List, Optional, Union, Dict
 | 
				
			||||||
 | 
					from sentencepiece import SentencePieceProcessor
 | 
				
			||||||
 | 
					from transformers import PreTrainedTokenizer
 | 
				
			||||||
 | 
					from transformers.utils import logging, PaddingStrategy
 | 
				
			||||||
 | 
					from transformers.tokenization_utils_base import EncodedInput, BatchEncoding
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SPTokenizer:
 | 
				
			||||||
 | 
					    def __init__(self, model_path: str):
 | 
				
			||||||
 | 
					        # reload tokenizer
 | 
				
			||||||
 | 
					        assert os.path.isfile(model_path), model_path
 | 
				
			||||||
 | 
					        self.sp_model = SentencePieceProcessor(model_file=model_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # BOS / EOS token IDs
 | 
				
			||||||
 | 
					        self.n_words: int = self.sp_model.vocab_size()
 | 
				
			||||||
 | 
					        self.bos_id: int = self.sp_model.bos_id()
 | 
				
			||||||
 | 
					        self.eos_id: int = self.sp_model.eos_id()
 | 
				
			||||||
 | 
					        self.pad_id: int = self.sp_model.unk_id()
 | 
				
			||||||
 | 
					        assert self.sp_model.vocab_size() == self.sp_model.get_piece_size()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        special_tokens = ["[MASK]", "[gMASK]", "[sMASK]", "sop", "eop"]
 | 
				
			||||||
 | 
					        self.special_tokens = {}
 | 
				
			||||||
 | 
					        self.index_special_tokens = {}
 | 
				
			||||||
 | 
					        for token in special_tokens:
 | 
				
			||||||
 | 
					            self.special_tokens[token] = self.n_words
 | 
				
			||||||
 | 
					            self.index_special_tokens[self.n_words] = token
 | 
				
			||||||
 | 
					            self.n_words += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def tokenize(self, s: str):
 | 
				
			||||||
 | 
					        return self.sp_model.EncodeAsPieces(s)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def encode(self, s: str, bos: bool = False, eos: bool = False) -> List[int]:
 | 
				
			||||||
 | 
					        assert type(s) is str
 | 
				
			||||||
 | 
					        t = self.sp_model.encode(s)
 | 
				
			||||||
 | 
					        if bos:
 | 
				
			||||||
 | 
					            t = [self.bos_id] + t
 | 
				
			||||||
 | 
					        if eos:
 | 
				
			||||||
 | 
					            t = t + [self.eos_id]
 | 
				
			||||||
 | 
					        return t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def decode(self, t: List[int]) -> str:
 | 
				
			||||||
 | 
					        return self.sp_model.decode(t)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def decode_tokens(self, tokens: List[str]) -> str:
 | 
				
			||||||
 | 
					        text = self.sp_model.DecodePieces(tokens)
 | 
				
			||||||
 | 
					        return text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def convert_token_to_id(self, token):
 | 
				
			||||||
 | 
					        """ Converts a token (str) in an id using the vocab. """
 | 
				
			||||||
 | 
					        if token in self.special_tokens:
 | 
				
			||||||
 | 
					            return self.special_tokens[token]
 | 
				
			||||||
 | 
					        return self.sp_model.PieceToId(token)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def convert_id_to_token(self, index):
 | 
				
			||||||
 | 
					        """Converts an index (integer) in a token (str) using the vocab."""
 | 
				
			||||||
 | 
					        if index in self.index_special_tokens or index in [self.eos_id, self.bos_id, self.pad_id] or index < 0:
 | 
				
			||||||
 | 
					            return ""
 | 
				
			||||||
 | 
					        return self.sp_model.IdToPiece(index)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ChatGLMTokenizer(PreTrainedTokenizer):
 | 
				
			||||||
 | 
					    vocab_files_names = {"vocab_file": "tokenizer.model"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    model_input_names = ["input_ids", "attention_mask", "position_ids"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __init__(self, vocab_file, padding_side="left", clean_up_tokenization_spaces=False, **kwargs):
 | 
				
			||||||
 | 
					        self.tokenizer = SPTokenizer(vocab_file)
 | 
				
			||||||
 | 
					        super().__init__(padding_side=padding_side, clean_up_tokenization_spaces=clean_up_tokenization_spaces, **kwargs)
 | 
				
			||||||
 | 
					        self.name = "GLMTokenizer"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.vocab_file = vocab_file
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        self.special_tokens = {
 | 
				
			||||||
 | 
					            "<bos>": self.tokenizer.bos_id,
 | 
				
			||||||
 | 
					            "<eos>": self.tokenizer.eos_id,
 | 
				
			||||||
 | 
					            "<pad>": self.tokenizer.pad_id
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_command(self, token):
 | 
				
			||||||
 | 
					        if token in self.special_tokens:
 | 
				
			||||||
 | 
					            return self.special_tokens[token]
 | 
				
			||||||
 | 
					        assert token in self.tokenizer.special_tokens, f"{token} is not a special token for {self.name}"
 | 
				
			||||||
 | 
					        return self.tokenizer.special_tokens[token]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def unk_token(self) -> str:
 | 
				
			||||||
 | 
					        return "<unk>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def pad_token(self) -> str:
 | 
				
			||||||
 | 
					        return "<unk>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def pad_token_id(self):
 | 
				
			||||||
 | 
					        return self.get_command("<pad>")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def eos_token(self) -> str:
 | 
				
			||||||
 | 
					        return "</s>"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def eos_token_id(self):
 | 
				
			||||||
 | 
					        return self.get_command("<eos>")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def vocab_size(self):
 | 
				
			||||||
 | 
					        return self.tokenizer.n_words
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_vocab(self):
 | 
				
			||||||
 | 
					        """ Returns vocab as a dict """
 | 
				
			||||||
 | 
					        vocab = {self._convert_id_to_token(i): i for i in range(self.vocab_size)}
 | 
				
			||||||
 | 
					        vocab.update(self.added_tokens_encoder)
 | 
				
			||||||
 | 
					        return vocab
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _tokenize(self, text, **kwargs):
 | 
				
			||||||
 | 
					        return self.tokenizer.tokenize(text)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _convert_token_to_id(self, token):
 | 
				
			||||||
 | 
					        """ Converts a token (str) in an id using the vocab. """
 | 
				
			||||||
 | 
					        return self.tokenizer.convert_token_to_id(token)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _convert_id_to_token(self, index):
 | 
				
			||||||
 | 
					        """Converts an index (integer) in a token (str) using the vocab."""
 | 
				
			||||||
 | 
					        return self.tokenizer.convert_id_to_token(index)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def convert_tokens_to_string(self, tokens: List[str]) -> str:
 | 
				
			||||||
 | 
					        return self.tokenizer.decode_tokens(tokens)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def save_vocabulary(self, save_directory, filename_prefix=None):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Save the vocabulary and special tokens file to a directory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Args:
 | 
				
			||||||
 | 
					            save_directory (`str`):
 | 
				
			||||||
 | 
					                The directory in which to save the vocabulary.
 | 
				
			||||||
 | 
					            filename_prefix (`str`, *optional*):
 | 
				
			||||||
 | 
					                An optional prefix to add to the named of the saved files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Returns:
 | 
				
			||||||
 | 
					            `Tuple(str)`: Paths to the files saved.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        if os.path.isdir(save_directory):
 | 
				
			||||||
 | 
					            vocab_file = os.path.join(
 | 
				
			||||||
 | 
					                save_directory, self.vocab_files_names["vocab_file"]
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            vocab_file = save_directory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with open(self.vocab_file, 'rb') as fin:
 | 
				
			||||||
 | 
					            proto_str = fin.read()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        with open(vocab_file, "wb") as writer:
 | 
				
			||||||
 | 
					            writer.write(proto_str)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return (vocab_file,)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_prefix_tokens(self):
 | 
				
			||||||
 | 
					        prefix_tokens = [self.get_command("[gMASK]"), self.get_command("sop")]
 | 
				
			||||||
 | 
					        return prefix_tokens
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def build_prompt(self, query, history=None):
 | 
				
			||||||
 | 
					        if history is None:
 | 
				
			||||||
 | 
					            history = []
 | 
				
			||||||
 | 
					        prompt = ""
 | 
				
			||||||
 | 
					        for i, (old_query, response) in enumerate(history):
 | 
				
			||||||
 | 
					            prompt += "[Round {}]\n\n问:{}\n\n答:{}\n\n".format(i + 1, old_query, response)
 | 
				
			||||||
 | 
					        prompt += "[Round {}]\n\n问:{}\n\n答:".format(len(history) + 1, query)
 | 
				
			||||||
 | 
					        return prompt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def build_inputs_with_special_tokens(
 | 
				
			||||||
 | 
					            self, token_ids_0: List[int], token_ids_1: Optional[List[int]] = None
 | 
				
			||||||
 | 
					    ) -> List[int]:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Build model inputs from a sequence or a pair of sequence for sequence classification tasks by concatenating and
 | 
				
			||||||
 | 
					        adding special tokens. A BERT sequence has the following format:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        - single sequence: `[CLS] X [SEP]`
 | 
				
			||||||
 | 
					        - pair of sequences: `[CLS] A [SEP] B [SEP]`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Args:
 | 
				
			||||||
 | 
					            token_ids_0 (`List[int]`):
 | 
				
			||||||
 | 
					                List of IDs to which the special tokens will be added.
 | 
				
			||||||
 | 
					            token_ids_1 (`List[int]`, *optional*):
 | 
				
			||||||
 | 
					                Optional second list of IDs for sequence pairs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Returns:
 | 
				
			||||||
 | 
					            `List[int]`: List of [input IDs](../glossary#input-ids) with the appropriate special tokens.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        prefix_tokens = self.get_prefix_tokens()
 | 
				
			||||||
 | 
					        token_ids_0 = prefix_tokens + token_ids_0
 | 
				
			||||||
 | 
					        if token_ids_1 is not None:
 | 
				
			||||||
 | 
					            token_ids_0 = token_ids_0 + token_ids_1 + [self.get_command("<eos>")]
 | 
				
			||||||
 | 
					        return token_ids_0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _pad(
 | 
				
			||||||
 | 
					            self,
 | 
				
			||||||
 | 
					            encoded_inputs: Union[Dict[str, EncodedInput], BatchEncoding],
 | 
				
			||||||
 | 
					            max_length: Optional[int] = None,
 | 
				
			||||||
 | 
					            padding_strategy: PaddingStrategy = PaddingStrategy.DO_NOT_PAD,
 | 
				
			||||||
 | 
					            pad_to_multiple_of: Optional[int] = None,
 | 
				
			||||||
 | 
					            return_attention_mask: Optional[bool] = None,
 | 
				
			||||||
 | 
					    ) -> dict:
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Pad encoded inputs (on left/right and up to predefined length or max length in the batch)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Args:
 | 
				
			||||||
 | 
					            encoded_inputs:
 | 
				
			||||||
 | 
					                Dictionary of tokenized inputs (`List[int]`) or batch of tokenized inputs (`List[List[int]]`).
 | 
				
			||||||
 | 
					            max_length: maximum length of the returned list and optionally padding length (see below).
 | 
				
			||||||
 | 
					                Will truncate by taking into account the special tokens.
 | 
				
			||||||
 | 
					            padding_strategy: PaddingStrategy to use for padding.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                - PaddingStrategy.LONGEST Pad to the longest sequence in the batch
 | 
				
			||||||
 | 
					                - PaddingStrategy.MAX_LENGTH: Pad to the max length (default)
 | 
				
			||||||
 | 
					                - PaddingStrategy.DO_NOT_PAD: Do not pad
 | 
				
			||||||
 | 
					                The tokenizer padding sides are defined in self.padding_side:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    - 'left': pads on the left of the sequences
 | 
				
			||||||
 | 
					                    - 'right': pads on the right of the sequences
 | 
				
			||||||
 | 
					            pad_to_multiple_of: (optional) Integer if set will pad the sequence to a multiple of the provided value.
 | 
				
			||||||
 | 
					                This is especially useful to enable the use of Tensor Core on NVIDIA hardware with compute capability
 | 
				
			||||||
 | 
					                `>= 7.5` (Volta).
 | 
				
			||||||
 | 
					            return_attention_mask:
 | 
				
			||||||
 | 
					                (optional) Set to False to avoid returning attention mask (default: set to model specifics)
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        # Load from model defaults
 | 
				
			||||||
 | 
					        # assert self.padding_side == "left"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        required_input = encoded_inputs[self.model_input_names[0]]
 | 
				
			||||||
 | 
					        seq_length = len(required_input)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if padding_strategy == PaddingStrategy.LONGEST:
 | 
				
			||||||
 | 
					            max_length = len(required_input)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if max_length is not None and pad_to_multiple_of is not None and (max_length % pad_to_multiple_of != 0):
 | 
				
			||||||
 | 
					            max_length = ((max_length // pad_to_multiple_of) + 1) * pad_to_multiple_of
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        needs_to_be_padded = padding_strategy != PaddingStrategy.DO_NOT_PAD and len(required_input) != max_length
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Initialize attention mask if not present.
 | 
				
			||||||
 | 
					        if "attention_mask" not in encoded_inputs:
 | 
				
			||||||
 | 
					            encoded_inputs["attention_mask"] = [1] * seq_length
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if "position_ids" not in encoded_inputs:
 | 
				
			||||||
 | 
					            encoded_inputs["position_ids"] = list(range(seq_length))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if needs_to_be_padded:
 | 
				
			||||||
 | 
					            difference = max_length - len(required_input)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if self.padding_side == "left":
 | 
				
			||||||
 | 
					                if "attention_mask" in encoded_inputs:
 | 
				
			||||||
 | 
					                    encoded_inputs["attention_mask"] = [0] * difference + encoded_inputs["attention_mask"]
 | 
				
			||||||
 | 
					                if "position_ids" in encoded_inputs:
 | 
				
			||||||
 | 
					                    encoded_inputs["position_ids"] = [0] * difference + encoded_inputs["position_ids"]
 | 
				
			||||||
 | 
					                encoded_inputs[self.model_input_names[0]] = [self.pad_token_id] * difference + required_input
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                if "attention_mask" in encoded_inputs:
 | 
				
			||||||
 | 
					                    encoded_inputs["attention_mask"] = encoded_inputs["attention_mask"] + [0] * difference
 | 
				
			||||||
 | 
					                if "position_ids" in encoded_inputs:
 | 
				
			||||||
 | 
					                    encoded_inputs["position_ids"] = encoded_inputs["position_ids"] + [0] * difference
 | 
				
			||||||
 | 
					                encoded_inputs[self.model_input_names[0]] = required_input + [self.pad_token_id] * difference
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return encoded_inputs
 | 
				
			||||||
		Loading…
	
		Reference in a new issue