다음을 통해 공유


Windows ML 성능 및 메모리

이 문서에서는 Windows Machine Learning을 사용할 때 애플리케이션의 성능을 관리하는 방법을 설명합니다.

스레딩 및 동시성

런타임에 공개되는 모든 개체는 Agile입니다. 즉, 모든 스레드에서 액세스할 수 있습니다. Agile에 대한 자세한 내용은 C++/WinRT의 Agile 개체를 참조하세요.

여러분이 작업할 주요 개체 중 하나는 LearningModelSession입니다. 이 개체는 어느 스레드에서 호출해도 항상 안전합니다.

  • GPU 세션의 경우: 이 개체가 잠기고 동시 호출을 동기화합니다. 동시성이 필요한 경우 여러 세션을 만들어야 합니다.

  • CPU 세션의 경우: 이 개체가 잠기지 않으며 단일 세션에서 동시 호출을 허용합니다. 사용자 고유의 상태, 버퍼 및 바인딩 개체를 관리하려면 주의가 필요합니다.

시나리오의 목표를 신중하게 고려해야 합니다. 최신 GPU 아키텍처는 CPU와 다르게 작동합니다. 예를 들어 낮은 대기 시간이 목표인 경우 동시성이 아닌 파이프라인을 사용하여 CPU 및 GPU 엔진에서 작업을 예약하는 방법을 관리해야 합니다. 다중 엔진 동기화에 대한 이 문서는 시작하는 분들에게 좋은 자료입니다. 처리량이 목표인 경우(예: 최대한 많은 이미지를 동시에 처리하려는 경우) CPU를 포화 상태로 만들기 위해 다중 스레드와 동시성을 사용할 때가 많습니다.

스레딩 및 동시성을 달성하려면 실험을 실행하고 타이밍을 측정해야 합니다. 성능은 목표와 시나리오에 따라 크게 달라집니다.

메모리 사용률

LearningModelLearningModelSession의 각 인스턴스에는 메모리에 모델의 복사본이 있습니다. 작은 모델로 작업하는 경우 걱정하지 않아도 되지만 매우 큰 모델로 작업하는 경우에는 중요합니다.

메모리를 해제하려면 모델이나 세션에서 Dispose를 호출합니다. 단순히 삭제하지 마십시오. 일부 언어는 지연 가비지 수집을 수행하기 때문입니다.

LearningModel은 신규 세션을 만들 수 있도록 메모리에 복사본을 보관합니다. LearningModel을 삭제하면 기존의 모든 세션이 계속 작동합니다. 하지만, 해당 LearningModel 인스턴스로 더 이상 신규 세션을 만들 수 없습니다. 큰 모델의 경우 모델과 세션을 만든 다음, 모델을 삭제할 수 있습니다. Evaluate에 대한 모든 호출에 단일 세션을 사용하면 메모리에 큰 모델의 단일 복사본을 갖게 됩니다.

Float16 지원

성능을 높이고 모델이 사용하는 공간을 줄이기 위해 ONNXMLTools를 사용하여 모델을 float16으로 변환할 수 있습니다.

변환 후에는 모든 가중치와 입력이 float16입니다. float16 입력 및 출력으로 작업하는 방법은 다음과 같습니다.

  • ImageFeatureValue

    • 권장 사용법입니다.
    • 색상을 변환하고 float16으로 텐서화(tensorize)합니다.
    • 데이터 손실 없이 float16으로 안전하게 변환할 수 있는 bgr8 및 8비트 이미지 형식을 지원합니다.
  • TensorFloat

    • 고급 경로입니다.
    • Float32가 float16으로 캐스팅됩니다.
    • 이미지의 경우 캐스팅하기에 안전합니다. bgr8이 작고 적합하기 때문입니다.
    • 이미지가 아닌 경우 Bind가 실패하며, TensorFloat16Bit를 대신 전달해야 합니다.
  • TensorFloat16Bit

    • 고급 경로입니다.
    • float16으로 변환하고 입력을 float32로 전달하면 float16으로 캐스팅됩니다.

참고 항목

대부분의 경우 연산자는 여전히 32비트 수학을 수행합니다. 오버플로의 위험이 적으며 결과가 float16으로 잘립니다. 단, 하드웨어가 float16 지원을 알리면 런타임은 이를 활용합니다.

입력 데이터 사전 처리

WinML은 입력 데이터를 보다 간단하고 효율적으로 처리할 수 있도록 일부 전처리 단계를 내부적으로 수행합니다. 예를 들어, 지정된 입력 이미지의 색상과 모양은 다양할 수 있으며 모델에 필요한 것과 다를 수 있습니다. WinML은 이미지 매칭을 위해 이미지에 대한 변환을 수행하기 때문에 개발자의 부담이 줄어듭니다.

또한, WinML은 전체 하드웨어 스택(CPU, GPU 등)을 활용하여 특정 디바이스와 시나리오에 가장 효율적인 변환을 제공합니다.

하지만 경우에 따라 특정 요구 사항으로 인해 입력 데이터를 수동으로 텐서화(tensorize)해야 할 수 있습니다. 예를 들어 이미지에 VideoFrame을 사용하지 않거나 0-255 범위에서 0-1 범위의 픽셀 값을 정규화해야 하는 경우가 있습니다. 이런 경우 데이터에 대한 사용자 지정 텐서화(tensorization)를 직접 수행할 수 있습니다. 이에 대한 예제는 사용자 지정 텐서화 샘플을 참조하세요.

참고 항목

Windows ML에 대한 도움말은 다음 리소스를 참조하세요.

  • Windows ML에 대한 기술적인 질문을 하거나 질문에 답하려면, Stack Overflow에서 windows-machine-learning 태그를 사용하세요.
  • 버그를 보고하려면 GitHub에서 문제를 제출하세요.