Avalie um modelo num Azure WebApi usando evalDll
Iremos acompanhá-lo às medidas necessárias para implementar um CNTK modelo no Azure e enviar pedidos web para o ponto final do Azure para avaliar os dados contra os modelo implantados. 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 VS2015 para construir CNTK, focamo-nos nesta versão do Visual Studio.
Funcionalidade de Desenvolvimento Web para Visual Studio
É necessário ativar Web-Development funcionalidades em 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
Já que vamos receber o CNTK modelo em 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. 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 EvalDll_AzureTutorial. Este projeto faz parte do repositório CNTK GitHub e pode ser encontrado na pastaExamples\Evaluation\LegacyEvalDll\EvalDll_AzureTutorial
.
Por favor, note que o projeto da amostra está usando CNTK API EvalDll. Para os utilizadores que usam um modelo treinado com Python, utilize CNTK API da Biblioteca. O tutorial para o uso da Biblioteca CNTK pode ser encontrado na Avaliação de um modelo em Azure WebApi utilizando a API gerida pela biblioteca CNTK
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çámos por criar um novo projeto/solução no VisualStudio a partir de
File->New->Project->Visual C#->Web->ASP.NET WebApplication
: EvalDll_AzureTutorial. 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\LegacyEvalDll\CSEvalClient\Program.cs
)Adicionei o ficheiro
CNTKImageProcessing.cs
para adicionar uma funcionalidade de redimensione Bitmap. Isto é originário do repositório CNTK paraExamples\Evaluation\ImageExtension\CNTKImageProcessing.cs
o 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 obter a funcionalidade CNTK Eval incluída 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 (Microsoft.Research.CNTK.*
).
Agora precisamos de um modelo para avaliar. Descarregue o ResNet_18.modelo e guarde-o no diretório CNTK\Models
na solução. O ficheiro modelo também precisa de ser incluído na solução (Project -> Add existing Item
)
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, executou todas as medidas necessárias para executar o modelo localmente na sua máquina. Na Visual Studio imprensa F5
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 de CNTK para Azure
Assim que publicar 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 usando evalDll em um Azure WebApi e configurar Azure para executar os binários de CNTK de avaliação. Num próximo passo, pode agora adicionar novas APIs para fornecer dados dinamicamente à função eval ou carregar novos modelo versão. Estas são tarefas de desenvolvimento WebApi/Azure, e você deve consultar a documentação do Azure para isso.