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 ONNX
BatchNormalization
. - 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 actualizadoDepthToSpace
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 laELU
operación ONNX. - Revisión importante y
Convolution
Pooling
exportación. A diferencia de antes, estas operaciones no exportan una operación explícitaPad
en ninguna situación. - Revisión importante para
ConvolutionTranspose
la exportación e importación. Los atributos comooutput_shape
,output_padding
ypads
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
//Softmax
LogSoftmax
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 ONNX
MatMul
. - Se ha actualizado CNTK compatibilidad con la operación ONNX
Gemm
. - 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 ONNX
Unsqueeze
.
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.