NVME 通过 Tensorflow 读取神经网络训练训练数据的速度上限

问题描述

当使用来自 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 (将#修改为@)