이 문서에서는 Windows Machine Learning을 사용할 때 애플리케이션의 성능을 관리하는 방법을 설명합니다.
스레딩 및 동시성
런타임에서 노출되는 모든 개체는 민첩하므로 모든 스레드에서 액세스할 수 있습니다. Agile에 대한 자세한 내용은 C++/WinRT의 Agile 개체를 참조하세요.
작업할 주요 개체 중 하나는 LearningModelSession입니다. 이 개체는 항상 스레드에서 호출하는 것이 안전합니다.
GPU 세션의 경우: 개체가 동시 호출을 잠그고 동기화합니다. 동시성이 필요한 경우 이를 달성하기 위해 여러 세션을 만들어야 합니다.
CPU 세션의 경우: 개체가 잠기지 않고 단일 세션에서 동시 호출을 허용합니다. 고유한 상태, 버퍼 및 바인딩 개체를 관리하려면 주의해야 합니다.
시나리오에 대한 목표를 관리하고 측정해야 합니다. 최신 GPU 아키텍처는 CPU와 다르게 작동합니다. 예를 들어 짧은 대기 시간이 목표인 경우 동시성이 아닌 파이프라닝을 사용하여 CPU 및 GPU 엔진에서 작업을 예약하는 방법을 관리할 수 있습니다. 다중 엔진 동기화에 대한 이 문서는 시작하기에 좋은 장소입니다. 처리량이 목표인 경우(예: 가능한 한 많은 이미지 처리) CPU를 포화시키기 위해 여러 스레드 및 동시성을 사용하는 경우가 많습니다.
스레딩 및 동시성에 관해서는 실험을 실행하고 타이밍을 측정하려고 합니다. 목표와 시나리오에 따라 성능이 크게 변경됩니다.
메모리 사용률
LearningModel 및 LearningModelSession의 각 인스턴스에는 메모리에 모델의 복사본이 있습니다. 작은 모델로 작업하는 경우 걱정하지 않을 수 있지만 매우 큰 모델로 작업하는 경우 이것이 중요해집니다.
메모리를 해제하려면 모델 또는 세션에서 Dispose 를 호출합니다. 일부 언어는 지연 가비지 수집을 수행하므로 삭제하지 마세요.
LearningModel 은 새 세션을 만들 수 있도록 메모리에 복사본을 유지합니다. LearningModel을 삭제하면 모든 기존 세션이 계속 작동합니다. 그러나 더 이상 해당 LearningModel 인스턴스를 사용하여 새 세션을 만들 수 없습니다. 대형 모델의 경우 모델 및 세션을 만든 다음 모델을 삭제할 수 있습니다. Evaluate에 대한 모든 호출에 단일 세션을 사용하면 메모리에 큰 모델의 단일 복사본이 있습니다.
Float16 지원
성능 향상 및 모델 공간 감소를 위해 ONNXMLTools를 사용하여 모델을 float16으로 변환할 수 있습니다.
변환되면 모든 가중치와 입력이 float16입니다. float16 입력 및 출력을 사용하는 방법은 다음과 같습니다.
-
- 권장 사용.
- 색을 변환하고 float16으로 텐서화합니다.
- 데이터 손실 없이 float16으로 안전하게 변환할 수 있는 bgr8 및 8비트 이미지 형식을 지원합니다.
-
- 고급 경로입니다.
- Float32는 float16으로 캐스팅됩니다.
- 이미지의 경우 bgr8이 작고 적합하므로 캐스팅해도 안전합니다.
- 비 이미지의 경우 바인딩 이 실패하고 대신 TensorFloat16Bit 를 전달해야 합니다.
-
- 고급 경로입니다.
- 먼저 float16으로 변환한 다음, float32로 입력을 전달하고 이를 float16으로 캐스팅해야 합니다.
비고
대부분의 경우 연산자는 여전히 32비트 수학을 수행합니다. 오버플로에 대한 위험이 적고 결과가 float16으로 잘립니다. 그러나 하드웨어가 float16 지원을 보급하는 경우 런타임에서 이를 활용합니다.
입력 데이터 전처리
WinML은 입력 데이터를 더 간단하고 효율적으로 처리하기 위해 몇 가지 사전 처리 단계를 수행합니다. 예를 들어 지정된 입력 이미지는 다양한 색 형식 및 셰이프일 수 있으며 모델이 기대하는 것과 다를 수 있습니다. WinML은 이미지에 맞게 변환을 수행하여 개발자의 부하를 줄입니다.
또한 WinML은 전체 하드웨어 스택(CPU, GPU 등)을 활용하여 특정 디바이스 및 시나리오에 가장 효율적인 변환을 제공합니다.
그러나 특정 요구 사항으로 인해 입력 데이터를 수동으로 텐서화할 수도 있습니다. 예를 들어 이미지에 VideoFrame 을 사용하지 않거나 픽셀 값을 0-255 범위에서 0-1 범위로 정규화하려고 할 수 있습니다. 이러한 경우 데이터에 대한 사용자 지정 텐서화를 수행할 수 있습니다. 이에 대한 예제는 사용자 지정 텐서화 샘플을 참조하세요.
비고
Windows ML에 대한 도움말을 보려면 다음 리소스를 사용합니다.
- Windows ML에 대한 기술적인 질문을 하거나 대답하려면 Stack Overflow에서 windows-machine-learning 태그를 사용하세요.
- 버그를 보고하려면 GitHub에 문제를 제출하세요.