Note sulla versione CNTK v2.6

Elementi da evidenziare in questa versione

  • Supporto di .NET
  • Convoluzione efficiente del gruppo.
  • Miglioramento della convoluzione sequenziale.
  • Altri operatori e miglioramento di quelli esistenti.
  • Aggiornamento delle funzionalità ONNX per supportare ONNX 1.2.2.
  • Altre operazioni supportate dal convertitore ONNX.
  • Correzioni di bug.

Convoluzione efficiente del gruppo

L'implementazione della convoluzione del gruppo in CNTK è stata aggiornata. L'implementazione aggiornata si allontana dalla creazione di un sottografo per la convoluzione del gruppo (usando slicing e splicing) e usa invece le API cuDNN7 e MKL2017 direttamente. Ciò migliora l'esperienza sia in termini di prestazioni che di dimensioni del modello.

Ad esempio, per un singolo gruppo convoluzione op con gli attributi seguenti:

  • Tensore di input (C, H, W) = (32, 128, 128)
  • Numero di canali di output = 32 (il moltiplicatore di canali è 1)
  • Gruppi = 32 (convoluzione a livello di profondità)
  • Dimensioni del kernel = (5, 5)

I numeri di confronto per questo singolo nodo sono i seguenti:

Prima intestazione GPU exec. ora (in millisec., 1000 esegui media). CPU exec. ora (in millisec., 1000 esegui media). Dimensioni del modello (in KB, CNTK formato)
Implementazione precedente 9.349 41.921 38
Nuova implementazione 6.581 9.963 5
Velocità/risparmio circa. Circa il 30% Circa il 65-75%. 87%

Convoluzione sequenziale

L'implementazione della convoluzione sequenziale in CNTK è stata aggiornata. L'implementazione aggiornata crea un livello di convoluzione sequenziale separato. Diverso dal livello di convoluzione regolare, questa operazione convolve anche sull'asse dinamico(sequenza) e filter_shape[0] viene applicata a tale asse. L'implementazione aggiornata supporta casi più estesi, ad esempio dove stride > 1 per l'asse della sequenza.

Ad esempio, una convoluzione sequenziale su un batch di immagini nere e bianche a un canale. Le immagini hanno la stessa altezza fissa di 640, ma ognuna con larghezza di lunghezza variabile. La larghezza viene quindi rappresentata dall'asse sequenziale. La spaziatura interna è abilitata e le stride per la larghezza e l'altezza sono 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)

Operatori

depth_to_space e space_to_depth

Si verifica un cambiamento di rilievo negli operatori di depth_to_space e space_to_depth . Questi sono stati aggiornati per corrispondere alla specifica ONNX, in particolare la permutazione per il modo in cui la dimensione di profondità viene inserita come blocchi nelle dimensioni spaziali e viceversa, è stata modificata. Per visualizzare la modifica, vedere gli esempi di documentazione aggiornati per queste due operazioni.

Tan e Atan

Aggiunta del supporto per operazioni Tan trigonometriche e Atan.

ELU

Aggiunta del supporto per alpha l'attributo nell'op ELU.

Convoluzione

Gli algoritmi di riempimento automatico aggiornati di Convolution per produrre spaziatura simmetrica al meglio sulla CPU, senza influire sui valori di output di convoluzione finali. Questo aggiornamento aumenta l'intervallo di casi che potrebbero essere coperti dall'API MKL e migliora le prestazioni, ad esempio ResNet50.

Ordine degli argomenti predefiniti

È stata apportata una modifica di rilievo nella proprietà argomenti nell'API Python CNTK. Il comportamento predefinito è stato aggiornato per restituire gli argomenti in ordine python anziché in ordine C++. In questo modo restituirà gli argomenti nello stesso ordine in cui vengono inseriti in operazioni. Se si desidera comunque ottenere argomenti nell'ordine C++, è sufficiente eseguire l'override dell'opzione globale. Questa modifica dovrebbe influire solo sulle operazioni seguenti: Times, TransposeTimes e Gemm(internal).

Correzioni di bug

  • Documentazione aggiornata per il livello convoluzione per includere argomenti di raggruppamento e dilazione.
  • Aggiunta di una convalida di input migliorata per la convoluzione del gruppo.
  • Aggiornato LogSoftMax per usare un'implementazione più numericamente stabile.
  • Correzione del valore di sfumatura non corretto dell'op Di raccolta.
  • Aggiunta della convalida per il nodo "None" nella sostituzione dei cloni python.
  • Aggiunta della convalida per l'asse del canale di riempimento nella convoluzione.
  • È stato aggiunto CNTK logger lotusIR nativo per correggere l'errore "Tentativo di usare DefaultLogger" durante il caricamento di alcuni modelli ONNX.
  • Aggiunta dell'inizializzazione corretta per ONNX TypeStrToProtoMap.
  • Aggiornamento del documento python per gestire un formato di stampa diverso per la versione più recente numpy(versione >= 1.14).
  • Correzione del pooling(CPU) per produrre valori di output corretti quando il centro del kernel è in celle di input spaziate.

ONNX

Aggiornamenti

  • Aggiornamento CNTK'importazione/esportazione ONNX per l'uso della specifica ONNX 1.2.
  • Aggiornamento principale al modo in cui vengono gestiti gli assi batch e sequenza nell'esportazione e nell'importazione. Di conseguenza, gli scenari complessi e i case perimetrali vengono gestiti in modo accurato.
  • Aggiornamento CNTK'esportazione/importazione di ONNX BatchNormalization nella specifica più recente.
  • Aggiunta del dominio modello all'esportazione del modello ONNX.
  • Miglioramento della segnalazione degli errori durante l'importazione e l'esportazione dei modelli ONNX.
  • Aggiornato DepthToSpace e SpaceToDepth ops per corrispondere alla specifica ONNX sulla permutazione per come la dimensione della profondità viene posizionata come dimensione a blocchi.
  • Aggiunta del supporto per l'esportazione dell'attributo nell'opzione alphaELU ONNX.
  • Revisione principale e ConvolutionPooling esportazione. A differenza di prima, queste operazioni non esportano un'operazione esplicita Pad in qualsiasi situazione.
  • Revisione principale per l'esportazione e l'importazione ConvolutionTranspose . Attributi come output_shape, output_paddinge pads sono completamente supportati.
  • Aggiunta del supporto per CNTK StopGradient come no-op.
  • Aggiunta del supporto ONNX per l'opzione TopK.
  • Aggiunta del supporto ONNX per operazioni di sequenza: sequence.slice, sequence.first, sequence.last, sequence.reduce_sum, sequence.reduce_max, sequence.softmax. Per queste operazioni, non è necessario espandere le specifiche ONNX. CNTK l'esportazione ONNX compila solo grafici equavalenti di calcolo per queste operazioni di sequenza.
  • Aggiunta del supporto completo per softmax op.
  • Reso compatibile CNTK operazioni di trasmissione con la specifica ONNX.
  • Gestire to_batch, to_sequence, unpack_batch, sequence.unpack ops in CNTK esportazione ONNX.
  • I test ONNX per esportare i test case ONNX per altri toolkit da eseguire e convalidare.
  • Correzione Hardmax//SoftmaxLogSoftmax dell'importazione/esportazione.
  • Aggiunta del supporto per Select l'esportazione op.
  • Aggiunta del supporto di importazione/esportazione per diverse operazioni trigonometriche.
  • Aggiornamento del supporto CNTK per l'op ONNXMatMul.
  • Aggiornamento del supporto CNTK per l'op ONNXGemm.
  • Aggiornamento dell'esportazione/importazione op ONNX MeanVarianceNormalization di CNTK alla specifica più recente.
  • Aggiornamento dell'esportazione/importazione op ONNX LayerNormalization di CNTK alla specifica più recente.
  • Aggiornamento dell'esportazione/importazione op ONNX PRelu di CNTK alla specifica più recente.
  • Aggiornamento dell'esportazione/importazione op ONNX Gather di CNTK alla specifica più recente.
  • Aggiornamento dell'esportazione/importazione op ONNX ImageScaler di CNTK alla specifica più recente.
  • Aggiornamento dell'esportazione/importazione delle operazioni ONNX Reduce di CNTK alla specifica più recente.
  • Aggiornamento dell'esportazione/importazione op ONNX Flatten di CNTK alla specifica più recente.
  • Aggiunta del supporto CNTK per l'op ONNXUnsqueeze.

Correzioni di bug o secondarie:

  • Aggiornamento dell'op LRN in modo che corrisponda alla specifica ONNX 1.2 in cui l'attributo ha la semantica di diametro, non il size raggio. Aggiunta della convalida se le dimensioni del kernel LRN sono maggiori delle dimensioni del canale.
  • Aggiornamento Min/Max dell'implementazione dell'importazione per gestire gli input variadic.
  • Correzione del possibile danneggiamento dei file durante il ripristino sul file di modello ONNX esistente.

Supporto di .NET

La libreria Cntk.Core.Managed è stata ufficialmente convertita in .Net Standard e supporta applicazioni .NET Core e .Net Framework sia in Windows che in Linux. A partire da questa versione, gli sviluppatori .Net devono essere in grado di ripristinare CNTK pacchetti Nuget usando il nuovo file di progetto di stile .Net SDK con formato di gestione pacchetti impostato su PackageReference.

Il codice C# seguente ora funziona sia in Windows che in 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;

Ad esempio, è sufficiente aggiungere una clausola ItemGroup nel file con estensione csproj di un'applicazione .NET Core: >>>>>>>>>>>>netcoreapp2.1>>> x64>>>>>>>>>>>>>>>>>>>>>

Correzioni di bug o secondarie:

  • Correzione dei problemi di conversione di stringhe e caratteri C# in wstring nativo e WCHAR UTF in Linux.
  • Correzione delle conversioni di caratteri multibyte e wide nella codebase.
  • Correzione del meccanismo del pacchetto NuGet da comprimere per .Net Standard.
  • È stato risolto un problema di perdita di memoria nella classe Value nell'API C# in cui Dispose non veniva chiamato alla distruzione degli oggetti.