前言
说实话,之前我在笔记本上都一直都是只有一块N卡,所以没有过多关注过这个问题。然而昨天有个人问我,TensorRT怎么在多个GPU中指定模型推理GPU设备?我查了一下,发现官方有几个不同的解决方案,个人总结了一下,主要的做法有两种。
01配置环境变量支持
该方法的好处是不需要修改代码,通过配置环境变量就可以实现指定的GPU运行,缺点是缺乏灵活性,特别是想切换不同GPU实现模型推理的时候,这个方法就弊端就比较明显。
CUDA编程中支持的指定GPU设备的环境变量为:
CUDA_VISIBLE_DEVICES通过该系统的环境变量可以设置指定的单个GPU编号或者多个GPU编号合集,然后在程序测试与调试环境中使用。通过这种方式指定GPU编号执行模型推理,就无需修改代码,实现在单一指定的GPU上运行TensorRT推理程序。
02代码指定GPU设备执行
一台机器上可能有多个GPU设备,通过CUDA编程可以查询机器上所有的GPU设备,查询这些设备的属性以及决定使用哪个GPU设备作为当前设备。
cudaGetDeviceCount该函数可以查询到当前机器上GPU设备数目,然后遍历查询每个GPU设备的属性。官方教程给出的代码如下:
//查询设备数目
intdeviceCount;
cudaGetDeviceCount(&deviceCount);
//遍历设备编号信息
intdevice;
for(device=0;device< deviceCount; ++device) {
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, device);
printf("Device %d has compute capability %d.%d.
",
device, deviceProp.major, deviceProp.minor);
}
根据查询的设备数目,GPU编号从0开始,默认情况下当前使用的设备就是编号为0的GPU设备,通过函数cudaSetDevice()可以修改运行时使用GPU设备,在初始化TensorRT之前,先通过cudaSetDevice()函数修改默认的当前设备,然后再初始化就可以把TensorRT的模型绑定到指定编号的GPU设备上推理。以我的笔记本上为例,设置当前的GPU设备,然后初始化TensorRT代码如下:
// 设置当前设备为GPU 0 cudaSetDevice(0);// 初始化TensorRT this->runtime=createInferRuntime(gLogger); assert(this->runtime!=nullptr); this->engine=runtime->deserializeCudaEngine(trtModelStream,size); assert(this->engine!=nullptr); this->context=engine->createExecutionContext(); assert(this->context!=nullptr); delete[]trtModelStream; // do more thing here// insert query input and output layers information //创建GPU显存输入/输出缓冲区 std::cout<< " input/outpu : " << engine->getNbBindings()<< std::endl; cudaMalloc(&buffers[input_index], this->input_h*this->input_w*3*sizeof(float)); cudaMalloc(&buffers[2],this->output_h*this->output_w*sizeof(float)); cudaMalloc(&buffers[1],32*25600*sizeof(float)); //创建临时缓存输出 prob.resize(output_h*output_w); mprob.resize(32*25600); //创建cuda流 cudaStreamCreate(&stream);在多个GPU设备上执行多个模型推理的初始化代码如下:
//初始化时间标记
cudaEvent_tstart,stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start,0);
//查询设备数目
intdeviceCount;
cudaGetDeviceCount(&deviceCount);
//遍历设备编号信息
intdevice;
for(device=0;device< deviceCount; ++device) {
cudaDeviceProp deviceProp;
cudaGetDeviceProperties(&deviceProp, device);
printf("Device %d has compute capability %d.%d.
",
device, deviceProp.major, deviceProp.minor);
}
// Set GPU 0 as current
cudaSetDevice(0);
cudaStream_t s0;
cudaStreamCreate(&s0);
void* p0[1];
size_t size = 1024 * sizeof(float);
cudaMalloc(p0[0], size);
// initialization TensorRT here on GPU 0
// Set GPU 1 as current
cudaSetDevice(1);
cudaStream_t s1;
cudaStreamCreate(&s1);
// initialization TensorRT here on GPU 1
// 计算执行时间
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
float elapsedTime;
cudaEventElapsedTime(&elapsedTime, start, stop);
printf("time to consume: %3.1f ms
", elapsedTime);
// 销毁
cudaEventDestroy(start);
cudaEventDestroy(stop);
关于延时加载
TensorRT8.6支持CUDA Lazy Loading(延时加载),开发者文档上说这种方式可以有效降低GPU显存与内存使用,加速初始化,节省模型初始化时间,可以通过环境变量配置实现延时加载支持,相关环境变量为:
CUDA_MODULE_LOADING=LAZY
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
gpu
+关注
关注
28文章
5271浏览量
136060 -
编程
+关注
关注
90文章
3723浏览量
97434 -
模型
+关注
关注
1文章
3816浏览量
52265 -
调试环境
+关注
关注
0文章
5浏览量
6078
原文标题:TensorRT | 在多个GPU中指定推理设备
文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
DeepSeek R1 MTP在TensorRT-LLM中的实现与优化
TensorRT-LLM 在 NVIDIA Blackwell GPU 上创下了 DeepSeek-R1 推理性能的世界纪录,Multi-Token Prediction (MTP)
如何在GPU上使用TensorRT部署深度学习应用程序
本文未涉及的一个主题是在 TensorRT 中以 INT8 精度精确地执行推理。 TensorRT 自动转换 FP32 网络以进行部署,同时降低精度损失。为了实现这一目标,
NVIDIA 在首个AI推理基准测试中大放异彩
和TensorRT软件的成熟程度。它们让用户能够更加轻松地将所有的NVIDIA GPU应用于数据中心、边缘等领域。MLPerf定义了五项推理基准,涵盖了三个现有的人工智能应用:图像分类、目标检测和翻译。每项基准
发表于 11-08 19:44
TensorFlow指定CPU和GPU设备操作详解
TensorFlow 支持 CPU 和 GPU。它也支持分布式计算。可以在一个或多个计算机系统的多个设备上使用 TensorFlow。Ten
发表于 07-28 14:33
充分利用Arm NN进行GPU推理
Arm拥有跨所有处理器的计算IP。而且,无论您要在GPU,CPU还是NPU上进行ML推理,都可以在一个通用框架下使用它们:Arm NN。Arm NN是适用于CPU,GPU和NPU的开源
发表于 04-11 17:33
Keil中指定代码段与常量在Flash中地址方法
图 分配代码文件到Flash指定位置方法 在.sct文件中指定代码输出文件(.o格式)到Flash指定位置,如下图 BootMain
发表于 11-20 14:36
•20次下载
NVIDIA TensorRT 8.2将推理速度提高6倍
TensorRT 是一款高性能的深度学习推理优化器和运行时,为人工智能应用程序提供低延迟、高吞吐量推理。 TensorRT 用于医疗、汽车、制造、互联网/电信服务、金融服务和能源等
NVIDIA TensorRT助力打造AI计算机视觉算法推理平台
“在使用 NVIDIA TensorRT和NVIDIA T4 GPU对平台赋能后,“极星”推理平台的算法推理效率得到了进一步的提升,更好地支
NVIDIA T4 GPU和TensorRT加速微信搜索速度
使用NVIDIA T4 GPU以及TensorRT推理引擎进行INT8低精度推理,极大提升了微信搜索的速度,进一步提升了用户体验,节约了公司成本。
NVIDIA TensorRT插件的全自动生成工具
NVIDIA TensorRT 是性能最优、应用最广的 GPU 推理框架,但用户常常因为不支持的算子而面临手写插件的痛点。为此,腾讯 TEG 与 NVIDIA 联合开发了一款能自动生成插件的工具
学习资源 | NVIDIA TensorRT 全新教程上线
NVIDIA TensorRT 是一个用于高效实现已训练好的深度学习模型推理过程的软件开发工具包,内含推理优化器和运行环境两部分,其目的在于让深度学习模型能够在
现已公开发布!欢迎使用 NVIDIA TensorRT-LLM 优化大语言模型推理
NVIDIA 于 2023 年 10 月 19 日公开发布 TensorRT-LLM ,可在 NVIDIA GPU 上加速和优化最新的大语言模型(Large Language Models)的推理
Torch TensorRT是一个优化PyTorch模型推理性能的工具
那么,什么是Torch TensorRT呢?Torch是我们大家聚在一起的原因,它是一个端到端的机器学习框架。而TensorRT则是NVIDIA的高性能深度学习推理软件工具包。Torch Te
利用NVIDIA组件提升GPU推理的吞吐
本实践中,唯品会 AI 平台与 NVIDIA 团队合作,结合 NVIDIA TensorRT 和 NVIDIA Merlin HierarchicalKV(HKV)将推理的稠密网络和热 Embedding 全置于 GPU 上进行
NVIDIA TensorRT LLM 1.0推理框架正式上线
TensorRT LLM 作为 NVIDIA 为大规模 LLM 推理打造的推理框架,核心目标是突破 NVIDIA 平台上的推理性能瓶颈。为实现这一目标,其构建了多维度的核心实现路径:一
TensorRT怎么在多个GPU中指定推理设备
评论