以CRF为loss的ner模型导出TensorFlow Serving格式时报错

脚本使用的是tests\train\zh\train_msra_ner_albert.py,改动为 1、loss设置为crf 2、模型以recognizer.export_model_for_serving 导出
执行后报错 AttributeError: ‘CRFLoss’ object has no attribute ‘name

from hanlp.components.ner import TransformerNamedEntityRecognizer
from hanlp.datasets.ner.msra import MSRA_NER_TRAIN, MSRA_NER_VALID, MSRA_NER_TEST
from tests import cdroot

cdroot()
recognizer = TransformerNamedEntityRecognizer()
save_dir = ‘data/model/ner/ner_albert_base_zh_msra_sparse_categorical_crossentropy’
recognizer.fit(MSRA_NER_TRAIN, MSRA_NER_VALID, save_dir, transformer=‘albert_base_zh’,
learning_rate=5e-5,
metrics=‘f1’,loss=“crf”)
recognizer.load(save_dir)
print(recognizer.predict(list(‘上海华安工业(集团)公司董事长谭旭光和秘书张晚霞来到美国纽约现代艺术博物馆参观。’)))
recognizer.evaluate(MSRA_NER_TEST, save_dir=save_dir)
print(f’Model saved in {save_dir}’)

recognizer.export_model_for_serving(export_dir=save_dir,overwrite=True)

[train_msra_ner_albert.py|attachment](upload://p12aXgIgvlUmWaBQg2QJt8xdKxq.py) (888 字节)

应该是升级tf2.3导致的兼容问题,已修复:

终于有人发现了export_model_for_serving 这个宝藏API。不过我们生产环境不用CRF,是否能成功serve还没测试。

您好
修改 hanlp/layers/crf/crf_layer.py后执行报以下错误,烦请再看一下,谢谢
File “/home/ll/anaconda3/envs/h2/lib/python3.7/site-packages/hanlp/layers/crf/crf_layer.py”, line 138, in call
assert sample_weight is not None, ‘your model has to support masking’
AssertionError: your model has to support masking

在此澄清一下,以免外人误解。

  1. TF的TransformerTagger在设计上不支持crf,所以fit方法不给loss这个参数。
  2. 硬要给loss=crf之后,会引发上述断言。
  3. 断言不是bug,是一种防御性编程,当断言=false的时候,往往意味着调用方法脱离预期。
  4. 具体到本帖,根本原因在于第三方bert没有返回Keras所需的masking,所以无法返回sample_weight给CRFLoss,意味着无法使用crf。
  5. 要支持crf,除非第三方bert支持返回mask,或者使用内部正在开发的PyTorch后端。
  6. 内部PyTorch后端的完成度覆盖并超出了TF后端,只不过PyTorch实在太好用,新功能写完一个又想再写一个,现在已经写得超出预计很多并且正在写一个joint learning框架,准备把ACL20几个工程上可行的idea放进去。不过发布可能得等到下一个长假之后了。