以Huggingface上的 google-bert/bert-base-chinese
模型为例。我们使用Huggingface提供的transformers框架来启动模型
#加载模型
from transformers import AutoModelForMaskedLM
#加载分词器
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
model = AutoModelForMaskedLM.from_pretrained("bert-base-chinese")
虽然填入的模型只有 bert-base-chinese 这一截,实际上完整的是 google-bert/bert-base-chinese,请求达到 huggingface.co 之后,它会搜索 bert-base-chinese,然后取第一个,于是就重定向到了 google-bert/bert-base-chinese
相关的代码如下:D:\ProgramData\Anaconda3\Lib\site-packages\transformers\utils\hub.py:376
行。
函数是 cached_file(),其中 revision 默认值是 main 分支。
完整路径:https://huggingface.co/google-bert/bert-base-chinese/tree/main
下载的文件会保存到 cache_dir 目录下,默认为 C:\Users\Administrator.DESKTOP-TPJL4TC.cache\huggingface\hub,即 HOME 目录下。
force_download 是强制重新下载。但是默认都是断点续传的,如果你上次下载中途断掉了,下次会接着下。
现在无论是Huggingface还是modelscope平台,大部分模型都不会上传代码,也就是只有几个配置文件和模型权重参数文件,但是,在运行模型的时候是需要构建分词器和构建模型,这就需要根据不同的模型架构使用python代码来实现,在Huggingface和modelscope框架中都内置了很多模型的构建代码,它根据内置的mapping隐射信息找到具体的类,如果本地没有这个代码,它还可以自动从网上下载(这需要在config中配置)
下面是 AutoTokenizer 的过程:
tokenizer 的 from_pretrained 是构建分词器,因此它只会下载三个文件(tokenizer_config.json,vocab.txt,tokenizer.json),不会下载巨大的模型文件。
如果你使用的是 AutoTokenizer,那它是如何寻找到要使用哪个类呢,比如这里应该是 BertTokenizer?
它判断的根据依次是:你传入的参数,模型配置文件(tokenizer_config.json, tokenizer.json, config.json)。
相关字段 tokenizer_class, model_type,此例中根据 model_type=bert,在 CONFIG_MAPPING_NAMES 中找到 bert --> BertConfig,最终会返回 BertTokenizer
但是在构建model的时候,却不能简单的使用AutoModel,因