使用:
Tensorflow version 1.15 - C++ API
Driver Version: 440.33.01
CUDA Version: 10.2
GPU Device: NVIDIA GeForce RTX 2080 Ti
我正在尝试运行3个tensorflow会话,每个会话都在同一gpu上拥有自己的tf计算图副本。将我的1个NVIDIA GeForce RTX 2080 Ti划分为3个虚拟设备(使用https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/protobuf/config.proto中的Experiment :: VirtualDevices)之后,我启动了3个tensorflow会话,每个会话都来自不同的线程并具有不同的设备目标。这样,我就可以将每个会话的操作映射到物理GPU设备上的不同CUDA流中。
我现在正在使用nsight系统分析tensorflow会话推断,以便尝试同时在所有3个会话中运行推断以测试gpu吞吐量。这是我正在观察的时间线视图: nsys_timeline_view_01
在将所有3个输入张量都复制到设备上以进行推断之后,如您从上面的时间线视图所看到的,CUDA流18、14和22正在并发执行操作,尽管数据并行,但并行度很小。
对我来说,这表明我可能在计算资源方面受到限制,该如何验证呢?在这种情况下,如何找到瓶颈资源?还有其他建议使用的工具,例如nsight-compute,可以更深入地研究这个问题吗?
在同时执行活动3个cuda流的时间轴上进行放大: nsys_timeline_view_02
从上面的视图中选择一个随机内核,例如EigenKernel,我观察到该内核的理论占用率为100%:sample_concurrent_kernel_event_view_stats
这是否表示内核已映射到物理gpu可用的100%cuda线程?在那种情况下,我可能会受到计算的限制,应该专注于通过使用更简单的操作优化tf计算图的运行时间吗?还是可以将内核更改为cuda线程映射,以占用较少的计算资源来鼓励cuda流之间的更大并行性?
我的目标是减少每次会话的推理时间。
任何见解/建议都将不胜感激!