Modellutvärdering på Windows
För närvarande tillhandahåller CNTK bibliotek i C++, C#/.NET, Python och Java för inläsning och utvärdering av modeller på Windows. Från och med v2.1 stöder CNTK även Universell Windows-plattform (UWP).
Använda C#/.NET Managed API
CNTK-biblioteket innehåller ett hanterat (.NET)-bibliotek för utvärdering av CNTK modeller för PROCESSOR och GPU med C# och andra .NET-språk. NuGet-paketet CNTK. CPUOnly är utformat för körning på CPU och CNTK. GPU är utformat för körning på enheter med NVIDIA GPU. Mer information om hur du installerar nuGet-paket för CNTK-bibliotek finns på sidan NuGet-paket. Observera att Visual Studio 2017 krävs och att målplattformen i projektegenskapen ska vara X64.
Med CNTK Library Managed API kan du läsa in och utvärdera förtränade modeller på angivna enheter (CPU eller GPU). Det finns också olika sätt att hjälpa dig att förbereda indata och utdata i det kompakta, one-hot-vektor- eller glesa CSC-formatet. Indata kan vara ett enda urval, en batch med flera exempel, en sekvens med exempel eller en batch med sekvenser med varierande längd. En detaljerad beskrivning av batch- och sekvensformat finns på sidan CNTK Begrepp. Efter utvärderingen tillhandahåller API:et praktiska metoder för att få resultat.
Programmeringsguide för C#/.NET
De vanliga stegen för modellutvärdering med hjälp av CNTK Library Managed API är:
- Installera lämpligt NuGet-paket (CPU eller GPU beroende på användning) på din. Information beskrivs i CNTK NuGet-paketet.
- Läs in modellen med Function.Load(). Det returnerade värdet är en
Function
instans som refererar till den inlästa modellen. - Om det behövs hämtar du indata och utdata från den inlästa modellen genom att anropa egenskaperna
Arguments
,Output
ellerOutputs
för funktionsinstansen som returneras av Load(). Indata och utdata representeras somVariable
. Mer information om varje enskild indata eller utdata, t.ex.Name
ellerShape
kan hittas genom att anropa motsvarande egenskaper för variabeln. - Förbered indata för utvärdering för varje indata. Beroende på användning kan indata bestå av ett enda exempel, en batch med flera exempel, en sekvens med exempel eller en batch med sekvenser med variabel längd. När det gäller lagring kan indata vara i kompakt format, one-hot-vektor eller gles CSC-format. Objektet
Value
används för att representera indata med olika innehåll och format. API:et CNTK innehåller olika metoder för att enkelt skapa value-objektet från vanliga användardata.CreateBatch()
skapar ett Värde-objekt som innehåller en batch med ett eller flera exempel.CreateSequence()
skapar ett Värde-objekt som innehåller en sekvens med flera exempel. Det går att ange om den här sekvensen är en ny sekvens eller en fortsättning av en tidigare sekvens vid samma index i sekvenslistan från ett tidigare anrop till den här metoden.CreateBatchOfSequences()
skapar ett Värde-objekt som innehåller en batch med sekvenser. Varje sekvens har en variabel längd på exemplen. Alla ovanstående metoder stöder både kompakta, enhetsvektor- eller glesa CSC-format.
Evaluate()
Anropa metoden för att köra utvärderingen. Parameternarguments
definierar indatavariabler och deras associerade värden ochoutputs
definierar utdatavariabler. Om värdeobjektet för en utdatavariabel ärnull
, allokerar CNTK-biblioteket det faktiska lagringsutrymmet för utdatavärdet. Vid retur sparar Evaluate() utvärderingsresultatet i de värdeobjekt som är associerade med utdatavariablerna.- Anropa metoden för
GetDenseData()/GetOneHotData()
utdatavärdet för att hämta resultatet i oformaterad dataformat. Den kopierar data som lagras i value-objektet till bufferten som en lista över sekvenser med variabellängdsexempel, antingen i kompakt format eller i ett frekvent vektorformat (stöd för det glesa formatet kommer snart att läggas till).
Det hanterade API:et för CNTK-bibliotek beskrivs på sidan CNTK Library C#/.NET Managed API.
Utvärdering av flera begäranden parallellt
CNTK stöder utvärdering av flera begäranden parallellt. Eftersom det inte är trådsäkert att köra utvärderingar på samma modellinstans måste du först skapa flera modellinstanser genom att anropa Clone() med ParameterCloningMethod.Share
, och sedan använder varje tråd en separat modellinstans för utvärdering. EvaluateMultipleImagesInParallelAsync()
visar hur du utvärderar samtidiga begäranden med hjälp av CNTK C#/.NET Managed API.
Köra utvärdering asynkront
CNTK C#-API:et har ingen asynkron metod för Evaluate(), eftersom utvärderingen är en CPU-bunden åtgärd (se [den här artikeln] (https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/) för detaljerad förklaring). Vi vill dock köra utvärderingen asynkront i vissa användningsfall, t.ex. avlastning för svarstider, vi visar i exemplet EvaluationSingleImageAsync()
hur du uppnår det med hjälp av tilläggsmetoden EvaluateAsync()
.
Utvärdera mellanliggande lager
CNTK C#-API:et kan utvärdera ett mellanliggande lager i en modellgraf. Därför kan önskat lager hittas med dess namn och det mellanliggande skiktet kan utvärderas. Exemplet EvaluateIntermediateLayer() i C# visar hur du utvärderar ett mellanliggande lager i en modell.
Utvärdera utdata från flera noder
CNTK kan utvärdera flera noder i ett modelldiagram genom att kombinera deras utdata till en enda nod. Exemplet EvaluateCombinedOutputs() i C# visar hur du utvärderar flera utdata.
C#-exempel
CNTKLibraryCSEvalExamples visar hur du utvärderar en modell i C# med CNTK Library NuGet-paket. Se sidan Eval-exempel för att skapa och köra exempel.
Om du inte vill använda NuGet-paketet kan du lägga till Cntk.Core.Managed-<VERSION>.dll
som referens till projektet. DLL Cntk.Core.Managed
och alla beroende DLL:er finns i CNTK binärt versionspaket på sidan CNTK Versioner. Kontrollera att sökvägen till DLL och dess beroenden (se listan i slutet av den här sidan) ingår i sökvägen för Cntk.Core.Managed
DLL:er för ditt program.
Använda C++
API:et CNTK Library C++ stöder modellutvärdering i C++-program. Både vanliga skrivbordsprogram och Universell Windows-plattform-program stöds. Visual Studio 2017 krävs och målplattformen i projektegenskapen ska vara X64.
NuGet-paketet CNTK CNTK. CPUOnly och CNTK. GPU innehåller C++ CNTK-bibliotek för att använda CNTK i skrivbordsprogram. Installera CNTK om du vill använda CNTK på Universell Windows-plattform. UWP. CPUOnly. Med hjälp av NuGet-paket läggs konfigurationen om inkluderings- och bibliotekskataloger automatiskt till i projektegenskapen. Både Debug och Release build stöds. På sidan NuGet-paket förklaras hur du hämtar och installerar CNTK NuGet-paket.
Programmeringsguide för C++
Följande steg beskriver hur du använder C++ CNTK-biblioteket för modellutvärdering.
Cntk.Core-<VERSION>.lib
Länka importbiblioteket till programmet. Det här steget kan utelämnas om du använder NuGet-paketet. För UWP-programmet ärCnkt.Core_app-<Version>.lib
biblioteksnamnet .- Ta med utvärderingshuvudfilen "CNTKLibrary.h".
- Läs in modellen
CNTK::Function::Load()
med . Det returnerade funktionsobjektet representerar modellens beräkningsdiagram. - Förbereda data för varje indatavariabel. Du kan använda
CNTK::Value::CreateBatch()
,CNTK::Value::CreateSequence()
ellerCNTK::Value::CreateBatchOfSequences()
för att skapa ett Värde-objekt från dina indata som representerar en batch med exempel, en sekvens med exempel eller en batch med sekvenser med exempel. - Begär
CNTK::Function::Evaluate()
utvärdering.Evaluate()
förväntar som indata en unordered_map för indatavariabler och indatavärden, och en unordered_map för utdatavariabler och utdatavärden. Utdatavärdeobjektet kan varanull
vilket innebär att CNTK Library allokerar den faktiska lagringen för det här utdatavärdet. Vid returen innehåller värdeobjekten som är associerade med utdatavariablerna resultatet av utvärderingen. - Hämta utdata från utvärderingsresultat. Använd
CNTK::Value::CopyVariableValueTo()
för att kopiera data som lagras i value-objektet till bufferten som en lista över sekvenser med variabel längd på exempel.
För samtidig utvärdering av flera begäranden CNTK::Function::Clone()
ska anropas före Evaluate(). ParallelEvaluationExample()
visar hur du utvärderar flera begäranden parallellt med CNTK C++-biblioteks-API.
Mer information om C++ CNTK-biblioteks-API för utvärdering finns på sidan CNTK Library C++ Evaluation Interface (Utvärderingsgränssnitt för C++).
C++-exempel
C++-exemplen och CNTKLibraryCPPEvalGPUExamples
illustrerar användningsmönstret CNTKLibraryCPPEvalCPUOnlyExamples
ovan. UWPImageRecognition innehåller ett exempel som använder CNTK UWP-bibliotek för modellutvärdering. Sidan Eval-exempel innehåller detaljerade anvisningar om hur du skapar och kör exempel.
Du kan också använda C++ CNTK-biblioteket utan NuGet-paketet. Du kan antingen hämta Cntk.Core-<VERSION>.lib
(eller Cntk.Core_app-<Version>.lib
) och alla beroende DLL:er från sidan CNTK Versioner eller skapa dem från CNTK källkod. Du måste också konfigurera inkluderings- och bibliotekssökvägen så att den pekar på rätt katalog och se till att byggkonfigurationen (felsökning eller version) av CNTK-biblioteket är samma som för projektinställningen (annars får du oväntade undantag). CNTK-versionspaketet innehåller endast versionsversionen av binärfiler.
Skicka CNTK-bibliotek med ditt Windows-program
CNTK-biblioteket kräver att Visual C++ Redistributable Package för Visual Studio 2017 installeras på det system där programmet ska köras. Och målplattformen i projektegenskapen ska vara X64.
På den här sidan beskrivs hur CNTK binära filer namnges.
För C++-skrivbordsprogram måste följande DLL:er distribueras med ditt program.
Cntk.Core-<VERSION>.dll
Cntk.Math-<VERSION>.dll
libiomp5md.dll
mklml.dll
Om du använder C#/.NET Managed Library, bredvid de DLL:er som nämns ovan, måste du dessutom inkludera följande DLL:er:
Cntk.Core.Managed-<VERSION>.dll
Cntk.Core.CSBinding-<VERSION>.dll
För att använda GPU behöver du förutom att inkludera följande NVIDIA CUDA-relaterade DLL:er:
cublas64_90.dll
cudart64_90.dll
cudnn64_7.dll
curand64_90.dll
cusparse64_90.dll
nvml.dll
Anteckning
Har ändrats i CNTK version 2.1.
CNTK NuGet-paket levereras med cuDNN 6 (cudnn64_6.dll
).
Alla dessa DLL:er finns i CNTK binär version, se sidan CNTK versioner.
För UWP-program måste följande DLL:er distribueras med ditt program. Du hittar dessa DLL-filer i Nuget-paketet CNTK.UWP.CPUOnly
.
Cntk.Core_app-<VERSION>.dll
Cntk.Math_app-<VERSION>.dll
libopenblas.dll
Använda Python
Du kan använda Python för att utvärdera en förtränad modell. Exempel finns här.
Använda Java
CNTK tillhandahåller även API:er för utvärdering av modellen i Java-program. Observera att CNTK Java API fortfarande är experimentellt och kan komma att ändras.
Java-exemplet visar hur du utvärderar en CNN-modell med hjälp av Java-API:et.
Om du vill använda CNTK Java-bibliotek lägger du till filen i cntk.jar
classpath
javaprojektet. Om du arbetar med en IDE bör du lägga till den som en ohanterad jar-fil. Filen cntk.jar finns i CNTK binärt versionspaket (i mappen cntk\cntk\java). Du kan också skapa cntk.jar från CNTK källa. Ange även java.library.path
till katalogen som innehåller Cntk.Core.JavaBinding-<Version>.dll
och se till att katalogen som innehåller CNTK binära DLL:er finns i DLL-sökvägen i systemet, t.ex. genom att lägga till katalogen i PATH-miljövariabeln. Observera att du också måste installera Visual C++ Redistributable Package för Visual Studio 2017. Om du använder UnsatisfiedLinkErrors
Java beror det vanligtvis på att katalogen inte finns i DLL-sökvägen (eller i fel ordning).
Java-biblioteket är för närvarande byggt och testat med 64-bitars Oracle JDK 8.