Evaluación de un modelo en una instancia de Azure WebApi mediante EvalDll
Le guiaremos a los pasos necesarios para implementar un modelo de CNTK en Azure y enviar solicitudes web al punto de conexión de Azure para evaluar los datos con el modelo implementado. Crearemos esta funcionalidad en forma de WebApi, pero nos centraremos en la funcionalidad de Azure más básica. Consulte la documentación de Azure más avanzada para obtener información sobre todas las capacidades avanzadas, es decir, el paso de parámetros, etc.
Requisitos
Como actualmente usamos VS2015 para compilar CNTK, nos centramos en esta versión de Visual Studio.
Característica de desarrollo web para Visual Studio
Debe habilitar las características de Web-Development en Visual Studio. Puede ver si esta característica está habilitada (y habilitarla si es necesario) ejecutando de nuevo el instalador de VS (Control Panel -> Program and Features -> Microsoft Visual Studio 201x
, haga clic con el botón derecho y seleccione Change
para invocar el instalador de VS).
SDK de Azure
El SDK de Azure para .NET debe instalarse en la máquina de desarrollo. La página de descarga para esto es: Descarga del SDK de Azure
Cuenta de Azure
Dado que vamos a hospedar el modelo de CNTK en Azure, necesitará una cuenta de Azure. Si tiene una suscripción a MSDN o Visual Studio, esa cuenta será suficiente para hospedar el modelo para este tutorial. CNTK requiere una máquina virtual de 64 bits para hospedar, una cuenta gratuita de Azure no incluye esta funcionalidad y no será suficiente.
Inicialmente, desarrollaremos WebApi localmente y, a continuación, lo cargaremos en nuestra instancia de Azure. Por lo tanto, podrá seguir la mayoría de los pasos, incluso sin acceso a Azure.
Comencemos
Ya hemos creado un plano técnico de proyecto denominado EvalDll_AzureTutorial. Este proyecto forma parte del repositorio de CNTK GitHub y se puede encontrar en la carpeta Examples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial
.
Tenga en cuenta que el proyecto de ejemplo usa CNTK API de EvalDll. Para los usuarios que usan un modelo entrenado con Python, use CNTK Library API. El tutorial para usar CNTK Library se puede encontrar en Evaluación de un modelo en Azure WebApi mediante CNTK Library Managed API.
Se recomienda empezar desde esta solución, ya que ya hemos agregado todo el código que necesitamos. Para completar esto, se muestra la lista de operaciones para crear el proyecto del tutorial:
Comenzamos creando un nuevo proyecto o solución en VisualStudio desde
File->New->Project->Visual C#->Web->ASP.NET WebApplication
: EvalDll_AzureTutorial. Hemos seleccionado una plantilla de aplicación de API de Azure, hemos agregado referencias a "API web" y hemos asegurado de que se hospeda localmente (NO se hospeda en la nube, pero).A continuación, hemos realizado los siguientes cambios de código para compilar el proyecto del tutorial:
En ValueController.cs agregamos algunas directivas using necesarias
Se ha reemplazado el código de
public async Task<IEnumerable<string>> Get()
para llamar realmente a nuestra función de evaluación de CNTKSe agregó la función
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
. Hemos adoptado esta función de nuestros ejemplos de CNTK Eval (métodoEvaluateImageClassificationModel
del repositorio de CNTK en el archivoExamples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs
).Se ha agregado el archivo
CNTKImageProcessing.cs
para agregar una funcionalidad de cambio de tamaño de mapa de bits. Esto se origina en el repositorio de CNTK enExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
el espacio de nombres y el nombre de clase.El directorio de los archivos binarios creados en nuestra solución debe agregarse al
PATH
entorno de la aplicación. Esto es necesario, ya que nuestro proyecto incluye archivos DLL nativos y solo se cargan si son accesibles en la ruta de acceso de búsqueda estándar. Hemos agregado el código siguiente en elApplication_Start()
método englobal.asax
:string pathValue = Environment.GetEnvironmentVariable("PATH"); string domainBaseDir = AppDomain.CurrentDomain.BaseDirectory; string cntkPath = domainBaseDir + @"bin\"; pathValue += ";" + cntkPath; Environment.SetEnvironmentVariable("PATH", pathValue);
Hospedaje local de WebApi
Estos son los cambios realizados hasta ahora. Todavía es necesario obtener la funcionalidad de CNTK Eval incluida en el proyecto y necesitamos un modelo para evaluarlo.
Agregue la funcionalidad CNTK Eval al proyecto. Esto está disponible como un paquete de NuGet. En VS, seleccione Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...
, elija nuget.org
como origen en línea, busque CNTK
e instale la versión más reciente del paquete (Microsoft.Research.CNTK.*
).
Ahora necesitamos un modelo para evaluarlo. Descargue el ResNet_18.model y guárdelo en el directorio CNTK\Models
de la solución. El archivo de modelo también debe incluirse en la solución (Project -> Add existing Item
)
CNTK requiere un entorno en tiempo de ejecución de 64 bits. Asegúrese de que en el Configuration Manager que el proyecto está compilado para la plataforma x64. Además, webApi que estamos creando debe hospedarse en una instancia de 64 bits de IIS. Para aplicar esto, seleccione "Usar la versión de 64 bits de IIS Express para sitios web y proyectos" enTools -> Options -> Project and Solutions -> WebProjects
En este momento, ha realizado todos los pasos necesarios para ejecutar el modelo localmente en la máquina. En Visual Studio presione F5
para ejecutar el proyecto. Se abrirá un explorador de Internet en el sitio web predeterminado y se mostrará un mensaje de error. Esto es para esperarse, ya que hemos creado una WebApi y no un sitio web. Llamamos fácilmente a WebApi implementado cambiando la dirección del explorador a:
http://localhost:<portnumber>/api/values
Esto llamará al Get()
método en el ValuesController-Class que, a su vez, llamará al método EvaluateCustomDNN()
y devolverá un resultado al explorador web.
Hospedaje de WebApi en Azure
Con esto logramos la primera parte de nuestra misión, ahora necesitamos esta funcionalidad hospedada en Azure.
En el menú Compilar del proyecto, seleccione el Publish
comando . Elegir Microsoft Azure App Service
como destino de publicación
En el cuadro de diálogo AppService, debe iniciar sesión con su cuenta y seleccionar la suscripción y el grupo de recursos adecuados. Asegúrese de elegir un grupo de recursos que admita máquinas virtuales de 64 bits (el grupo de recursos "gratis" no es suficiente para esto). Durante los pasos de publicación finales, debe elegir una configuración x64 en el menú Configuración. Esto también es necesario para publicar los componentes binarios nativos de CNTK en Azure.
Una vez que publique el modelo y llame a su WebApi publicada en el explorador, verá un mensaje de error. Abra el Azure Portal y asegúrese de que WebApi se ejecuta en una plataforma de 64 bits (cambie y guarde la configuración si es necesario, también reiniciará la instancia de máquina virtual en Azure).
Una vez realizados estos cambios, podrá llamar a WebApi en . http://<yourwebapp>.azurewebsites.net/api/values
En este proyecto se ha mostrado cómo integrar la funcionalidad de CNTK Eval mediante EvalDll en una instancia de Azure WebApi y cómo configurar Azure para ejecutar los archivos binarios de CNTK eval. En un paso siguiente, ahora puede agregar nuevas API para proporcionar datos de forma dinámica a la función eval o cargar una nueva versión del modelo. Estas son tareas de desarrollo de WebApi/Azure y debe consultar la documentación de Azure para ello.