首页 > 解决方案 > AWS、库达、张量流

问题描述

当我在最强大的 AWS GPU 实例(使用 1 或 8 个 Tesla v100 16mb aka.P3.x2large 或 P3.16xlarge)上运行我的 Python 代码时,它们都只比我的 DELL XPS Geforce 1050 快 2-3 倍-钛笔记本?

我正在使用 Windows、Keras、Cuda 9、Tensorflow 1.12 和最新的 Nvidia 驱动程序。

当我通过 GZU 检查 GPU 负载时​​,GPU 最大值。在很短的时间内以 43% 的负载运行 - 每次。控制器以最大速度运行。100%...

我使用的数据集是 JSON 格式的矩阵,文件位于 10TB 的 Nitro 驱动器上,最大 64.000 IOPS。无论文件夹包含 10TB、1TB 还是 100mb……每次迭代的训练仍然非常缓慢?

非常欢迎所有建议!

更新 1:

来自 TensorFlow 文档:

"要启动输入管道,必须定义源。例如,要从内存中的一些张量构造数据集,可以使用 tf.data.Dataset.from_tensors() 或 tf.data.Dataset.from_tensor_slices()。或者,如果您的输入数据以推荐的 TFRecord 格式存储在磁盘上,您可以构造一个 tf.data.TFRecordDataset。"

在我以 JSON 格式(由 Node 制作)存储矩阵之前。我的 TF 在 Python 中运行。我现在只将坐标保存在 Node 中并以 JSON 格式保存。现在的问题是:在 Python 中,加载数据的最佳解决方案是什么?TF可以只使用坐标还是我必须再次将坐标恢复为矩阵或什么?

标签: python-3.xperformancetensorflowamazon-ec2keras

解决方案


首先,您应该有充分的理由使用基于 Windows 的 AMI 来增加计算开销。

如果您的 CPU 处于 ~100%,而 GPU 低于 100%,那么您的 CPU 可能是瓶颈。如果您在云上,请考虑迁移到 CPU 数量较多的实例(CPU 便宜,GPU 稀缺)。如果您无法增加 CPU 数量,则可以选择将图形的某些部分移至 GPU。但是,tf.data基于 - 的输入管道完全在 CPU 上运行(但由于 C++ 实现而具有高度可扩展性)。预取到 GPU 在这里也可能有所帮助,但生成另一个后台线程以填充下游缓冲区的成本可能会抑制这种效果。另一种选择是离线进行一些或所有预处理步骤(即在训练之前)

关于使用 Keras 作为输入管道的注意事项。Keras 依赖于 Python 的multithreading(以及可选的)库,与无GILmultiprocessing的实现相比,这些库可能既缺乏性能(在进行大量 I/O 或即时扩充时)和可扩展性(在多个 CPU 上运行时)。考虑离线执行预处理、预加载输入数据或使用替代输入管道(如前面提到的 TF native或 3rd party 的,如)。tf.dataTensorpack


推荐阅读