前言
說實話,之前我在筆記本上都一直都是只有一塊N卡,所以沒有過多關(guān)注過這個問題。然而昨天有個人問我,TensorRT怎么在多個GPU中指定模型推理GPU設(shè)備?我查了一下,發(fā)現(xiàn)官方有幾個不同的解決方案,個人總結(jié)了一下,主要的做法有兩種。
01配置環(huán)境變量支持
該方法的好處是不需要修改代碼,通過配置環(huán)境變量就可以實現(xiàn)指定的GPU運行,缺點是缺乏靈活性,特別是想切換不同GPU實現(xiàn)模型推理的時候,這個方法就弊端就比較明顯。
CUDA編程中支持的指定GPU設(shè)備的環(huán)境變量為:
CUDA_VISIBLE_DEVICES通過該系統(tǒng)的環(huán)境變量可以設(shè)置指定的單個GPU編號或者多個GPU編號合集,然后在程序測試與調(diào)試環(huán)境中使用。通過這種方式指定GPU編號執(zhí)行模型推理,就無需修改代碼,實現(xiàn)在單一指定的GPU上運行TensorRT推理程序。
02代碼指定GPU設(shè)備執(zhí)行
一臺機(jī)器上可能有多個GPU設(shè)備,通過CUDA編程可以查詢機(jī)器上所有的GPU設(shè)備,查詢這些設(shè)備的屬性以及決定使用哪個GPU設(shè)備作為當(dāng)前設(shè)備。
cudaGetDeviceCount該函數(shù)可以查詢到當(dāng)前機(jī)器上GPU設(shè)備數(shù)目,然后遍歷查詢每個GPU設(shè)備的屬性。官方教程給出的代碼如下:
//查詢設(shè)備數(shù)目 intdeviceCount; cudaGetDeviceCount(&deviceCount); //遍歷設(shè)備編號信息 intdevice; for(device=0;device 根據(jù)查詢的設(shè)備數(shù)目,GPU編號從0開始,默認(rèn)情況下當(dāng)前使用的設(shè)備就是編號為0的GPU設(shè)備,通過函數(shù)cudaSetDevice()可以修改運行時使用GPU設(shè)備,在初始化TensorRT之前,先通過cudaSetDevice()函數(shù)修改默認(rèn)的當(dāng)前設(shè)備,然后再初始化就可以把TensorRT的模型綁定到指定編號的GPU設(shè)備上推理。以我的筆記本上為例,設(shè)置當(dāng)前的GPU設(shè)備,然后初始化TensorRT代碼如下:// 設(shè)置當(dāng)前設(shè)備為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 //創(chuàng)建GPU顯存輸入/輸出緩沖區(qū) std::cout<"?input/outpu?:?"?<getNbBindings()<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)); //創(chuàng)建臨時緩存輸出 prob.resize(output_h*output_w); mprob.resize(32*25600); //創(chuàng)建cuda流 cudaStreamCreate(&stream);在多個GPU設(shè)備上執(zhí)行多個模型推理的初始化代碼如下://初始化時間標(biāo)記 cudaEvent_tstart,stop; cudaEventCreate(&start); cudaEventCreate(&stop); cudaEventRecord(start,0); //查詢設(shè)備數(shù)目 intdeviceCount; cudaGetDeviceCount(&deviceCount); //遍歷設(shè)備編號信息 intdevice; for(device=0;device
關(guān)于延時加載
TensorRT8.6支持CUDA Lazy Loading(延時加載),開發(fā)者文檔上說這種方式可以有效降低GPU顯存與內(nèi)存使用,加速初始化,節(jié)省模型初始化時間,可以通過環(huán)境變量配置實現(xiàn)延時加載支持,相關(guān)環(huán)境變量為:
CUDA_MODULE_LOADING=LAZY
審核編輯:湯梓紅
-
gpu
+關(guān)注
關(guān)注
28文章
4776瀏覽量
129358 -
編程
+關(guān)注
關(guān)注
88文章
3637瀏覽量
93986 -
模型
+關(guān)注
關(guān)注
1文章
3313瀏覽量
49226 -
調(diào)試環(huán)境
+關(guān)注
關(guān)注
0文章
4瀏覽量
6014
原文標(biāo)題:TensorRT | 在多個GPU中指定推理設(shè)備
文章出處:【微信號:CVSCHOOL,微信公眾號:OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
如何在GPU上使用TensorRT部署深度學(xué)習(xí)應(yīng)用程序
![如何在<b class='flag-5'>GPU</b>上使用<b class='flag-5'>TensorRT</b>部署深度學(xué)習(xí)應(yīng)用程序](https://file.elecfans.com/web2/M00/3A/F7/pYYBAGJGp86AFcL9AAByd3CLOZY176.png)
NVIDIA 在首個AI推理基準(zhǔn)測試中大放異彩
TensorFlow指定CPU和GPU設(shè)備操作詳解
充分利用Arm NN進(jìn)行GPU推理
如何判斷推理何時由GPU或NPU在iMX8MPlus上運行?
Keil中指定代碼段與常量在Flash中地址方法
![Keil<b class='flag-5'>中指定</b>代碼段與常量<b class='flag-5'>在</b>Flash中地址方法](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
NVIDIA TensorRT 8.2將推理速度提高6倍
如何實現(xiàn)高效的部署醫(yī)療影像推理
NVIDIA TensorRT助力打造AI計算機(jī)視覺算法推理平臺
NVIDIA T4 GPU和TensorRT加速微信搜索速度
NVIDIA TensorRT插件的全自動生成工具
學(xué)習(xí)資源 | NVIDIA TensorRT 全新教程上線
![學(xué)習(xí)資源 | NVIDIA <b class='flag-5'>TensorRT</b> 全新教程上線](https://file1.elecfans.com//web2/M00/A0/C7/wKgaomToPMCACEEQAABDYMZ-TIM441.gif)
現(xiàn)已公開發(fā)布!歡迎使用 NVIDIA TensorRT-LLM 優(yōu)化大語言模型推理
![現(xiàn)已公開發(fā)布!歡迎使用 NVIDIA <b class='flag-5'>TensorRT</b>-LLM 優(yōu)化大語言模型<b class='flag-5'>推理</b>](https://file1.elecfans.com//web2/M00/AC/9C/wKgZomU7qJ2AcOOwAAFtccdApf0750.jpg)
Torch TensorRT是一個優(yōu)化PyTorch模型推理性能的工具
![Torch <b class='flag-5'>TensorRT</b>是一個優(yōu)化PyTorch模型<b class='flag-5'>推理</b>性能的工具](https://file1.elecfans.com/web2/M00/BC/A4/wKgaomWdByqAe66sAAAXihhamHA263.png)
評論