You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mxnet.apache.org by zh...@apache.org on 2020/09/22 22:45:40 UTC

[incubator-mxnet-site] branch asf-site updated: add master version

This is an automated email from the ASF dual-hosted git repository.

zhasheng pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/incubator-mxnet-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 587ff7a  add master version
587ff7a is described below

commit 587ff7a6fbe5fff185d92bbeb92d0f2968ec540a
Author: Sheng Zha <zh...@amazon.com>
AuthorDate: Tue Sep 22 15:45:04 2020 -0700

    add master version
---
 versions/master/404.html                           |   336 +
 .../api/architecture/exception_handling.html       |   654 +
 .../master/api/architecture/note_data_loading.html |   813 +
 versions/master/api/architecture/note_engine.html  |   921 ++
 versions/master/api/architecture/note_memory.html  |   878 +
 versions/master/api/architecture/overview.html     |  1391 ++
 .../master/api/architecture/program_model.html     |  1145 ++
 versions/master/api/clojure.html                   |   555 +
 versions/master/api/clojure/docs/tutorials.html    |   762 +
 .../master/api/clojure/docs/tutorials/kvstore.html |   614 +
 .../master/api/clojure/docs/tutorials/module.html  |   753 +
 .../master/api/clojure/docs/tutorials/ndarray.html |   647 +
 .../master/api/clojure/docs/tutorials/symbol.html  |   659 +
 .../clojure/docs/tutorials/symbol_in_pictures.html |   610 +
 versions/master/api/cpp.html                       |   570 +
 versions/master/api/cpp/docs/tutorials/basics.html |   610 +
 .../api/cpp/docs/tutorials/cpp_inference.html      |   799 +
 versions/master/api/cpp/docs/tutorials/index.html  |   759 +
 .../docs/tutorials/multi_threaded_inference.html   |   732 +
 .../api/cpp/docs/tutorials/subgraph_api.html       |   682 +
 ...ebugging_and_performance_optimization_tips.html |   584 +
 .../examine_forward_results_with_hooks.html        |   671 +
 .../exception_handing_and_custom_error_types.html  |   622 +
 ...thub_contribution_and_PR_verification_tips.html |   692 +
 versions/master/api/dev-guide/profiling.html       |   866 +
 versions/master/api/faq/add_op_in_backend.html     |  1244 ++
 versions/master/api/faq/cloud.html                 |   673 +
 versions/master/api/faq/distributed_training.html  |   891 +
 versions/master/api/faq/env_var.html               |  1201 ++
 versions/master/api/faq/float16.html               |   758 +
 versions/master/api/faq/gradient_compression.html  |   626 +
 versions/master/api/faq/large_tensor_support.html  |  1314 ++
 versions/master/api/faq/model_parallel_lstm.html   |   628 +
 versions/master/api/faq/new_op.html                |   921 ++
 versions/master/api/faq/perf.html                  |  1656 ++
 versions/master/api/faq/recordio.html              |   652 +
 versions/master/api/faq/s3_integration.html        |   657 +
 versions/master/api/faq/security.html              |   611 +
 .../master/api/faq/tensor_inspector_tutorial.html  |   703 +
 versions/master/api/faq/using_rtc.html             |   993 ++
 versions/master/api/faq/why_mxnet.html             |   742 +
 versions/master/api/index.html                     |   414 +
 versions/master/api/java.html                      |   549 +
 versions/master/api/java/docs/tutorials.html       |   753 +
 .../api/java/docs/tutorials/ssd_inference.html     |   724 +
 versions/master/api/julia.html                     |   552 +
 versions/master/api/perl.html                      |   600 +
 versions/master/api/perl/docs/tutorials.html       |   760 +
 versions/master/api/perl/docs/tutorials/io.html    |   624 +
 .../master/api/perl/docs/tutorials/kvstore.html    |   639 +
 .../master/api/perl/docs/tutorials/ndarray.html    |   581 +
 .../master/api/perl/docs/tutorials/symbol.html     |   626 +
 versions/master/api/python.html                    |   573 +
 versions/master/api/python/docs/.buildinfo         |     4 +
 .../master/api/python/docs/_modules/index.html     |  1352 ++
 .../api/python/docs/_modules/mxnet/autograd.html   |  1789 ++
 .../api/python/docs/_modules/mxnet/callback.html   |  1457 ++
 .../api/python/docs/_modules/mxnet/context.html    |  1561 ++
 .../api/python/docs/_modules/mxnet/contrib/io.html |  1358 ++
 .../docs/_modules/mxnet/contrib/ndarray.html       |  1284 ++
 .../mxnet/contrib/onnx/mx2onnx/export_model.html   |  1361 ++
 .../mxnet/contrib/onnx/onnx2mx/import_model.html   |  1357 ++
 .../contrib/onnx/onnx2mx/import_to_gluon.html      |  1317 ++
 .../python/docs/_modules/mxnet/contrib/symbol.html |  1284 ++
 .../docs/_modules/mxnet/contrib/tensorboard.html   |  1336 ++
 .../docs/_modules/mxnet/contrib/tensorrt.html      |  1331 ++
 .../api/python/docs/_modules/mxnet/dlpack.html     |  1449 ++
 .../api/python/docs/_modules/mxnet/engine.html     |  1338 ++
 .../api/python/docs/_modules/mxnet/executor.html   |  1657 ++
 .../python/docs/_modules/mxnet/gluon/block.html    |  3027 ++++
 .../gluon/contrib/estimator/batch_processor.html   |  1369 ++
 .../mxnet/gluon/contrib/estimator/estimator.html   |  1775 ++
 .../gluon/contrib/estimator/event_handler.html     |  2011 +++
 .../docs/_modules/mxnet/gluon/data/dataloader.html |  2061 +++
 .../docs/_modules/mxnet/gluon/data/dataset.html    |  1715 ++
 .../docs/_modules/mxnet/gluon/data/sampler.html    |  1466 ++
 .../_modules/mxnet/gluon/data/vision/datasets.html |  1719 ++
 .../mxnet/gluon/data/vision/transforms.html        |  1461 ++
 .../api/python/docs/_modules/mxnet/gluon/loss.html |  2377 +++
 .../python/docs/_modules/mxnet/gluon/metric.html   |  3120 ++++
 .../_modules/mxnet/gluon/model_zoo/vision.html     |  1416 ++
 .../mxnet/gluon/model_zoo/vision/alexnet.html      |  1351 ++
 .../mxnet/gluon/model_zoo/vision/densenet.html     |  1468 ++
 .../mxnet/gluon/model_zoo/vision/inception.html    |  1479 ++
 .../mxnet/gluon/model_zoo/vision/mobilenet.html    |  1634 ++
 .../mxnet/gluon/model_zoo/vision/resnet.html       |  1805 ++
 .../mxnet/gluon/model_zoo/vision/squeezenet.html   |  1432 ++
 .../_modules/mxnet/gluon/model_zoo/vision/vgg.html |  1511 ++
 .../docs/_modules/mxnet/gluon/nn/activations.html  |  1506 ++
 .../docs/_modules/mxnet/gluon/nn/basic_layers.html |  2380 +++
 .../docs/_modules/mxnet/gluon/nn/conv_layers.html  |  3075 ++++
 .../docs/_modules/mxnet/gluon/parameter.html       |  2023 +++
 .../_modules/mxnet/gluon/rnn/conv_rnn_cell.html    |  2182 +++
 .../docs/_modules/mxnet/gluon/rnn/rnn_cell.html    |  2757 ++++
 .../docs/_modules/mxnet/gluon/rnn/rnn_layer.html   |  1827 ++
 .../python/docs/_modules/mxnet/gluon/trainer.html  |  1805 ++
 .../python/docs/_modules/mxnet/gluon/utils.html    |  1750 ++
 .../docs/_modules/mxnet/image/detection.html       |  2272 +++
 .../python/docs/_modules/mxnet/image/image.html    |  2878 ++++
 .../python/docs/_modules/mxnet/initializer.html    |  1977 +++
 .../api/python/docs/_modules/mxnet/io/io.html      |  2285 +++
 .../python/docs/_modules/mxnet/lr_scheduler.html   |  1545 ++
 .../docs/_modules/mxnet/ndarray/contrib.html       |  2022 +++
 .../python/docs/_modules/mxnet/ndarray/image.html  |  1290 ++
 .../python/docs/_modules/mxnet/ndarray/linalg.html |  1290 ++
 .../docs/_modules/mxnet/ndarray/ndarray.html       |  6329 +++++++
 .../python/docs/_modules/mxnet/ndarray/random.html |  1913 +++
 .../python/docs/_modules/mxnet/ndarray/sparse.html |  2918 ++++
 .../python/docs/_modules/mxnet/ndarray/utils.html  |  1544 ++
 .../docs/_modules/mxnet/optimizer/adadelta.html    |  1375 ++
 .../docs/_modules/mxnet/optimizer/adagrad.html     |  1405 ++
 .../python/docs/_modules/mxnet/optimizer/adam.html |  1450 ++
 .../docs/_modules/mxnet/optimizer/adamax.html      |  1376 ++
 .../docs/_modules/mxnet/optimizer/dcasgd.html      |  1380 ++
 .../python/docs/_modules/mxnet/optimizer/ftml.html |  1422 ++
 .../python/docs/_modules/mxnet/optimizer/ftrl.html |  1431 ++
 .../python/docs/_modules/mxnet/optimizer/lamb.html |  1525 ++
 .../python/docs/_modules/mxnet/optimizer/lans.html |  1484 ++
 .../python/docs/_modules/mxnet/optimizer/lars.html |  1543 ++
 .../docs/_modules/mxnet/optimizer/nadam.html       |  1388 ++
 .../python/docs/_modules/mxnet/optimizer/nag.html  |  1426 ++
 .../docs/_modules/mxnet/optimizer/optimizer.html   |  1844 +++
 .../docs/_modules/mxnet/optimizer/rmsprop.html     |  1445 ++
 .../python/docs/_modules/mxnet/optimizer/sgd.html  |  1506 ++
 .../python/docs/_modules/mxnet/optimizer/sgld.html |  1352 ++
 .../docs/_modules/mxnet/optimizer/signum.html      |  1422 ++
 .../docs/_modules/mxnet/optimizer/updater.html     |  1406 ++
 .../api/python/docs/_modules/mxnet/profiler.html   |  1795 ++
 .../api/python/docs/_modules/mxnet/recordio.html   |  1772 ++
 .../master/api/python/docs/_modules/mxnet/rtc.html |  1494 ++
 .../api/python/docs/_modules/mxnet/runtime.html    |  1382 ++
 .../python/docs/_modules/mxnet/symbol/contrib.html |  2015 +++
 .../python/docs/_modules/mxnet/symbol/image.html   |  1290 ++
 .../python/docs/_modules/mxnet/symbol/linalg.html  |  1290 ++
 .../python/docs/_modules/mxnet/symbol/random.html  |  1686 ++
 .../python/docs/_modules/mxnet/symbol/sparse.html  |  1290 ++
 .../python/docs/_modules/mxnet/symbol/symbol.html  |  4552 +++++
 .../api/python/docs/_modules/mxnet/test_utils.html |  3866 +++++
 .../api/python/docs/_modules/mxnet/util.html       |  2443 +++
 .../python/docs/_modules/mxnet/visualization.html  |  1689 ++
 .../master/api/python/docs/_modules/numbers.html   |  1653 ++
 .../master/api/python/docs/_modules/symbol.html    |  1379 ++
 .../python/docs/_sources/api/autograd/index.rst    |    23 +
 .../api/python/docs/_sources/api/context/index.rst |    23 +
 .../docs/_sources/api/contrib/autograd/index.rst   |    23 +
 .../api/python/docs/_sources/api/contrib/index.rst |    88 +
 .../python/docs/_sources/api/contrib/io/index.rst  |    23 +
 .../docs/_sources/api/contrib/ndarray/index.rst    |    23 +
 .../docs/_sources/api/contrib/onnx/index.rst       |    24 +
 .../_sources/api/contrib/quantization/index.rst    |    23 +
 .../docs/_sources/api/contrib/symbol/index.rst     |    23 +
 .../_sources/api/contrib/tensorboard/index.rst     |    23 +
 .../docs/_sources/api/contrib/tensorrt/index.rst   |    23 +
 .../docs/_sources/api/contrib/text/index.rst       |    23 +
 .../api/python/docs/_sources/api/engine/index.rst  |    23 +
 .../python/docs/_sources/api/executor/index.rst    |    23 +
 .../api/python/docs/_sources/api/gluon/block.rst   |    25 +
 .../python/docs/_sources/api/gluon/constant.rst    |    25 +
 .../docs/_sources/api/gluon/contrib/index.rst      |    91 +
 .../python/docs/_sources/api/gluon/data/index.rst  |    64 +
 .../api/gluon/data/vision/datasets/index.rst       |    26 +
 .../docs/_sources/api/gluon/data/vision/index.rst  |    53 +
 .../api/gluon/data/vision/transforms/index.rst     |    48 +
 .../docs/_sources/api/gluon/hybrid_block.rst       |    25 +
 .../api/python/docs/_sources/api/gluon/index.rst   |   164 +
 .../python/docs/_sources/api/gluon/loss/index.rst  |    27 +
 .../docs/_sources/api/gluon/metric/index.rst       |    23 +
 .../docs/_sources/api/gluon/model_zoo/index.rst    |   161 +
 .../python/docs/_sources/api/gluon/nn/index.rst    |   156 +
 .../python/docs/_sources/api/gluon/parameter.rst   |    25 +
 .../docs/_sources/api/gluon/parameter_dict.rst     |    25 +
 .../python/docs/_sources/api/gluon/rnn/index.rst   |    80 +
 .../docs/_sources/api/gluon/symbol_block.rst       |    25 +
 .../api/python/docs/_sources/api/gluon/trainer.rst |    25 +
 .../python/docs/_sources/api/gluon/utils/index.rst |    24 +
 .../master/api/python/docs/_sources/api/index.rst  |   240 +
 .../python/docs/_sources/api/initializer/index.rst |    23 +
 .../api/python/docs/_sources/api/kvstore/index.rst |    23 +
 .../docs/_sources/api/kvstore_server/index.rst     |    23 +
 .../docs/_sources/api/legacy/callback/index.rst    |    23 +
 .../docs/_sources/api/legacy/image/index.rst       |    28 +
 .../api/python/docs/_sources/api/legacy/index.rst  |    78 +
 .../python/docs/_sources/api/legacy/io/index.rst   |    24 +
 .../docs/_sources/api/legacy/monitor/index.rst     |    23 +
 .../_sources/api/legacy/ndarray/contrib/index.rst  |    23 +
 .../_sources/api/legacy/ndarray/image/index.rst    |    23 +
 .../docs/_sources/api/legacy/ndarray/index.rst     |   105 +
 .../_sources/api/legacy/ndarray/linalg/index.rst   |    23 +
 .../docs/_sources/api/legacy/ndarray/ndarray.rst   |    26 +
 .../docs/_sources/api/legacy/ndarray/op/index.rst  |    23 +
 .../_sources/api/legacy/ndarray/random/index.rst   |    23 +
 .../_sources/api/legacy/ndarray/register/index.rst |    23 +
 .../_sources/api/legacy/ndarray/sparse/index.rst   |    23 +
 .../_sources/api/legacy/ndarray/utils/index.rst    |    23 +
 .../docs/_sources/api/legacy/recordio/index.rst    |    23 +
 .../_sources/api/legacy/symbol/contrib/index.rst   |    23 +
 .../_sources/api/legacy/symbol/image/index.rst     |    23 +
 .../docs/_sources/api/legacy/symbol/index.rst      |    57 +
 .../_sources/api/legacy/symbol/linalg/index.rst    |    23 +
 .../docs/_sources/api/legacy/symbol/op/index.rst   |    23 +
 .../_sources/api/legacy/symbol/random/index.rst    |    23 +
 .../_sources/api/legacy/symbol/register/index.rst  |    23 +
 .../_sources/api/legacy/symbol/sparse/index.rst    |    23 +
 .../docs/_sources/api/legacy/symbol/symbol.rst     |    26 +
 .../_sources/api/legacy/visualization/index.rst    |    23 +
 .../docs/_sources/api/lr_scheduler/index.rst       |    23 +
 .../api/python/docs/_sources/api/module/index.rst  |    24 +
 .../docs/_sources/api/np/arrays.indexing.rst       |   356 +
 .../python/docs/_sources/api/np/arrays.ndarray.rst |   631 +
 .../api/python/docs/_sources/api/np/arrays.rst     |    42 +
 .../api/np/generated/mxnet.np.absolute.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.add.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.amax.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.amin.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.append.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.arange.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.arccos.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.arccosh.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.arcsin.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.arcsinh.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.arctan.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.arctan2.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.arctanh.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.argmax.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.argmin.rst  |     6 +
 .../api/np/generated/mxnet.np.argpartition.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.argsort.rst |     6 +
 .../api/np/generated/mxnet.np.argwhere.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.around.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.array.rst   |     6 +
 .../api/np/generated/mxnet.np.array_split.rst      |     6 +
 .../api/np/generated/mxnet.np.atleast_1d.rst       |     6 +
 .../api/np/generated/mxnet.np.atleast_2d.rst       |     6 +
 .../api/np/generated/mxnet.np.atleast_3d.rst       |     6 +
 .../_sources/api/np/generated/mxnet.np.average.rst |     6 +
 .../api/np/generated/mxnet.np.bincount.rst         |     6 +
 .../api/np/generated/mxnet.np.broadcast_arrays.rst |     6 +
 .../api/np/generated/mxnet.np.broadcast_to.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.cbrt.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.ceil.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.clip.rst    |     6 +
 .../api/np/generated/mxnet.np.column_stack.rst     |     6 +
 .../api/np/generated/mxnet.np.concatenate.rst      |     6 +
 .../_sources/api/np/generated/mxnet.np.copy.rst    |     6 +
 .../api/np/generated/mxnet.np.copysign.rst         |     6 +
 .../api/np/generated/mxnet.np.corrcoef.rst         |     6 +
 .../api/np/generated/mxnet.np.correlate.rst        |     6 +
 .../_sources/api/np/generated/mxnet.np.cos.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.cosh.rst    |     6 +
 .../api/np/generated/mxnet.np.count_nonzero.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.cov.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.cross.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.cumsum.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.deg2rad.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.degrees.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.delete.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.diff.rst    |     6 +
 .../api/np/generated/mxnet.np.digitize.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.divide.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.divmod.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.dot.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.dsplit.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.dstack.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.ediff1d.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.einsum.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.empty.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.exp.rst     |     6 +
 .../api/np/generated/mxnet.np.expand_dims.rst      |     6 +
 .../_sources/api/np/generated/mxnet.np.expm1.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.extract.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.eye.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.fabs.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.fix.rst     |     6 +
 .../api/np/generated/mxnet.np.flatnonzero.rst      |     6 +
 .../_sources/api/np/generated/mxnet.np.flip.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.fliplr.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.flipud.rst  |     6 +
 .../api/np/generated/mxnet.np.float_power.rst      |     6 +
 .../_sources/api/np/generated/mxnet.np.floor.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.fmax.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.fmin.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.fmod.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.frexp.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.full.rst    |     6 +
 .../api/np/generated/mxnet.np.genfromtxt.rst       |     6 +
 .../api/np/generated/mxnet.np.heaviside.rst        |     6 +
 .../api/np/generated/mxnet.np.histogram.rst        |     6 +
 .../api/np/generated/mxnet.np.histogram2d.rst      |     6 +
 .../np/generated/mxnet.np.histogram_bin_edges.rst  |     6 +
 .../api/np/generated/mxnet.np.histogramdd.rst      |     6 +
 .../_sources/api/np/generated/mxnet.np.hsplit.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.hstack.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.hypot.rst   |     6 +
 .../docs/_sources/api/np/generated/mxnet.np.i0.rst |     6 +
 .../api/np/generated/mxnet.np.identity.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.inner.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.insert.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.interp.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.kron.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.lcm.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.ldexp.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.lexsort.rst |     6 +
 .../api/np/generated/mxnet.np.linalg.cholesky.rst  |     6 +
 .../api/np/generated/mxnet.np.linalg.cond.rst      |     6 +
 .../api/np/generated/mxnet.np.linalg.det.rst       |     6 +
 .../api/np/generated/mxnet.np.linalg.eig.rst       |     6 +
 .../api/np/generated/mxnet.np.linalg.eigh.rst      |     6 +
 .../api/np/generated/mxnet.np.linalg.eigvals.rst   |     6 +
 .../api/np/generated/mxnet.np.linalg.eigvalsh.rst  |     6 +
 .../api/np/generated/mxnet.np.linalg.inv.rst       |     6 +
 .../api/np/generated/mxnet.np.linalg.lstsq.rst     |     6 +
 .../np/generated/mxnet.np.linalg.matrix_power.rst  |     6 +
 .../np/generated/mxnet.np.linalg.matrix_rank.rst   |     6 +
 .../api/np/generated/mxnet.np.linalg.multi_dot.rst |     6 +
 .../api/np/generated/mxnet.np.linalg.norm.rst      |     6 +
 .../api/np/generated/mxnet.np.linalg.pinv.rst      |     6 +
 .../api/np/generated/mxnet.np.linalg.qr.rst        |     6 +
 .../api/np/generated/mxnet.np.linalg.slogdet.rst   |     6 +
 .../api/np/generated/mxnet.np.linalg.solve.rst     |     6 +
 .../api/np/generated/mxnet.np.linalg.svd.rst       |     6 +
 .../api/np/generated/mxnet.np.linalg.tensorinv.rst |     6 +
 .../np/generated/mxnet.np.linalg.tensorsolve.rst   |     6 +
 .../api/np/generated/mxnet.np.linspace.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.log.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.log10.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.log1p.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.log2.rst    |     6 +
 .../api/np/generated/mxnet.np.logspace.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.matmul.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.max.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.maximum.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.mean.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.median.rst  |     6 +
 .../api/np/generated/mxnet.np.meshgrid.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.min.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.minimum.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.mod.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.modf.rst    |     6 +
 .../api/np/generated/mxnet.np.moveaxis.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.msort.rst   |     6 +
 .../api/np/generated/mxnet.np.multiply.rst         |     6 +
 .../api/np/generated/mxnet.np.nan_to_num.rst       |     6 +
 .../api/np/generated/mxnet.np.nanargmax.rst        |     6 +
 .../api/np/generated/mxnet.np.nanargmin.rst        |     6 +
 .../api/np/generated/mxnet.np.nancumprod.rst       |     6 +
 .../api/np/generated/mxnet.np.nancumsum.rst        |     6 +
 .../_sources/api/np/generated/mxnet.np.nanmax.rst  |     6 +
 .../api/np/generated/mxnet.np.nanmedian.rst        |     6 +
 .../_sources/api/np/generated/mxnet.np.nanmin.rst  |     6 +
 .../api/np/generated/mxnet.np.nanpercentile.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.nanprod.rst |     6 +
 .../api/np/generated/mxnet.np.nanquantile.rst      |     6 +
 .../api/np/generated/mxnet.np.ndarray.T.rst        |     6 +
 .../api/np/generated/mxnet.np.ndarray.__abs__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__add__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__and__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__bool__.rst |     6 +
 .../api/np/generated/mxnet.np.ndarray.__eq__.rst   |     6 +
 .../np/generated/mxnet.np.ndarray.__float__.rst    |     6 +
 .../api/np/generated/mxnet.np.ndarray.__ge__.rst   |     6 +
 .../np/generated/mxnet.np.ndarray.__getitem__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__gt__.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.__iadd__.rst |     6 +
 .../api/np/generated/mxnet.np.ndarray.__iand__.rst |     6 +
 .../api/np/generated/mxnet.np.ndarray.__imod__.rst |     6 +
 .../api/np/generated/mxnet.np.ndarray.__imul__.rst |     6 +
 .../api/np/generated/mxnet.np.ndarray.__int__.rst  |     6 +
 .../np/generated/mxnet.np.ndarray.__invert__.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.__ior__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__isub__.rst |     6 +
 .../np/generated/mxnet.np.ndarray.__itruediv__.rst |     6 +
 .../api/np/generated/mxnet.np.ndarray.__ixor__.rst |     6 +
 .../api/np/generated/mxnet.np.ndarray.__le__.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.__len__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__lt__.rst   |     6 +
 .../np/generated/mxnet.np.ndarray.__matmul__.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.__mod__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__mul__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__ne__.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.__neg__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__new__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__or__.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.__pow__.rst  |     6 +
 .../np/generated/mxnet.np.ndarray.__reduce__.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.__repr__.rst |     6 +
 .../np/generated/mxnet.np.ndarray.__setitem__.rst  |     6 +
 .../np/generated/mxnet.np.ndarray.__setstate__.rst |     6 +
 .../api/np/generated/mxnet.np.ndarray.__str__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__sub__.rst  |     6 +
 .../np/generated/mxnet.np.ndarray.__truediv__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.__xor__.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.all.rst      |     6 +
 .../api/np/generated/mxnet.np.ndarray.any.rst      |     6 +
 .../api/np/generated/mxnet.np.ndarray.argmax.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.argmin.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.argsort.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.astype.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.clip.rst     |     6 +
 .../api/np/generated/mxnet.np.ndarray.copy.rst     |     6 +
 .../api/np/generated/mxnet.np.ndarray.cumsum.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.dtype.rst    |     6 +
 .../api/np/generated/mxnet.np.ndarray.flatten.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.item.rst     |     6 +
 .../api/np/generated/mxnet.np.ndarray.max.rst      |     6 +
 .../api/np/generated/mxnet.np.ndarray.mean.rst     |     6 +
 .../api/np/generated/mxnet.np.ndarray.min.rst      |     6 +
 .../api/np/generated/mxnet.np.ndarray.ndim.rst     |     6 +
 .../api/np/generated/mxnet.np.ndarray.nonzero.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.prod.rst     |     6 +
 .../api/np/generated/mxnet.np.ndarray.repeat.rst   |     6 +
 .../api/np/generated/mxnet.np.ndarray.reshape.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.round.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.ndarray.rst |   149 +
 .../api/np/generated/mxnet.np.ndarray.shape.rst    |     6 +
 .../api/np/generated/mxnet.np.ndarray.size.rst     |     6 +
 .../api/np/generated/mxnet.np.ndarray.sort.rst     |     6 +
 .../api/np/generated/mxnet.np.ndarray.squeeze.rst  |     6 +
 .../api/np/generated/mxnet.np.ndarray.std.rst      |     6 +
 .../api/np/generated/mxnet.np.ndarray.sum.rst      |     6 +
 .../api/np/generated/mxnet.np.ndarray.swapaxes.rst |     6 +
 .../api/np/generated/mxnet.np.ndarray.take.rst     |     6 +
 .../api/np/generated/mxnet.np.ndarray.tolist.rst   |     6 +
 .../np/generated/mxnet.np.ndarray.transpose.rst    |     6 +
 .../api/np/generated/mxnet.np.ndarray.var.rst      |     6 +
 .../api/np/generated/mxnet.np.negative.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.nonzero.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.ones.rst    |     6 +
 .../api/np/generated/mxnet.np.ones_like.rst        |     6 +
 .../_sources/api/np/generated/mxnet.np.outer.rst   |     6 +
 .../api/np/generated/mxnet.np.partition.rst        |     6 +
 .../api/np/generated/mxnet.np.percentile.rst       |     6 +
 .../api/np/generated/mxnet.np.positive.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.power.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.prod.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.ptp.rst     |     6 +
 .../api/np/generated/mxnet.np.quantile.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.rad2deg.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.radians.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.ravel.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.real.rst    |     6 +
 .../api/np/generated/mxnet.np.reciprocal.rst       |     6 +
 .../api/np/generated/mxnet.np.remainder.rst        |     6 +
 .../_sources/api/np/generated/mxnet.np.repeat.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.reshape.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.resize.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.rint.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.roll.rst    |     6 +
 .../api/np/generated/mxnet.np.rollaxis.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.rot90.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.round_.rst  |     6 +
 .../api/np/generated/mxnet.np.searchsorted.rst     |     6 +
 .../api/np/generated/mxnet.np.set_printoptions.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.sign.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.signbit.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.sin.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.sinh.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.sort.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.spacing.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.split.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.sqrt.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.square.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.squeeze.rst |     6 +
 .../_sources/api/np/generated/mxnet.np.stack.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.std.rst     |     6 +
 .../api/np/generated/mxnet.np.subtract.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.sum.rst     |     6 +
 .../api/np/generated/mxnet.np.swapaxes.rst         |     6 +
 .../_sources/api/np/generated/mxnet.np.tan.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.tanh.rst    |     6 +
 .../api/np/generated/mxnet.np.tensordot.rst        |     6 +
 .../_sources/api/np/generated/mxnet.np.tile.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.trace.rst   |     6 +
 .../api/np/generated/mxnet.np.transpose.rst        |     6 +
 .../_sources/api/np/generated/mxnet.np.trapz.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.tril.rst    |     6 +
 .../api/np/generated/mxnet.np.trim_zeros.rst       |     6 +
 .../api/np/generated/mxnet.np.true_divide.rst      |     6 +
 .../_sources/api/np/generated/mxnet.np.trunc.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.unique.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.unwrap.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.var.rst     |     6 +
 .../_sources/api/np/generated/mxnet.np.vdot.rst    |     6 +
 .../_sources/api/np/generated/mxnet.np.vsplit.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.vstack.rst  |     6 +
 .../_sources/api/np/generated/mxnet.np.where.rst   |     6 +
 .../_sources/api/np/generated/mxnet.np.zeros.rst   |     6 +
 .../api/np/generated/mxnet.np.zeros_like.rst       |     6 +
 .../api/python/docs/_sources/api/np/index.rst      |    29 +
 .../python/docs/_sources/api/np/random/index.rst   |    90 +
 .../_sources/api/np/routines.array-creation.rst    |   124 +
 .../api/np/routines.array-manipulation.rst         |   143 +
 .../python/docs/_sources/api/np/routines.io.rst    |   114 +
 .../docs/_sources/api/np/routines.linalg.rst       |   106 +
 .../python/docs/_sources/api/np/routines.math.rst  |   213 +
 .../api/python/docs/_sources/api/np/routines.rst   |    47 +
 .../python/docs/_sources/api/np/routines.sort.rst  |    49 +
 .../docs/_sources/api/np/routines.statistics.rst   |    74 +
 .../api/npx/generated/mxnet.npx.activation.rst     |     6 +
 .../api/npx/generated/mxnet.npx.batch_dot.rst      |     6 +
 .../api/npx/generated/mxnet.npx.batch_flatten.rst  |     6 +
 .../api/npx/generated/mxnet.npx.batch_norm.rst     |     6 +
 .../api/npx/generated/mxnet.npx.convolution.rst    |     6 +
 .../_sources/api/npx/generated/mxnet.npx.cpu.rst   |     6 +
 .../api/npx/generated/mxnet.npx.cpu_pinned.rst     |     6 +
 .../npx/generated/mxnet.npx.current_context.rst    |     6 +
 .../api/npx/generated/mxnet.npx.dropout.rst        |     6 +
 .../api/npx/generated/mxnet.npx.embedding.rst      |     6 +
 .../npx/generated/mxnet.npx.fully_connected.rst    |     6 +
 .../_sources/api/npx/generated/mxnet.npx.gamma.rst |     6 +
 .../_sources/api/npx/generated/mxnet.npx.gpu.rst   |     6 +
 .../npx/generated/mxnet.npx.gpu_memory_info.rst    |     6 +
 .../api/npx/generated/mxnet.npx.layer_norm.rst     |     6 +
 .../api/npx/generated/mxnet.npx.leaky_relu.rst     |     6 +
 .../_sources/api/npx/generated/mxnet.npx.load.rst  |     6 +
 .../npx/generated/mxnet.npx.multibox_detection.rst |     6 +
 .../api/npx/generated/mxnet.npx.multibox_prior.rst |     6 +
 .../npx/generated/mxnet.npx.multibox_target.rst    |     6 +
 .../api/npx/generated/mxnet.npx.num_gpus.rst       |     6 +
 .../api/npx/generated/mxnet.npx.one_hot.rst        |     6 +
 .../_sources/api/npx/generated/mxnet.npx.pick.rst  |     6 +
 .../api/npx/generated/mxnet.npx.pooling.rst        |     6 +
 .../api/npx/generated/mxnet.npx.reset_np.rst       |     6 +
 .../api/npx/generated/mxnet.npx.reshape_like.rst   |     6 +
 .../_sources/api/npx/generated/mxnet.npx.rnn.rst   |     6 +
 .../api/npx/generated/mxnet.npx.roi_pooling.rst    |     6 +
 .../_sources/api/npx/generated/mxnet.npx.save.rst  |     6 +
 .../api/npx/generated/mxnet.npx.sequence_mask.rst  |     6 +
 .../api/npx/generated/mxnet.npx.set_np.rst         |     6 +
 .../api/npx/generated/mxnet.npx.sigmoid.rst        |     6 +
 .../api/npx/generated/mxnet.npx.smooth_l1.rst      |     6 +
 .../api/npx/generated/mxnet.npx.softmax.rst        |     6 +
 .../_sources/api/npx/generated/mxnet.npx.topk.rst  |     6 +
 .../api/npx/generated/mxnet.npx.waitall.rst        |     6 +
 .../api/python/docs/_sources/api/npx/index.rst     |    85 +
 .../python/docs/_sources/api/optimizer/index.rst   |    23 +
 .../python/docs/_sources/api/profiler/index.rst    |    23 +
 .../api/python/docs/_sources/api/rtc/index.rst     |    23 +
 .../api/python/docs/_sources/api/runtime/index.rst |    23 +
 .../python/docs/_sources/api/test_utils/index.rst  |    23 +
 .../api/python/docs/_sources/api/util/index.rst    |    23 +
 versions/master/api/python/docs/_sources/index.rst |    52 +
 .../_sources/tutorials/deploy/export/index.rst     |    46 +
 .../_sources/tutorials/deploy/export/onnx.ipynb    |   236 +
 .../docs/_sources/tutorials/deploy/index.rst       |   126 +
 .../_sources/tutorials/deploy/inference/cpp.rst    |    21 +
 .../inference/image_classification_jetson.ipynb    |   183 +
 .../_sources/tutorials/deploy/inference/index.rst  |    61 +
 .../tutorials/deploy/run-on-aws/cloud.ipynb        |    46 +
 .../_sources/tutorials/deploy/run-on-aws/index.rst |    55 +
 .../tutorials/deploy/run-on-aws/use_ec2.rst        |    74 +
 .../tutorials/deploy/run-on-aws/use_sagemaker.rst  |    82 +
 .../docs/_sources/tutorials/extend/customop.ipynb  |   344 +
 .../docs/_sources/tutorials/extend/index.rst       |    70 +
 .../getting-started/crash-course/1-ndarray.ipynb   |   357 +
 .../getting-started/crash-course/2-nn.ipynb        |   319 +
 .../getting-started/crash-course/3-autograd.ipynb  |   243 +
 .../getting-started/crash-course/4-train.ipynb     |   403 +
 .../getting-started/crash-course/5-predict.ipynb   |   368 +
 .../getting-started/crash-course/6-use_gpus.ipynb  |   300 +
 .../getting-started/crash-course/index.rst         |    16 +
 .../gluon_from_experiment_to_deployment.ipynb      |   369 +
 .../_sources/tutorials/getting-started/index.rst   |    64 +
 .../logistic_regression_explained.ipynb            |   363 +
 .../tutorials/getting-started/to-mxnet/index.rst   |    38 +
 .../getting-started/to-mxnet/pytorch.ipynb         |   609 +
 .../api/python/docs/_sources/tutorials/index.rst   |   168 +
 .../tutorials/packages/autograd/index.ipynb        |   409 +
 .../gluon/blocks/activations/activations.ipynb     |   382 +
 .../packages/gluon/blocks/custom-layer.ipynb       |   352 +
 .../gluon/blocks/custom_layer_beginners.ipynb      |   340 +
 .../packages/gluon/blocks/hybridize.ipynb          |   498 +
 .../tutorials/packages/gluon/blocks/index.rst      |    26 +
 .../tutorials/packages/gluon/blocks/init.ipynb     |   536 +
 .../tutorials/packages/gluon/blocks/naming.ipynb   |   255 +
 .../tutorials/packages/gluon/blocks/nn.ipynb       |   459 +
 .../packages/gluon/blocks/parameters.ipynb         |   530 +
 .../packages/gluon/blocks/save_load_params.ipynb   |   397 +
 .../packages/gluon/data/data_augmentation.ipynb    |   384 +
 .../tutorials/packages/gluon/data/datasets.ipynb   |   473 +
 .../tutorials/packages/gluon/data/index.rst        |    40 +
 .../tutorials/packages/gluon/image/index.rst       |    89 +
 .../tutorials/packages/gluon/image/info_gan.ipynb  |   630 +
 .../tutorials/packages/gluon/image/mnist.ipynb     |   493 +
 .../_sources/tutorials/packages/gluon/index.rst    |   214 +
 .../packages/gluon/loss/custom-loss.ipynb          |   324 +
 .../tutorials/packages/gluon/loss/index.rst        |    25 +
 .../packages/gluon/loss/kl_divergence.ipynb        |   229 +
 .../tutorials/packages/gluon/loss/loss.ipynb       |   514 +
 .../tutorials/packages/gluon/text/gnmt.rst         |   488 +
 .../tutorials/packages/gluon/text/index.rst        |   119 +
 .../tutorials/packages/gluon/text/transformer.rst  |   607 +
 .../packages/gluon/training/fit_api_tutorial.ipynb |   385 +
 .../tutorials/packages/gluon/training/index.rst    |    26 +
 .../gluon/training/learning_rates/index.rst        |    26 +
 .../learning_rates/learning_rate_finder.ipynb      |   419 +
 .../learning_rates/learning_rate_schedules.ipynb   |   475 +
 .../learning_rate_schedules_advanced.ipynb         |   466 +
 .../gluon/training/normalization/index.ipynb       |   450 +
 .../packages/gluon/training/trainer.ipynb          |   265 +
 .../docs/_sources/tutorials/packages/index.rst     |    97 +
 .../_sources/tutorials/packages/kvstore/index.rst  |    39 +
 .../tutorials/packages/kvstore/kvstore.ipynb       |   268 +
 .../_sources/tutorials/packages/legacy/index.rst   |    41 +
 .../packages/legacy/ndarray/01-ndarray-intro.ipynb |   319 +
 .../legacy/ndarray/02-ndarray-operations.ipynb     |   423 +
 .../legacy/ndarray/03-ndarray-contexts.ipynb       |   146 +
 .../legacy/ndarray/gotchas_numpy_in_mxnet.ipynb    |   234 +
 .../tutorials/packages/legacy/ndarray/index.rst    |    61 +
 .../packages/legacy/ndarray/sparse/csr.ipynb       |   823 +
 .../packages/legacy/ndarray/sparse/index.rst       |    24 +
 .../legacy/ndarray/sparse/row_sparse.ipynb         |   832 +
 .../legacy/ndarray/sparse/train_gluon.ipynb        |   739 +
 .../tutorials/packages/np/cheat-sheet.ipynb        |  1035 ++
 .../docs/_sources/tutorials/packages/np/index.rst  |    32 +
 .../tutorials/packages/np/np-vs-numpy.ipynb        |   230 +
 .../packages/onnx/fine_tuning_gluon.ipynb          |   714 +
 .../_sources/tutorials/packages/onnx/index.rst     |    53 +
 .../packages/onnx/inference_on_onnx_model.ipynb    |   440 +
 .../tutorials/packages/optimizer/index.ipynb       |   554 +
 .../docs/_sources/tutorials/packages/viz/index.rst |    39 +
 .../tutorials/performance/backend/amp.ipynb        |   423 +
 .../tutorials/performance/backend/index.rst        |    63 +
 .../tutorials/performance/backend/mkldnn/index.rst |    40 +
 .../performance/backend/mkldnn/mkldnn_readme.ipynb |   566 +
 .../tutorials/performance/backend/profiler.ipynb   |   495 +
 .../performance/backend/tensorrt/index.rst         |    35 +
 .../_sources/tutorials/performance/backend/tvm.rst |    21 +
 .../tutorials/performance/compression/index.rst    |    56 +
 .../tutorials/performance/compression/int8.rst     |    21 +
 .../docs/_sources/tutorials/performance/index.rst  |   126 +
 .../python/docs/_static/apache_incubator_logo.png  |   Bin 0 -> 16552 bytes
 versions/master/api/python/docs/_static/autodoc.js |    51 +
 .../autograd_images/autograd_control_flow.png      |   Bin 0 -> 21635 bytes
 .../autograd_images/autograd_control_flow_grad.png |   Bin 0 -> 20585 bytes
 .../autograd_images/autograd_forward_backward.png  |   Bin 0 -> 63061 bytes
 .../_static/autograd_images/autograd_grad_req.mp4  |   Bin 0 -> 71224 bytes
 .../_static/autograd_images/autograd_gradient.png  |   Bin 0 -> 39559 bytes
 .../_static/autograd_images/autograd_graph.mp4     |   Bin 0 -> 113606 bytes
 .../_static/autograd_images/autograd_head_grad.mp4 |   Bin 0 -> 59549 bytes
 versions/master/api/python/docs/_static/basic.css  |   768 +
 .../master/api/python/docs/_static/doctools.js     |   315 +
 .../python/docs/_static/documentation_options.js   |    11 +
 .../master/api/python/docs/_static/feedback.css    |    37 +
 versions/master/api/python/docs/_static/file.png   |   Bin 0 -> 286 bytes
 .../docs/_static/font/Roboto/Roboto-Regular.eot    |   Bin 0 -> 56856 bytes
 .../docs/_static/font/Roboto/Roboto-Regular.ttf    |   Bin 0 -> 126072 bytes
 .../docs/_static/font/Roboto/Roboto-Regular.woff   |   Bin 0 -> 65388 bytes
 .../docs/_static/font/Roboto/Roboto-Regular.woff2  |   Bin 0 -> 49248 bytes
 .../api/python/docs/_static/fontawesome/all.css    |     5 +
 versions/master/api/python/docs/_static/fonts.css  |   390 +
 .../api/python/docs/_static/google_analytics.js    |    26 +
 .../master/api/python/docs/_static/jquery-3.4.1.js | 10598 ++++++++++++
 versions/master/api/python/docs/_static/jquery.js  |     2 +
 .../api/python/docs/_static/language_data.js       |   297 +
 .../iconfont/MaterialIcons-Regular.eot             |   Bin 0 -> 143258 bytes
 .../iconfont/MaterialIcons-Regular.svg             |  2373 +++
 .../iconfont/MaterialIcons-Regular.ttf             |   Bin 0 -> 128180 bytes
 .../iconfont/MaterialIcons-Regular.woff            |   Bin 0 -> 57620 bytes
 .../iconfont/MaterialIcons-Regular.woff2           |   Bin 0 -> 44300 bytes
 .../material.blue-deep_orange.min.css              |     8 +
 .../material.blue-deep_orange.min.css.bak          |     8 +
 .../python/docs/_static/minima-social-icons.svg    |    33 +
 versions/master/api/python/docs/_static/minus.png  |   Bin 0 -> 90 bytes
 .../master/api/python/docs/_static/mxnet-icon.png  |   Bin 0 -> 2741 bytes
 versions/master/api/python/docs/_static/mxnet.css  |   206 +
 .../master/api/python/docs/_static/mxnet_logo.png  |   Bin 0 -> 22390 bytes
 versions/master/api/python/docs/_static/plus.png   |   Bin 0 -> 90 bytes
 .../master/api/python/docs/_static/pygments.css    |    74 +
 .../master/api/python/docs/_static/searchtools.js  |   506 +
 .../docs/_static/sphinx_materialdesign_theme.css   |     2 +
 .../_static/sphinx_materialdesign_theme.css.map    |     1 +
 .../docs/_static/sphinx_materialdesign_theme.js    |   705 +
 .../_static/sphinx_materialdesign_theme.js.map     |     1 +
 .../api/python/docs/_static/underscore-1.3.1.js    |   999 ++
 .../master/api/python/docs/_static/underscore.js   |    31 +
 .../python/docs/_static/webfonts/fa-solid-900.eot  |   Bin 0 -> 197172 bytes
 .../python/docs/_static/webfonts/fa-solid-900.svg  |  2618 +++
 .../python/docs/_static/webfonts/fa-solid-900.ttf  |   Bin 0 -> 196952 bytes
 .../python/docs/_static/webfonts/fa-solid-900.woff |   Bin 0 -> 95436 bytes
 .../docs/_static/webfonts/fa-solid-900.woff2       |   Bin 0 -> 73852 bytes
 .../master/api/python/docs/api/autograd/index.html |  1643 ++
 .../master/api/python/docs/api/context/index.html  |  1583 ++
 .../python/docs/api/contrib/autograd/index.html    |  1283 ++
 .../master/api/python/docs/api/contrib/index.html  |  1338 ++
 .../api/python/docs/api/contrib/io/index.html      |  1430 ++
 .../api/python/docs/api/contrib/ndarray/index.html |  4337 +++++
 .../api/python/docs/api/contrib/onnx/index.html    |  1404 ++
 .../docs/api/contrib/quantization/index.html       |  1283 ++
 .../api/python/docs/api/contrib/symbol/index.html  |  4342 +++++
 .../python/docs/api/contrib/tensorboard/index.html |  1333 ++
 .../python/docs/api/contrib/tensorrt/index.html    |  1328 ++
 .../api/python/docs/api/contrib/text/index.html    |  1284 ++
 .../master/api/python/docs/api/engine/index.html   |  1333 ++
 .../master/api/python/docs/api/executor/index.html |  1524 ++
 .../master/api/python/docs/api/gluon/block.html    |  1707 ++
 .../master/api/python/docs/api/gluon/constant.html |  1573 ++
 .../api/python/docs/api/gluon/contrib/index.html   |  1725 ++
 .../api/python/docs/api/gluon/data/index.html      |  1789 ++
 .../docs/api/gluon/data/vision/datasets/index.html |  1530 ++
 .../python/docs/api/gluon/data/vision/index.html   |  1335 ++
 .../api/gluon/data/vision/transforms/index.html    |  1530 ++
 .../api/python/docs/api/gluon/hybrid_block.html    |  1830 +++
 .../master/api/python/docs/api/gluon/index.html    |  1401 ++
 .../api/python/docs/api/gluon/loss/index.html      |  2382 +++
 .../api/python/docs/api/gluon/metric/index.html    |  3977 +++++
 .../api/python/docs/api/gluon/model_zoo/index.html |  3151 ++++
 .../master/api/python/docs/api/gluon/nn/index.html |  5139 ++++++
 .../api/python/docs/api/gluon/parameter.html       |  1630 ++
 .../api/python/docs/api/gluon/parameter_dict.html  |  1283 ++
 .../api/python/docs/api/gluon/rnn/index.html       |  3440 ++++
 .../api/python/docs/api/gluon/symbol_block.html    |  1866 +++
 .../master/api/python/docs/api/gluon/trainer.html  |  1456 ++
 .../api/python/docs/api/gluon/utils/index.html     |  1443 ++
 versions/master/api/python/docs/api/index.html     |  1437 ++
 .../api/python/docs/api/initializer/index.html     |  1748 ++
 .../master/api/python/docs/api/kvstore/index.html  |  1283 ++
 .../api/python/docs/api/kvstore_server/index.html  |  1282 ++
 .../api/python/docs/api/legacy/callback/index.html |  1427 ++
 .../api/python/docs/api/legacy/image/index.html    |  2866 ++++
 .../master/api/python/docs/api/legacy/index.html   |  1319 ++
 .../api/python/docs/api/legacy/io/index.html       |  2781 ++++
 .../api/python/docs/api/legacy/monitor/index.html  |  1283 ++
 .../docs/api/legacy/ndarray/contrib/index.html     |  4671 ++++++
 .../docs/api/legacy/ndarray/image/index.html       |  1747 ++
 .../api/python/docs/api/legacy/ndarray/index.html  |  1366 ++
 .../docs/api/legacy/ndarray/linalg/index.html      |  2301 +++
 .../python/docs/api/legacy/ndarray/ndarray.html    | 16469 +++++++++++++++++++
 .../python/docs/api/legacy/ndarray/op/index.html   | 12952 +++++++++++++++
 .../docs/api/legacy/ndarray/random/index.html      |  2109 +++
 .../docs/api/legacy/ndarray/register/index.html    |  1285 ++
 .../docs/api/legacy/ndarray/sparse/index.html      |  5057 ++++++
 .../docs/api/legacy/ndarray/utils/index.html       |  1478 ++
 .../api/python/docs/api/legacy/recordio/index.html |  1753 ++
 .../docs/api/legacy/symbol/contrib/index.html      |  4563 +++++
 .../python/docs/api/legacy/symbol/image/index.html |  1747 ++
 .../api/python/docs/api/legacy/symbol/index.html   |  1321 ++
 .../docs/api/legacy/symbol/linalg/index.html       |  2301 +++
 .../python/docs/api/legacy/symbol/op/index.html    | 12915 +++++++++++++++
 .../docs/api/legacy/symbol/random/index.html       |  1909 +++
 .../docs/api/legacy/symbol/register/index.html     |  1285 ++
 .../docs/api/legacy/symbol/sparse/index.html       |  4044 +++++
 .../api/python/docs/api/legacy/symbol/symbol.html  | 15258 +++++++++++++++++
 .../docs/api/legacy/visualization/index.html       |  1389 ++
 .../api/python/docs/api/lr_scheduler/index.html    |  1429 ++
 .../master/api/python/docs/api/module/index.html   |  1282 ++
 versions/master/api/python/docs/api/np/arrays.html |  1320 ++
 .../api/python/docs/api/np/arrays.indexing.html    |  1643 ++
 .../api/python/docs/api/np/arrays.ndarray.html     |  2054 +++
 .../docs/api/np/generated/mxnet.np.absolute.html   |  1314 ++
 .../python/docs/api/np/generated/mxnet.np.add.html |  1330 ++
 .../docs/api/np/generated/mxnet.np.amax.html       |  1328 ++
 .../docs/api/np/generated/mxnet.np.amin.html       |  1324 ++
 .../docs/api/np/generated/mxnet.np.append.html     |  1304 ++
 .../docs/api/np/generated/mxnet.np.arange.html     |  1349 ++
 .../docs/api/np/generated/mxnet.np.arccos.html     |  1321 ++
 .../docs/api/np/generated/mxnet.np.arccosh.html    |  1332 ++
 .../docs/api/np/generated/mxnet.np.arcsin.html     |  1336 ++
 .../docs/api/np/generated/mxnet.np.arcsinh.html    |  1332 ++
 .../docs/api/np/generated/mxnet.np.arctan.html     |  1327 ++
 .../docs/api/np/generated/mxnet.np.arctan2.html    |  1355 ++
 .../docs/api/np/generated/mxnet.np.arctanh.html    |  1332 ++
 .../docs/api/np/generated/mxnet.np.argmax.html     |  1350 ++
 .../docs/api/np/generated/mxnet.np.argmin.html     |  1350 ++
 .../api/np/generated/mxnet.np.argpartition.html    |  1344 ++
 .../docs/api/np/generated/mxnet.np.argsort.html    |  1333 ++
 .../docs/api/np/generated/mxnet.np.argwhere.html   |  1305 ++
 .../docs/api/np/generated/mxnet.np.around.html     |  1334 ++
 .../docs/api/np/generated/mxnet.np.array.html      |  1336 ++
 .../api/np/generated/mxnet.np.array_split.html     |  1324 ++
 .../docs/api/np/generated/mxnet.np.atleast_1d.html |  1299 ++
 .../docs/api/np/generated/mxnet.np.atleast_2d.html |  1296 ++
 .../docs/api/np/generated/mxnet.np.atleast_3d.html |  1307 ++
 .../docs/api/np/generated/mxnet.np.average.html    |  1351 ++
 .../docs/api/np/generated/mxnet.np.bincount.html   |  1317 ++
 .../np/generated/mxnet.np.broadcast_arrays.html    |  1313 ++
 .../api/np/generated/mxnet.np.broadcast_to.html    |  1311 ++
 .../docs/api/np/generated/mxnet.np.cbrt.html       |  1313 ++
 .../docs/api/np/generated/mxnet.np.ceil.html       |  1323 ++
 .../docs/api/np/generated/mxnet.np.clip.html       |  1331 ++
 .../api/np/generated/mxnet.np.column_stack.html    |  1299 ++
 .../api/np/generated/mxnet.np.concatenate.html     |  1349 ++
 .../docs/api/np/generated/mxnet.np.copy.html       |  1314 ++
 .../docs/api/np/generated/mxnet.np.copysign.html   |  1312 ++
 .../docs/api/np/generated/mxnet.np.corrcoef.html   |  1325 ++
 .../docs/api/np/generated/mxnet.np.correlate.html  |  1332 ++
 .../python/docs/api/np/generated/mxnet.np.cos.html |  1320 ++
 .../docs/api/np/generated/mxnet.np.cosh.html       |  1316 ++
 .../api/np/generated/mxnet.np.count_nonzero.html   |  1332 ++
 .../python/docs/api/np/generated/mxnet.np.cov.html |  1382 ++
 .../docs/api/np/generated/mxnet.np.cross.html      |  1363 ++
 .../docs/api/np/generated/mxnet.np.cumsum.html     |  1335 ++
 .../docs/api/np/generated/mxnet.np.deg2rad.html    |  1321 ++
 .../docs/api/np/generated/mxnet.np.degrees.html    |  1328 ++
 .../docs/api/np/generated/mxnet.np.delete.html     |  1316 ++
 .../docs/api/np/generated/mxnet.np.diff.html       |  1308 ++
 .../docs/api/np/generated/mxnet.np.digitize.html   |  1376 ++
 .../docs/api/np/generated/mxnet.np.divide.html     |  1326 ++
 .../docs/api/np/generated/mxnet.np.divmod.html     |  1325 ++
 .../python/docs/api/np/generated/mxnet.np.dot.html |  1346 ++
 .../docs/api/np/generated/mxnet.np.dsplit.html     |  1343 ++
 .../docs/api/np/generated/mxnet.np.dstack.html     |  1326 ++
 .../docs/api/np/generated/mxnet.np.ediff1d.html    |  1306 ++
 .../docs/api/np/generated/mxnet.np.einsum.html     |  1504 ++
 .../docs/api/np/generated/mxnet.np.empty.html      |  1325 ++
 .../python/docs/api/np/generated/mxnet.np.exp.html |  1316 ++
 .../api/np/generated/mxnet.np.expand_dims.html     |  1346 ++
 .../docs/api/np/generated/mxnet.np.expm1.html      |  1316 ++
 .../docs/api/np/generated/mxnet.np.extract.html    |  1313 ++
 .../python/docs/api/np/generated/mxnet.np.eye.html |  1322 ++
 .../docs/api/np/generated/mxnet.np.fabs.html       |  1298 ++
 .../python/docs/api/np/generated/mxnet.np.fix.html |  1305 ++
 .../api/np/generated/mxnet.np.flatnonzero.html     |  1307 ++
 .../docs/api/np/generated/mxnet.np.flip.html       |  1343 ++
 .../docs/api/np/generated/mxnet.np.fliplr.html     |  1313 ++
 .../docs/api/np/generated/mxnet.np.flipud.html     |  1318 ++
 .../api/np/generated/mxnet.np.float_power.html     |  1342 ++
 .../docs/api/np/generated/mxnet.np.floor.html      |  1323 ++
 .../docs/api/np/generated/mxnet.np.fmax.html       |  1293 ++
 .../docs/api/np/generated/mxnet.np.fmin.html       |  1293 ++
 .../docs/api/np/generated/mxnet.np.fmod.html       |  1293 ++
 .../docs/api/np/generated/mxnet.np.frexp.html      |  1326 ++
 .../docs/api/np/generated/mxnet.np.full.html       |  1344 ++
 .../docs/api/np/generated/mxnet.np.genfromtxt.html |  1296 ++
 .../docs/api/np/generated/mxnet.np.heaviside.html  |  1320 ++
 .../docs/api/np/generated/mxnet.np.histogram.html  |  1316 ++
 .../api/np/generated/mxnet.np.histogram2d.html     |  1384 ++
 .../np/generated/mxnet.np.histogram_bin_edges.html |  1445 ++
 .../api/np/generated/mxnet.np.histogramdd.html     |  1335 ++
 .../docs/api/np/generated/mxnet.np.hsplit.html     |  1376 ++
 .../docs/api/np/generated/mxnet.np.hstack.html     |  1303 ++
 .../docs/api/np/generated/mxnet.np.hypot.html      |  1333 ++
 .../python/docs/api/np/generated/mxnet.np.i0.html  |  1324 ++
 .../docs/api/np/generated/mxnet.np.identity.html   |  1319 ++
 .../docs/api/np/generated/mxnet.np.inner.html      |  1348 ++
 .../docs/api/np/generated/mxnet.np.insert.html     |  1348 ++
 .../docs/api/np/generated/mxnet.np.interp.html     |  1337 ++
 .../docs/api/np/generated/mxnet.np.kron.html       |  1315 ++
 .../python/docs/api/np/generated/mxnet.np.lcm.html |  1324 ++
 .../docs/api/np/generated/mxnet.np.ldexp.html      |  1320 ++
 .../docs/api/np/generated/mxnet.np.lexsort.html    |  1346 ++
 .../api/np/generated/mxnet.np.linalg.cholesky.html |  1315 ++
 .../api/np/generated/mxnet.np.linalg.cond.html     |  1370 ++
 .../docs/api/np/generated/mxnet.np.linalg.det.html |  1308 ++
 .../docs/api/np/generated/mxnet.np.linalg.eig.html |  1333 ++
 .../api/np/generated/mxnet.np.linalg.eigh.html     |  1334 ++
 .../api/np/generated/mxnet.np.linalg.eigvals.html  |  1331 ++
 .../api/np/generated/mxnet.np.linalg.eigvalsh.html |  1326 ++
 .../docs/api/np/generated/mxnet.np.linalg.inv.html |  1307 ++
 .../api/np/generated/mxnet.np.linalg.lstsq.html    |  1328 ++
 .../np/generated/mxnet.np.linalg.matrix_power.html |  1331 ++
 .../np/generated/mxnet.np.linalg.matrix_rank.html  |  1310 ++
 .../np/generated/mxnet.np.linalg.multi_dot.html    |  1355 ++
 .../api/np/generated/mxnet.np.linalg.norm.html     |  1348 ++
 .../api/np/generated/mxnet.np.linalg.pinv.html     |  1327 ++
 .../docs/api/np/generated/mxnet.np.linalg.qr.html  |  1320 ++
 .../api/np/generated/mxnet.np.linalg.slogdet.html  |  1327 ++
 .../api/np/generated/mxnet.np.linalg.solve.html    |  1312 ++
 .../docs/api/np/generated/mxnet.np.linalg.svd.html |  1352 ++
 .../np/generated/mxnet.np.linalg.tensorinv.html    |  1319 ++
 .../np/generated/mxnet.np.linalg.tensorsolve.html  |  1312 ++
 .../docs/api/np/generated/mxnet.np.linspace.html   |  1363 ++
 .../python/docs/api/np/generated/mxnet.np.log.html |  1333 ++
 .../docs/api/np/generated/mxnet.np.log10.html      |  1316 ++
 .../docs/api/np/generated/mxnet.np.log1p.html      |  1328 ++
 .../docs/api/np/generated/mxnet.np.log2.html       |  1320 ++
 .../docs/api/np/generated/mxnet.np.logspace.html   |  1356 ++
 .../docs/api/np/generated/mxnet.np.matmul.html     |  1360 ++
 .../python/docs/api/np/generated/mxnet.np.max.html |  1348 ++
 .../docs/api/np/generated/mxnet.np.maximum.html    |  1313 ++
 .../docs/api/np/generated/mxnet.np.mean.html       |  1341 ++
 .../docs/api/np/generated/mxnet.np.median.html     |  1318 ++
 .../docs/api/np/generated/mxnet.np.meshgrid.html   |  1340 ++
 .../python/docs/api/np/generated/mxnet.np.min.html |  1344 ++
 .../docs/api/np/generated/mxnet.np.minimum.html    |  1313 ++
 .../python/docs/api/np/generated/mxnet.np.mod.html |  1313 ++
 .../docs/api/np/generated/mxnet.np.modf.html       |  1318 ++
 .../docs/api/np/generated/mxnet.np.moveaxis.html   |  1334 ++
 .../docs/api/np/generated/mxnet.np.msort.html      |  1288 ++
 .../docs/api/np/generated/mxnet.np.multiply.html   |  1329 ++
 .../docs/api/np/generated/mxnet.np.nan_to_num.html |  1351 ++
 .../docs/api/np/generated/mxnet.np.nanargmax.html  |  1303 ++
 .../docs/api/np/generated/mxnet.np.nanargmin.html  |  1303 ++
 .../docs/api/np/generated/mxnet.np.nancumprod.html |  1328 ++
 .../docs/api/np/generated/mxnet.np.nancumsum.html  |  1331 ++
 .../docs/api/np/generated/mxnet.np.nanmax.html     |  1351 ++
 .../docs/api/np/generated/mxnet.np.nanmedian.html  |  1347 ++
 .../docs/api/np/generated/mxnet.np.nanmin.html     |  1351 ++
 .../api/np/generated/mxnet.np.nanpercentile.html   |  1381 ++
 .../docs/api/np/generated/mxnet.np.nanprod.html    |  1330 ++
 .../api/np/generated/mxnet.np.nanquantile.html     |  1367 ++
 .../docs/api/np/generated/mxnet.np.ndarray.T.html  |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__abs__.html |  1270 ++
 .../api/np/generated/mxnet.np.ndarray.__add__.html |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__and__.html |  1271 ++
 .../np/generated/mxnet.np.ndarray.__bool__.html    |  1290 ++
 .../api/np/generated/mxnet.np.ndarray.__eq__.html  |  1291 ++
 .../np/generated/mxnet.np.ndarray.__float__.html   |  1290 ++
 .../api/np/generated/mxnet.np.ndarray.__ge__.html  |  1291 ++
 .../np/generated/mxnet.np.ndarray.__getitem__.html |  1419 ++
 .../api/np/generated/mxnet.np.ndarray.__gt__.html  |  1291 ++
 .../np/generated/mxnet.np.ndarray.__iadd__.html    |  1291 ++
 .../np/generated/mxnet.np.ndarray.__iand__.html    |  1271 ++
 .../np/generated/mxnet.np.ndarray.__imod__.html    |  1291 ++
 .../np/generated/mxnet.np.ndarray.__imul__.html    |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__int__.html |  1290 ++
 .../np/generated/mxnet.np.ndarray.__invert__.html  |  1271 ++
 .../api/np/generated/mxnet.np.ndarray.__ior__.html |  1271 ++
 .../np/generated/mxnet.np.ndarray.__isub__.html    |  1291 ++
 .../generated/mxnet.np.ndarray.__itruediv__.html   |  1291 ++
 .../np/generated/mxnet.np.ndarray.__ixor__.html    |  1271 ++
 .../api/np/generated/mxnet.np.ndarray.__le__.html  |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__len__.html |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__lt__.html  |  1291 ++
 .../np/generated/mxnet.np.ndarray.__matmul__.html  |  1271 ++
 .../api/np/generated/mxnet.np.ndarray.__mod__.html |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__mul__.html |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__ne__.html  |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__neg__.html |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__new__.html |  1271 ++
 .../api/np/generated/mxnet.np.ndarray.__or__.html  |  1271 ++
 .../api/np/generated/mxnet.np.ndarray.__pow__.html |  1291 ++
 .../np/generated/mxnet.np.ndarray.__reduce__.html  |  1291 ++
 .../np/generated/mxnet.np.ndarray.__repr__.html    |  1337 ++
 .../np/generated/mxnet.np.ndarray.__setitem__.html |  1336 ++
 .../generated/mxnet.np.ndarray.__setstate__.html   |  1290 ++
 .../api/np/generated/mxnet.np.ndarray.__str__.html |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__sub__.html |  1291 ++
 .../np/generated/mxnet.np.ndarray.__truediv__.html |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.__xor__.html |  1271 ++
 .../api/np/generated/mxnet.np.ndarray.all.html     |  1270 ++
 .../api/np/generated/mxnet.np.ndarray.any.html     |  1270 ++
 .../api/np/generated/mxnet.np.ndarray.argmax.html  |  1292 ++
 .../api/np/generated/mxnet.np.ndarray.argmin.html  |  1292 ++
 .../api/np/generated/mxnet.np.ndarray.argsort.html |  1273 ++
 .../api/np/generated/mxnet.np.ndarray.astype.html  |  1341 ++
 .../api/np/generated/mxnet.np.ndarray.clip.html    |  1292 ++
 .../api/np/generated/mxnet.np.ndarray.copy.html    |  1305 ++
 .../api/np/generated/mxnet.np.ndarray.cumsum.html  |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.dtype.html   |  1308 ++
 .../api/np/generated/mxnet.np.ndarray.flatten.html |  1291 ++
 .../docs/api/np/generated/mxnet.np.ndarray.html    |  2936 ++++
 .../api/np/generated/mxnet.np.ndarray.item.html    |  1308 ++
 .../api/np/generated/mxnet.np.ndarray.max.html     |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.mean.html    |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.min.html     |  1293 ++
 .../api/np/generated/mxnet.np.ndarray.ndim.html    |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.nonzero.html |  1299 ++
 .../api/np/generated/mxnet.np.ndarray.prod.html    |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.repeat.html  |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.reshape.html |  1296 ++
 .../api/np/generated/mxnet.np.ndarray.round.html   |  1273 ++
 .../api/np/generated/mxnet.np.ndarray.shape.html   |  1303 ++
 .../api/np/generated/mxnet.np.ndarray.size.html    |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.sort.html    |  1273 ++
 .../api/np/generated/mxnet.np.ndarray.squeeze.html |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.std.html     |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.sum.html     |  1291 ++
 .../np/generated/mxnet.np.ndarray.swapaxes.html    |  1292 ++
 .../api/np/generated/mxnet.np.ndarray.take.html    |  1293 ++
 .../api/np/generated/mxnet.np.ndarray.tolist.html  |  1290 ++
 .../np/generated/mxnet.np.ndarray.transpose.html   |  1291 ++
 .../api/np/generated/mxnet.np.ndarray.var.html     |  1291 ++
 .../docs/api/np/generated/mxnet.np.negative.html   |  1310 ++
 .../docs/api/np/generated/mxnet.np.nonzero.html    |  1343 ++
 .../docs/api/np/generated/mxnet.np.ones.html       |  1334 ++
 .../docs/api/np/generated/mxnet.np.ones_like.html  |  1345 ++
 .../docs/api/np/generated/mxnet.np.outer.html      |  1343 ++
 .../docs/api/np/generated/mxnet.np.partition.html  |  1367 ++
 .../docs/api/np/generated/mxnet.np.percentile.html |  1329 ++
 .../docs/api/np/generated/mxnet.np.positive.html   |  1290 ++
 .../docs/api/np/generated/mxnet.np.power.html      |  1333 ++
 .../docs/api/np/generated/mxnet.np.prod.html       |  1358 ++
 .../python/docs/api/np/generated/mxnet.np.ptp.html |  1349 ++
 .../docs/api/np/generated/mxnet.np.quantile.html   |  1349 ++
 .../docs/api/np/generated/mxnet.np.rad2deg.html    |  1320 ++
 .../docs/api/np/generated/mxnet.np.radians.html    |  1321 ++
 .../docs/api/np/generated/mxnet.np.ravel.html      |  1332 ++
 .../docs/api/np/generated/mxnet.np.real.html       |  1302 ++
 .../docs/api/np/generated/mxnet.np.reciprocal.html |  1329 ++
 .../docs/api/np/generated/mxnet.np.remainder.html  |  1313 ++
 .../docs/api/np/generated/mxnet.np.repeat.html     |  1330 ++
 .../docs/api/np/generated/mxnet.np.reshape.html    |  1354 ++
 .../docs/api/np/generated/mxnet.np.resize.html     |  1318 ++
 .../docs/api/np/generated/mxnet.np.rint.html       |  1319 ++
 .../docs/api/np/generated/mxnet.np.roll.html       |  1348 ++
 .../docs/api/np/generated/mxnet.np.rollaxis.html   |  1299 ++
 .../docs/api/np/generated/mxnet.np.rot90.html      |  1334 ++
 .../docs/api/np/generated/mxnet.np.round_.html     |  1278 ++
 .../api/np/generated/mxnet.np.searchsorted.html    |  1344 ++
 .../np/generated/mxnet.np.set_printoptions.html    |  1296 ++
 .../docs/api/np/generated/mxnet.np.sign.html       |  1336 ++
 .../docs/api/np/generated/mxnet.np.signbit.html    |  1305 ++
 .../python/docs/api/np/generated/mxnet.np.sin.html |  1317 ++
 .../docs/api/np/generated/mxnet.np.sinh.html       |  1321 ++
 .../docs/api/np/generated/mxnet.np.sort.html       |  1303 ++
 .../docs/api/np/generated/mxnet.np.spacing.html    |  1309 ++
 .../docs/api/np/generated/mxnet.np.split.html      |  1356 ++
 .../docs/api/np/generated/mxnet.np.sqrt.html       |  1317 ++
 .../docs/api/np/generated/mxnet.np.square.html     |  1322 ++
 .../docs/api/np/generated/mxnet.np.squeeze.html    |  1341 ++
 .../docs/api/np/generated/mxnet.np.stack.html      |  1347 ++
 .../python/docs/api/np/generated/mxnet.np.std.html |  1348 ++
 .../docs/api/np/generated/mxnet.np.subtract.html   |  1330 ++
 .../python/docs/api/np/generated/mxnet.np.sum.html |  1375 ++
 .../docs/api/np/generated/mxnet.np.swapaxes.html   |  1337 ++
 .../python/docs/api/np/generated/mxnet.np.tan.html |  1308 ++
 .../docs/api/np/generated/mxnet.np.tanh.html       |  1328 ++
 .../docs/api/np/generated/mxnet.np.tensordot.html  |  1349 ++
 .../docs/api/np/generated/mxnet.np.tile.html       |  1351 ++
 .../docs/api/np/generated/mxnet.np.trace.html      |  1330 ++
 .../docs/api/np/generated/mxnet.np.transpose.html  |  1326 ++
 .../docs/api/np/generated/mxnet.np.trapz.html      |  1327 ++
 .../docs/api/np/generated/mxnet.np.tril.html       |  1323 ++
 .../docs/api/np/generated/mxnet.np.trim_zeros.html |  1302 ++
 .../api/np/generated/mxnet.np.true_divide.html     |  1330 ++
 .../docs/api/np/generated/mxnet.np.trunc.html      |  1325 ++
 .../docs/api/np/generated/mxnet.np.unique.html     |  1380 ++
 .../docs/api/np/generated/mxnet.np.unwrap.html     |  1305 ++
 .../python/docs/api/np/generated/mxnet.np.var.html |  1354 ++
 .../docs/api/np/generated/mxnet.np.vdot.html       |  1327 ++
 .../docs/api/np/generated/mxnet.np.vsplit.html     |  1361 ++
 .../docs/api/np/generated/mxnet.np.vstack.html     |  1329 ++
 .../docs/api/np/generated/mxnet.np.where.html      |  1335 ++
 .../docs/api/np/generated/mxnet.np.zeros.html      |  1329 ++
 .../docs/api/np/generated/mxnet.np.zeros_like.html |  1345 ++
 versions/master/api/python/docs/api/np/index.html  |  1306 ++
 .../api/python/docs/api/np/random/index.html       |  1407 ++
 .../docs/api/np/routines.array-creation.html       |  1481 ++
 .../docs/api/np/routines.array-manipulation.html   |  1536 ++
 .../master/api/python/docs/api/np/routines.html    |  1375 ++
 .../master/api/python/docs/api/np/routines.io.html |  1453 ++
 .../api/python/docs/api/np/routines.linalg.html    |  1437 ++
 .../api/python/docs/api/np/routines.math.html      |  1661 ++
 .../api/python/docs/api/np/routines.sort.html      |  1360 ++
 .../python/docs/api/np/routines.statistics.html    |  1392 ++
 .../api/npx/generated/mxnet.npx.activation.html    |  1313 ++
 .../api/npx/generated/mxnet.npx.batch_dot.html     |  1316 ++
 .../api/npx/generated/mxnet.npx.batch_flatten.html |  1323 ++
 .../api/npx/generated/mxnet.npx.batch_norm.html    |  1353 ++
 .../api/npx/generated/mxnet.npx.convolution.html   |  1381 ++
 .../docs/api/npx/generated/mxnet.npx.cpu.html      |  1313 ++
 .../api/npx/generated/mxnet.npx.cpu_pinned.html    |  1313 ++
 .../npx/generated/mxnet.npx.current_context.html   |  1311 ++
 .../docs/api/npx/generated/mxnet.npx.dropout.html  |  1336 ++
 .../api/npx/generated/mxnet.npx.embedding.html     |  1352 ++
 .../npx/generated/mxnet.npx.fully_connected.html   |  1334 ++
 .../docs/api/npx/generated/mxnet.npx.gamma.html    |  1304 ++
 .../docs/api/npx/generated/mxnet.npx.gpu.html      |  1315 ++
 .../npx/generated/mxnet.npx.gpu_memory_info.html   |  1303 ++
 .../api/npx/generated/mxnet.npx.layer_norm.html    |  1324 ++
 .../api/npx/generated/mxnet.npx.leaky_relu.html    |  1323 ++
 .../docs/api/npx/generated/mxnet.npx.load.html     |  1304 ++
 .../generated/mxnet.npx.multibox_detection.html    |  1312 ++
 .../npx/generated/mxnet.npx.multibox_prior.html    |  1308 ++
 .../npx/generated/mxnet.npx.multibox_target.html   |  1311 ++
 .../docs/api/npx/generated/mxnet.npx.num_gpus.html |  1300 ++
 .../docs/api/npx/generated/mxnet.npx.one_hot.html  |  1338 ++
 .../docs/api/npx/generated/mxnet.npx.pick.html     |  1341 ++
 .../docs/api/npx/generated/mxnet.npx.pooling.html  |  1361 ++
 .../docs/api/npx/generated/mxnet.npx.reset_np.html |  1289 ++
 .../api/npx/generated/mxnet.npx.reshape_like.html  |  1331 ++
 .../docs/api/npx/generated/mxnet.npx.rnn.html      |  1370 ++
 .../api/npx/generated/mxnet.npx.roi_pooling.html   |  1343 ++
 .../docs/api/npx/generated/mxnet.npx.save.html     |  1306 ++
 .../api/npx/generated/mxnet.npx.sequence_mask.html |  1370 ++
 .../docs/api/npx/generated/mxnet.npx.set_np.html   |  1372 ++
 .../docs/api/npx/generated/mxnet.npx.sigmoid.html  |  1308 ++
 .../api/npx/generated/mxnet.npx.smooth_l1.html     |  1317 ++
 .../docs/api/npx/generated/mxnet.npx.softmax.html  |  1325 ++
 .../docs/api/npx/generated/mxnet.npx.topk.html     |  1340 ++
 .../docs/api/npx/generated/mxnet.npx.waitall.html  |  1294 ++
 versions/master/api/python/docs/api/npx/index.html |  1463 ++
 .../api/python/docs/api/optimizer/index.html       |  3632 ++++
 .../master/api/python/docs/api/profiler/index.html |  1837 +++
 versions/master/api/python/docs/api/rtc/index.html |  1440 ++
 .../master/api/python/docs/api/runtime/index.html  |  1412 ++
 .../api/python/docs/api/test_utils/index.html      |  2578 +++
 .../master/api/python/docs/api/util/index.html     |  2140 +++
 versions/master/api/python/docs/genindex.html      |  9358 +++++++++++
 versions/master/api/python/docs/index.html         |  1306 ++
 versions/master/api/python/docs/objects.inv        |   Bin 0 -> 93121 bytes
 versions/master/api/python/docs/py-modindex.html   |  1573 ++
 versions/master/api/python/docs/search.html        |  1282 ++
 versions/master/api/python/docs/searchindex.js     |     1 +
 .../python/docs/tutorials/deploy/export/index.html |  1298 ++
 .../docs/tutorials/deploy/export/index.html.bak    |  1298 ++
 .../python/docs/tutorials/deploy/export/onnx.html  |  1651 ++
 .../docs/tutorials/deploy/export/onnx.html.bak     |  1651 ++
 .../api/python/docs/tutorials/deploy/index.html    |  1372 ++
 .../python/docs/tutorials/deploy/index.html.bak    |  1372 ++
 .../docs/tutorials/deploy/inference/cpp.html       |  1285 ++
 .../docs/tutorials/deploy/inference/cpp.html.bak   |  1285 ++
 .../inference/image_classification_jetson.html     |  1594 ++
 .../inference/image_classification_jetson.html.bak |  1594 ++
 .../docs/tutorials/deploy/inference/index.html     |  1308 ++
 .../docs/tutorials/deploy/inference/index.html.bak |  1308 ++
 .../docs/tutorials/deploy/run-on-aws/cloud.html    |  1292 ++
 .../tutorials/deploy/run-on-aws/cloud.html.bak     |  1292 ++
 .../docs/tutorials/deploy/run-on-aws/index.html    |  1304 ++
 .../tutorials/deploy/run-on-aws/index.html.bak     |  1304 ++
 .../docs/tutorials/deploy/run-on-aws/use_ec2.html  |  1326 ++
 .../tutorials/deploy/run-on-aws/use_ec2.html.bak   |  1326 ++
 .../tutorials/deploy/run-on-aws/use_sagemaker.html |  1340 ++
 .../deploy/run-on-aws/use_sagemaker.html.bak       |  1340 ++
 .../api/python/docs/tutorials/extend/customop.html |  1769 ++
 .../python/docs/tutorials/extend/customop.html.bak |  1769 ++
 .../api/python/docs/tutorials/extend/index.html    |  1312 ++
 .../python/docs/tutorials/extend/index.html.bak    |  1312 ++
 .../getting-started/crash-course/1-ndarray.html    |  1662 ++
 .../crash-course/1-ndarray.html.bak                |  1662 ++
 .../getting-started/crash-course/2-nn.html         |  1670 ++
 .../getting-started/crash-course/2-nn.html.bak     |  1670 ++
 .../getting-started/crash-course/3-autograd.html   |  1618 ++
 .../crash-course/3-autograd.html.bak               |  1618 ++
 .../getting-started/crash-course/4-train.html      |  1713 ++
 .../getting-started/crash-course/4-train.html.bak  |  1713 ++
 .../getting-started/crash-course/5-predict.html    |  1687 ++
 .../crash-course/5-predict.html.bak                |  1687 ++
 .../getting-started/crash-course/6-use_gpus.html   |  1668 ++
 .../crash-course/6-use_gpus.html.bak               |  1668 ++
 .../getting-started/crash-course/index.html        |  1296 ++
 .../getting-started/crash-course/index.html.bak    |  1296 ++
 .../gluon_from_experiment_to_deployment.html       |  1772 ++
 .../gluon_from_experiment_to_deployment.html.bak   |  1772 ++
 .../docs/tutorials/getting-started/index.html      |  1307 ++
 .../docs/tutorials/getting-started/index.html.bak  |  1307 ++
 .../logistic_regression_explained.html             |  1753 ++
 .../logistic_regression_explained.html.bak         |  1753 ++
 .../tutorials/getting-started/to-mxnet/index.html  |  1306 ++
 .../getting-started/to-mxnet/index.html.bak        |  1306 ++
 .../getting-started/to-mxnet/pytorch.html          |  2516 +++
 .../getting-started/to-mxnet/pytorch.html.bak      |  2516 +++
 .../master/api/python/docs/tutorials/index.html    |  1381 ++
 .../api/python/docs/tutorials/index.html.bak       |  1381 ++
 .../docs/tutorials/packages/autograd/index.html    |  1538 ++
 .../tutorials/packages/autograd/index.html.bak     |  1538 ++
 .../gluon/blocks/activations/activations.html      |  1773 ++
 .../gluon/blocks/activations/activations.html.bak  |  1773 ++
 .../packages/gluon/blocks/custom-layer.html        |  1734 ++
 .../packages/gluon/blocks/custom-layer.html.bak    |  1734 ++
 .../gluon/blocks/custom_layer_beginners.html       |  1756 ++
 .../gluon/blocks/custom_layer_beginners.html.bak   |  1756 ++
 .../tutorials/packages/gluon/blocks/hybridize.html |  1858 +++
 .../packages/gluon/blocks/hybridize.html.bak       |  1858 +++
 .../tutorials/packages/gluon/blocks/index.html     |  1297 ++
 .../tutorials/packages/gluon/blocks/index.html.bak |  1297 ++
 .../docs/tutorials/packages/gluon/blocks/init.html |  1783 ++
 .../tutorials/packages/gluon/blocks/init.html.bak  |  1783 ++
 .../tutorials/packages/gluon/blocks/naming.html    |  1661 ++
 .../packages/gluon/blocks/naming.html.bak          |  1661 ++
 .../docs/tutorials/packages/gluon/blocks/nn.html   |  1725 ++
 .../tutorials/packages/gluon/blocks/nn.html.bak    |  1725 ++
 .../packages/gluon/blocks/parameters.html          |  1810 ++
 .../packages/gluon/blocks/parameters.html.bak      |  1810 ++
 .../packages/gluon/blocks/save_load_params.html    |  1790 ++
 .../gluon/blocks/save_load_params.html.bak         |  1790 ++
 .../packages/gluon/data/data_augmentation.html     |  1718 ++
 .../packages/gluon/data/data_augmentation.html.bak |  1718 ++
 .../tutorials/packages/gluon/data/datasets.html    |  1830 +++
 .../packages/gluon/data/datasets.html.bak          |  1830 +++
 .../docs/tutorials/packages/gluon/data/index.html  |  1297 ++
 .../tutorials/packages/gluon/data/index.html.bak   |  1297 ++
 .../docs/tutorials/packages/gluon/image/index.html |  1344 ++
 .../tutorials/packages/gluon/image/index.html.bak  |  1344 ++
 .../tutorials/packages/gluon/image/info_gan.html   |  1981 +++
 .../packages/gluon/image/info_gan.html.bak         |  1981 +++
 .../docs/tutorials/packages/gluon/image/mnist.html |  1867 +++
 .../tutorials/packages/gluon/image/mnist.html.bak  |  1867 +++
 .../docs/tutorials/packages/gluon/index.html       |  1434 ++
 .../docs/tutorials/packages/gluon/index.html.bak   |  1434 ++
 .../tutorials/packages/gluon/loss/custom-loss.html |  1748 ++
 .../packages/gluon/loss/custom-loss.html.bak       |  1748 ++
 .../docs/tutorials/packages/gluon/loss/index.html  |  1291 ++
 .../tutorials/packages/gluon/loss/index.html.bak   |  1291 ++
 .../packages/gluon/loss/kl_divergence.html         |  1407 ++
 .../packages/gluon/loss/kl_divergence.html.bak     |  1407 ++
 .../docs/tutorials/packages/gluon/loss/loss.html   |  1870 +++
 .../tutorials/packages/gluon/loss/loss.html.bak    |  1870 +++
 .../docs/tutorials/packages/gluon/text/gnmt.html   |  1750 ++
 .../tutorials/packages/gluon/text/gnmt.html.bak    |  1750 ++
 .../docs/tutorials/packages/gluon/text/index.html  |  1374 ++
 .../tutorials/packages/gluon/text/index.html.bak   |  1374 ++
 .../tutorials/packages/gluon/text/transformer.html |  1843 +++
 .../packages/gluon/text/transformer.html.bak       |  1843 +++
 .../packages/gluon/training/fit_api_tutorial.html  |  1791 ++
 .../gluon/training/fit_api_tutorial.html.bak       |  1791 ++
 .../tutorials/packages/gluon/training/index.html   |  1292 ++
 .../packages/gluon/training/index.html.bak         |  1292 ++
 .../gluon/training/learning_rates/index.html       |  1292 ++
 .../gluon/training/learning_rates/index.html.bak   |  1292 ++
 .../learning_rates/learning_rate_finder.html       |  1814 ++
 .../learning_rates/learning_rate_finder.html.bak   |  1814 ++
 .../learning_rates/learning_rate_schedules.html    |  1843 +++
 .../learning_rate_schedules.html.bak               |  1843 +++
 .../learning_rate_schedules_advanced.html          |  1845 +++
 .../learning_rate_schedules_advanced.html.bak      |  1845 +++
 .../gluon/training/normalization/index.html        |  1887 +++
 .../gluon/training/normalization/index.html.bak    |  1887 +++
 .../tutorials/packages/gluon/training/trainer.html |  1685 ++
 .../packages/gluon/training/trainer.html.bak       |  1685 ++
 .../api/python/docs/tutorials/packages/index.html  |  1344 ++
 .../python/docs/tutorials/packages/index.html.bak  |  1344 ++
 .../docs/tutorials/packages/kvstore/index.html     |  1309 ++
 .../docs/tutorials/packages/kvstore/index.html.bak |  1309 ++
 .../docs/tutorials/packages/kvstore/kvstore.html   |  1649 ++
 .../tutorials/packages/kvstore/kvstore.html.bak    |  1649 ++
 .../docs/tutorials/packages/legacy/index.html      |  1296 ++
 .../docs/tutorials/packages/legacy/index.html.bak  |  1296 ++
 .../packages/legacy/ndarray/01-ndarray-intro.html  |  1670 ++
 .../legacy/ndarray/01-ndarray-intro.html.bak       |  1670 ++
 .../legacy/ndarray/02-ndarray-operations.html      |  1774 ++
 .../legacy/ndarray/02-ndarray-operations.html.bak  |  1774 ++
 .../legacy/ndarray/03-ndarray-contexts.html        |  1575 ++
 .../legacy/ndarray/03-ndarray-contexts.html.bak    |  1575 ++
 .../legacy/ndarray/gotchas_numpy_in_mxnet.html     |  1666 ++
 .../legacy/ndarray/gotchas_numpy_in_mxnet.html.bak |  1666 ++
 .../tutorials/packages/legacy/ndarray/index.html   |  1309 ++
 .../packages/legacy/ndarray/index.html.bak         |  1309 ++
 .../packages/legacy/ndarray/sparse/csr.html        |  2032 +++
 .../packages/legacy/ndarray/sparse/csr.html.bak    |  2032 +++
 .../packages/legacy/ndarray/sparse/index.html      |  1346 ++
 .../packages/legacy/ndarray/sparse/index.html.bak  |  1346 ++
 .../packages/legacy/ndarray/sparse/row_sparse.html |  2040 +++
 .../legacy/ndarray/sparse/row_sparse.html.bak      |  2040 +++
 .../legacy/ndarray/sparse/train_gluon.html         |  2044 +++
 .../legacy/ndarray/sparse/train_gluon.html.bak     |  2044 +++
 .../docs/tutorials/packages/np/cheat-sheet.html    |  2432 +++
 .../tutorials/packages/np/cheat-sheet.html.bak     |  2432 +++
 .../python/docs/tutorials/packages/np/index.html   |  1294 ++
 .../docs/tutorials/packages/np/index.html.bak      |  1294 ++
 .../docs/tutorials/packages/np/np-vs-numpy.html    |  1645 ++
 .../tutorials/packages/np/np-vs-numpy.html.bak     |  1645 ++
 .../tutorials/packages/onnx/fine_tuning_gluon.html |  2021 +++
 .../packages/onnx/fine_tuning_gluon.html.bak       |  2021 +++
 .../python/docs/tutorials/packages/onnx/index.html |  1303 ++
 .../docs/tutorials/packages/onnx/index.html.bak    |  1303 ++
 .../packages/onnx/inference_on_onnx_model.html     |  1781 ++
 .../packages/onnx/inference_on_onnx_model.html.bak |  1781 ++
 .../docs/tutorials/packages/optimizer/index.html   |  1955 +++
 .../tutorials/packages/optimizer/index.html.bak    |  1955 +++
 .../python/docs/tutorials/packages/viz/index.html  |  1309 ++
 .../docs/tutorials/packages/viz/index.html.bak     |  1309 ++
 .../docs/tutorials/performance/backend/amp.html    |  1806 ++
 .../tutorials/performance/backend/amp.html.bak     |  1806 ++
 .../docs/tutorials/performance/backend/index.html  |  1310 ++
 .../tutorials/performance/backend/index.html.bak   |  1310 ++
 .../performance/backend/mkldnn/index.html          |  1296 ++
 .../performance/backend/mkldnn/index.html.bak      |  1296 ++
 .../performance/backend/mkldnn/mkldnn_readme.html  |  1562 ++
 .../backend/mkldnn/mkldnn_readme.html.bak          |  1562 ++
 .../tutorials/performance/backend/profiler.html    |  1858 +++
 .../performance/backend/profiler.html.bak          |  1858 +++
 .../performance/backend/tensorrt/index.html        |  1292 ++
 .../performance/backend/tensorrt/index.html.bak    |  1292 ++
 .../docs/tutorials/performance/backend/tvm.html    |  1285 ++
 .../tutorials/performance/backend/tvm.html.bak     |  1285 ++
 .../tutorials/performance/compression/index.html   |  1304 ++
 .../performance/compression/index.html.bak         |  1304 ++
 .../tutorials/performance/compression/int8.html    |  1285 ++
 .../performance/compression/int8.html.bak          |  1285 ++
 .../python/docs/tutorials/performance/index.html   |  1356 ++
 .../docs/tutorials/performance/index.html.bak      |  1356 ++
 versions/master/api/r.html                         |   557 +
 versions/master/api/r/docs/tutorials.html          |   764 +
 .../api/r/docs/tutorials/char_rnn_model.html       |   813 +
 .../classify_real_image_with_pretrained_model.html |   690 +
 .../api/r/docs/tutorials/custom_iterator.html      |   664 +
 .../api/r/docs/tutorials/multi_dim_lstm.html       |   822 +
 versions/master/api/r/docs/tutorials/ndarray.html  |   712 +
 versions/master/api/r/docs/tutorials/symbol.html   |   625 +
 versions/master/api/scala.html                     |   567 +
 versions/master/api/scala/docs/tutorials.html      |   763 +
 .../master/api/scala/docs/tutorials/infer.html     |   576 +
 versions/master/api/scala/docs/tutorials/io.html   |   703 +
 .../master/api/scala/docs/tutorials/kvstore.html   |   634 +
 .../master/api/scala/docs/tutorials/ndarray.html   |   688 +
 .../master/api/scala/docs/tutorials/symbol.html    |   634 +
 .../scala/docs/tutorials/symbol_in_pictures.html   |   609 +
 versions/master/assets/img/Github.svg              |     1 +
 versions/master/assets/img/R_logo.svg              |    14 +
 versions/master/assets/img/algorithm.svg           |     1 +
 versions/master/assets/img/algorithmv1.svg         |     1 +
 .../master/assets/img/apache_incubator_logo.png    |   Bin 0 -> 16552 bytes
 versions/master/assets/img/api.svg                 |     1 +
 .../master/assets/img/artificial-intelligence.svg  |    20 +
 versions/master/assets/img/autogluon.png           |   Bin 0 -> 11687 bytes
 versions/master/assets/img/book.svg                |     1 +
 versions/master/assets/img/bottom-min.jpg          |   Bin 0 -> 952968 bytes
 versions/master/assets/img/chip.svg                |     1 +
 versions/master/assets/img/circuit.svg             |    66 +
 versions/master/assets/img/clipboard.svg           |    47 +
 versions/master/assets/img/clojure_logo.svg        |    50 +
 versions/master/assets/img/coach_logo.png          |   Bin 0 -> 41911 bytes
 versions/master/assets/img/compass.svg             |    47 +
 versions/master/assets/img/cpp_logo.svg            |    25 +
 .../master/assets/img/dev_guide_profilling_1.png   |   Bin 0 -> 267358 bytes
 .../master/assets/img/dev_guide_profilling_2.png   |   Bin 0 -> 166792 bytes
 .../master/assets/img/dev_guide_profilling_3.png   |   Bin 0 -> 110434 bytes
 .../master/assets/img/dev_guide_profilling_4.png   |   Bin 0 -> 96117 bytes
 .../master/assets/img/dev_guide_profilling_5.png   |   Bin 0 -> 113453 bytes
 .../master/assets/img/dev_guide_profilling_6.png   |   Bin 0 -> 120953 bytes
 .../master/assets/img/dev_guide_profilling_7.png   |   Bin 0 -> 142486 bytes
 versions/master/assets/img/front.jpg               |   Bin 0 -> 280416 bytes
 versions/master/assets/img/horovod.png             |   Bin 0 -> 50211 bytes
 versions/master/assets/img/java_logo.svg           |    13 +
 versions/master/assets/img/julia_logo.svg          |    10 +
 versions/master/assets/img/keras.png               |   Bin 0 -> 13784 bytes
 versions/master/assets/img/line-graph.svg          |   107 +
 versions/master/assets/img/logos.png               |   Bin 0 -> 113062 bytes
 versions/master/assets/img/mxfusion.png            |   Bin 0 -> 21013 bytes
 .../assets/img/mxnet-background-compressed.jpeg    |   Bin 0 -> 86747 bytes
 versions/master/assets/img/mxnet_logo.png          |   Bin 0 -> 22390 bytes
 versions/master/assets/img/mxnet_m.png             |   Bin 0 -> 3463 bytes
 versions/master/assets/img/octocat.png             |   Bin 0 -> 32590 bytes
 versions/master/assets/img/optuna.png              |   Bin 0 -> 92197 bytes
 versions/master/assets/img/perl_logo.svg           |     1 +
 versions/master/assets/img/programming.svg         |    55 +
 versions/master/assets/img/programmingv1.svg       |   109 +
 versions/master/assets/img/python_logo.svg         |   269 +
 versions/master/assets/img/scala_logo.svg          |     1 +
 versions/master/assets/img/search-icon.svg         |     3 +
 versions/master/assets/img/search.svg              |     1 +
 versions/master/assets/img/slack-logo-icon.svg     |    33 +
 versions/master/assets/img/tensorly_logo.png       |   Bin 0 -> 100093 bytes
 versions/master/assets/img/textbook.svg            |     1 +
 versions/master/assets/img/tune.png                |   Bin 0 -> 24342 bytes
 versions/master/assets/img/tvm.png                 |   Bin 0 -> 4808 bytes
 versions/master/assets/img/video-tutorial.svg      |     2 +
 versions/master/assets/img/visual.svg              |     1 +
 versions/master/assets/img/xfer.png                |   Bin 0 -> 8932 bytes
 versions/master/assets/js/clipboard.js             |     7 +
 versions/master/assets/js/copycode.js              |    86 +
 versions/master/assets/js/feedback.js              |    33 +
 versions/master/assets/js/globalSearch.js          |   118 +
 versions/master/assets/js/jquery-3.3.1.min.js      |     2 +
 versions/master/assets/js/options.js               |   163 +
 versions/master/assets/main.css                    |   906 +
 versions/master/assets/main.css.map                |    42 +
 versions/master/assets/minima-social-icons.svg     |    33 +
 versions/master/blog/index.html                    |   356 +
 versions/master/community/code_guide.html          |   399 +
 versions/master/community/code_review.html         |   472 +
 versions/master/community/committer_guide.html     |   432 +
 versions/master/community/community.html           |   434 +
 versions/master/community/document.html            |   437 +
 versions/master/community/error_handling.html      |   432 +
 versions/master/community/git_howto.html           |   483 +
 versions/master/community/index.html               |   487 +
 versions/master/community/pull_request.html        |   433 +
 versions/master/ecosystem/index.html               |   541 +
 versions/master/features/index.html                |   420 +
 versions/master/feed.xml                           |     1 +
 versions/master/get_started/build_from_source.html |   577 +
 versions/master/get_started/download.html          |   491 +
 versions/master/get_started/index.html             |  1754 ++
 versions/master/get_started/jetson_setup.html      |   517 +
 versions/master/get_started/validate_mxnet.html    |   462 +
 versions/master/index.html                         |   547 +
 1358 files changed, 1202639 insertions(+)

diff --git a/versions/master/404.html b/versions/master/404.html
new file mode 100644
index 0000000..d122690
--- /dev/null
+++ b/versions/master/404.html
@@ -0,0 +1,336 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>Apache MXNet | A flexible and efficient library for deep learning.</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="Apache MXNet" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/404.html" />
+<meta property="og:url" content="https://mxnet.apache.org/404.html" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/404.html","headline":"Apache MXNet","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <style type="text/css" media="screen">
+  .container {
+    margin: 10px auto;
+    max-width: 600px;
+    text-align: center;
+  }
+  h1 {
+    margin: 30px 0;
+    font-size: 4em;
+    line-height: 1;
+    letter-spacing: -1px;
+  }
+</style>
+
+<div class="container">
+  <h1>404</h1>
+
+  <p><strong>Page not found :'(</strong></p>
+
+  <p><b>Due to a recent redesign of the website, some items have moved</b>
+    We're working towards adding redirects. Useful links:</p>
+  <div style="background-color:white;">
+    <li><a href="/api/python/docs/tutorials/">Python Tutorials</a></li>
+    <li><a href="/api/python/docs/api/">Python API Documentation</a></li>
+  </div>
+</div>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/architecture/exception_handling.html b/versions/master/api/architecture/exception_handling.html
new file mode 100644
index 0000000..82bddde
--- /dev/null
+++ b/versions/master/api/architecture/exception_handling.html
@@ -0,0 +1,654 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>Exception Handling in MXNet | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="Exception Handling in MXNet" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/architecture/exception_handling" />
+<meta property="og:url" content="https://mxnet.apache.org/api/architecture/exception_handling" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/architecture/exception_handling","headline":"Exception Handling in MXNet","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">Exception Handling in MXNet</h1>
+        <h3></h3></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+        <h3 style="text-transform: capitalize; padding-left:10px">architecture</h3>
+        <ul>
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/exception_handling">Exception Handling in MXNet</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_data_loading">Efficient Data Loaders</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_engine">Dependency Engine</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_memory">Memory Consumption</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/overview">MXNet System Architecture</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/program_model">Deep Learning Programming Paradigm</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+               <!-- resource-p -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <!--- 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. -->
+
+<h1 id="exception-handling-in-mxnet">Exception Handling in MXNet</h1>
+
+<p>This tutorial explains the exception handling support in MXNet,
+and provides examples on how to throw and handle exceptions when in a multithreaded context.
+Although, the examples are in Python, they can be easily extended to MXNet
+language bindings.</p>
+
+<p>MXNet exceptions can be thrown from two areas:</p>
+<ul>
+  <li>MXNet main thread. For eg. Infershape and InferType.</li>
+  <li>Spawned threads:
+    <ul>
+      <li>By dependency engine for operator execution in parallel</li>
+      <li>By the iterators, during the data loading, text parsing phase etc.</li>
+    </ul>
+  </li>
+</ul>
+
+<p>In the first case, the exception is thrown and can be handled in the main thread.
+In the second case, the exception is thrown in a spawned thread, caught and transported to the
+main thread, where it is rethrown. This tutorial will give more explanation and examples on how
+to handle exceptions for the second case.</p>
+
+<h2 id="prerequisites">Prerequisites</h2>
+
+<p>To complete this tutorial, we need:</p>
+<ul>
+  <li>MXNet <a href="https://github.com/apache/incubator-mxnet/commit/7b24137ed45df605defa4ce72ec91554f6e445f0">7b24137</a>. See Instructions in <a href="https://mxnet.io/get_started">Setup and Installation</a>.</li>
+</ul>
+
+<h2 id="exception-handling-for-iterators">Exception Handling for Iterators</h2>
+
+<p>The below example shows how to handle exceptions for iterators. In this example,
+we populate files for data and labels with fewer number of labels compared to the
+number of samples. This should throw an exception.</p>
+
+<p>CSVIter uses PrefetcherIter for loading and parsing data.
+The PrefetcherIter spawns a producer thread in the background which prefetches
+the data while the main thread consumes the data. The exception is thrown in the spawned
+producer thread during the prefetching, when the label is not found corresponding to a specific sample.</p>
+
+<p>The exception is transported to the main thread, where it is rethrown when Next is
+called as part of the following line: <code class="highlighter-rouge">for batch in iter(data_train)</code>.</p>
+
+<p>In general, Exception may be rethrown as part of <code class="highlighter-rouge">Next</code> and <code class="highlighter-rouge">BeforeFirst</code> calls which correspond to <code class="highlighter-rouge">reset()</code> and <code class="highlighter-rouge">next()</code> methods in <code class="highlighter-rouge">MXDataIter</code> for Python language bindings.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
+<span class="kn">import</span> <span class="nn">mxnet</span> <span class="k">as</span> <span class="n">mx</span>
+
+<span class="n">cwd</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">getcwd</span><span class="p">()</span>
+<span class="n">data_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cwd</span><span class="p">,</span> <span class="s">"data.csv"</span><span class="p">)</span>
+<span class="n">label_path</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cwd</span><span class="p">,</span> <span class="s">"label.csv"</span><span class="p">)</span>
+
+<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">data_path</span><span class="p">,</span> <span class="s">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">fout</span><span class="p">:</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">8</span><span class="p">):</span>
+        <span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">"1,2,3,4,5,6,7,8,9,10</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
+
+<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">label_path</span><span class="p">,</span> <span class="s">"w"</span><span class="p">)</span> <span class="k">as</span> <span class="n">fout</span><span class="p">:</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">7</span><span class="p">):</span>
+        <span class="n">fout</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">"label"</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
+
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">data_train</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">io</span><span class="o">.</span><span class="n">CSVIter</span><span class="p">(</span><span class="n">data_csv</span><span class="o">=</span><span class="n">data_path</span><span class="p">,</span> <span class="n">label_csv</span><span class="o">=</span><span class="n">label_path</span><span class="p">,</span> <span class="n">data_shape</span><span class="o">=< [...]
+                               <span class="n">batch_size</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
+
+    <span class="k">for</span> <span class="n">batch</span> <span class="ow">in</span> <span class="nb">iter</span><span class="p">(</span><span class="n">data_train</span><span class="p">):</span>
+        <span class="k">print</span><span class="p">(</span><span class="n">data_train</span><span class="o">.</span><span class="n">getdata</span><span class="p">()</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">())</span>
+<span class="k">except</span> <span class="n">mx</span><span class="o">.</span><span class="n">base</span><span class="o">.</span><span class="n">MXNetError</span> <span class="k">as</span> <span class="n">ex</span><span class="p">:</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">"Exception handled"</span><span class="p">)</span>
+    <span class="k">print</span><span class="p">(</span><span class="n">ex</span><span class="p">)</span>
+</code></pre></div></div>
+
+<h3 id="limitation">Limitation</h3>
+
+<p>There is a race condition when your last <code class="highlighter-rouge">next()</code> call doesnt reach the batch in your dataset where exception occurs. Exception may or may not be thrown in this case depending on which thread wins the race. To avoid this situation, you should try and iterate through your full dataset if you think it can throw exceptions which need to be handled.</p>
+
+<h2 id="exception-handling-for-operators">Exception Handling for Operators</h2>
+
+<p>The below example shows how to handle exceptions for operators in the imperative mode.</p>
+
+<p>For the operator case, the dependency engine spawns a number of threads if it is running in the <code class="highlighter-rouge">ThreadedEnginePool</code> or <code class="highlighter-rouge">ThreadedEnginePerDevice</code> mode. The final operator is executed in one of the spawned threads.</p>
+
+<p>If an operator throws an exception during execution, this exception is propagated
+down the dependency chain. Once there is a synchronizing call i.e. WaitToRead for a variable in the dependency chain, the propagated exception is rethrown.</p>
+
+<p>In the below example, I illustrate how an exception that occured in the first line is propagated down the dependency chain, and finally is rethrown when we make a synchronizing call to WaitToRead.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">mxnet</span> <span class="k">as</span> <span class="n">mx</span>
+<span class="n">a</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
+<span class="n">b</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
+<span class="n">c</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
+<span class="n">d</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p" [...]
+<span class="n">e</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
+<span class="n">e</span><span class="o">.</span><span class="n">wait_to_read</span><span class="p">()</span>
+</code></pre></div></div>
+
+<p>Although the above exception occurs when executing the operation which writes to the variable d in one of the child threads, it is thrown only when the synchronization happens as part of the line: <code class="highlighter-rouge">e.wait_to_read()</code>.</p>
+
+<p>Let us take another example. In the following case, we write to two variables and then <code class="highlighter-rouge">wait_to_read</code> for both. This example shows that any particular exception will not be thrown more than once.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">mxnet</span> <span class="k">as</span> <span class="n">mx</span>
+<span class="n">a</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
+<span class="n">b</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p" [...]
+<span class="n">c</span><span class="p">,</span> <span class="n">d</span>  <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">nd</span><span class="o">.</span><span class="n">dot</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
+<span class="k">try</span><span class="p">:</span>
+    <span class="n">c</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
+<span class="k">except</span> <span class="n">mx</span><span class="o">.</span><span class="n">base</span><span class="o">.</span><span class="n">MXNetError</span> <span class="k">as</span> <span class="n">ex</span><span class="p">:</span>
+    <span class="k">print</span><span class="p">(</span><span class="s">"Exception handled"</span><span class="p">)</span>
+<span class="n">d</span><span class="o">.</span><span class="n">asnumpy</span><span class="p">()</span>
+</code></pre></div></div>
+
+    </div>
+</div>
+
+        </div>
+    </div>
+
+</article>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/architecture/note_data_loading.html b/versions/master/api/architecture/note_data_loading.html
new file mode 100644
index 0000000..c2ad0ec
--- /dev/null
+++ b/versions/master/api/architecture/note_data_loading.html
@@ -0,0 +1,813 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>Efficient Data Loaders | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="Efficient Data Loaders" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/architecture/note_data_loading" />
+<meta property="og:url" content="https://mxnet.apache.org/api/architecture/note_data_loading" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/architecture/note_data_loading","headline":"Efficient Data Loaders","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">Efficient Data Loaders</h1>
+        <h3></h3></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+        <h3 style="text-transform: capitalize; padding-left:10px">architecture</h3>
+        <ul>
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/exception_handling">Exception Handling in MXNet</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_data_loading">Efficient Data Loaders</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_engine">Dependency Engine</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_memory">Memory Consumption</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/overview">MXNet System Architecture</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/program_model">Deep Learning Programming Paradigm</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+               <!-- resource-p -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <!--- 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. -->
+
+<h1 id="designing-efficient-data-loaders-for-deep-learning">Designing Efficient Data Loaders for Deep Learning</h1>
+
+<p>Data loading is an important component of any machine learning system.
+When we work with tiny datasets, we can get away with loading an entire dataset into GPU memory.
+With larger datasets, we must store examples in main memory.
+And when datasets grow too large to fit into main memory,
+data loading can become performance-critical.
+In designing a data loader,
+we aim to achieve more efficient data loading,
+to spend less effort on data preparation,
+and to present a clean and flexible interface.</p>
+
+<p>We organize this design note as follows:</p>
+
+<ul>
+  <li><strong>IO Design Insight:</strong>  Guiding principles in data loading design.</li>
+  <li><strong>Data Format:</strong> Our solution using dmlc-core’s binary recordIO implementation.</li>
+  <li><strong>Data Loading:</strong> Our method to reduce IO cost by utilizing the threaded iterator provided by dmlc-core.</li>
+  <li><strong>Interface Design:</strong> Our approach to facilitate writing MXNet data iterators in just a few lines of Python.</li>
+  <li><strong>Future Extension:</strong> Prospective ideas for making data loading more flexible.</li>
+</ul>
+
+<p>Our analysis will motivate several requirements that an effective IO system should fulfill.</p>
+
+<p><strong><em>List of Key Requirements</em></strong></p>
+<ul>
+  <li>Small file size.</li>
+  <li>Parallel (distributed) packing of data.</li>
+  <li>Fast data loading and online augmentation.</li>
+  <li>Quick reads from arbitrary parts of the dataset in the distributed setting.</li>
+</ul>
+
+<h2 id="design-insight">Design Insight</h2>
+<p>To design an IO system, we must address two kinds of tasks:
+data preparation and data loading.
+Data preparation is usually performed offline,
+whereas data loading influences the online performance.
+In this section, we will introduce our insight of IO design involving the two phases.</p>
+
+<h3 id="data-preparation">Data Preparation</h3>
+<p>Data preparation describes the process of packing data
+into a desired format for later processing.
+When working with large datasets like ImageNet, this process can be time-consuming.
+In these cases, there are several heuristics we ought to follow:</p>
+
+<ul>
+  <li>Pack the dataset into small numbers of files. A dataset may contain millions of data instances. Packed data distributes easily from machine to machine.</li>
+  <li>Do the packing once. We don’t want to repack data every time run-time settings, like the number of machines, are changed.</li>
+  <li>Process the packing in parallel to save time.</li>
+  <li>Be able to access arbitrary parts of the data easily. This is crucial for distributed machine learning when data parallelism is introduced. Things may get tricky when the data has been packed into several physical data files. The desired behavior could be: the packed data can be logically separated into arbitrary numbers of partitions, no matter how many physical data files there are. For example, if we pack 1000 images into 4 physical files, then each file contains 250 images. If  [...]
+</ul>
+
+<h3 id="data-loading">Data Loading</h3>
+<p>The next step to consider is how to load the packed data into RAM.
+Our goal is to load the data as quickly as possible.
+There are several heuristics we try to follow:</p>
+<ul>
+  <li><strong>Read continuously:</strong> We can read faster when reading from contiguous locations on disk.</li>
+  <li><strong>Reduce the bytes to be loaded:</strong> We can achieve this by storing data in a compact way, e.g. saving images in JPEG format.</li>
+  <li><strong>Load and train in different threads:</strong> This avoids computational bottlenecks while loading data.</li>
+  <li><strong>Save RAM:</strong> Judiciously decide whether to load entire files into RAM.</li>
+</ul>
+
+<h2 id="data-format">Data Format</h2>
+
+<p>Since the training of deep neural network often involves large amounts of data,
+the format we choose should be both efficient and convenient.
+To achieve our goals, we need to pack binary data into a splittable format.
+In MXNet, we rely on the binary recordIO format implemented in dmlc-core.</p>
+
+<h3 id="binary-record">Binary Record</h3>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/io/baserecordio.jpg" alt="baserecordio" />
+In MXNet’s binary RecordIO, we store each data instance as a record.
+<strong>kMagic</strong> is a <em>magic number</em> indicating the start of a record.
+<strong>Lrecord</strong> encodes length and a continue flag.
+In lrecord,</p>
+<ul>
+  <li>cflag == 0: this is a complete record</li>
+  <li>cflag == 1: start of a multiple-records</li>
+  <li>cflag == 2: middle of multiple-records</li>
+  <li>cflag == 3: end of multiple-records</li>
+</ul>
+
+<p><strong>Data</strong> is the space to save data content.
+<strong>Pad</strong> is simply a padding space to make record align to 4 bytes.</p>
+
+<p>After we pack the data, each file contains multiple records.
+Then, loading can be continuous.
+This avoids the low performance that can result
+from reading random locations on disk.</p>
+
+<p>One advantage of storing data via records
+is that each record can vary in length.
+This allows us to save data compactly
+when good compression algorithms are available for our data.
+For example, we can use JPEG format to save image data.
+The packed data will be much smaller
+compared with storing uncompressed RGB values for each pixel.</p>
+
+<p>Take ImageNet_1K dataset as an example.
+If we store the data as 3 * 256 * 256 array of raw RGB values,
+the dataset would occupy more than <strong>200G</strong>.
+But after compressing the images using JPEG,
+they only occupy about <strong>35G</strong> of disk space.
+This significantly reduces the cost owing to reading from disk.</p>
+
+<p>Here’s an example of binary recordIO:
+<img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/io/ImageRecordIO.jpg" alt="baserecordio" />
+We first resize the image into 256 * 256,
+then compress into JPEG format.
+After that, we save a header that indicates the index and label
+for that image to be used when constructing the <em>Data</em> field for that record.
+We then pack several images together into a file.
+You may want to also review the <a href="https://mxnet.apache.org/api/faq/recordio">example using im2rec.py to create a RecordIO dataset</a>.</p>
+
+<h3 id="access-arbitrary-parts-of-data">Access Arbitrary Parts Of Data</h3>
+
+<p>One desirable property for a data loader might be:
+The packed data can be logically sliced into an arbitrary number of partitions,
+no matter how many physical packed data files there are.
+Since binary recordIO can easily locate
+the start and end of a record using the Magic Number,
+we can achieve the above goal using the InputSplit
+functionality provided by dmlc-core.</p>
+
+<p>InputSplit takes the following parameters:</p>
+<ul>
+  <li>FileSystem <em>filesys</em>: dmlc-core wrapper around the IO operations for different file systems, like hdfs, s3, local. User shouldn’t need to worry about the difference between file systems anymore.</li>
+  <li>Char <em>uri</em>: The URI of files. Note that it could be a list of files because we may pack the data into several physical parts. File URIs are separated by ‘;’.</li>
+  <li>Unsigned <em>nsplit</em>: The number of logical splits. <em>nsplit</em> could be different from the number of physical files.</li>
+  <li>Unsigned <em>rank</em>: Which split to load in this process.</li>
+</ul>
+
+<p>The splitting process is demonstrated below:</p>
+<ul>
+  <li>Determine the size of each partition.</li>
+</ul>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/io/beforepartition.jpg" alt="beforepartition" /></p>
+
+<ul>
+  <li>Approximately partition the records according to file size. Note that the boundary of each part may be located in the middle of a record.</li>
+</ul>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/io/approximatepartition.jpg" alt="approxipartition" /></p>
+
+<ul>
+  <li>Set the beginning of partitions in such a way as to avoid splitting records across partitions.</li>
+</ul>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/io/afterpartition.jpg" alt="afterpartition" /></p>
+
+<p>By conducting the above operations,
+we now identify the records belong to each part,
+and the physical data files needed by each logical part.
+InputSplit greatly simplifies data parallelism,
+where each process only reads part of the data.</p>
+
+<p>Since our partitioning scheme does not depend on the number of physical data files,
+we can process a huge dataset like ImageNet_22K in parallel fashion as illustrated below.
+We don’t need to consider distributed loading issue at the preparation time,
+just select the most efficient physical file number
+according to the dataset size and computing resources available.
+<img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/io/parallelprepare.jpg" alt="parallelprepare" /></p>
+
+<h2 id="data-loading-and-preprocessing">Data Loading and Preprocessing</h2>
+
+<p>When the speed of loading and preprocessing can’t keep up
+with the speed of training or evaluation,
+IO can bottleneck the speed of the whole system.
+In this section, we will introduce a few tricks
+to achieve greater efficiency when loading
+and preprocessing data packed in binary recordIO format.
+When applied to the ImageNet dataset, our approach achieves
+the IO speed of <strong>3000</strong> images/sec <strong>with a normal HDD</strong>.</p>
+
+<h3 id="loading-and-preprocessing-on-the-fly">Loading and preprocessing on the fly</h3>
+
+<p>When training deep neural networks,
+we sometimes must load and preprocess the data
+while simultaneously training for the following reasons:</p>
+<ul>
+  <li>When the whole size of the dataset exceeds available RAM size, we can’t load it in advance;</li>
+  <li>Sometimes, to make models robust to things like translations, rotations, and small amounts of color shift of noise, we introduce randomness into the training process. In these cases we must re-preprocess the data each time we revisit an example.</li>
+</ul>
+
+<p>In service of efficiency, we also address multi-threading techniques. Taking Imagenet training as an example, after loading a bunch of image records, we can start multiple threads to simultaneously perform image decoding and image augmentation. We depict this process in the following illustration:
+<img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/io/process.jpg" alt="process" /></p>
+
+<h3 id="hide-io-cost-using-threadediter">Hide IO Cost Using Threadediter</h3>
+
+<p>One way to lower IO cost is to pre-fetch the data for next batch on one thread,
+while the main thread performs the forward and backward passes for training.
+To support more complicated training schemes,
+MXNet provides a more general IO processing pipeline
+using <em>threadediter</em> provided by dmlc-core.
+The key of <em>threadediter</em> is to start a stand-alone thread that acts as a data provider,
+while the main thread acts as a data consumer as illustrated below.</p>
+
+<p>The threadediter maintains a buffer of a certain size
+and automatically fills the buffer when it’s not full.
+And after the consumer finishes consuming part of the data in the buffer,
+threadediter will reuse the space to save the next part of data.
+<img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/io/threadediter.png" alt="threadediter" /></p>
+
+<h2 id="mxnet-io-python-interface">MXNet IO Python Interface</h2>
+<p>We make the IO object as an iterator in numpy.
+By achieving that, the user can easily access the data
+using a for-loop or calling next() function.
+Defining a data iterator is very similar to defining a symbolic operator in MXNet.</p>
+
+<p>The following example code demonstrates a Cifar data iterator.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dataiter</span> <span class="o">=</span> <span class="n">mx</span><span class="o">.</span><span class="n">io</span><span class="o">.</span><span class="n">ImageRecordIter</span><span class="p">(</span>
+    <span class="c1"># Dataset Parameter, indicating the data file, please check the data is already there
+</span>    <span class="n">path_imgrec</span><span class="o">=</span><span class="s">"data/cifar/train.rec"</span><span class="p">,</span>
+    <span class="c1"># Dataset Parameter, indicating the image size after preprocessing
+</span>    <span class="n">data_shape</span><span class="o">=</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">28</span><span class="p">,</span><span class="mi">28</span><span class="p">),</span>
+    <span class="c1"># Batch Parameter, tells how many images in a batch
+</span>    <span class="n">batch_size</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
+    <span class="c1"># Augmentation Parameter, when offers mean_img, each image will subtract the mean value at each pixel
+</span>    <span class="n">mean_img</span><span class="o">=</span><span class="s">"data/cifar/cifar10_mean.bin"</span><span class="p">,</span>
+    <span class="c1"># Augmentation Parameter, randomly crop a patch of the data_shape from the original image
+</span>    <span class="n">rand_crop</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
+    <span class="c1"># Augmentation Parameter, randomly mirror the image horizontally
+</span>    <span class="n">rand_mirror</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
+    <span class="c1"># Augmentation Parameter, randomly shuffle the data
+</span>    <span class="n">shuffle</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span>
+    <span class="c1"># Backend Parameter, preprocessing thread number
+</span>    <span class="n">preprocess_threads</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span>
+    <span class="c1"># Backend Parameter, prefetch buffer size
+</span>    <span class="n">prefetch_buffer</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+    <span class="c1"># Optional, the device context which data loader optimized for, could be 'gpu' or 'cpu'
+</span>    <span class="n">ctx</span><span class="o">=</span><span class="s">"gpu"</span><span class="p">,</span>
+    <span class="c1"># The out data type, could be 'float32' 'int8' or 'uint8'
+</span>    <span class="n">dtype</span><span class="o">=</span><span class="s">"float32"</span><span class="p">)</span>
+</code></pre></div></div>
+
+<p>Generally, to create a data iterator, you need to provide five kinds of parameters:</p>
+
+<ul>
+  <li><strong>Dataset Param:</strong> Information needed to access the dataset, e.g. file path, input shape.</li>
+  <li><strong>Batch Param:</strong> Specifies how to form a batch, e.g. batch size.</li>
+  <li><strong>Augmentation Param:</strong> Which augmentation operations (e.g. crop, mirror) should be taken on an input image.</li>
+  <li><strong>Backend Param:</strong> Controls the behavior of the backend threads to hide data loading cost.</li>
+  <li><strong>Auxiliary Param:</strong> Provides options to help with debugging.</li>
+</ul>
+
+<p>Usually, <strong>Dataset Param</strong> and <strong>Batch Param</strong> MUST be given,
+otherwise the data batch can’t be created.
+Other parameters can be given as needed.
+Ideally, we should separate the MX Data IO into modules,
+some of which might be useful to expose to users, for example:</p>
+
+<ul>
+  <li><strong>Efficient prefetcher:</strong> allows the user to write a data loader that reads their customized binary format that automatically gets multi-threaded prefetcher support.</li>
+  <li><strong>Data transformer:</strong> image random cropping, mirroring, etc. Allows the users to use those tools, or plug in their own customized transformers (maybe they want to add some specific kind of coherent random noise to data, etc.)</li>
+</ul>
+
+<h2 id="future-extensions">Future Extensions</h2>
+
+<p>In the future, there are some extensions to our data IO
+that we might consider adding.
+Specifically, we might add specialized support
+for applications including image segmentation, object localization, and speech recognition.
+More detail will be provided when such applications have been running on MXNet.</p>
+
+    </div>
+</div>
+
+        </div>
+    </div>
+
+</article>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/architecture/note_engine.html b/versions/master/api/architecture/note_engine.html
new file mode 100644
index 0000000..10c110c
--- /dev/null
+++ b/versions/master/api/architecture/note_engine.html
@@ -0,0 +1,921 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>Dependency Engine | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="Dependency Engine" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/architecture/note_engine" />
+<meta property="og:url" content="https://mxnet.apache.org/api/architecture/note_engine" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/architecture/note_engine","headline":"Dependency Engine","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">Dependency Engine</h1>
+        <h3></h3></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+        <h3 style="text-transform: capitalize; padding-left:10px">architecture</h3>
+        <ul>
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/exception_handling">Exception Handling in MXNet</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_data_loading">Efficient Data Loaders</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_engine">Dependency Engine</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_memory">Memory Consumption</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/overview">MXNet System Architecture</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/program_model">Deep Learning Programming Paradigm</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+               <!-- resource-p -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <!--- 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. -->
+
+<h1 id="dependency-engine-for-deep-learning">Dependency Engine for Deep Learning</h1>
+
+<p>We always want deep learning libraries
+to run faster and scale to larger datasets.
+One natural approach is to see if we can benefit
+from throwing more hardware at the problem,
+as by using multiple GPUs simultaneously.</p>
+
+<p>Library designers then ask:
+How can we <em>parallelize</em> computation across devices?
+And, more importantly, how can we <em>synchronize</em> computation
+when we introduce multi-threading?
+A runtime dependency engine is a generic solution to these problems.</p>
+
+<p>In this document, we examine approaches for using
+runtime dependency scheduling to accelerate deep learning.
+We aim to explain how runtime dependency scheduling
+can both speed up and simplify multi-device deep learning.
+We also explore potential designs for a generic dependency engine
+that could be both library- and operation-independent.</p>
+
+<p>Most of the discussion of on this page draws inspiration
+from the MXNet dependency engine.
+The dependency tracking algorithm we discuss
+was primarily developed by <a href="https://github.com/hotpxl">Yutian Li</a>
+and <a href="https://github.com/jermainewang">Mingjie Wang</a>.</p>
+
+<h2 id="dependency-scheduling">Dependency Scheduling</h2>
+
+<p>Although most users want to take advantage of parallel computation,
+most of us are more familiar with serial programs.
+So one natural question is: how can we write serial programs
+and build a library to automatically parallelize our programs
+in an asynchronous way?</p>
+
+<p>For example, in the following code, we can run <code class="highlighter-rouge">B = A + 1</code>
+and <code class="highlighter-rouge">C = A + 2</code> in any order, or in parallel:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">A</span> <span class="o">=</span> <span class="mi">2</span>
+    <span class="n">B</span> <span class="o">=</span> <span class="n">A</span> <span class="o">+</span> <span class="mi">1</span>
+    <span class="n">C</span> <span class="o">=</span> <span class="n">A</span> <span class="o">+</span> <span class="mi">2</span>
+    <span class="n">D</span> <span class="o">=</span> <span class="n">B</span> <span class="o">*</span> <span class="n">C</span>
+</code></pre></div></div>
+
+<p>However, it’s quite hard to code the sequence manually
+because the last operation, <code class="highlighter-rouge">D = B * C</code>, needs to wait
+for both of the preceding operations to complete before it starts.
+The following dependency graph/data flow graph illustrates this.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/dep_simple.png" alt="Dep Simple" /></p>
+
+<p>A dependency engine is a library that takes a sequence of operations
+and schedules them according to the dependency pattern,  potentially in parallel.
+So in this example, a dependency library
+could run <code class="highlighter-rouge">B = A + 1</code> and <code class="highlighter-rouge">C = A + 2</code> in parallel,
+and run <code class="highlighter-rouge">D = B * C</code> after those operations complete.</p>
+
+<h2 id="problems-in-dependency-scheduling">Problems in Dependency Scheduling</h2>
+
+<p>A dependency engine relieves the burden of writing concurrent programs.
+However, as operations become parallelized,
+new dependency tracking problems arise.
+In this section, we discuss those problems.</p>
+
+<h3 id="data-flow-dependency">Data Flow Dependency</h3>
+<p>Data flow dependency describes how the outcome of one computation
+can be used in other computations.
+Every dependency engine has to solve the data flow dependency problem.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/dep_simple.png" alt="Dep Simple" /></p>
+
+<p>Because we discussed this issue in the preceding section,
+we include the same figure here. Libraries that have
+data flow tracking engines include Minerva and Purine2.</p>
+
+<h3 id="memory-recycling">Memory Recycling</h3>
+<p>When should we recycle the memory that we allocated to the arrays?
+In serial processing, this is easy to determine.
+We simply recycle the memory after the variable goes out of scope.
+However, as the following figure shows, this is a bit harder in parallel processing.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/dep_del.png" alt="Dep Del" /></p>
+
+<p>In this example, because both computations need to use values from A,
+we can’t recycle the memory until both complete.
+The engine must schedule the memory recycling operations according to the dependencies,
+and ensure that they are executed after both <code class="highlighter-rouge">B = A + 1</code> and <code class="highlighter-rouge">C = A + 2</code> complete.</p>
+
+<h3 id="random-number-generation">Random Number Generation</h3>
+<p>Random number generators, which are commonly used in machine learning,
+pose interesting challenges for dependency engines.
+Consider the following example:</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/dep_rand.png" alt="Dep Rand" /></p>
+
+<p>In this example, we are generating random numbers in a sequence.
+Although it seems that the two random number generations can be parallelized,
+this is usually not the case. A pseudo-random number generator (PRNG)
+is not thread-safe because it might cause some internal state
+to mutate when generating a new number.
+Even if the PRNG is thread-safe,
+it is preferable to serialize number generation,
+so we can get reproducible random numbers.</p>
+
+<h2 id="case-study-a-dependency-engine-for-a-multi-gpu-neural-network">Case Study: A Dependency Engine for a Multi-GPU Neural Network</h2>
+
+<p>In the last section, we discussed the problems
+we might face in designing a dependency engine.
+Before thinking about how to design a generic engine to solve those problems,
+let’s consider how a dependency engine can help in multi-GPU training of a neural network.
+The following pseudocode Python program illustrates
+training one batch on a  two-layer neural network.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="c1"># Example of one iteration Two GPU neural Net
+</span>    <span class="n">data</span> <span class="o">=</span> <span class="n">next_batch</span><span class="p">()</span>
+    <span class="n">data</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span><span class="o">.</span><span class="n">copyfrom</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">50</span><span class="p">])</span>
+    <span class="n">data</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span><span class="o">.</span><span class="n">copyfrom</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="mi">50</span><span class="p">:</span><span class="mi">100</span><span class="p">])</span>
+    <span class="c1"># forward, backprop on GPU 0
+</span>    <span class="n">fc1</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="o">=</span> <span class="n">FullcForward</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">gpu0</span><span class="p">],</span> <span class="n">fc1_weight</span><span class="p">[</span><span class="n">gpu0</span><span class="p">])</span>
+    <span class="n">fc2</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="o">=</span> <span class="n">FullcForward</span><span class="p">(</span><span class="n">fc1</span><span class="p">[</span><span class="n">gpu0</span><span class="p">],</span> <span class="n">fc2_weight</span><span class="p">[</span><span class="n">gpu0</span><span class="p">])</span>
+    <span class="n">fc2_ograd</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="o">=</span> <span class="n">LossGrad</span><span class="p">(</span><span class="n">fc2</span><span class="p">[</span><span class="n">gpu0</span><span class="p">],</span> <span class="n">label</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">50</span><span class="p">])</span>
+    <span class="n">fc1_ograd</span><span class="p">[</span><span class="n">gpu0</span><span class="p">],</span> <span class="n">fc2_wgrad</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="o">=</span>
+      <span class="n">FullcBackward</span><span class="p">(</span><span class="n">fc2_ograd</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="p">,</span> <span class="n">fc2_weight</span><span class="p">[</span><span class="n">gpu0</span><span class="p">])</span>
+      <span class="n">_</span><span class="p">,</span> <span class="n">fc1_wgrad</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="o">=</span> <span class="n">FullcBackward</span><span class="p">(</span><span class="n">fc1_ograd</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="p">,</span> <span class="n">fc1_weight</span><span class="p">[</span><span class="n">gpu0</span><span class="p">])</span>
+    <span class="c1"># forward, backprop on GPU 1
+</span>    <span class="n">fc1</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span> <span class="o">=</span> <span class="n">FullcForward</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">gpu1</span><span class="p">],</span> <span class="n">fc1_weight</span><span class="p">[</span><span class="n">gpu1</span><span class="p">])</span>
+    <span class="n">fc2</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span> <span class="o">=</span> <span class="n">FullcForward</span><span class="p">(</span><span class="n">fc1</span><span class="p">[</span><span class="n">gpu1</span><span class="p">],</span> <span class="n">fc2_weight</span><span class="p">[</span><span class="n">gpu1</span><span class="p">])</span>
+    <span class="n">fc2_ograd</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span> <span class="o">=</span> <span class="n">LossGrad</span><span class="p">(</span><span class="n">fc2</span><span class="p">[</span><span class="n">gpu1</span><span class="p">],</span> <span class="n">label</span><span class="p">[</span><span class="mi">50</span><span class="p">:</span><span class="mi">100</span><span class="p">])</span>
+    <span class="n">fc1_ograd</span><span class="p">[</span><span class="n">gpu1</span><span class="p">],</span> <span class="n">fc2_wgrad</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span> <span class="o">=</span>
+         <span class="n">FullcBackward</span><span class="p">(</span><span class="n">fc2_ograd</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span> <span class="p">,</span> <span class="n">fc2_weight</span><span class="p">[</span><span class="n">gpu1</span><span class="p">])</span>
+         <span class="n">_</span><span class="p">,</span> <span class="n">fc1_wgrad</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span> <span class="o">=</span> <span class="n">FullcBackward</span><span class="p">(</span><span class="n">fc1_ograd</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span> <span class="p">,</span> <span class="n">fc1_weight</span><span class="p">[</span><span class="n">gpu1</span><span class="p">])</span>
+    <span class="c1"># aggregate gradient and update
+</span>    <span class="n">fc1_wgrad</span><span class="p">[</span><span class="n">cpu</span><span class="p">]</span>  <span class="o">=</span> <span class="n">fc1_wgrad</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="o">+</span> <span class="n">fc1_wgrad</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span>
+    <span class="n">fc2_wgrad</span><span class="p">[</span><span class="n">cpu</span><span class="p">]</span>  <span class="o">=</span> <span class="n">fc2_wgrad</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="o">+</span> <span class="n">fc2_wgrad</span><span class="p">[</span><span class="n">gpu1</span><span class="p">]</span>
+    <span class="n">fc1_weight</span><span class="p">[</span><span class="n">cpu</span><span class="p">]</span> <span class="o">-=</span> <span class="n">lr</span> <span class="o">*</span>  <span class="n">fc1_wgrad</span><span class="p">[</span><span class="n">cpu</span><span class="p">]</span>
+    <span class="n">fc2_weight</span><span class="p">[</span><span class="n">cpu</span><span class="p">]</span> <span class="o">-=</span> <span class="n">lr</span> <span class="o">*</span>  <span class="n">fc2_wgrad</span><span class="p">[</span><span class="n">cpu</span><span class="p">]</span>
+    <span class="n">fc1_weight</span><span class="p">[</span><span class="n">cpu</span><span class="p">]</span><span class="o">.</span><span class="n">copyto</span><span class="p">(</span><span class="n">fc1_weight</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="p">,</span> <span class="n">fc1_weight</span><span class="p">[</span><span class="n">gpu1</span><span class="p">])</span>
+    <span class="n">fc2_weight</span><span class="p">[</span><span class="n">cpu</span><span class="p">]</span><span class="o">.</span><span class="n">copyto</span><span class="p">(</span><span class="n">fc2_weight</span><span class="p">[</span><span class="n">gpu0</span><span class="p">]</span> <span class="p">,</span> <span class="n">fc2_weight</span><span class="p">[</span><span class="n">gpu1</span><span class="p">])</span>
+</code></pre></div></div>
+<p>In this program, the data 0 to 50  is copied to GPU 0,
+and the data 50 to 100 is copied to GPU 1.
+The calculated gradients are aggregated in the CPU,
+which then performs a simple SGD update,
+and copies the updated weight back to each GPU.
+This is a common way to write a parallel program in a serial manner.
+The following dependency graph shows how it can be parallelized:</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/dep_net.png" alt="Dep Net" /></p>
+
+<p><strong><em>Notes:</em></strong></p>
+
+<ul>
+  <li>The gradient can be copied to the CPU as soon as we get the gradient of a layer.</li>
+  <li>The weight can be copied back soon as the weight is updated.</li>
+  <li>In the forward pass, we have a dependency on <code class="highlighter-rouge">fc1_weight[cpu].copyto(fc1_weight[gpu0] , fc1_weight[gpu1])</code>
+from the previous iteration.</li>
+  <li>There is a delay in computation between the last backward pass to layer k and the next forward call to layer k. We can synchronize the weight of layer k <em>in parallel</em> with other computation during this delay.</li>
+</ul>
+
+<p>This approach to optimization is used by multi-GPU deep learning libraries, such as CXXNet.
+The point is to overlap weight synchronization (communication) with computation.
+However, it’s not easy to do that, because the copy operation needs to be triggered
+as soon as the backward pass of the layer completes,
+which then triggers the reduction, updates, etc.</p>
+
+<p>A dependency engine can schedule these operations and perform multi-threading
+and dependency tracking.</p>
+
+<h2 id="designing-a-generic-dependency-engine">Designing a Generic Dependency Engine</h2>
+
+<p>We hope that you’re convinced that a dependency engine is useful
+for scaling deep learning programs to multiple devices.
+Now let’s discuss how we can design and implement
+a generic interface for a dependency engine.
+This solution isn’t the only possible design for a dependency engine.
+It’s an example that we think is useful in most cases.</p>
+
+<p>Our goal is to create a dependency engine that is <em>generic</em> and <em>lightweight</em>.
+Ideally, we’d like the engine that easily plugs into existing deep learning code,
+and that can scale up to multiple machines with minor modifications.
+To do that, we need to focus only on dependency tracking,
+not on assumptions about what users can or can’t do.</p>
+
+<p>Here’s a summary of goals for the engine:</p>
+
+<ul>
+  <li>The engine should not be aware of what operations it performs, so that users can perform any operations they define.</li>
+  <li>It should not be restricted in what type of objects it can schedule.
+    <ul>
+      <li>We should be able to schedule dependencies on GPU and CPU memory.</li>
+      <li>We should be able to track dependencies on the random number generator, etc.</li>
+    </ul>
+  </li>
+  <li>The engine should not allocate resources. It should only track dependencies. Users can allocate their own memory, PRNG, etc.</li>
+</ul>
+
+<p>The following Python snippet provides an engine interface that might help us reach our goal. Note that a real implementation will be closer to the metal, typically in C++.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">class</span> <span class="nc">DepEngine</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+	    <span class="k">def</span> <span class="nf">new_variable</span><span class="p">():</span>
+		    <span class="s">"""Return a new variable tag
+		    Returns
+		    -------
+		    vtag : Variable Tag
+		        The token of the engine to represent dependencies.
+		    """</span>
+		    <span class="k">pass</span>
+
+	    <span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="n">exec_func</span><span class="p">,</span> <span class="n">read_vars</span><span class="p">,</span> <span class="n">mutate_vars</span><span class="p">):</span>
+		    <span class="s">"""Push the operation to the engine.
+
+		    Parameters
+		    ----------
+		    exec_func : callable
+			    The real operation to be performed.
+
+		    read_vars : list of Variable Tags
+			    The list of variables this operation will read from.
+
+		    mutate_vars : list of Variable Tags
+			    The list of variables this operation will mutate.
+		    """</span>
+		    <span class="k">pass</span>
+</code></pre></div></div>
+
+<p>Because we can’t make assumptions about what objects we are scheduling, we ask the user to allocate a
+<em>virtual tag</em> that is associated with each object to represent what we need to schedule.
+So, at the beginning, the user can allocate the variable tag,
+and attach it to each of the objects that we want to schedule.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/tag_var.png" alt="Dep Net" /></p>
+
+<p>The user then calls <code class="highlighter-rouge">push</code> to tell the engine about the function to execute.
+The user also needs to specify the dependencies of the operation,
+using <code class="highlighter-rouge">read_vars</code> and <code class="highlighter-rouge">write_vars</code>:</p>
+
+<ul>
+  <li><code class="highlighter-rouge">read_vars</code> are variable tags for objects that the operation will <em>read from</em>, without changing their internal state.</li>
+  <li><code class="highlighter-rouge">mutate_vars</code> are variable tags for objects whose internal states the operation will mutate.</li>
+</ul>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/push_var.png" alt="Push Op" /></p>
+
+<p>The preceding figure shows how to push operation <code class="highlighter-rouge">B = A + 1</code> to the dependency engine. <code class="highlighter-rouge">B.data</code> and
+<code class="highlighter-rouge">A.data</code> are the allocated space. Note that the engine is <em>only aware of variable tags</em>.
+Any execution function can be processed.
+This interface is generic for the operations and resources we want to schedule.</p>
+
+<p>For fun, let’s look at how the engine internals work with the tags by considering the following code snippet:</p>
+
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    B = A + 1
+    C = A + 2
+    A = C * 2
+    D = A + 3
+</code></pre></div></div>
+
+<p>The first line reads variable <code class="highlighter-rouge">A</code> and mutates variable <code class="highlighter-rouge">B</code>. The second line reads variable <code class="highlighter-rouge">A</code> and mutates variable <code class="highlighter-rouge">C</code>. And so on.</p>
+
+<p>The engine maintains a queue for each variable, as the following animation shows for each of the four lines. Green blocks represents a read action, while red blocks represent mutations.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/dep_queue.gif" alt="Dependency Queue" /></p>
+
+<p>Upon building this queue, the engine sees that the first two green blocks at the beginning of <code class="highlighter-rouge">A</code>’s queue could actually be run in parallel because they are both read actions and won’t conflict with each other. The following graph illustrates this point.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/dep_parallel.png" alt="Dependency Parallelism" /></p>
+
+<p>One cool thing about all this scheduling is that it’s not confined to numerical calculations.
+Because everything that is scheduled is only a tag, the engine could schedule everything!</p>
+
+<p>The following figure gives a complete push sequence of the programs we mentioned in previous sections.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/push_seq.png" alt="Push Seq" /></p>
+
+<h3 id="porting-existing-code-to-the-dependency-engine">Porting Existing Code to the Dependency Engine</h3>
+<p>Because the generic interface doesn’t control things like memory allocation and which operation to execute,
+most existing code can be scheduled by the dependency engine in two steps:</p>
+
+<ol>
+  <li>Allocate the variable tags associated with resources like memory blob, PRNGS.</li>
+  <li>Call <code class="highlighter-rouge">push</code> with the execution function as the original code to execute, and put the variable tags of
+  corresponding resources correctly in <code class="highlighter-rouge">read_vars</code> and <code class="highlighter-rouge">mutate_vars</code>.</li>
+</ol>
+
+<h2 id="implementing-the-generic-dependency-engine">Implementing the Generic Dependency Engine</h2>
+
+<p>We have described the generic engine interface and
+how it can be used to schedule various operations.
+In this section, we provide a high-level discussion
+of how to implement such an engine.</p>
+
+<p>The general idea is as follows:</p>
+
+<ul>
+  <li>Use a queue to track all of the pending dependencies on each variable tag.</li>
+  <li>Use a counter on each operation to track how many dependencies are yet to be fulfilled.</li>
+  <li>When operations are completed, update the state of the queue and dependency counters to schedule new operations.</li>
+</ul>
+
+<p>The following figure illustrates the scheduling algorithm
+and might give you a better sense of what is going on in the engine.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/engine_queue_step.png" alt="Dep Tracking" /></p>
+
+<p>Below, we show another example involving random number generators.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/engine/engine_queue_rand.png" alt="Dep Rand" /></p>
+
+<p>As you can see, the purpose of the algorithm is to update pending queues
+of operations and to make the right state transition when an operation has completed.
+More care should be taken to make sure the state transitions
+are done in a way that’s safe for threads.</p>
+
+<h3 id="separate-dependency-tracking-with-running-policy">Separate Dependency Tracking with Running Policy</h3>
+<p>If you’re reading carefully, you might have noticed
+that the preceding section shows only the algorithm
+for deciding when an operation can be executed.
+We didn’t show how to actually run an operation.
+In practice, there can be many different policies.
+For example, we can either use a global thread-pool to run all operations,
+or use a specific thread to run operations on each device.</p>
+
+<p>This running policy is usually independent of dependency tracking,
+and can be separated out as either an independent module
+or a virtual interface of base-dependency tracking modules.
+Developing an elegant runtime policy that is fair
+to all operations and schedules is an interesting systems problem itself.</p>
+
+<h2 id="discussion">Discussion</h2>
+
+<p>The design that we discussed in this article
+isn’t the only solution to the dependency tracking problem.
+It’s just one example of how we might approach this.
+To be sure, some of these design choices are debatable.
+We’ll discuss some of them in this section.</p>
+
+<h3 id="dynamic-vs-static">Dynamic vs. Static</h3>
+<p>The dependency engine interface discussed in this topic is somewhat dynamic
+in the sense that the user can push operations one by one,
+instead of declaring the entire dependency graph (static).
+Dynamic scheduling can require more overhead
+than static declarations, in terms of data structure.
+However, it also enables more flexibility, such as supporting auto parallelism
+for imperative programs or a mixture of imperative and symbolic programs.
+You can also add some level of predeclared operations
+to the interface to enable data structure reuse.</p>
+
+<h3 id="mutation-vs-immutable">Mutation vs. Immutable</h3>
+<p>The generic engine interface presented in this page
+supports explicit scheduling for mutation.
+In a typical data flow engine, the data are usually immutable.
+Working with immutable data has a lot of benefits.
+For example, immutable data is generally more suitable for parallelization,
+and facilitates better fault tolerance in a distributed setting (by way of re-computation).</p>
+
+<p>However, immutability presents several challenges:</p>
+
+<ul>
+  <li>It’s harder to schedule resource contention problems, as arise when dealing with random numbers and deletion.</li>
+  <li>The engine usually needs to manage resources (memory, random number) to avoid conflicts. It’s harder to plug in user-allocated space, etc.</li>
+  <li>Preallocated static memory isn’t available, again because the usual pattern is to write to a preallocated layer space, which is not supported if data is immutable.</li>
+</ul>
+
+<p>Allowing mutation mitigates these issues.</p>
+
+<h2 id="source-code-of-the-generic-dependency-engine">Source Code of the Generic Dependency Engine</h2>
+<p><a href="https://github.com/apache/incubator-mxnet">MXNet</a> provides an implementation
+of the generic dependency engine described in this page.
+We welcome your contributions.</p>
+
+<h2 id="next-steps">Next Steps</h2>
+
+<ul>
+  <li><a href="note_memory">Squeeze the Memory Consumption of Deep Learning</a></li>
+  <li><a href="note_data_loading">Efficient Data Loading Module for Deep Learning</a></li>
+</ul>
+
+    </div>
+</div>
+
+        </div>
+    </div>
+
+</article>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/architecture/note_memory.html b/versions/master/api/architecture/note_memory.html
new file mode 100644
index 0000000..9828d56
--- /dev/null
+++ b/versions/master/api/architecture/note_memory.html
@@ -0,0 +1,878 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>Memory Consumption | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="Memory Consumption" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/architecture/note_memory" />
+<meta property="og:url" content="https://mxnet.apache.org/api/architecture/note_memory" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/architecture/note_memory","headline":"Memory Consumption","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">Memory Consumption</h1>
+        <h3></h3></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+        <h3 style="text-transform: capitalize; padding-left:10px">architecture</h3>
+        <ul>
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/exception_handling">Exception Handling in MXNet</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_data_loading">Efficient Data Loaders</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_engine">Dependency Engine</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_memory">Memory Consumption</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/overview">MXNet System Architecture</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/program_model">Deep Learning Programming Paradigm</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+               <!-- resource-p -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <!--- 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. -->
+
+<h1 id="optimizing-memory-consumption-in-deep-learning">Optimizing Memory Consumption in Deep Learning</h1>
+
+<p>Over the last ten years, a constant trend in deep learning
+is towards deeper and larger networks.
+Despite rapid advances in hardware performance,
+cutting-edge deep learning models continue to push the limits of GPU RAM.
+So even today, it’s always desirable to find ways
+to train larger models while consuming less memory.
+Doing so enables us to train faster, using larger batch sizes,
+and consequently achieving a higher GPU utilization rate.</p>
+
+<p>In this document, we explore techniques for optimizing
+memory allocation for deep neural networks.
+We discuss a few candidate solutions.
+While our proposals are by no means exhaustive,
+these solutions are instructive and allow us to
+introduce the major design issues at play.</p>
+
+<h2 id="computation-graph">Computation Graph</h2>
+
+<p>First, let’s revisit the idea of the computation graph.
+A computation graph describes the (data flow) dependencies
+between the operations in the deep network.
+The operations performed in the graph
+can be either fine-grained or coarse-grained.
+The following figure shows two examples of computation graphs.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/comp_graph_example.png" alt="Comp Graph Example" /></p>
+
+<p>The concept of a computation graph is explicitly encoded in packages like Theano and CGT.
+In other libraries, computation graphs appear implicitly as network configuration files.
+The major difference in these libraries comes down to how they calculate gradients.
+There are mainly two ways: performing back-propagation on the <em>same</em> graph
+or explicitly representing a <em>backwards path</em> to calculate the required gradients.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/back_graph.png" alt="Backward Graph" /></p>
+
+<p>Libraries like Caffe, CXXNet, and Torch take the former approach,
+performing back-prop on the original graph.
+Libraries like Theano and CGT take the latter approach,
+explicitly representing the backward path.
+In this discussion, we adopt the <em>explicit backward path</em> approach
+because it has several advantages for optimization.</p>
+
+<p>However, we should emphasize that choosing the explicit backward path approach doesn’t restrict us
+to symbolic libraries, such as Theano and CGT. We can also use the explicit backward path for gradient calculation of
+layer-based (which ties forward and backward together) libraries. The following graph shows how to do this.
+Basically, we introduce a backward node that links to the forward node of the graph and calls the <code class="highlighter-rouge">layer.backward</code>
+in the backward operations.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/explicit_back_layer.png" alt="Backward Layer" /></p>
+
+<p>This discussion applies to almost all existing deep learning libraries.
+(There are differences between libraries,  e.g., higher-order differentiation, which is beyond the scope of this topic.)</p>
+
+<p>Why is the explicit backward path better? Let’s explain it with two examples.
+The first reason is that the explicit backward path
+clearly describes the dependency between computations.
+Consider the following case, where we want to get
+the gradient of A and B. As we can see clearly from the graph,
+the computation of the <code class="highlighter-rouge">d(C)</code> gradient doesn’t depend on F.
+This means that we can free the memory of <code class="highlighter-rouge">F</code>
+right after the forward computation is done.
+Similarly, the memory of <code class="highlighter-rouge">C</code> can be recycled.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/back_dep_prune.png" alt="Backward Prune" /></p>
+
+<p>Another advantage of the explicit backward path
+is the ability to have a different backward path,
+instead of a mirror of forward one.
+A common example is the split connection case,
+as shown in the following figure.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/back_agg_grad.png" alt="Backward Agg" /></p>
+
+<p>In this example, the output of B is referenced by two operations.
+If we want to do the gradient calculation in the same
+network, we need to introduce an explicit split layer.
+This means we need to do the split for the forward pass, too.
+In this figure, the forward pass doesn’t contain a split layer,
+but the graph will automatically insert a gradient
+aggregation node before passing the gradient back to B.
+This helps us to save the memory cost of allocating the output of the split layer,
+and the operation cost of replicating the data in the forward pass.</p>
+
+<p>If we adopt the explicit backward approach,
+there’s no difference between the forward pass and the backward pass.
+We simply step through the computation graph in chronological order
+and carry out computations.
+This makes the explicit backward approach easy to analyze.
+We just need to answer the question:
+how do we allocate memory for each output node of a computation graph?</p>
+
+<h2 id="what-can-be-optimized">What Can Be Optimized?</h2>
+
+<p>As you can see, the computation graph is a useful way
+to discuss memory allocation optimization techniques.
+Already, we’ve shown how you can save some memory
+by using the explicit backward graph.
+Now let’s explore further optimizations,
+and see how we might determine reasonable baselines for benchmarking.</p>
+
+<p>Assume that we want to build a neural network with <code class="highlighter-rouge">n</code> layers.
+Typically, when implementing a neural network,
+we need to allocate node space for both the output of each layer
+and the gradient values used during back-propagation.
+This means we need roughly <code class="highlighter-rouge">2 n</code> memory cells.
+We face the same requirement when using the explicit backward graph approach
+because the number of nodes in a backward pass
+is roughly the same as in a forward pass.</p>
+
+<h3 id="in-place-operations">In-place Operations</h3>
+<p>One of the simplest techniques we can employ
+is <em>in-place memory sharing</em> across operations.
+For neural networks, we can usually apply this technique
+for the operations corresponding to activation functions.
+Consider the following case, where we want
+to compute the value of three chained sigmoid functions.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/alloc_inline.png" alt="Inplace op" /></p>
+
+<p>Because we can compute sigmoid <code class="highlighter-rouge">in-place</code>,
+using the same memory for input and output,
+we can compute an arbitrary-length chain
+of sigmoid functions using constant memory.</p>
+
+<p>Note: it’s easy to make mistakes when implementing in-place optimization.
+Consider the following case, where the value of B is used not only by C, but also by F.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/alloc_inline_trap.png" alt="In-place trap" /></p>
+
+<p>We can’t perform in-place optimization because the value of B
+is still needed after <code class="highlighter-rouge">C=sigmoid(B)</code> is computed.
+An algorithm that simply does in-place optimization
+for every sigmoid operation might fall into such trap,
+so we need to be careful about when we can use it.</p>
+
+<h3 id="standard-memory-sharing">Standard Memory Sharing</h3>
+<p>In-place operations are not the only places where we can share memory.
+In the following example, because the value of B is no longer needed
+after we compute E, we can reuse B’s memory to hold the result of E.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/alloc_normal.png" alt="Normal Sharing" /></p>
+
+<p><em>Memory sharing doesn’t necessarily require the same data shape</em>.
+Note that in the preceding example, the shapes of <code class="highlighter-rouge">B</code> and <code class="highlighter-rouge">E</code> can differ.
+To handle such a situation, we can allocate a memory region
+of size equal to the maximum of that required by <code class="highlighter-rouge">B</code> and <code class="highlighter-rouge">E</code> and share it between them.</p>
+
+<h3 id="example-of-real-neural-network-allocation">Example of Real Neural Network Allocation</h3>
+<p>Of course, these are only toy examples and they address only the computation of the forward pass.
+But the same ideas apply to real neural networks.
+The following figure shows an allocation plan for a two-layer perceptron.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/alloc_mlp.png" alt="Net Alloc" /></p>
+
+<p>In this example:</p>
+
+<ul>
+  <li>In-place optimization is applied when computing <code class="highlighter-rouge">act1</code>, <code class="highlighter-rouge">d(fc1)</code>, <code class="highlighter-rouge">out</code> and <code class="highlighter-rouge">d(fc2)</code>.</li>
+  <li>Memory is shared between <code class="highlighter-rouge">d(act1)</code> and <code class="highlighter-rouge">d(A)</code>.</li>
+</ul>
+
+<h2 id="memory-allocation-algorithm">Memory Allocation Algorithm</h2>
+
+<p>So far, we’ve discussed general techniques for optimizing memory allocation.
+We’ve seen that there are traps to avoid,
+as demonstrated in the case of in-place memory optimization.
+So, how can we allocate memory correctly?
+This is not a new problem.
+For example, it is very similar
+to the problem with register allocation in compilers.
+There might be techniques that we can borrow.
+We’re not attempting to give a comprehensive review of techniques here,
+but rather to introduce some simple
+but useful tricks to attack the problem.</p>
+
+<p>The key problem is that we need to place resources
+so that they don’t conflict with each other.
+More specifically, each variable has a <em>life time</em>
+between the time it gets computed until the last time it is used.
+In the case of the multi-layer perceptron,
+the <em>life time</em> of <code class="highlighter-rouge">fc1</code> ends after <code class="highlighter-rouge">act1</code> get computed.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/alloc_mlp.png" alt="Net Alloc" /></p>
+
+<p>The principle is <em>to allow memory sharing only between variables whose lifetimes don’t overlap</em>.
+There are multiple ways to do this.
+You can construct the conflicting graph
+with each variable as a node and link the edge
+between variables with overlapping lifespans,
+and then run a graph-coloring algorithm.
+This likely has <code class="highlighter-rouge">$O(n^2)$</code> complexity,
+where <code class="highlighter-rouge">n</code> is the number of nodes in the graph.
+This might be too costly.</p>
+
+<p>Let’s consider another simple heuristic.
+The idea is to simulate the procedure of traversing the graph,
+and keep a count of future operations that depends on the node.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/alloc_step.png" alt="Alloc" /></p>
+
+<ul>
+  <li>An in-place optimization can be performed when only the current operation depends on the source (i.e., <code class="highlighter-rouge">count==1</code>).</li>
+  <li>Memory can be recycled into the box on the upper right corner when the <code class="highlighter-rouge">count</code> goes to 0.</li>
+  <li>When we need new memory, we can either get it from the box or allocate a new one.</li>
+</ul>
+
+<p><strong><em>Note:</em></strong> During the simulation, no memory is allocated.
+Instead, we keep a record of how much memory each node needs,
+and allocate the maximum of the shared parts in the final memory plan.</p>
+
+<h2 id="static-vs-dynamic-allocation">Static vs. Dynamic Allocation</h2>
+
+<p>The preceding strategy exactly simulates
+the dynamic memory allocation procedure
+in imperative languages, such as Python.
+The <code class="highlighter-rouge">count</code> is the reference counter for each memory object,
+and the object gets garbage collected
+when the reference counter goes to 0.
+In that sense,
+we are simulating dynamic memory allocation once
+to create a static allocation plan.
+Can we simply use an imperative language
+that dynamically allocates and deallocates memory?</p>
+
+<p>The major difference is that static allocation is only done once,
+so we can afford to use more complicated algorithms.
+For example, we can search for memory sizes
+that are similar to the required memory block.
+The Allocation can also be made graph aware.
+We’ll talk about that in the next section.
+Dynamic allocation puts more pressure
+on fast memory allocation and garbage collection.</p>
+
+<p>There is also one takeaway for users
+who want to rely on dynamic memory allocations:
+<em>do not unnecessarily reference objects</em>.
+For example, if we organize all of the nodes in a list
+and store then in a Net object,
+these nodes will never get dereferenced, and we gain no space.
+Unfortunately, this is a common way to organize code.</p>
+
+<h2 id="memory-allocation-for-parallel-operations">Memory Allocation for Parallel Operations</h2>
+
+<p>In the previous section, we discussed
+how we can <em>simulate</em> running the procedure
+for a computation graph to get a static allocation plan.
+However, optimizing for parallel computation presents other challenges
+because resource sharing and parallelization are on the two ends of a balance.
+Let’s look at the following two allocation plans for the same graph:</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/parallel_alloc.png" alt="Parallel Alloc" /></p>
+
+<p>Both allocation plans are valid
+if we run the computation serially,
+from <code class="highlighter-rouge">A[1]</code> to <code class="highlighter-rouge">A[8]</code>.
+However, the allocation plan on the left
+introduces additional dependencies,
+which means we can’t run computation of <code class="highlighter-rouge">A[2]</code> and <code class="highlighter-rouge">A[5]</code> in parallel.
+The plan on the right can.
+To parallelize computation, we need to take greater care.</p>
+
+<h3 id="be-correct-and-safe-first">Be Correct and Safe First</h3>
+<p>Being correct is our first principle.
+This means to execute in a way that takes implicit dependency
+memory sharing into consideration.
+You can do this by adding the implicit dependency edge to the execution graph.
+Or, even simpler, if the execution engine is mutation aware,
+as described in <a href="note_engine">our discussion of dependency engine design</a>,
+push the operation in sequence
+and write to the same variable tag
+that represents the same memory region.</p>
+
+<p>Always produce a safe memory allocation plan.
+This means never allocate the same memory
+to nodes that can be parallelized.
+This might not be ideal when memory reduction is more desirable,
+and we don’t gain too much when we can get benefit
+from multiple computing streams simultaneously executing on the same GPU.</p>
+
+<h3 id="try-to-allow-more-parallelization">Try to Allow More Parallelization</h3>
+<p>Now we can safely perform some optimizations.
+The general idea is to try and encourage memory sharing between nodes that can’t be parallelized.
+You can do this by creating an ancestor relationship
+graph and querying it during allocation,
+which costs approximately <code class="highlighter-rouge">$O(n^2)$</code> in time to construct.
+We can also use a heuristic here,
+for example, color the path in the graph.
+As shown in the following figure,
+when you try to find the longest paths in the graph,
+color them the same color and continue.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/memory/graph_color.png" alt="Path Color" /></p>
+
+<p>After you get the color of the node,
+you allow sharing (or encourage sharing)
+only between nodes of the same color.
+This is a stricter version of the ancestor relationship,
+but it costs only <code class="highlighter-rouge">$O(n)$</code> of time
+if you search for only the first <code class="highlighter-rouge">k</code> path.</p>
+
+<p>This is by no means the only solution.
+More sophisticated approaches might exist:</p>
+
+<h2 id="how-much-can-you-save">How Much Can you Save?</h2>
+
+<p>We’ve discussed the techniques and algorithms you can use
+to squeeze memory usage for deep learning.
+How much can you really save by using these techniques?</p>
+
+<p>On coarse-grained operation graphs
+that are already optimized for big operations,
+you can reduce memory consumption roughly <em>by half</em>.
+You can reduce memory usage even more
+if you are optimizing a fine-grained computation network
+used by symbolic libraries, such as Theano. Most of the ideas in this article inspired the design of <em>MXNet</em>.</p>
+
+<p>Also, you will notice that memory cost, for forward pass only execution, is extremely low compared to running both forward and backward pass. This is simply because there’s  more memory reuse if you run only the forward pass.</p>
+
+<p>So here are two takeaways:</p>
+
+<ul>
+  <li>Use a computation graph to allocate memory.</li>
+  <li>For deep learning models, prediction consumes much less memory than training.</li>
+</ul>
+
+<h2 id="next-steps">Next Steps</h2>
+
+<ul>
+  <li><a href="note_data_loading">Efficient Data Loading Module for Deep Learning</a></li>
+</ul>
+
+    </div>
+</div>
+
+        </div>
+    </div>
+
+</article>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/architecture/overview.html b/versions/master/api/architecture/overview.html
new file mode 100644
index 0000000..7886e9e
--- /dev/null
+++ b/versions/master/api/architecture/overview.html
@@ -0,0 +1,1391 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>MXNet System Architecture | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="MXNet System Architecture" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/architecture/overview" />
+<meta property="og:url" content="https://mxnet.apache.org/api/architecture/overview" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/architecture/overview","headline":"MXNet System Architecture","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">MXNet System Architecture</h1>
+        <h3></h3></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+        <h3 style="text-transform: capitalize; padding-left:10px">architecture</h3>
+        <ul>
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/exception_handling">Exception Handling in MXNet</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_data_loading">Efficient Data Loaders</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_engine">Dependency Engine</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_memory">Memory Consumption</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/overview">MXNet System Architecture</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/program_model">Deep Learning Programming Paradigm</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+               <!-- resource-p -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <!--- 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. -->
+
+<h1 id="mxnet-system-architecture">MXNet System Architecture</h1>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/dmlc.github.io/master/img/mxnet/system/overview.png" alt="System Overview" /></p>
+
+<p>This figure shows the major modules and components of the MXNet system and their interaction. The modules are:</p>
+
+<ul>
+  <li>Runtime Dependency Engine: Schedules and executes the
+operations according to their read/write dependency.</li>
+  <li>Storage Allocator: Efficiently allocates and recycles memory blocks
+on host (CPU) and devices (GPUs).</li>
+  <li>Resource Manager: Manages global resources, such as the random number generator
+and temporal space.</li>
+  <li>NDArray: Dynamic, asynchronous n-dimensional arrays,
+which provide flexible imperative programs for MXNet.</li>
+  <li>Symbolic Execution: Static symbolic graph executor,
+which provides efficient symbolic graph execution and optimization.</li>
+  <li>Operator: Operators that define static forward and gradient
+calculation (backprop).</li>
+  <li>SimpleOp: Operators that extend NDArray operators and symbolic operators
+in a unified fashion.</li>
+  <li>Symbol Construction: Symbolic construction, which provides a way to construct
+a computation graph (net configuration).</li>
+  <li>KVStore: Key-value store interface for efficient parameter synchronization.</li>
+  <li>Data Loading(IO): Efficient distributed data loading and augmentation.</li>
+</ul>
+
+<h1 id="mxnet-system-components">MXNet System Components</h1>
+
+<h2 id="execution-engine">Execution Engine</h2>
+
+<p>You can use MXNet’s engine not only for deep learning,
+but for any domain-specific problem.
+It’s designed to solve a general problem:
+execute a bunch of functions following their dependencies.
+Execution of any two functions with dependencies should be serialized.
+To boost performance, functions with no dependencies <em>can</em> be executed in parallel.
+For a general discussion of this topic,
+see our <a href="note_engine">notes on the dependency engine</a>.</p>
+
+<h3 id="interface">Interface</h3>
+
+<p>The following API is the core interface for the execution engine:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">virtual</span> <span class="kt">void</span> <span class="n">PushSync</span><span class="p">(</span><span class="n">Fn</span> <span class="n">exec_fun</span><span class="p">,</span> <span class="n">Context</span> <span class="n">exec_ctx</span><span class="p">,</span>
+                          <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">VarHandle</span><span class="o">&gt;</span> <span class="k">const</span><span class="o">&amp;</span> <span class="n">const_vars</span><span class="p">,</span>
+                          <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">VarHandle</span><span class="o">&gt;</span> <span class="k">const</span><span class="o">&amp;</span> <span class="n">mutate_vars</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+</code></pre></div></div>
+<p>This API allows you to push a function (<code class="highlighter-rouge">exec_fun</code>),
+along with its context information and dependencies, to the engine.
+<code class="highlighter-rouge">exec_ctx</code> is the context information in which the <code class="highlighter-rouge">exec_fun</code> should be executed,
+<code class="highlighter-rouge">const_vars</code> denotes the variables that the function reads from,
+and <code class="highlighter-rouge">mutate_vars</code> are the variables to be modified.
+The engine provides the following guarantee:</p>
+
+<blockquote>
+  <p><em>The execution of any two functions
+that modify a common variable
+is serialized in their push order.</em></p>
+</blockquote>
+
+<h3 id="function">Function</h3>
+
+<p>The function type of the engine is:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">using</span> <span class="n">Fn</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o">&lt;</span><span class="kt">void</span><span class="p">(</span><span class="n">RunContext</span><span class="p">)</span><span class="o">&gt;</span><span class="p">;</span>
+</code></pre></div></div>
+<p><code class="highlighter-rouge">RunContext</code> contains runtime information, which is determined by the engine:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">struct</span> <span class="n">RunContext</span> <span class="p">{</span>
+        <span class="c1">// stream pointer which could be safely cast to</span>
+        <span class="c1">// cudaStream_t* type</span>
+	    <span class="kt">void</span> <span class="o">*</span><span class="n">stream</span><span class="p">;</span>
+    <span class="p">};</span>
+</code></pre></div></div>
+<p>Alternatively, you could use <code class="highlighter-rouge">mxnet::engine::DAGEngine::Fn</code>, which has the same type definition.</p>
+
+<p>All of the functions are executed by the engine’s internal threads.
+In such a model, it’s usually not a good idea to push <em>blocking</em> functions
+to the engine (usually for dealing with I/O tasks like disk, web service, UI, etc.)
+because it will occupy the execution thread and reduce total throughput.
+In that case, we provide another <em>asynchronous</em> function type:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">using</span> <span class="n">Callback</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o">&lt;</span><span class="kt">void</span><span class="p">()</span><span class="o">&gt;</span><span class="p">;</span>
+    <span class="k">using</span> <span class="n">AsyncFn</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o">&lt;</span><span class="kt">void</span><span class="p">(</span><span class="n">RunContext</span><span class="p">,</span> <span class="n">Callback</span><span class="p">)</span><span class="o">&gt;</span><span class="p">;</span>
+</code></pre></div></div>
+<p>In the <code class="highlighter-rouge">AsyncFn</code> function, you can pass the heavy part to your own threads
+and safely exit the body of the function.
+The engine doesn’t consider the function finished
+until the <code class="highlighter-rouge">Callback</code> function is called.</p>
+
+<h3 id="context">Context</h3>
+
+<p>You can specify the <code class="highlighter-rouge">Context</code> of the function to be executed within.
+This usually includes whether the function should be run on a CPU or a GPU,
+and if you specify a GPU, which GPU to use.
+<code class="highlighter-rouge">Context</code> is different from <code class="highlighter-rouge">RunContext</code>.
+<code class="highlighter-rouge">Context</code> contains device type (GPU/CPU) and device id,
+ while <code class="highlighter-rouge">RunContext</code> contains information that can be decided only during runtime,
+ for example, on which stream the function should be executed.</p>
+
+<h3 id="varhandle">VarHandle</h3>
+
+<p><code class="highlighter-rouge">VarHandle</code> is used to specify the dependencies of functions.
+The MXNet engine is designed to be decoupled from other MXNet modules.
+So <code class="highlighter-rouge">VarHandle</code> is like an engine-provided token you use
+to represent the external resources the functions can use or modify.
+It’s designed to be lightweight, so creating,
+deleting, or copying a variable incurs little overhead.
+Upon pushing the functions, you need to specify the variables
+that will be used (immutable) in the <code class="highlighter-rouge">const_vars</code> vector,
+and the variables that will be modified (mutable) in the <code class="highlighter-rouge">mutate_vars</code> vector.
+The engine uses one rule for resolving the dependencies among functions:</p>
+
+<blockquote>
+  <p><em>The execution of any two functions when one of them modifies at least one common variable is serialized in their push order.</em></p>
+</blockquote>
+
+<p>For example, if <code class="highlighter-rouge">Fn1</code> and <code class="highlighter-rouge">Fn2</code> both mutate <code class="highlighter-rouge">V2</code> then <code class="highlighter-rouge">Fn2</code>
+is guaranteed to be executed after <code class="highlighter-rouge">Fn1</code>
+if <code class="highlighter-rouge">Fn2</code> is pushed after <code class="highlighter-rouge">Fn1</code>.
+On the other hand, if <code class="highlighter-rouge">Fn1</code> and <code class="highlighter-rouge">Fn2</code> both use <code class="highlighter-rouge">V2</code>,
+their actual execution order could be random.</p>
+
+<p>This design allows the engine to schedule <em>state-mutating</em> operations in a manner
+that minimizes calls to allocate new memory.
+For example, the weight update function in DNN
+can now use the <code class="highlighter-rouge">+=</code> operator
+to update the weights in place,
+rather than generating a new weight array each time.</p>
+
+<p>To create a variable, use the <code class="highlighter-rouge">NewVar()</code> API.
+To delete a variable, use the <code class="highlighter-rouge">PushDelete</code> API.</p>
+
+<h3 id="push-and-wait">Push and Wait</h3>
+
+<p><em>All <code class="highlighter-rouge">Push</code> APIs are asynchronous.</em> The API call returns immediately
+regardless of whether the pushed <code class="highlighter-rouge">Fn</code> is finished or not.
+This allows the engine to start computing at the same time
+as the user thread is pushing functions.
+<code class="highlighter-rouge">Push</code> APIs are not thread-safe.
+To be specific, only one thread should make engine API calls at a time.</p>
+
+<p>If you want to wait for a specific <code class="highlighter-rouge">Fn</code> to finish,
+include a callback function in the closure,
+and call the function at the end of your <code class="highlighter-rouge">Fn</code>.</p>
+
+<p>If you want to wait for all <code class="highlighter-rouge">Fn</code>s
+that involve (use or mutate) a certain variable to finish,
+use the <code class="highlighter-rouge">WaitForVar(var)</code> API.</p>
+
+<p>If you want to wait for all pushed <code class="highlighter-rouge">Fn</code>s to finish,
+use the <code class="highlighter-rouge">WaitForAll()</code> API.</p>
+
+<h3 id="save-object-creation-cost">Save Object Creation Cost</h3>
+
+<p>In some cases, you need to push several functions to the engine for a long period of time.
+If the computation of these functions is light,
+the overhead of copying lambdas and creating use/mutate variable lists becomes relatively high.
+We provide an API to create an <code class="highlighter-rouge">OprHandle</code> beforehand:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">virtual</span> <span class="n">OprHandle</span> <span class="n">NewOperator</span><span class="p">(</span><span class="n">AsyncFn</span> <span class="n">fn</span><span class="p">,</span>
+                                  <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">VarHandle</span><span class="o">&gt;</span> <span class="k">const</span><span class="o">&amp;</span> <span class="n">const_vars</span><span class="p">,</span>
+                                  <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">VarHandle</span><span class="o">&gt;</span> <span class="k">const</span><span class="o">&amp;</span> <span class="n">mutate_vars</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+</code></pre></div></div>
+<p>You can keep pushing the <code class="highlighter-rouge">OprHandle</code> without repeatedly creating them:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">virtual</span> <span class="kt">void</span> <span class="n">Push</span><span class="p">(</span><span class="n">OprHandle</span> <span class="n">op</span><span class="p">,</span> <span class="n">Context</span> <span class="n">exec_ctx</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+</code></pre></div></div>
+<p>To delete it, call the <code class="highlighter-rouge">DeleteOperator(OprHandle op)</code> API.
+Ensure that the operator has finished computing before calling this API.</p>
+
+<h2 id="operators-in-mxnet">Operators in MXNet</h2>
+
+<p>In MXNet, an operator is a class that contains both actual computation logic
+and auxiliary information that can aid the system in performing optimizations,
+like in-place updates and auto-derivatives.
+To understand the remainder of the document,
+we recommend that you familiarize yourself with the <code class="highlighter-rouge">mshadow</code> library,
+because all operators compute on the tensor-like structure <code class="highlighter-rouge">mshadow::TBlob</code>
+provided by the system during runtime.</p>
+
+<p>MXNet’s operator interface allows you to:</p>
+
+<ul>
+  <li>Reduce memory allocation cost by specifying in-place updates.</li>
+  <li>Hide some internal arguments from Python to make it cleaner.</li>
+  <li>Define the relationships among input tensors and output tensors,
+which allows the system to perform shape checking for you.</li>
+  <li>Acquire additional temporary spaces from the system
+to perform computation (e.g., calling <code class="highlighter-rouge">cudnn</code> routines).</li>
+</ul>
+
+<h3 id="operator-interface">Operator Interface</h3>
+
+<p><code class="highlighter-rouge">Forward</code> is the core operator interface:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">virtual</span> <span class="kt">void</span> <span class="n">Forward</span><span class="p">(</span><span class="k">const</span> <span class="n">OpContext</span> <span class="o">&amp;</span><span class="n">ctx</span><span class="p">,</span>
+                         <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">TBlob</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">in_data</span><span class="p">,</span>
+                         <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">OpReqType</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">req</span><span class="p">,</span>
+                         <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">TBlob</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_data</span><span class="p">,</span>
+                         <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">TBlob</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">aux_states</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+</code></pre></div></div>
+<p>The <code class="highlighter-rouge">OpContext</code> structure is:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="k">struct</span> <span class="n">OpContext</span> <span class="p">{</span>
+             <span class="kt">int</span> <span class="n">is_train</span><span class="p">;</span>
+             <span class="n">RunContext</span> <span class="n">run_ctx</span><span class="p">;</span>
+             <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Resource</span><span class="o">&gt;</span> <span class="n">requested</span><span class="p">;</span>
+           <span class="p">}</span>
+</code></pre></div></div>
+<p>It describes whether the operator is in the train or test phase,
+which device the operator should be run on (in <code class="highlighter-rouge">run_ctx</code>),
+and requested resources (covered in the following sections).</p>
+
+<ul>
+  <li><code class="highlighter-rouge">in_data</code> and <code class="highlighter-rouge">out_data</code> represent the input and output tensors, respectively.
+All of the tensor spaces have been allocated by the system.</li>
+  <li>
+    <p><code class="highlighter-rouge">req</code> denotes how the computation results are written into the <code class="highlighter-rouge">out_data</code>.
+In other words, <code class="highlighter-rouge">req.size() == out_data.size()</code> and <code class="highlighter-rouge">req[i]</code>
+correspond to the write type of <code class="highlighter-rouge">out_data[i]</code>.</p>
+  </li>
+  <li>The <code class="highlighter-rouge">OpReqType</code> is defined as:</li>
+</ul>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="k">enum</span> <span class="n">OpReqType</span> <span class="p">{</span>
+             <span class="n">kNullOp</span><span class="p">,</span>
+             <span class="n">kWriteTo</span><span class="p">,</span>
+             <span class="n">kWriteInplace</span><span class="p">,</span>
+             <span class="n">kAddTo</span>
+           <span class="p">};</span>
+</code></pre></div></div>
+<p>Normally, the types of all <code class="highlighter-rouge">out_data</code> should be <code class="highlighter-rouge">kWriteTo</code>,
+  meaning that the provided <code class="highlighter-rouge">out_data</code> tensor is a <em>raw</em> memory block,
+  so the operator should write results directly into it.
+  In some cases, for example when calculating the <code class="highlighter-rouge">gradient</code> tensor,
+  it would be great if we could accumulate the result,
+  rather than directly overwrite the tensor contents
+  so that  no extra space needs to be created each time.
+  In such a case, the corresponding <code class="highlighter-rouge">req</code> type is set as <code class="highlighter-rouge">kAddTo</code>,
+  indicating that a <code class="highlighter-rouge">+=</code> should be called.</p>
+
+<ul>
+  <li><code class="highlighter-rouge">aux_states</code> is intentionally designed for auxiliary tensors used to help computation. Currently, it is useless.</li>
+</ul>
+
+<p>Aside from the <code class="highlighter-rouge">Forward</code> operator, you could optionally implement the <code class="highlighter-rouge">Backward</code> interface:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">virtual</span> <span class="kt">void</span> <span class="nf">Backward</span><span class="p">(</span><span class="k">const</span> <span class="n">OpContext</span> <span class="o">&amp;</span><span class="n">ctx</span><span class="p">,</span>
+                          <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">TBlob</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_grad</span><span class="p">,</span>
+                          <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">TBlob</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">in_data</span><span class="p">,</span>
+                          <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">TBlob</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_data</span><span class="p">,</span>
+                          <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">OpReqType</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">req</span><span class="p">,</span>
+                          <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">TBlob</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">in_grad</span><span class="p">,</span>
+                          <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">TBlob</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">aux_states</span><span class="p">);</span>
+</code></pre></div></div>
+<p>This interface follows the same design principle as the <code class="highlighter-rouge">Forward</code> interface,
+except that <code class="highlighter-rouge">out_grad</code>, <code class="highlighter-rouge">in_data</code>, and <code class="highlighter-rouge">out_data</code> are given,
+and the operator computes <code class="highlighter-rouge">in_grad</code> as the results.
+ The naming strategy is similar to Torch’s convention,
+ and can be summarized in following figure:</p>
+
+<p>[input/output semantics figure]</p>
+
+<p>Some operators might not require all of the following:
+<code class="highlighter-rouge">out_grad</code>, <code class="highlighter-rouge">in_data</code> and <code class="highlighter-rouge">out_data</code>.
+You can specify these dependencies with the <code class="highlighter-rouge">DeclareBackwardDependency</code> interface in <code class="highlighter-rouge">OperatorProperty</code>.</p>
+
+<h3 id="operator-property">Operator Property</h3>
+
+<p>One convolution might have several implementations,
+and you might want to switch among them to achieve the best performance.
+Therefore, we separate the operator <em>semantic</em> interfaces
+from the implementation interface (<code class="highlighter-rouge">Operator</code> class)
+into the <code class="highlighter-rouge">OperatorProperty</code> class.
+The <code class="highlighter-rouge">OperatorProperty</code> interface consists of:</p>
+
+<ul>
+  <li><strong>InferShape:</strong></li>
+</ul>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="k">virtual</span> <span class="kt">bool</span> <span class="n">InferShape</span><span class="p">(</span><span class="n">mxnet</span><span class="o">::</span><span class="n">ShapeVector</span> <span class="o">*</span><span class="n">in_shape</span><span class="p">,</span>
+                                   <span class="n">mxnet</span><span class="o">::</span><span class="n">ShapeVector</span> <span class="o">*</span><span class="n">out_shape</span><span class="p">,</span>
+                                   <span class="n">mxnet</span><span class="o">::</span><span class="n">ShapeVector</span> <span class="o">*</span><span class="n">aux_shape</span><span class="p">)</span> <span class="k">const</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+</code></pre></div></div>
+
+<p>This interface has two purposes:</p>
+<ul>
+  <li>Tell the system the size of each input and output tensor,
+so it can allocate space for them before the <code class="highlighter-rouge">Forward</code> and <code class="highlighter-rouge">Backward</code> call.</li>
+  <li>
+    <p>Perform a size check to make sure that there isn’t an obvious error before running.
+The shape in <code class="highlighter-rouge">in_shape</code> is set by the system
+(from the <code class="highlighter-rouge">out_shape</code> of the previous operators).
+It returns <code class="highlighter-rouge">false</code> when there is not enough information
+to infer shapes or throws an error when the shape is inconsistent.</p>
+  </li>
+  <li><strong>Request Resources:</strong> Operations like <code class="highlighter-rouge">cudnnConvolutionForward</code> need a work space for computation.
+If the system can manage that, it could then perform optimizations,
+like reuse the space, and so on.
+MXNet defines two interfaces to achieve this:</li>
+</ul>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="k">virtual</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">ResourceRequest</span><span class="o">&gt;</span> <span class="n">ForwardResource</span><span class="p">(</span>
+               <span class="k">const</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">ShapeVector</span> <span class="o">&amp;</span><span class="n">in_shape</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
+           <span class="k">virtual</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">ResourceRequest</span><span class="o">&gt;</span> <span class="n">BackwardResource</span><span class="p">(</span>
+               <span class="k">const</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">ShapeVector</span> <span class="o">&amp;</span><span class="n">in_shape</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
+</code></pre></div></div>
+<p>The <code class="highlighter-rouge">ResourceRequest</code> structure (in <code class="highlighter-rouge">resource.h</code>) currently contains only a type flag:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="k">struct</span> <span class="n">ResourceRequest</span> <span class="p">{</span>
+             <span class="k">enum</span> <span class="n">Type</span> <span class="p">{</span>
+               <span class="n">kRandom</span><span class="p">,</span>  <span class="c1">// get a mshadow::Random&lt;xpu&gt; object</span>
+               <span class="n">kTempSpace</span><span class="p">,</span>  <span class="c1">// request temporary space</span>
+             <span class="p">};</span>
+             <span class="n">Type</span> <span class="n">type</span><span class="p">;</span>
+           <span class="p">};</span>
+</code></pre></div></div>
+<p>If <code class="highlighter-rouge">ForwardResource</code> and <code class="highlighter-rouge">BackwardResource</code> return non-empty arrays,
+  the system offers the corresponding resources through the <code class="highlighter-rouge">ctx</code> parameter
+  in the <code class="highlighter-rouge">Forward</code> and <code class="highlighter-rouge">Backward</code> interface of <code class="highlighter-rouge">Operator</code>.
+  Basically, to access those resources, simply write:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="k">auto</span> <span class="n">tmp_space_res</span> <span class="o">=</span> <span class="n">ctx</span><span class="p">.</span><span class="n">requested</span><span class="p">[</span><span class="n">kTempSpace</span><span class="p">].</span><span class="n">get_space</span><span class="p">(</span><span class="n">some_shape</span><span class="p">,</span> <span class="n">s [...]
+           <span class="k">auto</span> <span class="n">rand_res</span> <span class="o">=</span> <span class="n">ctx</span><span class="p">.</span><span class="n">requested</span><span class="p">[</span><span class="n">kRandom</span><span class="p">].</span><span class="n">get_random</span><span class="p">(</span><span class="n">some_stream</span><span class="p">);</span>
+</code></pre></div></div>
+<p>For an example, see <code class="highlighter-rouge">src/operator/cudnn_convolution-inl.h</code>.</p>
+
+<ul>
+  <li><strong>Backward dependency:</strong> Let’s look at two different operator signatures
+(we name all of the arguments for demonstration purposes):</li>
+</ul>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="kt">void</span> <span class="nf">FullyConnectedForward</span><span class="p">(</span><span class="n">TBlob</span> <span class="n">weight</span><span class="p">,</span> <span class="n">TBlob</span> <span class="n">in_data</span><span class="p">,</span> <span class="n">TBlob</span> <span class="n">out_data</span><span class="p">);</span>
+           <span class="kt">void</span> <span class="nf">FullyConnectedBackward</span><span class="p">(</span><span class="n">TBlob</span> <span class="n">weight</span><span class="p">,</span> <span class="n">TBlob</span> <span class="n">in_data</span><span class="p">,</span> <span class="n">TBlob</span> <span class="n">out_grad</span><span class="p">,</span> <span class="n">TBlob</span> <span class="n">in_grad</span><span class="p">);</span>
+
+           <span class="kt">void</span> <span class="nf">PoolingForward</span><span class="p">(</span><span class="n">TBlob</span> <span class="n">in_data</span><span class="p">,</span> <span class="n">TBlob</span> <span class="n">out_data</span><span class="p">);</span>
+           <span class="kt">void</span> <span class="nf">PoolingBackward</span><span class="p">(</span><span class="n">TBlob</span> <span class="n">in_data</span><span class="p">,</span> <span class="n">TBlob</span> <span class="n">out_data</span><span class="p">,</span> <span class="n">TBlob</span> <span class="n">out_grad</span><span class="p">,</span> <span class="n">TBlob</span> <span class="n">in_grad</span><span class="p">);</span>
+</code></pre></div></div>
+<p>Note that <code class="highlighter-rouge">out_data</code> in <code class="highlighter-rouge">FullyConnectedForward</code>
+  is not used by <code class="highlighter-rouge">FullyConnectedBackward</code>,
+  while <code class="highlighter-rouge">PoolingBackward</code> requires all of the arguments of <code class="highlighter-rouge">PoolingForward</code>.
+  Therefore, for <code class="highlighter-rouge">FullyConnectedForward</code>,
+  the <code class="highlighter-rouge">out_data</code> tensor once consumed could be safely freed
+  because the backward function will not need it.
+  This provides a chance for the system to collect some tensors
+  as garbage as soon as possible.
+  To specify this situation, we provide an interface:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>          <span class="k">virtual</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">DeclareBackwardDependency</span><span class="p">(</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_grad</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">in_data</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_data</span><span class="p">)</span> <span class="k">const</span><span class="p">;</span>
+</code></pre></div></div>
+<p>The <code class="highlighter-rouge">int</code> element of the argument vector is an ID
+  to distinguish different arrays.
+  Let’s see how this interface specifies different dependencies
+  for <code class="highlighter-rouge">FullyConnected</code> and <code class="highlighter-rouge">Pooling</code>:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">FullyConnectedProperty</span><span class="o">::</span><span class="n">DeclareBackwardDependency</span><span class="p">(</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_grad</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">in_data</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_data</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
+             <span class="k">return</span> <span class="p">{</span><span class="n">out_grad</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">in_data</span><span class="p">[</span><span class="mi">0</span><span class="p">]};</span>  <span class="c1">// NOTE: out_data[0] is NOT included</span>
+           <span class="p">}</span>
+           <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">PoolingProperty</span><span class="o">::</span><span class="n">DeclareBackwardDependency</span><span class="p">(</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_grad</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">in_data</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_data</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
+             <span class="k">return</span> <span class="p">{</span><span class="n">out_grad</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">in_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">out_data</span><span class="p">[</span><span class="mi">0</span><span class="p">]};</span>
+           <span class="p">}</span>
+</code></pre></div></div>
+
+<ul>
+  <li><strong>In place Option:</strong> To further save the cost of memory allocation,
+you can use in-place updates.
+They are appropriate for element-wise operations
+when the input tensor and output tensor have the same shape.
+You specify and in-place update with the following interface:</li>
+</ul>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="k">virtual</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">void</span><span class="o">*&gt;&gt;</span>    <span class="n">ElewiseOpP [...]
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">in_data</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">*&gt;</span> <span class="o">&amp;</span><span class="n">out_data</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
+             <span class="k">return</span> <span class="p">{</span> <span class="p">{</span><span class="n">in_data</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">out_data</span><span class="p">[</span><span class="mi">0</span><span class="p">]}</span> <span class="p">};</span>
+           <span class="p">}</span>
+           <span class="k">virtual</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">void</span><span class="o">*&gt;&gt;</span> <span class="n">ElewiseOpProperty</span><span class="o">::</span><span class="n">BackwardInplaceOption</span><span class="p"> [...]
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_grad</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">in_data</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="o">&amp;</span><span class="n">out_data</span><span class="p">,</span>
+               <span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">*&gt;</span> <span class="o">&amp;</span><span class="n">in_grad</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
+             <span class="k">return</span> <span class="p">{</span> <span class="p">{</span><span class="n">out_grad</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">in_grad</span><span class="p">[</span><span class="mi">0</span><span class="p">]}</span> <span class="p">}</span>
+           <span class="p">}</span>
+</code></pre></div></div>
+<p>This tells the system that the <code class="highlighter-rouge">in_data[0]</code> and <code class="highlighter-rouge">out_data[0]</code> tensors could share the same memory spaces during <code class="highlighter-rouge">Forward</code>, and so do <code class="highlighter-rouge">out_grad[0]</code> and <code class="highlighter-rouge">in_grad[0]</code> during <code class="highlighter-rouge">Backward</code>.</p>
+
+<blockquote>
+  <p><strong>Important:</strong> Even if you use the preceding specification, it’s <em>not</em> guaranteed that the input and output tensors will share the same space. In fact, this is only a suggestion for the system, which makes the final decision. However, in either case, the decision is completely transparent to you, so the actual <code class="highlighter-rouge">Forward</code> and <code class="highlighter-rouge">Backward</code> implementation does not need to consider that.</p>
+</blockquote>
+
+<ul>
+  <li><strong>Expose Operator to Python:</strong> Because of the restrictions of C++, you need user to implement following interfaces:</li>
+</ul>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>           <span class="c1">// initial the property class from a list of key-value string pairs</span>
+           <span class="k">virtual</span> <span class="kt">void</span> <span class="n">Init</span><span class="p">(</span><span class="k">const</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="n">string</span><span class="p">,</span> <span class="n">string</span><span class="o">&gt;&gt;</span> <span class="o">&amp;</span><span class="n">kwargs</span><span class="p">)</span> <span class="o">=</span> <span cla [...]
+           <span class="c1">// return the parameters in a key-value string map</span>
+           <span class="k">virtual</span> <span class="n">map</span><span class="o">&lt;</span><span class="n">string</span><span class="p">,</span> <span class="n">string</span><span class="o">&gt;</span> <span class="n">GetParams</span><span class="p">()</span> <span class="k">const</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+           <span class="c1">// return the name of arguments (for generating signature in python)</span>
+           <span class="k">virtual</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">ListArguments</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span>
+           <span class="c1">// return the name of output values</span>
+           <span class="k">virtual</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">ListOutputs</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span>
+           <span class="c1">// return the name of auxiliary states</span>
+           <span class="k">virtual</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">ListAuxiliaryStates</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span>
+           <span class="c1">// return the number of output values</span>
+           <span class="k">virtual</span> <span class="kt">int</span> <span class="n">NumOutputs</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span>
+           <span class="c1">// return the number of visible outputs</span>
+           <span class="k">virtual</span> <span class="kt">int</span> <span class="n">NumVisibleOutputs</span><span class="p">()</span> <span class="k">const</span><span class="p">;</span>
+</code></pre></div></div>
+
+<h3 id="create-an-operator-from-the-operator-property">Create an Operator from the Operator Property</h3>
+
+<p><code class="highlighter-rouge">OperatorProperty</code> includes all <em>semantic</em> attributes of an operation. It’s also responsible for creating the <code class="highlighter-rouge">Operator</code> pointer for actual computation.</p>
+
+<h4 id="create-operator">Create Operator</h4>
+<p>Implement the following interface in <code class="highlighter-rouge">OperatorProperty</code>:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">virtual</span> <span class="n">Operator</span><span class="o">*</span> <span class="n">CreateOperator</span><span class="p">(</span><span class="n">Context</span> <span class="n">ctx</span><span class="p">)</span> <span class="k">const</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
+</code></pre></div></div>
+<p>For example:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">class</span> <span class="nc">ConvolutionOp</span> <span class="p">{</span>
+     <span class="nl">public:</span>
+      <span class="kt">void</span> <span class="n">Forward</span><span class="p">(</span> <span class="p">...</span> <span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
+      <span class="kt">void</span> <span class="n">Backward</span><span class="p">(</span> <span class="p">...</span> <span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
+    <span class="p">};</span>
+    <span class="k">class</span> <span class="nc">ConvolutionOpProperty</span> <span class="o">:</span> <span class="k">public</span> <span class="n">OperatorProperty</span> <span class="p">{</span>
+     <span class="nl">public:</span>
+      <span class="n">Operator</span><span class="o">*</span> <span class="n">CreateOperator</span><span class="p">(</span><span class="n">Context</span> <span class="n">ctx</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
+        <span class="k">return</span> <span class="k">new</span> <span class="n">ConvolutionOp</span><span class="p">;</span>
+      <span class="p">}</span>
+    <span class="p">};</span>
+</code></pre></div></div>
+
+<h4 id="parametrize-operator">Parametrize Operator</h4>
+<p>When implementing a convolution operator, you need to know the kernel size,
+the stride size, padding size, and so on.
+These parameters should be passed to the operator
+before any <code class="highlighter-rouge">Forward</code> or <code class="highlighter-rouge">Backward</code> interface is called.
+To do so, you could define a <code class="highlighter-rouge">ConvolutionParam</code> structure, as follows:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="cp">#include &lt;dmlc/parameter.h&gt;
+</span>    <span class="k">struct</span> <span class="n">ConvolutionParam</span> <span class="o">:</span> <span class="k">public</span> <span class="n">dmlc</span><span class="o">::</span><span class="n">Parameter</span><span class="o">&lt;</span><span class="n">ConvolutionParam</span><span class="o">&gt;</span> <span class="p">{</span>
+      <span class="n">mxnet</span><span class="o">::</span><span class="n">TShape</span> <span class="n">kernel</span><span class="p">,</span> <span class="n">stride</span><span class="p">,</span> <span class="n">pad</span><span class="p">;</span>
+      <span class="kt">uint32_t</span> <span class="n">num_filter</span><span class="p">,</span> <span class="n">num_group</span><span class="p">,</span> <span class="n">workspace</span><span class="p">;</span>
+      <span class="kt">bool</span> <span class="n">no_bias</span><span class="p">;</span>
+    <span class="p">};</span>
+</code></pre></div></div>
+<p>Put it in <code class="highlighter-rouge">ConvolutionOpProperty</code>, and pass it to the operator class during construction:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">class</span> <span class="nc">ConvolutionOp</span> <span class="p">{</span>
+     <span class="nl">public:</span>
+      <span class="n">ConvolutionOp</span><span class="p">(</span><span class="n">ConvolutionParam</span> <span class="n">p</span><span class="p">)</span><span class="o">:</span> <span class="n">param_</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="p">{}</span>
+      <span class="kt">void</span> <span class="n">Forward</span><span class="p">(</span> <span class="p">...</span> <span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
+      <span class="kt">void</span> <span class="n">Backward</span><span class="p">(</span> <span class="p">...</span> <span class="p">)</span> <span class="p">{</span> <span class="p">...</span> <span class="p">}</span>
+     <span class="nl">private:</span>
+      <span class="n">ConvolutionParam</span> <span class="n">param_</span><span class="p">;</span>
+    <span class="p">};</span>
+    <span class="k">class</span> <span class="nc">ConvolutionOpProperty</span> <span class="o">:</span> <span class="k">public</span> <span class="n">OperatorProperty</span> <span class="p">{</span>
+     <span class="nl">public:</span>
+      <span class="kt">void</span> <span class="n">Init</span><span class="p">(</span><span class="k">const</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">pair</span><span class="o">&lt;</span><span class="n">string</span><span class="p">,</span> <span class="n">string</span><span class="o">&gt;&amp;</span> <span class="n">kwargs</span><span class="p">)</span> <span class="p">{</span>
+        <span class="c1">// initialize param_ using kwargs</span>
+      <span class="p">}</span>
+      <span class="n">Operator</span><span class="o">*</span> <span class="n">CreateOperator</span><span class="p">(</span><span class="n">Context</span> <span class="n">ctx</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
+        <span class="k">return</span> <span class="k">new</span> <span class="n">ConvolutionOp</span><span class="p">(</span><span class="n">param_</span><span class="p">);</span>
+      <span class="p">}</span>
+     <span class="nl">private:</span>
+      <span class="n">ConvolutionParam</span> <span class="n">param_</span><span class="p">;</span>
+    <span class="p">};</span>
+</code></pre></div></div>
+
+<h4 id="register-the-operator-property-class-and-the-parameter-class-to-mxnet">Register the Operator Property Class and the Parameter Class to MXNet</h4>
+<p>Use the following macros to register the parameter structure and the operator property class to MXNet:</p>
+
+<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">DMLC_REGISTER_PARAMETER</span><span class="p">(</span><span class="n">ConvolutionParam</span><span class="p">);</span>
+    <span class="n">MXNET_REGISTER_OP_PROPERTY</span><span class="p">(</span><span class="n">Convolution</span><span class="p">,</span> <span class="n">ConvolutionOpProperty</span><span class="p">);</span>
+</code></pre></div></div>
+<p>The first argument is the name string, the second is the property class name.</p>
+
+<h3 id="interface-summary">Interface Summary</h3>
+
+<p>We’ve almost covered the entire interface required to define a new operator. Let’s do a recap:</p>
+
+<ul>
+  <li>Use the <code class="highlighter-rouge">Operator</code> interface to write your computation logic (<code class="highlighter-rouge">Forward</code> and <code class="highlighter-rouge">Backward</code>).</li>
+  <li>Use the <code class="highlighter-rouge">OperatorProperty</code> interface to:
+    <ul>
+      <li>Pass the parameter to the operator class (you can use the <code class="highlighter-rouge">Init</code> interface).</li>
+      <li>Create an operator using the <code class="highlighter-rouge">CreateOperator</code> interface.</li>
+      <li>Correctly implement the operator description interface, such as the names of arguments, etc.</li>
+      <li>Correctly implement the <code class="highlighter-rouge">InferShape</code> interface to set the output tensor shape.</li>
+      <li>[Optional] If additional resources are needed, check <code class="highlighter-rouge">ForwardResource</code> and <code class="highlighter-rouge">BackwardResource</code>.</li>
+      <li>[Optional] If <code class="highlighter-rouge">Backward</code> doesn’t need all of the input and output of <code class="highlighter-rouge">Forward</code>, check <code class="highlighter-rouge">DeclareBackwardDependency</code>.</li>
+      <li>[Optional] If in-place update is supported, check <code class="highlighter-rouge">ForwardInplaceOption</code> and <code class="highlighter-rouge">BackwardInplaceOption</code>.</li>
+    </ul>
+  </li>
+  <li>Register the <code class="highlighter-rouge">OperatorProperty</code> class and the parameter class.</li>
+</ul>
+
+<h2 id="unifying-the-ndarray-operator-and-symbolic-operator">Unifying the NDArray Operator and Symbolic Operator</h2>
+<p>NDArray operations are similar to symbolic operations,
+except that sometimes you can’t write in place to the operands
+without a complete dependency graph.
+However, the logic underlying NDArray and symbolic operations are almost identical.
+<em>SimpleOp</em>, a new unified operator API,
+unifies different invoking processes
+and returns to the fundamental elements of operators.
+Because most mathematical operators attend to one or two operands,
+and more operands make dependency-related optimization useful,
+the unified operator is specifically designed for unary and binary operations.</p>
+
+<p>Consider the elements of an operation.
+Ideally, you need only functions and derivatives
+to describe an operation.
+Let’s restrict that to the space of unary and binary operations.
+How do we classify all operations to maximize the possibility
+of in-place write optimization?
+Note that you can separate functions by the number of operands.
+Derivatives are a bit more complex.
+To construct a dependency graph, you need to know whether output value,
+input data, or neither are needed alongside head gradient.
+Gradient functions in the unified API are differentiated
+by the types of operands it takes for calculation.</p>
+
+<p>Before you learn more about the SimpleOp interface,
+ we recommend that you review the
+ <a href="https://github.com/dmlc/mshadow/tree/master/guide">mshadow library guide</a>
+ because  calculations will be done in the <code class="highlighter-rouge">mshadow::TBlob</code> structure.</p>
+
+<p>In the following example, we’ll create an operator
+functioning as a smooth l1 loss,
+which is a mixture of l1 loss and l2 loss. The loss itself can be written as:</p>
+
+<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    loss = outside_weight .* f(inside_weight .* (data - label))
+    grad = outside_weight .* inside_weight .* f'(inside_weight .* (data - label))
+</code></pre></div></div>
+<p><code class="highlighter-rouge">.*</code> stands for element-wise multiplication, and <code class="highlighter-rouge">f</code>, <code class="highlighter-rouge">f'</code> is the smooth l1 loss function,
+which we are assuming is in <code class="highlighter-rouge">mshadow</code> for now.
+At first glance, it’s impossible to implement
+this particular loss as a unary or binary operator.
+But we have automatic differentiation in symbolic execution.
+That simplifies the loss to <code class="highlighter-rouge">f</code> and <code class="highlighter-rouge">f'</code> directly.
+This loss is no more complex than a <code class="highlighter-rouge">sin</code> or an <code class="highlighter-rouge">abs</code> function,
+and can certainly be implemented as a unary operator.</p>
+
+<h2 id="simpleop-the-unified-operator-api">SimpleOp: The Unified Operator API</h2>
+<h3 id="define-shapes">Define Shapes</h3>
+<p>The <code class="highlighter-rouge">mshadow</code> library requires explicit memory allocation.
+As a consequence, all data shapes
+must be provided before any calculation occurs.
+ Before we proceed with defining functions and gradient,
+let’s check input data shape consistency and provide output shape.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">typedef</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">TShape</span> <span class="p">(</span><span class="o">*</span><span class="n">UnaryShapeFunction</span><span class="p">)(</span><span class="k">const</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">TShape</span><span class="o">&amp;</span> <span class="n">src</spa [...]
+                                         <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">);</span>
+    <span class="k">typedef</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">TShape</span> <span class="p">(</span><span class="o">*</span><span class="n">BinaryShapeFunction</span><span class="p">)(</span><span class="k">const</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">TShape</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span>
+                                          <span class="k">const</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">TShape</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">,</span>
+                                          <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">);</span>
+</code></pre></div></div>
+<p>You can use <code class="highlighter-rouge">mshadow::TShape</code> to check input data shape and designate output data shape.
+If you don’t define this function, the default output shape is the same as the input shape.
+In the case of a binary operator, the shape of <code class="highlighter-rouge">lhs</code> and <code class="highlighter-rouge">rhs</code> is checked as the same by default.</p>
+
+<p>You can also use shape functions to check if any additional arguments and resources are present.
+Refer to the additional usages of <code class="highlighter-rouge">EnvArguments</code> to accomplish this.</p>
+
+<p>Before we start on our smooth l1 loss example, we define a <code class="highlighter-rouge">XPU</code> to <code class="highlighter-rouge">cpu</code> or <code class="highlighter-rouge">gpu</code> in the header
+<code class="highlighter-rouge">smooth_l1_unary-inl.h</code> implementation so that we reuse the same code in <code class="highlighter-rouge">smooth_l1_unary.cc</code> and
+<code class="highlighter-rouge">smooth_l1_unary.cu</code>.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="cp">#include &lt;mxnet/operator_util.h&gt;
+</span>    <span class="cp">#if defined(__CUDACC__)
+</span>    <span class="cp">#define XPU gpu
+</span>    <span class="cp">#else
+</span>    <span class="cp">#define XPU cpu
+</span>    <span class="cp">#endif
+</span></code></pre></div></div>
+<p>In our smooth l1 loss example, it’s okay to use the default behavior whereby the output has the same shape as the source.
+Written explicitly, it is:</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="kr">inline</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">TShape</span> <span class="nf">SmoothL1Shape_</span><span class="p">(</span><span class="k">const</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">TShape</span><span class="o">&amp;</span> <span class="n">src</span><span class="p">,</span>
+                                 <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">return</span> <span class="n">mxnet</span><span class="o">::</span><span class="n">TShape</span><span class="p">(</span><span class="n">src</span><span class="p">);</span>
+    <span class="p">}</span>
+</code></pre></div></div>
+
+<h3 id="define-functions">Define Functions</h3>
+<p>Create a unary or binary function with one output: <code class="highlighter-rouge">mshadow::TBlob</code>.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">typedef</span> <span class="nf">void</span> <span class="p">(</span><span class="o">*</span><span class="n">UnaryFunction</span><span class="p">)(</span><span class="k">const</span> <span class="n">TBlob</span><span class="o">&amp;</span> <span class="n">src</span><span class="p">,</span>
+                                  <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">,</span>
+                                  <span class="n">TBlob</span><span class="o">*</span> <span class="n">ret</span><span class="p">,</span>
+                                  <span class="n">OpReqType</span> <span class="n">req</span><span class="p">,</span>
+                                  <span class="n">RunContext</span> <span class="n">ctx</span><span class="p">);</span>
+    <span class="k">typedef</span> <span class="nf">void</span> <span class="p">(</span><span class="o">*</span><span class="n">BinaryFunction</span><span class="p">)(</span><span class="k">const</span> <span class="n">TBlob</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span>
+                                   <span class="k">const</span> <span class="n">TBlob</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">,</span>
+                                   <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">,</span>
+                                   <span class="n">TBlob</span><span class="o">*</span> <span class="n">ret</span><span class="p">,</span>
+                                   <span class="n">OpReqType</span> <span class="n">req</span><span class="p">,</span>
+                                   <span class="n">RunContext</span> <span class="n">ctx</span><span class="p">);</span>
+</code></pre></div></div>
+<ul>
+  <li>Functions are differentiated by the types of input arguments.</li>
+  <li><code class="highlighter-rouge">RunContext ctx</code> contains information needed during runtime for execution.</li>
+</ul>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>        <span class="k">struct</span> <span class="n">RunContext</span> <span class="p">{</span>
+          <span class="kt">void</span> <span class="o">*</span><span class="n">stream</span><span class="p">;</span>  <span class="c1">// the stream of the device, can be NULL or Stream&lt;gpu&gt;* in GPU mode</span>
+          <span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">xpu</span><span class="o">&gt;</span> <span class="kr">inline</span> <span class="n">mshadow</span><span class="o">::</span><span class="n">Stream</span><span class="o">&lt;</span><span class="n">xpu</span><span class="o">&gt;*</span> <span class="n">get_stream</span><span class="p">()</span> <span class="c1">// get mshadow stream from Context</span>
+        <span class="p">}</span>  <span class="c1">// namespace mxnet</span>
+</code></pre></div></div>
+<p><code class="highlighter-rouge">mshadow::stream&lt;xpu&gt; *s = ctx.get_stream&lt;xpu&gt;();</code> is an example of obtaining a stream from <code class="highlighter-rouge">ctx</code>.</p>
+<ul>
+  <li><code class="highlighter-rouge">OpReqType req</code> denotes how computation results are written into <code class="highlighter-rouge">ret</code>.</li>
+</ul>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>        <span class="k">enum</span> <span class="n">OpReqType</span> <span class="p">{</span>
+          <span class="n">kNullOp</span><span class="p">,</span>  <span class="c1">// no operation, do not write anything</span>
+          <span class="n">kWriteTo</span><span class="p">,</span>  <span class="c1">// write gradient to provided space</span>
+          <span class="n">kWriteInplace</span><span class="p">,</span>  <span class="c1">// perform an in-place write</span>
+          <span class="n">kAddTo</span>  <span class="c1">// add to the provided space</span>
+        <span class="p">};</span>
+</code></pre></div></div>
+<p>A macro is defined in <code class="highlighter-rouge">operator_util.h</code> for a simplified use of <code class="highlighter-rouge">OpReqType</code>.
+  <code class="highlighter-rouge">ASSIGN_DISPATCH(out, req, exp)</code> checks <code class="highlighter-rouge">req</code> and performs an assignment.</p>
+
+<p>In our smooth l1 loss example, we use <code class="highlighter-rouge">UnaryFunction</code> to define the function of this operator.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">xpu</span><span class="o">&gt;</span>
+    <span class="kt">void</span> <span class="nf">SmoothL1Forward_</span><span class="p">(</span><span class="k">const</span> <span class="n">TBlob</span><span class="o">&amp;</span> <span class="n">src</span><span class="p">,</span>
+                          <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">,</span>
+                          <span class="n">TBlob</span> <span class="o">*</span><span class="n">ret</span><span class="p">,</span>
+                          <span class="n">OpReqType</span> <span class="n">req</span><span class="p">,</span>
+                          <span class="n">RunContext</span> <span class="n">ctx</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">using</span> <span class="k">namespace</span> <span class="n">mshadow</span><span class="p">;</span>
+      <span class="k">using</span> <span class="k">namespace</span> <span class="n">mshadow</span><span class="o">::</span><span class="n">expr</span><span class="p">;</span>
+      <span class="n">mshadow</span><span class="o">::</span><span class="n">Stream</span><span class="o">&lt;</span><span class="n">xpu</span><span class="o">&gt;</span> <span class="o">*</span><span class="n">s</span> <span class="o">=</span> <span class="n">ctx</span><span class="p">.</span><span class="n">get_stream</span><span class="o">&lt;</span><span class="n">xpu</span><span class="o">&gt;</span><span class="p">();</span>
+      <span class="n">real_t</span> <span class="n">sigma2</span> <span class="o">=</span> <span class="n">env</span><span class="p">.</span><span class="n">scalar</span> <span class="o">*</span> <span class="n">env</span><span class="p">.</span><span class="n">scalar</span><span class="p">;</span>
+      <span class="n">MSHADOW_TYPE_SWITCH</span><span class="p">(</span><span class="n">ret</span><span class="o">-&gt;</span><span class="n">type_flag_</span><span class="p">,</span> <span class="n">DType</span><span class="p">,</span> <span class="p">{</span>
+        <span class="n">mshadow</span><span class="o">::</span><span class="n">Tensor</span><span class="o">&lt;</span><span class="n">xpu</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">DType</span><span class="o">&gt;</span> <span class="n">out</span> <span class="o">=</span> <span class="n">ret</span><span class="o">-&gt;</span><span class="n">get</span><span class="o">&lt;</span><span class="n">xpu</span><span class="p">,</span> <span  [...]
+        <span class="n">mshadow</span><span class="o">::</span><span class="n">Tensor</span><span class="o">&lt;</span><span class="n">xpu</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">DType</span><span class="o">&gt;</span> <span class="n">in</span> <span class="o">=</span> <span class="n">src</span><span class="p">.</span><span class="n">get</span><span class="o">&lt;</span><span class="n">xpu</span><span class="p">,</span> <span class [...]
+        <span class="n">ASSIGN_DISPATCH</span><span class="p">(</span><span class="n">out</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span>
+                        <span class="n">F</span><span class="o">&lt;</span><span class="n">mshadow_op</span><span class="o">::</span><span class="n">smooth_l1_loss</span><span class="o">&gt;</span><span class="p">(</span><span class="n">in</span><span class="p">,</span> <span class="n">ScalarExp</span><span class="o">&lt;</span><span class="n">DType</span><span class="o">&gt;</span><span class="p">(</span><span class="n">sigma2</span><span class="p">)));</span>
+      <span class="p">});</span>
+    <span class="p">}</span>
+</code></pre></div></div>
+<p>After obtaining <code class="highlighter-rouge">mshadow::Stream</code> from <code class="highlighter-rouge">RunContext</code>, we get <code class="highlighter-rouge">mshadow::Tensor</code> from <code class="highlighter-rouge">mshadow::TBlob</code>.
+<code class="highlighter-rouge">mshadow::F</code> is a shortcut to initiate a <code class="highlighter-rouge">mshadow</code> expression. The macro <code class="highlighter-rouge">MSHADOW_TYPE_SWITCH(type, DType, ...)</code>
+handles details on different types, and the macro <code class="highlighter-rouge">ASSIGN_DISPATCH(out, req, exp)</code> checks <code class="highlighter-rouge">OpReqType</code> and
+performs actions accordingly. <code class="highlighter-rouge">sigma2</code> is a special parameter in this loss, which we will cover later.</p>
+
+<h3 id="define-gradients-optional">Define Gradients (Optional)</h3>
+<p>Create a gradient function with various types of inputs.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="c1">// depending only on out_grad</span>
+    <span class="k">typedef</span> <span class="nf">void</span> <span class="p">(</span><span class="o">*</span><span class="n">UnaryGradFunctionT0</span><span class="p">)(</span><span class="k">const</span> <span class="n">OutputGrad</span><span class="o">&amp;</span> <span class="n">out_grad</span><span class="p">,</span>
+                                        <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">,</span>
+                                        <span class="n">TBlob</span><span class="o">*</span> <span class="n">in_grad</span><span class="p">,</span>
+                                        <span class="n">OpReqType</span> <span class="n">req</span><span class="p">,</span>
+                                        <span class="n">RunContext</span> <span class="n">ctx</span><span class="p">);</span>
+    <span class="c1">// depending only on out_value</span>
+    <span class="k">typedef</span> <span class="nf">void</span> <span class="p">(</span><span class="o">*</span><span class="n">UnaryGradFunctionT1</span><span class="p">)(</span><span class="k">const</span> <span class="n">OutputGrad</span><span class="o">&amp;</span> <span class="n">out_grad</span><span class="p">,</span>
+                                        <span class="k">const</span> <span class="n">OutputValue</span><span class="o">&amp;</span> <span class="n">out_value</span><span class="p">,</span>
+                                        <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">,</span>
+                                        <span class="n">TBlob</span><span class="o">*</span> <span class="n">in_grad</span><span class="p">,</span>
+                                        <span class="n">OpReqType</span> <span class="n">req</span><span class="p">,</span>
+                                         <span class="n">RunContext</span> <span class="n">ctx</span><span class="p">);</span>
+    <span class="c1">// depending only on in_data</span>
+    <span class="k">typedef</span> <span class="nf">void</span> <span class="p">(</span><span class="o">*</span><span class="n">UnaryGradFunctionT2</span><span class="p">)(</span><span class="k">const</span> <span class="n">OutputGrad</span><span class="o">&amp;</span> <span class="n">out_grad</span><span class="p">,</span>
+                                        <span class="k">const</span> <span class="n">Input0</span><span class="o">&amp;</span> <span class="n">in_data0</span><span class="p">,</span>
+                                        <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">,</span>
+                                        <span class="n">TBlob</span><span class="o">*</span> <span class="n">in_grad</span><span class="p">,</span>
+                                        <span class="n">OpReqType</span> <span class="n">req</span><span class="p">,</span>
+                                        <span class="n">RunContext</span> <span class="n">ctx</span><span class="p">);</span>
+</code></pre></div></div>
+<p>Gradient functions of binary operators have similar structures, except that <code class="highlighter-rouge">Input</code>, <code class="highlighter-rouge">TBlob</code>, and <code class="highlighter-rouge">OpReqType</code>
+are doubled.</p>
+
+<p><code class="highlighter-rouge">GradFunctionArgument</code></p>
+
+<p><code class="highlighter-rouge">Input0</code>, <code class="highlighter-rouge">Input</code>, <code class="highlighter-rouge">OutputValue</code>, and <code class="highlighter-rouge">OutputGrad</code> all share the structure of <code class="highlighter-rouge">GradFunctionArgument</code>,
+  which is defined as:</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>      <span class="k">struct</span> <span class="n">GradFunctionArgument</span> <span class="p">{</span>
+          <span class="n">TBlob</span> <span class="n">data</span><span class="p">;</span>
+      <span class="p">}</span>
+</code></pre></div></div>
+
+<p>In our smooth l1 loss example, note that it’s an <code class="highlighter-rouge">f'(x)</code>,
+which utilizes input for the gradient calculation,
+so the <code class="highlighter-rouge">UnaryGradFunctionT2</code> is suitable.
+To enable the chain rule of the gradient,
+we also need to multiply <code class="highlighter-rouge">out_grad</code> from the top to the result of <code class="highlighter-rouge">in_grad</code>.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">xpu</span><span class="o">&gt;</span>
+    <span class="kt">void</span> <span class="nf">SmoothL1BackwardUseIn_</span><span class="p">(</span><span class="k">const</span> <span class="n">OutputGrad</span><span class="o">&amp;</span> <span class="n">out_grad</span><span class="p">,</span>
+                                <span class="k">const</span> <span class="n">Input0</span><span class="o">&amp;</span> <span class="n">in_data0</span><span class="p">,</span>
+                                <span class="k">const</span> <span class="n">EnvArguments</span><span class="o">&amp;</span> <span class="n">env</span><span class="p">,</span>
+                                <span class="n">TBlob</span> <span class="o">*</span><span class="n">in_grad</span><span class="p">,</span>
+                                <span class="n">OpReqType</span> <span class="n">req</span><span class="p">,</span>
+                                <span class="n">RunContext</span> <span class="n">ctx</span><span class="p">)</span> <span class="p">{</span>
+      <span class="k">using</span> <span class="k">namespace</span> <span class="n">mshadow</span><span class="p">;</span>
+      <span class="k">using</span> <span class="k">namespace</span> <span class="n">mshadow</span><span class="o">::</span><span class="n">expr</span><span class="p">;</span>
+      <span class="n">mshadow</span><span class="o">::</span><span class="n">Stream</span><span class="o">&lt;</span><span class="n">xpu</span><span class="o">&gt;</span> <span class="o">*</span><span class="n">s</span> <span class="o">=</span> <span class="n">ctx</span><span class="p">.</span><span class="n">get_stream</span><span class="o">&lt;</span><span class="n">xpu</span><span class="o">&gt;</span><span class="p">();</span>
+      <span class="n">real_t</span> <span class="n">sigma2</span> <span class="o">=</span> <span class="n">env</span><span class="p">.</span><span class="n">scalar</span> <span class="o">*</span> <span class="n">env</span><span class="p">.</span><span class="n">scalar</span><span class="p">;</span>
+      <span class="n">MSHADOW_TYPE_SWITCH</span><span class="p">(</span><span class="n">in_grad</span><span class="o">-&gt;</span><span class="n">type_flag_</span><span class="p">,</span> <span class="n">DType</span><span class="p">,</span> <span class="p">{</span>
+        <span class="n">mshadow</span><span class="o">::</span><span class="n">Tensor</span><span class="o">&lt;</span><span class="n">xpu</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">DType</span><span class="o">&gt;</span> <span class="n">src</span> <span class="o">=</span> <span class="n">in_data0</span><span class="p">.</span><span class="n">data</span><span class="p">.</span><span class="n">get</span><span class="o">&lt;</span><span [...]
+        <span class="n">mshadow</span><span class="o">::</span><span class="n">Tensor</span><span class="o">&lt;</span><span class="n">xpu</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">DType</span><span class="o">&gt;</span> <span class="n">ograd</span> <span class="o">=</span> <span class="n">out_grad</span><span class="p">.</span><span class="n">data</span><span class="p">.</span><span class="n">get</span><span class="o">&lt;</span><sp [...]
+        <span class="n">mshadow</span><span class="o">::</span><span class="n">Tensor</span><span class="o">&lt;</span><span class="n">xpu</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">DType</span><span class="o">&gt;</span> <span class="n">igrad</span> <span class="o">=</span> <span class="n">in_grad</span><span class="o">-&gt;</span><span class="n">get</span><span class="o">&lt;</span><span class="n">xpu</span><span class="p">,</span>  [...]
+         <span class="n">ASSIGN_DISPATCH</span><span class="p">(</span><span class="n">igrad</span><span class="p">,</span> <span class="n">req</span><span class="p">,</span>
+                        <span class="n">ograd</span> <span class="o">*</span> <span class="n">F</span><span class="o">&lt;</span><span class="n">mshadow_op</span><span class="o">::</span><span class="n">smooth_l1_gradient</span><span class="o">&gt;</span><span class="p">(</span><span class="n">src</span><span class="p">,</span> <span class="n">ScalarExp</span><span class="o">&lt;</span><span class="n">DType</span><span class="o">&gt;</span><span class="p">(</span><span class="n">sigma2</ [...]
+      <span class="p">});</span>
+    <span class="p">}</span>
+</code></pre></div></div>
+
+<h3 id="register-simpleop-to-mxnet">Register SimpleOp to MXNet</h3>
+<p>After creating the shape, function, and gradient, restore them into both an NDArray operator and
+a symbolic operator. To simplify this process, use the registration macro defined in <code class="highlighter-rouge">operator_util.h</code>.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">MXNET_REGISTER_SIMPLE_OP</span><span class="p">(</span><span class="n">Name</span><span class="p">,</span> <span class="n">DEV</span><span class="p">)</span>
+    <span class="p">.</span><span class="n">set_shape_function</span><span class="p">(</span><span class="n">Shape</span><span class="p">)</span>
+    <span class="p">.</span><span class="n">set_function</span><span class="p">(</span><span class="n">DEV</span><span class="o">::</span><span class="n">kDevMask</span><span class="p">,</span> <span class="n">Function</span><span class="o">&lt;</span><span class="n">XPU</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">SimpleOpInplaceOption</span><span class="p">)</span>
+    <span class="p">.</span><span class="n">set_gradient</span><span class="p">(</span><span class="n">DEV</span><span class="o">::</span><span class="n">kDevMask</span><span class="p">,</span> <span class="n">Gradient</span><span class="o">&lt;</span><span class="n">XPU</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">SimpleOpInplaceOption</span><span class="p">)</span>
+    <span class="p">.</span><span class="n">describe</span><span class="p">(</span><span class="s">"description"</span><span class="p">);</span>
+</code></pre></div></div>
+<p><code class="highlighter-rouge">SimpleOpInplaceOption</code> is defined as:</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">enum</span> <span class="n">SimpleOpInplaceOption</span> <span class="p">{</span>
+      <span class="n">kNoInplace</span><span class="p">,</span>  <span class="c1">// do not allow inplace in arguments</span>
+      <span class="n">kInplaceInOut</span><span class="p">,</span>  <span class="c1">// allow inplace in with out (unary)</span>
+      <span class="n">kInplaceOutIn</span><span class="p">,</span>  <span class="c1">// allow inplace out_grad with in_grad (unary)</span>
+      <span class="n">kInplaceLhsOut</span><span class="p">,</span>  <span class="c1">// allow inplace left operand with out (binary)</span>
+      <span class="n">kInplaceOutLhs</span>  <span class="c1">// allow inplace out_grad with lhs_grad (binary)</span>
+    <span class="p">};</span>
+</code></pre></div></div>
+
+<p>In our example, we have a gradient function that relies on input data, so the function can’t be written in
+place. The output gradient has no purpose after gradient computation, so the gradient can be written in place.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">MXNET_REGISTER_SIMPLE_OP</span><span class="p">(</span><span class="n">smooth_l1</span><span class="p">,</span> <span class="n">XPU</span><span class="p">)</span>
+    <span class="p">.</span><span class="n">set_function</span><span class="p">(</span><span class="n">XPU</span><span class="o">::</span><span class="n">kDevMask</span><span class="p">,</span> <span class="n">SmoothL1Forward_</span><span class="o">&lt;</span><span class="n">XPU</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">kNoInplace</span><span class="p">)</span>
+    <span class="p">.</span><span class="n">set_gradient</span><span class="p">(</span><span class="n">XPU</span><span class="o">::</span><span class="n">kDevMask</span><span class="p">,</span> <span class="n">SmoothL1BackwardUseIn_</span><span class="o">&lt;</span><span class="n">XPU</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">kInplaceOutIn</span><span class="p">)</span>
+    <span class="p">.</span><span class="n">set_enable_scalar</span><span class="p">(</span><span class="nb">true</span><span class="p">)</span>
+    <span class="p">.</span><span class="n">describe</span><span class="p">(</span><span class="s">"Calculate Smooth L1 Loss(lhs, scalar)"</span><span class="p">);</span>
+</code></pre></div></div>
+<p>Remember from the discussion of shape functions that a default behavior without <code class="highlighter-rouge">set_shape_function</code> forces the inputs
+(if they’re binary) to be the same shape and yield the same shape for output. We’ll discuss <code class="highlighter-rouge">set_enable_scalar</code> later.</p>
+
+<h3 id="ndarray-operator-summary">NDArray Operator Summary</h3>
+<ul>
+  <li>Create a shape function for determining the output shape.</li>
+  <li>Create a function as the forward routine by choosing a suitable function type.</li>
+  <li>Create a gradient as the backward routine by choosing a suitable gradient type.</li>
+  <li>Register the operator using the registration process.</li>
+</ul>
+
+<h2 id="additional-information-on-simpleop">Additional Information on SimpleOp</h2>
+<h3 id="using-simpleop-on-envarguments">Using SimpleOp on EnvArguments</h3>
+<p>Some operations might need a scalar as input, such as a  gradient scale, a set of keyword arguments
+controlling behavior, or a temporary space to speed up calculations.<code class="highlighter-rouge">EnvArguments</code> provides additional arguments and resources to make calculations more scalable
+and efficient.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">struct</span> <span class="n">EnvArguments</span> <span class="p">{</span>
+      <span class="n">real_t</span> <span class="n">scalar</span><span class="p">;</span>  <span class="c1">// scalar argument, if enabled</span>
+      <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="o">&gt;</span> <span class="n">kwargs</span><spa [...]
+      <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">Resource</span><span class="o">&gt;</span> <span class="n">resource</span><span class="p">;</span>  <span class="c1">// pointer to the resources requested</span>
+    <span class="p">};</span>
+</code></pre></div></div>
+
+<p>More registration parameters are required to enable these additional features. To prevent confusion on parameters, <code class="highlighter-rouge">scalar</code> and <code class="highlighter-rouge">kwargs</code>
+can’t be present at the same time. To enable <code class="highlighter-rouge">scalar</code>, use
+<code class="highlighter-rouge">set_enable_scalar(bool enable_scalar)</code> in registration. Then, in forward functions and gradients, the <code class="highlighter-rouge">scalar</code> can be accessed from <code class="highlighter-rouge">env.scalar</code> as in the function parameter <code class="highlighter-rouge">EnvArguments env</code>.</p>
+
+<p>To enable <code class="highlighter-rouge">kwargs</code>, use <code class="highlighter-rouge">set_enable_kwargs(bool enable_kwargs)</code> in registration. Then, in forward
+functions and gradients, additional arguments are contained in <code class="highlighter-rouge">env.kwarg</code>, which is defined as
+<code class="highlighter-rouge">std::vector&lt;std::pair&lt;std::string, std::string&gt; &gt;</code>. Use the DMLC parameter structure to
+simplify parsing keyword arguments. For more details, see the <a href="https://github.com/dmlc/dmlc-core/blob/master/doc/parameter.md">guide on parameter structure</a>.</p>
+
+<p>Additional resources like <code class="highlighter-rouge">mshadow::Random&lt;xpu&gt;</code> and temporary memory space can also be requested and
+accessed from <code class="highlighter-rouge">EnvArguments.resource</code>. The registration routine is <code class="highlighter-rouge">set_resource_request(ResourceRequest req)</code>
+or <code class="highlighter-rouge">set_resource_request(const std::vector&lt;ResourceRequest&gt;)</code>, where <code class="highlighter-rouge">mxnet::ResourceRequest</code> is defined as:</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">struct</span> <span class="n">ResourceRequest</span> <span class="p">{</span>
+      <span class="k">enum</span> <span class="n">Type</span> <span class="p">{</span>  <span class="c1">// Resource type, indicating what the pointer type is</span>
+        <span class="n">kRandom</span><span class="p">,</span>  <span class="c1">// mshadow::Random&lt;xpu&gt; object</span>
+        <span class="n">kTempSpace</span>  <span class="c1">// A dynamic temp space that can be arbitrary size</span>
+      <span class="p">};</span>
+      <span class="n">Type</span> <span class="n">type</span><span class="p">;</span>  <span class="c1">// type of resources</span>
+    <span class="p">};</span>
+</code></pre></div></div>
+<p>Registration will request the declared resource requests from <code class="highlighter-rouge">mxnet::ResourceManager</code>, and place resources
+in <code class="highlighter-rouge">std::vector&lt;Resource&gt; resource</code> in <code class="highlighter-rouge">EnvArguments</code>. To access resources, use the following:</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">auto</span> <span class="n">tmp_space_res</span> <span class="o">=</span> <span class="n">env</span><span class="p">.</span><span class="n">resources</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">get_space</span><span class="p">(</span><span class="n">some_shape</span><span class="p">,</span> <span class="n">some_stream</spa [...]
+    <span class="k">auto</span> <span class="n">rand_res</span> <span class="o">=</span> <span class="n">env</span><span class="p">.</span><span class="n">resources</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">get_random</span><span class="p">(</span><span class="n">some_stream</span><span class="p">);</span>
+</code></pre></div></div>
+<p>For an example, see <code class="highlighter-rouge">src/operator/loss_binary_op-inl.h</code>.</p>
+
+<p>In our smooth l1 loss example, a scalar input is needed to mark the turning point of a loss function. Therefore,
+in the registration process, we use <code class="highlighter-rouge">set_enable_scalar(true)</code>, and use <code class="highlighter-rouge">env.scalar</code> in function and gradient
+declarations.</p>
+
+<h3 id="crafting-a-tensor-operation">Crafting a Tensor Operation</h3>
+<p>Because computation utilizes the <code class="highlighter-rouge">mshadow</code> library and we sometimes don’t have functions readily available, we
+can craft tensor operations in operator implementations. If you define such functions as element-wise, you
+can implement them as a <code class="highlighter-rouge">mxnet::op::mshadow_op</code>. <code class="highlighter-rouge">src/operator/mshadow_op.h</code> that contains a lot of <code class="highlighter-rouge">mshadow_op</code>,
+for example. <code class="highlighter-rouge">mshadow_op</code> are expression mappers. They deal with the scalar case of desired functions. For details, see
+<a href="https://github.com/dmlc/mshadow/tree/master/doc">mshadow expression API guide</a>.</p>
+
+<p>If an operation can’t be done in an element-wise way, like the softmax loss and gradient, then you need to create a new tensor operation. You need to create as <code class="highlighter-rouge">mshadow</code> function and as <code class="highlighter-rouge">mshadow::cuda</code>
+function directly. For details, see the <code class="highlighter-rouge">mshadow</code> library. For an example, see <code class="highlighter-rouge">src/operator/roi_pooling.cc</code>.</p>
+
+<p>In our smooth l1 loss example, we create two mappers, namely the scalar cases of smooth l1 loss and gradient.</p>
+
+<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">namespace</span> <span class="n">mshadow_op</span> <span class="p">{</span>
+    <span class="k">struct</span> <span class="n">smooth_l1_loss</span> <span class="p">{</span>
+      <span class="c1">// a is x, b is sigma2</span>
+      <span class="n">MSHADOW_XINLINE</span> <span class="k">static</span> <span class="n">real_t</span> <span class="n">Map</span><span class="p">(</span><span class="n">real_t</span> <span class="n">a</span><span class="p">,</span> <span class="n">real_t</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
+        <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">&gt;</span> <span class="mf">1.0</span><span class="n">f</span> <span class="o">/</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
+          <span class="k">return</span> <span class="n">a</span> <span class="o">-</span> <span class="mf">0.5</span><span class="n">f</span> <span class="o">/</span> <span class="n">b</span><span class="p">;</span>
+        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">&lt;</span> <span class="o">-</span><span class="mf">1.0</span><span class="n">f</span> <span class="o">/</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
+          <span class="k">return</span> <span class="o">-</span><span class="n">a</span> <span class="o">-</span> <span class="mf">0.5</span><span class="n">f</span> <span class="o">/</span> <span class="n">b</span><span class="p">;</span>
+        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
+          <span class="k">return</span> <span class="mf">0.5</span><span class="n">f</span> <span class="o">*</span> <span class="n">a</span> <span class="o">*</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span><span class="p">;</span>
+        <span class="p">}</span>
+      <span class="p">}</span>
+    <span class="p">};</span>
+    <span class="p">}</span>
+</code></pre></div></div>
+<p>The gradient, which can be found in <code class="highlighter-rouge">src/operator/smooth_l1_unary-inl.h</code>, is similar.</p>
+
+<h3 id="beyond-two-operands">Beyond Two Operands</h3>
+<p>The new unified API is designed to fulfill the fundamentals of an operation. For operators with more than two inputs,
+more than one output, or that need more features, see the original <a href="overview#operators-in-mxnet">Operator API</a>.</p>
+
+    </div>
+</div>
+
+        </div>
+    </div>
+
+</article>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/architecture/program_model.html b/versions/master/api/architecture/program_model.html
new file mode 100644
index 0000000..5084b07
--- /dev/null
+++ b/versions/master/api/architecture/program_model.html
@@ -0,0 +1,1145 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>Deep Learning Programming Paradigm | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="Deep Learning Programming Paradigm" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/architecture/program_model" />
+<meta property="og:url" content="https://mxnet.apache.org/api/architecture/program_model" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/architecture/program_model","headline":"Deep Learning Programming Paradigm","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">Deep Learning Programming Paradigm</h1>
+        <h3></h3></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+        <h3 style="text-transform: capitalize; padding-left:10px">architecture</h3>
+        <ul>
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/exception_handling">Exception Handling in MXNet</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_data_loading">Efficient Data Loaders</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_engine">Dependency Engine</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/note_memory">Memory Consumption</a></li>
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/overview">MXNet System Architecture</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+            
+            <li><a href="/api/architecture/program_model">Deep Learning Programming Paradigm</a></li>
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+            
+              <!-- page-category -->
+               <!-- resource-p -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <!--- 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. -->
+
+<h1 id="deep-learning-programming-paradigm">Deep Learning Programming Paradigm</h1>
+
+<p>However much we might ultimately care about performance,
+we first need working code before we can start worrying about optimization.
+Writing clear, intuitive deep learning code can be challenging,
+and the first thing any practitioner must deal with is the language syntax itself.
+Complicating matters, of the many deep learning libraries out there,
+each has its own approach to programming style.</p>
+
+<p>In this document, we focus on two of the most important high-level design decisions:</p>
+<ol>
+  <li>Whether to embrace the <em>symbolic</em> or <em>imperative</em> paradigm for mathematical computation.</li>
+  <li>Whether to build networks with bigger (more abstract) or more atomic operations.</li>
+</ol>
+
+<p>Throughout, we’ll focus on the programming models themselves.
+When programming style decisions may impact performance, we point this out,
+but we don’t dwell on specific implementation details.</p>
+
+<h2 id="symbolic-vs-imperative-programs">Symbolic vs. Imperative Programs</h2>
+
+<p>If you are a Python or C++ programmer, then you’re already familiar with imperative programs.
+Imperative-style programs perform computation as you run them.
+Most code you write in Python is imperative, as is the following NumPy snippet.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
+    <span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
+    <span class="n">b</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span>
+    <span class="n">c</span> <span class="o">=</span> <span class="n">b</span> <span class="o">*</span> <span class="n">a</span>
+    <span class="n">d</span> <span class="o">=</span> <span class="n">c</span> <span class="o">+</span> <span class="mi">1</span>
+</code></pre></div></div>
+<p>When the program executes <code class="highlighter-rouge">c = b * a</code>, it runs the actual numerical computation.</p>
+
+<p>Symbolic programs are a bit different. With symbolic-style programs,
+we first define a (potentially complex) function abstractly.
+When defining the function, no actual numerical computation takes place.
+We define the abstract function in terms of placeholder values.
+Then we can compile the function, and evaluate it given real inputs.
+In the following example, we rewrite the imperative program from above
+as a symbolic-style program:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">A</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="s">'A'</span><span class="p">)</span>
+    <span class="n">B</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="s">'B'</span><span class="p">)</span>
+    <span class="n">C</span> <span class="o">=</span> <span class="n">B</span> <span class="o">*</span> <span class="n">A</span>
+    <span class="n">D</span> <span class="o">=</span> <span class="n">C</span> <span class="o">+</span> <span class="n">Constant</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+    <span class="c1"># compiles the function
+</span>    <span class="n">f</span> <span class="o">=</span> <span class="nb">compile</span><span class="p">(</span><span class="n">D</span><span class="p">)</span>
+    <span class="n">d</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="n">B</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">10</span><span class="p"> [...]
+</code></pre></div></div>
+<p>As you can see, in the symbolic version, when <code class="highlighter-rouge">C = B * A</code> is executed, no computation occurs.
+Instead, this operation generates a <em>computation graph</em> (also called a <em>symbolic graph</em>)
+that represents the computation.
+The following figure shows a computation graph to compute <code class="highlighter-rouge">D</code>.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/prog_model/comp_graph.png" alt="Comp Graph" /></p>
+
+<p>Most symbolic-style programs contain, either explicitly or implicitly, a <em>compile</em> step.
+This converts the computation graph into a function that we can later call.
+In the above example, numerical computation only occurs in the last line of code.
+The defining characteristic of symbolic programs is their clear separation
+between building the computation graph and executing it.
+For neural networks, we typically define the entire model as a single compute graph.</p>
+
+<p>Among other popular deep learning libraries, Torch, Chainer, and Minerva embrace the imperative style.
+Examples of symbolic-style deep learning libraries include Theano, CGT, and TensorFlow.
+We might also view libraries like CXXNet and Caffe, which rely on configuration files, as symbolic-style libraries.
+In this interpretation, we’d consider the content of the configuration file as defining the computation graph.</p>
+
+<p>Now that you understand the difference between these two programming models, let’s compare the advantages of each.</p>
+
+<h3 id="imperative-programs-tend-to-be-more-flexible">Imperative Programs Tend to be More Flexible</h3>
+
+<p>When you’re using an imperative-style library from Python, you are writing in Python.
+Nearly anything that would be intuitive to write in Python, you could accelerate by calling down in the appropriate places to the imperative deep learning library.
+On the other hand, when you write a symbolic program, you may not have access to all the familiar Python constructs, like iteration.
+Consider the following imperative program, and think about how you can translate this into a symbolic program.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">a</span> <span class="o">=</span> <span class="mi">2</span>
+    <span class="n">b</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="mi">1</span>
+    <span class="n">d</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
+    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
+        <span class="n">d</span> <span class="o">+=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
+</code></pre></div></div>
+<p>This wouldn’t be so easy if the Python for-loop weren’t supported by the symbolic API.
+When you write a symbolic program in Python, you’re <em>not</em> writing in Python.
+Instead, you’re writing in a domain-specific language (DSL) defined by the symbolic API.
+The symbolic APIs found in deep learning libraries
+are powerful DSLs that generate callable computation graphs for neural networks.
+<!-- In that sense, config-file input libraries are all symbolic. --></p>
+
+<p>Intuitively, you might say that imperative programs
+are more <em>native</em> than symbolic programs.
+It’s easier to use native language features.
+For example, it’s straightforward to print out the values
+in the middle of computation or to use native control flow and loops
+at any point in the flow of computation.</p>
+
+<h3 id="symbolic-programs-tend-to-be-more-efficient">Symbolic Programs Tend to be More Efficient</h3>
+
+<p>As we’ve seen, imperative programs tend to be flexible
+and fit nicely into the programming flow of a host language.
+So you might wonder, why do so many deep learning libraries
+embrace the symbolic paradigm?
+The main reason is efficiency, both in terms of memory and speed.
+Let’s revisit our toy example from before.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
+    <span class="n">a</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
+    <span class="n">b</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2</span>
+    <span class="n">c</span> <span class="o">=</span> <span class="n">b</span> <span class="o">*</span> <span class="n">a</span>
+    <span class="n">d</span> <span class="o">=</span> <span class="n">c</span> <span class="o">+</span> <span class="mi">1</span>
+    <span class="o">...</span>
+</code></pre></div></div>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/prog_model/comp_graph.png" alt="Comp Graph" /></p>
+
+<p>Assume that each cell in the array occupies 8 bytes of memory.
+How much memory do you need to execute this program in the Python console?</p>
+
+<p>As an imperative program we need to allocate memory at each line.
+That leaves us allocating 4 arrays of size 10.
+So we’ll need <code class="highlighter-rouge">4 * 10 * 8 = 320</code> bytes.
+On the other hand, if we built a computation graph,
+and knew in advance that we only needed <code class="highlighter-rouge">d</code>,
+we could reuse the memory originally allocated for intermediate values.
+For example, by performing computations in-place,
+we might recycle the bits allocated for <code class="highlighter-rouge">b</code> to store <code class="highlighter-rouge">c</code>.
+And we might recycle the bits allocated for <code class="highlighter-rouge">c</code> to store <code class="highlighter-rouge">d</code>.
+In the end we could cut our memory requirement in half,
+requiring just <code class="highlighter-rouge">2 * 10 * 8 = 160</code> bytes.</p>
+
+<p>Symbolic programs are more <em>restricted</em>.
+When we call <code class="highlighter-rouge">compile</code> on D, we tell the system
+that only the value of <code class="highlighter-rouge">d</code> is needed.
+The intermediate values of the computation,
+in this case <code class="highlighter-rouge">c</code>, is then invisible to us.</p>
+
+<p>We benefit because the symbolic programs
+can then safely reuse the memory for in-place computation.
+But on the other hand, if we later decide that we need to access <code class="highlighter-rouge">c</code>, we’re out of luck.
+So imperative programs are better prepared to encounter all possible demands.
+If we ran the imperative version of the code in a Python console,
+we could inspect any of the intermediate variables in the future.</p>
+
+<!-- Of course, this is somewhat misleading, because garbage collection can occur in imperative programs and memory could then be reused.
+However, imperative programs do need to be "prepared to encounter all possible demands," and this limits the optimization you can perform. This is true for non-trivial cases, such
+as gradient calculation, which we discuss in next section. -->
+
+<p>Symbolic programs can also perform another kind of optimization, called operation folding.
+Returning to our toy example, the multiplication and addition operations
+can be folded into one operation, as shown in the following graph.
+If the computation runs on a GPU processor,
+one GPU kernel will be executed, instead of two.
+In fact, this is one way we hand-craft operations
+in optimized libraries, such as CXXNet and Caffe.
+Operation folding improves computation efficiency.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/prog_model/comp_graph_fold.png" alt="Comp Graph Folded" /></p>
+
+<p>Note, you can’t perform operation folding in imperative programs,
+because the intermediate values might be referenced in the future.
+Operation folding is possible in symbolic programs
+because you get the entire computation graph,
+and a clear specification of which values will be needed and which are not.</p>
+
+<h3 id="case-study-backprop-and-autodiff">Case Study: Backprop and AutoDiff</h3>
+
+<p>In this section, we compare the two programming models
+on the problem of auto differentiation, or backpropagation.
+Differentiation is of vital importance in deep learning
+because it’s the mechanism by which we train our models.
+In any deep learning model, we define a <em>loss function</em>.
+A <em>loss function</em> measures how far the model is from the desired output.
+We then typically pass over training examples (pairs of inputs and ground-truth outputs).
+At each step we update the model’s <em>parameters</em> to minimize the loss.
+To determine the direction in which to update the parameters,
+we need to take the derivative of the loss function with respect to the parameters.</p>
+
+<p>In the past, whenever someone defined a new model,
+they had to work out the derivative calculations by hand.
+While the math is reasonably straightforward,
+for complex models, it can be time-consuming and tedious work.
+All modern deep learning libraries make the practitioner/researcher’s job
+much easier, by automatically solving the problem of gradient calculation.</p>
+
+<p>Both imperative and symbolic programs can perform gradient calculation.
+So let’s take a look at how you might perform automatic differentiation with each.</p>
+
+<p>Let’s start with imperative programs.
+The following example Python code performs automatic differentiation using our toy example:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">class</span> <span class="nc">array</span><span class="p">(</span><span class="nb">object</span><span class="p">)</span> <span class="p">:</span>
+        <span class="s">"""Simple Array object that support autodiff."""</span>
+        <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
+            <span class="k">if</span> <span class="n">name</span><span class="p">:</span>
+                <span class="bp">self</span><span class="o">.</span><span class="n">grad</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">g</span> <span class="p">:</span> <span class="p">{</span><span class="n">name</span> <span class="p">:</span> <span class="n">g</span><span class="p">}</span>
+
+        <span class="k">def</span> <span class="nf">__add__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
+            <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
+            <span class="n">ret</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">+</span> <span class="n">other</span><span class="p">)</span>
+            <span class="n">ret</span><span class="o">.</span><span class="n">grad</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">g</span> <span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">grad</span><span class="p">(</span><span class="n">g</span><span class="p">)</span>
+            <span class="k">return</span> <span class="n">ret</span>
+
+        <span class="k">def</span> <span class="nf">__mul__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
+            <span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">array</span><span class="p">)</span>
+            <span class="n">ret</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">*</span> <span class="n">other</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
+            <span class="k">def</span> <span class="nf">grad</span><span class="p">(</span><span class="n">g</span><span class="p">):</span>
+                <span class="n">x</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">grad</span><span class="p">(</span><span class="n">g</span> <span class="o">*</span> <span class="n">other</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
+                <span class="n">x</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="n">grad</span><span class="p">(</span><span class="n">g</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
+                <span class="k">return</span> <span class="n">x</span>
+            <span class="n">ret</span><span class="o">.</span><span class="n">grad</span> <span class="o">=</span> <span class="n">grad</span>
+            <span class="k">return</span> <span class="n">ret</span>
+
+    <span class="c1"># some examples
+</span>    <span class="n">a</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">'a'</span><span class="p">)</span>
+    <span class="n">b</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s">'b'</span><span class="p">)</span>
+    <span class="n">c</span> <span class="o">=</span> <span class="n">b</span> <span class="o">*</span> <span class="n">a</span>
+    <span class="n">d</span> <span class="o">=</span> <span class="n">c</span> <span class="o">+</span> <span class="mi">1</span>
+    <span class="k">print</span> <span class="n">d</span><span class="o">.</span><span class="n">value</span>
+    <span class="k">print</span> <span class="n">d</span><span class="o">.</span><span class="n">grad</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+    <span class="c1"># Results
+</span>    <span class="c1"># 3
+</span>    <span class="c1"># {'a': 2, 'b': 1}
+</span></code></pre></div></div>
+
+<p>In this code, each array object contains a grad function (it is actually a closure).
+When you run <code class="highlighter-rouge">d.grad</code>, it recursively invokes the grad function of its inputs,
+backprops the gradient value back, and
+returns the gradient value of each input.</p>
+
+<p>This might look a bit complicated, so let’s consider
+the gradient calculation for symbolic programs.
+The following program performs symbolic gradient calculation for the same task.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">A</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="s">'A'</span><span class="p">)</span>
+    <span class="n">B</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="s">'B'</span><span class="p">)</span>
+    <span class="n">C</span> <span class="o">=</span> <span class="n">B</span> <span class="o">*</span> <span class="n">A</span>
+    <span class="n">D</span> <span class="o">=</span> <span class="n">C</span> <span class="o">+</span> <span class="n">Constant</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+    <span class="c1"># get gradient node.
+</span>    <span class="n">gA</span><span class="p">,</span> <span class="n">gB</span> <span class="o">=</span> <span class="n">D</span><span class="o">.</span><span class="n">grad</span><span class="p">(</span><span class="n">wrt</span><span class="o">=</span><span class="p">[</span><span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">])</span>
+    <span class="c1"># compiles the gradient function.
+</span>    <span class="n">f</span> <span class="o">=</span> <span class="nb">compile</span><span class="p">([</span><span class="n">gA</span><span class="p">,</span> <span class="n">gB</span><span class="p">])</span>
+    <span class="n">grad_a</span><span class="p">,</span> <span class="n">grad_b</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="n">B</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">ones</span><span c [...]
+</code></pre></div></div>
+
+<p>The grad function of <code class="highlighter-rouge">D</code> generates a backward computation graph,
+and returns a gradient node, <code class="highlighter-rouge">gA, gB</code>,
+which correspond to the red nodes in the following figure.</p>
+
+<p><img src="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/prog_model/comp_graph_backward.png" alt="Comp Graph Folded" /></p>
+
+<p>The imperative program actually does the same thing as the symbolic program.
+It implicitly saves a backward computation graph in the grad closure.
+When you invoked <code class="highlighter-rouge">d.grad</code>, you start from <code class="highlighter-rouge">d(D)</code>,
+backtrack through the graph to compute the gradient, and collect the results.</p>
+
+<p>The gradient calculations in both symbolic
+and imperative programming follow the same pattern.
+What’s the difference then?
+Recall the <em>be prepared to encounter all possible demands</em> requirement of imperative programs.
+If you are creating an array library that supports automatic differentiation,
+you have to keep the grad closure along with the computation.
+This means that none of the history variables can be
+garbage-collected because they are referenced by variable <code class="highlighter-rouge">d</code> by way of function closure.</p>
+
+<p>What if you want to compute only the value of <code class="highlighter-rouge">d</code>,
+and don’t want the gradient value?
+In symbolic programming, you declare this with <code class="highlighter-rouge">f=compiled([D])</code>.
+This also declares the boundary of computation,
+telling the system that you want to compute only the forward pass.
+As a result, the system can free the memory of previous results,
+and share the memory between inputs and outputs.</p>
+
+<p>Imagine running a deep neural network with <code class="highlighter-rouge">n</code> layers.
+If you are running only the forward pass,
+not the backward(gradient) pass,
+you need to allocate only two copies of
+temporal space to store the values of the intermediate layers,
+instead of <code class="highlighter-rouge">n</code> copies of them.
+However, because imperative programs need to be prepared
+to encounter all possible demands of getting the gradient,
+they have to store the intermediate values,
+which requires <code class="highlighter-rouge">n</code> copies of temporal space.</p>
+
+<p>As you can see, the level of optimization depends
+on the restrictions on what you can do.
+Symbolic programs ask you to clearly specify
+these restrictions when you compile the graph.
+One the other hand, imperative programs
+must be prepared for a wider range of demands.
+Symbolic programs have a natural advantage
+because they know more about what you do and don’t want.</p>
+
+<p>There are ways in which we can modify imperative programs
+to incorporate similar restrictions.
+For example, one solution to the preceding
+problem is to introduce a context variable.
+You can introduce a no-gradient context variable
+to turn gradient calculation off.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">with</span> <span class="n">context</span><span class="o">.</span><span class="n">NoGradient</span><span class="p">():</span>
+        <span class="n">a</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">'a'</span><span class="p">)</span>
+        <span class="n">b</span> <span class="o">=</span> <span class="n">array</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s">'b'</span><span class="p">)</span>
+        <span class="n">c</span> <span class="o">=</span> <span class="n">b</span> <span class="o">*</span> <span class="n">a</span>
+        <span class="n">d</span> <span class="o">=</span> <span class="n">c</span> <span class="o">+</span> <span class="mi">1</span>
+</code></pre></div></div>
+
+<!-- This provides an imperative program with the ability to impose some restrictions, but reduces efficiency. -->
+
+<p>However, this example still must be prepared to encounter all possible demands,
+which means that you can’t perform the in-place calculation
+to reuse memory in the forward pass (a trick commonly used to reduce GPU memory usage).
+The techniques we’ve discussed generate an explicit backward pass.
+Some of the libraries such as Caffe and CXXNet perform backprop implicitly on the same graph.
+The approach we’ve discussed in this section also applies to them.</p>
+
+<p>Most configuration-file-based libraries,
+such as CXXNet and Caffe are designed
+to meet one or two generic requirements:
+get the activation of each layer,
+or get the gradient of all of the weights.
+These libraries have the same problem:
+the more generic operations the library has to support,
+the less optimization (memory sharing) you can do,
+based on the same data structure.</p>
+
+<p>As you can see, the trade-off between restriction
+and flexibility is the same for most cases.</p>
+
+<h3 id="model-checkpoint">Model Checkpoint</h3>
+
+<p>It’s important to able to save a model and load it back later.
+There are different ways to <em>save</em> your work.
+Normally, to save a neural network,
+you need to save two things: a net configuration
+for the structure of the neural network and the weights of the neural network.</p>
+
+<p>The ability to check the configuration is a plus for symbolic programs.
+Because the symbolic construction phase does not perform computation,
+you can directly serialize the computation graph, and load it back later.
+This solves the problem of saving the configuration
+without introducing an additional layer.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">A</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="s">'A'</span><span class="p">)</span>
+    <span class="n">B</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="s">'B'</span><span class="p">)</span>
+    <span class="n">C</span> <span class="o">=</span> <span class="n">B</span> <span class="o">*</span> <span class="n">A</span>
+    <span class="n">D</span> <span class="o">=</span> <span class="n">C</span> <span class="o">+</span> <span class="n">Constant</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+    <span class="n">D</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="s">'mygraph'</span><span class="p">)</span>
+    <span class="o">...</span>
+    <span class="n">D2</span> <span class="o">=</span> <span class="n">load</span><span class="p">(</span><span class="s">'mygraph'</span><span class="p">)</span>
+    <span class="n">f</span> <span class="o">=</span> <span class="nb">compile</span><span class="p">([</span><span class="n">D2</span><span class="p">])</span>
+    <span class="c1"># more operations
+</span>    <span class="o">...</span>
+</code></pre></div></div>
+
+<p>Because an imperative program executes as it describes the computation,
+you have to save the code itself as the <code class="highlighter-rouge">configuration</code>,
+or build another configuration layer on top of the imperative language.</p>
+
+<h3 id="parameter-updates">Parameter Updates</h3>
+
+<p>Most symbolic programs are data flow (computation) graphs.
+Data flow graphs describe computation.
+But it’s not obvious how to use graphs to describe parameter updates.
+That’s because parameter updates introduce mutation,
+which is not a data flow concept.
+Most symbolic programs introduce a special update statement
+to update persistent state in the programs.</p>
+
+<p>It’s usually easier to write parameter updates in an imperative style,
+especially when you need multiple updates that relate to each other.
+For symbolic programs, the update statement is also executed as you call it.
+So in that sense, most symbolic deep learning libraries
+fall back on the imperative approach to perform updates,
+while using the symbolic approach to perform gradient calculation.</p>
+
+<h3 id="there-is-no-strict-boundary">There Is No Strict Boundary</h3>
+
+<p>In comparing the two programming styles,
+some of our arguments might not be strictly true,
+i.e., it’s possible to make an imperative program
+more like a traditional symbolic program or vice versa.
+However, the two archetypes are useful abstractions,
+especially for understanding the differences between deep learning libraries.
+We might reasonably conclude that there is no clear boundary between programming styles.
+For example, you can create a just-in-time (JIT) compiler in Python
+to compile imperative Python programs,
+which provides some of the advantages of global
+information held in symbolic programs.</p>
+
+<h2 id="big-vs-small-operations">Big vs. Small Operations</h2>
+
+<p>When designing a deep learning library, another important programming model decision
+is precisely what operations to support.
+In general, there are two families of operations supported by most deep learning libraries:</p>
+
+<ul>
+  <li>Big operations - typically for computing neural network layers (e.g. FullyConnected and BatchNormalize).</li>
+  <li>Small operations - mathematical functions like matrix multiplication and element-wise addition.</li>
+</ul>
+
+<p>Libraries like CXXNet and Caffe support layer-level operations.
+Libraries like Theano and Minerva support fine-grained operations.</p>
+
+<h3 id="smaller-operations-can-be-more-flexible">Smaller Operations Can Be More Flexible</h3>
+<p>It’s quite natural to use smaller operations to compose bigger operations.
+For example, the sigmoid unit can simply be composed of division, addition and an exponentiation:</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">sigmoid</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">exp</span><span class="p">(</span><span class="o">-</span><span class="n">x</span><span class="p">))</span>
+</code></pre></div></div>
+<p>Using smaller operations as building blocks, you can express nearly anything you want.
+If you’re more familiar with CXXNet- or Caffe-style layers,
+note that these operations don’t differ from a layer, except that they are smaller.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">SigmoidLayer</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="n">EWiseDivisionLayer</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">AddScalarLayer</span><span class="p">(</span><span class="n">ExpLayer</span><span class="p">(</span><span class="o">-</span [...]
+</code></pre></div></div>
+<p>This expression composes three layers,
+with each defining its forward and backward (gradient) function.
+Using smaller operations gives you the advantage of building new layers quickly,
+because you only need to compose the components.</p>
+
+<h3 id="big-operations-are-more-efficient">Big Operations Are More Efficient</h3>
+<p>Directly composing sigmoid layers requires three layers of operation, instead of one.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">SigmoidLayer</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">=</span> <span class="n">EWiseDivisionLayer</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">AddScalarLayer</span><span class="p">(</span><span class="n">ExpLayer</span><span class="p">(</span><span class="o">-</span [...]
+</code></pre></div></div>
+<p>This code creates overhead for computation and memory (which could be optimized, with cost).</p>
+
+<p>Libraries like CXXNet and Caffe take a different approach.
+To support coarse-grained operations,
+such as BatchNormalization and the SigmoidLayer directly,
+in each layer, the calculation kernel is hand crafted
+with one or only some CUDA kernel launches.
+This makes these implementations more efficient.</p>
+
+<h3 id="compilation-and-optimization">Compilation and Optimization</h3>
+
+<p>Can small operations be optimized? Of course, they can.
+Let’s look at the system optimization part of the compilation engine.
+Two types of optimization can be performed on the computation graph:</p>
+
+<ul>
+  <li>Memory allocation optimization, to reuse the memory of the intermediate computations.</li>
+  <li>Operator fusion, to detect sub-graph patterns, such as the sigmoid, and fuse them into a bigger operation kernel.</li>
+</ul>
+
+<p>Memory allocation optimization isn’t restricted to small operations graphs.
+You can use it with bigger operations graph, too.
+However, optimization might not be essential
+for bigger operation libraries like CXXNet and Caffe,
+because you can’t find the compilation step in them.
+However, there’s a (dumb) <code class="highlighter-rouge">compilation step</code> in these libraries,
+that basically translates the layers into a fixed forward,
+backprop execution plan, by running each operation one by one.</p>
+
+<p>For computation graphs with smaller operations,
+these optimizations are crucial to performance.
+Because the operations are small,
+there are many sub-graph patterns that can be matched.
+Also, because the final, generated operations
+might not be enumerable,
+an explicit recompilation of the kernels is required,
+as opposed to the fixed amount of precompiled kernels
+in the big operation libraries.
+This creates compilation overhead for the symbolic libraries
+that support small operations.
+Requiring compilation optimization also creates engineering overhead
+for the libraries that solely support smaller operations.</p>
+
+<p>As in the case of symbolic vs. imperative,
+the bigger operation libraries “cheat”
+by asking you to provide restrictions (to the common layer),
+so that you actually perform the sub-graph matching.
+This moves the compilation overhead to the real brain, which is usually not too bad.</p>
+
+<h3 id="expression-template-and-statically-typed-language">Expression Template and Statically Typed Language</h3>
+<p>You always have a need to write small operations and compose them.
+Libraries like Caffe use hand-crafted kernels to build these bigger blocks.
+Otherwise, you would have to compose smaller operations using Python.</p>
+
+<p>There’s a third choice that works pretty well.
+This is called the expression template.
+Basically, you use template programming to
+generate generic kernels from an expression tree at compile time.
+For details, see <a href="https://github.com/dmlc/mshadow/blob/master/guide/exp-template/README.md">Expression Template Tutorial</a>.
+CXXNet makes extensive use of an expression template,
+which enables creating much shorter and more readable code that matches
+the performance of hand-crafted kernels.</p>
+
+<p>The difference between using an expression template and Python kernel generation
+is that expression evaluation is done at compile time for C++ with an existing type,
+so there is no additional runtime overhead.
+In principle, this is also possible with other statically typed languages that support templates,
+but we’ve seen this trick used only in C++.</p>
+
+<p>Expression template libraries create a middle ground between Python operations
+and hand-crafted big kernels by allowing C++ users to craft efficient big
+operations by composing smaller operations. It’s an option worth considering.</p>
+
+<h2 id="mix-the-approaches">Mix the Approaches</h2>
+
+<p>Now that we’ve compared the programming models, which one should you choose?
+Before delving into that, we should emphasize that depending on the problems you’re trying to solve,
+our comparison might not necessarily have a big impact.</p>
+
+<p>Remember <a href="https://en.wikipedia.org/wiki/Amdahl%27s_law">Amdahl’s law</a>:
+If you are optimizing a non-performance-critical part of your problem,
+you won’t get much of a performance gain.</p>
+
+<p>As you’ve seen, there usually is a trade-off between efficiency,
+flexibility, and engineering complexity.
+The more suitable programming style depends on the problem you are trying to solve.
+For example, imperative programs are better for parameter updates,
+and symbolic programs for gradient calculation.</p>
+
+<p>We advocate <em>mixing</em> the approaches.
+Sometimes the part that we want to be flexible
+isn’t crucial to performance.
+In these cases, it’s okay to leave some efficiency on the table
+to support more flexible interfaces.
+In machine learning, combining methods usually works better than using just one.</p>
+
+<p>If you can combine the programming models correctly,
+you can get better results than when using a single programming model.
+In this section, we discuss how to do so.</p>
+
+<h3 id="symbolic-and-imperative-programs">Symbolic and Imperative Programs</h3>
+<p>There are two ways to mix symbolic and imperative programs:</p>
+
+<ul>
+  <li>Use imperative programs within symbolic programs as callbacks</li>
+  <li>Use symbolic programs as part of imperative programs</li>
+</ul>
+
+<p>We’ve observed that it’s usually helpful to write parameter updates imperatively,
+and perform gradient calculations in symbolic programs.</p>
+
+<p>Symbolic libraries already mix programs because Python itself is imperative.
+For example, the following program mixes the symbolic approach with NumPy, which is imperative.</p>
+
+<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">A</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="s">'A'</span><span class="p">)</span>
+    <span class="n">B</span> <span class="o">=</span> <span class="n">Variable</span><span class="p">(</span><span class="s">'B'</span><span class="p">)</span>
+    <span class="n">C</span> <span class="o">=</span> <span class="n">B</span> <span class="o">*</span> <span class="n">A</span>
+    <span class="n">D</span> <span class="o">=</span> <span class="n">C</span> <span class="o">+</span> <span class="n">Constant</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
+    <span class="c1"># compiles the function
+</span>    <span class="n">f</span> <span class="o">=</span> <span class="nb">compile</span><span class="p">(</span><span class="n">D</span><span class="p">)</span>
+    <span class="n">d</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">A</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="n">B</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">(</span><span class="mi">10</span><span class="p"> [...]
+    <span class="n">d</span> <span class="o">=</span> <span class="n">d</span> <span class="o">+</span> <span class="mf">1.0</span>
+</code></pre></div></div>
+<p>The symbolic graphs are compiled into a function that can be executed imperatively.
+The internals are a black box to the user.
+This is exactly like writing C++ programs and exposing them to Python, which we commonly do.</p>
+
+<p>Because parameter memory resides on the GPU,
+you might not want to use NumPy as an imperative component.
+Supporting a GPU-compatible imperative library
+that interacts with symbolic compiled functions
+or provides a limited amount of updating syntax
+in the update statement in symbolic program execution
+might be a better choice.</p>
+
+<h3 id="small-and-big-operations">Small and Big Operations</h3>
+
+<p>There might be a good reason to combine small and big operations.
+Consider applications that perform tasks such as changing
+a loss function or adding a few customized layers to an existing structure.
+Usually, you can use big operations to compose existing
+components, and use smaller operations to build the new parts.</p>
+
+<p>Recall Amdahl’s law. Often, the new components
+are not the cause of the computation bottleneck.
+Because the performance-critical part is already optimized by
+the bigger operations, it’s okay to forego optimizing the additional small operations,
+or to do a limited amount of memory optimization instead
+of operation fusion and directly running them.</p>
+
+<h3 id="choose-your-own-approach">Choose Your Own Approach</h3>
+
+<p>In this document, we compared multiple approaches
+to developing programming environments for deep learning.
+We compared both the usability and efficiency implications of each,
+finding that many of these trade-offs (like imperative vs symbolic aren’t necessarily black and white).
+You can choose your approach, or combine the approaches
+to create more interesting and intelligent deep learning libraries.</p>
+
+<h2 id="contribute-to-mxnet">Contribute to MXNet</h2>
+
+<p>This document is part of our effort to provide <a href="overview">open-source system design notes</a>
+for deep learning libraries. If you’re interested in contributing to <em>MXNet</em> or its
+documentation, <a href="http://github.com/apache/incubator-mxnet">fork us on GitHub</a>.</p>
+
+<h2 id="next-steps">Next Steps</h2>
+
+<ul>
+  <li><a href="note_engine">Dependency Engine for Deep Learning</a></li>
+  <li><a href="note_memory">Squeeze the Memory Consumption of Deep Learning</a></li>
+  <li><a href="note_data_loading">Efficient Data Loading Module for Deep Learning</a></li>
+</ul>
+
+    </div>
+</div>
+
+        </div>
+    </div>
+
+</article>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/clojure.html b/versions/master/api/clojure.html
new file mode 100644
index 0000000..21756fa
--- /dev/null
+++ b/versions/master/api/clojure.html
@@ -0,0 +1,555 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>Clojure Guide | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="Clojure Guide" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/clojure" />
+<meta property="og:url" content="https://mxnet.apache.org/api/clojure" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/clojure","headline":"Clojure Guide","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">Clojure Guide</h1>
+        <h3></h3><a style="float:left; margin-top:20px" href="/get_started" class="btn btn-action">Get Started
+            <span class="span-accented">›</span></a></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+        
+        
+        
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+          <!-- page -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <!--- 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. -->
+
+<h1 id="mxnet---clojure-api">MXNet - Clojure API</h1>
+
+<p>MXNet supports the Clojure programming language. The MXNet Clojure package brings flexible and efficient GPU
+computing and state-of-art deep learning to Clojure. It enables you to write seamless tensor/matrix computation with multiple GPUs in Clojure. It also lets you construct and customize the state-of-art deep learning models in Clojure, and apply them to tasks, such as image classification and data science challenges.</p>
+
+<h2 id="tensor-and-matrix-computations">Tensor and Matrix Computations</h2>
+<p>You can perform tensor or matrix computation in pure Clojure:</p>
+
+<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">arr</span><span class="w"> </span><span class="p">(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="p">[</span><span class="mi">2</span><span class="w"> </span><span class="mi">3</span><span class="p">]))</span><span class="w">
+
+</span><span class="n">arr</span><span class="w"> </span><span class="c1">;=&gt; #object[org.apache.mxnet.NDArray 0x597d72e "org.apache.mxnet.NDArray@e35c3ba9"]</span><span class="w">
+
+</span><span class="p">(</span><span class="nf">ndarray/shape-vec</span><span class="w"> </span><span class="n">arr</span><span class="p">)</span><span class="w"> </span><span class="c1">;=&gt;  [2 3]</span><span class="w">
+
+</span><span class="p">(</span><span class="nb">-&gt;</span><span class="w"> </span><span class="p">(</span><span class="nf">ndarray/*</span><span class="w"> </span><span class="n">arr</span><span class="w"> </span><span class="mi">2</span><span class="p">)</span><span class="w">
+    </span><span class="p">(</span><span class="nf">ndarray/-&gt;vec</span><span class="p">))</span><span class="w"> </span><span class="c1">;=&gt; [2.0 2.0 2.0 2.0 2.0 2.0]</span><span class="w">
+
+</span><span class="p">(</span><span class="nf">ndarray/shape-vec</span><span class="w"> </span><span class="p">(</span><span class="nf">ndarray/*</span><span class="w"> </span><span class="n">arr</span><span class="w"> </span><span class="mi">2</span><span class="p">))</span><span class="w"> </span><span class="c1">;=&gt; [2 3]</span><span class="w">
+
+</span></code></pre></div></div>
+</div>
+</div>
+
+        </div>
+    </div>
+
+</article>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/clojure/docs/tutorials.html b/versions/master/api/clojure/docs/tutorials.html
new file mode 100644
index 0000000..4dd9d8c
--- /dev/null
+++ b/versions/master/api/clojure/docs/tutorials.html
@@ -0,0 +1,762 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>Clojure Tutorials | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="Clojure Tutorials" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/clojure/docs/tutorials" />
+<meta property="og:url" content="https://mxnet.apache.org/api/clojure/docs/tutorials" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/clojure/docs/tutorials","headline":"Clojure Tutorials","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">Clojure Tutorials</h1>
+        <h3></h3><a style="float:left; margin-top:20px" href="" class="btn btn-action">Get Started
+            <span class="span-accented">›</span></a></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+        
+        
+        
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+          <!-- page -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <h2>List of available tutorials</h2>
+<ul>
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+    
+    <li><a href="/api/clojure/docs/tutorials/kvstore">KVStore API</a></li>
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+    
+    
+    <li><a href="/api/clojure/docs/tutorials/module">Module API</a></li>
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+    
+    <li><a href="/api/clojure/docs/tutorials/ndarray">NDArray</a></li>
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+    
+    <li><a href="/api/clojure/docs/tutorials/symbol">Symbolic API</a></li>
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+    
+    
+    <li><a href="/api/clojure/docs/tutorials/symbol_in_pictures">Symbolic API with Pictures</a></li>
+      <!-- page-category -->
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+    
+       <!-- resource-p -->
+      <!-- page -->
+</ul>
+</div>
+</div>
+
+        </div>
+    </div>
+
+</article>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/clojure/docs/tutorials/kvstore.html b/versions/master/api/clojure/docs/tutorials/kvstore.html
new file mode 100644
index 0000000..841ed0f
--- /dev/null
+++ b/versions/master/api/clojure/docs/tutorials/kvstore.html
@@ -0,0 +1,614 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>KVStore API | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="KVStore API" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/clojure/docs/tutorials/kvstore" />
+<meta property="og:url" content="https://mxnet.apache.org/api/clojure/docs/tutorials/kvstore" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/clojure/docs/tutorials/kvstore","headline":"KVStore API","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">KVStore API</h1>
+        <h3></h3></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+        
+        
+        
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+          <!-- page -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <!--- 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. -->
+<h1 id="kvstore-api">KVStore API</h1>
+
+<p>Topics:</p>
+
+<ul>
+  <li><a href="#basic-push-and-pull">Basic Push and Pull</a></li>
+  <li><a href="#list-key-value-pairs">List Key-Value Pairs</a></li>
+  <li><a href="/api/clojure/docs/api">Clojure API Reference</a></li>
+</ul>
+
+<p>To follow along with this documentation, you can use this namespace to with the needed requires:</p>
+
+<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">ns</span><span class="w"> </span><span class="n">docs.kvstore</span><span class="w">
+  </span><span class="p">(</span><span class="no">:require</span><span class="w"> </span><span class="p">[</span><span class="n">org.apache.clojure-mxnet.kvstore</span><span class="w"> </span><span class="no">:as</span><span class="w"> </span><span class="n">kvstore</span><span class="p">]</span><span class="w">
+            </span><span class="p">[</span><span class="n">org.apache.clojure-mxnet.ndarray</span><span class="w"> </span><span class="no">:as</span><span class="w"> </span><span class="n">ndarray</span><span class="p">]</span><span class="w">
+            </span><span class="p">[</span><span class="n">org.apache.clojure-mxnet.context</span><span class="w"> </span><span class="no">:as</span><span class="w"> </span><span class="n">context</span><span class="p">]))</span><span class="w">
+</span></code></pre></div></div>
+
+<h2 id="basic-push-and-pull">Basic Push and Pull</h2>
+
+<p>Provides basic operation over multiple devices (GPUs) on a single device.</p>
+
+<h3 id="initialization">Initialization</h3>
+
+<p>Let’s consider a simple example. It initializes
+a (<code class="highlighter-rouge">int</code>, <code class="highlighter-rouge">NDArray</code>) pair into the store, and then pulls the value out.</p>
+
+<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="p">(</span><span class="nf">kvstore/create</span><span class="w"> </span><span class="s">"local"</span><span class="p">))</span><span class="w"> </span><span class="c1">;; create a local kvstore</span><span class="w">
+</span><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">shape</span><span class="w"> </span><span class="p">[</span><span class="mi">2</span><span class="w"> </span><span class="mi">3</span><span class="p">])</span><span class="w">
+</span><span class="c1">;;; init the kvstore with a vector of keys (strings) and ndarrays</span><span class="w">
+</span><span class="p">(</span><span class="nf">kvstore/init</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="p">[</span><span class="s">"3"</span><span class="p">]</span><span class="w"> </span><span class="p">[(</span><span class="nf">ndarray/*</span><span class="w"> </span><span class="p">(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="p">)</span><span class="w"> </span><span class= [...]
+</span><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="p">(</span><span class="nf">ndarray/zeros</span><span class="w"> </span><span class="n">shape</span><span class="p">))</span><span class="w">
+</span><span class="p">(</span><span class="nf">kvstore/pull</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="p">[</span><span class="s">"3"</span><span class="p">]</span><span class="w"> </span><span class="p">[</span><span class="n">a</span><span class="p">])</span><span class="w">
+</span><span class="p">(</span><span class="nf">ndarray/-&gt;vec</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w"> </span><span class="c1">;=&gt; [2.0 2.0 2.0 2.0 2.0 2.0]</span><span class="w">
+</span></code></pre></div></div>
+
+<h3 id="push-aggregation-and-updater">Push, Aggregation, and Updater</h3>
+
+<p>For any key that’s been initialized, you can push a new value with the same shape to the key, as follows:</p>
+
+<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">kvstore/push</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="p">[</span><span class="s">"3"</span><span class="p">]</span><span class="w"> </span><span class="p">[(</span><span class="nf">ndarray/*</span><span class="w"> </span><span class="p">(</span><span class="nf">ndarray/ones</span><span class="w"> </ [...]
+</span><span class="p">(</span><span class="nf">kvstore/pull</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="p">[</span><span class="s">"3"</span><span class="p">]</span><span class="w"> </span><span class="p">[</span><span class="n">a</span><span class="p">])</span><span class="w">
+</span><span class="p">(</span><span class="nf">ndarray/-&gt;vec</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="c1">;=&gt;[8.0 8.0 8.0 8.0 8.0 8.0]</span><span class="w">
+</span></code></pre></div></div>
+
+<p>The data that you want to push can be stored on any device. Furthermore, you can push multiple
+values into the same key, where KVStore first sums all of these
+values, and then pushes the aggregated value, as follows (Here we use multiple cpus):</p>
+
+<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">cpus</span><span class="w"> </span><span class="p">[(</span><span class="nf">context/cpu</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nf">context/cpu</span><span class="w"> </span><span class="mi">1</span><s [...]
+</span><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="p">[(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="w"> </span><span class="p">{</span><span class="no">:ctx</span><span class="w"> </span><span class="p">(</span><span class="nb">nth</span><span class="w"> </span><span class="n">cpus</span><span class="w"> </span><span class="mi">0</span [...]
+        </span><span class="p">(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="w"> </span><span class="p">{</span><span class="no">:ctx</span><span class="w"> </span><span class="p">(</span><span class="nb">nth</span><span class="w"> </span><span class="n">cpus</span><span class="w"> </span><span class="mi">1</span><span class="p">)})</span><span class="w">
+        </span><span class="p">(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="w"> </span><span class="p">{</span><span class="no">:ctx</span><span class="w"> </span><span class="p">(</span><span class="nb">nth</span><span class="w"> </span><span class="n">cpus</span><span class="w"> </span><span class="mi">2</span><span class="p">)})])</span><span class="w">
+</span><span class="p">(</span><span class="nf">kvstore/push</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="p">[</span><span class="s">"3"</span><span class="w"> </span><span class="s">"3"</span><span class="w"> </span><span class="s">"3"</span><span class="p">]</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w">
+</span><span class="p">(</span><span class="nf">kvstore/pull</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="s">"3"</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w">
+</span><span class="p">(</span><span class="nf">ndarray/-&gt;vec</span><span class="w"> </span><span class="n">a</span><span class="p">)</span><span class="w"> </span><span class="c1">;=&gt; [3.0 3.0 3.0 3.0 3.0 3.0]</span><span class="w">
+</span></code></pre></div></div>
+
+<h3 id="pull">Pull</h3>
+
+<p>You’ve already seen how to pull a single key-value pair. Similar to the way that you use the push command, you can
+pull the value into several devices with a single call.</p>
+
+<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="p">[(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="w"> </span><span class="p">{</span><span class="no">:ctx</span><span class="w"> </span><span class="p">(</span><span class="nf">context/cpu</spa [...]
+        </span><span class="p">(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="w"> </span><span class="p">{</span><span class="no">:ctx</span><span class="w"> </span><span class="p">(</span><span class="nf">context/cpu</span><span class="w"> </span><span class="mi">1</span><span class="p">)})])</span><span class="w">
+</span><span class="p">(</span><span class="nf">kvstore/pull</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="p">[</span><span class="s">"3"</span><span class="w"> </span><span class="s">"3"</span><span class="p">]</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w">
+</span><span class="p">(</span><span class="nb">map</span><span class="w"> </span><span class="n">ndarray/-&gt;vec</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="c1">;=&gt; ([3.0 3.0 3.0 3.0 3.0 3.0] [3.0 3.0 3.0 3.0 3.0 3.0])</span><span class="w">
+</span></code></pre></div></div>
+
+<h2 id="list-key-value-pairs">List Key-Value Pairs</h2>
+
+<p>All of the operations that we’ve discussed so far are performed on a single key. KVStore also provides
+the interface for generating a list of key-value pairs. For a single device, use the following:</p>
+
+<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">ks</span><span class="w"> </span><span class="p">[</span><span class="s">"5"</span><span class="w"> </span><span class="s">"7"</span><span class="w"> </span><span class="s">"9"</span><span class="p">])</span><span class="w">
+</span><span class="p">(</span><span class="nf">kvstore/init</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="n">ks</span><span class="w"> </span><span class="p">[(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="p">)</span><span  [...]
+</span><span class="p">(</span><span class="nf">kvstore/push</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="n">ks</span><span class="w"> </span><span class="p">[(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nf">ndarray/ones</span><span class="w"> </span><span class="n">shape</span><span class="p">)</span><span  [...]
+</span><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="p">[(</span><span class="nf">ndarray/zeros</span><span class="w"> </span><span class="n">shape</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nf">ndarray/zeros</span><span class="w"> </span><span class="n">shape</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nf" [...]
+</span><span class="p">(</span><span class="nf">kvstore/pull</span><span class="w"> </span><span class="n">kv</span><span class="w"> </span><span class="n">ks</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w">
+</span><span class="p">(</span><span class="nb">map</span><span class="w"> </span><span class="n">ndarray/-&gt;vec</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="c1">;=&gt; ([1.0 1.0 1.0 1.0 1.0 1.0] [1.0 1.0 1.0 1.0 1.0 1.0] [1.0 1.0 1.0 1.0 1.0 1.0])</span><span class="w">
+</span></code></pre></div></div>
+</div>
+</div>
+
+        </div>
+    </div>
+
+</article>
+
+</main><footer class="site-footer h-card">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-4">
+                <h4 class="footer-category-title">Resources</h4>
+                <ul class="contact-list">
+                    <li><a href="/community#stay-connected">Mailing lists</a></li>
+                    <li><a href="https://discuss.mxnet.io">MXNet Discuss forum</a></li>
+                    <li><a href="/community#github-issues">Github Issues</a></li>
+                    <li><a href="https://github.com/apache/incubator-mxnet/projects">Projects</a></li>
+                    <li><a href="https://cwiki.apache.org/confluence/display/MXNET/Apache+MXNet+Home">Developer Wiki</a></li>
+                    <li><a href="/community">Contribute To MXNet</a></li>
+
+                </ul>
+            </div>
+
+            <div class="col-4"><ul class="social-media-list"><li><a href="https://github.com/apache/incubator-mxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#github"></use></svg> <span class="username">apache/incubator-mxnet</span></a></li><li><a href="https://www.twitter.com/apachemxnet"><svg class="svg-icon"><use xlink:href="/assets/minima-social-icons.svg#twitter"></use></svg> <span class="username">apachemxnet</span></a></li><li><a href="https://youtube. [...]
+</div>
+
+            <div class="col-4 footer-text">
+                <p>A flexible and efficient library for deep learning.</p>
+            </div>
+        </div>
+    </div>
+</footer>
+<footer class="site-footer2">
+    <div class="wrapper">
+        <div class="row">
+            <div class="col-3">
+                <img src="/assets/img/apache_incubator_logo.png" class="footer-logo col-2">
+            </div>
+            <div class="footer-bottom-warning col-9">
+                <p>Apache MXNet is an effort undergoing incubation at The Apache Software Foundation (ASF), <span
+                        style="font-weight:bold">sponsored by the <i>Apache Incubator</i></span>. Incubation is required
+                    of all newly accepted projects until a further review indicates that the infrastructure,
+                    communications, and decision making process have stabilized in a manner consistent with other
+                    successful ASF projects. While incubation status is not necessarily a reflection of the completeness
+                    or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.
+                </p><p>"Copyright © 2017-2018, The Apache Software Foundation Apache MXNet, MXNet, Apache, the Apache
+                    feather, and the Apache MXNet project logo are either registered trademarks or trademarks of the
+                    Apache Software Foundation."</p>
+            </div>
+        </div>
+    </div>
+</footer>
+
+
+
+
+</body>
+
+</html>
diff --git a/versions/master/api/clojure/docs/tutorials/module.html b/versions/master/api/clojure/docs/tutorials/module.html
new file mode 100644
index 0000000..74a5e80
--- /dev/null
+++ b/versions/master/api/clojure/docs/tutorials/module.html
@@ -0,0 +1,753 @@
+<!DOCTYPE html>
+<html lang=" en"><head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1">
+  <link href="https://raw.githubusercontent.com/dmlc/web-data/master/mxnet/image/mxnet-icon.png" rel="icon" type="image/png"><!-- Begin Jekyll SEO tag v2.6.1 -->
+<title>Module API | Apache MXNet</title>
+<meta name="generator" content="Jekyll v4.0.0" />
+<meta property="og:title" content="Module API" />
+<meta property="og:locale" content="en_US" />
+<meta name="description" content="A flexible and efficient library for deep learning." />
+<meta property="og:description" content="A flexible and efficient library for deep learning." />
+<link rel="canonical" href="https://mxnet.apache.org/api/clojure/docs/tutorials/module" />
+<meta property="og:url" content="https://mxnet.apache.org/api/clojure/docs/tutorials/module" />
+<meta property="og:site_name" content="Apache MXNet" />
+<script type="application/ld+json">
+{"url":"https://mxnet.apache.org/api/clojure/docs/tutorials/module","headline":"Module API","description":"A flexible and efficient library for deep learning.","@type":"WebPage","@context":"https://schema.org"}</script>
+<!-- End Jekyll SEO tag -->
+<script src="https://medium-widget.pixelpoint.io/widget.js"></script>
+  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css" />
+  <link rel="stylesheet" href="/assets/main.css"><link type="application/atom+xml" rel="alternate" href="https://mxnet.apache.org/feed.xml" title="Apache MXNet" /><script>
+if(!(window.doNotTrack === "1" || navigator.doNotTrack === "1" || navigator.doNotTrack === "yes" || navigator.msDoNotTrack === "1")) {
+  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
+
+  ga('create', 'UA-96378503-1', 'auto');
+  ga('send', 'pageview');
+}
+</script>
+  
+<script src="/assets/js/jquery-3.3.1.min.js"></script><script src="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.js" defer></script>
+  <script src="/assets/js/globalSearch.js" defer></script>
+  <script src="/assets/js/clipboard.js" defer></script>
+  <script src="/assets/js/copycode.js" defer></script></head>
+<body><header class="site-header" role="banner">
+
+  <script>
+    $(document).ready(function () {
+
+      // HEADER OPACITY LOGIC
+
+      function opacity_header() {
+        var value = "rgba(4,140,204," + ($(window).scrollTop() / 300 + 0.4) + ")"
+        $('.site-header').css("background-color", value)
+      }
+
+      $(window).scroll(function () {
+        opacity_header()
+      })
+      opacity_header();
+
+      // MENU SELECTOR LOGIC
+      $('.page-link').each( function () {
+        if (window.location.href.includes(this.href)) {
+          $(this).addClass("page-current");
+        }
+      });
+    })
+  </script>
+  <div class="wrapper">
+    <a class="site-title" rel="author" href="/"><img
+            src="/assets/img/mxnet_logo.png" class="site-header-logo"></a>
+    <nav class="site-nav">
+      <input type="checkbox" id="nav-trigger" class="nav-trigger"/>
+      <label for="nav-trigger">
+          <span class="menu-icon">
+            <svg viewBox="0 0 18 15" width="18px" height="15px">
+              <path d="M18,1.484c0,0.82-0.665,1.484-1.484,1.484H1.484C0.665,2.969,0,2.304,0,1.484l0,0C0,0.665,0.665,0,1.484,0 h15.032C17.335,0,18,0.665,18,1.484L18,1.484z M18,7.516C18,8.335,17.335,9,16.516,9H1.484C0.665,9,0,8.335,0,7.516l0,0 c0-0.82,0.665-1.484,1.484-1.484h15.032C17.335,6.031,18,6.696,18,7.516L18,7.516z M18,13.516C18,14.335,17.335,15,16.516,15H1.484 C0.665,15,0,14.335,0,13.516l0,0c0-0.82,0.665-1.483,1.484-1.483h15.032C17.335,12.031,18,12.695,18,13.516L18,13.516z"/>
+            </svg>
+          </span>
+      </label>
+      <div class="gs-search-border">
+        <div id="gs-search-icon"></div>
+        <form id="global-search-form">
+          <input id="global-search" type="text" title="Search" placeholder="Search" />
+          <div id="global-search-dropdown-container">
+            <button class="gs-current-version btn" type="button" data-toggle="dropdown">
+                <span id="gs-current-version-label">master</span>
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+          <span id="global-search-close">x</span>
+        </form>
+      </div>
+      <div class="trigger">
+        <div id="global-search-mobile-border">
+          <div id="gs-search-icon-mobile"></div>
+          <input id="global-search-mobile" placeholder="Search..." type="text"/>
+          <div id="global-search-dropdown-container-mobile">
+            <button class="gs-current-version-mobile btn" type="button" data-toggle="dropdown">
+                <svg class="gs-dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true">
+                    <path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path>
+                </svg>
+            </button>
+            <ul class="gs-opt-group gs-version-dropdown-mobile">
+              
+                
+                  <li class="gs-opt gs-versions active">master</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.7</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.6</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.5.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.4.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.3.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.2.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.1.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">1.0.0</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.12.1</li>
+                
+              
+                
+                  <li class="gs-opt gs-versions">0.11.0</li>
+                
+              
+            </ul>
+        </div>
+        </div>
+        <a class="page-link" href="/get_started">Get Started</a>
+        <a class="page-link" href="/blog">Blog</a>
+        <a class="page-link" href="/features">Features</a>
+        <a class="page-link" href="/ecosystem">Ecosystem</a>
+        <a class="page-link" href="/api">Docs & Tutorials</a>
+        <a class="page-link" href="https://github.com/apache/incubator-mxnet">GitHub</a>
+        <div class="dropdown">
+          <span class="dropdown-header">master
+            <svg class="dropdown-caret" viewBox="0 0 32 32" class="icon icon-caret-bottom" aria-hidden="true"><path class="dropdown-caret-path" d="M24 11.305l-7.997 11.39L8 11.305z"></path></svg>
+          </span>
+          <div class="dropdown-content">
+            
+              
+                <a class="dropdown-option-active" href="/">master</a>
+              
+            
+              
+                <a href="/versions/1.7/">1.7</a>
+              
+            
+              
+                <a href="/versions/1.6/">1.6</a>
+              
+            
+              
+                <a href="/versions/1.5.0/">1.5.0</a>
+              
+            
+              
+                <a href="/versions/1.4.1/">1.4.1</a>
+              
+            
+              
+                <a href="/versions/1.3.1/">1.3.1</a>
+              
+            
+              
+                <a href="/versions/1.2.1/">1.2.1</a>
+              
+            
+              
+                <a href="/versions/1.1.0/">1.1.0</a>
+              
+            
+              
+                <a href="/versions/1.0.0/">1.0.0</a>
+              
+            
+              
+                <a href="/versions/0.12.1/">0.12.1</a>
+              
+            
+              
+                <a href="/versions/0.11.0/">0.11.0</a>
+              
+            
+          </div>
+        </div>
+      </div>
+    </nav>
+  </div>
+</header>
+<main class="page-content" aria-label="Content">
+    <script>
+
+</script>
+<article class="post">
+
+    <header class="post-header wrapper">
+        <h1 class="post-title">Module API</h1>
+        <h3></h3></header>
+
+    <div class="post-content">
+        <div class="wrapper">
+            <div class="row">
+    <div class="col-3 docs-side-bar">
+
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+        
+        
+        
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+        
+           <!-- resource-p -->
+          <!-- page -->
+        </ul>
+    </div>
+    <div class="col-9">
+        <!--- 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. -->
+
+<h1 id="module-api">Module API</h1>
+<p>The module API provides an intermediate and high-level interface for performing computation with neural networks in MXNet. Module wraps a Symbol and one or more Executors. It has both a high level and intermediate level API.</p>
+
+<p>Topics:</p>
+
+<ul>
+  <li><a href="#prepare-the-data">Prepare the Data</a></li>
+  <li><a href="#list-key-value-pairs">List Key-Value Pairs</a></li>
+  <li><a href="#preparing-a-module-for-computation">Preparing a Module for Computation</a></li>
+  <li><a href="#training-and-predicting">Training and Predicting</a></li>
+  <li><a href="#saving-and-loading">Saving and Loading</a></li>
+  <li><a href="/api/clojure/docs/api">Clojure API Reference</a></li>
+</ul>
+
+<p>To follow along with this documentation, you can use this namespace to with the needed requires:</p>
+
+<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nf">ns</span><span class="w"> </span><span class="n">docs.module</span><span class="w">
+  </span><span class="p">(</span><span class="no">:require</span><span class="w"> </span><span class="p">[</span><span class="n">clojure.java.io</span><span class="w"> </span><span class="no">:as</span><span class="w"> </span><span class="n">io</span><span class="p">]</span><span class="w">
+            </span><span class="p">[</span><span class="n">clojure.java.shell</span><span class="w"> </span><span class="no">:refer</span><span class="w"> </span><span class="p">[</span><span class="n">sh</span><span class="p">]]</span><span class="w">
... 1203142 lines suppressed ...