Evaluación de un modelo en una instancia de Azure WebApi mediante la API administrada de la biblioteca CNTK
Implementación mediante la línea de comandos de Azure Machine Learning
Una manera de implementar un modelo de CNTK en Azure y poder ejecutar el modelo implementado a través de las API web es a través de una interfaz de línea de comandos en Azure Machine Learning. Haga clic aquí para obtener información sobre cómo hacerlo.
Implementación mediante ASP.NET
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 respecto al 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 VS2017 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
Puesto 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 CNTKAzureTutorial01. Este proyecto forma parte del repositorio de GitHub de CNTK y se puede encontrar en la carpeta Examples\Evaluation\CNTKAzureTutorial01
.
Tenga en cuenta que el proyecto de ejemplo usa la API administrada de la biblioteca CNTK. Para los usuarios que usan la API de EvalDll, para evaluar el modelo, use la API de CNTK EvalDLL. El tutorial para usar EvalDll se puede encontrar en Evaluación de un modelo en Azure WebApi mediante EvalDll.
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
: CNTKAzureTutorial01. 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 CNTK.Se 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\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. Está disponible como un paquete 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 (CNTK.GPU
o CNTK.CPUOnly
) en el proyecto.
Ahora necesitamos un modelo para evaluarlo. Descargue el ResNet20_CIFAR10_CNTK.model y guárdelo en el directorio CNTK\Models
en la carpeta del proyecto. 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 la API administrada de la biblioteca CNTK en una instancia de Azure WebApi y cómo configurar Azure para ejecutar los archivos binarios de valor de CNTK. 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.