Avaliar um modelo em um WebApi do Azure usando EvalDll
Levaremos você às etapas necessárias para implantar um modelo de 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 VS2015 para criar 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 201x
clique 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 de CNTK no Azure, você precisará de uma conta do Azure. Se você tiver uma assinatura msdn ou Visual Studio, essa conta será suficiente para hospedar seu modelo para este tutorial. 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 EvalDll_AzureTutorial. Esse projeto faz parte do repositório CNTK GitHub e pode ser encontrado na pastaExamples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial
.
Observe que o projeto de exemplo está usando CNTK API EvalDll. Para usuários que usam um modelo treinado com Python, use CNTK API da Biblioteca. O tutorial para usar CNTK Library pode ser encontrado em Avaliar um modelo no Azure WebApi usando CNTK API Gerenciada da Biblioteca
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
: EvalDll_AzureTutorial. 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 CNTKAdicionada a função
public async Task<string[]> EvaluateCustomDNN(string imageUrl)
. Adotamos essa função de nossos exemplos de Eval CNTK (métodoEvaluateImageClassificationModel
do repositório CNTK no arquivoExamples\Evaluation\LegacyEvalDll\CSEvalClient\Program.cs
)Adicionado o arquivo
CNTKImageProcessing.cs
para adicionar uma funcionalidade de redimensionamento de Bitmap. Isso é proveniente do repositório de CNTK no namespace e noExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
nome da classeO 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 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);
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 de 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 (Microsoft.Research.CNTK.*
).
Agora precisamos de um modelo para avaliar. Baixe o ResNet_18.model e salve-o no diretório CNTK\Models
na solução. O arquivo de modelo também precisa ser incluído na solução (Project -> Add existing Item
)
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
Neste ponto, você executou todas as etapas necessárias para executar o modelo localmente em seu computador. Em 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
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
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 de CNTK no Azure
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).
Depois de executar essas alterações, você poderá chamá-lo de WebApi em http://<yourwebapp>.azurewebsites.net/api/values
Este projeto mostrou como integrar a funcionalidade CNTK Eval usando o EvalDll em uma WebApi do Azure e configurar o Azure para executar os binários de CNTK eval. 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.