Compartilhar via


Avaliar um modelo em uma WebApi do Azure usando a API Gerenciada da Biblioteca CNTK

Implantar por meio da linha de comando do Azure Machine Learning

Uma maneira de implantar um modelo CNTK no Azure e ser capaz de executar o modelo implantado por meio de APIs Web é por meio de uma interface de linha de comando para o Azure Machine Learning. Clique aqui para saber como.

Implantar por meio de ASP.NET

Levaremos você às etapas necessárias para implantar um modelo CNTK no Azure e enviar solicitações da Web para o ponto de extremidade do Azure para avaliar os dados em relação ao modelo implantado. Criaremos essa funcionalidade na forma de um WebApi, mas nos concentraremos na funcionalidade mais básica do Azure. Consulte a documentação mais avançada do Azure para saber mais sobre todas as habilidades avançadas, ou seja, o parâmetro que passa etc.

Requisitos

Como estamos usando o VS2017 no momento para criar o CNTK, nos concentramos nesta versão do Visual Studio.

Recurso de desenvolvimento da Web para Visual Studio

Você precisa habilitar Web-Development recursos no Visual Studio. Você pode ver se esse recurso está habilitado (e habilitado, se necessário) executando o instalador do VS novamente (Control Panel -> Program and Features -> Microsoft Visual Studio 201xclique com o botão direito do mouse e selecione Change para invocar o instalador vs)

SDK do Azure

O SDK do Azure para .NET precisa ser instalado em seu computador de desenvolvimento. A página de download para isso é: Download do SDK do Azure

Conta do Azure

Como vamos hospedar o modelo CNTK no Azure, você precisará de uma conta do Azure. Se você tiver uma assinatura do MSDN ou do Visual Studio, essa conta será suficiente para hospedar seu modelo para este tutorial. O CNTK requer uma máquina virtual de 64 bits para hospedar, uma conta gratuita do Azure não inclui essa funcionalidade e não será suficiente.

Inicialmente, desenvolveremos o WebApi localmente e, em seguida, carregaremos isso em nossa instância do Azure. Portanto, você poderá seguir a maioria das etapas mesmo sem acesso ao Azure.

Vamos começar

Já criamos um blueprint de projeto chamado CNTKAzureTutorial01. Esse projeto faz parte do repositório do GitHub do CNTK e pode ser encontrado na pasta Examples\Evaluation\CNTKAzureTutorial01.

Observe que o projeto de exemplo está usando a API Gerenciada da Biblioteca CNTK. Para os usuários que usam a API EvalDll, para avaliar o modelo, use a API EvalDLL do CNTK. O tutorial para usar o EvalDll pode ser encontrado em Avaliar um modelo no Azure WebApi usando EvalDll

Recomendamos que você comece com essa solução, já que já adicionamos todo o código de que precisamos. Para concluir aqui está a lista de operações para criar o projeto do tutorial:

  • Começamos criando um novo projeto/solução no VisualStudio de File->New->Project->Visual C#->Web->ASP.NET WebApplication: CNTKAzureTutorial01. Escolhemos um modelo de Aplicativo de API do Azure, adicionamos referências à 'API Web' e garantimos que ele está hospedado localmente (NÃO hospedado na nuvem – ainda).

  • Em seguida, executamos as seguintes alterações de código para criar o projeto do tutorial:

    • No ValueController.cs, adicionamos algumas necessárias usando diretivas

    • Substituiu o código public async Task<IEnumerable<string>> Get() para realmente chamar nossa função de avaliação CNTK

    • Adicionada a função public async Task<string[]> EvaluateCustomDNN(string imageUrl). Adotamos essa função de nossos exemplos do CNTK Eval (método EvaluateImageClassificationModel do repositório CNTK no arquivo Examples\Evaluation\CSEvalClient\Program.cs)

    • Adicionado o arquivo CNTKImageProcessing.cs para adicionar uma funcionalidade de redimensionamento de Bitmap. Isso é proveniente do repositório CNTK no namespace e no Examples\Evaluation\ImageExtension\CNTKImageProcessing.cs nome da classe

    • O diretório dos binários criados em nossa solução precisa ser adicionado ao PATH ambiente do aplicativo. Isso é necessário, pois nosso projeto inclui DLLs nativas e elas só serão carregadas se forem acessíveis no caminho de pesquisa padrão. Adicionamos 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);
      

Hospedando o WebApi localmente

Essas são as alterações que executamos até agora. Ainda precisamos obter a funcionalidade CNTK Eval incluída no projeto e precisamos de um modelo para avaliar.

Adicione a funcionalidade CNTK Eval ao projeto. Isso está disponível como um pacote NuGet. No VS, selecione Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution...nuget.org como a origem online, pesquise CNTK e instale a versão mais recente do pacote (CNTK.GPU ou CNTK.CPUOnly) no projeto.

NuGet

Agora precisamos de um modelo para avaliar. Baixe o ResNet20_CIFAR10_CNTK.model e salve-o no diretório CNTK\Models na pasta do projeto. O arquivo de modelo também precisa ser incluído na solução (Project -> Add existing Item)

O CNTK requer um ambiente de runtime de 64 bits. Verifique se no Configuration Manager que o projeto foi compilado para a plataforma x64. Além disso, o WebApi que estamos criando deve ser hospedado em uma instância de 64 bits do IIS. Você pode impor isso selecionando "Usar a versão de 64 bits do IIS Express para sites e projetos" emTools -> Options -> Project and Solutions -> WebProjects

Project

Neste ponto, você executou todas as etapas necessárias para executar o modelo localmente em seu computador. No Visual Studio, pressione F5 para executar o projeto. Isso abrirá um navegador da Internet no site padrão e exibirá uma mensagem de erro. Isso é esperado, pois criamos um WebApi e não um site. Chamamos facilmente o WebApi implementado alterando o endereço no navegador para:

http://localhost:<portnumber>/api/values

Isso chamará o Get() método no ValuesController-Class que, por sua vez, chamará o método EvaluateCustomDNN() e retornará um resultado ao navegador da Web

Local

Hospedar o WebApi no Azure

Com isso, realizamos a primeira parte de nossa missão, agora precisamos dessa funcionalidade hospedada no Azure! No menu Compilar do projeto, selecione o Publish comando. Escolher Microsoft Azure App Service como o destino de publicação

Azure

Na caixa de diálogo AppService, você precisa fazer logon com sua conta e selecionar a assinatura e o grupo de recursos apropriados. Escolha um grupo de recursos que dê suporte a máquinas virtuais de 64 bits (o grupo de recursos 'gratuito' não é suficiente para isso). Durante as etapas finais de publicação, você precisa escolher uma configuração x64 no menu Configuração. Isso também é necessário para publicar os componentes binários nativos do CNTK no Azure

AzureSettings

Depois de publicar seu modelo e chamar seu WebApi publicado no navegador, você verá uma mensagem de erro. Abra o portal do Azure e verifique se o WebApi está em execução em uma plataforma de 64 bits (altere e 'salve' a configuração, se necessário, isso também reiniciará sua instância de máquina virtual no Azure).

Azure64Settings

Depois de executar essas alterações, você poderá chamá-lo de WebApi em http://<yourwebapp>.azurewebsites.net/api/values

AzureSettings

Este projeto mostrou como integrar a funcionalidade CNTK Eval usando a API Gerenciada da Biblioteca CNTK em uma WebApi do Azure e configurar o Azure para executar os binários de eval do CNTK. Em uma próxima etapa, agora você pode adicionar novas APIs para fornecer dados dinamicamente à eval-function ou carregar a nova versão do modelo. Essas são tarefas de desenvolvimento do WebApi/Azure e você deve consultar a documentação do Azure para isso.