From 9653ab402de47462de76bc604f9352cdbcecdc6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrzej=20Kot=C5=82owski?= Date: Thu, 23 Dec 2021 13:38:52 +0100 Subject: [PATCH 01/10] Add microbenchmark for FC + add fusion (#20780) + utils scripts to run it --- benchmark/python/dnnl/fc_add.py | 164 ++++++++++++++++++++++++ benchmark/python/dnnl/run.sh | 54 ++++++++ benchmark/python/dnnl/run_per_thread.sh | 82 ++++++++++++ 3 files changed, 300 insertions(+) create mode 100644 benchmark/python/dnnl/fc_add.py create mode 100755 benchmark/python/dnnl/run.sh create mode 100755 benchmark/python/dnnl/run_per_thread.sh diff --git a/benchmark/python/dnnl/fc_add.py b/benchmark/python/dnnl/fc_add.py new file mode 100644 index 000000000000..8bdefd39ef25 --- /dev/null +++ b/benchmark/python/dnnl/fc_add.py @@ -0,0 +1,164 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +import time +import gc +import sys +import mxnet as mx +from mxnet.gluon import nn +from mxnet.contrib import quantization + +#shape, num_hidden: +sizes = [ + (( 1, 224), 512), + (( 1, 224), 4096), + (( 16, 1024), 1024), + (( 32, 4096), 1024), + (( 32, 4096), 4096), + ((512, 512), 4096)] + +rounds = 1000 +warmup = 10 + +test_header = "--no_test_header" not in sys.argv +table_header = "--no_table_header" not in sys.argv +table_left_colums = "--no_size_column" not in sys.argv +dump_graph = "--dump_graph" in sys.argv + +def dump_graph_fn(net, postfix): + if dump_graph: + net.export("/tmp/fc_add_" + postfix) + +def operator_string(elemwise_add): + return 'elemwise_add' if elemwise_add else 'npi_add' + +def print_header(header): + print("\n") + print(header if test_header else "", "\n") + if table_header: + if table_left_colums: + print("| Shape | Hidden | Mean [ms] |" ) + print("|------------:|-------:|----------:|" ) + else: + print(" Mean [ms] |" ) + print("----------:|" ) + +def print_value(shape, hidden, mean): + if table_left_colums: + print("| ({:4},{:4}) | {:6} | {:9.3f} |".format(shape[0], shape[1], hidden, mean)) + else: + print(" {:9.3f} |".format(mean)) + + +def measure(net, data0, data1, data2, shape, nhid): + mx.nd.waitall() + gc.collect() + gc.disable() + for i in range(rounds + warmup): + if i == warmup: + start_time = time.time() + o = net(data0, data1, data2) + o.wait_to_read() + end_time = time.time() + run_time = (end_time - start_time) + print_value(shape, nhid, 1000 * run_time / rounds) + gc.enable() + + +class FCWithSum(nn.HybridBlock): + def __init__(self, num_in, num_hidden, elemwise_add, **kwargs): + super(FCWithSum, self).__init__(**kwargs) + self.fc0 = nn.Dense(units=num_hidden, in_units=num_in) + self.fc1 = nn.Dense(units=num_hidden) + self.elemwise_add = elemwise_add + + def forward(self, data0, data1, data2): + _fc0 = self.fc0(data0) + _fc1 = self.fc1(data1) + if self.elemwise_add: + _sum0 = mx.nd.elemwise_add(data2.as_nd_ndarray(), _fc0.as_nd_ndarray()).as_np_ndarray() + _sum1 = mx.nd.elemwise_add(_fc1.as_nd_ndarray(), _sum0.as_nd_ndarray()).as_np_ndarray() + else: + _sum0 = data2 + _fc0 + _sum1 = _fc1 + _sum0 + return _sum1 + +def benchmark_float(elemwise_add): + header = operator_string(elemwise_add) + ', float' + print_header(header) + for shape, nhid in sizes: + net = FCWithSum(shape[1], nhid, elemwise_add) + net.initialize() + net.hybridize(static_alloc=True, static_shape=True) + data0 = mx.np.random.uniform(size=shape, low=-1.0, high=1.0) + data1 = mx.np.random.uniform(size=shape, low=-1.0, high=1.0) + shape2 = (shape[0], nhid) + data2 = mx.np.random.uniform(size=shape2, low=-1.0, high=1.0) + net.optimize_for(data0, data1, data2, backend='ONEDNN') + measure(net, data0, data1, data2, shape, nhid) + dump_graph_fn(net, operator_string(elemwise_add) + '_float') + +class CalibIter(mx.io.DataIter): + def __init__(self, batch, data_shape, batch_size): + super(CalibIter, self).__init__(batch_size) + self.label_shape = (batch_size,) + self.data_shape = data_shape + if isinstance(data_shape, tuple): + self.provide_data = [('data', data_shape)] + else: + self.provide_data = data_shape + self.provide_label = [] + self.batch = batch + def __iter__(self): + yield self.batch + +def benchmark_int8(quantize_mode, quantize_granularity, elemwise_add): + header = operator_string(elemwise_add) + ', mode = ' + quantize_mode + \ + ', granularity = ' + quantize_granularity + print_header(header) + for shape, nhid in sizes: + net = FCWithSum(shape[1], nhid, elemwise_add) + net.initialize() + net.hybridize(static_alloc=True, static_shape=True) + data0 = mx.np.random.uniform(size=shape, low=-1.0, high=1.0) + data1 = mx.np.random.uniform(size=shape, low=-1.0, high=1.0) + shape2 = (shape[0], nhid) + data2 = mx.np.random.uniform(size=shape2, low=-1.0, high=1.0) + data = mx.gluon.data.ArrayDataset(data0, data1, data2) + calib_data = mx.gluon.data.DataLoader(data, batch_size=1) + net = quantization.quantize_net(net, + device=mx.cpu(), + exclude_layers=None, + exclude_operators=None, + calib_mode='naive', + calib_data=calib_data, + num_calib_batches=1, + quantize_mode=quantize_mode, + quantize_granularity=quantize_granularity + ) + net.hybridize(static_alloc=True, static_shape=True) + measure(net, data0, data1, data2, shape, nhid) + dump_graph_fn(net, operator_string(elemwise_add) + \ + '_' + str(quantize_mode) + '_' + str(quantize_granularity)) + +for elemwise_add in [True, False]: + benchmark_float(elemwise_add) + +for quantize_mode in ['smart', 'full']: + for quantize_granularity in ['tensor-wise', 'channel-wise']: + for elemwise_add in [True, False]: + benchmark_int8(quantize_mode, quantize_granularity, elemwise_add) diff --git a/benchmark/python/dnnl/run.sh b/benchmark/python/dnnl/run.sh new file mode 100755 index 000000000000..63379b4ca4c1 --- /dev/null +++ b/benchmark/python/dnnl/run.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Script for running python benchmark with properly setting OMP prarameters for it + +check_parametrs() { + if [ "$#" -eq 0 ] ; then + echo "Please give python script to run as parameter." + echo "Optionally you can give number of threads to use and python scripts parameters:" + echo " `basename "$0"` [num_threads] python_script [python script parameters]" + exit + fi +} + +check_parametrs $@ + +NUM_SOCKET=`lscpu | grep 'Socket(s)' | awk '{print $NF}'` +CORES_PER_SOCKET=`lscpu | grep 'Core(s) per socket' | awk '{print $NF}'` +NUM_CORES=$((CORES_PER_SOCKET * NUM_SOCKET)) + +integer_reg='^[0-9]+$' +if [[ $1 =~ $integer_reg ]] ; then + if (($1 > $NUM_CORES)); then + echo >&2 + echo "WARNING: given number of threads = $1" \ + " is greater than number of physical cores = $NUM_CORES." >&2 + echo >&2 + fi + NUM_CORES=$1 + shift + check_parametrs $@ +fi + +CORES={0}:${NUM_CORES}:1 + +INSTRUCTION="OMP_NUM_THREADS=${NUM_CORES} OMP_PROC_BIND=TRUE OMP_PLACES=${CORES} python3 -u $@" +echo $INSTRUCTION >&2 +eval $INSTRUCTION diff --git a/benchmark/python/dnnl/run_per_thread.sh b/benchmark/python/dnnl/run_per_thread.sh new file mode 100755 index 000000000000..c766429b341f --- /dev/null +++ b/benchmark/python/dnnl/run_per_thread.sh @@ -0,0 +1,82 @@ +#!/bin/bash + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# Script for running python benchmark against number of used OMP threads + + +help_and_exit() { + echo "Usage:" + echo " `basename "$0"` [start_num_threads step_num_threads end_num_threads] python_script [python script parameters]" + echo "Number of threads range parameters and python script are optional." + exit +} + +if [ "$#" -eq 0 ] ; then + help_and_exit +fi + +NUM_SOCKET=`lscpu | grep 'Socket(s)' | awk '{print $NF}'` +CORES_PER_SOCKET=`lscpu | grep 'Core(s) per socket' | awk '{print $NF}'` +NUM_CORES=$((CORES_PER_SOCKET * NUM_SOCKET)) + +NT_START=1 +NT_STEP=1 +NT_END=$NUM_CORES + +integer_reg='^[0-9]+$' +signed_integer_reg='^[+-]*[0-9]+$' +if [[ $1 =~ $integer_reg ]] ; then + if [[ $2 =~ $signed_integer_reg ]] && [[ $3 =~ $integer_reg ]]; then + NT_START=$1 + NT_STEP=$2 + NT_END=$3 + shift 3 + if [ "$#" -eq 0 ] ; then + help_and_exit + fi + else + echo "Provide 3 numbers for threads range: start, step and the end." + help_and_exit + fi +fi + +NT_SEQUENCE=`seq $NT_START $NT_STEP $NT_END` +if [ -z "$NT_SEQUENCE" ]; then + echo "Given threads range produce empy sequence." + help_and_exit +else + echo "Start python script $1 for following number of threads:" >&2 + echo $NT_SEQUENCE >&2 +fi + +RUN_SCRIPT=`dirname "$0"`/run.sh +for NT in $NT_SEQUENCE; +do + TMP_FILE=/tmp/_result_${NT}.txt + echo 1>${TMP_FILE} + if [[ $NT -eq $NT_START ]]; then + echo "NUM_THREADS = $NT" 1>>${TMP_FILE} + $RUN_SCRIPT $NT $@ 1>>${TMP_FILE} + else + echo " $NT" 1>>${TMP_FILE} + $RUN_SCRIPT $NT $@ --no_size_column --no_test_header 1>>${TMP_FILE} + fi + TMP_FILES+=" ${TMP_FILE}" +done +paste -d "" ${TMP_FILES} From caf6901f9e4f32ef108d02b63aaed45c36d27b72 Mon Sep 17 00:00:00 2001 From: Sheng Zha Date: Fri, 24 Dec 2021 11:05:13 -0500 Subject: [PATCH 02/10] [KEYS] remove keys on master branch (#20764) * update keys on master branch Signed-off-by: Sheng Zha * remove KEYS Signed-off-by: Sheng Zha --- KEYS | 1077 ---------------------------------------------------------- 1 file changed, 1077 deletions(-) delete mode 100644 KEYS diff --git a/KEYS b/KEYS deleted file mode 100644 index 1985d9a0ed25..000000000000 --- a/KEYS +++ /dev/null @@ -1,1077 +0,0 @@ -This file contains the PGP keys of various developers. -Please don't use them for email unless you have to. Their main -purpose is code signing. - -Examples of importing this file in your keystore: - gpg --import KEYS.txt - (need pgp and other examples here) - -Examples of adding your key to this file: - pgp -kxa and append it to this file. - (pgpk -ll && pgpk -xa ) >> this file. - (gpg --list-sigs - && gpg --armor --export ) >> this file. - ------------------------------------------------------------------------------------ -pub 4096R/D3541808 2014-01-09 -uid [ultimate] Suneel Marthi (CODE SIGNING KEY) -sig 3 D3541808 2014-01-09 Suneel Marthi (CODE SIGNING KEY) -sub 4096R/AF46E2DE 2014-01-09 -sig D3541808 2014-01-09 Suneel Marthi (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- -Comment: GPGTools - https://gpgtools.org - -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 -kD2o/5GKWS5QkSUEUXXY1oDiLg== -=f8kJ ------END PGP PUBLIC KEY BLOCK----- -pub rsa4096 2017-07-12 [SC] - 406DCA257CD2BE237B79AE6BC9D353CA4AFF2E24 -uid [ultimate] Ly Nguyen (CODE SIGNING KEY) -sig 3 C9D353CA4AFF2E24 2017-07-12 Ly Nguyen (CODE SIGNING KEY) -sub rsa4096 2017-07-12 [E] -sig C9D353CA4AFF2E24 2017-07-12 Ly Nguyen (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -kRsGTxyO+fQ6/Q== -=FuXU ------END PGP PUBLIC KEY BLOCK----- -pub rsa4096 2017-08-14 [SC] - AA3EBCC3E65A768AE3D2A64B8EF47B8720E8C549 -uid [ultimate] Naveen Swamy (CODE SIGNING KEY) -sig 3 8EF47B8720E8C549 2017-08-14 Naveen Swamy (CODE SIGNING KEY) -sub rsa4096 2017-08-14 [E] -sig 8EF47B8720E8C549 2017-08-14 Naveen Swamy (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -FuSamX64+S6T8IwAuP9U -=KRiV ------END PGP PUBLIC KEY BLOCK----- -pub 4096R/C65AF308 2017-08-15 [expires: 2021-08-15] -uid [ultimate] Sandeep Krishnamurthy -sig 3 C65AF308 2017-08-15 Sandeep Krishnamurthy -sub 4096R/3D0D60F6 2017-08-15 [expires: 2021-08-15] -sig C65AF308 2017-08-15 Sandeep Krishnamurthy - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -6gcqWf5YDM+zv+yvsafmug== -=my1/ ------END PGP PUBLIC KEY BLOCK----- -pub 4096R/703DF31B 2017-10-16 -uid Chris Olivier (CODE SIGNING KEY) -sig 3 703DF31B 2017-10-16 Chris Olivier (CODE SIGNING KEY) -sub 4096R/7B90EEF2 2017-10-16 -sig 703DF31B 2017-10-16 Chris Olivier (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -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 -GZZVNUU0hQYfulYDY5E8fJ4Olzpf5OE= -=WmLB ------END PGP PUBLIC KEY BLOCK----- -pub 4096R/C622DF82 2017-11-29 -uid Chris Olivier (CODE SIGNING KEY) -sig 3 C622DF82 2017-11-29 Chris Olivier (CODE SIGNING KEY) -sub 4096R/A70D0AA4 2017-11-29 -sig C622DF82 2017-11-29 Chris Olivier (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1 - -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 -eXjHA3OoJ8lc9pGCShw56YNir2ieQ57S -=dkF7 ------END PGP PUBLIC KEY BLOCK----- -pub rsa4096 2018-01-28 [SC] - 7302629A6791AC2C3593B9A0015ED8A29C815704 -uid [ultimate] Haibin Lin (CODE SIGNING KEY) -sig 3 015ED8A29C815704 2018-01-28 Haibin Lin (CODE SIGNING KEY) -sub rsa4096 2018-01-28 [E] -sig 015ED8A29C815704 2018-01-28 Haibin Lin (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -G4kKPLx5+UhNtHsaNA== -=ZoTi ------END PGP PUBLIC KEY BLOCK----- -pub rsa4096 2018-02-07 [SC] - F42C1A6E634C105E8D985105CA751254E97B9FE4 -uid [ultimate] Yizhi Liu -sig 3 CA751254E97B9FE4 2018-02-07 Yizhi Liu -sub rsa4096 2018-02-07 [E] -sig CA751254E97B9FE4 2018-02-07 Yizhi Liu - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -=E4W5 ------END PGP PUBLIC KEY BLOCK----- - -pub rsa4096 2018-04-26 [SC] - 6E678509715E3B63CDB2234FF8F33A117CC18E95 -uid [ultimate] Anirudh Subramanian -sig 3 F8F33A117CC18E95 2018-04-26 Anirudh Subramanian -sub rsa4096 2018-04-26 [E] -sig F8F33A117CC18E95 2018-04-26 Anirudh Subramanian - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -hSr9ITOiZCc= -=VCxR ------END PGP PUBLIC KEY BLOCK----- - -pub rsa4096 2018-08-23 [SC] - CB9164C76A803D861DE16E5B91052D922E28A38F -uid [ultimate] Sheng Zha (szha) -sig 3 91052D922E28A38F 2018-08-23 Sheng Zha (szha) -sub rsa4096 2018-08-23 [E] -sig 91052D922E28A38F 2018-08-23 Sheng Zha (szha) - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -3Os= -=XL0V ------END PGP PUBLIC KEY BLOCK----- - -pub rsa2048 2019-02-15 [SC] [expires: 2021-02-14] - 0812952358B12DC30536E7E0C06916C3AB88ABFE -uid [ultimate] Qing Lan -sig 3 C06916C3AB88ABFE 2019-02-15 Qing Lan -sub rsa2048 2019-02-15 [E] [expires: 2021-02-14] -sig C06916C3AB88ABFE 2019-02-15 Qing Lan - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -44liPzisQFRxRFOwEubvmw== -=dQvb - ------END PGP PUBLIC KEY BLOCK----- -pub rsa4096 2019-05-15 [SC] - 228ADD932CB218723E61D09E043071126325F0EC -uid [ultimate] Zach Kimberg -sig 3 043071126325F0EC 2019-05-15 Zach Kimberg -sub rsa4096 2019-05-15 [E] -sig 043071126325F0EC 2019-05-15 Zach Kimberg - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -=z8mO ------END PGP PUBLIC KEY BLOCK----- -pub 4096R/79B0F222 2019-09-03 -uid Tao Lv (CODE SIGNING KEY) -sig 3 79B0F222 2019-09-03 Tao Lv (CODE SIGNING KEY) -sub 4096R/E1308559 2019-09-03 -sig 79B0F222 2019-09-03 Tao Lv (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v2.0.22 (GNU/Linux) - -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 -AccomJAgVJoFPw== -=hhsZ ------END PGP PUBLIC KEY BLOCK----- -pub rsa4096 2019-12-13 [SC] - ABD3F3423F41245A6E5E065D7273634B104F135F -uid [ultimate] Przemysław Krzysztof Trędak (CODE SIGNING KEY) -sig 3 7273634B104F135F 2019-12-13 Przemysław Krzysztof Trędak (CODE SIGNING KEY) -sub rsa4096 2019-12-13 [E] -sig 7273634B104F135F 2019-12-13 Przemysław Krzysztof Trędak (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -=m8Mt ------END PGP PUBLIC KEY BLOCK----- -pub 4096R/DF20B044 2020-06-16 -uid Ciyong Chen (CODE SIGNING KEY) -sig 3 DF20B044 2020-06-16 Ciyong Chen (CODE SIGNING KEY) -sub 4096R/E918632E 2020-06-16 -sig DF20B044 2020-06-16 Ciyong Chen (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v2.0.22 (GNU/Linux) - -mQINBF7ojeABEADX4yGle/XEyjFhDYDAXklF1B+anNycuZONa7lLPGmvEz4Tn5Kt -KuQMT/LAUagz4ZoHMLWBmVHW/Ri7PVILV7LRovxNPKZyTKVdh2wdGmQTwew437Mh -+VDkZqv7b8tSgp+0ITHl/yeBGO1iiDf/epNA8llChNwj0SyV9pmlN0fSIAf1HNdV -gyn+wVSEPdCBzNLPZUJo52qx0RH4uUl1alNR58w3QzJcXIxl92bBR33OnX5VOhkw -sKtDc5E5cT9wPYF0mEA/lGJGStoSjz4JnLzP86RxkmGKCagNxqSvxpTeQB1mDFY8 -iNVkapYYkgliGqQ/dXfKwf6iyifsxZxKFYvwbDqOPjwx6cRHjC5Caz+snYtD5bsB -4HEtXg3ISbNNWwlP182nnGJRyoo/FrASlgVkzwRP+ocTSMKPAGKsyHF1WQhFLuWZ -O2HFFxTgcCHEZMoNiF62dcDYEsaO0oDUCGuwvCwU//x8sxv+UY4UqZfiLUN2CxnL -3xTM5MrO1TVV4R6YtqAHSBD2cxB1mayd3O7YW5P2v72ctK6mmjDIY9WFqLjuZJvn -HO6j8iKHRhqQA2qRj19m4jH28+IiUOeL0qTl0ZGq7PEFHOEkq1b0uwpw1HDuISi0 -HXdlwKs/1hVwv66HVKVBz0FJNWC+ij5l9de3H7mc/xio2nDzU/7iFT3gUwARAQAB -tDdDaXlvbmcgQ2hlbiAoQ09ERSBTSUdOSU5HIEtFWSkgPGNpeW9uZy5jaGVuQGFw -YWNoZS5vcmc+iQI3BBMBCgAhBQJe6I3gAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4B -AheAAAoJELa/hk/fILBEZIEP/1MjsnXm/cN79daGmFO+EBspLF72dX6J+qgdvgZd -HLG96d/tB2WmV6WKyEFfHZEbvoND25hXylJOXc85lszaaGHfZN1Yg/kCTjkLHIP0 -wKx7yAGVliYj/yDI67wkJewk9zjQfo3ns9S71rwML09+8PShvSmOK/eAnz607vfx -Y9U4AHkSErp3xA1+X11M7n3mUy2+Hto6ioTZNk30+S+GL9DbkmEOzSNseziI01HP -KbFYq2SYwn7gaDnbnuppaxDar2JBm9lAUvNo2EQtKEqNnXnfS6UJ1H/fhDXyiHto -BWo5kk1c+RyZwk3fUP9clyCH6Mq1PFnFE8JwM0lUhTY3EGTI5AI1G2ML8rfhEpYU -KYQr6fa+V1g7Tghc1w441j1WQs0akgj3iPuQJTot2e67qwz59U2cMO+ZP8RHFAHO -FCcskpK4fHCY7X8CkutAJnV4j8KCaR9bxr2mjQ5N5OmAyIqSfARucShA40sqbfIQ -WjnH/u+dZMA42x1yAn9PUOvyGok4zovD7x6Uvb7fww70QBe7nwgNKdAYd0CyLapt -UCsfWfco9pKBZf0kL/2c5zwxowObYDuOYO6wjFNfF+oC/aaHgbfmEg2bles2aYyi -dgbcAuzY/U5HXmVDhD2S57UpJoLEa2LPyUsZiyYUWC2boirNB9kZVd0lmQAOiPwR -mK2TuQINBF7ojeABEADQuZwV6+mZIyb+GvvPNOXkzZ555QGaYdXpclG3t186bSIw -euP1GmEIMnKz1SKLKaGZdoqr13I44dSIOYBuixwJITsHc0p38OYsW93cjdvE/SQ6 -o+PW2/4DQgRYbEMoDM0heOpgTgwvrvFWxli6oy0QU/lmsIc1jsA+PH6XmuEsxLRj -J6SGZC3P3px6w+KIY9XSub24daDxNGMsd0+f4PNd6brLJpehMas0we10jTDjcqPA -WqV6Lh9+/JH+VN65jRHYdV+zOz+oNx0U6mjjRmhFu7hWooCH1C6y75dE00L31D9c -H+PAPvWUWwodwzODjEmpdFwtaOCoM8XSIXQ+4EO57fkyIEkM3xildW+ISU4sI2yP -9ANCjFr4OH8/bp1lJCfNCn3dB/KUuYIDGVA/4BGYS4pOqy4fvmWiG705q1kYP5f+ -Di0DS/JS97Jtn5uD2sKiqKv4uj3LrkphJ1Ek896Vr0uQ30w176fDLE7Ru+ioXmeL -CD7KNaSe8s1eVnaFdjIXgo4ELh8h4frDzoSxQU6omf6QIuld15TaeQjeGIckfkAE -JRrnxM88C10gfdpiLAebBsXLRx+DKFYjj8vkw/fsx7R1s9Fl1EjofaoI0D9/GvmS -meFfJBkwZzzwyV6AFcQY+OiqZ4bZ0rlUdU4t+yioB9jgYymQtsxju/P8E0xoaQAR -AQABiQIfBBgBCgAJBQJe6I3gAhsMAAoJELa/hk/fILBEW90P/ioPSCtu93AytJIZ -vOb7NWe9B/IA8nn/nsUhYuowLRb7zGrcowDF3Sp7MhWVGGlD9VN4bm35u4OuK0Uj -6eyotrVGrEEaHoZbRK/wd3ZuLXM4C+SslDQ6DDz5dKmBuazLkCRSM4QbrnWc9Dy9 -8mg4LhAGf+DeNypNuKJVWLxHMNy9/7C7R0ikiaQzIztXe/AvVPMXXlFq7m32lPkJ -Ek69AqW+cNRneOxG0y2qNf8YhuQA0WPrUAYaOV6z0KprDjcVBMqPEHGuASsNz4pJ -tJtMC/HADstnsA60SsgPtmXR3gKntd5Zuapd2s8koqrzVyOardKwyCgggW4TfzO/ -ZAxPGB+Fhy6iHWtsNpfz4S5AFfjY3j/TqQSbDvyd7gl2gcWVgL5TzOsK9PpCKR4O -/tsdnUnN6efdVjlDM4BlylbRLIxKMQ/wAXGxJo2i/blJPeIMicgRNQsgN/v4GKny -lecb5CJWE/kNPasRBXC4eJElO1hE6iQ7N4Si5tyMDx9Ypt8sYP2ZTQY18ZB0JiYp -ljW9AqQU1dUSRhNFGtrrzRG+eC0CQ8PaEl+K0kGxiUFFb1ocSvzdvc0BAH4s+zJU -AQAs0D5H4b+5HBUfG8J4Tz9H5Af5D6qHxOIAiNr83wAXht6O3aoi6a0L38fckxUW -0QaeS4PIKmE5b8gFJ83tOE+T0Hnm -=80Bp ------END PGP PUBLIC KEY BLOCK----- -pub rsa4096 2020-09-22 [SC] - EA80ACFDC243E09040508A41D1FEF450EF663114 -uid [ultimate] Sam Skalicky (CODE SIGNING KEY) -sig 3 D1FEF450EF663114 2020-09-22 Sam Skalicky (CODE SIGNING KEY) -sub rsa4096 2020-09-22 [E] -sig D1FEF450EF663114 2020-09-22 Sam Skalicky (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -sg39G6a6oDc558FLCA1msFt5Azo= -=yiqe ------END PGP PUBLIC KEY BLOCK----- -pub rsa4096/0x5CC80E020B26CA03 2021-01-20 [SC] [expires: 2021-07-19] - Key fingerprint = 126F 8E1A 1220 4B31 D88B 0381 5CC8 0E02 0B26 CA03 -uid [ultimate] Leonard Lausen (CODE SIGNING KEY) -sig 3 0x5CC80E020B26CA03 2021-01-20 Leonard Lausen (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- - -mQINBGAIQ6gBEADTggOfcIAm4chuo74kZZ+pBbXaxI63CbGrxS99qgrDX47XmL7M -ccH2p1CMd29t5lWKxsbj6KDS7DzaV+Gv0h3V1CFrL2X+MMCeOd13L917jEqWjUSy -93HEB52tBxn4foHWntMJamCoKD3l1Bjr1jz8VytL8A8VwLKu6FCwRU1ioiY4ltnV -CHJnz45VAJFya5aEDI3i/9J5ayP5zxz57scQz3pJ9GZBVnSsyGgh9k+Z8TNygeb+ -86huJWHfERDqiJg1ydy5el24AnXDS+ilxD7NYJ2J6z9IvSxT2mshO8RNHm863EN7 -mph1amk8cxm12GAqCAiemSoAWK7BTN4gVLovYO1sRUvoUPWd0dWYmf/N3D8p40uJ -NgxZOaQQvibQPhv/Wf+xrUqvaJJul272vMVSeh/PEXUWZ6QWMfDynYwRsAPnrfAG -20gnX/GZ5ZJB7fG5i9ObUWusA42/jMWkXtVs3dAbD7M5k5D1xOgb2zCqRLa5G2kx -KjPJZoM2bNW2bkMsa0O7+0ogr39yUoHs90pwEX8wfHOLQLD55Yc0WMLvnZMSu5fD -D1hEebJhf8NaVjYyrUn4YqpFx7PT48T4gRk6oepWJvAY0626nUhxMhOJ4jRK15Uv -x6/GV5T7nuln3t4v2LwLcm9To20S5nTysukC/ZWehKfyTcBXw9765gHMnwARAQAB -tDVMZW9uYXJkIExhdXNlbiAoQ09ERSBTSUdOSU5HIEtFWSkgPGxhdXNlbkBhcGFj -aGUub3JnPokCVAQTAQoAPhYhBBJvjhoSIEsx2IsDgVzIDgILJsoDBQJgCEOoAhsD -BQkA7U4ABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEFzIDgILJsoDmqcP/3co -hKXqNeDySBZ5OPxlzGjD0SxSKBtiWmxYBPdzNVYCwbVsl8soeaBAb6pKsuxHuFnd -uymy+QDOV7aXf3WuYDNy0LKwnfNbz8fD4dzMXk12+8wrx2IZpL97lb1bN//zBmIy -PXpfcfe0FvOc0NN4qn8y1HuIzAoIbK7O6NnIkG469lxWK3WspsWWe6sOcKSbDKSe -uXKFNimn7dVhqbIxw5H+BMIXubyD58wSGUJEYWNvHxHKXz9gFftmYCnlPwEd9v+C -qHYXVXiBsMC4W/BqPv+sw3E7Lwn9NlGxHauoxucSvQazsrinfgTu73cjEqQlLeUd -NCNpTojMUFJqr4YkXFDK7oTmrpKv0wZXh6NQogy7mh9zzL6YQoQB9gABJbSt6exZ -gsx3cn9Gd2Ptp0FwvcGPZFqjJ5mUEUv8fbKpPOEHsmtKO/rZ3LjNYBGYh8xmiU7A -nVee1UYkGaG5x2TfIrBoRJ/vIN6ZQ5QYD5iYH2TYebbH+w0FmJ79DZ5mbHHRCYG6 -mpeZ4OrvobSYYrFcMxHwzbFKqS1tbpbPHHYLjIrvl50rhrWgUaIrV4uZJSEQHl76 -9e/mkh+RJ0TASEETTWbNXwznB8yNL2MvfxQQ+ogxLIiyw3v8xqwCK/NSdVjqnZvK -d+K3IWKQXHwuFIHhHcT5CI1c/2aL1hVhGrhexBQC -=TIzk ------END PGP PUBLIC KEY BLOCK----- -pub rsa4096 2021-09-27 [SC] - 61C9B12002DA9BA1A44D02683A9F7FE20D4D3DEA -uid [ultimate] Zhenghui Jin (CODE SIGNING KEY) -sig 3 3A9F7FE20D4D3DEA 2021-09-27 Zhenghui Jin (CODE SIGNING KEY) -sub rsa4096 2021-09-27 [E] -sig 3A9F7FE20D4D3DEA 2021-09-27 Zhenghui Jin (CODE SIGNING KEY) - ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -fF1nH1ZRQw06zoBoIyvQuM4vykg= -=lW1K ------END PGP PUBLIC KEY BLOCK----- From d0083566ea36622086ef955dbbfe23e3284031b3 Mon Sep 17 00:00:00 2001 From: bgawrych Date: Fri, 24 Dec 2021 17:09:55 +0100 Subject: [PATCH 03/10] remove broken links (#20793) * remove broken links * remove anchor from link Co-authored-by: Bartlomiej Gawrych --- .../getting-started/logistic_regression_explained.md | 2 +- .../python/tutorials/packages/gluon/image/info_gan.md | 4 ++-- python/mxnet/gluon/trainer.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/python_docs/python/tutorials/getting-started/logistic_regression_explained.md b/docs/python_docs/python/tutorials/getting-started/logistic_regression_explained.md index caa2975c634a..d0056e1f624b 100644 --- a/docs/python_docs/python/tutorials/getting-started/logistic_regression_explained.md +++ b/docs/python_docs/python/tutorials/getting-started/logistic_regression_explained.md @@ -92,7 +92,7 @@ After defining the model, we need to define a few more things: our loss, our tra Loss function is used to calculate how the output of the network differs from the ground truth. Because classes of the logistic regression are either 0 or 1, we are using [SigmoidBinaryCrossEntropyLoss](../../api/gluon/loss/index.rst#mxnet.gluon.loss.SigmoidBinaryCrossEntropyLoss). Notice that we do not specify `from_sigmoid` attribute in the code, which means that the output of the neuron doesn't need to go through sigmoid, but at inference we'd have to pass it through sigmoid. You can learn more about cross entropy on [wikipedia](https://en.wikipedia.org/wiki/Cross_entropy). -Trainer object allows to specify the method of training to be used. For our tutorial we use [Stochastic Gradient Descent (SGD)](../../api/optimizer/index.rst#mxnet.optimizer.SGD). For more information on SGD refer to [the following tutorial](https://gluon.mxnet.io/chapter06_optimization/gd-sgd-scratch.html). We also need to parametrize it with learning rate value, which defines the weight updates, and weight decay, which is used for regularization. +Trainer object allows to specify the method of training to be used. For our tutorial we use [Stochastic Gradient Descent (SGD)](../../api/optimizer/index.rst#mxnet.optimizer.SGD). For more information on SGD refer to [the following tutorial](https://d2l.ai/chapter_optimization/sgd.html). We also need to parametrize it with learning rate value, which defines the weight updates, and weight decay, which is used for regularization. Metric helps us to estimate how good our model is in terms of a problem we are trying to solve. Where loss function has more importance for the training process, a metric is usually the thing we are trying to improve and reach maximum value. We also can use more than one metric, to measure various aspects of our model. In our example, we are using [Accuracy](../../api/gluon/metric/index.rst#mxnet.gluon.metric.Accuracy) and [F1 score](../../api/gluon/metric/index.rst#mxnet.gluon.metric.F1) as measurements of success of our model. diff --git a/docs/python_docs/python/tutorials/packages/gluon/image/info_gan.md b/docs/python_docs/python/tutorials/packages/gluon/image/info_gan.md index 3a82855df2d4..5b866432fed2 100644 --- a/docs/python_docs/python/tutorials/packages/gluon/image/info_gan.md +++ b/docs/python_docs/python/tutorials/packages/gluon/image/info_gan.md @@ -19,7 +19,7 @@ # Image similarity search with InfoGAN This notebook shows how to implement an InfoGAN based on Gluon. InfoGAN is an extension of GANs, where the generator input is split in 2 parts: random noise and a latent code (see [InfoGAN Paper](https://arxiv.org/pdf/1606.03657.pdf)). -The codes are made meaningful by maximizing the mutual information between code and generator output. InfoGAN learns a disentangled representation in a completely unsupervised manner. It can be used for many applications such as image similarity search. This notebook uses the DCGAN example from the [Straight Dope Book](https://gluon.mxnet.io/chapter14_generative-adversarial-networks/dcgan.html) and extends it to create an InfoGAN. +The codes are made meaningful by maximizing the mutual information between code and generator output. InfoGAN learns a disentangled representation in a completely unsupervised manner. It can be used for many applications such as image similarity search. This notebook uses the DCGAN example and extends it to create an InfoGAN. ```{.python .input} @@ -112,7 +112,7 @@ train_dataloader = gluon.data.DataLoader(train_data, batch_size=batch_size, shuf ``` ## Generator -Define the Generator model. Architecture is taken from the DCGAN implementation in [Straight Dope Book](https://gluon.mxnet.io/chapter14_generative-adversarial-networks/dcgan.html). The Generator consist of 4 layers where each layer involves a strided convolution, batch normalization, and rectified nonlinearity. It takes as input random noise and the latent code and produces an `(64,64,3)` output image. +Define the Generator model. The Generator consist of 4 layers where each layer involves a strided convolution, batch normalization, and rectified nonlinearity. It takes as input random noise and the latent code and produces an `(64,64,3)` output image. ```{.python .input} diff --git a/python/mxnet/gluon/trainer.py b/python/mxnet/gluon/trainer.py index 0566a734d1ab..afbe3e49aa5a 100644 --- a/python/mxnet/gluon/trainer.py +++ b/python/mxnet/gluon/trainer.py @@ -48,7 +48,7 @@ class Trainer(object): The set of parameters to optimize. optimizer : str or Optimizer The optimizer to use. See - `help `_ + `help `_ on Optimizer for a list of available optimizers. optimizer_params : dict Key-word arguments to be passed to optimizer constructor. For example, From a670f581c96f72eda01e70da7d1dabb9e19dd9ad Mon Sep 17 00:00:00 2001 From: bgawrych Date: Fri, 24 Dec 2021 17:10:25 +0100 Subject: [PATCH 04/10] Avoid redundant memcpy when reorder not in-place (#20746) Co-authored-by: Bartlomiej Gawrych --- src/ndarray/ndarray.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/ndarray/ndarray.cc b/src/ndarray/ndarray.cc index f3073977c9ef..49e1f947f0c5 100644 --- a/src/ndarray/ndarray.cc +++ b/src/ndarray/ndarray.cc @@ -540,13 +540,20 @@ void NDArray::Chunk::Reorder2Default() { dnnl_format_tag_t format = dnnl_mem_->GetDefaultFormat(); dnnl::memory::desc def_desc = dnnl_mem_->GetDesc(format); - dnnl_mem_ptr def_mem(new dnnl::memory(def_desc, CpuEngine::Get()->get_engine())); - dnnl_mem_->ReorderTo(def_mem.get()); CHECK(shandle.size >= def_desc.get_size()); CheckAndAlloc(def_desc.get_size()); - // TODO(zhengda) We need to avoid memory copy here. - memcpy(shandle.dptr, def_mem->get_data_handle(), def_desc.get_size()); + + // oneDNN reorder can't be performed in-place + if (shandle.dptr == dnnl_mem_->GetDataHandle()) { + dnnl_mem_ptr def_mem(new dnnl::memory(def_desc, CpuEngine::Get()->get_engine())); + dnnl_mem_->ReorderTo(def_mem.get()); + memcpy(shandle.dptr, def_mem->get_data_handle(), def_desc.get_size()); + } else { + dnnl_mem_ptr def_mem(new dnnl::memory(def_desc, CpuEngine::Get()->get_engine(), shandle.dptr)); + dnnl_mem_->ReorderTo(def_mem.get()); + } + dnnl_mem_ = nullptr; } From 091102c150576fc07bcc1ad02ac38e34d7cca3d2 Mon Sep 17 00:00:00 2001 From: Joe Evans Date: Fri, 24 Dec 2021 18:49:27 -0800 Subject: [PATCH 05/10] Fix broken download link, reformat download page to make links more clear. (#20794) (#20796) --- .../src/pages/get_started/download.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/static_site/src/pages/get_started/download.md b/docs/static_site/src/pages/get_started/download.md index 4ba00ed9bde9..a562b78419a8 100644 --- a/docs/static_site/src/pages/get_started/download.md +++ b/docs/static_site/src/pages/get_started/download.md @@ -35,23 +35,23 @@ encouraged to contribute to our development version on | Version | Source | PGP | SHA | |---------|-------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------| -| 1.9.0 | [Download](http://www.apache.org/dyn/closer.lua?filename=incubator/mxnet/1.9.0/apache-mxnet-src-1.9.0-incubating.tar.gz&action=download) | [Download](https://downloads.apache.org/incubator/mxnet/1.9.0/apache-mxnet-src-1.9.0-incubating.tar.gz.asc) | [Download](https://downloads.apache.org/incubator/mxnet/1.9.0/apache-mxnet-src-1.9.0-incubating.tar.gz.sha512) | -| 1.8.0 | [Download](httpis://archive.apache.org/dist/incubator/mxnet/1.8.0/apache-mxnet-src-1.8.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.8.0/apache-mxnet-src-1.8.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.8.0/apache-mxnet-src-1.8.0-incubating.tar.gz.sha512) | -| 1.7.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.7.0/apache-mxnet-src-1.7.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.7.0/apache-mxnet-src-1.7.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.7.0/apache-mxnet-src-1.7.0-incubating.tar.gz.sha512) | -| 1.6.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.6.0/apache-mxnet-src-1.6.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.6.0/apache-mxnet-src-1.6.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.6.0/apache-mxnet-src-1.6.0-incubating.tar.gz.sha512) | -| 1.5.1 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.5.1/apache-mxnet-src-1.5.1-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.5.1/apache-mxnet-src-1.5.1-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.5.1/apache-mxnet-src-1.5.1-incubating.tar.gz.sha512) | -| 1.5.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.5.0/apache-mxnet-src-1.5.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.5.0/apache-mxnet-src-1.5.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.5.0/apache-mxnet-src-1.5.0-incubating.tar.gz.sha512) | -| 1.4.1 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.4.1/apache-mxnet-src-1.4.1-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.4.1/apache-mxnet-src-1.4.1-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.4.1/apache-mxnet-src-1.4.1-incubating.tar.gz.sha512) | -| 1.4.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.4.0/apache-mxnet-src-1.4.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.4.0/apache-mxnet-src-1.4.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.4.0/apache-mxnet-src-1.4.0-incubating.tar.gz.sha512) | -| 1.3.1 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.3.1/apache-mxnet-src-1.3.1-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.3.1/apache-mxnet-src-1.3.1-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.3.1/apache-mxnet-src-1.3.1-incubating.tar.gz.sha512) | -| 1.3.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.3.0/apache-mxnet-src-1.3.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.3.0/apache-mxnet-src-1.3.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.3.0/apache-mxnet-src-1.3.0-incubating.tar.gz.sha512) | -| 1.2.1 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.2.1/apache-mxnet-src-1.2.1-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.2.1/apache-mxnet-src-1.2.1-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.2.1/apache-mxnet-src-1.2.1-incubating.tar.gz.sha512) | -| 1.2.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.2.0/apache-mxnet-src-1.2.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.2.0/apache-mxnet-src-1.2.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.2.0/apache-mxnet-src-1.2.0-incubating.tar.gz.sha512) | -| 1.1.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.1.0/apache-mxnet-src-1.1.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.1.0/apache-mxnet-src-1.1.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.1.0/apache-mxnet-src-1.1.0-incubating.tar.gz.sha512) | -| 1.0.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/1.0.0/apache-mxnet-src-1.0.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.0.0/apache-mxnet-src-1.0.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/1.0.0/apache-mxnet-src-1.0.0-incubating.tar.gz.sha512) | -| 0.12.1 | [Download](https://archive.apache.org/dist/incubator/mxnet/0.12.1/apache-mxnet-src-0.12.1-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/0.12.1/apache-mxnet-src-0.12.1-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/0.12.1/apache-mxnet-src-0.12.1-incubating.tar.gz.sha512) | -| 0.12.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/0.12.0/apache-mxnet-src-0.12.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/0.12.0/apache-mxnet-src-0.12.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/0.12.0/apache-mxnet-src-0.12.0-incubating.tar.gz.sha512) | -| 0.11.0 | [Download](https://archive.apache.org/dist/incubator/mxnet/0.11.0/apache-mxnet-src-0.11.0-incubating.tar.gz) | [Download](https://archive.apache.org/dist/incubator/mxnet/0.11.0/apache-mxnet-src-0.11.0-incubating.tar.gz.asc) | [Download](https://archive.apache.org/dist/incubator/mxnet/0.11.0/apache-mxnet-src-0.11.0-incubating.tar.gz.sha512) | +| 1.9.0 | [apache-mxnet-src-1.9.0-incubating.tar.gz](http://www.apache.org/dyn/closer.lua?filename=incubator/mxnet/1.9.0/apache-mxnet-src-1.9.0-incubating.tar.gz&action=download) | [asc](https://downloads.apache.org/incubator/mxnet/1.9.0/apache-mxnet-src-1.9.0-incubating.tar.gz.asc) | [sha512](https://downloads.apache.org/incubator/mxnet/1.9.0/apache-mxnet-src-1.9.0-incubating.tar.gz.sha512) | +| 1.8.0 | [apache-mxnet-src-1.8.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.8.0/apache-mxnet-src-1.8.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.8.0/apache-mxnet-src-1.8.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.8.0/apache-mxnet-src-1.8.0-incubating.tar.gz.sha512) | +| 1.7.0 | [apache-mxnet-src-1.7.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.7.0/apache-mxnet-src-1.7.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.7.0/apache-mxnet-src-1.7.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.7.0/apache-mxnet-src-1.7.0-incubating.tar.gz.sha512) | +| 1.6.0 | [apache-mxnet-src-1.6.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.6.0/apache-mxnet-src-1.6.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.6.0/apache-mxnet-src-1.6.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.6.0/apache-mxnet-src-1.6.0-incubating.tar.gz.sha512) | +| 1.5.1 | [apache-mxnet-src-1.5.1-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.5.1/apache-mxnet-src-1.5.1-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.5.1/apache-mxnet-src-1.5.1-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.5.1/apache-mxnet-src-1.5.1-incubating.tar.gz.sha512) | +| 1.5.0 | [apache-mxnet-src-1.5.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.5.0/apache-mxnet-src-1.5.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.5.0/apache-mxnet-src-1.5.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.5.0/apache-mxnet-src-1.5.0-incubating.tar.gz.sha512) | +| 1.4.1 | [apache-mxnet-src-1.4.1-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.4.1/apache-mxnet-src-1.4.1-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.4.1/apache-mxnet-src-1.4.1-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.4.1/apache-mxnet-src-1.4.1-incubating.tar.gz.sha512) | +| 1.4.0 | [apache-mxnet-src-1.4.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.4.0/apache-mxnet-src-1.4.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.4.0/apache-mxnet-src-1.4.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.4.0/apache-mxnet-src-1.4.0-incubating.tar.gz.sha512) | +| 1.3.1 | [apache-mxnet-src-1.3.1-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.3.1/apache-mxnet-src-1.3.1-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.3.1/apache-mxnet-src-1.3.1-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.3.1/apache-mxnet-src-1.3.1-incubating.tar.gz.sha512) | +| 1.3.0 | [apache-mxnet-src-1.3.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.3.0/apache-mxnet-src-1.3.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.3.0/apache-mxnet-src-1.3.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.3.0/apache-mxnet-src-1.3.0-incubating.tar.gz.sha512) | +| 1.2.1 | [apache-mxnet-src-1.2.1-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.2.1/apache-mxnet-src-1.2.1-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.2.1/apache-mxnet-src-1.2.1-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.2.1/apache-mxnet-src-1.2.1-incubating.tar.gz.sha512) | +| 1.2.0 | [apache-mxnet-src-1.2.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.2.0/apache-mxnet-src-1.2.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.2.0/apache-mxnet-src-1.2.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.2.0/apache-mxnet-src-1.2.0-incubating.tar.gz.sha512) | +| 1.1.0 | [apache-mxnet-src-1.1.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.1.0/apache-mxnet-src-1.1.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.1.0/apache-mxnet-src-1.1.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.1.0/apache-mxnet-src-1.1.0-incubating.tar.gz.sha512) | +| 1.0.0 | [apache-mxnet-src-1.0.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/1.0.0/apache-mxnet-src-1.0.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/1.0.0/apache-mxnet-src-1.0.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/1.0.0/apache-mxnet-src-1.0.0-incubating.tar.gz.sha512) | +| 0.12.1 | [apache-mxnet-src-0.12.1-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/0.12.1/apache-mxnet-src-0.12.1-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/0.12.1/apache-mxnet-src-0.12.1-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/0.12.1/apache-mxnet-src-0.12.1-incubating.tar.gz.sha512) | +| 0.12.0 | [apache-mxnet-src-0.12.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/0.12.0/apache-mxnet-src-0.12.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/0.12.0/apache-mxnet-src-0.12.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/0.12.0/apache-mxnet-src-0.12.0-incubating.tar.gz.sha512) | +| 0.11.0 | [apache-mxnet-src-0.11.0-incubating.tar.gz](https://archive.apache.org/dist/incubator/mxnet/0.11.0/apache-mxnet-src-0.11.0-incubating.tar.gz) | [asc](https://archive.apache.org/dist/incubator/mxnet/0.11.0/apache-mxnet-src-0.11.0-incubating.tar.gz.asc) | [sha512](https://archive.apache.org/dist/incubator/mxnet/0.11.0/apache-mxnet-src-0.11.0-incubating.tar.gz.sha512) | ## Verify the Integrity of the Files It is essential that you verify the integrity of the downloaded file using the PGP signature (.asc file) or a hash (.md5 or .sha* file). Please read [Verifying Apache Software Foundation Releases](https://www.apache.org/info/verification.html) for more information on why you should verify our releases. From 026f1d56b9c91e8d8ada5720df03b68da3d751b2 Mon Sep 17 00:00:00 2001 From: Manu Seth <22492939+mseth10@users.noreply.github.com> Date: Tue, 28 Dec 2021 16:24:06 -0800 Subject: [PATCH 06/10] [website] Move trusted-by section from main page to a new page (#20788) * add custom jenkinsfile * move users from home page * test users page * revert htaccess change * move trusted-by section from homepage to ecosystem/ * Revert "move trusted-by section from homepage to ecosystem/" This reverts commit e214069a98a431c8fa1bc6d2a1a874907f1a664e. * copy powered_by to master/ * update trusted-by page * remove test jenkinsfile --- ci/docker/runtime_functions.sh | 2 +- .../themes/mx-theme/mxtheme/header_top.html | 1 + docs/static_site/src/_includes/header.html | 1 + docs/static_site/src/_layouts/home.html | 8 ----- docs/static_site/src/_sass/minima/_home.scss | 14 -------- docs/static_site/src/pages/trusted_by.html | 34 +++++++++++++++++++ 6 files changed, 37 insertions(+), 23 deletions(-) create mode 100644 docs/static_site/src/pages/trusted_by.html diff --git a/ci/docker/runtime_functions.sh b/ci/docker/runtime_functions.sh index 61d993611bd3..05f80032cd15 100755 --- a/ci/docker/runtime_functions.sh +++ b/ci/docker/runtime_functions.sh @@ -1329,7 +1329,7 @@ build_docs() { # copy the full site for this version to versions folder mkdir -p html/versions/master - for f in 404.html api assets blog community ecosystem features feed.xml get_started index.html; do + for f in 404.html api assets blog community ecosystem features trusted_by feed.xml get_started index.html; do cp -r html/$f html/versions/master/ done diff --git a/docs/python_docs/themes/mx-theme/mxtheme/header_top.html b/docs/python_docs/themes/mx-theme/mxtheme/header_top.html index 69cdf64fcefa..2234046f5f11 100644 --- a/docs/python_docs/themes/mx-theme/mxtheme/header_top.html +++ b/docs/python_docs/themes/mx-theme/mxtheme/header_top.html @@ -18,6 +18,7 @@ Features Ecosystem Docs & Tutorials + Trusted By GitHub -
-
-
-

Already trusted by

- -
-
-
{%- include footer.html -%} diff --git a/docs/static_site/src/_sass/minima/_home.scss b/docs/static_site/src/_sass/minima/_home.scss index bdb4f93047ed..5acc7f3664c3 100644 --- a/docs/static_site/src/_sass/minima/_home.scss +++ b/docs/static_site/src/_sass/minima/_home.scss @@ -170,20 +170,6 @@ a.btn { background-color: white; } -// === -// trusted-by -// === - -.trusted-by-section { - background-color: white; - color: $grey-color-dark; -} - -.trusted-by { - margin-top: 30px; - -} - // === // news // === diff --git a/docs/static_site/src/pages/trusted_by.html b/docs/static_site/src/pages/trusted_by.html new file mode 100644 index 000000000000..a49b3d881351 --- /dev/null +++ b/docs/static_site/src/pages/trusted_by.html @@ -0,0 +1,34 @@ +--- +layout: page +title: Trusted By +subtitle: These are some of the organizations that use MXNet. +action: Get Started +action_url: /get_started +permalink: /trusted_by/ +--- + + + +
+
+ +
+

+
From 4fc58fa1862a00c1af0788c6ce0ab19015f512d7 Mon Sep 17 00:00:00 2001 From: Yuan Tang Date: Mon, 3 Jan 2022 22:43:59 -0500 Subject: [PATCH 07/10] [DOC] Add Kubeflow to MXNet ecosystem (#20804) --- docs/static_site/src/assets/img/kubeflow.png | Bin 0 -> 14901 bytes docs/static_site/src/pages/ecosystem.html | 4 ++++ 2 files changed, 4 insertions(+) create mode 100644 docs/static_site/src/assets/img/kubeflow.png diff --git a/docs/static_site/src/assets/img/kubeflow.png b/docs/static_site/src/assets/img/kubeflow.png new file mode 100644 index 0000000000000000000000000000000000000000..681d5995ad347165efee8e001073576ec5798021 GIT binary patch literal 14901 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 VbT!gt1OE<+qo%B-RHI-W^?#P860!gQ literal 0 HcmV?d00001 diff --git a/docs/static_site/src/pages/ecosystem.html b/docs/static_site/src/pages/ecosystem.html index 9cb6b776aaf7..45a2bce7971f 100644 --- a/docs/static_site/src/pages/ecosystem.html +++ b/docs/static_site/src/pages/ecosystem.html @@ -32,6 +32,10 @@ - title: InsightFace text: State-of-the-art face detection and face recognition repository, including ArcFace loss and RetinaFace implementation link: https://github.com/deepinsight/insightface +- title: Kubeflow + text: Kubeflow training operator provides Kubernetes custom resources that makes it easy to run distributed or non-distributed model training jobs on Kubernetes for various frameworks, including Apache MXNet. + icon: /assets/img/kubeflow.png + link: https://github.com/kubeflow/training-operator - title: Sockeye text: Sockeye is a sequence-to-sequence framework for Neural Machine Translation based on Apache MXNet Incubating. It implements state-of-the-art encoder-decoder architectures. link: https://awslabs.github.io/sockeye/ From 4c66efc07230c9b53c0e4981a5bd2372c32b7d68 Mon Sep 17 00:00:00 2001 From: Triston Date: Tue, 4 Jan 2022 20:13:01 -0800 Subject: [PATCH 08/10] Add the 1.9 release notice in README (#20806) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 638987f106d5..e0801ad5b575 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,7 @@ Contents What's New ---------- +* [1.9.0 Release](https://github.com/apache/incubator-mxnet/releases/tag/1.9.0) - MXNet 1.9.0 Release. * [1.8.0 Release](https://github.com/apache/incubator-mxnet/releases/tag/1.8.0) - MXNet 1.8.0 Release. * [1.7.0 Release](https://github.com/apache/incubator-mxnet/releases/tag/1.7.0) - MXNet 1.7.0 Release. * [1.6.0 Release](https://github.com/apache/incubator-mxnet/releases/tag/1.6.0) - MXNet 1.6.0 Release. From 0c3ef7a7aafb0d48529793b037afbca81419e8ec Mon Sep 17 00:00:00 2001 From: bgawrych Date: Wed, 5 Jan 2022 07:57:13 +0100 Subject: [PATCH 09/10] Fix oneDNN fallback for concat with scalar (#20772) * Fix oneDNN fallback for concat with scalar * trigger --- src/operator/nn/concat.cc | 4 ++-- src/operator/nn/dnnl/dnnl_log_softmax.cc | 4 ++-- src/operator/nn/dnnl/dnnl_softmax.cc | 3 ++- src/operator/nn/dnnl/dnnl_stack.cc | 2 +- src/operator/nn/log_softmax.cc | 4 ---- src/operator/nn/softmax.cc | 4 ---- tests/python/unittest/test_numpy_op.py | 4 +++- 7 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/operator/nn/concat.cc b/src/operator/nn/concat.cc index f5a6f7f52ca9..2329892048f8 100644 --- a/src/operator/nn/concat.cc +++ b/src/operator/nn/concat.cc @@ -252,8 +252,8 @@ bool SupportDNNLConcat(const std::vector& arrs) { return false; if (!(arr.dtype() == mshadow::kFloat32 || arr.dtype() == mshadow::kBfloat16)) return false; - // DO not support zero-size tensors. - if (arr.shape().Size() == 0) + // Do not support zero-size tensors. + if (arr.shape().Size() == 0 || arr.shape().ndim() == 0) return false; int ndim = arr.shape().ndim(); const int dnnl_ndims = arr.GetDNNLData()->get_desc().data.ndims; diff --git a/src/operator/nn/dnnl/dnnl_log_softmax.cc b/src/operator/nn/dnnl/dnnl_log_softmax.cc index 9408e6019610..a3c8c9056729 100644 --- a/src/operator/nn/dnnl/dnnl_log_softmax.cc +++ b/src/operator/nn/dnnl/dnnl_log_softmax.cc @@ -60,8 +60,8 @@ bool SupportDNNLLogSoftmax(const SoftmaxParam& param, const NDArray& data, const // DNNL does not support temperature argument in their log_softmax function // now. Need update this once they start to support it. // Currently, DNNL shows bad performance when log_softmax is not performed on the last dimension - if (param.temperature.has_value() || in_dtype != mshadow::kFloat32 || in_dtype != out_dtype || - axis != (ndim - 1)) { + if (data.shape().Size() == 0 || data.shape().ndim() == 0 || param.temperature.has_value() || + in_dtype != mshadow::kFloat32 || in_dtype != out_dtype || axis != (ndim - 1)) { return false; } diff --git a/src/operator/nn/dnnl/dnnl_softmax.cc b/src/operator/nn/dnnl/dnnl_softmax.cc index 72a25d4c85b9..48c294454ced 100644 --- a/src/operator/nn/dnnl/dnnl_softmax.cc +++ b/src/operator/nn/dnnl/dnnl_softmax.cc @@ -31,6 +31,7 @@ namespace op { bool SupportDNNLSoftmax(const SoftmaxParam& param, const NDArray& data, const NDArray& output) { const int ndim = data.shape().ndim(); + const int in_size = data.shape().Size(); const int in_dtype = data.dtype(); const int out_dtype = output.dtype(); const int axis = CheckAxis(param.axis, ndim); @@ -44,7 +45,7 @@ bool SupportDNNLSoftmax(const SoftmaxParam& param, const NDArray& data, const ND } // Supports ndim up to 6 - return (ndim >= 1 && ndim <= 6); + return (ndim >= 1 && ndim <= 6 && in_size != 0); } void DNNLSoftmaxForward(const nnvm::NodeAttrs& attrs, diff --git a/src/operator/nn/dnnl/dnnl_stack.cc b/src/operator/nn/dnnl/dnnl_stack.cc index aabb66e9da99..aaeebb7251a9 100644 --- a/src/operator/nn/dnnl/dnnl_stack.cc +++ b/src/operator/nn/dnnl/dnnl_stack.cc @@ -41,7 +41,7 @@ bool SupportDNNLStack(const std::vector& inputs) { if (arr.dtype() != src_dtype) { return false; } - // DO not support zero-size tensors. + // Do not support zero-size tensors. if (arr.shape().Size() == 0) { return false; } diff --git a/src/operator/nn/log_softmax.cc b/src/operator/nn/log_softmax.cc index 197f8922d797..f56e7acda7e7 100644 --- a/src/operator/nn/log_softmax.cc +++ b/src/operator/nn/log_softmax.cc @@ -39,8 +39,6 @@ static void LogSoftmaxComputeExCPU(const nnvm::NodeAttrs& attrs, const std::vector& inputs, const std::vector& req, const std::vector& outputs) { - if (inputs[0].shape().Size() == 0U) - return; const SoftmaxParam& param = nnvm::get(attrs.parsed); if (SupportDNNLLogSoftmax(param, inputs[0], outputs[0])) { DNNL_OPCHECK_INIT(false, outputs.size(), inputs, outputs); @@ -57,8 +55,6 @@ static void LogSoftmaxGradComputeExCPU(const nnvm::NodeAttrs& attrs, const std::vector& inputs, const std::vector& req, const std::vector& outputs) { - if (inputs[0].shape().Size() == 0U) - return; const SoftmaxParam& param = nnvm::get(attrs.parsed); if (SupportDNNLLogSoftmax(param, inputs[1], outputs[0])) { DNNL_OPCHECK_INIT(false, outputs.size(), inputs, outputs); diff --git a/src/operator/nn/softmax.cc b/src/operator/nn/softmax.cc index 5b9c4ae41a46..29f546458c19 100644 --- a/src/operator/nn/softmax.cc +++ b/src/operator/nn/softmax.cc @@ -41,8 +41,6 @@ static void SoftmaxComputeExCPU(const nnvm::NodeAttrs& attrs, const std::vector& inputs, const std::vector& req, const std::vector& outputs) { - if (inputs[0].shape().Size() == 0U) - return; const SoftmaxParam& param = nnvm::get(attrs.parsed); if (SupportDNNLSoftmax(param, inputs[0], outputs[0])) { DNNL_OPCHECK_INIT(false, outputs.size(), inputs, outputs); @@ -59,8 +57,6 @@ static void SoftmaxGradComputeExCPU(const nnvm::NodeAttrs& attrs, const std::vector& inputs, const std::vector& req, const std::vector& outputs) { - if (inputs[0].shape().Size() == 0U) - return; const SoftmaxParam& param = nnvm::get(attrs.parsed); if (SupportDNNLSoftmax(param, inputs[1], outputs[0])) { DNNL_OPCHECK_INIT(false, outputs.size(), inputs, outputs); diff --git a/tests/python/unittest/test_numpy_op.py b/tests/python/unittest/test_numpy_op.py index 99aacbf0e6fb..bd3624b964f7 100644 --- a/tests/python/unittest/test_numpy_op.py +++ b/tests/python/unittest/test_numpy_op.py @@ -4096,7 +4096,7 @@ def get_new_shape(shape, axis): shape_lst[axis] = random.randint(0, 3) return tuple(shape_lst) - shapes = [(0, 0), (2, 3), (2, 1, 3)] + shapes = [(), (0, 0), (2, 3), (2, 1, 3)] hybridizes = [True, False] axes = [0, 1, -1, None] grad_reqs = ['write', 'add', 'null'] @@ -4105,6 +4105,8 @@ def get_new_shape(shape, axis): for shape, hybridize, axis, grad_req, dtype in combinations: # test gluon + if shape == () and axis != None: + continue test_concat = TestConcat(axis=axis) if hybridize: test_concat.hybridize() From 9fa75b470b8f0238a98635f20f5af941feb60929 Mon Sep 17 00:00:00 2001 From: bgawrych Date: Thu, 6 Jan 2022 15:51:09 +0100 Subject: [PATCH 10/10] Fix identity fuse for oneDNN (#20767) * Fix identity fuse * add new line * apply review comments * fix Co-authored-by: Bartlomiej Gawrych --- .../subgraph/dnnl/dnnl_identity_property.h | 13 ++++++++---- .../python/dnnl/subgraphs/test_fc_subgraph.py | 21 +++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/operator/subgraph/dnnl/dnnl_identity_property.h b/src/operator/subgraph/dnnl/dnnl_identity_property.h index 9ac30d8fcdb2..351f1f13196f 100644 --- a/src/operator/subgraph/dnnl/dnnl_identity_property.h +++ b/src/operator/subgraph/dnnl/dnnl_identity_property.h @@ -40,6 +40,7 @@ namespace op { class SgDNNLIdentitySelector : public SubgraphSelectorV2 { private: std::vector matched_list_; + bool pattern_found = false; public: bool Select(const BiDirectedNode& seed_node, @@ -65,10 +66,11 @@ class SgDNNLIdentitySelector : public SubgraphSelectorV2 { } bool SelectInput(const BiDirectedNode& n, const BiDirectedNode& input_node) override { - if (input_node.node->is_variable()) { + if (pattern_found || input_node.node->is_variable()) { return false; } else if (input_node.node->op()) { matched_list_.emplace_back(&input_node); + pattern_found = true; return true; } return false; @@ -80,7 +82,8 @@ class SgDNNLIdentitySelector : public SubgraphSelectorV2 { std::vector Filter(const std::vector& candidates) override { // candidates should contain only two nodes - custom node and identity node - if (candidates.size() == 2 && candidates.size() == matched_list_.size()) { + if (pattern_found && candidates.size() == matched_list_.size()) { + CHECK_EQ(candidates.size(), 2); return candidates; } else { return std::vector(0); @@ -134,8 +137,10 @@ class SgDNNLIdentityProperty : public SubgraphProperty { // Create copy of original node nnvm::ObjectPtr n = nnvm::Node::Create(); n->attrs = org_node->attrs; - CHECK(n->op()); - n->op()->attr_parser(&(n->attrs)); + CHECK(n->op()) << "WRTF"; + if (n->op()->attr_parser) { + n->op()->attr_parser(&(n->attrs)); + } return n; } diff --git a/tests/python/dnnl/subgraphs/test_fc_subgraph.py b/tests/python/dnnl/subgraphs/test_fc_subgraph.py index 720b51d09a5a..223a55df0f96 100644 --- a/tests/python/dnnl/subgraphs/test_fc_subgraph.py +++ b/tests/python/dnnl/subgraphs/test_fc_subgraph.py @@ -208,18 +208,27 @@ def test_fc_identity_eltwise(identity_node): class FCIdentityEltwise(nn.HybridBlock): def __init__(self, identity_node, **kwargs): super(FCIdentityEltwise, self).__init__(**kwargs) - self.fc = nn.Dense(units=64, use_bias=False, weight_initializer=None, flatten=True) + self.fc1 = nn.Dense(units=64, use_bias=False, weight_initializer=None, flatten=True) + self.fc2 = nn.Dense(units=64, use_bias=False, weight_initializer=None, flatten=True) self.identity_node = identity_node + def forward(self, x): - fc_out = self.fc(x) + out = self.fc1(x) if self.identity_node == 'copy': - fc_out = mx.np.copy(fc_out) + out = mx.np.copy(out) else: - fc_out = mx.npx.dropout(fc_out) - out = mx.npx.activation(fc_out, act_type='relu') + out = mx.npx.dropout(out) + out = mx.npx.activation(out, act_type='relu') + out = self.fc2(out) + if self.identity_node == 'copy': + out = mx.np.copy(out) + else: + out = mx.npx.dropout(out) + out = mx.npx.activation(out, act_type='relu') return out data_shape = (64, 4, 10, 10) - attrs = {'fc': {'with_eltwise': 'true'}} + attrs = {'sg_onednn_fully_connected_eltwise_0' : {'with_eltwise': 'true'}, + 'sg_onednn_fully_connected_eltwise_1' : {'with_eltwise': 'true'}} net = FCIdentityEltwise(identity_node) check_fusion(net, data_shape, attrs, check_quantization=False)