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:
- Instale o pacote de NuGet apropriado (CPU ou GPU, dependendo do uso) para o seu. Os detalhes são descritos no pacote CNTK NuGet.
- Carregue o modelo por Function.Load(). O valor retornado é uma
Function
instância que se refere ao modelo carregado. - Se necessário, obtenha entradas e saídas do modelo carregado chamando as propriedades
Arguments
Output
ouOutputs
a instância de Função retornada por Load(). As entradas e saídas são representadas comoVariable
. Mais informações sobre cada entrada ou saída individual, por exemploName
, ouShape
podem ser encontradas chamando as propriedades correspondentes da Variável. - 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.
- Chame o
Evaluate()
método para executar a avaliação. O parâmetroarguments
define variáveis de entrada e seus valores associados eoutputs
define variáveis de saída. Se o objeto Value de uma variável de saída fornull
, 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. - 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.Share
e, 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.
- 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
. - Inclua o arquivo de cabeçalho de avaliação "CNTKLibrary.h".
- Carregue o modelo por
CNTK::Function::Load()
. O objeto Function retornado representa o grafo de computação do modelo. - Preparar dados para cada variável de entrada. Você pode usar
CNTK::Value::CreateBatch()
ouCNTK::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. - Chamada
CNTK::Function::Evaluate()
para avaliação. AEvaluate()
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 sernull
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. - 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.CPUOnly
Nuget.
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>.dll
e 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.