Windowsでのモデル評価

現在、CNTKは、Windowsでモデルを読み込んで評価するための C++、C#/.NET、Python、Java のライブラリを提供しています。 v2.1 以降では、CNTKは ユニバーサル Windows プラットフォーム (UWP) もサポートしています。

C#/.NET マネージ API の使用

CNTK ライブラリには、C# やその他の .NET 言語を使用して CPU および GPU 上のCNTK モデルを評価するためのマネージド (.NET) ライブラリが用意されています。 NuGet パッケージCNTK。CPUOnly は、CPU とCNTKで実行するように設計されています。GPU は、NVIDIA GPU を使用したデバイスでの実行用に設計されています。 ライブラリ NuGet パッケージをインストールする方法の詳細については、NuGet パッケージ ページCNTK参照してください。 Visual Studio 2017 が必要であり、プロジェクト プロパティのターゲット プラットフォームは X64 である必要があることに注意してください。

CNTK ライブラリ マネージド API を使用すると、指定したデバイス (CPU または GPU) で事前トレーニング済みのモデルを読み込んで評価できます。 また、高密度の 1 ホット ベクトルまたはスパース CSC 形式で入力データと出力データを準備するのに役立つさまざまな方法も提供します。 入力データには、1 つのサンプル、複数のサンプルのバッチ、サンプルのシーケンス、または可変長シーケンスのバッチを指定できます。 バッチとシーケンスの形式の詳細については、「概念」のページCNTK参照してください。 評価後、API は結果を取得するための便利なメソッドを提供します。

C#/.NET プログラミング ガイド

CNTK ライブラリ マネージド API を使用したモデル評価の通常の手順は次のとおりです。

  1. 適切なNuGet パッケージ (使用に応じて CPU または GPU) をインストールします。 詳細については、CNTK NuGet パッケージで説明されています。
  2. Function.Load() によってモデルを読み込みます。 返される値は、 Function 読み込まれたモデルを参照するインスタンスです。
  3. 必要に応じて、読み込まれたモデルの入力と出力を取得するには、プロパティ Argumentsを呼び出すか、 Output Load Outputs () によって返される関数インスタンスを呼び出します。 入力と出力は次のように Variable表されます。 個々の入力または出力に関する詳細情報(たとえば NameShape 、変数の対応するプロパティを呼び出すことによって見つけることができます)。
  4. 入力ごとに、評価用に入力データを準備します。 使用状況によっては、入力データは、1 つのサンプル、複数のサンプルのバッチ、一連のサンプル、または可変長シーケンスのバッチで構成される場合があります。 ストレージに関しては、入力データは密形式、1 ホット ベクトル、またはスパース CSC 形式にすることができます。 オブジェクトは Value 、さまざまな内容と形式を持つ入力データを表すために使用されます。 CNTK API には、プレーン ユーザー データから Value オブジェクトを簡単に作成するためのさまざまなメソッドが用意されています。
    • CreateBatch() は、1 つまたは複数のサンプルのバッチを含む Value オブジェクトを作成します。
    • CreateSequence() は、複数のサンプルを含むシーケンスを含む Value オブジェクトを作成します。 このシーケンスが、このメソッドの前の呼び出しからシーケンス リスト内の同じインデックスにある前のシーケンスの新しいシーケンスか継続かを指定できます。
    • CreateBatchOfSequences() は、シーケンスのバッチを含む Value オブジェクトを作成します。 各シーケンスには、サンプルの可変長があります。 上記のすべての方法では、高密度の 1 ホット ベクトルまたはスパース CSC 形式の両方がサポートされています。
  5. メソッドを Evaluate() 呼び出して評価を実行します。 このパラメーター arguments は、入力変数とその関連する値を定義し outputs 、出力変数を定義します。 出力変数の Value オブジェクトが指定されている場合、CNTKライブラリはnull出力値に実際のストレージを割り当てます。 返された場合、Evaluate() は、出力変数に関連付けられている Value オブジェクトに評価結果を保存します。
  6. 出力値の GetDenseData()/GetOneHotData() メソッドを呼び出して、結果をプレーン データ形式で取得します。 Value オブジェクトに格納されているデータを、高密度形式または 1 ホット ベクター形式の可変長サンプルを含むシーケンスの一覧としてバッファーにコピーします (スパース形式のサポートはすぐに追加されます)。

CNTK ライブラリ マネージ API については、「CNTK ライブラリ C#/.NET マネージ API」ページで説明されています。

複数の要求を並列で評価する

CNTKでは、複数の要求を並列で評価できます。 同じモデル インスタンスで評価を実行することはスレッド セーフではないため、まず Clone() を呼び出して複数のモデル インスタンスを作成し、各スレッドで ParameterCloningMethod.Share評価に個別のモデル インスタンスを使用する必要があります。 CEvaluateMultipleImagesInParallelAsync()#/.NET マネージ API CNTK使用して同時要求を評価する方法を示します。

評価を非同期で実行する

CNTK C# API には Evaluate() の非同期メソッドがありません。評価は CPU バインド操作であるためです (詳細な説明については、[この記事] (https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/) を参照してください)。 ただし、応答性のためのオフロードなど、一部のユース ケースでは評価を非同期的に実行することが望まれます。この例 EvaluationSingleImageAsync() では、拡張メソッド EvaluateAsync()を使用してそれを実現する方法を示します。

中間レイヤーを評価する

CNTK C# API は、モデル グラフで中間レイヤーを評価できます。 そのためには、目的のレイヤーがその名前で見つかり、中間レイヤーを評価できます。 C# の EvaluateIntermediateLayer() の例は、モデル内の中間レイヤーを評価する方法を示しています。

複数のノードからの出力を評価する

CNTKは、出力を 1 つのノードに結合することで、モデル グラフ内の複数のノードを評価できます。 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::CreateBatchOfSequences()サンプルのシーケンスのバッチをそれぞれ表す入力データから Value オブジェクトを作成するために使用CNTK::Value::CreateBatch()CNTK::Value::CreateSequence()できます。
  5. 評価を呼び出します CNTK::Function::Evaluate() 。 入力変数 Evaluate() と入力値のunordered_mapと、出力変数と出力値のunordered_mapとして想定されます。 出力値オブジェクトは、nullCNTK ライブラリがこの出力値に実際のストレージを割り当てることを意味する可能性があります。 返された場合、出力変数に関連付けられている Value オブジェクトには、評価の結果が含まれます。
  6. 評価結果から出力データを取得します。 Value オブジェクトに格納されているデータを、サンプルの可変長シーケンスの一覧としてバッファーにコピーするために使用 CNTK::Value::CopyVariableValueTo() します。

複数の要求を同時に評価する場合は、 CNTK::Function::Clone() Evaluate() の前に呼び出す必要があります。 このParallelEvaluationExample()例では、CNTK C++ ライブラリ API を使用して複数の要求を並列で評価する方法を示します。

C++ CNTK ライブラリ API の評価の詳細については、「CNTK ライブラリ C++ 評価インターフェイス」ページを参照してください。

C++ の例

C++ の CNTKLibraryCPPEvalCPUOnlyExamples 例と、 CNTKLibraryCPPEvalGPUExamples 上記の使用パターンを示します。 UWPImageRecognition には、モデル評価CNTK UWP ライブラリを使用した例が含まれています。 [Eval の例] ページには、サンプルのビルドと実行に関する詳細な手順が示されています。

または、NuGet パッケージなしで C++ CNTK ライブラリを使用することもできます。 CNTK リリース ページからすべての依存 DLL を取得 Cntk.Core-<VERSION>.lib (または) するかCntk.Core_app-<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

C#/.NET マネージ ライブラリを使用する場合は、上記の DLL の横に、さらに次の 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 をアプリケーションと共に配布する必要があります。 これらの DLL は Nuget パッケージ CNTK.UWP.CPUOnlyにあります。

  • 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 でビルドおよびテストされています。