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
aSpaceToDepth
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 vELU
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, jakooutput_shape
je ,output_padding
apads
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
//Softmax
LogSoftmax
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.