Оценка модели в Azure WebApi с помощью EvalDll
Мы рассмотрим необходимые шаги по развертыванию модели CNTK в Azure и отправке веб-запросов в конечную точку Azure для оценки данных по развернутой модели. Мы создадим эту функциональность в виде WebApi, но сосредоточимся на наиболее основных функциях Azure. Дополнительные сведения о расширенных возможностях см. в документации По Azure, т. е. передаче параметров и т. д.
Требования
Так как в настоящее время для сборки CNTK используется VS2015, мы сосредоточимся на этой версии Visual Studio.
Функция веб-разработки для Visual Studio
Необходимо включить функции Web-Development в Visual Studio. Вы можете узнать, включена ли эта функция (и включена при необходимости), повторно выполнив установщик VS (Control Panel -> Program and Features -> Microsoft Visual Studio 201x
щелкните правой кнопкой мыши и выберите Change
, чтобы вызвать установщик VS)
Пакет Azure SDK
Пакет AZURE SDK для .NET необходимо установить на компьютере разработки. Страница загрузки: скачивание пакета AZURE SDK
Учетная запись Azure
Так как мы будем размещать модель CNTK в Azure, вам потребуется учетная запись Azure. Если у вас есть подписка MSDN или Visual Studio, эта учетная запись будет достаточной для размещения модели для работы с этим руководством. CNTK требуется 64-разрядная виртуальная машина для размещения, бесплатная учетная запись Azure не включает эту возможность и не будет достаточной.
Изначально мы будем разрабатывать WebApi локально, а затем передать его в наш экземпляр Azure. Таким образом, вы сможете выполнять большинство шагов даже без доступа к Azure.
Приступим к работе
Мы уже создали схему проекта с именем EvalDll_AzureTutorial. Этот проект является частью репозитория CNTK GitHub и находится в папкеExamples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial
.
Обратите внимание, что пример проекта использует CNTK API EvalDll. Для пользователей, использующих модель, обученную с помощью Python, используйте API библиотеки CNTK. Руководство по использованию библиотеки CNTK можно найти на странице оценки модели в Azure WebApi с помощью управляемого API библиотеки CNTK
Мы рекомендуем начать с этого решения, так как мы уже добавили весь необходимый код. Полный список операций по созданию учебного проекта:
Мы начали с создания нового проекта или решения в VisualStudio из
File->New->Project->Visual C#->Web->ASP.NET WebApplication
: EvalDll_AzureTutorial. Мы выбрали шаблон приложения API Azure, добавили ссылки на веб-API и убедились, что он размещен локально (пока не размещен в облаке).Затем мы выполнили следующие изменения кода для создания учебного проекта:
В файле ValueController.cs мы добавили несколько обязательных директив using
Заменен код
public async Task<IEnumerable<string>> Get()
, чтобы фактически вызвать функцию оценки CNTKДобавлена функция
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
. Мы внедрили эту функцию из примеров CNTK Eval (методEvaluateImageClassificationModel
из репозитория CNTK в файлеExamples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs
)Добавлен файл
CNTKImageProcessing.cs
для добавления функциональных возможностей изменения размера растрового изображения. Это происходит из репозитория CNTK вExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
пространстве имен и имени класса.Каталог созданных двоичных файлов в нашем решении должен быть добавлен в
PATH
среду приложения. Это необходимо, так как наш проект включает собственные библиотеки DLL, и они загружаются только в том случае, если они доступны в стандартном пути поиска. В метод добавлен следующий кодApplication_Start()
:global.asax
string pathValue = Environment.GetEnvironmentVariable("PATH"); string domainBaseDir = AppDomain.CurrentDomain.BaseDirectory; string cntkPath = domainBaseDir + @"bin\"; pathValue += ";" + cntkPath; Environment.SetEnvironmentVariable("PATH", pathValue);
Локальное размещение WebApi
Это изменения, которые мы выполнили до сих пор. Нам по-прежнему нужно получить CNTK функциональность Eval, включенную в проект, и требуется модель для оценки.
Добавьте в проект функциональность CNTK Eval. Это доступно в виде пакета NuGet. В VS select Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...
выберите nuget.org
в качестве источника в Интернете, найдите CNTK
и установите последнюю версию пакета (Microsoft.Research.CNTK.*
).
Теперь нам нужна модель для оценки. Скачайте ResNet_18.model и сохраните его в каталоге CNTK\Models
в решении. Файл модели также должен быть включен в решение (Project -> Add existing Item
)
CNTK требуется 64-разрядная среда выполнения. Убедитесь, что в Configuration Manager проект компилируется для платформы x64. Кроме того, создаваемое приложение WebApi должно размещаться в 64-разрядном экземпляре IIS. Это можно применить, выбрав "Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов" в разделе "Использовать 64-разрядную версию IIS Express"Tools -> Options -> Project and Solutions -> WebProjects
На этом этапе вы выполнили все необходимые действия для локального выполнения модели на компьютере. В Visual Studio нажмите, F5
чтобы запустить проект. Откроется веб-браузер на веб-сайте по умолчанию и отобразится сообщение об ошибке. Это должно быть ожидаемо, так как мы создали WebApi, а не веб-сайт. Мы легко вызываем реализованный WebApi, изменив адрес в браузере следующим образом:
http://localhost:<portnumber>/api/values
Это вызовет Get()
метод в ValuesController-Class, который, в свою очередь, вызовет метод EvaluateCustomDNN()
и вернет результат в веб-браузер.
Размещение WebApi в Azure
Благодаря этому мы выполнили первую часть нашей миссии, теперь нам нужна эта функция, размещенная в Azure!
В меню "Сборка" проекта выберите Publish
команду. Выбор Microsoft Azure App Service
в качестве целевого объекта публикации
В диалоговом окне AppService необходимо войти в учетную запись и выбрать соответствующую подписку и группу ресурсов. Не забудьте выбрать группу ресурсов, которая поддерживает 64-разрядные виртуальные машины (для этого не хватает бесплатной группы ресурсов). На заключительных этапах публикации необходимо выбрать конфигурацию x64 в меню "Параметры". Это также необходимо для публикации собственных двоичных компонентов CNTK в Azure.
После публикации модели и вызова опубликованного WebApi в браузере появится сообщение об ошибке. Откройте портал Azure и убедитесь, что webApi работает на 64-разрядной платформе (при необходимости измените и сохраните параметр, при необходимости перезагрузит экземпляр виртуальной машины в Azure).
После выполнения этих изменений вы сможете вызвать webApi в разделе http://<yourwebapp>.azurewebsites.net/api/values
В этом проекте показано, как интегрировать функции CNTK Eval с помощью EvalDll в Azure WebApi и настроить Azure для запуска двоичных файлов CNTK eval. На следующем шаге можно добавить новые API для динамического предоставления данных в функцию eval-function или отправки новой версии модели. Это задачи разработки WebApi и Azure, которые необходимо найти в документации по Azure.