lix19937 / tensorrt-insight

deep insight tensorrt
1 stars 0 forks source link

nvidia tensorrt faq #25

Open lix19937 opened 5 days ago

lix19937 commented 5 days ago

NV培训材料反馈_QA_2021-9-18

From No. Questions Topic Comments
算法部署及移植团队 1) cublas的矩阵乘法为何在输入矩阵的的尺寸比较小的时候耗时会相对naive的乘法算子更多,cublas是如何保证float类型矩阵数据运算时的结果精度的. Cuda&DL 耗时问题需要结合上下文分析具体情况具体分析,与thread/block数目及输入/输出数据规模都有关系;
cuBLAS支持FP64/FP32/FP16精度,满足IEEE754标准 (https://docs.nvidia.com/cuda/floating-point/index.html ):
如遇到cuBLAS精度退化情况可以指定环境变量CUBLASLT_LOG_LEVEL=2,输出log提交给NV协助分析;
2) 如何选择合适的blocksize和gridsize,是否需要简化kernel函数来分配尽可能多的thread Cuda&DL 通过CUDA Occupancy Calculator(https://docs.nvidia.com/cuda/cuda-occupancy-calculator/index.html)来调整Thread Per Block配置以使得当前环境中的GPU利用率最大, blocksize和gridsize按照任务规模推定;
Thread并不是越多越好,对于计算是瓶颈的任务,提高occupancy更有效, 但访存也可能是影响任务性能的瓶颈;
3) 内存优化的方法有哪些,比如使用共享内存,提升内存命中率的一些方法 Cuda&DL 尽量减少数据读写操作,在初始化阶段读入数据后存入共享内存或register中由kernel处理,最后一次写出;
连续thread从连续内存地址读入数据,使用Pinned Memory存放不频繁更新数据,减少一次内存staging time;
多层循环中如果有某个数据结构需要多次访问,尽量让其全部在最里层中完成访问;
4) 在加载kernel时,grid,block, stream参数分配策略,有什么经验性技巧? Cuda&DL grid/block相关分配策略见2, 优先确定thread per block后, grid/block按照任务规模推定;
stream参数使用时,建议显式创建stream传入kernel函数, 默认stream会触发隐式同步, 可能影响性能;
5) 是不是对锁页内存的空间进行赋值与将分页内存数据拷贝到设备内存时间消耗要小很多? 待实验验证 Cuda&DL 是,分页内存到设备内存前需要首先进行一步锁页操作,创建锁页内存后将分页内存拷贝至锁页内存;
6) kernel中跑一些loop而减少thread总数目,实验发现有时候这种策略效率更高? 请确认 Cuda&DL 具体case具体分析,可以提个nvbug方便跟踪;
7) 异步拷贝使用场景,常见用法,如果主机端需要设备端结果,使用stream_synchronize 和实际同步拷贝没有区别? Cuda&DL 需要处理的数据规模较大,通过多stream方式分片异步加载处理可以提升性能;
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#explicit-synchronization
8) 跨block之间同步只能在主机端进行吗? Cuda&DL 设备端有以下两种方式实现跨block同步:
1. Grid Synchronization:
Host Code: cudaLaunchCooperativeKernel((void*)my_kernel, dimGrid, dimBlock, kernelArgs);
Device Code:
grid_group grid = this_grid();
grid.sync();
2. __threadfence()配合原子操作
9) kernel内嵌套调用是否和调用普通 device 函数一样的时间开销? Cuda&DL Dynamic parallelism通常开销会稍高,设备端执行kernel对应的device侧状态跟踪管理相关runtime库调用引入;
https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#dynamic-parallelism-enabled-kernel-overhead
10) cudamlloc分配device端内存时,host端数据类型为什么不能是float**? Cuda&DL 可以是float,检查float指向的float*对应内存是否正常申请,二维数组建议使用cudaMalloc2D/cudaMallocPitch申请
11) cublas相关函数能否提供更多的应用示例? Cuda&DL https://docs.nvidia.com/cuda/cublas/index.html#example-code
12) tensorRT plugin中使用INT8 数据格式的推理编写过程。 Cuda&DL Plugin中使用INT8数据格式需要自行标定Dynamic Range并提供相应cache
13) 使用多steam异步执行时的代码编写以及同步机制。 Cuda&DL https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#streams
14) INT8推理没有FP16速度快,可能的原因是什么? Cuda&DL TensorRT选用INT8 Kernel,可能导致部分FP32/FP16下可融合op未融合,从而导致性能变差,具体case具体分析
15) 实操Nsight系列工具对cuda算子进行性能分析 Cuda&DL 见Nsight Systems相关材料
16) 实操 TensorRT 的GPU+DLA计算图性能分析,浮点定点精度对比 Cuda&DL 见DLA及Nsight Systems相关材料
算法团队 1) tensorRT进行层融合,设计模型过程中,什么样的层结构更适合融合,什么样的层结构不适合融合,例如资料举例中rule+BN+Conv可以融合,那么rule6+BN+Conv是否可以融合。 Cuda&DL https://docs.nvidia.com/deeplearning/tensorrt/best-practices/index.html#fusion-types
2) 多个传感器的输入需要在规定时间内完成计算任务,反馈结果。Computer Graph Framework在资源调度上具体是如何操作的?有些算法耗时会有浮动,static recurring schedule是如何处理的?希望可以配合示例(例如PPT 15-18页)讲解下。 CGF 将每种传感器的任务流定义为一个Pipeline, Pipeline可以是HyperEpoch或Epoch(同一个HyperEpoch的Epochs 之间共享资源) 每个Epoch指定了一个Peroid周期。理想状态下,系统会按照这个周期对Epoch调度. 通过大量运行时记录每个Pass (Runnable)的WCET(Worest Case Execute Time)时间,并会运行时动态调整WCET和 任务图的计算资源分配. CGF通过确定性调度来减少系统的运行时随机性. 在没有外部任务时,算法时间差异会更小.
如果超出WCET,单个Pass会发生超时. 单个Pass超时不一定会影响整个FPS的降低. 发生极端情况,会有Failure Handling机制.
3) Transformer/gnn模型是否支持。 Cuda&DL transformer可以支持(swin-transformer),GNN可以给个实例用于分析
4) 针对移植部署的模型,在设计时的注意事项。 Cuda&DL https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#layers
https://docs.nvidia.com/deeplearning/tensorrt/best-practices/index.html#optimize-layer
5) 如何根据inference time决定哪些模型是适合用DLA,哪些模型适合再GPU上。单看pdf没有特别清楚,这个决策的strategy是什么,就是inference time这一个因素吗? Cuda&DL trtexec工具可以用来做perf分析,GPU算力强于DLA,可以根据业务需要把部分fps不敏感模型部署到DLA上;
DLA支持的layer:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#dla_layers
6) 对于DLA model给出了optimal batch size,FP16 mode 16 channels,while INT8 mode 32 channels for Conv,所有conv类型都这样吗? Cuda&DL 具体情况具体分析;
https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#dla_layers
7) 由于DLA model的限制还挺多,希望Nvidia提供一些例程和应用,或者推荐的网络结构。 Cuda&DL https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#dla_layers
8) NV对于第三方库的支持程度,比如opencv。如果支持或者优化的力度不高,那么模型后处理或者图像预处理进行矩阵运算的时候推荐的形式是什么?有NV封装过的的class可以使用吗? DW 目前DriveWorks提供了多种图像处理相关的算法比如计算图像金字塔、scaling、format trasformation等等
需要SAIC-R列举出涉及的OpenCV算法,同NV一起评估下,哪些可以移植到硬件Engine上(GPU,VIC,PVA....),SAIC-R已经在GPU上进行了部分算法优化工作
9) 想了解下Nvmedia相关的。在架构图中Nvmedia这个和其他传感器的抽象是分开的(一个在Drive OS层,一个在DriveWork层),是因为二者常用的计算行为不同还是别的考量? DW/NvMeidia Camera软件栈比较复杂,涉及到驱动、ISP等,所以在DriveOS中,专门提供NvMedia来处理Camera相关算法;同时,DriveWorks也对NvMedia进行了封装(SAL),集成了DriveWorks特有的功能,比如提供了面向CUDA的图片类型等;
而其它传感器的操作相对比较简单,可以通过SAL模块统一进行管理,所以放在DriveWorks层进行抽象
感知融合团队 1) CGF在哪个版本release? CGF DW5.0
2) dwChannel通信的底层实现机制是什么?通讯性能如何? DW/CGF dwChannel 支持 SHMEM, SOCKET, NvStream, 性能与带宽相关
3) dwChannel通信的数据是否支持录制和回放?(数据持久化) DW/CGF 在CGF系统框架下支持数据集的确定性回放. (多个通道回放时,数据集之间的时序(同步)关系保持不变);
dwChannel本身有录制功能,没有回放功能
4) CGF是否支持节点间的跨机通信?比如MDP和SDP之间的通信。 CGF 支持跨机通信。CGF使用dwChannel通信,有Socket和NvStream。Socket支持跨OS, NvStream支持跨节点C2C通信
(MDP -- 主域控制器, SDP -- 从域控制器)
5) CGF是否提供了AUTOSAR的数据接口? CGF SAIC-R会在Orin端部署adaptive AUTOSAR。SAIC-R在SOC端开发的软件需要跟MCU通信,并将通信的数据给到CGF,这里需要进一步确认需求细节,同时NV会内部沟通支持情况并反馈给SAIC-R
6) CGF是否支持跨平台多语言?(例如C++和Python) CGF CGF的Node基于C++,不支持python的接口
7) CGF和CUDA graph是什么关系? CGF 二者之间没有关系。CGF是面向自动驾驶开发的软件中间件,cuda graph则是cuda kernel调度的一种机制
8) CGF的通信机制与DriveWorks中的数据通信、录制机制是什么关系? CGF DriveWorks基于SAL提供了一个传感器录制工具,跟CGF-dwChannel的录制是无关的。
DW的通信模块有Socket和ImageStreamer,跟dwchannel一样,都是对底层通信机制的封装。
其中ImageStreamer侧重Image的处理,包括CPU/CUDA/NvMedia图像之间的转换。
而dwchannel在CGF的框架下注重抽象性(支持多种数据类型和多种传输机制),并有内存管理的功能.
9) Rig模块的功能是什么?看介绍应该是传感器数据采集工具。采集结果是否可以在DW或者CGF中使用? DW Rig模块提供了一系列接口,可以从json文件中读取传感器的配置信息以及内参外参信息,其中配置参数可以用于SAL模块对传感器进行初始化,内参外参可用于传感器校准,以及生成校准后的数据供算法模块使用;
除此之外可读取汽车的尺寸以及传感器相对于汽车的位置和方向等参数等,采集结果可以在CGF使用.