从拥抱面权重构建张量流模型的问题

Posted

技术标签:

【中文标题】从拥抱面权重构建张量流模型的问题【英文标题】:Problem building tensorflow model from huggingface weights 【发布时间】:2021-10-25 18:25:09 【问题描述】:

我需要使用来自 Huggingface 的预训练 BERT 模型 ('dbmdz/bert-base-italian-xxl-cased') 和 Tensorflow(this 链接)。

在网站上阅读此内容后,

目前只有 PyTorch-Transformers 兼容的权重可用。如果您需要访问 TensorFlow 检查点,请提出问题!

我提出了这个问题,并立即向我提供了包含以下文件的存档的下载链接。文件如下:

$ ls bert-base-italian-xxl-cased/
config.json                    model.ckpt.index               vocab.txt
model.ckpt.data-00000-of-00001 model.ckpt.meta

我现在正在尝试加载模型并使用它,但我尝试的一切都失败了。

我尝试遵循来自 Huggingface 讨论网站的 this 建议:

bert_folder = str(Config.MODELS_CONFIG.BERT_CHECKPOINT_DIR) # folder in which I have the files extracted from the archive
from transformers import BertConfig, TFBertModel
config = BertConfig.from_pretrained(bert_folder) # this gets loaded correctly

此后,我尝试了几种组合以加载模型,但总是不成功。

例如:

model = TFBertModel.from_pretrained("../../models/pretrained/bert-base-italian-xxl-cased/model.ckpt.index", config=config)

model = TFBertModel.from_pretrained("../../models/pretrained/bert-base-italian-xxl-cased/model.ckpt.index", config=config, from_pt=True)

model = TFBertModel.from_pretrained("../../models/pretrained/bert-base-italian-xxl-cased/model.ckpt.index", config=config, from_pt=True)

model = TFBertModel.from_pretrained("../../models/pretrained/bert-base-italian-xxl-cased", config=config, local_files_only=True)

总是导致这个错误:

404 Client Error: Not Found for url: https://huggingface.co/models/pretrained/bert-base-italian-xxl-cased/model.ckpt.index/resolve/main/tf_model.h5
...
...
OSError: Can't load weights for '../../models/pretrained/bert-base-italian-xxl-cased/model.ckpt.index'. Make sure that:

- '../../models/pretrained/bert-base-italian-xxl-cased/model.ckpt.index' is a correct model identifier listed on 'https://huggingface.co/models'

- or '../../models/pretrained/bert-base-italian-xxl-cased/model.ckpt.index' is the correct path to a directory containing a file named one of tf_model.h5, pytorch_model.bin.

所以我的问题是:如何从这些文件中加载这个预训练的 BERT 模型并在 tensorflow 中使用它?

【问题讨论】:

【参考方案1】:

你可以尝试下面的sn-p在tensorflow中加载dbmdz/bert-base-italian-xxl-cased

from transformers import AutoTokenizer, TFBertModel
model_name = "dbmdz/bert-base-italian-cased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = TFBertModel.from_pretrained(model_name)

如果你想从给定的tensorflow checkpoint 加载,你可以这样尝试:

model = TFBertModel.from_pretrained("../../models/pretrained/bert-base-italian-xxl-cased/model.ckpt.index", config=config, from_tf=True)

【讨论】:

我已经尝试过from_tf,但它不起作用 第一个建议呢?是这样的吗? 想确认您是否真的尝试过from_tf,因为您的帖子说from_pt 两次,没有from_tf 我只列出了我尝试过的一些组合,但是是的,我已经使用了from_tf,但它不起作用。第一个建议适用于 colab,但是如果必须下载数据集并且由于 JupyterLab 的一些问题而不在本地计算机上,我在本地环境中的 from pretrained 函数存在问题,所以我仍然需要一种加载模型的方法来自我机器上的文件。 (1) 第一个建议与数据集或任何平台无关,您只需要在您的环境中使用正确版本的转换器即可。 (2) 没有遇到任何从.ckpttensorflow 加载模型的拥抱脸文档。相反,您可以使用convert_bert_original_tf_checkpoint_to_pytorch.py 将您的tf 检查点转换为pytorch,然后使用from_pt=True、see 加载。 (3) TensorFlow 检查点实际上存在于同一个 repo 中,名称为 tf_model.h5,可使用 from_tf 加载。

以上是关于从拥抱面权重构建张量流模型的问题的主要内容,如果未能解决你的问题,请参考以下文章

张量流模型不更新权重

将张量流权重导出到 hdf5 文件和模型到 keras model.json

如何在张量流中创建集成?

tf2.0 Keras:使用 RNN 的自定义张量流代码时无法保存权重

张量流不训练(只有偏差改变)

如何解决权重矩阵维度较大的张量流梯度问题?