NVIDIA com Yolo em openCV: Resultado superior a 1500%

Utilizando todos os recursos de um equipamento, podemos turbinar a biblioteca openCV para Inferência. Nos meus testes com uma placa NVIDIA GeForce RTX 3060 Ti junto a tecnologia YOLO, utilizando os fontes do repositório oficial e com otimizações, atingi um desempenho máximo de 500% (2 para 10 fps).

Então resolvi turbinar os binários, efetuando compilação da biblioteca extraindo o máximo do hardware, tando da GPU e CPU. Para isto habilitei todos os recurso disponíveis no processador SSE 4.2, AVX2 e outros, também utilização das bibliotecas TBB, MKL, IPP, CUDA e CuDNN.

Então explorando todo o recurso do hardware, obtive desempenho muito superior. Para isto utilizei estas diretivas de compilação da biblioteca openCV:

Recursos da GPU :

-DWITH_CUDA=ON
-DWITH_CUDNN=ON
-DOPENCV_DNN_CUDA=ON
-DCUDA_FAST_MATH=1
-DCUDA_ARCH_BIN=8.6
-DWITH_CUBLAS=1

*** Para localizar a versão da arquitetura do modelo da GPU, utilizei o seguinte link: https://developer.nvidia.com/cuda-gpus

Recursos da CPU:

-DWITH_IPP=ON
-DWITH_MKL=ON
-DMKL_WITH_TBB=ON
-DMKL_USE_MULTITHREAD=ON
-DWITH_TBB=ON
-CPU_DISPATCH=SSE3,SSE4_1,SSE4_2,FP16,FMA3,AVX,AVX2,AVX512_ICL

Habilitei o uso da GPU o processamento da convolução com o seguinte comando:

net.setPreferableBackend(DNN_BACKEND_CUDA);
net.setPreferableTarget(DNN_TARGET_CUDA);

Para medir apenas o tempo da GPU, efetuei a medida apenas durante a inferência, conforme o trecho de código em C++ a seguir:

tm.start();
net.setInput(blob);
std::vector<Mat> outs;
net.forward(outs, outNames);
postprocess(frame, outs, net);
tm.stop();
double detectionTime = tm.getTimeMilli();
double fps = 1000 / detectionTime;

O resultado final foi um salto de 300ms para 20ms.

Pergunta comum: Mas Cabelo, o que farei com todo este todo?

Elementar meu caro, vejamos o exemplo a seguir:

Com relação ao desempenho da CPU, o equipamento sofreu muito menos overhead e obteve um ganho de 200%. O salto de performance foi de 2 para 8 fps

Mas a minha surpresa, o ganho da GPU resultou em um salto de 2 fps para 33 fps! O que equivale aproximadamente 1.650%.

Ciência aplicada: Imagina um cenário onde precisamos migrar um algoritmo biométrico com 51 milhões de usuários. Se o recalculo do hyper espaço matemático ou o processamento do modelo de inferência levasse 300 ms, o tempo de processamento seria equivalente a 177 dias aproximadamente.

Agora se em um exemplo hipotético, diminuíssemos o tempo de 300 ms para 20ms, cairíamos o tempo total de processamento de 177 dias para aproximadamente 11 dias.

E tem mais, ser aumentarmos o poder de processamento da GPU (modelo mais potente, como a NVIDIA A100), E SE HIPOTETICAMENTE de alguma maneira alcançássemos o tempo de 800us, levaríamos apenas 12 horas de processamento e não mais 177 dias. Em breve artigo no Viva O Linux.

3 comentários em “NVIDIA com Yolo em openCV: Resultado superior a 1500%

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.