Partilhar via


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 201xclique à 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 CNTK

    • Acrescentou a função public async Task<string[]> EvaluateCustomDNN(string imageUrl). Adotámos esta função a partir das nossas amostras CNTK Eval (método EvaluateImageClassificationModel do repositório CNTK no ficheiro Examples\Evaluation\CSEvalClient\Program.cs)

    • Adicionei o ficheiro CNTKImageProcessing.cs para adicionar uma funcionalidade de redimensione Bitmap. Isto é originário do repositório CNTK em Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs espaço de nome e nome

    • O 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 no Application_Start() método em global.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.

NuGet

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

Project

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

local

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

Azure

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

AzureSettings

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).

Azure64Settings

Assim que tiver realizado estas alterações, poderá chamá-lo de WebApi em http://<yourwebapp>.azurewebsites.net/api/values

AzureSettings

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.