@@ -246,39 +246,55 @@ def vocab_size(self):
246246
247247
248248class _Qwen2VLTokenizer (_FlagScaleTokenizerBase ):
249- """Qwen2-VL tokenizer with AutoProcessor and multimodal support."""
250-
251249 def __init__ (self , tokenizer_path , extra_vocab_size ):
252- super ().__init__ (path = tokenizer_path )
250+ super ().__init__ (tokenizer_path )
251+ from transformers import AutoTokenizer
252+ self .tokenizer = AutoTokenizer .from_pretrained (
253+ tokenizer_path ,
254+ padding_side = "right" ,
255+ use_fast = True ,
256+ split_special_tokens = False ,
257+ trust_remote_code = True ,
258+ revision = "main" ,
259+ token = None ,
260+ )
261+ self .extra_vocab_size = extra_vocab_size
262+ self .special_tokens_map = {k :v for k , v in zip (self .tokenizer .all_special_tokens , self .tokenizer .all_special_ids )}
263+ self .image_token = '<|image_pad|>'
264+ self .video_token = '<|video_pad|>'
265+ self .vision_start_token = '<|vision_start|>'
266+ self .vision_end_token = '<|vision_end|>'
267+
253268 from transformers import AutoProcessor
254- self .processor = AutoProcessor .from_pretrained (tokenizer_path , trust_remote_code = True )
255- self . tokenizer = self . processor . tokenizer
256- self . image_token = self . processor . image_processor . image_token
257- self . video_token = self . processor . image_processor . video_token
258- self . vision_start_token = self . processor . image_processor . vision_start_token
259- self . vision_end_token = self . processor . image_processor . vision_end_token
260- self . special_tokens_map = {
261- self .image_token : self .tokenizer . convert_tokens_to_ids ( self . image_token ),
262- self . video_token : self . tokenizer . convert_tokens_to_ids ( self . video_token ),
263- self . vision_start_token : self . tokenizer . convert_tokens_to_ids (self . vision_start_token ) ,
264- self . vision_end_token : self . tokenizer . convert_tokens_to_ids ( self . vision_end_token ),
265- }
266- self . _vocab_size = len ( self .tokenizer ) + extra_vocab_size
267- self . _inv_vocab = None
269+ self .processor = AutoProcessor .from_pretrained (
270+ tokenizer_path ,
271+ revision = "main" ,
272+ token = None ,
273+ )
274+ # NOTE: In Qwen2-VL, template in chat_template.json is same within tokenizer_config.json and both can be used.
275+ # However, in Qwen 2.5-VL, the two templates are different and only the one in chat_template.json is OK.
276+ self .chat_template = self .processor . chat_template
277+
278+ def __call__ (self , text , return_tensors = None ,
279+ padding = None , max_length = None , truncation = None , add_special_tokens = None ):
280+
281+ return self .tokenizer ( text , return_tensors = return_tensors , padding = padding ,
282+ max_length = max_length , truncation = truncation , add_special_tokens = add_special_tokens )
268283
284+ def apply_chat_template (self , conversations , tokenize :bool = True , ** kwargs ):
285+ return self .tokenizer .apply_chat_template (conversations , tokenize = tokenize , chat_template = self .chat_template , ** kwargs )
286+
269287 @property
270288 def vocab_size (self ):
271- return self ._vocab_size
289+ return self .tokenizer . vocab_size + self . extra_vocab_size
272290
273291 @property
274292 def vocab (self ):
275- return self .tokenizer .get_vocab ()
293+ return self .tokenizer .vocab
276294
277295 @property
278296 def inv_vocab (self ):
279- if self ._inv_vocab is None :
280- self ._inv_vocab = {v : k for k , v in self .vocab .items ()}
281- return self ._inv_vocab
297+ return self .tokenizer .decoder
282298
283299 def tokenize (self , text ):
284300 return self .tokenizer .tokenize (text )
@@ -301,27 +317,26 @@ def pad_token_id(self):
301317 @property
302318 def eos_token_id (self ):
303319 return self .tokenizer .eos_token_id
304-
320+
305321 @property
306322 def image_token_id (self ):
307323 return self .special_tokens_map [self .image_token ]
308-
324+
309325 @property
310326 def video_token_id (self ):
311327 return self .special_tokens_map [self .video_token ]
312-
328+
313329 @property
314330 def vision_start_token_id (self ):
315331 return self .special_tokens_map [self .vision_start_token ]
316-
332+
317333 @property
318334 def vision_end_token_id (self ):
319335 return self .special_tokens_map [self .vision_end_token ]
320-
336+
321337 def encode (self , x ):
322338 return self .tokenizer .encode (x )
323339
324-
325340class _RWKVTokenizerFS (_FlagScaleTokenizerBase ):
326341 """RWKV Trie-based tokenizer."""
327342
0 commit comments