Évaluer un modèle dans un WebApi Azure à l’aide d’EvalDll
Nous allons vous guider vers les étapes requises pour déployer un modèle CNTK sur Azure et envoyer des demandes web au point de terminaison Azure pour évaluer les données sur le modèle déployé. Nous allons créer cette fonctionnalité sous forme de WebApi, mais nous nous concentrerons sur les fonctionnalités Azure les plus basiques. Reportez-vous à la documentation Azure plus avancée pour en savoir plus sur toutes les capacités avancées, c’est-à-dire le passage de paramètre, etc.
Configuration requise
Comme nous utilisons actuellement VS2015 pour générer CNTK, nous nous concentrons sur cette version de Visual Studio.
Fonctionnalité de développement web pour Visual Studio
Vous devez activer les fonctionnalités Web-Development dans Visual Studio. Vous pouvez voir si cette fonctionnalité est activée (et activer si nécessaire) en exécutant à nouveau le programme d’installation vs (Control Panel -> Program and Features -> Microsoft Visual Studio 201x
cliquez avec le bouton droit et sélectionnez Change
pour appeler le programme d’installation VS)
Azure SDK
Le Kit de développement logiciel (SDK) Azure pour .NET doit être installé sur votre machine de développement. La page de téléchargement est la suivante : Téléchargement du Kit de développement logiciel (SDK) Azure
Compte Azure.
Étant donné que nous allons héberger le modèle CNTK sur Azure, vous aurez besoin d’un compte Azure. Si vous disposez d’un abonnement MSDN ou Visual Studio, ce compte sera suffisant pour héberger votre modèle pour ce didacticiel. CNTK nécessite une machine virtuelle 64 bits pour héberger, un compte Azure gratuit n’inclut pas cette fonctionnalité et ne suffit pas.
Initialement, nous allons développer WebApi localement, puis le charger dans notre instance Azure. Vous serez donc en mesure de suivre la majorité des étapes, même sans accès à Azure.
Commençons
Nous avons déjà créé un blueprint de projet appelé EvalDll_AzureTutorial. Ce projet fait partie du dépôt CNTK GitHub et se trouve dans le dossier Examples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial
.
Notez que l’exemple de projet utilise CNTK API EvalDll. Pour les utilisateurs qui utilisent un modèle entraîné avec Python, utilisez l’API bibliothèque CNTK. Le tutoriel sur l’utilisation de CNTK bibliothèque se trouve dans Évaluer un modèle dans Azure WebApi à l’aide de l’API gérée par CNTK bibliothèque
Nous vous recommandons de commencer à partir de cette solution, car nous avons déjà ajouté tout le code dont nous avons besoin. Pour obtenir l’intégralité, voici la liste des opérations pour créer le projet de didacticiel :
Nous avons commencé par créer un projet/solution dans VisualStudio à partir de
File->New->Project->Visual C#->Web->ASP.NET WebApplication
: EvalDll_AzureTutorial. Nous avons choisi un modèle d’application API Azure, ajouté des références à l'« API web » et nous avons assuré qu’il est hébergé localement (PAS encore hébergé dans le cloud).Ensuite, nous avons effectué les modifications de code suivantes pour générer le projet de didacticiel :
Dans valueController.cs, nous avons ajouté quelques directives requises à l’aide de directives
Remplacement du code dans
public async Task<IEnumerable<string>> Get()
lequel appeler notre fonction d’évaluation CNTKAjout de la fonction
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
. Nous avons adopté cette fonction à partir de nos exemples CNTK Eval (méthodeEvaluateImageClassificationModel
du référentiel CNTK dans le fichierExamples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs
)Ajout du fichier
CNTKImageProcessing.cs
pour ajouter une fonctionnalité de redimensionnement bitmap. Cela provient du référentiel CNTK dansExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
l’espace de noms et le nom de la classeLe répertoire des fichiers binaires créés dans notre solution doit être ajouté à l’environnement
PATH
de l’application. Cela est nécessaire, car notre projet inclut des DLL natives et ceux-ci sont chargés uniquement s’ils sont accessibles dans le chemin de recherche standard. Nous avons ajouté le code suivant dans laApplication_Start()
méthode dansglobal.asax
:string pathValue = Environment.GetEnvironmentVariable("PATH"); string domainBaseDir = AppDomain.CurrentDomain.BaseDirectory; string cntkPath = domainBaseDir + @"bin\"; pathValue += ";" + cntkPath; Environment.SetEnvironmentVariable("PATH", pathValue);
Hébergement de WebApi localement
Il s’agit des modifications que nous avons effectuées jusqu’à présent. Nous devons toujours obtenir les CNTK fonctionnalités Dval incluses dans le projet et avoir besoin d’un modèle pour évaluer.
Ajoutez la fonctionnalité eval CNTK au projet. Ceci est disponible en tant que package NuGet. Dans VS select Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...
, choisissez nuget.org
comme source en ligne, recherchez CNTK
et installez la dernière version du package (Microsoft.Research.CNTK.*
).
Maintenant, nous avons besoin d’un modèle pour évaluer. Téléchargez le ResNet_18.model et enregistrez-le dans le répertoire CNTK\Models
de la solution. Le fichier modèle doit également être inclus dans la solution (Project -> Add existing Item
)
CNTK nécessite un environnement d’exécution 64 bits. Assurez-vous que dans le Configuration Manager que le projet est compilé pour la plateforme x64. En outre, webApi que nous créons doit être hébergé dans une instance 64 bits d’IIS. Vous pouvez appliquer cela en sélectionnant « Utiliser la version 64 bits de IIS Express pour les sites web et les projets » dansTools -> Options -> Project and Solutions -> WebProjects
À ce stade, vous avez effectué toutes les étapes nécessaires pour exécuter le modèle localement sur votre ordinateur. Dans Visual Studio appuyez sur F5
pour exécuter le projet. Cela ouvre un navigateur Internet sur le site web par défaut et affiche un message d’erreur. Cela doit être attendu depuis que nous avons créé un WebApi et non un site web. Nous appelons facilement webApi implémenté en modifiant l’adresse dans le navigateur en :
http://localhost:<portnumber>/api/values
Cela appelle la Get()
méthode dans le ValuesController-Class qui appelle à son tour la méthode EvaluateCustomDNN()
et retourne un résultat à votre navigateur web
Hébergement de WebApi sur Azure
Avec cela, nous avons accompli la première partie de notre mission, maintenant nous avons besoin de cette fonctionnalité hébergée dans Azure!
Dans le menu Build de votre projet, sélectionnez la Publish
commande. Choisir Microsoft Azure App Service
comme cible de publication
Dans la boîte de dialogue AppService, vous devez vous connecter avec votre compte et sélectionner l’abonnement et le groupe de ressources appropriés. Veillez à choisir un groupe de ressources qui prend en charge les machines virtuelles 64 bits (le groupe de ressources « gratuit » n’est pas suffisant pour cela). Au cours des étapes de publication finales, vous devez choisir une configuration x64 dans le menu Paramètre. Il est nécessaire de publier également les composants binaires natifs de CNTK sur Azure
Une fois que vous avez publié votre modèle et que vous appelez votre WebApi publié dans le navigateur, vous verrez un message d’erreur. Ouvrez le Portail Azure et assurez-vous que votre WebApi est en cours d’exécution sur une plateforme 64 bits (modifier et « enregistrer » le paramètre si nécessaire, cela redémarre également votre instance de machine virtuelle dans Azure).
Une fois que vous avez effectué ces modifications, vous serez en mesure d’appeler WebApi sous http://<yourwebapp>.azurewebsites.net/api/values
Ce projet vous a montré comment intégrer les fonctionnalités eval CNTK à l’aide d’EvalDll dans un WebApi Azure et configurer Azure pour exécuter les fichiers binaires eval CNTK. Dans une étape suivante, vous pouvez maintenant ajouter de nouvelles API pour fournir dynamiquement des données à la fonction eval ou charger la nouvelle version du modèle. Il s’agit de tâches de développement WebApi/Azure, et vous devez consulter la documentation Azure pour cela.