오늘날의 정보화 시대에 이미지나 시각적 콘텐츠는 오랫동안 일상 생활에서 가장 중요한 정보 전달자가 되었습니다. 딥 러닝 모델은 시각적 콘텐츠를 이해하는 강력한 능력에 의존하며 이에 대한 다양한 처리 및 최적화를 수행할 수 있습니다.
그러나 과거 비주얼 모델 개발 및 적용에서는 속도와 효과를 향상시키기 위해 모델 자체의 최적화에 더 많은 관심을 기울였습니다. 반대로, 이미지의 전처리 및 후처리 단계에서는 이미지를 최적화하는 방법에 대해 진지하게 생각하지 않습니다. 따라서 모델의 계산 효율이 점점 높아질 때, 이미지의 전처리와 후처리를 돌이켜보면 그것이 전체 이미지 작업의 병목 현상이 될 것이라고는 예상하지 못했습니다.
이러한 병목 현상을 해결하기 위해 NVIDIA는 ByteDance 기계 학습 팀과 협력하여 많은 이미지 전처리 연산자 라이브러리 CV-CUDA를 오픈 소스화했습니다. 이들은 GPU에서 효율적으로 실행될 수 있으며 연산자 속도는 약 100배에 달할 수 있습니다. OpenCV(CPU에서 실행) . OpenCV 및 TorchVision을 대체하기 위해 CV-CUDA를 백엔드로 사용하면 전체 추론의 처리량이 원본의 20배 이상에 도달할 수 있습니다. 또한 속도가 향상되었을 뿐만 아니라 효과 측면에서도 CV-CUDA는 계산 정확도 측면에서 OpenCV와 연계되어 훈련과 추론이 원활하게 연결되어 엔지니어의 작업량을 크게 줄일 수 있습니다.
이미지 배경 흐림 알고리즘을 예로 들면, 이미지 전/후 처리의 백엔드인 OpenCV를 CV-CUDA로 대체하면 전체 추론 프로세스의 처리량을 20배 이상 늘릴 수 있습니다. 타임스.
더 빠르고 유용한 시각적 전처리 라이브러리를 사용해보고 싶다면 이 오픈 소스 도구를 사용해 보세요. 오픈 소스 주소: https://github.com/CVCUDA/CV-CUDA
이 되었습니다. 엔지니어링 및 제품은 종종 모델 구조, 학습 작업과 같은 '첨단 연구'에 대해서만 논의하지만 실제로 신뢰할 수 있는 제품을 만들기 위해서는 많은 엔지니어링 문제에 직면하게 된다는 것을 알고 있습니다. 반대로 모델 학습은 가장 쉬운 부분입니다.
이미지 전처리는 단순히 일부 API를 호출하여 실험이나 훈련 중에 이미지에 대한 기하학적 변환, 필터링, 색상 변환 등을 수행할 수 있으며 특별히 신경 쓰지 않을 수도 있습니다. 그러나 전체 추론 프로세스를 다시 생각해 보면 이미지 전처리가 특히 복잡한 전처리 프로세스가 있는 시각적 작업의 경우 성능 병목 현상이 발생한다는 것을 알 수 있습니다.
이러한 성능 병목 현상은 주로 CPU에 반영됩니다. 일반적으로 기존 이미지 처리 프로세스의 경우 먼저 CPU에서 전처리를 수행한 다음 이를 GPU에 올려 모델을 실행하고 마지막으로 CPU로 돌아가며 일부 후처리가 필요할 수 있습니다.
영상 배경 흐림 알고리즘을 예로 들어보겠습니다. 기존 영상 처리 과정에서 예측 처리는 주로 CPU에서 이루어지며 전체 작업 부하의 90%를 차지하여 병목 현상이 발생했습니다. 이 작업.
비디오 애플리케이션이나 3D 이미지 모델링과 같은 복잡한 장면의 경우 이미지 프레임이나 이미지 정보의 수가 충분히 크고 전처리 프로세스가 충분히 복잡하며 지연 요구 사항이 충분히 낮기 때문에 전/후 처리 연산자 이미 임박했습니다. 물론 더 나은 접근 방식은 OpenCV를 더 빠른 솔루션으로 대체하는 것입니다.
왜 OpenCV 가 아직 충분하지 않습니까?
CV에서 가장 널리 사용되는 이미지 처리 라이브러리는 물론 오랫동안 유지 관리된 OpenCV입니다. OpenCV는 매우 광범위한 이미지 처리 작업을 갖추고 있으며 기본적으로 다양한 시각적 작업의 전/후 처리 요구를 충족할 수 있습니다. 그러나 이미지 작업 부하가 증가함에 따라 OpenCV의 이미지 작업 대부분이 CPU에 의해 구현되거나 GPU 구현이 부족하거나 GPU 구현에 몇 가지 문제가 있기 때문에 속도가 서서히 따라가지 못했습니다.
NVIDIA 및 ByteDance 알고리즘 학생들의 연구 개발 경험에서 GPU로 구현되는 OpenCV의 소수 연산자에는 세 가지 주요 문제가 있음을 발견했습니다.
예를 들어 결과의 정확성; 첫 번째 문제는 정렬할 수 없습니다. NVIDIA와 byte 비팅 알고리즘을 공부하는 학생들은 우리가 훈련할 때 OpenCV의 특정 연산자가 CPU를 사용하지만 추론 단계의 성능 문제로 인해 OpenCV에 해당하는 GPU 연산자가 CPU를 사용한다는 것을 알게 될 것입니다. 대신 사용하면 CPU와 GPU 결과의 정확도가 일치하지 않아 전체 추론이 발생하는 경우가 있습니다. 프로세스의 정확도에 이상이 있는 것입니다. 이러한 문제가 발생하면 CPU 구현으로 다시 전환하거나 정확도를 다시 조정하기 위해 많은 노력을 기울여야 하는데 이는 처리하기 어려운 문제입니다.
OpenCV는 아직 충분하지 않기 때문에 일부 독자들은 Torchvision은 어떻습니까? 실제로 OpenCV와 동일한 문제에 직면하게 됩니다. 또한 모델을 배포하는 엔지니어는 효율성을 위해 추론 프로세스를 구현하기 위해 C++를 사용할 가능성이 높으므로 Torchvision을 사용할 수 없으며 다음과 같은 C++ 시각적 라이브러리로 전환해야 합니다. 이는 OpenCV와 Torchvision의 정확성을 일치시키는 또 다른 딜레마를 가져올 것입니다.
일반적으로 현재 CPU에서 시각적 작업의 전/후처리가 병목 현상을 일으키고 있지만 OpenCV와 같은 기존 도구는 이를 잘 처리하지 못합니다. 따라서 연산을 GPU로 마이그레이션하고, 전적으로 CUDA를 기반으로 구현된 효율적인 이미지 처리 연산자 라이브러리인 CV-CUDA를 사용하는 것이 새로운 솔루션이 되었습니다.
GPU에서 전처리와 후처리를 완료해 이미지 처리 부분의 CPU 병목 현상을 대폭 줄여줍니다.
CUDA 기반의 전/후 처리 연산자 라이브러리로서 알고리즘 엔지니어는 세 가지를 가장 기대합니다: 충분히 빠르고, 충분히 다재다능합니다. , 충분합니다. 사용하기 쉽습니다. NVIDIA와 ByteDance의 기계 학습 팀이 공동 개발한 CV-CUDA는 이 세 가지 점을 정확하게 충족할 수 있습니다. GPU의 병렬 컴퓨팅 성능을 사용하여 작업자 속도를 향상시키고 OpenCV 연산 결과를 충분히 다용도로 정렬하며 사용하기 쉽습니다. C++/Python 인터페이스를 사용합니다.
CV-CUDACV-CUDA의 속도는 결국 효율적인 연산자 구현에 먼저 반영됩니다. CUDA 병렬 컴퓨팅 코드는 다음과 같습니다. 많은 최적화. 둘째, GPU 장치의 컴퓨팅 성능을 최대한 활용할 수 있는 일괄 작업을 지원합니다. CPU에서 이미지를 직렬로 실행하는 것과 비교하면 일괄 작업이 확실히 훨씬 빠릅니다. 마지막으로 CV-CUDA가 적용된 Volta, Turing, Ampere 등의 GPU 아키텍처 덕분에 각 GPU의 CUDA 커널 수준에서 성능이 고도로 최적화되어 최상의 결과를 얻을 수 있습니다. 즉, 사용하는 GPU 카드가 좋을수록 가속 성능이 더욱 과장됩니다. 이전 배경 흐림 처리량 가속 비율 차트에서 볼 수 있듯이 CV-CUDA를 사용하여 OpenCV 및 TorchVision의 전처리 및 후처리를 대체하면 전체 추론 프로세스의 처리량이 20배 이상 증가합니다. 그 중 전처리는 이미지에 대해 Resize, Padding, Image2Tensor 등의 작업을 수행하고, 후처리는 예측 결과에 대해 Tensor2Mask, Crop, Resize, Denoise 등의 작업을 수행합니다.
동일한 컴퓨팅 노드(2x Intel Xeon Platinum 8168 CPU, 1x NVIDIA A100 GPU)에서 30fps로 1080p 비디오를 처리하며, 다양한 CV 라이브러리 흐름 번호에서 지원하는 최대 병렬 처리를 사용합니다. 테스트에는 4개의 프로세스가 사용되었으며 각 프로세스의 배치 크기는 64입니다.
단일 운영자의 성능을 위해 NVIDIA와 ByteDance 파트너도 성능 테스트를 수행했습니다. GPU에서 많은 운영자의 처리량은 CPU의 100배에 달할 수 있습니다. 이미지 크기는 480*360, CPU 선택은 Intel(R) Core(TM) i9-7900X, BatchSize 크기는 1, 프로세스 수는 1 많은 사전/ 간단한 행렬 곱셈 및 기타 연산에 대해 위에서 언급한 효율적인 성능을 달성하기 위해 CV-CUDA는 실제로 많은 연산자 수준 최적화를 수행했습니다. 예를 들어, 커널 시작 및 전역 메모리 액세스 시간을 줄이기 위해 많은 커널 융합 전략이 채택되었습니다. 데이터 읽기 및 쓰기 효율성을 향상시키기 위해 모든 연산자가 비동기식으로 처리되어 동기 대기 시간 등이 줄어듭니다. . CV-CUDA 의 다양성과 유연성 계산 결과의 안정성은 일반적인 Resize 작업, OpenCV, OpenCV-gpu 및 Torchvision과 같은 실제 프로젝트에 매우 중요합니다. 방법이 다르기 때문에 교육부터 배포까지 결과를 맞추기 위해 더 많은 작업이 필요합니다. CV-CUDA사용하기 쉬움 아마 많은 엔지니어들이 CV-CUDA에 기본 CUDA 연산자가 포함되어 있으므로 사용하기가 더 어려울 것이라고 생각할 것입니다. 하지만 그렇지 않다. 더 높은 수준의 API에 의존하지 않더라도 CV-CUDA의 하위 계층 자체에서는 Allocator 클래스와 같은 구조를 제공하므로 C++에서 조정하는 것이 번거롭지 않다. 또한 상위 레벨로 올라가면 CV-CUDA는 PyTorch, OpenCV 및 Pillow에 대한 데이터 변환 인터페이스를 제공하므로 엔지니어는 익숙한 방식으로 신속하게 운영자를 교체하고 호출할 수 있습니다. CV-CUDA의 Resize용 C++ 인터페이스 CV-CUDA의 Python을 사용한다면 학습 프로세스 인터페이스 중에 실제로 사용이 매우 간단합니다. 원래 CPU에서 GPU로 모든 전처리 작업을 마이그레이션하는 데 몇 가지 간단한 단계만 거치면 됩니다. CV-CUDA를 사용하는 기존 이미지 인식의 전처리 프로세스는 GPU의 전처리 프로세스와 모델 계산을 통합합니다. 다음과 같이 torchvision API를 사용하여 이미지를 GPU에 로드한 후 as_tensor를 통해 Torch Tensor 유형을 CV-CUDA 객체 nvcvInputTensor로 직접 변환할 수 있으므로 CV-CUDA 전처리 작업의 API를 GPU에서 다양한 변환을 완료하기 위해 직접 호출됩니다. 다음 코드 줄은 CV-CUDA를 사용하여 GPU에서 이미지 인식의 전처리 프로세스를 완료합니다. 이미지를 자르고 픽셀을 정규화합니다. 그 중 resize()는 이미지 텐서를 모델의 입력 텐서 크기로 변환하고, Convertto()는 픽셀 값을 단정밀도 부동 소수점 값으로 변환하여 값 범위를 더 적합하게 만듭니다. 모델. 이제 CV-CUDA의 다양한 API의 도움으로 이미지 분류 작업의 전처리가 완료되었으며, GPU에서 병렬 컴퓨팅을 효율적으로 완료하고 PyTorch에 쉽게 통합할 수 있습니다. 주류 딥러닝 프레임워크의 모델링 프로세스. 나머지 경우에는 CV-CUDA 객체 nvcvPreprocessedTensor를 Torch Tensor 유형으로 변환하여 모델에 공급하기만 하면 됩니다. 이 단계도 매우 간단합니다. 이 간단한 예를 통해 CV-CUDA가 실제로 일반 모델 훈련 로직에 쉽게 내장되어 있음을 쉽게 알 수 있습니다. 독자들이 더 자세한 사용법을 알고 싶다면 위에서 언급한 CV-CUDA의 오픈 소스 주소를 확인하세요. CV-CUDA는 실제로 실제 업무에서 테스트를 거쳤습니다. 시각적 작업, 특히 상대적으로 복잡한 이미지 전처리 프로세스가 있는 작업에서 전처리에 GPU의 엄청난 컴퓨팅 성능을 사용하면 모델 훈련 및 추론의 효율성을 효과적으로 향상시킬 수 있습니다. CV-CUDA는 현재 다중 모드 검색, 이미지 분류 등과 같은 Douyin Group 내의 여러 온라인 및 오프라인 시나리오에 사용됩니다. ByteDance OCR 및 비디오 멀티모달 작업에서 CV-CUDA를 사용하면 전체 학습 속도를 1~2배까지 높일 수 있습니다. 모델) 추론 프로세스도 마찬가지입니다. ByteDance 머신러닝 팀은 검색 다중 모드 작업에서 CV-CUDA를 사용한 후 CPU를 사용할 때보다 전체 온라인 처리량이 2배 더 높았다고 밝혔습니다. 전처리가 많이 개선되었습니다. 여기의 CPU 기준 결과는 멀티 코어에 대해 고도로 최적화되었으며 이 작업과 관련된 전처리 논리는 비교적 간단하지만 CV-CUDA를 사용한 후에도 가속 효과는 여전히 매우 분명하다는 점은 주목할 가치가 있습니다.
CV-CUDA 설계 초기에는 많은 엔지니어들이 현재 이미지 처리 라이브러리에서 CPU 버전의 OpenCV를 사용하는 데 익숙하다고 생각했습니다. 따라서 연산자를 설계할 때 함수 매개변수든 이미지 처리 결과든, OpenCV CPU 버전을 가능한 한 많이 정렬하십시오. 따라서 OpenCV에서 CV-CUDA로 마이그레이션할 때 일관된 컴퓨팅 결과를 얻기 위해 몇 가지 변경 사항만 필요하며 모델을 재교육할 필요가 없습니다.
또한 CV-CUDA는 운영자 수준에서 설계되었으므로 모델의 전/후 처리 과정에 관계없이 자유롭게 결합할 수 있으며 유연성이 높습니다.
ByteDance 기계 학습 팀은 기업 내에서 훈련된 모델이 많고, 필요한 전처리 로직도 다양하며 맞춤형 전처리 로직 요구 사항도 많다고 밝혔습니다. CV-CUDA의 유연성은 각 OP가 스트림 개체 및 비디오 메모리 개체(비디오 메모리 포인터를 내부적으로 저장하는 버퍼 및 텐서 클래스)의 수신을 지원하도록 보장하여 해당 GPU 리소스를 보다 유연하게 구성할 수 있습니다. 각 작업을 설계하고 개발할 때 우리는 다양성을 고려할 뿐만 아니라 이미지 전처리에 대한 다양한 요구 사항을 충족하는 맞춤형 인터페이스를 주문형으로 제공합니다.
또한 CV-CUDA는 C++ 인터페이스와 Python 인터페이스를 모두 갖추고 있기 때문에 학습 및 서비스 배포 시나리오 모두에서 사용할 수 있습니다. Python 인터페이스는 학습 중에 모델 성능을 빠르게 확인하는 데 사용되며 C++ 인터페이스는 다음과 같은 용도로 사용됩니다. 배포 중 더욱 효율적인 예측. CV-CUDA는 번거로운 전처리 결과 정렬 과정을 피하고 전체 프로세스의 효율성을 향상시킵니다. 실전적인 전투, CV-CUDA사용법
이미지 분류를 예로 들어보겠습니다. 기본적으로 전처리 단계에서는 이미지를 텐서로 디코딩하고 모델 입력 크기에 맞게 잘라야 합니다. 자른 후 픽셀 값을 부동 소수점 데이터 유형으로 변환해야 합니다. 정규화를 수행한 후에는 향후 전파를 위해 딥러닝 모델로 전달될 수 있습니다. 아래에서는 몇 가지 간단한 코드 블록을 사용하여 CV-CUDA가 이미지를 전처리하고 Pytorch와 상호 작용하는 방법을 경험해 보겠습니다.
CV-CUDA에서 다양한 전처리 작업을 사용하는 방법은 OpenCV나 Torchvision의 경우와 크게 다르지 않습니다. 단지 방법만 조정하면 되고, 그 뒤에 있는 GPU에서 이미 계산이 완료됩니다.
CV-CUDA실제 업무 개선
ByteDance 기계 학습 팀은 CV-CUDA의 내부 사용이 훈련 및 추론 성능을 크게 향상시킬 수 있다고 밝혔습니다. 예를 들어 훈련 측면에서 Bytedance는 비디오 관련 다중 모드 작업입니다. 전처리 부분에는 다중 프레임 비디오의 디코딩과 많은 데이터 향상이 포함되어 있어 이 부분의 로직이 매우 복잡해집니다. 복잡한 전처리 로직으로 인해 훈련 중에 CPU의 멀티 코어 성능이 계속 유지되지 않습니다. 따라서 CV-CUDA를 사용하여 CPU의 모든 전처리 로직을 GPU로 마이그레이션하여 전체 훈련 속도를 90% 가속화합니다. . 이는 전처리 부분뿐만 아니라 전반적인 훈련 속도의 증가라는 점에 유의하세요.
시각적 작업의 전처리 병목 현상을 해결할 수 있을 만큼 속도 측면에서 효율적이며 사용이 간편하고 유연합니다. CV-CUDA는 실제 적용 시나리오에서 모델 추론 및 훈련 효과를 크게 향상시킬 수 있음을 입증했습니다. 따라서 독자의 시각적 작업도 전처리 효율성으로 인해 제한되므로 최신 오픈 소스 CV-CUDA를 사용해 보세요.
위 내용은 이미지 전처리 라이브러리 CV-CUDA는 오픈 소스로 제공되어 전처리 병목 현상을 해결하고 추론 처리량을 20배 이상 늘립니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!