Compartilhar via


Avaliação de modelo em Windows

Atualmente, CNTK fornece bibliotecas em C++, C#/.NET, Python e Java para carregar e avaliar modelos em Windows. A partir da v2.1, CNTK também dá suporte a Plataforma Universal do Windows (UWP).

Usando a API Gerenciada C#/.NET

A Biblioteca de CNTK fornece uma biblioteca gerenciada (.NET) para avaliação de modelos CNTK em CPU e GPU usando C# e outras linguagens .NET. O pacote NuGet CNTK. O CPUOnly foi projetado para execução na CPU e no CNTK. A GPU foi projetada para execução em dispositivos com GPU NVIDIA. Consulte a página NuGet Pacote sobre detalhes sobre como instalar CNTK Pacotes de NuGet biblioteca. Observe que Visual Studio 2017 é necessário e que a plataforma de destino na propriedade do projeto deve ser X64.

A API Gerenciada da Biblioteca de CNTK permite carregar e avaliar modelos pré-treinados em dispositivos especificados (CPU ou GPU). Ele também fornece diferentes maneiras de ajudá-lo a preparar dados de entrada e saída no formato CSC desnso e único e esparso. Os dados de entrada podem ser um único exemplo, um lote de vários exemplos, uma sequência de exemplos ou um lote de sequências com comprimentos variáveis. Uma descrição detalhada sobre o formato de lote e sequência pode ser encontrada na página CNTK Conceitos. Após a avaliação, a API fornece métodos convenientes para obter resultados.

Guia de programação do C#/.NET

As etapas usuais para avaliação de modelo usando CNTK API Gerenciada da Biblioteca incluem:

  1. Instale o pacote de NuGet apropriado (CPU ou GPU, dependendo do uso) para o seu. Os detalhes são descritos no pacote CNTK NuGet.
  2. Carregue o modelo por Function.Load(). O valor retornado é uma Function instância que se refere ao modelo carregado.
  3. Se necessário, obtenha entradas e saídas do modelo carregado chamando as propriedades ArgumentsOutput ou Outputs a instância de Função retornada por Load(). As entradas e saídas são representadas como Variable. Mais informações sobre cada entrada ou saída individual, por exemplo Name , ou Shape podem ser encontradas chamando as propriedades correspondentes da Variável.
  4. Para cada entrada, prepare os dados de entrada para avaliação. Dependendo do uso, os dados de entrada podem consistir em um único exemplo, lote de vários exemplos, uma sequência de exemplos ou um lote de sequências com comprimento variável. Em relação ao armazenamento, os dados de entrada podem estar no formato denso, vetor único ou formato CSC esparso. O Value objeto é usado para representar os dados de entrada com diferentes conteúdos e formatos. A API CNTK fornece métodos diferentes para criar facilmente o objeto Value com base em dados simples do usuário.
    • CreateBatch() cria um objeto Value que contém um lote de amostras simples ou múltiplas.
    • CreateSequence() cria um objeto Value que contém uma sequência com vários exemplos. É possível especificar se essa sequência é uma nova sequência ou continuação de uma sequência anterior no mesmo índice na lista de sequências de uma chamada anterior para este método.
    • CreateBatchOfSequences() cria um objeto Value que contém um lote de sequências. Cada sequência tem um comprimento variável de exemplos. Todos os métodos acima dão suporte ao formato CSC denso e único ou esparso.
  5. Chame o Evaluate() método para executar a avaliação. O parâmetro arguments define variáveis de entrada e seus valores associados e outputs define variáveis de saída. Se o objeto Value de uma variável de saída for null, CNTK Library alocará o armazenamento real para o valor de saída. No retorno, Evaluate() salva os resultados da avaliação nos objetos Value associados às variáveis de saída.
  6. Chame o GetDenseData()/GetOneHotData() método do valor de saída para obter os resultados no formato de dados sem formatação. Ele copia os dados armazenados no objeto Value no buffer como uma lista de sequências com exemplos de comprimento variável, em formato denso ou em formato de vetor único (o suporte para o formato esparso será adicionado em breve).

A API Gerenciada da Biblioteca CNTK é descrita na página de API Gerenciada C#/.NET da Biblioteca CNTK.

Avaliação de várias solicitações em paralelo

CNTK dá suporte à avaliação de várias solicitações em paralelo. Como a execução da avaliação na mesma instância de modelo não é thread-safe, é necessário primeiro criar várias instâncias de modelo chamando Clone() com ParameterCloningMethod.Sharee, em seguida, cada thread usa uma instância de modelo separada para avaliação. O EvaluateMultipleImagesInParallelAsync() demonstra como avaliar solicitações simultâneas usando CNTK API Gerenciada C#/.NET.

Executar a avaliação de forma assíncrona

CNTK API do C# não tem um método assíncrono para Evaluate(), pois a avaliação é uma operação associada à CPU (consulte [este artigo] (https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/) para obter uma explicação detalhada). No entanto, é desejado executar a avaliação de forma assíncrona em alguns casos de uso, por exemplo, descarregamento para capacidade de resposta, mostramos no exemplo EvaluationSingleImageAsync() como fazer isso usando o método EvaluateAsync()de extensão.

Avaliar camadas intermediárias

CNTK API do C# é capaz de avaliar uma camada intermediária em um grafo de modelo. Para esse fim, a camada desejada pode ser encontrada pelo nome e a camada intermediária pode ser avaliada. O exemplo EvaluateIntermediateLayer() em C# demonstra como avaliar uma camada intermediária em um modelo.

Avaliar saídas de vários nós

CNTK pode avaliar vários nós em um grafo de modelo combinando suas saídas em um único nó. O exemplo EvaluateCombinedOutputs() em C# demonstra como avaliar várias saídas.

Exemplos de C#

O CNTKLibraryCSEvalExamples mostra como avaliar um modelo em C# usando CNTK pacotes de NuGet biblioteca. Consulte a página Exemplos de Eval para criar e executar exemplos.

Se você não quiser usar NuGet Pacote, poderá adicionar Cntk.Core.Managed-<VERSION>.dll como referência ao seu projeto. A Cntk.Core.Managed DLL e todas as DLLs dependentes podem ser encontradas no pacote de versão binária CNTK na página CNTK Versões. Verifique se o caminho para a Cntk.Core.Managed DLL e suas dependências (consulte a lista no final desta página) estão incluídos no caminho de pesquisa de DLLs para seu aplicativo.

Usando C++

A API C++ da Biblioteca CNTK dá suporte à avaliação de modelo em aplicativos C++. Há suporte para aplicativos de área de trabalho padrão e aplicativos Plataforma Universal do Windows. Visual Studio 2017 é necessário e a plataforma de destino na propriedade do projeto deve ser X64.

O pacote CNTK NuGet CNTK. CPUOnly e CNTK. A GPU contém a Biblioteca de CNTK C++ para usar CNTK em aplicativos da área de trabalho. Para usar CNTK no Plataforma Universal do Windows, instale CNTK. UWP. CPUOnly. Usando NuGet pacotes, a configuração sobre diretórios de inclusão e biblioteca é adicionada automaticamente à propriedade do projeto. Há suporte para o build de Depuração e Versão. A página pacote NuGet explica como obter e instalar pacotes de CNTK NuGet.

Guia de Programação do C++

As etapas a seguir descrevem como usar a Biblioteca de CNTK do C++ para avaliação de modelo.

  1. Vincule a Cntk.Core-<VERSION>.lib biblioteca de importação ao aplicativo. Essa etapa poderá ser omitida se você usar o pacote NuGet. Para o aplicativo UWP, o nome da biblioteca é Cnkt.Core_app-<Version>.lib.
  2. Inclua o arquivo de cabeçalho de avaliação "CNTKLibrary.h".
  3. Carregue o modelo por CNTK::Function::Load(). O objeto Function retornado representa o grafo de computação do modelo.
  4. Preparar dados para cada variável de entrada. Você pode usar CNTK::Value::CreateBatch()ou CNTK::Value::CreateSequence()CNTK::Value::CreateBatchOfSequences() criar um objeto Value com base nos dados de entrada que representam um lote de amostras, uma sequência de exemplos ou um lote de sequências de exemplos, respectivamente.
  5. Chamada CNTK::Function::Evaluate() para avaliação. A Evaluate() espera como entrada uma unordered_map para variáveis de entrada e valores de entrada e um unordered_map para variáveis de saída e valores de saída. O objeto de valor de saída pode ser null o que significa que CNTK Library aloca o armazenamento real para esse valor de saída. No retorno, os objetos Value associados às variáveis de saída contêm os resultados da avaliação.
  6. Obtenha dados de saída dos resultados da avaliação. Use CNTK::Value::CopyVariableValueTo() para copiar os dados armazenados no objeto Value no buffer como uma lista de sequências com comprimento variável de exemplos.

Para avaliação simultânea de várias solicitações, CNTK::Function::Clone() deve ser chamado antes de Avaliar(). O ParallelEvaluationExample() demonstra como avaliar várias solicitações em paralelo usando CNTK API de Biblioteca C++.

Para obter detalhes sobre a API da Biblioteca de CNTK do C++ para avaliação, consulte a página CNTK Interface de Avaliação C++da Biblioteca.

Exemplos do C++

Os exemplos CNTKLibraryCPPEvalCPUOnlyExamples de C++ e CNTKLibraryCPPEvalGPUExamples ilustram o padrão de uso acima. A UWPImageRecognition contém um exemplo usando CNTK biblioteca UWP para avaliação de modelo. A página Exemplos de Eval fornece etapas detalhadas sobre como criar e executar exemplos.

Como alternativa, você pode usar a Biblioteca de CNTK do C++ sem o pacote de NuGet. Você pode obter Cntk.Core-<VERSION>.lib (ou Cntk.Core_app-<Version>.lib) e todas as DLLs dependentes da página CNTK Versões ou compilá-las de CNTK código-fonte. Você também precisa configurar o caminho de inclusão e biblioteca para apontar para o diretório correto e certificar-se de que a configuração de build (Depuração ou Versão) da Biblioteca de CNTK seja a mesma da configuração do projeto (caso contrário, você receberá exceções inesperadas). O pacote de versão CNTK contém apenas o build de versão de binários.

Envio da Biblioteca de CNTK com seu aplicativo Windows

CNTK Library requer que o pacote Pacote Redistribuível do Visual C++ para Visual Studio 2017 seja instalado no sistema em que seu aplicativo será executado. E a plataforma de destino na propriedade do projeto deve ser X64.

Esta página descreve como CNTK arquivos binários são nomeados.

Para aplicativos C++ da área de trabalho, as DLLs a seguir precisam ser distribuídas com seu aplicativo.

  • Cntk.Core-<VERSION>.dll
  • Cntk.Math-<VERSION>.dll
  • libiomp5md.dll
  • mklml.dll

Se você usar a Biblioteca Gerenciada C#/.NET, ao lado das DLLs mencionadas acima, precisará incluir as seguintes DLLs:

  • Cntk.Core.Managed-<VERSION>.dll
  • Cntk.Core.CSBinding-<VERSION>.dll

Para usar a GPU, você precisa, além disso, incluir as seguintes DLLs relacionadas ao NVIDIA CUDA:

  • cublas64_90.dll
  • cudart64_90.dll
  • cudnn64_7.dll
  • curand64_90.dll
  • cusparse64_90.dll
  • nvml.dll

Observação

Alterado no CNTK versão 2.1.

CNTK NuGet pacotes estão sendo enviados com cuDNN 6 (cudnn64_6.dll).

Todas essas DLLs podem ser encontradas na versão de versão binária CNTK, consulte a página CNTK Versões.

Para aplicativos UWP, as DLLs a seguir precisam ser distribuídas com seu aplicativo. Você pode encontrar essas DLLs no pacote CNTK.UWP.CPUOnlyNuget.

  • Cntk.Core_app-<VERSION>.dll
  • Cntk.Math_app-<VERSION>.dll
  • libopenblas.dll

Usando Python

Você pode usar o Python para avaliar um modelo pré-treinado. Exemplos podem ser encontrados aqui.

Usando Java

CNTK também fornece APIs para avaliar o modelo no aplicativo Java. Observe que a API Java CNTK ainda é experimental e está sujeita a alterações.

O exemplo java mostra como avaliar um modelo da CNN usando a API Java.

Para usar CNTK Biblioteca Java, adicione o cntk.jar arquivo ao classpath projeto Java. Se você estiver trabalhando com um IDE, deverá adicioná-lo como um jar não gerenciado. O arquivo cntk.jar pode ser encontrado no pacote de versão binária CNTK (na pasta cntk\cntk\java). Você também pode compilar cntk.jar de CNTK fonte. Defina java.library.path também como o diretório que contém Cntk.Core.JavaBinding-<Version>.dlle verifique se o diretório que contém CNTK DLLs binárias está no caminho de pesquisa de DLL do sistema, por exemplo, adicionando o diretório à variável de ambiente PATH. Observe que você também precisa instalar Pacote Redistribuível do Visual C++ Pacote para Visual Studio 2017. Se você entrar UnsatisfiedLinkErrors no Java, normalmente é porque o diretório não está no caminho de pesquisa de DLL (ou na ordem errada).

Atualmente, a biblioteca Java é criada e testada com o Oracle JDK 8 de 64 bits.