跨多个 GPU 的简单模型分区会导致工作负载在向前和向后传递期间从 GPU 移动到 GPU。任何时候,一个 GPU 都很忙。这是天真的版本。
with tf.device('/gpu:0'):
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
with tf.device('/gpu:1'):
model.add(Conv2D(128, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
with tf.device('/gpu:2'):
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(1500, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
我们需要示例代码(模板)来处理工作并通过发送批次波和协调每个 GPU 上的工作(前向、梯度计算、参数更新)来保持所有 GPU 忙碌。
这里通过使用 a提供了一个提示,data_flow_ops.StagingArea
但一个具体的例子会有所帮助。
我知道数据分区(或数据并行)是可行的方法,但存在模型需要跨 CPU+GPU 分区的用例。
感谢任何指针或示例(伪)代码。