TensorFlow protobuf不兼容导致tf.Variable报错如何修复
问题现象
执行TensorFlow代码时触发AttributeError,核心报错信息为'google.protobuf.pyext._message.RepeatedCompositeCo' object has no attribute 'append',报错触发点为tf.Variable初始化逻辑,完整报错栈如下:
$ python a.py Traceback (most recent call last): File "a.py", line 20, in <module> a = tf.Variable(tf.zeros(2)) File "/opt/miniconda3/lib/python3.8/site-packages/tensorflow/python/util/traceback_utils.py", line 153, in error_handler raise e.with_traceback(filtered_tb) from None File "/opt/miniconda3/lib/python3.8/site-packages/tensorflow/python/ops/resource_variable_ops.py", line 177, in _variable_handle_from_shape_and_dtype handle_data.shape_and_type.append( AttributeError: 'google.protobuf.pyext._message.RepeatedCompositeCo' object has no attribute 'append' (base) kanduru@SJC-L-00060215:/mnt/c/Users/kanduru/Documents/Courses/MIT/skunk/Auto-Surprise$
最简复现代码
import tensorflow as tf a = tf.Variable(tf.zeros(2))
当前环境依赖版本
- tensorflow:2.7.0
- tensorflow-estimator:2.7.0
- protobuf:4.21.1
问题根因
TensorFlow 2.7.0 基于protobuf 3.x系列接口开发,与4.x系列protobuf存在破坏性接口变更不兼容:protobuf 4.21.x版本调整了内部RepeatedComposite字段的操作逻辑,移除了原有的append方法,TensorFlow内部调用对应接口时直接触发属性不存在的错误。
修复方案
方案1:降级protobuf到兼容版本(优先推荐,无代码侵入)
安装和TensorFlow 2.7.0完全适配的protobuf稳定版,执行命令:pip install protobuf==3.20.3如果使用conda管理环境,执行对应conda命令即可:
conda install protobuf=3.20.3安装完成后重新运行代码即可正常执行,3.20.3是protobuf 3.x系列的长期维护版本,不会引入其他兼容问题。
方案2:升级TensorFlow版本适配高版本protobuf
若需要保留protobuf 4.x版本,可将TensorFlow升级到2.10及以上版本,新版TensorFlow已完成对protobuf 4.x系列的适配,执行升级命令:pip install --upgrade tensorflow tensorflow-estimator注意跨大版本升级TensorFlow可能存在旧API废弃问题,需要同步调整代码中不兼容的写法。
方案3:临时补丁规避(仅应急使用,不推荐长期用)
若暂时无法调整依赖版本,可在导入TensorFlow前手动补全缺失的接口映射,在代码最开头添加如下逻辑:from google.protobuf.pyext._message import RepeatedCompositeContainer RepeatedCompositeContainer.append = lambda self, val: self.Add().MergeFrom(val) import tensorflow as tf a = tf.Variable(tf.zeros(2))该方案为猴子补丁,临时调试可用,生产环境长期运行可能触发其他未知兼容问题。
内容的提问来源于stack exchange,提问作者seeking that

