API
VisionPro Deep Learning는 API로 동일한 기능을 지원합니다. API는 다음 프로그래밍 언어들을 지원합니다:
-
C (C++)
-
C# (.NET)
API 개요
API를 활용하려면 이 문서에서 소개하는 VisionPro Deep Learning GUI에 관한 모든 내용을 먼저 확인하시길 권장합니다. 왜냐하면, GUI와 API는 VisionPro Deep Learning 도구 사용을 위한 모든 핵심 개념과 사용 방법을 공유하기 때문입니다. 각 프로그래밍 언어 API에 관한 자세한 내용은 아래 경로에 있는 API 문서에서 확인하십시오.
-
C
-
API 문서:
C:\Program Files\Cognex\VisionPro Deep Learning\3.2\Develop\docs -
예시 코드:
C:\ProgramData\Cognex\VisionPro Deep Learning\3.2\Examples\c++
-
-
C#
-
API 문서:
C:\Program Files\Cognex\VisionPro Deep Learning\3.2\Develop\docs
-
예시 코드:
C:\ProgramData\Cognex\VisionPro Deep Learning\3.2\Examples\c++
-
타겟 프레임워크
- 이제 UI가 아닌 NuGet 패키지는 NET Standard 2.0을 대상으로 함
- 이제 UI 어셈블리 및 실행 파일은 .NET Framework 4.7.2를 대상으로 함
- 이제 UI가 아닌 실행 파일은 .NET Core 3.1을 대상으로 함
NuGet 패키지
NuGet 패키지는 프로젝트 기반이며, 종속성이 있습니다. VisionPro Deep Learning .NET 라이브러리는 가능하면 크로스 플랫폼 프레임 워크를 대상으로 컴파일됩니다. UI 관련 어셈블리는 모두 .NET Framework 4.7.2 또는 NET Standard 2.0을 대상으로 컴파일되어 있습니다. VisionPro Deep Learning은 ViDi를 상속하므로 API의 많은 부분에서 ViDi라는 이름을 유지합니다.
| 어셈블리 | 프레임워크 대상 |
|---|---|
|
ViDi.NET.Local |
NET Standard 2.0 |
|
ViDi.NET.Logging |
NET Standard 2.0 |
|
ViDi.NET.Remote |
NET Standard 2.0 |
|
ViDi.NET.Remote.Service |
NET Standard 2.0 |
|
ViDi.NET.Remote.Client |
NET Standard 2.0 |
|
ViDi.NET |
NET Standard 2.0 |
|
ViDi.NET.Base |
NET Standard 2.0 |
|
ViDi.NET.Common |
NET Standard 2.0 |
|
ViDi.NET.Extensions |
NET Standard 2.0 |
|
ViDi.NET.Interfaces |
NET Standard 2.0 |
| ViDi.NET.UI.Interfaces |
.NET Framework 4.7.2 |
|
ViDi.NET.GUI |
.NET Framework 4.7.2 |
| ViDi.NET.UI |
.NET Framework 4.7.2 |
|
ViDi.NET.VisionPro |
.NET Framework 4.7.2 |
NuGet 패키지를 도입한 것은 특정 Cognex Deep Learning Studio기능을 이용할 때 필요한 어셈블리를 단순화하기 위한 것입니다.
예를 들어, 이제 ViDi.NET.UI는 어떤 어셈블리가 필요한지와 타사 어셈블리에 필요한 라이센스를 보여줍니다.
VisionPro Deep Learning NuGet 패키지는 다음 디렉토리에 있습니다.
-
C:\ProgramData\Cognex\VisionPro Deep Learning\X.X\Examples\packages
NuGet 피드는 자동으로 예제 내에 설정되지만, 그로벌 Visual Studio NuGet 패키지 피드로 설정되어야 합니다. Cognex는 NuGet 패키지를 별도의 안전한 리포지토리(또는 그와 동등한 것)에 백업하고 사본을 유지할 것을 적극 권장합니다. 이 위치가 새로운 NuGet 피드로 구성되어야 합니다. 자세한 내용은 다음의 Microsoft 항목을 참조하십시오: NuGet 피드들을 호스팅하기
런타임 API 프로세싱 가이드
Focused 모드는 프로세싱이 이미지 기반으로 수행되므로 병렬 프로세싱을 지원합니다. API로 런타임 워크스페이스에서 Focused 도구를 프로세싱하기 위한 코드 워크플로를 구성할 때 이러한 병렬 프로세싱 기능을 활용할 수 있습니다. 도구의 병렬 프로세싱에 대한 자세한 내용은 이 페이지를 읽기 전에 NVIDIA GPU 선택 및 구성을 확인하시길 권장합니다.
런타임 환경에서 API로 프로세싱 작업을 실행하면 VisionPro Deep Learning API 코드 워크 플로를 구성하기 위해 스레드, GPU, 샘플 등과 같은 객체를 다루게됩니다.
| 객체 | 설명 |
| 워크스페이스 | Thread-Safe |
| Stream | Thread-Safe |
| Tool | Thread-Safe |
| Sample |
이미지를 다루는 컨테이너 객체 Not Thread-Safe |
| Image |
프로세싱할 실제 이미지 데이터를 가지는 객체 Not Thread-Safe |
| Buffer |
결과를 받는 객체 Not Thread-Safe |
| Thread |
여러 GPU들이 준비된 경우 API를 호출하여 프로세싱을 호출하는 두 가지 옵션이 있습니다.
"빈 List"를 Device List 인자로 전달
API를 호출할 때 "장치 목록" 인수에 빈 목록을 사용하면 사용 가능한 (점유되지 않은, 해제된) GPU에서 프로세싱이 실행됩니다. 이는 특정 도구를 프로세싱하기 위해 특정 GPU를 선택하지 않음을 의미합니다. 이 전략은 다음과 같은 경우에 권장됩니다.
-
다른 목적 없이 병렬 프로세싱 자체 만 필요
-
병렬 프로세싱 코드가 작동하는지 여부를 테스트하고 싶음
-
어떤 상황에서든 코드 구현이 항상 병렬 방식으로 실행되기를 원함
-
프로세싱 예상 소요 시간이 서로 유사한 2 개의 도구를 프로세싱. 즉, 특정 GPU를 지정하지 않고 병렬 프로세싱을 수행.
-
하나의 도구를 병렬로 프로세싱. 즉, 여러 GPU를 활용한 병렬 프로세싱으로 프로세싱을 더 빠르게 수행
2 개의 스레드와 2 개의 GPU가있는 1 개의 Focused 모드 도구를 프로세싱하는 예시로 설명합니다.
빈 목록을 장치 목록 인수로 제공하고 2 개의 스레드 (스레드 0 및 스레드 1)에서 이 도구를 프로세싱하는 경우 스레드 중 하나 (예 : 스레드 0)가 이미지를 프로세싱하는 짧은 시간 동안만 GPU 0을 차지합니다.
GPU 0이 스레드 0에 의해 점유되면 GPU 0이 잠기므로 스레드 1이 GPU 1에 액세스하고 이 도구에서 다른 이미지를 프로세싱하기 위해 GPU 1을 점유합니다.
스레드 0이 GPU 0으로 어던 이미지의 프로세싱을 완료 한 후 GPU 0 점유를 해제합니다. 이 때 스레드 1의 프로세싱 작업이 대기 큐(Queue)에서 대기 중이면 GPU 0을 스레드 1이 차지할 수 있습니다. 이러한 방식으로이 단일 도구는 2 개의 GPU 및 2 개의 스레드 환경에서 병렬로 프로세싱 될 수 있습니다.
"비어 있지 않은 List"를 Device List 인자로 전달
API를 호출할 때 "장치 목록" 인수에 비어 있지 않은 목록을 사용하면 제공된 "장치 목록"에 있는 사용 가능한 (점유되지 않은, 해제된) GPU에서 프로세싱이 실행됩니다. 이는 특정 도구를 프로세싱하기 위해 하나 이상의 GPU 목록을 선택하고 있음을 의미합니다. 이 전략은 다음과 같은 경우에 권장됩니다.
-
프로세싱 예상 소요 시간이 서로 크게 다른 2 개의 도구를 프로세싱합니다. 즉, 두 도구들 중 프로세싱 소요 시간이 긴 쪽은 GPU를 따로 지정받지 않는 이상 프로세싱 시 병목 현상을 일으킬 수 있습니다.
-
특정 도구를 프로세싱할 때 사용해야하는 GPU와 사용하지 않아야 하는 GPU를 관리하려고합니다.
2 개의 스레드와 2 개의 GPU가있는 1 개의 Focused 모드 도구를 프로세싱하는 예시로 설명합니다.
스레드 0을 위해 GPU 0이 포함된 목록과 스레드 1을 위해 GPU 1이 포함된 목록을 각각 장치 목록 인수로 제공하고, 두 스레드 (스레드 0 및 스레드 1)에서이 도구의 프로세싱을 실행하면, GPU 0은 스레드 0에만 할당되고 GPU 1은 스레드 1에만 할당됩니다.
스레드 0은 주어진 이미지 세트에 대한 프로세싱 작업을 완료할 때까지 GPU 0만 사용하며 이는 스레드 1과 GPU 1에서도 동일합니다.
이번에는 2 개의 스레드(도구 A의 경우 스레드 0, 도구 B의 경우 스레드 1)와 3 개의 GPU (GPU 0, GPU 1, GPU 2)를 사용하여 2 개의 Focused 모드 도구 (A, B)를 프로세싱하는 상황을 예시로 설명합니다. 이 예시에서 도구 B는 프로세싱할 이미지 수가 도구 A보다 훨씬 많거나 도구 B의 이미지 데이터 해상도가 도구 A보다 훨씬 높기 때문에 프로세싱에 훨씬 더 많은 시간이 걸립니다.
이 상황에서도 빈 장치 목록를 인자로 사용하는 병렬 프로세싱을 수행해도 괜찮습니다. 총 프로세싱 시간 (A와 B 모두의 프로세싱을 완료하는 데 필요한 시간)은 비어 있지 않은 장치 목록이 제공 될 때와 동일합니다.
하지만 문제는 도구 B의 프로세싱이 도구 A의 프로세싱 속도를 늦출 수 있다는 것입니다. Focused 도구의 프로세싱이 이미지 단위로 수행되기 때문에, 프로세싱 내내 3 개의 GPU들은 도구 B의 높은 워크로드로 인해 스레드 1이 차지할 가능성이 높습니다.
따라서 도구 A의 프로세싱 속도를 크게 늦추지 않고 도구 A와 B의 병렬 프로세싱을 원하는 경우 스레드 1에 대한 장치 목록으로 [GPU 1] 또는 [GPU 1, GPU 2]를 제공하여 이들 GPU가 도구 B 프로세싱 전용으로 사용되게끔 해야 합니다. 동시에 스레드 0에게는 장치 목록 또는 빈 장치 목록을 제공할 수 있습니다. 이렇게하면 도구 A와 B의 병렬 프로세싱에서 도구 B의 프로세싱이 병목 으로 작용하는 것을 방지할 수 있습니다.
API로 다중 GPU 활용
C API를 통한 초기화
C API를 통한 초기화는 VIDI_UNIT vidi_initialize(VIDI_INT gpu_mode, VIDI_STRING gpu_devices) 인수를 이용해 수행됩니다.
| GPU 모드 gpu_mode | GPU 지원 없음 | 도구당 하나의 장치 |
|---|---|---|
|
Int 값 |
-1 |
0 |
|
C Define |
VIDI_GPU_MODE_NO_SUPPORT |
VIDI_GPU_MODE_SINGLE_DEVICE_PER_TOOL |
다음으로 프로세싱할 경우,
- vidi_runtime_process
- vidi_runtime_process_single_tool
- vidi_runtime_process_sample
- vidi_training_stream_process_sample
- vidi_training_tool_process_database
- vidi_training_process_sample
GPU 장치 선택은 VIDI_STRING gpu_list 인수를 이용하여 수행됩니다.
| GPU 장치 gpu_list | 기본값 | 장치 목록 |
|---|---|---|
|
String(문자열) 값 |
" " |
"0,1,2" |
|
C Define |
VIDI_AUTO_SELECT_GPU_DEVICE |
|
|
설명 |
사용 가능한 GPU를 모두 이용합니다. |
지정된 GPU(예: 0, 1, 2)만을 이용합니다. |
.NET API를 통한 초기화
다음 중 한 가지를 이용해 새로운 컨트롤을 생성하는 경우:
- ViDi2.Runtime.Local.Control (ViDi2.GpuMode gpuMode, List<int> gpuDevice)
- ViDi2.Runtime.Local.Control (LibraryAccess libraryAccess, ViDi2.GpuMode gpuMode, List<int> gpuDevices, bool activateDebugLogging)
- ViDi2.Training.Local.Control (ViDi2.GpuMode gpuMode, List<int> gpuDevice)
- ViDi2.Training.Local.Control (LibraryAccess libraryAccess, ViDi2.GpuMode gpuMode, List<int> gpuDevices, bool activateDebugLogging)
| GPU 모드 | ViDi2.GpuMode gpuMode |
|---|---|
|
Single Device per Tool (default) |
GpuMode.SingleDevicePerTool |
|
No GPU Support |
Gpu.Mode.NoSupport |
다음으로 프로세싱할 경우,
- ViDi2.Runtime.ITool.Process
- ViDi.Runtime.IStream.Process
- ViDi2.Training.ITool.Process
- ViDi.Training.IStream.Process
- ViDi2.IDatabase.Process
장치 선택은 List<int> gpuDevices인수를 이용해 수행됩니다.
| List<int> gpuDevices | 기본값 | 장치 목록 |
|---|---|---|
|
값 |
null |
new List<int> {0,1} |
|
설명 |
사용 가능한 GPU를 모두 이용합니다. |
지정된 GPU(예: 0과 1)만을 이용합니다. |