feat 优化edge和blob耗时

dev_lsy
liusiyang 2 months ago
parent b1b6a29402
commit 464954b898

@ -12,6 +12,7 @@
#include <vector> #include <vector>
#include <thread> #include <thread>
#include <mutex> #include <mutex>
#include <atomic>
#include "NvInfer.h" #include "NvInfer.h"
#include "cuda_runtime_api.h" #include "cuda_runtime_api.h"
#include "AI_Factory.h" #include "AI_Factory.h"
@ -213,8 +214,8 @@ private:
int m_nALLStreamNum; int m_nALLStreamNum;
private: private:
// 上次使用的GPU stream Idx; // 上次使用的GPU stream Idx(多线程并发调用,需原子自增避免竞争);
int m_nLast_GPUStreamIdx; std::atomic<int> m_nLast_GPUStreamIdx;
}; };
#endif #endif

@ -20,7 +20,7 @@ AIModel_Impl::AIModel_Impl()
m_pNode_output_1 = NULL; m_pNode_output_1 = NULL;
m_pNode_output_2 = NULL; m_pNode_output_2 = NULL;
m_DetGPUStream.clear(); m_DetGPUStream.clear();
m_nLast_GPUStreamIdx = 0; m_nLast_GPUStreamIdx.store(0);
m_nALLStreamNum = 0; m_nALLStreamNum = 0;
} }
AIModel_Impl::~AIModel_Impl() AIModel_Impl::~AIModel_Impl()
@ -169,6 +169,19 @@ int AIModel_Impl::Init(AIModelRun_Config config)
} }
m_bInitSuccess = true; m_bInitSuccess = true;
// warm-up:首次推理会触发 TensorRT/CUDA 懒初始化(kernel 加载、workspace 分配、首次 enqueueV3 建图等),
// 提前用一张空图预热,避免首张检测图耗时飙升。
{
cv::Mat warmIn = InitMat(m_pNode_input_0->channel, m_pNode_input_0->width, m_pNode_input_0->height);
cv::Mat warmOut;
int warmRe = AIDet(warmIn, warmOut);
if (warmRe != 0)
{
printf("%s warm-up error = %d\n", m_modelRun_Config.strName.c_str(), warmRe);
}
}
return 0; return 0;
} }
cv::Mat AIModel_Impl::InitMat(int channel, int w, int h) cv::Mat AIModel_Impl::InitMat(int channel, int w, int h)
@ -479,7 +492,11 @@ int AIModel_Impl::AI_Det_In_1_Out_1(Node_Config *pConfig_in, Node_Config *pConfi
{ {
// printf("=== s1 "); // printf("=== s1 ");
std::shared_ptr<Det_GPU_Stram> pdetStream; std::shared_ptr<Det_GPU_Stram> pdetStream;
GetStream(pdetStream); if (GetStream(pdetStream) != 0 || !pdetStream)
{
printf("AI_Det_In_1_Out_1: GetStream error \n");
return 3;
}
// printf("=== s2 "); // printf("=== s2 ");
std::lock_guard<std::mutex> lock(pdetStream->AI_mutex); std::lock_guard<std::mutex> lock(pdetStream->AI_mutex);
// printf(" ss g %d s %d -- ", pdetStream->nGPUIdx, pdetStream->cuda_stream->nstreamIdx); // printf(" ss g %d s %d -- ", pdetStream->nGPUIdx, pdetStream->cuda_stream->nstreamIdx);
@ -508,22 +525,40 @@ int AIModel_Impl::AI_Det_In_1_Out_1(Node_Config *pConfig_in, Node_Config *pConfi
int AIModel_Impl::GetStream(std::shared_ptr<Det_GPU_Stram> &pdetStream) int AIModel_Impl::GetStream(std::shared_ptr<Det_GPU_Stram> &pdetStream)
{ {
int sidx = m_nLast_GPUStreamIdx; if (m_nALLStreamNum <= 0 || m_DetGPUStream.empty())
{
return 1;
}
sidx++; // 多线程并发时原子轮询分配 stream:
if (sidx >= m_nALLStreamNum) int sidx = m_nLast_GPUStreamIdx.load();
while (true)
{
int next = sidx + 1;
if (next >= m_nALLStreamNum)
{ {
sidx = 0; next = 0;
}
if (m_nLast_GPUStreamIdx.compare_exchange_weak(sidx, next))
{
sidx = next;
break;
}
// CAS 失败时 sidx 已被更新为当前实际值,重新计算 next
} }
pdetStream = m_DetGPUStream.at(sidx);
m_nLast_GPUStreamIdx = sidx;
pdetStream = m_DetGPUStream.at(sidx);
return 0; return 0;
} }
int AIModel_Impl::AI_Det_In_1_Out_1_class(unsigned char *p_indata_0, float *fmaxScore) int AIModel_Impl::AI_Det_In_1_Out_1_class(unsigned char *p_indata_0, float *fmaxScore)
{ {
std::shared_ptr<Det_GPU_Stram> pdetStream; std::shared_ptr<Det_GPU_Stram> pdetStream;
GetStream(pdetStream); if (GetStream(pdetStream) != 0 || !pdetStream)
{
printf("AI_Det_In_1_Out_1_class: GetStream error \n");
*fmaxScore = 0.0f;
return -3;
}
// printf("=== s2 "); // printf("=== s2 ");
std::lock_guard<std::mutex> lock(pdetStream->AI_mutex); std::lock_guard<std::mutex> lock(pdetStream->AI_mutex);
// printf(" ss g %d s %d -- ", pdetStream->nGPUIdx, pdetStream->cuda_stream->nstreamIdx); // printf(" ss g %d s %d -- ", pdetStream->nGPUIdx, pdetStream->cuda_stream->nstreamIdx);

@ -89,6 +89,7 @@ int AIFactory::InitALLAIModle(GPU_Config gupconfig)
edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/KK/AlignOuter.engine"; edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/KK/AlignOuter.engine";
edge_config.strName = "Align_Outer"; edge_config.strName = "Align_Outer";
edge_config.inputType = AIModel_Base::Input_CHW; edge_config.inputType = AIModel_Base::Input_CHW;
edge_config.Stream_num = 2;
Align_Outer->Init(edge_config); Align_Outer->Init(edge_config);
} }
if (!Align_Inner) if (!Align_Inner)
@ -99,6 +100,7 @@ int AIFactory::InitALLAIModle(GPU_Config gupconfig)
edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/KK/AlignInner.engine"; edge_config.strPath = "/home/aidlux/BOE/UseModel_ZB/KK/AlignInner.engine";
edge_config.strName = "Align_Inner"; edge_config.strName = "Align_Inner";
edge_config.inputType = AIModel_Base::Input_CHW; edge_config.inputType = AIModel_Base::Input_CHW;
edge_config.Stream_num = 2;
Align_Inner->Init(edge_config); Align_Inner->Init(edge_config);
} }
m_bInitSucc = true; m_bInitSucc = true;

@ -10,6 +10,7 @@
#include "ImgCheckAnalysisy.hpp" #include "ImgCheckAnalysisy.hpp"
#include "CheckUtil.hpp" #include "CheckUtil.hpp"
#include "Define.h" #include "Define.h"
#include <atomic>
CameraCheckAnalysisy::CameraCheckAnalysisy() CameraCheckAnalysisy::CameraCheckAnalysisy()
{ {
@ -676,10 +677,18 @@ int CameraCheckAnalysisy::InitRun()
int CameraCheckAnalysisy::InitCheckAnalysisy() int CameraCheckAnalysisy::InitCheckAnalysisy()
{ {
int re = 0; int re = 0;
// 全局递增的 CPU 核偏移:
static std::atomic<int> s_cpuOffset{0};
for (int i = 0; i < IMGCHECKANALYSISY_NUM; i++) for (int i = 0; i < IMGCHECKANALYSISY_NUM; i++)
{ {
RunInfoST RunConfig; RunInfoST RunConfig;
RunConfig.nThreadIdx = i; RunConfig.nThreadIdx = i;
{
int range = (m_RunConfig.nCpu_num > 0) ? m_RunConfig.nCpu_num : 1;
int offset = s_cpuOffset.fetch_add(1) % range;
RunConfig.nCpu_start_Idx = m_RunConfig.nCpu_start_Idx + offset;
}
RunConfig.nCpu_num = 1;
m_pImgCheckAnalysisy[i] = ImgCheckBase::GetInstance(); m_pImgCheckAnalysisy[i] = ImgCheckBase::GetInstance();
re = m_pImgCheckAnalysisy[i]->UpdateConfig((void *)&RunConfig, CHECK_CONFIG_Run); re = m_pImgCheckAnalysisy[i]->UpdateConfig((void *)&RunConfig, CHECK_CONFIG_Run);

@ -559,9 +559,7 @@ int ImageResultJudge::ResultJudge(std::shared_ptr<ImageAllResult> pImageResult)
GetAIDetImg(pImageResult, pCenter, tem.AI_in_Img, tem.AI_out_img); GetAIDetImg(pImageResult, pCenter, tem.AI_in_Img, tem.AI_out_img);
m_CheckResult_shareP->qxImageResult.push_back(tem); m_CheckResult_shareP->qxImageResult.push_back(tem);
pQxLog->bPrintStr = true;
pQxLog->AddCheckstr(PrintLevel_4, DET_LOG_LEVEL_3, " result ", " ---name: %s ---code: %s ---srcImgroi.x: %d ---srcImgroi.y: %d\n", tem.strTypeName.c_str(), tem.qx_Code.c_str(), tem.srcImgroi.x, tem.srcImgroi.y); pQxLog->AddCheckstr(PrintLevel_4, DET_LOG_LEVEL_3, " result ", " ---name: %s ---code: %s ---srcImgroi.x: %d ---srcImgroi.y: %d\n", tem.strTypeName.c_str(), tem.qx_Code.c_str(), tem.srcImgroi.x, tem.srcImgroi.y);
pQxLog->bPrintStr = false;
} }
else else
{ {

@ -427,7 +427,7 @@ int ImgCheckAnalysisy::CheckRun()
{ {
m_pdetlog->bPrintStr = true; m_pdetlog->bPrintStr = true;
} }
m_pdetlog->bPrintStr = true; // m_pdetlog->bPrintStr = true;
m_pdetlog->AddCheckstr(PrintLevel_0, "1、basic Info", "---------------------------1、basic Info---------------------------------"); m_pdetlog->AddCheckstr(PrintLevel_0, "1、basic Info", "---------------------------1、basic Info---------------------------------");
m_pdetlog->AddCheckstr(PrintLevel_0, "Version", "%s", GetVersion().c_str()); m_pdetlog->AddCheckstr(PrintLevel_0, "Version", "%s", GetVersion().c_str());

Loading…
Cancel
Save