问题描述
当使用来自 4 个线程的 SSD 的 200gb 训练数据训练神经网络时,每个 worker 读取大约 130mb/s(这是合理的,因为 SSD 的读取上限为 ~550mb/s,4*130=520)并且每个cpu 内核以大约 50% 的容量运行。
我运行 hdparm
来验证我的 SSD 的上限读取速度和检查的数字 (517mb/s ~ 520mb/s)
$ sudo hdparm -Tt /dev/sdb1
/dev/sdb1:
Timing cached reads: 34848 MB in 1.99 seconds = 17551.72 MB/sec
Timing buffered disk reads: 512 MB in 0.99 seconds = 517.72 MB/sec
我想如果我提高读取速度上限,我会加快训练速度,所以我得到了一个最大读取速度为 3.4gb/s (WD_BLACK SN750) 的 NVME。当训练数据存储在那里时,我得到每个线程 180mb/s 的速度,每个 cpu 内核以 65-70% 的速度运行。
显然我没有充分利用新存储设备的读取速度(180*4 = 720mb/s)
我认为它可能有缺陷,所以我运行了 hdparm
...
$ sudo hdparm -Tt /dev/nvme0n1p1
/dev/nvme0n1p1:
Timing cached reads: 33344 MB in 1.99 seconds = 16785.79 MB/sec
Hdio_DRIVE_CMD(identify) Failed: Inappropriate ioctl for device
Timing buffered disk reads: 4358 MB in 3.00 seconds = 1452.21 MB/sec
...并且它运行的数字比神经网络训练线程高。不是 3.4gb/s,但仍然更大! (1.4gb/s > 720mb/s)。
为什么没有以最大速率尽可能快地读取 cpu 来追赶?如何消除这个新瓶颈? NVME 是否有一些我不知道的奇怪情况?
这是培训电话
model.nn_model.fit(x=training_data_generator,steps_per_epoch=training_data_generator.getSteps(),epochs=epochs,callbacks=callbacks,validation_data=validation_data_generator,validation_steps=validation_data_generator.getSteps(),workers=4,use_multiprocessing=True)
谢谢!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)