zpráva k vydání verze CNTK verze 2.6

To nejdůležitější v této verzi

  • Podpora rozhraní .NET
  • Efektivní souskupování.
  • Zlepšení sekvenční konvoluce.
  • Další operátory a vylepšení stávajících operátorů.
  • Aktualizace funkcí ONNX pro podporu ONNX 1.2.2
  • Další operace podporované převaděčem ONNX.
  • Opravy chyb.

Efektivní konvoluce skupin

Byla aktualizována implementace konvoluce skupiny v CNTK. Aktualizovaná implementace se přesune od vytvoření dílčího grafu pro konvoluci skupin (pomocí řezů a splicingu) a místo toho přímo používá rozhraní API cuDNN7 a MKL2017. To zlepšuje prostředí z hlediska výkonu i velikosti modelu.

Například pro jeden skupinový konvoluční provoz s následujícími atributy:

  • Vstupní tensor (C, H, W) = (32, 128, 128)
  • Počet výstupních kanálů = 32 (násobitel kanálu je 1)
  • Skupiny = 32 (hloubková soustředná konvoluce)
  • Velikost jádra = (5, 5)

Srovnávací čísla pro tento jeden uzel jsou následující:

První záhlaví GPU exec. time (v milisec., 1000 run avg.) Cpu exec. time (v milisec., 1000 run avg.) Velikost modelu (ve formátu KB, CNTK)
Stará implementace 9.349 41.921 38
Nová implementace 6.581 9.963 5
Zrychlení/úspory cca. Přibližně 30 % Přibližně 65-75% 87%

Sekvenční konvoluce

Byla aktualizována implementace sekvenční konvoluce v CNTK. Aktualizovaná implementace vytvoří samostatnou sekvenční konvoluční vrstvu. Tato operace se liší od běžné konvoluční vrstvy, ale také na dynamické ose (sekvenci) a filter_shape[0] se na tuto osu použije. Aktualizovaná implementace podporuje širší případy, jako je například umístění > 1 pro sekvenci osy.

Například sekvenční konvoluce v dávce jednokanálových černobílých obrázků. Obrázky mají stejnou pevnou výšku 640, ale každý s šířkou proměnných délek. Šířka je pak reprezentována sekvenční osou. Odsazení je povolené a kroky pro šířku i výšku jsou 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)

Operátory

depth_to_space a space_to_depth

Operátory depth_to_space a space_to_depth se mění. Byly aktualizovány tak, aby odpovídaly specifikaci ONNX, konkrétně permutaci pro způsob umístění rozměru hloubky jako bloků v prostorových rozměrech a naopak, byly změněny. Pokud chcete zjistit změnu, projděte si aktualizované příklady dokumentace pro tyto dva operace.

Tan a Atan

Přidání podpory pro trigonometrické operace Tan a Atan.

ELU

Přidání podpory atributu alpha v opu ELU

Konvoluce

Aktualizace algoritmů automatického Convolution odsazení za účelem vytvoření symetrického odsazení s nejlepším úsilím na procesoru, aniž by to ovlivnilo konečné výstupní hodnoty konvoluce. Tato aktualizace zvyšuje rozsah případů, které by mohly být pokryty rozhraním MKL API, a zlepšuje výkon, například ResNet50.

Výchozí pořadí argumentů

Ve vlastnosti argumentů v rozhraní API pythonu CNTK došlo k zásadní změně. Výchozí chování bylo aktualizováno tak, aby vracelo argumenty v pořadí pythonu místo v pořadí jazyka C++. Tímto způsobem vrátí argumenty ve stejném pořadí, v jakém jsou předány do operačních prostředí. Pokud chcete stále získat argumenty v pořadí C++, můžete jednoduše přepsat globální možnost. Tato změna by měla mít vliv jenom na následující operace: Times, TransponeTimes a Gemm(internal).

Opravy chyb

  • Aktualizace dokumentu pro konvoluční vrstvu tak, aby zahrnovala argumenty seskupení a dilace
  • Přidali jsme vylepšené ověřování vstupu pro konvoluci skupin.
  • Aktualizace LogSoftMax , aby používala číselněji stabilní implementaci.
  • Byla opravena nesprávná hodnota přechodu shromáždit operaci.
  • Přidání ověření uzlu None v nahrazení klonování Pythonu
  • Přidání ověření osy kanálu odsazení v konvoluci
  • Přidání CNTK nativního výchozího protokolovacího nástroje lotusIR pro opravu chyby Pokus o použití DefaultLogger při načítání některých modelů ONNX.
  • Přidání správné inicializace pro ONNX TypeStrToProtoMap.
  • Aktualizace pythonu doctest pro zpracování jiného formátu tisku pro novější verzi numpy(verze >= 1.14).
  • Oprava sdružování (cpu) pro vytvoření správných výstupních hodnot, když je jádro na vycpané vstupní buňky.

ONNX

Aktualizace

  • Aktualizace CNTK onnx import/export pro použití specifikace ONNX 1.2
  • Hlavní aktualizace způsobu zpracování dávkových a sekvenčních os při exportu a importu V důsledku toho se složité scénáře a hraniční případy zpracovávají přesně.
  • Aktualizace exportu a importu CNTK ONNX BatchNormalization na nejnovější specifikaci.
  • Přidání domény modelu do exportu modelu ONNX
  • Vylepšené zasílání zpráv o chybách při importu a exportu modelů ONNX
  • Aktualizace DepthToSpace a SpaceToDepth operace odpovídající specifikaci ONNX pro permutaci pro způsob umístění rozměru hloubky jako rozměr bloku.
  • Přidání podpory exportu alpha atributu v ELU onnx op.
  • Významné přepracování do a Pooling exportuConvolution. Na rozdíl od dříve tyto operace nevyexportují explicitní Pad operaci v žádné situaci.
  • Zásadní revize exportu a importu ConvolutionTranspose . Atributy, jako output_shapeje , output_paddinga pads jsou plně podporovány.
  • Přidání podpory pro CNTK StopGradient jako no-op.
  • Přidání podpory ONNX pro TopK op.
  • Přidání podpory ONNX pro operace sekvence: sequence.slice, sequence.first, sequence.last, sequence.reduce_sum, sequence.reduce_max, sequence.softmax. Pro tyto operace není nutné rozšířit specifikace ONNX. CNTK exportér ONNX pouze vytváří výpočetní equavalentní grafy pro tyto sekvenční operace.
  • Přidání úplné podpory pro Softmax op.
  • CNTK všesměrové vysílání kompatibilní se specifikací ONNX.
  • Zpracování to_batch, to_sequence, unpack_batch, operace sequence.unpack v CNTK vývozce ONNX
  • Testy ONNX pro export testovacích případů ONNX pro další sady nástrojů pro spuštění a ověření.
  • Opravili jsme Hardmax//SoftmaxLogSoftmax import/export.
  • Přidali jsme podporu pro Select export provozu.
  • Přidání podpory importu a exportu pro několik trigonometrických operací
  • Aktualizace podpory CNTK pro op ONNX MatMul
  • Aktualizace podpory CNTK pro op ONNX Gemm
  • Aktualizace exportu a importu operací ONNX MeanVarianceNormalization CNTK na nejnovější specifikaci.
  • Aktualizace exportu a importu operací ONNX LayerNormalization CNTK na nejnovější specifikaci.
  • Aktualizace exportu a importu operací ONNX PRelu CNTK na nejnovější specifikaci.
  • Aktualizace exportu a importu operací ONNX Gather CNTK na nejnovější specifikaci.
  • Aktualizace exportu a importu operací ONNX ImageScaler CNTK na nejnovější specifikaci.
  • Aktualizace exportu a importu operací ONNX Reduce CNTK na nejnovější specifikaci.
  • Aktualizace exportu a importu operací ONNX Flatten CNTK na nejnovější specifikaci.
  • Přidání podpory CNTK pro op ONNX Unsqueeze

Chyby nebo menší opravy:

  • Aktualizace operace LRN tak, aby odpovídala specifikaci ONNX 1.2, kde size má atribut sémantiku průměru, nikoli poloměr. Přidání ověření, pokud je velikost jádra LRN větší než velikost kanálu.
  • Aktualizace Min/Max implementace importu pro zpracování variadických vstupů
  • Opravili jsme možné poškození souboru při opětovném ukládání na existující soubor modelu ONNX.

Podpora .Net

Knihovna Cntk.Core.Managed byla oficiálně převedena na .Net Standard a podporuje aplikace .Net Core a .Net Framework v Windows i Linuxu. Od této verze by vývojáři .NET měli být schopni obnovit CNTK balíčky NuGet pomocí nového souboru projektu stylu sady .Net SDK s formátem správy balíčků nastaveným na PackageReference.

Následující kód jazyka C# teď funguje na Windows i Linuxu:

 >>> 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;

Například jednoduše přidání klauzule ItemGroup do souboru .csproj aplikace .Net Core stačí: >>>>>>>>>>>>netcoreapp2.1>>> x64>>>>>>>>>>>>>>>>>>>>>

Chyby nebo menší opravy:

  • Opravili jsme problémy s převodem řetězce a znaku jazyka C# na nativní problémy s převodem WSTR a WTF v Linuxu.
  • Opravili jsme vícebajtové a široké převody znaků v základu kódu.
  • Byl opraven mechanismus balíčku NuGet, který se má zabalit pro .Net Standard.
  • Opravili jsme problém s únikem paměti ve třídě Value v rozhraní API jazyka C#, kde se při zničení objektu nepovolala funkce Dispose.