CNTK Versionshinweise v2.6

Highlights dieses Releases

  • .Net-Support
  • Effiziente Gruppenkonvolution.
  • Verbesserung der sequenziellen Konvolution.
  • Weitere Operatoren und Verbesserungen bestehender.
  • ONNX-Featureupdate zur Unterstützung von ONNX 1.2.2.
  • Weitere Ops, die von ONNX-Konverter unterstützt werden.
  • Fehlerbehebungen.

Effiziente Gruppenkonvolution

Die Implementierung von Gruppenkonvolution in CNTK wurde aktualisiert. Die aktualisierte Implementierung verschiebt sich von der Erstellung eines Teildiagramms für Gruppenkonvolution (mithilfe von Slicing und Splicing), und verwendet stattdessen cuDN7- und MKL2017-APIs direkt. Dadurch wird sowohl die Leistung als auch die Modellgröße verbessert.

Beispiel: Für eine einzelne Gruppenkonvolution op mit den folgenden Attributen:

  • Eingabe-Tensor (C, H, W) = (32, 128, 128)
  • Anzahl der Ausgabekanäle = 32 (Kanalmultiplier ist 1)
  • Gruppen = 32 (Tiefe weise Konvolution)
  • Kernelgröße = (5, 5)

Die Vergleichsnummern für diesen einzelnen Knoten sind wie folgt:

Erste Kopfzeile GPU exec. zeit (in millisec., 1000 run avg.) CPU exec. zeit (in millisec., 1000 run avg.) Modellgröße (in KB, CNTK Format)
Alte Implementierung 9.349 41.921 38
Neue Implementierung 6.581 9.963 5
Geschwindigkeit/Einsparungen ca. Ca. 30 % Ca. 65-75% 87 %

Sequenzielle Konvolution

Die Implementierung der sequenziellen Konvolution in CNTK wurde aktualisiert. Die aktualisierte Implementierung erstellt eine separate sequenzielle Konvolutionsebene. Abgesehen von der regulären Konvolutionsebene wird dieser Vorgang auch auf der dynamischen Achse(Sequenz) und filter_shape[0] auf diese Achse angewendet. Die aktualisierte Implementierung unterstützt breitere Fälle, z. B. "Stride > 1" für die Sequenzachse.

Beispiel: Eine sequenzielle Konvolution über einen Stapel von Schwarz-und-Weiß-Bildern mit einem Kanal. Die Bilder haben dieselbe feste Höhe von 640, aber jede mit der Breite der Variablenlängen. Die Breite wird dann durch die sequenzielle Achse dargestellt. Der Abstand ist aktiviert, und die Abstände für Breite und Höhe sind 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)

Operatoren

depth_to_space und space_to_depth

Die depth_to_space und space_to_depth Operatoren ändern sich. Diese wurden aktualisiert, um die ONNX-Spezifikation anzupassen, insbesondere die Permutation, wie die Tiefendimension als Blöcke in den räumlichen Dimensionen platziert wird, und umgekehrt, wurde geändert. Weitere Informationen finden Sie in den aktualisierten Dokumentbeispielen für diese beiden Ops, um die Änderung anzuzeigen.

Tan und Atan

Unterstützung für trigonometrische Ops Tan und Atan.

ELU

Unterstützung für alpha Attribut in ELU op hinzugefügt.

Konvolution

Aktualisiert automatischen Abstandsalgorithmen Convolution , um symmetrische Abstände am besten für die CPU zu erzeugen, ohne dass sich die endgültigen Ausgabewerte auswirken. Dieses Update erhöht den Bereich der Fälle, die von der MKL-API abgedeckt werden könnten, und verbessert die Leistung, z. B. ResNet50.

Standardargumentreihenfolge

In der Argumenteigenschaft in CNTK Python-API gibt es eine unterbrechungsbewendte Änderung. Das Standardverhalten wurde aktualisiert, um Argumente in Python-Reihenfolge anstelle in C++-Reihenfolge zurückzugeben. Auf diese Weise werden Argumente in derselben Reihenfolge zurückgegeben, wie sie in Ops eingespeist werden. Wenn Sie weiterhin Argumente in C++-Reihenfolge abrufen möchten, können Sie einfach die globale Option außer Kraft setzen. Diese Änderung sollte sich nur auf die folgenden Ops auswirken: Times, TransposeTimes und Gemm(internal).

Behebung von Programmfehlern

  • Aktualisiertes Dokument für Convolution-Ebene, um Gruppen- und Dilationsargumente einzuschließen.
  • Verbesserte Eingabeüberprüfung für Gruppenkonvolution hinzugefügt.
  • Aktualisiert LogSoftMax , um eine numerischere Implementierung zu verwenden.
  • Fixed Gather op's falscher Farbverlaufswert.
  • Überprüfung für den Knoten "None" in python clone substitution hinzugefügt.
  • Die Überprüfung für die Abstandskanalachse wurde in der Konvolution hinzugefügt.
  • Es wurde CNTK nativen LotusIR-Standardprotokollger hinzugefügt, um den Fehler "Versuch, DefaultLogger zu verwenden" beim Laden einiger ONNX-Modelle zu beheben.
  • Die richtige Initialisierung für ONNX TypeStrToProtoMap wurde hinzugefügt.
  • Python doctest wurde aktualisiert, um verschiedene Druckformate für neuere Version numpy(version >= 1.14) zu behandeln.
  • Fixed Pooling(CPU) to produce correct output values when kernel center is on padded input cells.

ONNX

Aktualisierungen

  • Aktualisiert CNTK ONNX-Import/Export, um ONNX 1.2-Spezifikation zu verwenden.
  • Hauptaktualisierung der Verarbeitung von Batch- und Sequenzachsen im Export und Import. Daher werden die komplexen Szenarien und Edgefälle genau behandelt.
  • Aktualisiert CNTK ONNX BatchNormalization op export/import auf die neuesten Spezifikationen.
  • Modelldomäne zum ONNX-Modellexport hinzugefügt.
  • Verbesserte Fehlerberichterstattung beim Importieren und Exportieren von ONNX-Modellen.
  • Aktualisiert DepthToSpace und SpaceToDepth ops, um die ONNX-Spezifikation für die Permutation zu entsprechen, um zu bestimmen, wie die Tiefendimension als Blockdimension platziert wird.
  • Unterstützung für das Exportieren des Attributs alpha in ELU ONNX op hinzugefügt.
  • Hauptüberholung und ConvolutionPooling Export. Im Gegensatz dazu exportieren diese Ops in keiner Situation eine explizite Pad Op.
  • Hauptüberholung zum ConvolutionTranspose Exportieren und Importieren. Attribute wie , output_shapeoutput_padding, und pads werden vollständig unterstützt.
  • Unterstützung für CNTK StopGradient wurde als No-Op hinzugefügt.
  • OnNX-Unterstützung für TopK op hinzugefügt.
  • OnNX-Unterstützung für Sequenz ops: sequence.slice, sequence.first, sequence.last, sequence.reduce_sum, sequence.reduce_max, sequence.softmax. Für diese Ops ist es nicht erforderlich, DIE ONNX-Spezifikation zu erweitern. CNTK ONNX-Exporter erstellt nur Berechnungsdiagramme für diese Sequenz ops.
  • Vollständige Unterstützung für Softmax op hinzugefügt.
  • Erstellt CNTK Übertragungen, die mit der ONNX-Spezifikation kompatibel sind.
  • Behandeln Sie to_batch, to_sequence, unpack_batch, sequence.unpack ops in CNTK ONNX-Exporter.
  • ONNX-Tests zum Exportieren von ONNX-Testfällen für andere Toolkits zum Ausführen und Überprüfen.
  • Der Import/Export wurde behobenHardmaxLogSoftmax/Softmax/.
  • Unterstützung für Select op export hinzugefügt.
  • Die Import-/Exportunterstützung für mehrere Trigonometrische Ops wurde hinzugefügt.
  • Aktualisiert CNTK Unterstützung für ONNX-OpMatMul.
  • Aktualisiert CNTK Unterstützung für ONNX-OpGemm.
  • Aktualisiert CNTK ONNX MeanVarianceNormalization op export/import auf die neuesten Spezifikationen.
  • Aktualisiert CNTK ONNX LayerNormalization op export/import auf die neuesten Spezifikationen.
  • Aktualisiert CNTK ONNX PRelu op export/import auf die neuesten Spezifikationen.
  • Aktualisiert CNTK ONNX Gather op export/import auf die neuesten Spezifikationen.
  • Aktualisiert CNTK ONNX ImageScaler op export/import auf die neuesten Spezifikationen.
  • Aktualisiert CNTK ONNX-Ops Reduce export/import auf neueste Spezifikationen.
  • Aktualisiert CNTK ONNX Flatten op export/import auf die neuesten Spezifikationen.
  • CNTK Unterstützung für ONNX-Op Unsqueeze hinzugefügt.

Fehler- oder Nebenbehebungen:

  • Aktualisierter LRN-Op zur Übereinstimmung mit ONNX 1.2-Spezifikation, in der das size Attribut die Semantik des Durchmessers hat, nicht radius. Überprüfung hinzugefügt, wenn die Größe des LRN-Kernels größer als die Kanalgröße ist.
  • Aktualisierte Min/Max Importimplementierung, um variadische Eingaben zu behandeln.
  • Die mögliche Dateibeschädigung wurde behoben, wenn sie oben in der vorhandenen ONNX-Modelldatei gespeichert werden.

.Net Support

Die Cntk.Core.Managed-Bibliothek wurde offiziell in .Net Standard konvertiert und unterstützt .NET Core und .Net Framework-Anwendungen sowohl für Windows als auch für Linux. Ab dieser Version sollten .Net-Entwickler in der Lage sein, CNTK Nuget-Pakete mithilfe einer neuen .Net SDK-Projektdatei mit Paketverwaltungsformat auf PackageReference wiederherzustellen.

Der folgende C#-Code funktioniert jetzt sowohl für Windows als auch für 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;

Beispielsweise ist das Hinzufügen einer ItemGroup-Klausel in der Csproj-Datei einer .NET Core Anwendung ausreichend: >>>>>>>>>>>>netcoreapp2.1>>> x64>>>>>>>>>>>>>>>>>>>>>

Fehler- oder Nebenbehebungen:

  • Behobene C#-Zeichenfolge und Zeichen für systemeigene wstring- und wchar UTF-Konvertierungsprobleme unter Linux.
  • Behobene Multibyte- und breite Zeichenkonvertierungen in der Codebasis.
  • Behobener Nuget-Paketmechanismus zum Packen für .Net Standard.
  • Es wurde ein Problem mit Speicherleck in der Wertklasse in der C#-API behoben, bei dem "Dispose" nicht zur Objektvernichtung aufgerufen wurde.