Windows 모델 평가

현재 CNTK Windows 모델을 로드하고 평가하기 위한 C++, C#/.NET, Python 및 Java 라이브러리를 제공합니다. v2.1부터 CNTK UWP(유니버설 Windows 플랫폼)도 지원합니다.

C#/.NET 관리형 API 사용

CNTK 라이브러리는 C# 및 기타 .NET 언어를 사용하여 CPU 및 GPU에서 CNTK 모델을 평가하기 위한 관리형(.NET) 라이브러리를 제공합니다. NuGet 패키지 CNTK. CPUOnly는 CPU 및 CNTK 실행을 위해 설계되었습니다. GPU는 NVIDIA GPU를 사용하여 디바이스에서 실행되도록 설계되었습니다. CNTK 라이브러리 NuGet 패키지를 설치하는 방법에 대한 자세한 내용은 NuGet 패키지 페이지를 참조하세요. Visual Studio 2017이 필요하며 프로젝트 속성의 대상 플랫폼은 X64여야 합니다.

CNTK 라이브러리 관리 API를 사용하면 지정된 디바이스(CPU 또는 GPU)에서 미리 학습된 모델을 로드하고 평가할 수 있습니다. 또한 조밀한 원 핫 벡터 또는 스파스 CSC 형식으로 입력 및 출력 데이터를 준비하는 데 도움이 되는 다양한 방법을 제공합니다. 입력 데이터는 단일 샘플, 여러 샘플 일괄 처리, 샘플 시퀀스 또는 가변 길이가 있는 시퀀스 일괄 처리일 수 있습니다. 일괄 처리 및 시퀀스 형식에 대한 자세한 설명은 개념에 CNTK 페이지에서 찾을 수 있습니다. 평가 후 API는 결과를 가져오는 편리한 방법을 제공합니다.

C#/.NET 프로그래밍 가이드

CNTK 라이브러리 관리형 API를 사용하는 모델 평가의 일반적인 단계는 다음과 같습니다.

  1. 적절한 NuGet 패키지(사용량에 따라 CPU 또는 GPU)를 설치합니다. 자세한 내용은 CNTK NuGet 패키지에 설명되어 있습니다.
  2. Function.Load()로 모델을 로드합니다. 반환된 값은 로드된 모델을 참조하는 인스턴스입니다 Function .
  3. 필요한 경우 Load()에서 반환된 함수 인스턴스 또는 Outputs 속성을 ArgumentsOutput 호출하여 로드된 모델의 입력 및 출력을 가져옵니다. 입력 및 출력은 .로 Variable표시됩니다. 각 개별 입력 또는 출력에 대한 추가 정보(예: NameShape 변수의 해당 속성을 호출하여 찾을 수 있습니다).
  4. 각 입력에 대해 평가를 위해 입력 데이터를 준비합니다. 사용량에 따라 입력 데이터는 단일 샘플, 여러 샘플 일괄 처리, 샘플 시퀀스 또는 가변 길이가 있는 시퀀스 일괄 처리로 구성될 수 있습니다. 스토리지와 관련하여 입력 데이터는 조밀한 형식, 원 핫 벡터 또는 스파스 CSC 형식일 수 있습니다. 개체는 Value 다양한 내용과 형식으로 입력 데이터를 나타내는 데 사용됩니다. CNTK API는 일반 사용자 데이터에서 Value 개체를 쉽게 만드는 다양한 방법을 제공합니다.
    • CreateBatch() 단일 또는 여러 샘플의 일괄 처리를 포함하는 Value 개체를 만듭니다.
    • CreateSequence() 는 여러 샘플이 있는 시퀀스를 포함하는 Value 개체를 만듭니다. 이 시퀀스가 이전 호출에서 이 메서드에 대한 시퀀스 목록의 동일한 인덱스에서 이전 시퀀스의 새 시퀀스인지 또는 연속인지 지정할 수 있습니다.
    • CreateBatchOfSequences() 는 시퀀스의 일괄 처리를 포함하는 Value 개체를 만듭니다. 각 시퀀스에는 샘플의 길이가 가변적입니다. 위의 모든 메서드는 조밀한 원 핫 벡터 또는 스파스 CSC 형식을 모두 지원합니다.
  5. 메서드를 Evaluate() 호출하여 평가를 실행합니다. 매개 변수 arguments 는 입력 변수 및 관련 값을 정의하고 outputs 출력 변수를 정의합니다. 출력 변수의 Value 개체인 null경우 CNTK 라이브러리는 출력 값에 대한 실제 스토리지를 할당합니다. 반환 시 Evaluate()는 출력 변수와 연결된 값 개체에 평가 결과를 저장합니다.
  6. GetDenseData()/GetOneHotData() 출력 값의 메서드를 호출하여 결과를 일반 데이터 형식으로 가져옵니다. 값 개체에 저장된 데이터를 조밀한 형식 또는 1 핫 벡터 형식으로 가변 길이 샘플이 있는 시퀀스 목록으로 버퍼에 복사합니다(스파스 형식에 대한 지원은 곧 추가될 예정).

CNTK 라이브러리 관리형 API는 CNTK 라이브러리 C#/.NET 관리형 API 페이지에 설명되어 있습니다.

병렬로 여러 요청 평가

CNTK 여러 요청을 병렬로 평가할 수 있습니다. 동일한 모델 인스턴스에서 평가를 실행하는 것은 스레드로부터 안전하지 않으므로 먼저 Clone() ParameterCloningMethod.Share을 호출하여 여러 모델 인스턴스를 만든 다음 각 스레드는 평가에 별도의 모델 인스턴스를 사용합니다. CNTK EvaluateMultipleImagesInParallelAsync() C#/.NET Managed API를 사용하여 동시 요청을 평가하는 방법을 보여 줍니다.

비동기적으로 평가 실행

CNTK C# API에는 평가()에 대한 비동기 메서드가 없습니다. 평가는 CPU 바인딩된 작업이므로 자세한 설명은 [이 문서](https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/)를 참조하세요. 그러나 응답성을 위한 오프로딩과 같은 일부 사용 사례에서는 평가를 비동기적으로 실행하는 것이 바람직하며, 확장 메서드EvaluateAsync()를 사용하여 이를 달성하는 방법을 예제 EvaluationSingleImageAsync() 에 보여 줍니다.

중간 계층 평가

CNTK C# API는 모델 그래프에서 중간 계층을 평가할 수 있습니다. 이를 위해 원하는 계층을 이름으로 찾을 수 있으며 중간 계층을 평가할 수 있습니다. C#의 EvaluateIntermediateLayer() 예제에서는 모델에서 중간 계층을 평가하는 방법을 보여 줍니다.

여러 노드의 출력 평가

CNTK 출력을 단일 노드로 결합하여 모델 그래프에서 여러 노드를 평가할 수 있습니다. C#의 EvaluateCombinedOutputs() 예제에서는 여러 출력을 평가하는 방법을 보여 줍니다.

C# 예제

CNTKLibraryCSEvalExamples는 CNTK 라이브러리 NuGet 패키지를 사용하여 C#에서 모델을 평가하는 방법을 보여 줍니다. 예제를 빌드하고 실행하려면 Eval 예제 페이지를 참조하세요.

NuGet 패키지를 사용하지 않으려면 프로젝트에 대한 참조로 추가할 Cntk.Core.Managed-<VERSION>.dll 수 있습니다. DLL 및 모든 종속 DLL은 Cntk.Core.Managed CNTK 릴리스 페이지의 CNTK 이진 릴리스 패키지에서 찾을 수 있습니다. DLL 경로 Cntk.Core.Managed 와 해당 종속성 (이 페이지의 끝에 있는 목록 참조)이 애플리케이션에 대한 DLL의 검색 경로에 포함되어 있는지 확인하세요.

C++ 사용

CNTK 라이브러리 C++ API는 C++ 애플리케이션에서 모델 평가를 지원합니다. 표준 데스크톱 애플리케이션과 유니버설 Windows 플랫폼 애플리케이션이 모두 지원됩니다. Visual Studio 2017이 필요하며 프로젝트 속성의 대상 플랫폼은 X64여야 합니다.

CNTK NuGet 패키지 CNTK. CPUOnly 및 CNTK. GPU에는 데스크톱 애플리케이션에서 CNTK 사용하기 위한 C++ CNTK 라이브러리가 포함되어 있습니다. 유니버설 Windows 플랫폼 CNTK 사용하려면 CNTK 설치하세요. UWP. CPUOnly. NuGet 패키지를 사용하면 포함 및 라이브러리 디렉터리에 대한 구성이 프로젝트 속성에 자동으로 추가됩니다. 디버그 및 릴리스 빌드가 모두 지원됩니다. NuGet 패키지 페이지에서는 CNTK NuGet 패키지를 가져와서 설치하는 방법을 설명합니다.

C++ 프로그래밍 가이드

다음 단계에서는 모델 평가에 C++ CNTK 라이브러리를 사용하는 방법을 설명합니다.

  1. 가져오기 라이브러리를 Cntk.Core-<VERSION>.lib 애플리케이션에 연결합니다. NuGet 패키지를 사용하는 경우 이 단계를 생략할 수 있습니다. UWP 애플리케이션의 경우 라이브러리 이름은 .입니다 Cnkt.Core_app-<Version>.lib.
  2. 평가 헤더 파일 "CNTKLibrary.h"를 포함합니다.
  3. 에 의해 모델을 로드합니다 CNTK::Function::Load(). 반환된 Function 개체는 모델의 계산 그래프를 나타냅니다.
  4. 각 입력 변수에 대한 데이터를 준비합니다. 샘플 일괄 처리, CNTK::Value::CreateSequence()샘플 시퀀스 또는 샘플 시퀀스의 일괄 처리를 나타내는 입력 데이터에서 Value 개체를 만들거나 CNTK::Value::CreateBatchOfSequences() 사용할 CNTK::Value::CreateBatch()수 있습니다.
  5. 평가를 요청 CNTK::Function::Evaluate() 합니다. Evaluate() 입력 변수 및 입력 값에 대한 unordered_map 입력으로 예상하며 출력 변수 및 출력 값에 대한 unordered_map. 출력 값 개체는 null CNTK 라이브러리가 이 출력 값에 대한 실제 스토리지를 할당한다는 것을 의미합니다. 반환 시 출력 변수와 연결된 Value 개체에는 평가 결과가 포함됩니다.
  6. 평가 결과에서 출력 데이터를 가져옵니다. 값 개체에 저장된 데이터를 샘플 길이가 가변적인 시퀀스 목록으로 버퍼에 복사하는 데 사용합니다 CNTK::Value::CopyVariableValueTo() .

여러 요청을 CNTK::Function::Clone() 동시에 평가하려면 Evaluate() 전에 호출해야 합니다. CNTK ParallelEvaluationExample() C++ 라이브러리 API를 사용하여 여러 요청을 병렬로 평가하는 방법을 보여 줍니다.

평가를 위한 C++ CNTK 라이브러리 API에 대한 자세한 내용은 CNTK 라이브러리 C++ 평가 인터페이스 페이지를 참조하세요.

C++ 예제

C++ 예제 및 CNTKLibraryCPPEvalCPUOnlyExamplesCNTKLibraryCPPEvalGPUExamples 위의 사용 패턴을 보여 줍니다. UWPImageRecognition에는 모델 평가를 위해 CNTK UWP 라이브러리를 사용하는 예제가 포함되어 있습니다. Eval 예제 페이지에서는 예제를 빌드하고 실행하는 방법에 대한 자세한 단계를 제공합니다.

또는 NuGet 패키지 없이 C++ CNTK 라이브러리를 사용할 수 있습니다. CNTK 릴리스 페이지에서 (또는Cntk.Core_app-<Version>.lib) 모든 종속 DLL을 얻 Cntk.Core-<VERSION>.lib 거나 소스 코드를 CNTK 빌드할 수 있습니다. 또한 올바른 디렉터리를 가리키도록 포함 및 라이브러리 경로를 구성하고 CNTK 라이브러리의 빌드 구성(디버그 또는 릴리스)이 프로젝트 설정과 동일한지 확인해야 합니다(그렇지 않으면 예기치 않은 예외가 발생함). CNTK 릴리스 패키지에는 이진 파일의 릴리스 빌드만 포함됩니다.

Windows 애플리케이션을 사용하여 CNTK 라이브러리 배송

CNTK 라이브러리는 애플리케이션이 실행될 시스템에 Visual Studio 2017용 Visual C++ 재배포 가능 패키지 패키지를 설치해야 합니다. 그리고 프로젝트 속성의 대상 플랫폼은 X64여야 합니다.

페이지에서는 CNTK 이진 파일의 이름을 지정하는 방법을 설명합니다.

데스크톱 C++ 애플리케이션의 경우 다음 DLL을 애플리케이션과 함께 배포해야 합니다.

  • Cntk.Core-<VERSION>.dll
  • Cntk.Math-<VERSION>.dll
  • libiomp5md.dll
  • mklml.dll

위에서 언급한 DLL 옆에 C#/.NET 관리형 라이브러리를 사용하는 경우 다음 DLL을 추가로 포함해야 합니다.

  • Cntk.Core.Managed-<VERSION>.dll
  • Cntk.Core.CSBinding-<VERSION>.dll

GPU를 사용하려면 다음 NVIDIA CUDA 관련 DLL을 포함해야 합니다.

  • cublas64_90.dll
  • cudart64_90.dll
  • cudnn64_7.dll
  • curand64_90.dll
  • cusparse64_90.dll
  • nvml.dll

참고

CNTK 버전 2.1에서 변경되었습니다.

CNTK NuGet 패키지는 cuDNN 6(cudnn64_6.dll)과 함께 배송됩니다.

이러한 모든 DLL은 CNTK 이진 릴리스 버전에서 찾을 수 있습니다. CNTK 릴리스 페이지를 참조하세요.

UWP 애플리케이션의 경우 다음 DLL을 애플리케이션과 함께 배포해야 합니다. Nuget 패키지 CNTK.UWP.CPUOnly에서 이러한 DLL을 찾을 수 있습니다.

  • Cntk.Core_app-<VERSION>.dll
  • Cntk.Math_app-<VERSION>.dll
  • libopenblas.dll

Python 사용

Python을 사용하여 미리 학습된 모델을 평가할 수 있습니다. 예제는 여기에서 찾을 수 있습니다.

Java 사용

CNTK Java 애플리케이션에서 모델을 평가하기 위한 API도 제공합니다. CNTK Java API는 여전히 실험적이며 변경될 수 있습니다.

Java 예제에서는 Java API를 사용하여 CNN 모델을 평가하는 방법을 보여줍니다.

CNTK Java 라이브러리를 사용하려면 Java 프로젝트에 파일을 classpath 추가 cntk.jar 하세요. IDE를 사용하는 경우 이를 관리되지 않는 jar로 추가해야 합니다. cntk.jar 파일은 CNTK 이진 릴리스 패키지(cntk\cntk\java 폴더)에서 찾을 수 있습니다. CNTK 원본에서 cntk.jar을 빌드할 수도 있습니다. 또한 포함된 Cntk.Core.JavaBinding-<Version>.dll디렉터리로 설정하고 java.library.path CNTK 이진 DLL을 포함하는 디렉터리가 시스템의 DLL 검색 경로에 있는지 확인합니다(예: PATH 환경 변수에 디렉터리를 추가). 또한 Visual Studio 2017용 Visual C++ 재배포 가능 패키지 패키지를 설치해야 합니다. Java에서 가져오는 UnsatisfiedLinkErrors 경우 디렉터리가 DLL 검색 경로(또는 잘못된 순서)에 있지 않기 때문입니다.

Java 라이브러리는 현재 64비트 Oracle JDK 8을 사용하여 빌드되고 테스트됩니다.