Huggingface AutoTokenizer 无法从本地路径加载

Posted

技术标签:

【中文标题】Huggingface AutoTokenizer 无法从本地路径加载【英文标题】:Huggingface AutoTokenizer can't load from local path 【发布时间】:2020-09-08 20:49:27 【问题描述】:

我正在尝试使用我自己的标记器(刚刚添加了几个标记,请参阅 cmets)从 huggingface 示例中运行语言模型微调脚本 (run_language_modeling.py)。我在加载标记器时遇到问题。我认为问题出在 AutoTokenizer.from_pretrained('local/path/to/directory') 上。

代码:

from transformers import *

tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
# special_tokens = ['<HASHTAG>', '<URL>', '<AT_USER>', '<EMOTICON-HAPPY>', '<EMOTICON-SAD>']
# tokenizer.add_tokens(special_tokens)
tokenizer.save_pretrained('../twitter/twittertokenizer/')
tmp = AutoTokenizer.from_pretrained('../twitter/twittertokenizer/')

错误信息:

OSError                                   Traceback (most recent call last)
/z/huggingface_venv/lib/python3.7/site-packages/transformers/configuration_utils.py in get_config_dict(cls, pretrained_model_name_or_path, pretrained_config_archive_map, **kwargs)
    248                 resume_download=resume_download,
--> 249                 local_files_only=local_files_only,
    250             )

/z/huggingface_venv/lib/python3.7/site-packages/transformers/file_utils.py in cached_path(url_or_filename, cache_dir, force_download, proxies, resume_download, user_agent, extract_compressed_file, force_extract, local_files_only)
    265         # File, but it doesn't exist.
--> 266         raise EnvironmentError("file  not found".format(url_or_filename))
    267     else:

OSError: file ../twitter/twittertokenizer/config.json not found

During handling of the above exception, another exception occurred:

OSError                                   Traceback (most recent call last)
<ipython-input-32-662067cb1297> in <module>
----> 1 tmp = AutoTokenizer.from_pretrained('../twitter/twittertokenizer/')

/z/huggingface_venv/lib/python3.7/site-packages/transformers/tokenization_auto.py in from_pretrained(cls, pretrained_model_name_or_path, *inputs, **kwargs)
    190         config = kwargs.pop("config", None)
    191         if not isinstance(config, PretrainedConfig):
--> 192             config = AutoConfig.from_pretrained(pretrained_model_name_or_path, **kwargs)
    193 
    194         if "bert-base-japanese" in pretrained_model_name_or_path:

/z/huggingface_venv/lib/python3.7/site-packages/transformers/configuration_auto.py in from_pretrained(cls, pretrained_model_name_or_path, **kwargs)
    192         """
    193         config_dict, _ = PretrainedConfig.get_config_dict(
--> 194             pretrained_model_name_or_path, pretrained_config_archive_map=ALL_PRETRAINED_CONFIG_ARCHIVE_MAP, **kwargs
    195         )
    196 

/z/huggingface_venv/lib/python3.7/site-packages/transformers/configuration_utils.py in get_config_dict(cls, pretrained_model_name_or_path, pretrained_config_archive_map, **kwargs)
    270                     )
    271                 )
--> 272             raise EnvironmentError(msg)
    273 
    274         except json.JSONDecodeError:

OSError: Can't load '../twitter/twittertokenizer/'. Make sure that:

- '../twitter/twittertokenizer/' is a correct model identifier listed on 'https://huggingface.co/models'

- or '../twitter/twittertokenizer/' is the correct path to a directory containing a 'config.json' file

如果我将AutoTokenizer 更改为BertTokenizer,上面的代码就可以工作。我也可以毫无问题地运行脚本,因为我是通过快捷方式名称而不是路径加载的。但在脚本 run_language_modeling.py 中它使用AutoTokenizer。我正在寻找一种让它运行的方法。

有什么想法吗?谢谢!

【问题讨论】:

【参考方案1】:

问题是您没有使用任何可以指示要实例化的正确标记器的内容。

有关参考,请参阅Huggingface docs 中定义的规则。具体来说,由于您使用的是 BERT:

包含bert:BertTokenizer(Bert模型)

否则,您必须自己指定确切的类型,如您所述。

【讨论】:

您的意思是 AutoTokenizer.from_pretrained 无法确定要实例化自己的分词器类型吗?为什么 AutoTokenizer.from_pretrained('bert-base-uncased') 有效,但 AutoTokenizer.from_pretrained('local/path') 无效?谢谢! 正如我所说,AutoTokenizer 的选择基于您提供的 name。由于预训练模型指示要选择哪个模型(即,bert-base-uncased 指的是 BERT 模型等),因此您必须将本地模型存储在类似指示使用的文件夹中型号,即/path/to/bert-derivative 我明白了。谢谢!【参考方案2】:

如果指定路径不包含模型配置文件,AutoTokenizer.from_pretrained 将失败,而模型配置文件仅用于标记器类实例化。

run_language_modeling.py 的上下文中,AutoTokenizer 的使用是错误的(或至少是泄漏的)。 如果与模型名称或路径相同,则没有必要指定(可选)tokenizer_name 参数。因此,据我了解,它应该完全支持修改标记器的情况。我也发现这个问题非常令人困惑。

我发现的最佳解决方法是将config.json 添加到仅“缺少”配置的标记器目录中:


  "model_type": "bert"

【讨论】:

"name_or_path": "foo-bar"tokenizer_config.json 复制到一个全新的config.json 就可以了。谢谢@Ohad【参考方案3】:

在加载修改后的分词器或预训练的分词器时,您应该按如下方式加载:

tokenizer = AutoTokenizer.from_pretrained(path_to_json_file_of_tokenizer, config=AutoConfig.from_pretrained('模型配置文件所在文件夹的路径'))

【讨论】:

以上是关于Huggingface AutoTokenizer 无法从本地路径加载的主要内容,如果未能解决你的问题,请参考以下文章

AutoTokenizer.from_pretrained 无法加载本地保存的预训练标记器 (PyTorch)

下载huggingface上模型的正确姿势

下载huggingface上模型的正确姿势

Huggingface:NameError:未定义名称“管道”

使用 huggingface 的 distilbert 模型生成文本

使用 huggingface 库会报错:KeyError: 'logits'