如何同时在CPU和GPU上运行Keras?能否分设备并行训练CNN与RNN?
当然可以实现这种跨设备并行运行!
完全没问题,TensorFlow的tf.device()上下文管理器就是为这种场景设计的——你可以轻松把模型的不同分支指定到不同硬件上运行,刚好匹配你这种CNN、RNN分属不同输入分支,最后汇合到FCN的模型结构。
原理说明
因为你的CNN和RNN是独立的计算分支(各自有独立输入),TensorFlow可以在指定的CPU和GPU上并行执行这两部分的计算,等两个分支的输出都准备好之后,再把它们传入FCN进行后续处理。只要你的硬件环境配置正常(比如GPU的CUDA驱动、TensorFlow GPU版本安装正确),这种跨设备并行就能顺利跑起来。
完整代码示例
下面是更完整的实现代码,帮你把整个流程串起来:
import tensorflow as tf from tensorflow.keras.layers import Input, Conv2D, LSTM, Dense, Flatten, concatenate from tensorflow.keras.models import Model # 定义两个独立输入:CNN的图像输入,RNN的序列输入 cnn_input = Input(shape=(28, 28, 1), name='cnn_input') rnn_input = Input(shape=(10, 32), name='rnn_input') # 将CNN分支指定到CPU运行 with tf.device('/cpu:0'): cnn_x = Conv2D(32, (3,3), activation='relu')(cnn_input) cnn_x = Flatten()(cnn_x) cnn_output = Dense(64, activation='relu')(cnn_x) # 将RNN分支指定到GPU运行 with tf.device('/gpu:0'): rnn_x = LSTM(64, activation='tanh')(rnn_input) rnn_output = Dense(64, activation='relu')(rnn_x) # 合并两个分支的输出,传入FCN combined = concatenate([cnn_output, rnn_output]) fcn_output = Dense(10, activation='softmax')(combined) # 构建并编译模型 model = Model(inputs=[cnn_input, rnn_input], outputs=fcn_output) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 模拟训练数据 import numpy as np cnn_train_data = np.random.rand(1000, 28, 28, 1) rnn_train_data = np.random.rand(1000, 10, 32) labels = np.random.randint(0, 10, size=(1000,)) # 开始训练 model.fit([cnn_train_data, rnn_train_data], labels, epochs=5, batch_size=32)
几个注意事项
- 硬件环境检查:如果指定GPU后报错,先确认你安装的是TensorFlow GPU版本,且CUDA、cuDNN的版本和TensorFlow兼容;
- 数据传输开销:如果你的输入数据初始在CPU,传到GPU给RNN时会有少量数据传输开销,但因为两个分支是并行计算的,这个开销通常不会成为瓶颈;
- 灵活调整设备:你也可以根据硬件性能反过来分配(比如把计算量大的CNN放到GPU,RNN放CPU),核心就是用
tf.device()隔离不同组件的运行设备。
内容的提问来源于stack exchange,提问作者user9459060
相关产品推荐
相关产品推荐

