为什么 fasttext can only run in eager mode ?

我使用Hanlp2.提供的类 RNNPartOfSpeechTaggerTF进行训练,训练参数embedding设置为FASTTEXT_WIKI_300_ZH
当我调试程序时,发现在路径“hanlp → layers → embeddings → util_tf.py"文件中的build_embedding方法中有这样一段代码:
image
我不明白为什么作者在这里标示” fasttext can only run in eager mode“
我查阅了fasttext的官网和github上的内容,并没有找到相关信息。
之后,我为了验证run_eagerly参数设置为false和true的区别,做了以下实验:
对于同一份train.txt、dev.txt、test.txt文件进行模型训练和评估:
当设置run_eagerly=True时,evaluate()结果为:

2024-06-26 17:09:46 INFO Evaluation results for test_test.txt - loss: 66.4831 - loss: 66.4831 - accuracy: 0.9740 - speed: 616.49 sample/sec

当设置run_eagerly=False时,evaluate()结果为:

2024-06-26 17:13:28 INFO Evaluation results for test_test.txt - loss: 1131.3578 - loss: 1131.3578 - accuracy: 0.6260 - speed: 3829.10 sample/sec

根据实验结果,当run_eagerly=True时,确实得到了更高的准确率,这表明作者标识” fasttext can only run in eager mode“有一定道理。但我的疑惑是:

  1. 为什么造成以上结果呢?
  2. 如果fasttext确实在eager mode下表现更好,那么就会带来另一个问题:我将训练好的模型通过tf.saved_model.save导出并利用TF-serving部署服务后,推理结果非常差,几乎是完全错误。

在我学习hanlp中,还遇到其他问题:
为了使TF-serving部署的模型(keras.sequential)可以处理字符串输入和字符串输出,我在@tf.function使用transform的word_vocab和tag_vocab对象,目的是进行idx和token的转换,但是会报错,如下:

AssertionError: Tried to export a function which references an ‘untracked’ resource. TensorFlow objects (e.g. tf.Variable) captured by functions must be ‘tracked’ by assigning them to an attribute
of a tracked object or assigned to an attribute of the main object directly. See the information below:
Function name = b’__inference_signature_wrapper_3496’
Captured Tensor = <ResourceHandle(name=“8”, device="/job:localhost/replica:0/task:0/device:CPU:0", container=“localhost”, type=“class tensorflow::lookup::LookupInterface”, dtype and shapes
: “[ ]”)>
Trackable referencing this tensor = <tensorflow.python.ops.lookup_ops.StaticHashTableV1 object at 0x000001CEBA24F8B0>
Internal Tensor = Tensor(“3490:0”, shape=(), dtype=resource)

我在网上搜索了大量信息来解决这个问题,我尝试了
1.在模型build阶段,作为模型的属性添加,方法成功,但不便捷
2.将模型训练后的vocabs.json词汇表文件想办法和model一起通过tf.saved_model.save导出,方法失败

希望好心人可以解答我的疑惑,感激不尽!