Delen via


Modelevaluatie op Windows

Momenteel biedt CNTK bibliotheken in C++, C#/.NET, Python en Java voor het laden en evalueren van modellen op Windows. Vanaf v2.1 ondersteunt CNTK ook Universeel Windows-platform (UWP).

Beheerde API van C#/.NET gebruiken

De CNTK-bibliotheek biedt een beheerde (.NET)-bibliotheek voor evaluatie van CNTK modellen op CPU en GPU met behulp van C# en andere .NET-talen. Het NuGet-pakket CNTK. CPUOnly is ontworpen voor uitvoering op CPU en de CNTK. GPU is ontworpen voor uitvoering op apparaten met NVIDIA GPU. Raadpleeg de pagina NuGet-pakket voor meer informatie over het installeren van CNTK Library NuGet-pakketten. Houd er rekening mee dat Visual Studio 2017 vereist is en dat het doelplatform in de projecteigenschap X64 moet zijn.

Met de CNTK Bibliotheek beheerde API kunt u vooraf getrainde modellen laden en evalueren op opgegeven apparaten (CPU of GPU). Het biedt ook verschillende manieren om u te helpen bij het voorbereiden van invoer- en uitvoergegevens in de dichte, one-hot vector of sparse CSC-indeling. De invoergegevens kunnen één steekproef, batch met meerdere steekproeven, een reeks steekproeven of een reeks reeksen met variabele lengten zijn. Een gedetailleerde beschrijving over batch- en reeksindeling vindt u op de pagina CNTK Concepten. Na de evaluatie biedt de API handige methoden om resultaten op te halen.

Programmeerhandleiding voor C#/.NET

De gebruikelijke stappen voor modelevaluatie met behulp van CNTK Bibliotheek beheerde API zijn onder andere:

  1. Installeer het juiste NuGet-pakket (CPU of GPU, afhankelijk van gebruik) naar uw. Details worden beschreven in het CNTK NuGet-pakket.
  2. Laad het model op Function.Load(). De geretourneerde waarde is een Function instantie die verwijst naar het geladen model.
  3. Haal indien nodig invoer en uitvoer van het geladen model op door de eigenschappen ArgumentsOutput aan te roepen of Outputs door het functie-exemplaar dat wordt geretourneerd door Load(). De invoer en uitvoer worden weergegeven als Variable. Meer informatie over elke afzonderlijke invoer of uitvoer, bijvoorbeeld Name of Shape kan worden gevonden door de bijbehorende eigenschappen van de variabele aan te roepen.
  4. Bereid invoergegevens voor elke invoer voor op evaluatie. Afhankelijk van het gebruik kunnen invoergegevens bestaan uit één steekproef, batch met meerdere steekproeven, een reeks voorbeelden of een reeks reeksen met variabele lengte. Met betrekking tot opslag kunnen invoergegevens een compacte indeling hebben, een hot vector of een parseren CSC-indeling. Het Value object wordt gebruikt om de invoergegevens met verschillende inhoud en indelingen weer te geven. De CNTK-API biedt verschillende methoden om eenvoudig het waardeobject te maken op basis van gebruikersgegevens zonder opmaak.
    • CreateBatch() maakt een Waarde-object met een batch met één of meerdere steekproeven.
    • CreateSequence() maakt een waardeobject met een reeks met meerdere voorbeelden. Het is mogelijk om op te geven of deze reeks een nieuwe reeks of voortzetting van een vorige reeks is in dezelfde index in de lijst met reeksen van een eerdere aanroep naar deze methode.
    • CreateBatchOfSequences() maakt een waardeobject met een reeks reeksen. Elke reeks heeft een variabele lengte van steekproeven. Alle bovenstaande methoden ondersteunen zowel de dichte, one-hot vector- of sparse CSC-indeling.
  5. Roep de methode aan om de Evaluate() evaluatie uit te voeren. De parameter arguments definieert invoervariabelen en de bijbehorende waarden en outputs definieert uitvoervariabelen. Als het waardeobject van een uitvoervariabele isnull, wijst CNTK Bibliotheek de werkelijke opslag voor de uitvoerwaarde toe. Bij retour slaat Evaluate() de evaluatieresultaten op in de waardeobjecten die zijn gekoppeld aan de uitvoervariabelen.
  6. Roep de GetDenseData()/GetOneHotData() methode van de uitvoerwaarde aan om de resultaten in een gewone gegevensindeling op te halen. Hiermee worden de gegevens die in het waardeobject zijn opgeslagen, gekopieerd naar de buffer als een lijst met reeksen met steekproeven met variabele lengte, in compacte indeling of in one-hot vectorindeling (ondersteuning voor de sparse-indeling wordt binnenkort toegevoegd).

De CNTK Library Managed API wordt beschreven op de pagina CNTK Library C#/.NET Managed API.

Evaluatie van meerdere aanvragen parallel

CNTK ondersteunt het parallel evalueren van meerdere aanvragen. Omdat het uitvoeren van evaluatie op hetzelfde modelexemplaren niet thread-veilig is, is het eerst vereist om meerdere modelexemplaren te maken door Clone() aan te roepen en ParameterCloningMethod.Sharevervolgens gebruikt elke thread een afzonderlijk modelexemplaren voor evaluatie. Het EvaluateMultipleImagesInParallelAsync() laat zien hoe u gelijktijdige aanvragen evalueert met behulp van CNTK C#/.NET Managed API.

Evaluatie asynchroon uitvoeren

CNTK C#-API heeft geen asynchrone methode voor Evaluate(), omdat de evaluatie een CPU-gebonden bewerking is (Raadpleeg [dit artikel] (https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/) voor gedetailleerde uitleg). Het is echter wenselijk om in sommige gebruiksscenario's asynchroon evaluatie uit te voeren, bijvoorbeeld offloaden voor reactiesnelheid, we laten zien in het voorbeeld EvaluationSingleImageAsync() hoe u dat kunt bereiken met behulp van de extensiemethode EvaluateAsync().

Tussenliggende lagen evalueren

CNTK C#-API kan een tussenliggende laag in een modelgrafiek evalueren. Daartoe kan de gewenste laag worden gevonden op basis van de naam en kan de tussenliggende laag worden geëvalueerd. In het voorbeeld EvaluateIntermediateLayer() in C# ziet u hoe u een tussenliggende laag in een model evalueert.

Uitvoer van meerdere knooppunten evalueren

CNTK kunt meerdere knooppunten in een modelgrafiek evalueren door hun uitvoer te combineren tot één knooppunt. In het voorbeeld EvaluateCombinedOutputs() in C# ziet u hoe u meerdere uitvoer kunt evalueren.

C#-voorbeelden

De CNTKLibraryCSEvalExamples laten zien hoe u een model in C# evalueert met behulp van CNTK Library NuGet-pakketten. Zie de pagina Voorbeelden van Eval voor het bouwen en uitvoeren van voorbeelden.

Als u NuGet Package niet wilt gebruiken, kunt u toevoegen Cntk.Core.Managed-<VERSION>.dll als verwijzing naar uw project. De Cntk.Core.Managed DLL en alle afhankelijke DLL's vindt u in het binaire releasepakket CNTK op de pagina CNTK Releases. Zorg ervoor dat het pad naar Cntk.Core.Managed DLL en de bijbehorende afhankelijkheden (zie de lijst aan het einde van deze pagina) zijn opgenomen in het zoekpad van DLL's voor uw toepassing.

C++ gebruiken

De CNTK Library C++ API ondersteunt modelevaluatie in C++-toepassingen. Zowel standaard bureaubladtoepassingen als Universeel Windows-platform toepassingen worden ondersteund. Visual Studio 2017 is vereist en het doelplatform in de projecteigenschap moet X64 zijn.

Het CNTK NuGet-pakket CNTK. CPUOnly en CNTK. GPU bevat C++ CNTK Bibliotheek voor het gebruik van CNTK in bureaubladtoepassingen. Installeer CNTK voor het gebruik van CNTK op Universeel Windows-platform. UWP. CPUOnly. Door NuGet-pakketten te gebruiken, wordt configuratie over opnemen en bibliotheekmappen automatisch toegevoegd aan uw projecteigenschap. Zowel foutopsporing als release-build worden ondersteund. Op de pagina NuGet-pakket wordt uitgelegd hoe u CNTK NuGet-pakketten kunt ophalen en installeren.

Programmeerhandleiding voor C++

In de volgende stappen wordt beschreven hoe u de C++ CNTK Library gebruikt voor modelevaluatie.

  1. Koppel de Cntk.Core-<VERSION>.lib importbibliotheek aan de toepassing. Deze stap kan worden weggelaten als u het NuGet-pakket gebruikt. Voor UWP-toepassing is Cnkt.Core_app-<Version>.libde bibliotheeknaam .
  2. Neem het evaluatieheaderbestand CNTKLibrary.h op.
  3. Laad het model op CNTK::Function::Load(). Het geretourneerde functieobject vertegenwoordigt de rekengrafiek van het model.
  4. Gegevens voorbereiden voor elke invoervariabele. U kunt een CNTK::Value::CreateSequence()CNTK::Value::CreateBatchOfSequences() waardeobject maken CNTK::Value::CreateBatch()op basis van uw invoergegevens die een reeks voorbeelden, een reeks voorbeelden of een reeks voorbeelden vertegenwoordigen, of een reeks voorbeelden.
  5. Oproep tot CNTK::Function::Evaluate() evaluatie. De Evaluate() verwachte invoer is een unordered_map voor invoervariabelen en invoerwaarden, en een unordered_map voor uitvoervariabelen en uitvoerwaarden. Het uitvoerwaardeobject kan dit null betekenen dat CNTK Bibliotheek de werkelijke opslag voor deze uitvoerwaarde toewijst. Bij retour bevatten de waardeobjecten die zijn gekoppeld aan de uitvoervariabelen de resultaten van de evaluatie.
  6. Uitvoergegevens ophalen uit evaluatieresultaten. Hiermee CNTK::Value::CopyVariableValueTo() kopieert u de gegevens die zijn opgeslagen in het object Waarde in de buffer als een lijst met reeksen met variabele lengte van steekproeven.

Voor gelijktijdige evaluatie van meerdere aanvragen CNTK::Function::Clone() moet vóór Evaluate() worden aangeroepen. Het ParallelEvaluationExample() laat zien hoe u meerdere aanvragen parallel evalueert met behulp van CNTK C++-bibliotheek-API.

Raadpleeg de pagina CNTK Library-evaluatieinterface voor C++ CNTK CNTK Library C++ voor meer informatie over de bibliotheekbibliotheek-API voor evaluatie.

C++-voorbeelden

De C++-voorbeelden CNTKLibraryCPPEvalCPUOnlyExamples en CNTKLibraryCPPEvalGPUExamples illustreren het bovenstaande gebruikspatroon. De UWPImageRecognition bevat een voorbeeld met behulp van CNTK UWP-bibliotheek voor modelevaluatie. De pagina Voorbeelden van Eval bevat gedetailleerde stappen voor het bouwen en uitvoeren van voorbeelden.

U kunt ook C++ CNTK Library gebruiken zonder het NuGet-pakket. U kunt (ofCntk.Core_app-<Version>.lib) en alle afhankelijke DLL's ophalen Cntk.Core-<VERSION>.lib van de pagina CNTK Releases of deze bouwen vanuit CNTK broncode. U moet ook opnemen en bibliotheekpad configureren om naar de juiste map te verwijzen en ervoor te zorgen dat de buildconfiguratie (foutopsporing of release) van de CNTK-bibliotheek hetzelfde is als die van uw projectinstelling (anders krijgt u onverwachte uitzonderingen). Het CNTK releasepakket bevat alleen de release-build van binaire bestanden.

CNTK-bibliotheek verzenden met uw Windows-toepassing

CNTK Bibliotheek vereist dat het Visual C++ Redistributable-pakket voor Visual Studio 2017 wordt geïnstalleerd op het systeem waarop uw toepassing wordt uitgevoerd. En het doelplatform in de projecteigenschap moet X64 zijn.

Op deze pagina wordt beschreven hoe CNTK binaire bestanden een naam krijgen.

Voor desktop-C++-toepassingen moeten de volgende DLL's worden gedistribueerd met uw toepassing.

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

Als u de beheerde C#/.NET-bibliotheek gebruikt, moet u naast de hierboven genoemde DLL's ook de volgende DLL's opnemen:

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

Voor het gebruik van GPU moet u naast de volgende NVIDIA CUDA-gerelateerde DLL's ook opnemen:

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

Notitie

Gewijzigd in CNTK versie 2.1.

CNTK NuGet-pakketten worden geleverd met cuDNN 6 (cudnn64_6.dll).

Al deze DLL's vindt u op de CNTK binaire releaseversie. Zie de pagina CNTK Releases.

Voor UWP-toepassingen moeten de volgende DLL's worden gedistribueerd met uw toepassing. U vindt deze DLL's in het Nuget-pakket CNTK.UWP.CPUOnly.

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

Python gebruiken

U kunt Python gebruiken om een vooraf getraind model te evalueren. Hier vindt u voorbeelden.

Java gebruiken

CNTK biedt ook API's voor het evalueren van het model in de Java-toepassing. Houd er rekening mee dat de CNTK Java-API nog steeds experimenteel is en kan worden gewijzigd.

In het Java-voorbeeld ziet u hoe u een CNN-model evalueert met behulp van de Java-API.

Als u CNTK Java-bibliotheek wilt gebruiken, voegt u het cntk.jar bestand toe aan het classpath Java-project. Als u met een IDE werkt, moet u dit toevoegen als een onbeheerde jar. Het bestand cntk.jar is te vinden in het binaire releasepakket CNTK (in de map cntk\cntk\java). U kunt ook cntk.jar bouwen vanuit CNTK bron. Stel ook java.library.path de map in die de map bevat Cntk.Core.JavaBinding-<Version>.dllen zorg ervoor dat de map met CNTK binaire DLL's zich in het DLL-zoekpad van uw systeem bevindt, bijvoorbeeld door de map toe te voegen aan de omgevingsvariabele PATH. Houd er rekening mee dat u ook Visual C++ Redistributable Package moet installeren voor Visual Studio 2017. Als u UnsatisfiedLinkErrors java gebruikt, komt dit meestal omdat de map zich niet in het DLL-zoekpad bevindt (of in de verkeerde volgorde).

De Java-bibliotheek is momenteel gebouwd en getest met 64-bits Oracle JDK 8.