ChatGLMTokenizer继承PreTrainedTokenizer,初始化出错
ChatGLMTokenizer继承PreTrainedTokenizer,初始化出错
File "/Users/wangli/.cache/huggingface/modules/transformers_modules/models-visualglm-6b/tokenization_chatglm.py", line 244, in vocab_size
return self.sp_tokenizer.num_tokens
AttributeError: 'ChatGLMTokenizer' object has no attribute 'sp_tokenizer'. Did you mean: '_tokenize'?
原因是PreTrainedTokenizer在构造器中调用了重载的虚方法vocab_size,而子类ChatGLMTokenizer初始化在后,无法在父类初始化前提供vocab_size的数据vocab_file,导致出错,因此,需要做如下修复:vocab_size方法的数据vocab_file要继续传递给父类,由父类的init_kwargs保存,然后在vocab_size方法中提取父类保存的vocab_file数据:
def vocab_size(self):
""" Returns vocab size """
vocab_file = self.init_kwargs.get('vocab_file')
return SPTokenizer(vocab_file, num_image_tokens=num_image_tokens).num_tokens
Transformers的代码PreTrainedTokenizer在构造器中调用了重载的虚方法,这本身是一个设计缺陷,是违反设计规范的,希望能从根源上解决,这是在给继承者挖坑