TaoLv commented on a change in pull request #13657: update with release notes 
for 1.4.0 release
URL: https://github.com/apache/incubator-mxnet/pull/13657#discussion_r242433112
 
 

 ##########
 File path: NEWS.md
 ##########
 @@ -1,6 +1,589 @@
-MXNet Change Log
+Apache MXNet (incubating) Change Log
 ================
 
+## 1.4.0
+### New Features
+#### Java Inference API
+
+Model inference is often managed in a production ecosystem using primarily 
Java/Scala tools and frameworks. This release seeks to alleviate the need for 
software engineers to write custom MXNet wrappers to fit their production 
environment. 
+
+Inference on a trained model has a couple of common use cases:
+
+  1. Real-time or Online Inference - tasks that require immediate feedback, 
such as fraud detection
+  2. Batch or Offline Inference - tasks that don't require immediate feedback, 
these are use cases where you have massive amounts of data and want to run 
inference or pre-compute inference results 
+Real-time Inference is often performed and deployed on popular web frameworks 
such as Tomcat, Netty, Jetty, etc., all of which use Java.
+Batch Inference is often performed on big data platforms such as Spark using 
Scala or Java.  
+
+With this project, we had the following goals:
+* Build a new set of APIs that are Java friendly, compatible with Java 7+, are 
easy to use for inference.
+* Lower the barrier to entry of consuming MXNet for production use cases.
+
+More details can be found at the [Java Inference API 
document](https://cwiki.apache.org/confluence/display/MXNET/MXNet+Java+Inference+API).
+
+#### Julia API 
+
+MXNet.jl is the Julia package of Apache MXNet. MXNet.jl brings flexible and 
efficient GPU computing and state-of-art deep learning to Julia. Some 
highlights of features include:
+
+  * Efficient tensor/matrix computation across multiple devices, including 
multiple CPUs, GPUs and distributed server nodes.
+  * Flexible manipulation of symbolic to composite for construction of 
state-of-the-art deep learning models.
+
+#### Control Flow Operators
+
+Today we observe more and more dynamic neural network models, especially in 
the fields of natural language processing and graph analysis. The dynamics in 
these models come from multiple sources, including:
+
+  * Models are expressed with control flow, such as conditions and loops;
+  * NDArrays in a model may have dynamic shapes, meaning the NDArrays of a 
model or some of the NDArrays have different shapes for different batches;
+  * Models may want to use more dynamic data structures, such as lists or 
dictionaries.
+It's natural to express dynamic models in frameworks with an imperative 
programming interface (e.g., Gluon, Pytorch, TensorFlow Eager). In this kind of 
interface, developers can use Python control flows, or NDArrays with any shape 
at any moment, or use Python lists and dictionaries to store data as they want. 
The problem of this approach is that it highly dependent on the originating 
front-end programming language (mainly Python). A model implemented in one 
language can only run in the same language. 
+
+A common use case is that machine learning scientists want to develop their 
models in Python, whereas engineers who deploy the models usually have to use a 
different "production" language (e.g., Java or C). Gluon tries to close the gap 
between the model development and production deployment. Machine learning 
scientists design and implement their models in Python with the imperative 
interface, and then Gluon converts the implementations from imperative to 
symbolic by invoking `hybridize()` for model exporting. 
+
+The goal of this project is to enhance Gluon to turn a dynamic neural network 
into a static computation graph. The dynamic control flows are expressed by 
control flow operators with Gluon hybridization, and these are exported for 
deployment. 
+
+More information can be found at [Optimize dynamic neural network models with 
control flow 
operators](https://cwiki.apache.org/confluence/display/MXNET/Optimize+dynamic+neural+network+models+with+control+flow+operators)
+
+#### SVRG Optimization
+
+SVRG stands for Stochastic Variance Reduced Gradient, which was first 
introduced in the paper [Accelerating Stochastic Gradient Descent using 
Predicative Variance Reduction in 
2013](https://papers.nips.cc/paper/4937-accelerating-stochastic-gradient-descent-using-predictive-variance-reduction.pdf).
 It is an optimization technique that complements SGD. SGD is known for large 
scale optimization but it suffers from slow convergence asymptotically due to 
the inherent variance. SGD approximates the full gradient using a small batch 
of samples which introduces variance. In order to converge faster, SGD often 
needs to start with a smaller learning rate. SVRG remedies the problem by 
keeping a version of the estimated weights that is close to the optimal 
parameters and maintain average of full gradient over full pass of data. The 
average of full gradients of all data is calculated w.r.t to parameters of last 
mth epochs. It has provable guarantees for strongly convex smooth functions, 
and a more detailed proof can be found in section 3 of the paper. SVRG uses a 
different update rule: gradients w.r.t current parameters minus gradients w.r.t 
parameters from the last mth epoch, plus the average of gradients over all 
data. Key Characteristics of SVRG:
+
+  * Explicit variance reduction 
+  * Ability to use relatively large learning rate compared to SGD, which leads 
to faster convergence.
+More details can be found at [SVRG Optimization in MXNet Python 
Module](https://cwiki.apache.org/confluence/display/MXNET/Unified+integration+with+external+backend+libraries)
+
+#### Subgraph API
+
+MXNet can integrate with many different kinds of backend libraries, including 
TVM, MKLDNN, TensorRT, Intel nGraph and more. These backend in general support 
a limited number of operators, and thus running computation in a model usually 
involves in interaction between backend-supported operators and MXNet 
operators. These backend libraries share some common requirements:
+
+TVM , MKLDNN and nGraph uses customized data formats. Interaction between 
these backends with MXNet requires data format conversion.
+TVM, MKLDNN, TensorRT and nGraph fuses operators.
+Integration with these backends should happen in the granularity of subgraphs 
instead of in the granularity of operators. To fuse operators, it's obvious 
that we need to divide a graph into subgraphs so that the operators in a 
subgraph can be fused into a single operator. To handle customized data 
formats, we should partition a computation graph into subgraphs as well. Each 
subgraph contains only TVM, MKLDNN or ngraph operators. In this way, MXNet 
converts data formats only when entering such a subgraph and the operators 
inside a subgraph handle format conversion themselves if necessary. This makes 
interaction of TVM and MKLDNN with MXNet much easier. Neither the MXNet 
executor nor the MXNet operators need to deal with customized data formats. 
Even though invoking these libraries from MXNet requires similar steps, the 
partitioning rule and the subgraph execution of these backends can be 
different. As such, we define the following interface for backends to customize 
graph partitioning and subgraph execution inside an operator. More details can 
be found at PR 12157 and [Subgraph 
API](https://cwiki.apache.org/confluence/display/MXNET/Unified+integration+with+external+backend+libraries).
+
+#### JVM Memory Management
+
+MXNet Scala and Java API uses native memory to manage NDArray, Symbol, 
Executor, DataIterators using the MXNet c_api. C APIs provide appropriate 
interfaces to create, access and free these objects MXNet Scala has 
corresponding Wrappers and APIs which have pointer references to the native 
memory. Before this project, JVM users(Scala/Clojure/Java..) of Apache MXNet 
have to manage MXNet objects manually using the dispose pattern, there are a 
few usability problems with this approach:
+
+Users have to track the MXNet objects manually and remember to call dispose, 
this is not Java Idiomatic and not user-friendly, quoting a user "this feels 
like I am writing C++ code which I stopped ages ago"
+Leads to memory leaks if dispose is not called.
+Many Objects in MXNet-Scala are managed in native memory, needing to use 
dispose on them as well.
+bloated code with dispose() methods.
+hard to debug memory-leaks
+Goals of the project are to provide MXNet JVM Users automated memory 
management which can release native memory when there are no references to JVM 
objects, to be able to manage both GPU and CPU Memory automatically without 
performance degradation with automated memory management.  More details can be 
found here: [JVM Memory 
Management](https://cwiki.apache.org/confluence/display/MXNET/JVM+Memory+Management)
+
+#### Topology-aware AllReduce
+For distributed training, the ring Reduce communication pattern used by NCCL 
and Parameter server Reduce currently used in MXNet are not optimal for small 
batch sizes on p3.16xlarge instances with 8 GPUs. The approach is based on the 
idea of using trees to perform the Reduce and Broadcast. We can use the idea of 
minimum spanning trees to do a binary tree Reduce communication pattern to 
improve it following this paper by Wang, Li, Edo and Smola [1]. Our strategy 
will be to use:
+
+  * a single tree (latency-optimal for small messages) to handle Reduce on 
small messages
+  * multiple trees (bandwidth-optimal for large messages) to handle large 
messages. 
+
+More details can be found here: [Topology-aware 
AllReduce](https://cwiki.apache.org/confluence/display/MXNET/Single+machine+All+Reduce+Topology-aware+Communication)
+Note: This is an experimental feature and has known problems - see 
[13341](https://github.com/apache/incubator-mxnet/issues/13341). Please help to 
contribute to improve the robustness of the feature.
+
+#### MKDNN backend: Graph optimization and Quantization (experimental)
 
 Review comment:
   typo: MKDNN -> MKLDNN. Also `MKLDNN` and `MKL-DNN` are mix-used in this 
note. Should be unified.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to