TensorFlow 1.7模型部署GCP CloudML报错,指定TF1.6仍失败求助
SparseFillEmptyRows未注册错误 这个问题的核心原因很明确:你用TensorFlow 1.7训练/导出的模型包含了1.7版本才引入的算子SparseFillEmptyRows,而CloudML的TF 1.6运行时根本不认识这个算子——哪怕你在setup.py里指定了tensorflow==1.6,模型文件本身已经携带了高版本的算子定义,低版本TF无法解析它。
下面是具体的解决步骤:
重新用TensorFlow 1.6环境导出(或重新训练)模型
这是最根本的解决方案。你需要创建一个TF 1.6的虚拟环境,完成以下操作之一:- 如果训练成本不高,直接用TF1.6重新训练整个模型;
- 如果训练数据量很大,可加载已训练好的权重参数,在TF1.6环境下重新导出符合要求的SavedModel格式。
导出时要确保所有用到的算子都是TF1.6原生支持的,避免使用1.7新增的API。
检查算子的TF1.6兼容写法
确认SparseFillEmptyRows在TF1.6中的存在形式:在TF1.6里,这个算子可能属于tf.contrib.sparse模块(而TF1.7将其移到了核心API)。如果你的训练代码里用的是tf.SparseFillEmptyRows,在TF1.6环境下要改成tf.contrib.sparse.sparse_fill_empty_rows,确保导出的模型使用1.6能识别的算子路径。先在本地TF1.6环境验证模型
导出模型后,先在本地的TF1.6环境中测试加载:import tensorflow as tf with tf.Session() as sess: tf.saved_model.loader.load(sess, ["serve"], "/path/to/your/saved_model")如果这一步能成功加载,说明模型已经兼容TF1.6,再部署到CloudML就不会出现算子未注册的问题。
部署时指定CloudML的TF1.6运行时版本
比起仅在setup.py中指定依赖,直接在部署命令里指定CloudML的运行时版本更可靠,避免依赖缓存或版本冲突。部署命令示例:gcloud ai-platform versions create YOUR_VERSION_NAME \ --model YOUR_MODEL_NAME \ --origin gs://your-bucket/path/to/saved_model \ --runtime-version=1.6 \ --python-version=3.5这里的
--runtime-version=1.6会让CloudML直接使用预配置的TF1.6运行环境,无需依赖setup.py的配置。
内容的提问来源于stack exchange,提问作者mshearer0

