Keras调用multi_gpu_model报TypeError: 'module' object is not callable问询
问题解决方法
报错原因
当前导入语句逻辑错误:from tensorflow.keras import utils as multi_gpu_model是把整个utils模块重命名为multi_gpu_model,而模块本身不能作为函数调用,因此触发了TypeError: 'module' object is not callable报错。
对应解决方案
方案1:沿用原有multi_gpu_model(仅适用于TensorFlow 2.3及更早版本)
TensorFlow 2.4及之后版本已经正式废弃multi_gpu_model接口,如果你使用的是低版本TF,直接修改导入语句即可:
# 正确导入函数,而非导入整个utils模块 from tensorflow.keras.utils import multi_gpu_model # 调用逻辑和旧版Keras完全一致 multi_model = multi_gpu_model(myModel, gpus=args.gpus)
方案2:使用官方推荐的MirroredStrategy(兼容所有TF2.x版本,推荐)
官方已经不再维护multi_gpu_model,推荐用分布式训练策略接口实现多GPU训练,性能和稳定性都更优,使用方法如下:
- 初始化分布式策略
import tensorflow as tf # 自动检测所有可用GPU,默认使用所有可见GPU做数据并行训练 strategy = tf.distribute.MirroredStrategy()
- 在策略作用域内定义、编译模型
with strategy.scope(): # 此处替换为你原有模型的构建、编译逻辑 myModel = build_your_custom_model() myModel.compile( optimizer = "adam", loss = "your_loss_function", metrics = ["your_metrics"] )
- 直接调用训练接口即可,不需要额外对模型做转换
# 注意:此处batch_size要设置为单卡batch_size * 可用GPU数量,保证单卡负载和单卡训练时一致 myModel.fit(train_dataset, batch_size = per_gpu_batch * args.gpus, epochs=your_epochs)
内容的提问来源于stack exchange,提问作者Rawan
相关产品推荐
相关产品推荐

