CUDA Graph Jit Optimization
CUDA Graph是NVIDIA提出的一种CUDA runtime优化,将原本issue到cuda stream上的一系列kernel编译生成一个CUDA Graph的执行对象并issue到选中的CUDA stream上。 后续对该CUDA Graph可执行对象的的调用不需要重复issue的操作,从而节省下了cuda kernel launch的开销。DeepRec目前提供了一种基于Jit自动圈图机制的开启CUDA Graph优化 的方法(JitCugraph),开启后在推理任务中DeepRec的runtime会自动寻找适合的子图并将其编译封装到CUDA Grahp的可执行文件中,后续执行到该子图时,不需要launch子图中原有的CUDA kernel 而是直接执行已经被缓存在CUDA stream中的该子图对应文件。此功能适用于具有大量小size的GPU算子的场景中,当GPU算子的执行时间和算子的launch开销相当时开启JitCugraph将会有明显的收益。
推理任务全局开启JitCugraph
目前JitCugraph支持推理侧全局开启自动圈图的功能,使用时只需要对SessionOptions
进行配置即可
SessionOptions options;
options.config.mutable_gpu_options()->set_cuda_graph_enable_jit(true);
由于JitGraph在第一遍执行的时候需要对被圈中的子图进行编译, 所以第一次的Serving的latency比较长,建议进行一次预热后再进行性能的测试。
目前JitGraph只在单个Session的serving场景下工作,SessionGroup下的用法后续也会支持。
目前JitGraph功能和TF XLA有冲突,两者不要同时开启。
添加白名单和黑名单
由于JitCugraph对于某些算子上的使用有限制,用户可以通过设置黑名单和白名单环境变量来控制需要进行JitCugraph优化的算子种类。当开启黑名单后,名单内的算子将不会被JitCugraph圈中;当开启白名单后,JitCugraph只会圈中名单内的算子。
# 使用黑名单
TF_CGMODE_FLAGS="--tf_cgmode_exclude_ops_to_cluster=Relu,Unique"
# 使用白名单
TF_CGMODE_FLAGS="--tf_cgmode_ops_to_cluster=MatMul,AddN"
控制自动圈图的子图大小
类似TF-XLA, JitCugraph可以通过设置tf_cgmode_min_cluster_size
和tf_cgmode_max_cluster_size
两个
环境变量来控制自动子图圈图时的子图包含算子OP的数目
# 限制最小的子图算子数目为3,包含3个以下OP的子图会被排除(默认值)
TF_CGMODE_FLAGS="--tf_cgmode_min_cluster_size=3"
# 最大cluster size一般不需要设置,默认值为int32最大值,一般认为圈中的子图越大性能越好。
TF_CGMODE_FLAGS="--tf_cgmode_max_cluster_size=10"
注意当使用多个环境变量时用空格隔开
TF_CGMODE_FLAGS="--tf_cgmode_min_cluster_size=3 --tf_cgmode_exclude_ops_to_cluster=Relu,Unique"