Evaluación de modelos en Windows
Actualmente, CNTK proporciona bibliotecas en C++, C#/.NET, Python y Java para cargar y evaluar modelos en Windows. A partir de v2.1, CNTK también admite Plataforma universal de Windows (UWP).
Uso de la API administrada de C#/.NET
La biblioteca de CNTK proporciona una biblioteca administrada (.NET) para la evaluación de modelos de CNTK en CPU y GPU mediante C# y otros lenguajes .NET. CNTK del paquete de NuGet. CPUOnly está diseñado para su ejecución en la CPU y el CNTK. La GPU está diseñada para su ejecución en dispositivos con GPU NVIDIA. Consulte la página NuGet Paquete sobre cómo instalar paquetes de CNTK Library NuGet. Tenga en cuenta que se requiere Visual Studio 2017 y la plataforma de destino en la propiedad del proyecto debe ser X64.
La API administrada de CNTK Library permite cargar y evaluar modelos entrenados previamente en dispositivos especificados (CPU o GPU). También proporciona diferentes formas de ayudarle a preparar los datos de entrada y salida en el formato CSC denso, de un solo uso o de tipo CSC disperso. Los datos de entrada pueden ser un único ejemplo, un lote de varias muestras, una secuencia de muestras o un lote de secuencias con longitudes variables. Puede encontrar una descripción detallada sobre el formato de lote y secuencia en la página CNTK Conceptos. Después de la evaluación, la API proporciona métodos prácticos para obtener resultados.
Guía de programación de C#/.NET
Los pasos habituales para la evaluación de modelos mediante CNTK Library Managed API incluyen:
- Instale el paquete de NuGet adecuado (CPU o GPU según el uso) en su. Los detalles se describen en el paquete de CNTK NuGet.
- Cargue el modelo por Function.Load(). El valor devuelto es una
Function
instancia que hace referencia al modelo cargado. - Si es necesario, obtenga entradas y salidas del modelo cargado llamando a las propiedades
Arguments
oOutput
Outputs
de la instancia de Function devuelta por Load(). Las entradas y salidas se representan comoVariable
. Para obtener más información sobre cada entrada o salida individual, por ejemploName
, oShape
se puede encontrar llamando a las propiedades correspondientes de la variable. - Para cada entrada, prepare los datos de entrada para la evaluación. En función del uso, los datos de entrada pueden constar de un solo ejemplo, un lote de varias muestras, una secuencia de muestras o un lote de secuencias con longitud variable. Con respecto al almacenamiento, los datos de entrada pueden tener el formato denso, un vector de acceso frecuente o el formato CSC disperso. El
Value
objeto se usa para representar los datos de entrada con diferentes formatos y contenidos. La API de CNTK proporciona diferentes métodos para crear fácilmente el objeto Value a partir de datos de usuario sin formato.CreateBatch()
crea un objeto Value que contiene un lote de muestras únicas o varias.CreateSequence()
crea un objeto Value que contiene una secuencia con varias muestras. Es posible especificar si esta secuencia es una nueva secuencia o una continuación de una secuencia anterior en el mismo índice de la lista de secuencias de una llamada anterior a este método.CreateBatchOfSequences()
crea un objeto Value que contiene un lote de secuencias. Cada secuencia tiene una longitud variable de muestras. Todos los métodos anteriores admiten el formato CSC denso, uno activo o disperso.
- Llame al
Evaluate()
método para ejecutar la evaluación. El parámetroarguments
define variables de entrada y sus valores asociados youtputs
define variables de salida. Si el objeto Value de una variable de salida esnull
, CNTK Library asigna el almacenamiento real para el valor de salida. Al devolver, Evaluate() guarda los resultados de evaluación en los objetos Value asociados a las variables de salida. - Llame al
GetDenseData()/GetOneHotData()
método del valor de salida para obtener los resultados en formato de datos sin formato. Copia los datos almacenados en el objeto Value en el búfer como una lista de secuencias con muestras de longitud variable, ya sea en formato denso o con un formato de vector activo (pronto se agregará compatibilidad con el formato disperso).
La API administrada de CNTK library se describe en la página api administrada de CNTK biblioteca C#/.NET.
Evaluación de varias solicitudes en paralelo
CNTK admite la evaluación de varias solicitudes en paralelo. Dado que la ejecución de la evaluación en la misma instancia del modelo no es segura para subprocesos, primero es necesario crear varias instancias de modelo llamando a Clone() con ParameterCloningMethod.Share
y, a continuación, cada subproceso usa una instancia de modelo independiente para la evaluación. EvaluateMultipleImagesInParallelAsync()
Muestra cómo evaluar las solicitudes simultáneas mediante CNTK API administrada de C#/.NET.
Ejecución asincrónica de evaluación
CNTK API de C# no tiene un método asincrónico para Evaluate(), porque la evaluación es una operación enlazada a la CPU (consulte [este artículo] (https://blogs.msdn.microsoft.com/pfxteam/2012/03/24/should-i-expose-asynchronous-wrappers-for-synchronous-methods/) para obtener una explicación detallada). Sin embargo, se desea ejecutar la evaluación de forma asincrónica en algunos casos de uso, por ejemplo, descargar la capacidad de respuesta, mostramos en el ejemplo EvaluationSingleImageAsync()
cómo lograrlo mediante el método EvaluateAsync()
de extensión .
Evaluación de capas intermedias
CNTK API de C# puede evaluar una capa intermedia en un grafo de modelo. Para ello, se puede encontrar la capa deseada por su nombre y se puede evaluar la capa intermedia. En el ejemplo EvaluateIntermediateLayer() de C# se muestra cómo evaluar una capa intermedia en un modelo.
Evaluación de salidas de varios nodos
CNTK puede evaluar varios nodos en un gráfico de modelos mediante la combinación de sus salidas en un solo nodo. En el ejemplo EvaluateCombinedOutputs() de C# se muestra cómo evaluar varias salidas.
Ejemplos de C#
CNTKLibraryCSEvalExamples muestra cómo evaluar un modelo en C# mediante paquetes de CNTK Library NuGet. Consulte la página Ejemplos de Eval para compilar y ejecutar ejemplos.
Si no desea usar NuGet Paquete, puede agregar Cntk.Core.Managed-<VERSION>.dll
como referencia al proyecto. El Cntk.Core.Managed
archivo DLL y todos los archivos DLL dependientes se pueden encontrar en el paquete de versión binaria CNTK en la página Versiones de CNTK. Asegúrese de que la ruta de acceso a Cntk.Core.Managed
DLL y sus dependencias (consulte la lista al final de esta página) se incluye en la ruta de acceso de búsqueda de dll para la aplicación.
Usar C++
La API de C++ de CNTK Library admite la evaluación de modelos en aplicaciones de C++. Se admiten aplicaciones de escritorio estándar y aplicaciones de Plataforma universal de Windows. Visual Studio 2017 es necesario y la plataforma de destino de la propiedad del proyecto debe ser X64.
CNTK del paquete de CNTK NuGet. CPUOnly y CNTK. La GPU contiene la biblioteca de CNTK de C++ para usar CNTK en aplicaciones de escritorio. Para usar CNTK en Plataforma universal de Windows, instale CNTK. UWP. CPUOnly. Mediante el uso de paquetes NuGet, la configuración sobre los directorios de inclusión y biblioteca se agrega automáticamente a la propiedad del proyecto. Se admiten tanto la compilación de depuración como la versión de lanzamiento. En la página NuGet Paquete se explica cómo obtener e instalar paquetes CNTK NuGet.
Guía de programación de C++
En los pasos siguientes se describe cómo usar la biblioteca de CNTK de C++ para la evaluación del modelo.
- Vincule la biblioteca de
Cntk.Core-<VERSION>.lib
importación a la aplicación. Este paso se puede omitir si usa el paquete de NuGet. En el caso de la aplicación para UWP, el nombre de la biblioteca esCnkt.Core_app-<Version>.lib
. - Incluya el archivo de encabezado de evaluación "CNTKLibrary.h".
- Cargue el modelo mediante
CNTK::Function::Load()
. El objeto Function devuelto representa el gráfico de cálculo del modelo. - Prepare los datos para cada variable de entrada. Puede usar
CNTK::Value::CreateBatch()
,CNTK::Value::CreateSequence()
oCNTK::Value::CreateBatchOfSequences()
para crear un objeto Value a partir de los datos de entrada que representan un lote de muestras, una secuencia de muestras o un lote de secuencias de muestras respectivamente. - Llame
CNTK::Function::Evaluate()
a evaluación.Evaluate()
espera como entrada un unordered_map para las variables de entrada y los valores de entrada, y un unordered_map para las variables de salida y los valores de salida. El objeto de valor de salida podría sernull
, lo que significa que CNTK Library asigna el almacenamiento real para este valor de salida. Cuando se devuelve, los objetos Value asociados a las variables de salida contienen los resultados de la evaluación. - Obtiene los datos de salida de los resultados de la evaluación. Use
CNTK::Value::CopyVariableValueTo()
para copiar los datos almacenados en el objeto Value en el búfer como una lista de secuencias con longitud variable de muestras.
Para la evaluación simultánea de varias solicitudes, CNTK::Function::Clone()
se debe llamar a antes de Evaluate(). Muestra ParallelEvaluationExample()
cómo evaluar varias solicitudes en paralelo mediante CNTK API de biblioteca de C++.
Para obtener más información sobre C++ CNTK Library API para su evaluación, consulte la página CNTK Library C++ Evaluation Interface (Interfaz de evaluación de C++).
Ejemplos de C++
Los ejemplos CNTKLibraryCPPEvalCPUOnlyExamples
de C++ e CNTKLibraryCPPEvalGPUExamples
ilustran el patrón de uso anterior. UWPImageRecognition contiene un ejemplo mediante CNTK biblioteca para UWP para la evaluación del modelo. En la página Ejemplos de Eval se proporcionan pasos detallados sobre la creación y ejecución de ejemplos.
Como alternativa, puede usar la biblioteca de CNTK de C++ sin el paquete de NuGet. Puede obtener Cntk.Core-<VERSION>.lib
(o Cntk.Core_app-<Version>.lib
) y todos los archivos DLL dependientes de la página versiones de CNTK o compilarlos a partir de CNTK código fuente. También debe configurar la ruta de acceso de inclusión y biblioteca para que apunte al directorio correcto y asegúrese de que la configuración de compilación (depuración o versión) de la biblioteca de CNTK sea la misma que la de la configuración del proyecto (de lo contrario, obtendrá excepciones inesperadas). El paquete de versión de CNTK contiene solo la compilación de versión de los archivos binarios.
Envío de CNTK Biblioteca con la aplicación de Windows
CNTK Library requiere que se instale el paquete de Visual C++ Redistributable para Visual Studio 2017 en el sistema donde se va a ejecutar la aplicación. Y la plataforma de destino de la propiedad del proyecto debe ser X64.
En esta página se describe cómo se denominan CNTK archivos binarios.
En el caso de las aplicaciones de C++ de escritorio, es necesario distribuir los siguientes archivos DLL con la aplicación.
Cntk.Core-<VERSION>.dll
Cntk.Math-<VERSION>.dll
libiomp5md.dll
mklml.dll
Si usa la biblioteca administrada de C#/.NET, además de los archivos DLL mencionados anteriormente, debe incluir además los siguientes archivos DLL:
Cntk.Core.Managed-<VERSION>.dll
Cntk.Core.CSBinding-<VERSION>.dll
Para usar GPU, debe incluir los siguientes archivos DLL relacionados con NVIDIA CUDA:
cublas64_90.dll
cudart64_90.dll
cudnn64_7.dll
curand64_90.dll
cusparse64_90.dll
nvml.dll
Nota
Se ha cambiado en CNTK versión 2.1.
CNTK NuGet paquetes se envían con cuDNN 6 (cudnn64_6.dll
).
Todos estos archivos DLL se pueden encontrar en la versión de versión binaria de CNTK, consulte la página versiones de CNTK.
En el caso de las aplicaciones para UWP, es necesario distribuir los siguientes archivos DLL con la aplicación. Puede encontrar estos archivos DLL en el paquete CNTK.UWP.CPUOnly
Nuget .
Cntk.Core_app-<VERSION>.dll
Cntk.Math_app-<VERSION>.dll
libopenblas.dll
Usar Python
Puede usar Python para evaluar un modelo entrenado previamente. Puede encontrar ejemplos aquí.
Usar Java
CNTK también proporciona API para evaluar el modelo en la aplicación Java. Tenga en cuenta que la API de Java de CNTK sigue siendo experimental y está sujeta a cambios.
En el ejemplo de Java se muestra cómo evaluar un modelo de CNN mediante la API de Java.
Para usar CNTK biblioteca de Java, agregue el cntk.jar
archivo al classpath
del proyecto de Java. Si está trabajando con un IDE, debe agregarlo como un archivo jar no administrado. El archivo cntk.jar se puede encontrar en el paquete de versión binaria CNTK (en la carpeta cntk\cntk\java). También puede compilar cntk.jar desde CNTK origen. Establezca también java.library.path
en el directorio que contiene Cntk.Core.JavaBinding-<Version>.dll
y asegúrese de que el directorio que contiene CNTK dll binarios está en la ruta de acceso de búsqueda DLL del sistema, por ejemplo, agregando el directorio a la variable de entorno PATH. Tenga en cuenta que también debe instalar Visual C++ Redistributable Paquete para Visual Studio 2017. Si se obtiene UnsatisfiedLinkErrors
en Java, suele deberse a que el directorio no está en la ruta de acceso de búsqueda dll (o en el orden incorrecto).
La biblioteca de Java se ha compilado y probado actualmente con Oracle JDK de 64 bits 8.