pytorch中多GPU的batch_size问题

KeyError: Caught KeyError in replica 0 device, 或者ValueError: Caught ValueError in replica 0 on device 0.都是因为batch_size没有设好。
在端到端的语音中,一个语句就是一个输入,total即总的输入就是text中的行数,用wc -l text,就可以看到了。
多个gpu训练时,每个gpu上的负载时batch_size / n_gpu
训练迭代的次数为total / batch_size
但是肯定会有余数,要注意的是不要让余数恰好被n_gpu - 1整除。
要注意的一点就是每个gpu上分的数据可以是不相等的,好比batch_size = 13, n_gpu = 4,这样是可以的,不一定要一定整除,我试验了一下发现是没问题的。但是batch_size不能等于3的倍数,好比9,这样就会导致全部分到前3个gpu上,第4个gpu上分不到数据,就会报keyerror 或者value error。
也就是说上面的余数和batch_size不要恰好等于小于你总调用的gpu个数的gpu的倍数,比较绕口。举例就是,好比余数或者batch_size为m,gpu个数为n, 要保证下面的式子。伪代码,见谅。

for i <  n:
	m % i != 0

不过一般为了保证每个gpu负载均衡,batch_size要设成n_gpu的倍数,报错时可以计算一下余数,然后调整bathc_size的大小,保证余数的大小满足上面的伪代码。
runtime error一般都是因为batch_size设的过大,gpu显存不够了,调小一点就好了。
今天遇到runtime error,因为我并行模型时并行了两次,代码重复写了。

也可以在加载数据时,把drop_last设为True,
当你的整个数据长度不能够整除你的batchsize,选择是否要丢弃最后一个不完整的batch,默认为False。
2022.4.27
使用dataparallel时会出现上述问题,使用分布式数据并行可以自己重写一下给每个gpu分配batch的函数,可以避免上面的问题,也不用考虑batchsize和gpu的关系了。推荐采用分布式。

  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
是的,batchbatch_size是密切相关的。在深度学习中,batch是指一次训练所使用的样本数,而batch_size则是指每个batch中包含的样本数。因此,batch_size的大小直接影响到每次训练所使用的样本数量,进而影响到模型的优化程度和速度。 通常情况下,batch_size的大小应该根据GPU显存的大小来设置。如果GPU显存较小,则应该将batch_size设置为较小的值,以避免显存溢出。另外,较小的batch_size也可以提高模型的收敛速度,但同时也会增加训练的时间。 在使用batch训练模型时,还可以使用shuffle函数对数据进行打乱,以增加模型的泛化能力和减少过拟合的风险。 下面是一个使用batch训练模型的例子: ```python import tensorflow as tf # 加载数据集 (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() # 对数据进行预处理 x_train = x_train.reshape(-1, 28 * 28).astype('float32') / 255.0 x_test = x_test.reshape(-1, 28 * 28).astype('float32') / 255.0 y_train = tf.keras.utils.to_categorical(y_train) y_test = tf.keras.utils.to_categorical(y_test) # 构建模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(512, activation='relu', input_shape=(784,)), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit(x_train, y_train, batch_size=32, epochs=5, shuffle=True) # 评估模型 model.evaluate(x_test, y_test) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值