HuggingFace BPE Trainer训练报错:ByteLevelBPETokenizer触发TypeError
问题原因
报错是对ByteLevelBPETokenizer的接口设计不熟悉导致的:
ByteLevelBPETokenizer是tokenizers库封装好的高层便捷类,它的train_from_iterator方法会内部自动创建BpeTrainer,不需要手动传入实例化的Trainer对象。它的第二个入参要求是整数类型的vocab_size,你把BpeTrainer对象当位置参数传进去,自然会抛出无法将对象转为整数的类型错误。- 这个高层接口本身没有设计
trainer关键字参数,所以用关键字传参也会报参数不识别的错误。
另外你定义Trainer的时候存在参数拼写错误:min_frequence少了字母n,正确拼写是min_frequency。
解决方案
方案1:直接用高层接口的参数配置训练
不需要手动实例化BpeTrainer,直接把训练参数传到train_from_iterator方法里即可:
# 删掉手动实例化BpeTrainer的代码,直接调用训练方法 tokenizer.train_from_iterator( clean_data, vocab_size=20000, min_frequency=2, show_progress=True, special_tokens=["<s>","<pad>","</s>","<unk>","<mask>"] )
方案2:用底层Tokenizer类自定义Trainer
如果确实需要自己实例化Trainer做更灵活的配置,就不要用封装好的ByteLevelBPETokenizer,改用底层通用Tokenizer类实现:
from tokenizers import Tokenizer from tokenizers.models import BPE from tokenizers.pre_tokenizers import ByteLevel # 初始化底层tokenizer tokenizer = Tokenizer(BPE(unk_token="<unk>")) tokenizer.pre_tokenizer = ByteLevel(lowercase=True) # 自定义的Trainer可以正常使用 trainer = BpeTrainer( vocab_size=20000, min_frequency = 2, show_progress=True, special_tokens=["<s>","<pad>","</s>","<unk>","<mask>"], ) # 底层train_from_iterator支持传入trainer参数 tokenizer.train_from_iterator(clean_data, trainer=trainer) # 补充ByteLevel的后处理适配BERT格式 tokenizer.post_processor = BertProcessing( ("</s>", tokenizer.token_to_id("</s>")), ("<s>", tokenizer.token_to_id("<s>")), )
内容的提问来源于stack exchange,提问作者scarpacci
相关产品推荐
相关产品推荐

