Notes de publication CNTK v2.6

Principales caractéristiques de cette version

  • Prise en charge de .Net
  • Convolution de groupe efficace.
  • Amélioration de la convolution séquentielle.
  • Plus d’opérateurs et d’améliorations des opérateurs existants.
  • Mise à jour des fonctionnalités ONNX pour prendre en charge ONNX 1.2.2.
  • Plus d’opérations prises en charge par le convertisseur ONNX.
  • Résolution des bogues.

Convolution de groupe efficace

L’implémentation de la convolution de groupe dans CNTK a été mise à jour. L’implémentation mise à jour s’éloigne de la création d’un sous-graphique pour la convolution de groupe (à l’aide du découpage et du découpage), et utilise plutôt des API cuDNN7 et MKL2017 directement. Cela améliore l’expérience en termes de performances et de taille de modèle.

Par exemple, pour une opération de convolution de groupe unique avec les attributs suivants :

  • Tenseur d’entrée (C, H, W) = (32, 128, 128)
  • Nombre de canaux de sortie = 32 (multiplicateur de canal est 1)
  • Groupes = 32 (convolution approfondie)
  • Taille du noyau = (5, 5)

Les nombres de comparaison pour ce nœud unique sont les suivants :

Premier en-tête GPU exec. time (en millisec., 1 000 run avg.) Cpu exec. time (en millisec., 1 000 run avg.) Taille du modèle (au format Ko, CNTK)
Ancienne implémentation 9.349 41.921 38
Nouvelle implémentation 6.581 9.963 5
Accélération/économies environ. 30 % environ. 65-75% environ. 87 %

Convolution séquentielle

L’implémentation de la convolution séquentielle dans CNTK a été mise à jour. L’implémentation mise à jour crée une couche de convolution séquentielle distincte. Différente de la couche de convolution régulière, cette opération se convole également sur l’axe dynamique (séquence) et filter_shape[0] est appliquée à cet axe. L’implémentation mise à jour prend en charge des cas plus larges, tels que l’endroit où la stride > 1 pour l’axe de séquence.

Par exemple, une convolution séquentielle sur un lot d’images noir et blanc à un canal. Les images ont la même hauteur fixe de 640, mais chacune avec une largeur de longueur variable. La largeur est ensuite représentée par l’axe séquentiel. Le remplissage est activé, et les pas pour la largeur et la hauteur sont de 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)

Opérateurs

depth_to_space et space_to_depth

Il y a un changement cassant dans les opérateurs depth_to_space et space_to_depth . Celles-ci ont été mises à jour pour correspondre à la spécification ONNX, en particulier la permutation de la façon dont la dimension de profondeur est placée en tant que blocs dans les dimensions spatiales, et vice versa, a été modifiée. Reportez-vous aux exemples de documents mis à jour pour ces deux opérations pour voir la modification.

Tan et Atan

Ajout de la prise en charge des opérations trigonométriques Tan et Atan.

ELU

Ajout de la prise en charge de l’attribut alpha dans l’opération ELU.

Convolution

Mise à jour des algorithmes de remplissage automatique de Convolution façon à produire un remplissage symétrique au mieux sur le processeur, sans affecter les valeurs de sortie de convolution finales. Cette mise à jour augmente la plage de cas qui peuvent être couverts par l’API MKL et améliore les performances, par exemple ResNet50.

Ordre des arguments par défaut

Il existe une modification cassant de la propriété arguments dans CNTK API Python. Le comportement par défaut a été mis à jour pour retourner des arguments dans l’ordre python au lieu de l’ordre C++. De cette façon, il retourne des arguments dans le même ordre qu’ils sont alimentés dans des opérations. Si vous souhaitez toujours obtenir des arguments dans l’ordre C++, vous pouvez simplement remplacer l’option globale. Cette modification ne doit affecter que les opérations suivantes : Times, TransposeTimes et Gemm(internal).

Résolution des bogues

  • Documentation mise à jour pour la couche Convolution afin d’inclure des arguments de groupe et de dilation.
  • Ajout d’une validation d’entrée améliorée pour la convolution de groupe.
  • Mise à jour LogSoftMax pour utiliser une implémentation plus stable numériquement.
  • Correction de la valeur de dégradé incorrecte de Collect op.
  • Ajout de la validation pour le nœud « None » dans la substitution de clone Python.
  • Ajout de la validation pour l’axe des canaux de remplissage dans la convolution.
  • Ajout CNTK enregistreur d’événements lotusIR natif pour corriger l’erreur « Tentative d’utilisation de DefaultLogger » lors du chargement de certains modèles ONNX.
  • Ajout de l’initialisation appropriée pour ONNX TypeStrToProtoMap.
  • Mise à jour de python doctest pour gérer différents formats d’impression pour la version plus récente numpy(version >= 1.14).
  • Correction du regroupement (UC) pour produire des valeurs de sortie correctes lorsque le centre du noyau se trouve sur des cellules d’entrée rembourrées.

ONNX

Mises à jour

  • Mise à jour de l’importation/exportation ONNX de CNTK pour utiliser la spécification ONNX 1.2.
  • Mise à jour majeure de la façon dont les axes de traitement par lots et de séquence sont gérés dans l’exportation et l’importation. Par conséquent, les scénarios complexes et les cas de périphérie sont gérés avec précision.
  • Mise à jour de l’exportation/importation d’opérations ONNX BatchNormalization de CNTK vers la dernière spécification.
  • Ajout d’un domaine de modèle à l’exportation de modèle ONNX.
  • Amélioration du rapport d’erreurs lors de l’importation et de l’exportation de modèles ONNX.
  • Mise à jour DepthToSpace et SpaceToDepth opérations pour correspondre aux spécifications ONNX sur la permutation pour savoir comment la dimension de profondeur est placée en tant que dimension de bloc.
  • Ajout de la prise en charge de l’exportation d’attribut alpha dans ELU l’opération ONNX.
  • Révision majeure à l’exportation et Pooling à l’exportationConvolution. Contrairement à ce qui précède, ces opérations n’exportent pas une opération explicite Pad dans une situation quelconque.
  • Révision majeure de l’exportation et de l’importation ConvolutionTranspose . Les attributs tels que output_shape, output_paddinget pads sont entièrement pris en charge.
  • Ajout de la prise en charge des StopGradient CNTK en tant qu’absence d’opération.
  • Ajout de la prise en charge d’ONNX pour l’opération TopK.
  • Ajout de la prise en charge d’ONNX pour les opérations de séquence : sequence.slice, sequence.first, sequence.last, sequence.reduce_sum, sequence.reduce_max, sequence.softmax. Pour ces opérations, il n’est pas nécessaire d’étendre la spécification ONNX. CNTK exportateur ONNX génère simplement des graphiques de calcul equavalents pour ces opérations de séquence.
  • Ajout de la prise en charge complète des opérations Softmax.
  • Rendu CNTK opérations de diffusion compatibles avec la spécification ONNX.
  • Gérez les opérations to_batch, to_sequence, unpack_batch, sequence.unpack dans CNTK exportateur ONNX.
  • Les tests ONNX pour exporter des cas de test ONNX pour d’autres kits de ressources à exécuter et à valider.
  • Correction de Hardmax//SoftmaxLogSoftmax l’importation/exportation.
  • Ajout de la prise en charge de Select l’exportation d’opérations.
  • Ajout de la prise en charge de l’importation/exportation pour plusieurs opérations trigonométriques.
  • Mise à jour CNTK prise en charge de l’opération ONNXMatMul.
  • Mise à jour CNTK prise en charge de l’opération ONNXGemm.
  • Mise à jour de l’exportation/importation d’opérations ONNX MeanVarianceNormalization de CNTK vers la dernière spécification.
  • Mise à jour de l’exportation/importation d’opérations ONNX LayerNormalization de CNTK vers la dernière spécification.
  • Mise à jour de l’exportation/importation d’opérations ONNX PRelu de CNTK vers la dernière spécification.
  • Mise à jour de l’exportation/importation d’opérations ONNX Gather de CNTK vers la dernière spécification.
  • Mise à jour de l’exportation/importation d’opérations ONNX ImageScaler de CNTK vers la dernière spécification.
  • Mise à jour des opérations ONNX Reduce de CNTK vers la dernière spécification.
  • Mise à jour de l’exportation/importation d’opérations ONNX Flatten de CNTK vers la dernière spécification.
  • Ajout CNTK prise en charge de l’opération ONNXUnsqueeze.

Correctifs mineurs ou bogues :

  • Mise à jour de l’opération LRN pour correspondre à la spécification ONNX 1.2 où l’attribut size a la sémantique du diamètre, et non du rayon. Ajout de la validation si la taille du noyau LRN est supérieure à la taille du canal.
  • Mise à jour Min/Max de l’implémentation de l’importation pour gérer les entrées variadiques.
  • Correction de l’altération possible des fichiers lors de la récupération à nouveau sur le fichier de modèle ONNX existant.

Prise en charge de .Net

La bibliothèque Cntk.Core.Managed a officiellement été convertie en .Net Standard et prend en charge les applications .Net Core et .Net Framework sur Windows et Linux. À partir de cette version, les développeurs .Net doivent être en mesure de restaurer CNTK packages Nuget à l’aide du nouveau fichier projet de style sdk .Net avec le format de gestion des packages défini sur PackageReference.

Le code C# suivant fonctionne désormais sur Windows et 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;

Par exemple, l’ajout d’une clause ItemGroup dans le fichier .csproj d’une application .Net Core suffit : >>>>>>>>>>>>netcoreapp2.1>>> x64>>>>>>>>>>>>>>>>>>>>>

Correctifs mineurs ou bogues :

  • Correction des problèmes de conversion de chaîne et de caractères C# en Wstring natif et Wchar UTF sur Linux.
  • Correction des conversions de caractères multioctets et larges dans la base de code.
  • Correction du mécanisme de package Nuget à empaqueter pour .Net Standard.
  • Correction d’un problème de fuite de mémoire dans la classe Value dans l’API C# où Dispose n’était pas appelé lors de la destruction d’objets.