Skip to content

Commit 2085492

Browse files
Refactor Qwen2VLTokenizer to use AutoTokenizer
1 parent 42f45a9 commit 2085492

1 file changed

Lines changed: 43 additions & 28 deletions

File tree

flagscale/train/megatron/training/tokenizer/tokenizer.py

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -246,39 +246,55 @@ def vocab_size(self):
246246

247247

248248
class _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-
325340
class _RWKVTokenizerFS(_FlagScaleTokenizerBase):
326341
"""RWKV Trie-based tokenizer."""
327342

0 commit comments

Comments
 (0)