Avalie um modelo num Azure WebApi utilizando a API gerida pela Biblioteca CNTK
Implementar através da Linha de Comando de Aprendizagem de Máquinas de Azure
Uma forma de implementar um modelo CNTK no Azure e ser capaz de executar o modelo implantado através de APIs web é através de uma interface de linha de comando para Azure Machine Learning. Clique aqui para saber como.
Desdobre-se através de ASP.NET
Iremos acompanhá-lo aos passos necessários para implementar um modelo CNTK no Azure e enviar pedidos web para o ponto final do Azure para avaliar dados contra o modelo implementado. Vamos construir esta funcionalidade sob a forma de um WebApi, mas focamo-nos na funcionalidade Azure mais básica. Consulte documentação mais avançada do Azure para saber sobre todas as habilidades avançadas, ou seja, passagem de parâmetros, etc.
Requisitos
Como estamos atualmente a usar o VS2017 para construir a CNTK, focamo-nos nesta versão do Visual Studio.
Funcionalidade de desenvolvimento web para estúdio visual
Tem de ativar Web-Development funcionalidades no Visual Studio. Pode ver se esta função está ativada (e ativar se necessário) executando novamente o instalador VS (Control Panel -> Program and Features -> Microsoft Visual Studio 201x
clique à direita e selecione Change
para invocar o instalador VS)
SDK do Azure
O Azure SDK para .NET precisa de ser instalado na sua máquina de desenvolvimento. A página de descarregamento para isto é: Azure SDK Download
Conta do Azure
Uma vez que vamos acolher o modelo CNTK no Azure, vai precisar de uma conta Azure. Se tiver uma subscrição de MSDN ou Visual Studio, essa conta será suficiente para hospedar o seu modelo para este tutorial. A CNTK requer uma máquina virtual de 64 bits para hospedar, uma conta Azure gratuita não inclui esta capacidade e não será suficiente.
Inicialmente, desenvolveremos o WebApi localmente e depois enviaremos isto para o nosso exemplo Azure. Assim, poderá seguir a maioria dos passos mesmo sem acesso ao Azure.
Vamos começar.
Já criámos um projeto chamado CNTKAzureTutorial01. Este projeto faz parte do repositório CNTK GitHub e pode ser encontrado na pasta Examples\Evaluation\CNTKAzureTutorial01
.
Por favor, note que o projeto da amostra está usando API gerido pela Biblioteca CNTK. Para os utilizadores que utilizam a API EvalDll, para avaliar o modelo, utilize a API CNTK EvalDLL. O tutorial para a utilização do EvalDll pode ser encontrado na Avaliação de um modelo em Azure WebApi usando EvalDll
Recomendamos que comece com esta solução, uma vez que já adicionámos todo o código de que necessitamos. Para a completude aqui está a lista de operações para criar o projeto tutorial:
Começamos por criar um novo projeto/solução em VisualStudio a partir de
File->New->Project->Visual C#->Web->ASP.NET WebApplication
: CNTKAzureTutorial01. Escolhemos um modelo de App AZure API, adicionámos referências à 'Web API' e certificamo-nos de que está hospedado localmente (NÃO hospedado na nuvem – ainda).Em seguida, executamos as seguintes alterações de código para construir o projeto tutorial:
No ValueController.cs adicionámos algumas diretivas necessárias
Substituiu o código
public async Task<IEnumerable<string>> Get()
para realmente chamar a nossa função de avaliação CNTKAcrescentou a função
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
. Adotámos esta função a partir das nossas amostras CNTK Eval (métodoEvaluateImageClassificationModel
do repositório CNTK no ficheiroExamples\Evaluation\CSEvalClient\Program.cs
)Adicionei o ficheiro
CNTKImageProcessing.cs
para adicionar uma funcionalidade de redimensione Bitmap. Isto é originário do repositório CNTK emExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
espaço de nome e nomeO diretório dos binários criados na nossa solução precisa de ser adicionado ao
PATH
ambiente da aplicação. Isto é necessário uma vez que o nosso projeto inclui DLLs nativos, e estes só são carregados se estiverem alcançáveis no caminho de pesquisa padrão. Adicionámos o seguinte código noApplication_Start()
método emglobal.asax
:string pathValue = Environment.GetEnvironmentVariable("PATH"); string domainBaseDir = AppDomain.CurrentDomain.BaseDirectory; string cntkPath = domainBaseDir + @"bin\"; pathValue += ";" + cntkPath; Environment.SetEnvironmentVariable("PATH", pathValue);
Hospedar o WebApi localmente
Estas são as mudanças que fizemos até agora. Ainda precisamos de incluir a funcionalidade CNTK Eval no projeto e precisamos de um modelo para avaliar.
Adicione a funcionalidade CNTK Eval ao projeto. Isto está disponível como um pacote NuGet. Em VS selecione Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...
, escolha nuget.org
como fonte on-line, procure CNTK
e instale a versão mais recente do pacote (CNTK.GPU
ou CNTK.CPUOnly
) para o projeto.
Agora precisamos de um modelo para avaliar. Descarregue o ResNet20_CIFAR10_CNTK.model e guarde-o no diretório CNTK\Models
sob a pasta do projeto. O ficheiro do modelo também precisa de ser incluído na solução (Project -> Add existing Item
)
A CNTK requer um ambiente de 64 bits de tempo de execução. Certifique-se de que, no Configuration Manager, o projeto é compilado para a plataforma x64. Além disso, o WebApi que estamos a criar tem de ser hospedado num caso de IIS de 64 bits. Pode impor isto selecionando "Use versão de 64 bits de IIS Express para web sites e projetos" emTools -> Options -> Project and Solutions -> WebProjects
Neste momento, realizou todas as medidas necessárias para executar o modelo localmente na sua máquina. Na imprensa F5
visual studio para dirigir o projeto. Isto abrirá um navegador de Internet no web site padrão e exibirá uma mensagem de erro. Isto é de se esperar uma vez que criámos um WebApi e não um website. Ligamos facilmente para o WebApi implementado alterando o endereço no navegador para:
http://localhost:<portnumber>/api/values
Isto irá chamar o Get()
método no ValuesController-Class que por sua vez ligará para o método EvaluateCustomDNN()
e devolverá um resultado ao seu navegador web
Hospedar o WebApi em Azure
Com isto cumprimos a primeira parte da nossa missão, agora precisamos desta funcionalidade hospedada em Azure!
A partir do menu Construir do seu projeto selecione o Publish
comando. Escolha Microsoft Azure App Service
como alvo de publicação
No diálogo AppService tem de fazer login com a sua conta e selecionar o grupo de subscrição e recursos apropriados. Certifique-se de que escolhe um grupo de recursos que suporta máquinas virtuais de 64 bits (o grupo de recursos 'gratuito' não é suficiente para isso). Durante os passos finais de publicação, tem de escolher uma configuração x64 no menu Definição. Isto é necessário também para publicar os componentes binários nativos da CNTK para Azure
Assim que publicar o seu modelo e ligar para o WebApi publicado no navegador, verá uma mensagem de erro. Abra o portal do Azure e certifique-se de que o seu WebApi está a funcionar numa plataforma de 64 bits (altere e 'guarde' a definição se necessário, isto também reiniciará a sua caixa de máquina virtual em Azure).
Assim que tiver realizado estas alterações, poderá chamá-lo de WebApi em http://<yourwebapp>.azurewebsites.net/api/values
Este projeto mostrou-lhe como integrar a funcionalidade CNTK Eval utilizando a API gerida pela CNTK Library num Azure WebApi e configurar o Azure para executar os binários de eval CNTK. Num próximo passo, pode agora adicionar novas APIs para fornecer dados dinamicamente à função eval ou carregar a versão do novo modelo. Estas são tarefas de desenvolvimento WebApi/Azure, e você deve consultar a documentação do Azure para isso.