Skip to main content
 首页 » 编程设计

python之验证 TensorFlow 是否最大限度地利用了 NVIDIA GPU

2024年11月01日29jpfss

我最近用一张 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 负载测试作者在我认为应该是类似卡(1060 对 1070)时看到的性能的 1/12。我错过了什么吗?我应该只期望这种性能水平吗?使用相同的负载测试和类似的卡,其他人对性能有何看法? TensorRT 有帮助吗?

谢谢!

请您参考如下方法:

所以我找到了原因或更好的检查。官方的 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%。