EMR上运行onto_electra_base_uncased模型出现TensorFlow异常如何解决
故障根因定位
从异常栈的根错误Failed to find any matching files for */variables可以明确故障原因:
Spark NLP将onto_electra_base_uncased模型作为广播变量分发到Executor节点时,会先将模型解压到YARN容器的临时目录下,再被TensorFlow加载。触发错误的核心原因是Executor加载模型时,临时目录下的模型变量文件已经不存在,常见触发场景如下:
- EMR YARN默认开启了容器临时目录自动清理策略,会定期删除容器
/tmp路径下超过30分钟未访问的文件,若任务调度排队时间长、模型广播后间隔很久才被Executor加载,文件会被误删 - 你使用的Spark NLP 2.7.5版本存在已知的广播模型临时文件生命周期管理缺陷,模型广播后临时文件没有加访问锁,会被系统清理程序误删
- 核心/任务节点的本地磁盘可用空间不足,模型解压过程中断,导致variables目录生成不完整
解决方案
临时修复方案(无需升级组件)
在启动spark-shell时新增以下配置:
# 关闭广播模型的压缩,降低解压失败概率 --conf spark.broadcast.compress=false # 关闭YARN容器临时目录自动清理 --conf spark.yarn.executor.deleteOnExit=false # 调大YARN临时文件保留时间到8小时(单位秒) --conf spark.executor.javaOptions="-Dyarn.nodemanager.delete.debug-delay-sec=28800" # 调整Spark NLP模型缓存路径到非临时目录,避免被清理 --conf spark.jsl.settings.annotator.tmp_dir=/mnt/yarn/usercache/hadoop/sparknlp_cache
启动前先在所有核心/任务节点创建缓存目录并授权:
sudo mkdir -p /mnt/yarn/usercache/hadoop/sparknlp_cache sudo chown hadoop:hadoop /mnt/yarn/usercache/hadoop/sparknlp_cache
永久修复方案
- 升级Spark NLP到3.4.0及以上版本,该版本修复了广播模型临时文件被误删的问题,同时优化了Electra类模型的加载逻辑
- 若无法升级版本,可将预训练模型提前上传到HDFS公共路径,加载时直接从HDFS读取模型,避免每次任务都广播分发模型:
val embeddings = BertEmbeddings.load("hdfs:///public_models/onto_electra_base_uncased") .setInputCols("sentence", "token") .setOutputCol("embeddings")
辅助排查项
如果调整配置后仍报错,先排查以下两点:
- 检查所有核心/任务节点的本地磁盘可用空间,确保剩余空间不低于20G
- 检查YARN NodeManager日志,确认是否有磁盘满、文件权限不足的报错信息
内容的提问来源于stack exchange,提问作者mohit
相关产品推荐
相关产品推荐

