数据并行
1. tensorflow
x_split = tf.split(x, gpu_num) # 对数据进行分片
tower_grads = []
global_step = tf.train.get_or_create_global_step()
lr = noam_scheme(self.hp.lr, global_step)
optimizer = tf.train.AdamOptimizer(lr)
for i in range(gpu_num):
# 如果将某些运算放在不同的GPU中或CPU中,需要通过tf.device来指定。
with tf.device('/gpu:{}'.format(i)):
xs = x_split[i]
ys = y_split[i]
y_out=model(xs)
loss = tf.nn.sigmoid_cross_entropy_with_logits(logits=y_out, labels=y_split[i], name=None)
# 计算各个gpu的梯度
grads = optimizer.compute_gradients(loss)
tower_grads.append(grads)
def average_gradients(tower_grads):
average_grads = []
for grad_and_vars in zip(*tower_grads):
grads = []
for g, _ in grad_and_vars:
expend_g = tf.expand_dims(g, 0)
grads.append(expend_g)
grad = tf.concat(grads, 0)
grad = tf.reduce_mean(grad, 0)
v = grad_and_vars[0][1]
grad_and_var = (grad, v)
average_grads.append(grad_and_var)
return average_grads
# 得到合并的梯度
grads = average_gradients(tower_grads)
# global_step会自动+1
train_op = optimizer.apply_gradients(grads,global_step=global_step)
"""
为了避免指定GPU的操作而不支持GPU,TF在生成会话时可以指定allow_soft_placement参数,
当allow_soft_placement参数设置为True时,如果运算无法由GPU执行,会自动放在CPU中。
若没有这个参数,会报错: Cannot assign a device for operation
"""
with tf.Session(config=tf.ConfigProto(allow_soft_placement=True)) as sess:
for i in tqdm(range(1000)):
sess.run([train_op, global_step])
2. torch
model = torch.nn.DataParallel(model,device_ids=[0,1,2,3])
loss=model(inputs, labels)
- 当device_ids包括多个gpu时,在调用
model.forward时会把输入数据(inputs, labels)自动在batch维度(默认是0)等切分到多个gpu,要求(inputs, labels)必须是tensor类型才会等切分,list类型则会通过广播机制直接复制到多个gpu,不会切分
- 在
model(inputs, labels)前把输入数据(inputs, labels)都放在cuda 0上就行
- 正常情况下,当在
model.forward中设置断点debug的时候,因为程序是在多卡上运行的,pycharm的debug功能会失效,程序并不会停在断点处。
不过也不是没有办法,我们可以在model.forward写一个错误语句,比如print(zxd),因为没有zxd这个变量,所以会报错。并且保证错误语句之前没有设置任何断点,然后点击debug,则程序会停在错误语句那儿,出现debug面板,就可以查看变量的值了。
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。