Notas de la versión de CNTK v2.6

Aspectos destacados de esta versión

  • Compatibilidad con .Net
  • Convolución de grupo eficaz.
  • Mejora de la convolución secuencial.
  • Más operadores y mejora de los existentes.
  • Actualización de características de ONNX para admitir ONNX 1.2.2.
  • Más operaciones compatibles con el convertidor ONNX.
  • Correcciones de errores.

Convolución de grupo eficaz

Se ha actualizado la implementación de la convolución de grupos en CNTK. La implementación actualizada se aleja de la creación de un subgrafo para la convolución de grupos (mediante la segmentación y la splicing), y en su lugar usa las API cuDNN7 y MKL2017 directamente. Esto mejora la experiencia en términos de rendimiento y tamaño del modelo.

Por ejemplo, para una única operación de convolución de grupo con los siguientes atributos:

  • Tensor de entrada (C, H, W) = (32, 128, 128)
  • Número de canales de salida = 32 (el multiplicador del canal es 1)
  • Grupos = 32 (convolución en profundidad)
  • Tamaño del kernel = (5, 5)

Los números de comparación de este nodo único son los siguientes:

Primer encabezado Exec de GPU. time (en milisec., 1000 run avg.) Cpu exec. time (en milisec., 1000 run avg.) Tamaño del modelo (en KB, formato CNTK)
Implementación antigua 9.349 41.921 38
Nueva implementación 6.581 9.963 5
Velocidad/ahorro aprox. 30% aprox. 65-75% Aprox. 87 %

Convolución secuencial

Se ha actualizado la implementación de la convolución secuencial en CNTK. La implementación actualizada crea una capa de convolución secuencial independiente. Diferente de la capa de convolución normal, esta operación también se basa en el eje dinámico (secuencia) y filter_shape[0] se aplica a ese eje. La implementación actualizada admite casos más amplios, como el paso > 1 para el eje de secuencia.

Por ejemplo, una convolución secuencial sobre un lote de imágenes de un canal negro y blanco. Las imágenes tienen la misma altura fija de 640, pero cada una con ancho de longitudes variables. A continuación, el ancho se representa mediante el eje secuencial. El relleno está habilitado y los pasos para el ancho y el alto son 2.

 >>> f = SequentialConvolution((3,3), reduction_rank=0, pad=True, strides=(2,2), activation=C.relu)
 >>> x = C.input_variable(**Sequence[Tensor[640]])
 >>> x.shape
     (640,)
 >>> h = f(x)
 >>> h.shape
     (320,)
 >>> f.W.shape
     (1, 1, 3, 3)

Operadores

depth_to_space y space_to_depth

Hay un cambio importante en los operadores de depth_to_space y space_to_depth . Se han actualizado para que coincidan con la especificación ONNX, específicamente la permutación de cómo se coloca la dimensión de profundidad como bloques en las dimensiones espaciales y viceversa, se ha cambiado. Consulte los ejemplos de documentos actualizados de estas dos operaciones para ver el cambio.

Tan y Atan

Se ha agregado compatibilidad con las operaciones Tan trigonométricas y Atan.

ELU

Se ha agregado compatibilidad con el alpha atributo en la operación ELU.

Convolución

Se han actualizado los algoritmos de relleno automático de Convolution para generar relleno simétrico al máximo esfuerzo en la CPU, sin afectar a los valores finales de salida de convolución. Esta actualización aumenta el intervalo de casos que podría cubrir la API MKL y mejora el rendimiento, por ejemplo, ResNet50.

Orden de argumentos predeterminados

Hay un cambio importante en la propiedad arguments en CNTK API de Python. El comportamiento predeterminado se ha actualizado para devolver argumentos en el orden de Python en lugar de en el orden de C++. De este modo, devolverá argumentos en el mismo orden en que se introducen en las operaciones. Si desea seguir recibiendo argumentos en el orden de C++, simplemente puede invalidar la opción global. Este cambio solo debe afectar a las siguientes operaciones: Times, TransposeTimes y Gemm(internal).

Corrección de errores

  • Se ha actualizado el documento de capa convolución para incluir argumentos de grupo y dedilación.
  • Se ha agregado una validación de entrada mejorada para la convolución de grupos.
  • Se ha actualizado LogSoftMax para usar una implementación más estable numéricamente.
  • Se ha corregido el valor de degradado incorrecto de la operación De recopilación.
  • Se ha agregado validación para el nodo "None" en la sustitución de clones de Python.
  • Se ha agregado validación para el eje de canal de relleno en convolución.
  • Se ha agregado CNTK registrador de lotusIR predeterminado nativo para corregir el error "Intento de usar DefaultLogger" al cargar algunos modelos ONNX.
  • Se ha agregado una inicialización adecuada para ONNX TypeStrToProtoMap.
  • Se ha actualizado python doctest para controlar diferentes formatos de impresión para la versión más reciente numpy(version >= 1.14).
  • Se ha corregido la agrupación (CPU) para generar valores de salida correctos cuando el centro del kernel está en celdas de entrada rellenadas.

ONNX

Actualizaciones

  • Se ha actualizado la importación o exportación de ONNX de CNTK para usar la especificación ONNX 1.2.
  • Actualización principal de cómo se controlan los ejes de procesamiento por lotes y secuencias en la exportación e importación. Como resultado, los escenarios complejos y los casos perimetrales se controlan con precisión.
  • Se ha actualizado CNTK exportación o importación de especificaciones más recientes de ONNXBatchNormalization.
  • Se ha agregado el dominio de modelo a la exportación del modelo ONNX.
  • Informes de errores mejorados durante la importación y exportación de modelos ONNX.
  • Se han actualizado y SpaceToDepth se han actualizado DepthToSpace las operaciones para que coincidan con las especificaciones de ONNX en la permutación de cómo se coloca la dimensión de profundidad como dimensión de bloque.
  • Se ha agregado compatibilidad para exportar alpha el atributo en la ELU operación ONNX.
  • Revisión importante y ConvolutionPooling exportación. A diferencia de antes, estas operaciones no exportan una operación explícita Pad en ninguna situación.
  • Revisión importante para ConvolutionTranspose la exportación e importación. Los atributos como output_shape, output_paddingy pads son totalmente compatibles.
  • Se ha agregado compatibilidad con CNTK StopGradient como no operativo.
  • Se ha agregado compatibilidad con ONNX para la operación TopK.
  • Se ha agregado compatibilidad con ONNX para las operaciones de secuencia: sequence.slice, sequence.first, sequence.last, sequence.reduce_sum, sequence.reduce_max, sequence.softmax. Para estas operaciones, no es necesario expandir las especificaciones de ONNX. CNTK exportador de ONNX solo compila gráficos de cálculo equavalentes para estas operaciones de secuencia.
  • Se ha agregado compatibilidad completa con la operación Softmax.
  • Hecho CNTK operaciones de difusión compatibles con la especificación ONNX.
  • Controle las operaciones to_batch, to_sequence, unpack_batch, sequence.unpack en CNTK exportador de ONNX.
  • Las pruebas de ONNX para exportar casos de prueba de ONNX para que otros kits de herramientas se ejecuten y se validen.
  • Se ha corregido Hardmax//SoftmaxLogSoftmax la importación y exportación.
  • Se ha agregado compatibilidad con la Select exportación de operaciones.
  • Se ha agregado compatibilidad con la importación y exportación de varias operaciones trigonométricas.
  • Se ha actualizado CNTK compatibilidad con la operación ONNXMatMul.
  • Se ha actualizado CNTK compatibilidad con la operación ONNXGemm.
  • Se ha actualizado la exportación o importación de onnx de onnx MeanVarianceNormalization de CNTK a la especificación más reciente.
  • Se ha actualizado la exportación o importación de onnx de onnx LayerNormalization de CNTK a la especificación más reciente.
  • Se ha actualizado la exportación o importación de onnx de onnx PRelu de CNTK a la especificación más reciente.
  • Se ha actualizado la exportación o importación de onnx de onnx Gather de CNTK a la especificación más reciente.
  • Se ha actualizado la exportación o importación de onnx de onnx ImageScaler de CNTK a la especificación más reciente.
  • Se ha actualizado la exportación o importación de operaciones onnx Reduce de CNTK a la especificación más reciente.
  • Se ha actualizado la exportación o importación de onnx de onnx Flatten de CNTK a la especificación más reciente.
  • Se ha agregado CNTK compatibilidad con la operación ONNXUnsqueeze.

Correcciones de errores o menores:

  • Se ha actualizado la operación LRN para que coincida con la especificación ONNX 1.2 donde el size atributo tiene la semántica de diámetro, no el radio. Se ha agregado validación si el tamaño del kernel LRN es mayor que el tamaño del canal.
  • Se ha actualizado Min/Max la implementación de importación para controlar las entradas variádicas.
  • Se corrigieron posibles daños en los archivos al volver a guardar sobre el archivo de modelo ONNX existente.

Compatibilidad con .NET

La biblioteca Cntk.Core.Managed se ha convertido oficialmente en .Net Standard y admite aplicaciones de .Net Core y .Net Framework en Windows y Linux. A partir de esta versión, los desarrolladores de .NET deben poder restaurar CNTK paquetes Nuget mediante el nuevo archivo de proyecto de estilo sdk de .Net con el formato de administración de paquetes establecido en PackageReference.

El código de C# siguiente ahora funciona en Windows y Linux:

 >>> var weightParameterName = "weight";
 >>> var biasParameterName = "bias";
 >>> var inputName = "input";
 >>> var outputDim = 2;
 >>> var inputDim = 3;
 >>> Variable inputVariable = Variable.InputVariable(new int[] { inputDim }, DataType.Float, inputName);
 >>> var weightParameter = new Parameter(new int[] { outputDim, inputDim }, DataType.Float, 1, device, weightParameterName);
 >>> var biasParameter = new Parameter(new int[] { outputDim }, DataType.Float, 0, device, biasParameterName);
 >>> 
 >>> Function modelFunc = CNTKLib.Times(weightParameter, inputVariable) + biasParameter;

Por ejemplo, basta con agregar una cláusula ItemGroup en el archivo .csproj de una aplicación .Net Core es suficiente: >>>>>>>>>>>>netcoreapp2.1>>> x64>>>>>>>>>>>>>>>>>>>>>

Correcciones de errores o menores:

  • Se han corregido problemas de conversión de cadena y char de C# en wstring y wchar UTF nativos en Linux.
  • Se han corregido conversiones de caracteres multibyte y ancho en el código base.
  • Se ha corregido el mecanismo del paquete NuGet para empaquetar para .Net Standard.
  • Se ha corregido un problema de pérdida de memoria en la clase Value de la API de C#, donde no se llamó a Dispose tras la destrucción de objetos.