0

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

谢谢!

4

0 回答 0