【问题标题】:verify TensorFlow is maximizing use of NVIDIA GPU验证 TensorFlow 是否最大限度地利用了 NVIDIA GPU
【发布时间】:2019-09-25 06:46:01
【问题描述】:

我最近设置了一台带有单个 NVIDIA GeForce GTX 1060 6GB 卡的 Ubuntu 19.04 机器。这是我第一次在 Linux 中使用所有深度学习的东西。我关注了几个不同的教学博客,以获得我认为的功能性 CUDA/Python 环境。我的下一步是运行一些示例“大型作业”并验证我获得了预期的性能。

我发现了这个链接 - https://medium.com/@andriylazorenko/tensorflow-performance-test-cpu-vs-gpu-79fcd39170c。它似乎有示例/教程代码可以锻炼我的系统,并且还有一些基准性能统计数据。

当我按照 tutorials/image/cifar10 的指示运行 python cifar10_train.py 时,我看到以下内容:

Every 1.0s: nvidia-smi                                                                                                                                                  prospector: Wed Sep 25 06:33:56 2019

Wed Sep 25 06:33:56 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.87.00    Driver Version: 418.87.00    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 106...  On   | 00000000:41:00.0 Off |                  N/A |
| 33%   33C    P2    31W / 120W |   6034MiB /  6075MiB |      6%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0    101339      C   python                                      6023MiB |
+-----------------------------------------------------------------------------+

因此,该作业似乎正在 GPU 上运行并使用所有可用内存。然而,这个测试也固定了我的 Threadripper 1920X 的所有 24 个内核。 GPU 温度仅增加几度,风扇从未真正超过 33%。 python脚本的一些相关输出:

2019-09-25 06:33:30.860034: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5702 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:41:00.0, compute capability: 6.1)
2019-09-25 06:33:30.862049: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55f63af4ce80 executing computations on platform CUDA. Devices:
2019-09-25 06:33:30.862071: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): GeForce GTX 1060 6GB, Compute Capability 6.1
2019-09-25 06:33:30.951617: W tensorflow/compiler/jit/mark_for_compilation_pass.cc:1412] (One-time warning): Not using XLA:CPU for cluster because envvar TF_XLA_FLAGS=--tf_xla_cpu_global_jit was not set.  If you want XLA:CPU, either set that envvar, or use experimental_jit_scope to enable XLA:CPU.  To confirm that XLA is active, pass --vmodule=xla_compilation_cache=1 (as a proper command-line flag, not via TF_XLA_FLAGS) or set the envvar XLA_FLAGS=--xla_hlo_profile.
I0925 06:33:31.438272 140501771114304 session_manager.py:500] Running local_init_op.
I0925 06:33:31.456041 140501771114304 session_manager.py:502] Done running local_init_op.
I0925 06:33:31.804769 140501771114304 basic_session_run_hooks.py:606] Saving checkpoints for 0 into /tmp/cifar10_train/model.ckpt.
2019-09-25 06:33:32.217337: I tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library libcublas.so.10
2019-09-25 06:33:32.521519: I tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library libcudnn.so.7
2019-09-25 06:33:33.481558: step 0, loss = 4.68 (453.2 examples/sec; 0.282 sec/batch)
2019-09-25 06:33:36.138869: step 10, loss = 4.59 (481.7 examples/sec; 0.266 sec/batch)
2019-09-25 06:33:38.594918: step 20, loss = 4.39 (521.2 examples/sec; 0.246 sec/batch)
2019-09-25 06:33:41.108821: step 30, loss = 4.49 (509.2 examples/sec; 0.251 sec/batch)
2019-09-25 06:33:43.613224: step 40, loss = 4.40 (511.1 examples/sec; 0.250 sec/batch)
2019-09-25 06:33:46.074761: step 50, loss = 4.36 (520.0 examples/sec; 0.246 sec/batch)
2019-09-25 06:33:48.577182: step 60, loss = 4.07 (511.5 examples/sec; 0.250 sec/batch)
2019-09-25 06:33:51.072065: step 70, loss = 4.19 (513.1 examples/sec; 0.249 sec/batch)
2019-09-25 06:33:53.582682: step 80, loss = 4.14 (509.8 examples/sec; 0.251 sec/batch)
2019-09-25 06:33:55.993107: step 90, loss = 4.14 (531.0 examples/sec; 0.241 sec/batch)

我第一次尝试这个时遇到了一些安装问题,必须重新安装所有东西才能看到 GPU。但是,从上面的输出和 nvidia-smi 的输出来看,测试显然是在使用 GPU。但是,当我查看帖子作者在使用单个 1070 卡时获得的示例/秒时,他声称他获得了超过 6,000,这是我看到的 12 倍!

我的问题是:

1) 根据我的硬件(32MB RAM、6GB VRAM),我是否从该测试中获得了预期的性能?

2) 我是否应该期望这个测试也能最大限度地利用我的所有 24 个 Threadripper 内核,并使 CPU 的温度几乎达到 68C 的最高温度?

3) 我可以运行更好的验证测试吗?

我希望确保我的系统设置正确,如果不正确,我应该如何追踪任何瓶颈或错误配置。

PS - 我还注意到一个叫做 Tensor RT 的东西。这与性能图有什么关系?

感谢 RaJa 的回复。我从您发送的链接中运行了第一个测试,就像我上面运行的 TensorFlow 负载测试的输出一样,它表明它识别并正在使用 GPU:

2019-09-25 07:55:24.868796: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2019-09-25 07:55:24.989039: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1405] Found device 0 with properties:
name: GeForce GTX 1060 6GB major: 6 minor: 1 memoryClockRate(GHz): 1.7085
pciBusID: 0000:41:00.0
totalMemory: 5.93GiB freeMemory: 5.86GiB
2019-09-25 07:55:24.989066: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1484] Adding visible gpu devices: 0
2019-09-25 07:55:25.302006: I tensorflow/core/common_runtime/gpu/gpu_device.cc:965] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-09-25 07:55:25.302044: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971]      0
2019-09-25 07:55:25.302050: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] 0:   N
2019-09-25 07:55:25.302169: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1097] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5640 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:41:00.0, compute capability: 6.1)
Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:41:00.0, compute capability: 6.1
2019-09-25 07:55:25.360593: I tensorflow/core/common_runtime/direct_session.cc:288] Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 1060 6GB, pci bus id: 0000:41:00.0, compute capability: 6.1

MatMul: (MatMul): /job:localhost/replica:0/task:0/device:GPU:0
2019-09-25 07:55:25.361267: I tensorflow/core/common_runtime/placer.cc:935] MatMul: (MatMul)/job:localhost/replica:0/task:0/device:GPU:0
a: (Const): /job:localhost/replica:0/task:0/device:GPU:0
2019-09-25 07:55:25.361289: I tensorflow/core/common_runtime/placer.cc:935] a: (Const)/job:localhost/replica:0/task:0/device:GPU:0
b: (Const): /job:localhost/replica:0/task:0/device:GPU:0
2019-09-25 07:55:25.361302: I tensorflow/core/common_runtime/placer.cc:935] b: (Const)/job:localhost/replica:0/task:0/device:GPU:0
[[22. 28.]
 [49. 64.]]

我不太关心它是否识别 GPU 并正在使用它,我更关心它是否最大化它对 GPU 的使用。请参阅我上面的 3 个问题。我最担心的是,我看到的性能只有 TensorFlow 负载测试的作者看到的性能的 1/12,而我认为应该是类似的卡(1060 与 1070)。我错过了什么吗?我应该只期望这种水平的性能吗?其他人使用相同的负载测试和类似的卡对性能有何看法? TensorRT 会有帮助吗?

谢谢!

【问题讨论】:

  • 你可以根据本指南检查输出:tensorflow.org/guide/using_gpu 吗?应该有使用什么设备的信息。
  • 我已经尝试过教程。我的机架有 4 个 Titan Z GPU,一个相当老的处理器,可以达到 200 个样本/秒。它使用所有 4 个 GPU。所以我假设你必须为你的系统编译 Tensorflow 才能获得足够的收益(就像他在教程中所做的那样)。
  • 看来您需要正确组合 CUDA 和 Tensorflow 才能获得完整的性能。似乎某些 CUDA 版本存在错误。
  • 使用 1 个或 4 个 GPU 没有任何区别。我仍然只能获得 200 个样本/秒。我可以看到消耗的 GPU 内存的差异。无论如何,问题可能出在其他地方。也许是硬盘或CPU?在相应的教程 (tensorflow.org/tutorials/images/deep_cnn) 中,他们在 Tesla K40c 上获得了 400 个样本

标签: python tensorflow


【解决方案1】:

所以我找到了原因或更好的检查。官方的 cifar10-test 有点错误,因为 tensorflow-repository 中已经存在问题。

我在这里找到了一个更好的工作示例:multi-gpu example

只需使用python3 multigpu_cnn.py 运行文件并观察每秒的样本数。然后您可以更改文件中的gpus数量并再次检查。

我的数据(4 Titan Z):

  • 2 个 GPU -> 8800 个样本/秒
  • 4 个 GPU -> 15500 个样本/秒

检查nvidia-smi显示最后一个示例的所有 GPU 上的负载为 100%。

【讨论】:

  • RaJa 你这个男人!这正是我希望做的——充分锻炼我的 GPU 并验证我的设置是否正确。我在单个 GeForce GTX 1060 6GB 上获得了大约 5,700 个示例/秒,我看到 GPU 温度随着使用的所有 GPU 内存而上升。同时,我的 CPU 仅使用了大约 33%,负载不高于 8(在 24 核上),并且 CPU 温度从未超过 40C。非常感谢您帮助我验证我的安装 RaJa!现在唯一剩下的问题是,安装 TensorRT 将如何帮助提升 DL GPU 性能。
  • 我安装了 TensorRT,但不用于训练。 RT 的主要目的是优化现有模型以在推理过程中获得最佳性能。
  • 还要注意 GPU 利用率几乎是 100%,平均功耗始终超过 100W,并且 nvidia-smi(或性能状态)上的 Perf 列保持在 P2(P0 是最高性能状态)测试未运行时为 P8。我希望从适当的负载/验证测试中看到的所有内容。再次感谢 RaJa!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
相关资源
最近更新 更多