来自 TF Hub 临时文件的微调 BERT SavedModel 硬引用 vocab.txt

问题描述

首先,我对 TensorFlow 比较陌生,所以可能我做错了什么。我正在尝试为二进制文本分类创建一个独立的 TensorFlow 模型。我想创建一个可以通过 TensorFlow ServingAWS SageMaker 加载的 SavedModel。独立我的意思是我希望它是端到端的:将文本提供给端点,得到一个浮点数作为响应。

我已经开始在我的机器上本地使用 Classify text with BERT notebook,并将 electra_small 模型作为微调的基本模型。我已经在本地保存了微调的模型,将它加载回来并确保它可以工作。我关闭了我的电脑,第二天我发现我不能再加载我的模型了。原来它正在寻找一个临时的 tfhub 文件,该文件不再存在,导致 /tmp/tfhub_modules/09bd4e665682e6f03bc72fbcff7a68bf6879910e/assets/vocab.txt; No such file or directory 错误。我已经从 TF hub 重新下载了这些模型,模型开始加载并且工作正常。我删除/tmp/tfhub_modules/ 目录,模型再次停止加载。我检查了我保存微调模型的目录,它有与 TF Hub 临时文件相同内容vocab.txt 文件,但由于某种原因拒绝使用它。我希望 SavedModel 是自包含的,并使用它自己的本地词汇文件,而不是从 TF Hub 的外部临时目录中硬引用词汇文件

我可以在网上找到的大多数教程都在进行 word_ids + masks -> model 类型的分类,使 text -> word_ids + masks 成为预处理步骤的一部分。我真的不喜欢这个想法,因为我想让 API 消费者完全忘记任何类型的 NLP 相关的东西。我想保留它“文本输入,概率输出”。如果可能的话,我宁愿不为 TensorFlow Serving API 编写包装器来处理预处理。我希望找到并修改 BERT EN uncased preprocess 的源代码,但没有找到。 IE。我在 TensorFlow 的 GitHub 上找不到 bert_pack_inputs 的定义,这是一个有点独特的函数名称My issue

代码示例:

import tensorflow_hub as hub
import tensorflow_text
import tensorflow as tf


def build_classifier_model():
    tfhub_handle_encoder = 'https://tfhub.dev/google/electra_small/2'
    tfhub_handle_preprocess = 'https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/2'

    text_input = tf.keras.layers.Input(shape=(),dtype=tf.string,name='text')
    preprocessing_layer = hub.KerasLayer(tfhub_handle_preprocess,name='preprocessing')
    encoder_inputs = preprocessing_layer(text_input)
    encoder = hub.KerasLayer(tfhub_handle_encoder,trainable=True,name='BERT_encoder')
    outputs = encoder(encoder_inputs)
    net = outputs['pooled_output']
    net = tf.keras.layers.Dropout(0.1)(net)
    net = tf.keras.layers.Dense(1,activation=None,name='classifier')(net)
    return tf.keras.Model(text_input,net)


model_save_path = './modelname'

# Run this one first,it will create a saved model in your working dir.

# if __name__ == '__main__':
#     classifier_model = build_classifier_model()
#     bert_raw_result = classifier_model(tf.constant(['some dummy text']))
#     print(bert_raw_result)
#     classifier_model.save(model_save_path,include_optimizer=False)


# Run this one next,this should work.

if __name__ == '__main__':
    classifier_model = tf.saved_model.load(model_save_path)
    bert_raw_result = classifier_model(tf.constant(['some dummy text']))
    print(bert_raw_result)

# Now,try to remove / rename `/tmp/tfhub_modules/` directory and run the code above again. It fails for me with exception I provided in OP.
# So there's a hard reference to `/tmp/tfhub_modules/09bd4e665682e6f03bc72fbcff7a68bf6879910e/assets/vocab.txt` file instead of the one in "modelname" saved model.

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...