当使用 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)
谢谢!