Ocena modelu w usłudze Azure WebApi przy użyciu rozwiązania EvalDll
Przeprowadzimy Cię przez kroki wymagane do wdrożenia modelu CNTK na platformie Azure i wysyłania żądań internetowych do punktu końcowego platformy Azure w celu oceny danych względem wdrożonego modelu. Skompilujemy tę funkcję w postaci interfejsu WebApi, ale skoncentrujemy się na najbardziej podstawowych funkcjach platformy Azure. Zapoznaj się z bardziej zaawansowaną dokumentacją platformy Azure, aby dowiedzieć się więcej na temat wszystkich zaawansowanych możliwości, np. przekazywania parametrów itp.
Wymagania
Obecnie używamy programu VS2015 do kompilowania CNTK, skupiamy się na tej wersji Visual Studio.
Funkcja tworzenia aplikacji internetowych dla Visual Studio
Należy włączyć funkcje Web-Development w Visual Studio. Możesz sprawdzić, czy ta funkcja jest włączona (i włączana w razie potrzeby), ponownie wykonując instalator programu VS (Control Panel -> Program and Features -> Microsoft Visual Studio 201x
kliknij prawym przyciskiem myszy i wybierz polecenie Change
, aby wywołać instalatora programu VS)
Zestaw Azure SDK
Zestaw Azure SDK dla platformy .NET musi być zainstalowany na komputerze deweloperskim. Strona pobierania dla tego pliku to: Pobieranie zestawu Azure SDK
Konto platformy Azure
Ponieważ będziemy hostować model CNTK na platformie Azure, potrzebne będzie konto platformy Azure. Jeśli masz subskrypcję MSDN lub Visual Studio, to konto będzie wystarczające do hostowania modelu na potrzeby tego samouczka. CNTK wymaga 64-bitowej maszyny wirtualnej do hostowania, bezpłatne konto platformy Azure nie obejmuje tej możliwości i nie będzie wystarczające.
Początkowo utworzymy interfejs WebApi lokalnie, a następnie przekażemy go do naszego wystąpienia platformy Azure. W związku z tym będziesz mieć możliwość wykonania większości kroków nawet bez dostępu do platformy Azure.
Zaczynajmy
Utworzyliśmy już strategię projektu o nazwie EvalDll_AzureTutorial. Ten projekt jest częścią repozytorium CNTK GitHub i można go znaleźć w folderze Examples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial
.
Należy pamiętać, że przykładowy projekt korzysta z interfejsu API CNTK EvalDll. W przypadku użytkowników korzystających z modelu wytrenowanego za pomocą języka Python użyj interfejsu API biblioteki CNTK. Samouczek dotyczący używania biblioteki CNTK można znaleźć w artykule Evaluate a model in Azure WebApi using CNTK Library Managed API (Ocena modelu w usłudze Azure WebApi przy użyciu interfejsu API zarządzanego biblioteki CNTK)
Zalecamy rozpoczęcie od tego rozwiązania, ponieważ dodaliśmy już cały potrzebny kod. Aby uzyskać kompletność, poniżej znajduje się lista operacji tworzenia projektu samouczka:
Zaczęliśmy od utworzenia nowego projektu/rozwiązania w programie VisualStudio z witryny
File->New->Project->Visual C#->Web->ASP.NET WebApplication
: EvalDll_AzureTutorial. Wybraliśmy szablon aplikacji interfejsu API platformy Azure, dodaliśmy odwołania do interfejsu API sieci Web i upewniliśmy się, że jest on hostowany lokalnie (jeszcze nie jest hostowany w chmurze).Następnie przeprowadziliśmy następujące zmiany kodu w celu skompilowania projektu samouczka:
W pliku ValueController.cs dodaliśmy kilka wymaganych dyrektyw using
Zamieniono kod w
public async Task<IEnumerable<string>> Get()
, aby faktycznie wywołać naszą funkcję oceny CNTKDodano funkcję
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
. Przyjęliśmy tę funkcję z naszych przykładów CNTK Eval (metodaEvaluateImageClassificationModel
z repozytorium CNTK w plikuExamples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs
)Dodano plik
CNTKImageProcessing.cs
w celu dodania funkcji zmiany rozmiaru mapy bitowej. Pochodzi to z repozytorium CNTK doExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
przestrzeni nazw i nazwy klasyKatalog utworzonych plików binarnych w naszym rozwiązaniu musi być dodawany do
PATH
środowiska aplikacji. Jest to wymagane, ponieważ nasz projekt zawiera natywne biblioteki DLL i są ładowane tylko wtedy, gdy są osiągalne w standardowej ścieżce wyszukiwania. Dodaliśmy następujący kod w metodzie wglobal.asax
plikuApplication_Start()
:string pathValue = Environment.GetEnvironmentVariable("PATH"); string domainBaseDir = AppDomain.CurrentDomain.BaseDirectory; string cntkPath = domainBaseDir + @"bin\"; pathValue += ";" + cntkPath; Environment.SetEnvironmentVariable("PATH", pathValue);
Hostowanie interfejsu WebApi lokalnie
Są to zmiany, które wykonaliśmy do tej pory. Nadal musimy uzyskać funkcje CNTK Eval zawarte w projekcie i potrzebować modelu do oceny.
Dodaj do projektu funkcję CNTK Eval. Jest to dostępne jako pakiet NuGet. W programie VS wybierz pozycję Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...
, wybierz nuget.org
źródło online, wyszukaj CNTK
i zainstaluj najnowszą wersję pakietu (Microsoft.Research.CNTK.*
).
Teraz potrzebujemy modelu do oceny. Pobierz plik ResNet_18.model i zapisz go w katalogu CNTK\Models
w rozwiązaniu. Plik modelu musi być również uwzględniony w rozwiązaniu (Project -> Add existing Item
)
CNTK wymaga 64-bitowego środowiska uruchomieniowego. Upewnij się, że w Configuration Manager projekt jest kompilowany dla platformy x64. Ponadto tworzony interfejs WebApi musi być hostowany w 64-bitowym wystąpieniu usług IIS. Możesz to wymusić, wybierając pozycję "Użyj 64-bitowej wersji IIS Express dla witryn internetowych i projektów" w obszarzeTools -> Options -> Project and Solutions -> WebProjects
Na tym etapie wykonano wszystkie kroki niezbędne do wykonania modelu lokalnie na maszynie. W Visual Studio naciśnij klawisz F5
, aby uruchomić projekt. Spowoduje to otwarcie przeglądarki internetowej w domyślnej witrynie internetowej i wyświetlenie komunikatu o błędzie. Należy się tego spodziewać, ponieważ utworzyliśmy interfejs WebApi, a nie witrynę internetową. Łatwo wywołujemy zaimplementowany interfejs WebApi, zmieniając adres w przeglądarce na:
http://localhost:<portnumber>/api/values
Spowoduje to wywołanie Get()
metody w ValuesController-Class, która z kolei wywoła metodę EvaluateCustomDNN()
i zwróci wynik do przeglądarki internetowej
Hostowanie interfejsu WebApi na platformie Azure
Dzięki temu wykonaliśmy pierwszą część naszej misji, teraz potrzebujemy tej funkcji hostowanej na platformie Azure.
W menu Kompilacja projektu wybierz Publish
polecenie . Wybierz Microsoft Azure App Service
jako element docelowy publikowania
W oknie dialogowym AppService musisz zalogować się przy użyciu konta i wybrać odpowiednią subskrypcję i grupę zasobów. Pamiętaj, aby wybrać grupę zasobów, która obsługuje 64-bitowe maszyny wirtualne (grupa zasobów "bezpłatna" nie jest wystarczająca w tym celu). Podczas końcowych kroków publikowania należy wybrać konfigurację x64 w menu Ustawienie. Jest to również wymagane do opublikowania natywnych składników binarnych CNTK na platformie Azure
Po opublikowaniu modelu i wywołaniu opublikowanego interfejsu WebApi w przeglądarce zostanie wyświetlony komunikat o błędzie. Otwórz Azure Portal i upewnij się, że interfejs WebApi jest uruchomiony na platformie 64-bitowej (zmień ustawienie i zapisz je w razie potrzeby, spowoduje to również ponowne uruchomienie wystąpienia maszyny wirtualnej na platformie Azure).
Po wykonaniu tych zmian będzie można wywołać interfejs WebApi w obszarze http://<yourwebapp>.azurewebsites.net/api/values
W tym projekcie pokazano, jak zintegrować funkcję CNTK Eval przy użyciu narzędzia EvalDll w usłudze Azure WebApi i skonfigurować platformę Azure do uruchamiania plików binarnych oceny CNTK. W następnym kroku możesz teraz dodać nowe interfejsy API, aby dynamicznie dostarczać dane do funkcji oceny lub przekazywać nową wersję modelu. Są to zadania programistyczne WebApi/Azure. W tym celu należy zapoznać się z dokumentacją platformy Azure.