Repository: deepjavalibrary/djl
Pull request #1627 (2022-05-06 21:02:13)

Support of take from pytorch
## Description ##

This is a follow-up on PR https://github.com/deepjavalibrary/djl/pull/1622. The `take` feature will enable more advanced indexing.

It's the same as `take` in [numpy ](https://numpy.org/doc/stable/reference/generated/numpy.take.html#numpy.take) and [ pytorch](https://pytorch.org/docs/1.11/generated/torch.take.html?highlight=take#torch.take).

Defination of `NDArray take(NDArray index)`:
Returns a partial pointed by the index array, according to row-major-ordering linear indexing.
The shape of the output is decided by that of `index`.


codecov-commenter: # [Codecov](https://codecov.io/gh/deepjavalibrary/djl/pull/1627?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary) Report
> Merging [#1627](https://codecov.io/gh/deepjavalibrary/djl/pull/1627?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary) (a720822) into [master](https://codecov.io/gh/deepjavalibrary/djl/commit/bb5073f7ffc33f1883621fc1783dbb01e70b418f?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary) (bb5073f) will **decrease** coverage by `1.23%`.
> The diff coverage is `62.16%`.

```diff
@@             Coverage Diff              @@
##             master    #1627      +/-   ##
============================================
- Coverage     72.08%   70.85%   -1.24%     
- Complexity     5126     5436     +310     
============================================
  Files           473      507      +34     
  Lines         21970    23778    +1808     
  Branches       2351     2589     +238     
============================================
+ Hits          15838    16847    +1009     
- Misses         4925     5640     +715     
- Partials       1207     1291      +84     
```


| [Impacted Files](https://codecov.io/gh/deepjavalibrary/djl/pull/1627?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary) | Coverage Δ | |
|---|---|---|
| [api/src/main/java/ai/djl/modality/cv/Image.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL21vZGFsaXR5L2N2L0ltYWdlLmphdmE=) | `69.23% <ø> (-4.11%)` | :arrow_down: |
| [...i/djl/modality/cv/translator/BigGANTranslator.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL21vZGFsaXR5L2N2L3RyYW5zbGF0b3IvQmlnR0FOVHJhbnNsYXRvci5qYXZh) | `21.42% <ø> (-5.24%)` | :arrow_down: |
| [...odality/cv/translator/BigGANTranslatorFactory.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL21vZGFsaXR5L2N2L3RyYW5zbGF0b3IvQmlnR0FOVHJhbnNsYXRvckZhY3RvcnkuamF2YQ==) | `33.33% <0.00%> (+8.33%)` | :arrow_up: |
| [...nslator/InstanceSegmentationTranslatorFactory.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL21vZGFsaXR5L2N2L3RyYW5zbGF0b3IvSW5zdGFuY2VTZWdtZW50YXRpb25UcmFuc2xhdG9yRmFjdG9yeS5qYXZh) | `14.28% <0.00%> (-3.90%)` | :arrow_down: |
| [.../modality/cv/translator/YoloTranslatorFactory.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL21vZGFsaXR5L2N2L3RyYW5zbGF0b3IvWW9sb1RyYW5zbGF0b3JGYWN0b3J5LmphdmE=) | `8.33% <0.00%> (-1.67%)` | :arrow_down: |
| [...i/djl/modality/cv/translator/YoloV5Translator.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL21vZGFsaXR5L2N2L3RyYW5zbGF0b3IvWW9sb1Y1VHJhbnNsYXRvci5qYXZh) | `5.69% <0.00%> (ø)` | |
| [...odality/cv/translator/YoloV5TranslatorFactory.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL21vZGFsaXR5L2N2L3RyYW5zbGF0b3IvWW9sb1Y1VHJhbnNsYXRvckZhY3RvcnkuamF2YQ==) | `8.33% <0.00%> (-1.67%)` | :arrow_down: |
| [...pi/src/main/java/ai/djl/ndarray/BytesSupplier.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL25kYXJyYXkvQnl0ZXNTdXBwbGllci5qYXZh) | `54.54% <0.00%> (-12.13%)` | :arrow_down: |
| [api/src/main/java/ai/djl/ndarray/NDArray.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL25kYXJyYXkvTkRBcnJheS5qYXZh) | `78.40% <ø> (+1.13%)` | :arrow_up: |
| [...ain/java/ai/djl/ndarray/index/dim/NDIndexPick.java](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary#diff-YXBpL3NyYy9tYWluL2phdmEvYWkvZGpsL25kYXJyYXkvaW5kZXgvZGltL05ESW5kZXhQaWNrLmphdmE=) | `100.00% <ø> (ø)` | |
| ... and [242 more](https://codecov.io/gh/deepjavalibrary/djl/pull/1627/diff?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/deepjavalibrary/djl/pull/1627?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/deepjavalibrary/djl/pull/1627?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary). Last update [46d3479...a720822](https://codecov.io/gh/deepjavalibrary/djl/pull/1627?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=deepjavalibrary).


Patch:
diff --git a/.github/workflows/native_publish_pytorch.yml b/.github/workflows/native_publish_pytorch.yml
index d69748d30..2ba5e67d6 100644
--- a/.github/workflows/native_publish_pytorch.yml
+++ b/.github/workflows/native_publish_pytorch.yml
@@ -10,7 +10,7 @@ on:
 
 jobs:
   build:
-    runs-on: ubuntu-18.04
+    runs-on: macos-latest
 
     steps:
       - uses: actions/checkout@v2
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index f2e9f180e..d5932ce67 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -37,8 +37,8 @@ To send us a pull request, please:
 6. Send us a pull request, answering any default questions in the pull request interface.
 7. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation.
 
-GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and
-[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).
+GitHub provides additional document on [forking a repository](https://docs.github.com/en/get-started/quickstart/fork-a-repo) and
+[creating a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request).
 
 
 ## Finding contributions to work on
diff --git a/README.md b/README.md
index 2c3016aae..0050742a7 100644
--- a/README.md
+++ b/README.md
@@ -86,6 +86,7 @@ The following pseudocode demonstrates running training:
 
 ## Release Notes
 
+* [0.17.0](https://github.com/deepjavalibrary/djl/releases/tag/v0.17.0) ([Code](https://github.com/deepjavalibrary/djl/tree/v0.17.0))
 * [0.16.0](https://github.com/deepjavalibrary/djl/releases/tag/v0.16.0) ([Code](https://github.com/deepjavalibrary/djl/tree/v0.16.0))
 * [0.15.0](https://github.com/deepjavalibrary/djl/releases/tag/v0.15.0) ([Code](https://github.com/deepjavalibrary/djl/tree/v0.15.0))
 * [0.14.0](https://github.com/deepjavalibrary/djl/releases/tag/v0.14.0) ([Code](https://github.com/deepjavalibrary/djl/tree/v0.14.0))
@@ -102,7 +103,7 @@ The following pseudocode demonstrates running training:
 * [0.2.1](https://github.com/deepjavalibrary/djl/releases/tag/v0.2.1) ([Code](https://github.com/deepjavalibrary/djl/tree/v0.2.1))
 * [0.2.0 Initial release](https://github.com/deepjavalibrary/djl/releases/tag/v0.2.0) ([Code](https://github.com/deepjavalibrary/djl/tree/v0.2.0))
 
-The release of DJL 0.17.0 is planned for April or May 2022.
+The release of DJL 0.18.0 is planned for June or July 2022.
 
 ## Building From Source
 
diff --git a/android/README.md b/android/README.md
index 79047dd5f..596278f7f 100644
--- a/android/README.md
+++ b/android/README.md
@@ -15,9 +15,9 @@ In gradle, you can include the snapshot repository and add the 4 modules in your
 
 ```
 dependencies {
-    implementation "ai.djl:api:0.16.0-SNAPSHOT"
-    implementation "ai.djl.android:core:0.16.0-SNAPSHOT"
-    androidRuntimeOnly "ai.djl.pytorch:pytorch-engine:0.16.0-SNAPSHOT"
-    androidRuntimeOnly "ai.djl.android:pytorch-native:0.16.0-SNAPSHOT"
+    implementation "ai.djl:api:0.17.0-SNAPSHOT"
+    implementation "ai.djl.android:core:0.17.0-SNAPSHOT"
+    androidRuntimeOnly "ai.djl.pytorch:pytorch-engine:0.17.0-SNAPSHOT"
+    androidRuntimeOnly "ai.djl.android:pytorch-native:0.17.0-SNAPSHOT"
 }
 ```
diff --git a/api/README.md b/api/README.md
index 85ac02b1c..2f4c74dbb 100644
--- a/api/README.md
+++ b/api/README.md
@@ -35,7 +35,7 @@ You can pull the DJL API from the central Maven repository by including the foll
 <dependency>
     <groupId>ai.djl</groupId>
     <artifactId>api</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
 
@@ -45,7 +45,7 @@ For testing the current nightly build, use the following:
 <dependency>
     <groupId>ai.djl</groupId>
     <artifactId>api</artifactId>
-    <version>0.17.0-SNAPSHOT</version>
+    <version>0.18.0-SNAPSHOT</version>
 </dependency>
 ```
 
diff --git a/api/src/main/java/ai/djl/modality/Classifications.java b/api/src/main/java/ai/djl/modality/Classifications.java
index cb75c4239..379da2a07 100644
--- a/api/src/main/java/ai/djl/modality/Classifications.java
+++ b/api/src/main/java/ai/djl/modality/Classifications.java
@@ -43,8 +43,12 @@ public class Classifications implements JsonSerializable {
                     .registerTypeAdapter(Classifications.class, new ClassificationsSerializer())
                     .create();
 
+    @SuppressWarnings("serial")
     protected List<String> classNames;
+
+    @SuppressWarnings("serial")
     protected List<Double> probabilities;
+
     private int topK;
 
     /**
diff --git a/api/src/main/java/ai/djl/modality/cv/output/DetectedObjects.java b/api/src/main/java/ai/djl/modality/cv/output/DetectedObjects.java
index 8373308b3..6f75da348 100644
--- a/api/src/main/java/ai/djl/modality/cv/output/DetectedObjects.java
+++ b/api/src/main/java/ai/djl/modality/cv/output/DetectedObjects.java
@@ -30,6 +30,7 @@ public class DetectedObjects extends Classifications {
                     .registerTypeAdapter(DetectedObjects.class, new ClassificationsSerializer())
                     .create();
 
+    @SuppressWarnings("serial")
     private List<BoundingBox> boundingBoxes;
 
     /**
diff --git a/api/src/main/java/ai/djl/modality/cv/output/Joints.java b/api/src/main/java/ai/djl/modality/cv/output/Joints.java
index 5455e16b8..9ac7c25a6 100644
--- a/api/src/main/java/ai/djl/modality/cv/output/Joints.java
+++ b/api/src/main/java/ai/djl/modality/cv/output/Joints.java
@@ -23,6 +23,8 @@ import java.util.List;
 public class Joints implements Serializable {
 
     private static final long serialVersionUID = 1L;
+
+    @SuppressWarnings("serial")
     private List<Joint> joints;
 
     /**
diff --git a/api/src/main/java/ai/djl/modality/cv/output/Landmark.java b/api/src/main/java/ai/djl/modality/cv/output/Landmark.java
index 708bbec3d..215b91f07 100644
--- a/api/src/main/java/ai/djl/modality/cv/output/Landmark.java
+++ b/api/src/main/java/ai/djl/modality/cv/output/Landmark.java
@@ -19,6 +19,7 @@ public class Landmark extends Rectangle {
 
     private static final long serialVersionUID = 1L;
 
+    @SuppressWarnings("serial")
     private List<Point> points;
 
     /**
diff --git a/api/src/main/java/ai/djl/modality/cv/output/Rectangle.java b/api/src/main/java/ai/djl/modality/cv/output/Rectangle.java
index 48715a080..dea3a8c67 100644
--- a/api/src/main/java/ai/djl/modality/cv/output/Rectangle.java
+++ b/api/src/main/java/ai/djl/modality/cv/output/Rectangle.java
@@ -28,6 +28,7 @@ public class Rectangle implements BoundingBox {
 
     private static final long serialVersionUID = 1L;
 
+    @SuppressWarnings("serial")
     private List<Point> corners;
 
     private double width;
diff --git a/api/src/main/java/ai/djl/ndarray/NDArray.java b/api/src/main/java/ai/djl/ndarray/NDArray.java
index c35c7f095..c7c6f96aa 100644
--- a/api/src/main/java/ai/djl/ndarray/NDArray.java
+++ b/api/src/main/java/ai/djl/ndarray/NDArray.java
@@ -511,6 +511,20 @@ public interface NDArray extends NDResource, BytesSupplier {
         return getNDArrayInternal().getIndexer().get(this, index);
     }
 
+    /**
+     * Returns a partial {@code NDArray}.
+     *
+     * @param index the boolean or int {@code NDArray} that indicates what to get
+     * @return the partial {@code NDArray}
+     */
+    default NDArray get(NDArray index) {
+        if (index.getDataType() == DataType.BOOLEAN) {
+            return get(new NDIndex().addBooleanIndex(index));
+        } else {
+            return take(index);
+        }
+    }
+
     /**
      * Returns a partial {@code NDArray}.
      *
@@ -535,16 +549,6 @@ public interface NDArray extends NDResource, BytesSupplier {
         return get(new NDIndex(indices));
     }
 
-    /**
-     * Returns a partial {@code NDArray}.
-     *
-     * @param index the boolean {@code NDArray} that indicates what to get
-     * @return the partial {@code NDArray}
-     */
-    default NDArray get(NDArray index) {
-        return get(new NDIndex().addBooleanIndex(index));
-    }
-
     /**
      * Returns a partial {@code NDArray} pointed by the indexed array. Given NDArray arr, NDArray
      * idx, and long axis, the output is out_{ijk} = arr_{idx_{ijk}, j, k} if axis=0 or arr_{i,
@@ -556,6 +560,14 @@ public interface NDArray extends NDResource, BytesSupplier {
      */
     NDArray gather(NDArray index, int axis);
 
+    /**
+     * Returns a partial {@code NDArray} pointed by the indexed array, according to linear indexing.
+     *
+     * @param index picks the elements of an NDArray to the same position as index
+     * @return the partial {@code NDArray} of the same shape as index
+     */
+    NDArray take(NDArray index);
+
     /**
      * Returns a scalar {@code NDArray} corresponding to a single element.
      *
diff --git a/api/src/main/java/ai/djl/ndarray/NDArrayAdapter.java b/api/src/main/java/ai/djl/ndarray/NDArrayAdapter.java
index 46f2634c3..c36762010 100644
--- a/api/src/main/java/ai/djl/ndarray/NDArrayAdapter.java
+++ b/api/src/main/java/ai/djl/ndarray/NDArrayAdapter.java
@@ -182,6 +182,12 @@ public abstract class NDArrayAdapter implements NDArray {
         throw new UnsupportedOperationException(UNSUPPORTED_MSG);
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public NDArray take(NDArray index) {
+        throw new UnsupportedOperationException(UNSUPPORTED_MSG);
+    }
+
     /** {@inheritDoc} */
     @Override
     public void set(Buffer data) {
diff --git a/basicdataset/README.md b/basicdataset/README.md
index b291e9439..c342cd15d 100644
--- a/basicdataset/README.md
+++ b/basicdataset/README.md
@@ -39,7 +39,7 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl</groupId>
     <artifactId>basicdataset</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
 
diff --git a/bom/README.md b/bom/README.md
index b9ead760c..5d6cf821b 100644
--- a/bom/README.md
+++ b/bom/README.md
@@ -22,7 +22,7 @@ will need to mention the type as pom and the scope as import) as the following:
         <dependency>
             <groupId>ai.djl</groupId>
             <artifactId>bom</artifactId>
-            <version>0.16.0</version>
+            <version>0.17.0</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
@@ -38,7 +38,7 @@ will need to mention the type as pom and the scope as import) as the following:
         <dependency>
             <groupId>ai.djl</groupId>
             <artifactId>bom</artifactId>
-            <version>0.16.0</version>
+            <version>0.17.0</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
@@ -70,7 +70,7 @@ will need to mention the type as pom and the scope as import) as the following:
 - First you need add BOM into your build.gradle file as the following:
 
 ```
-    implementation platform("ai.djl:bom:0.16.0")
+    implementation platform("ai.djl:bom:0.17.0")
 ```
 
 - Then you import the desired DJL modules into to you pom.xml file (no version is needed):
diff --git a/djl-zero/README.md b/djl-zero/README.md
index 05cf15b26..2b8615a12 100644
--- a/djl-zero/README.md
+++ b/djl-zero/README.md
@@ -34,6 +34,6 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl</groupId>
     <artifactId>djl-zero</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
diff --git a/docs/development/dependency_management.md b/docs/development/dependency_management.md
index c7d05ea00..3625bc95a 100644
--- a/docs/development/dependency_management.md
+++ b/docs/development/dependency_management.md
@@ -46,9 +46,10 @@ See [How to use DJL's BOM](../../bom/README.md#how-to-use-djls-bom) for detail.
 | | [mxnet-native-mkl(osx-x86_64)](../../engines/mxnet/mxnet-engine/README.md#macos) | Contains Apache MXNet native library for macOS |
 | | [mxnet-native-mkl(win-x86_64)](../../engines/mxnet/mxnet-engine/README.md#windows-cpu) | Contains Apache MXNet native library for Windows |
 | | [mxnet-native-mkl(linux-x86_64)](../../engines/mxnet/mxnet-engine/README.md#linux-cpu) | Contains Apache MXNet native library for Linux |
-| | [mxnet-native-cu110(linux-x86_64)](../../engines/mxnet/mxnet-engine/README.md#linux-gpu) | Contains Apache MXNet native library for Linux with CUDA 11.0|
+| | [mxnet-native-cu112(linux-x86_64)](../../engines/mxnet/mxnet-engine/README.md#linux-gpu) | Contains Apache MXNet native library for Linux with CUDA 11.2|
 | | [mxnet-native-cu102(linux-x86_64)](../../engines/mxnet/mxnet-engine/README.md#linux-gpu) | Contains Apache MXNet native library for Linux with CUDA 10.2|
 | | mxnet-native-auto (deprecated) | No longer needed since DJL 0.15.0 |
+| | mxnet-native-cu110(linux-x86_64) (deprecated) | Contains Apache MXNet native library <= 1.8.1 for Linux with CUDA 11.0|
 | | mxnet-native-cu101(linux-x86_64) (deprecated) | Contains Apache MXNet native library <= 1.7.0 for Linux with CUDA 10.1 |
 | | mxnet-native-cu92(linux-x86_64) (deprecated) | Contains Apache MXNet native library <= 1.6.0 for Linux with CUDA 9.2 |
 | | | |
@@ -63,6 +64,7 @@ See [How to use DJL's BOM](../../bom/README.md#how-to-use-djls-bom) for detail.
 | | [pytorch-native-cu102(win-x86_64)](../../engines/pytorch/pytorch-engine/README.md#windows-gpu) | Contains PyTorch native library for Windows with CUDA 10.2 |
 | | [pytorch-native-cu113-precxx11(linux-x86_64)](../../engines/pytorch/pytorch-engine/README.md#for-pre-cxx11-build) | Contains PyTorch native library for Linux with CUDA 11.3 |
 | | [pytorch-native-cpu-precxx11(linux-x86_64)](../../engines/pytorch/pytorch-engine/README.md#for-pre-cxx11-build) | Contains PyTorch native library for centOS 7 and Ubuntu 14.04 |
+| | [pytorch-native-cpu-precxx11(linux-aarch64)](../../engines/pytorch/pytorch-engine/README.md#for-aarch64-build) | Contains PyTorch native library for Linux ARM |
 | | [pytorch-jni](../../engines/pytorch/pytorch-engine/README.md) | Contains PyTorch JNI native library |
 | | pytorch-native-auto (deprecated) | No longer needed since DJL 0.15.0 |
 | | pytorch-native-cu111(linux-x86_64) (deprecated) | Contains PyTorch native library for Linux with CUDA 11.1 |
@@ -89,7 +91,9 @@ See [How to use DJL's BOM](../../bom/README.md#how-to-use-djls-bom) for detail.
 | | [paddlepaddle-native-cpu(linux-x86_64)](../../engines/paddlepaddle/paddlepaddle-engine/README.md#linux) | Contains PaddlePaddle native library for Linux |
 | | [paddlepaddle-native-cpu(win-x86_64)](../../engines/paddlepaddle/paddlepaddle-engine/README.md#windows) | Contains PaddlePaddle native library for Windows |
 | | [paddlepaddle-native-cu102(linux-x86_64)](../../engines/paddlepaddle/paddlepaddle-engine/README.md#Linux-GPU) | Contains PaddlePaddle native library for Linux with CUDA 10.2 |
-| | [paddlepaddle-native-cu101(linux-x86_64)](../../engines/paddlepaddle/paddlepaddle-engine/README.md#Linux-GPU) | Contains PaddlePaddle native library for Linux with CUDA 10.1 |
+| | [paddlepaddle-native-cu112(linux-x86_64)](../../engines/paddlepaddle/paddlepaddle-engine/README.md#Linux-GPU) | Contains PaddlePaddle native library for Linux with CUDA 11.2 |
+| | [paddlepaddle-native-cu110(win-x86_64)](../../engines/paddlepaddle/paddlepaddle-engine/README.md#Windows-GPU-Experimental) | Contains PaddlePaddle native library for Windows with CUDA 11.0 |
+| | paddlepaddle-native-cu101 (deprecated) | Contains PaddlePaddle native library <= 2.0.2 for Linux with CUDA 10.1 |
 | | paddlepaddle-native-auto (deprecated) | No longer needed since DJL 0.15.0 |
 | | | |
 | [ai.djl.onnxruntime](https://search.maven.org/search?q=g:ai.djl.onnxruntime) | [onnxruntime-engine](../../engines/onnxruntime/onnxruntime-engine/README.md#installation) | ONNX Runtime engine adapter |
diff --git a/docs/development/development_guideline.md b/docs/development/development_guideline.md
index aed0c95f0..41e725556 100644
--- a/docs/development/development_guideline.md
+++ b/docs/development/development_guideline.md
@@ -159,7 +159,7 @@ You can create your own NDArray renderer as follows:
 Please make sure to:
 
 - Check the "On-demand" option, which causes IntelliJ to only render the NDArray when you click on the variable.
-- Change the "Use following expression" field to something like [toDebugString(100, 10, 10, 20)](https://javadoc.io/static/ai.djl/api/0.16.0/ai/djl/ndarray/NDArray.html#toDebugString-int-int-int-int-)
+- Change the "Use following expression" field to something like [toDebugString(100, 10, 10, 20)](https://javadoc.io/static/ai.djl/api/0.17.0/ai/djl/ndarray/NDArray.html#toDebugString-int-int-int-int-)
 if you want to adjust the range of NDArray's debug output.
 
 ## Common Problems
diff --git a/docs/development/how_to_use_dataset.md b/docs/development/how_to_use_dataset.md
index 93c31c891..206957b04 100644
--- a/docs/development/how_to_use_dataset.md
+++ b/docs/development/how_to_use_dataset.md
@@ -108,8 +108,8 @@ api group: 'org.apache.commons', name: 'commons-csv', version: '1.7'
 In order to extend the dataset, the following dependencies are required:
 
 ```
-api "ai.djl:api:0.16.0"
-api "ai.djl:basicdataset:0.16.0"
+api "ai.djl:api:0.17.0"
+api "ai.djl:basicdataset:0.17.0"
 ```
 
 There are four parts we need to implement for CSVDataset.
diff --git a/docs/development/memory_management.md b/docs/development/memory_management.md
index 1e39862d7..2c5d8551c 100644
--- a/docs/development/memory_management.md
+++ b/docs/development/memory_management.md
@@ -37,7 +37,7 @@ The intermediate NDArrays involving in training case are usually
 
 In general, all the parameters in the model should be associated with Model level NDManager.
 All of the input and output NDArrays should be associated with one NDManager which is one level down to the model NDManager.
-Please check if you call [batch.close()](https://javadoc.io/static/ai.djl/api/0.16.0/ai/djl/training/dataset/Batch.html#close--)
+Please check if you call [batch.close()](https://javadoc.io/static/ai.djl/api/0.17.0/ai/djl/training/dataset/Batch.html#close--)
 to release one batch of the dataset at the end of each batch.
 If you still see the memory grows as the training process goes, it is most likely that intermediate NDArrays are attached to the Model(Block) parameter level.
 As a result, those NDArrays would not closed until the training is finished.
diff --git a/docs/development/troubleshooting.md b/docs/development/troubleshooting.md
index e8a0aa6d5..c884bed9b 100644
--- a/docs/development/troubleshooting.md
+++ b/docs/development/troubleshooting.md
@@ -28,7 +28,7 @@ For example, adding MXNet engine dependencies:
 Gradle:
 
 ```
-implementation "ai.djl.mxnet:mxnet-engine:0.16.0"
+implementation "ai.djl.mxnet:mxnet-engine:0.17.0"
 // See https://github.com/deepjavalibrary/djl/blob/master/engines/mxnet/mxnet-engine/README.md for more MXNet library selection options
 runtimeOnly "ai.djl.mxnet:mxnet-native-auto:1.8.0"
 ```
diff --git a/docs/forums.md b/docs/forums.md
index 010e91a90..99d95fd40 100644
--- a/docs/forums.md
+++ b/docs/forums.md
@@ -34,7 +34,7 @@ If you want to talk about the development of DJL itself, look at our [developmen
 
 ## Pull Request
 
-If you have an idea that you want to implement for changes to DJL, a bug fix, new datasets, new models, or anything else, open a new [pull request](https://github.com/deepjavalibrary/djl/compare). You can view this guide on [git and how to fork the project and make a pull request](https://guides.github.com/activities/forking/). We also have [documentation for contributors](development/README.md) that can help setup development, explain DJL coding conventions, working with DJL CI, and troubleshooting common problems.
+If you have an idea that you want to implement for changes to DJL, a bug fix, new datasets, new models, or anything else, open a new [pull request](https://github.com/deepjavalibrary/djl/compare). You can view this guide on [git and how to fork the project and make a pull request](https://docs.github.com/en/get-started/quickstart/contributing-to-projects). We also have [documentation for contributors](development/README.md) that can help setup development, explain DJL coding conventions, working with DJL CI, and troubleshooting common problems.
 
 ## Follow DJL
 
diff --git a/docs/hybrid_engine.md b/docs/hybrid_engine.md
index 31348eb81..374ad17ea 100644
--- a/docs/hybrid_engine.md
+++ b/docs/hybrid_engine.md
@@ -22,17 +22,17 @@ to run in a hybrid mode:
 To use it along with Apache MXNet for additional API support, add the following two dependencies:
 
 ```
-runtimeOnly "ai.djl.mxnet:mxnet-engine:0.16.0"
+runtimeOnly "ai.djl.mxnet:mxnet-engine:0.17.0"
 ```
 
 You can also use PyTorch or TensorFlow Engine as the supplemental engine by adding their corresponding dependencies.
 
 ```
-runtimeOnly "ai.djl.pytorch:pytorch-engine:0.16.0"
+runtimeOnly "ai.djl.pytorch:pytorch-engine:0.17.0"
 ```
 
 ```
-runtimeOnly "ai.djl.tensorflow:tensorflow-engine:0.16.0"
+runtimeOnly "ai.djl.tensorflow:tensorflow-engine:0.17.0"
 ```
 
 ## How Hybrid works
diff --git a/docs/load_model.md b/docs/load_model.md
index c7ac1ae52..b9035225a 100644
--- a/docs/load_model.md
+++ b/docs/load_model.md
@@ -130,7 +130,7 @@ Criteria<Image, Classifications> criteria = Criteria.builder()
 ZooModel<Image, Classifications> model = criteria.loadModel();
 ```
 
-You can [customize the artifactId and modelName](#customize-artifactid-and-modelname) the same way as loading model from the local file system.
+You can customize the artifactId and modelName the same way as loading model from the local file system.
 
 ### Load model from AWS S3 bucket
 DJL supports loading a model from an S3 bucket using `s3://` URL and the AWS plugin. See [here](../extensions/aws-ai/README.md) for details.
@@ -181,7 +181,7 @@ Here is a few tips you can use to help you debug model loading issue:
 See [here](development/configure_logging.md#configure-logging-level) for how to enable debug log
 
 #### List models programmatically in your code
-You can use [ModelZoo.listModels()](https://javadoc.io/static/ai.djl/api/0.16.0/ai/djl/repository/zoo/ModelZoo.html#listModels--) API to query available models.
+You can use [ModelZoo.listModels()](https://javadoc.io/static/ai.djl/api/0.17.0/ai/djl/repository/zoo/ModelZoo.html#listModels--) API to query available models.
 
 #### List available models using DJL command line
 
diff --git a/engines/dlr/dlr-engine/README.md b/engines/dlr/dlr-engine/README.md
index b16a4f5ee..ea7596c43 100644
--- a/engines/dlr/dlr-engine/README.md
+++ b/engines/dlr/dlr-engine/README.md
@@ -29,13 +29,13 @@ The javadocs output is generated in the `build/doc/javadoc` folder.
 ## Installation
 You can pull the DLR engine from the central Maven repository by including the following dependency:
 
-- ai.djl.dlr:dlr-engine:0.16.0
+- ai.djl.dlr:dlr-engine:0.17.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.dlr</groupId>
     <artifactId>dlr-engine</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/ml/xgboost/README.md b/engines/ml/xgboost/README.md
index 7319b9832..5031e90bd 100644
--- a/engines/ml/xgboost/README.md
+++ b/engines/ml/xgboost/README.md
@@ -37,13 +37,13 @@ XGBoost can only run on top of the Linux/Mac machine. User can build from source
 ## Installation
 You can pull the XGBoost engine from the central Maven repository by including the following dependency:
 
-- ai.djl.ml.xgboost:xgboost:0.16.0
+- ai.djl.ml.xgboost:xgboost:0.17.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.ml.xgboost</groupId>
     <artifactId>xgboost</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/mxnet/mxnet-engine/README.md b/engines/mxnet/mxnet-engine/README.md
index 1b9ad35e5..50d1e4df1 100644
--- a/engines/mxnet/mxnet-engine/README.md
+++ b/engines/mxnet/mxnet-engine/README.md
@@ -7,7 +7,7 @@ This module contains the Deep Java Library (DJL) EngineProvider for Apache MXNet
 We don't recommend that developers use classes in this module directly. Use of these classes
 will couple your code with Apache MXNet and make switching between engines difficult. Even so,
 developers are not restricted from using engine-specific features. For more information,
-see [NDManager#invoke()](https://javadoc.io/static/ai.djl/api/0.16.0/ai/djl/ndarray/NDManager.html#invoke-java.lang.String-ai.djl.ndarray.NDArray:A-ai.djl.ndarray.NDArray:A-ai.djl.util.PairList-).
+see [NDManager#invoke()](https://javadoc.io/static/ai.djl/api/0.17.0/ai/djl/ndarray/NDManager.html#invoke-java.lang.String-ai.djl.ndarray.NDArray:A-ai.djl.ndarray.NDArray:A-ai.djl.util.PairList-).
 
 ## Documentation
 
@@ -26,13 +26,14 @@ The javadocs output is built in the `build/doc/javadoc` folder.
 
 
 ## Installation
+
 You can pull the MXNet engine from the central Maven repository by including the following dependency:
 
 ```xml
 <dependency>
     <groupId>ai.djl.mxnet</groupId>
     <artifactId>mxnet-engine</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -43,6 +44,7 @@ It will automatically determine the appropriate jars for your system based on th
 You can choose a native library based on your platform if you don't have network access at runtime.
 
 ### macOS
+
 For macOS, you can use the following library:
 
 - ai.djl.mxnet:mxnet-native-mkl:1.8.0:osx-x86_64
@@ -59,6 +61,7 @@ For macOS, you can use the following library:
 ```
 
 ### Linux
+
 For the Linux platform, you can choose between CPU, GPU. If you have Nvidia [CUDA](https://en.wikipedia.org/wiki/CUDA)
 installed on your GPU machine, you can use one of the following library:
 
@@ -115,7 +118,7 @@ DJL on Windows, please download and install
 
 For the Windows platform, you can use CPU package. MXNet windows GPU native
 library size are large, we no longer provide GPU package, instead you have to
-use [Automatic](#automatic-(recommended)) package.
+use the Automatic package.
 
 #### Windows GPU
 
diff --git a/engines/mxnet/mxnet-engine/src/main/java/ai/djl/mxnet/engine/MxNDArray.java b/engines/mxnet/mxnet-engine/src/main/java/ai/djl/mxnet/engine/MxNDArray.java
index f786b0229..66fe02d5d 100644
--- a/engines/mxnet/mxnet-engine/src/main/java/ai/djl/mxnet/engine/MxNDArray.java
+++ b/engines/mxnet/mxnet-engine/src/main/java/ai/djl/mxnet/engine/MxNDArray.java
@@ -312,6 +312,12 @@ public class MxNDArray extends NativeResource<Pointer> implements LazyNDArray {
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public NDArray take(NDArray index) {
+        throw new UnsupportedOperationException("Not implemented yet.");
+    }
+
     /** {@inheritDoc} */
     @Override
     public void copyTo(NDArray ndArray) {
diff --git a/engines/mxnet/mxnet-model-zoo/README.md b/engines/mxnet/mxnet-model-zoo/README.md
index 9f7713a1c..f98d79b80 100644
--- a/engines/mxnet/mxnet-model-zoo/README.md
+++ b/engines/mxnet/mxnet-model-zoo/README.md
@@ -27,7 +27,7 @@ You can pull the MXNet engine from the central Maven repository by including the
 <dependency>
     <groupId>ai.djl.mxnet</groupId>
     <artifactId>mxnet-model-zoo</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
 
diff --git a/engines/onnxruntime/onnxruntime-engine/README.md b/engines/onnxruntime/onnxruntime-engine/README.md
index 900f987c9..ffcdad1c3 100644
--- a/engines/onnxruntime/onnxruntime-engine/README.md
+++ b/engines/onnxruntime/onnxruntime-engine/README.md
@@ -37,13 +37,13 @@ for the official ONNX Runtime project.
 ## Installation
 You can pull the ONNX Runtime engine from the central Maven repository by including the following dependency:
 
-- ai.djl.onnxruntime:onnxruntime-engine:0.16.0
+- ai.djl.onnxruntime:onnxruntime-engine:0.17.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.onnxruntime</groupId>
     <artifactId>onnxruntime-engine</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -61,7 +61,7 @@ Maven:
 <dependency>
     <groupId>ai.djl.onnxruntime</groupId>
     <artifactId>onnxruntime-engine</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
     <scope>runtime</scope>
     <exclusions>
         <exclusion>
@@ -80,7 +80,7 @@ Maven:
 
 Gradle:
 ```
-    implementation("ai.djl.onnxruntime:onnxruntime-engine:0.16.0") {
+    implementation("ai.djl.onnxruntime:onnxruntime-engine:0.17.0") {
         exclude group: "com.microsoft.onnxruntime", module: "onnxruntime"
     }
     implementation "com.microsoft.onnxruntime:onnxruntime_gpu:1.11.0"
diff --git a/engines/paddlepaddle/paddlepaddle-engine/README.md b/engines/paddlepaddle/paddlepaddle-engine/README.md
index 00b01641a..9f1e5a758 100644
--- a/engines/paddlepaddle/paddlepaddle-engine/README.md
+++ b/engines/paddlepaddle/paddlepaddle-engine/README.md
@@ -115,7 +115,7 @@ LD_LIBRARY_PATH=$HOME/.djl.ai/paddle/2.2.2-<cuda-flavor>-linux-x86_64
 </dependency>
 ```
 
-#### Windows GPU (Experimental)
+#### Windows GPU Experimental
 
 - ai.djl.paddlepaddle:paddlepaddle-native-cu110:2.2.2:win-x86_64
 
diff --git a/engines/paddlepaddle/paddlepaddle-model-zoo/README.md b/engines/paddlepaddle/paddlepaddle-model-zoo/README.md
index 98adc3d8f..ab5a1ac8a 100644
--- a/engines/paddlepaddle/paddlepaddle-model-zoo/README.md
+++ b/engines/paddlepaddle/paddlepaddle-model-zoo/README.md
@@ -26,7 +26,7 @@ from the central Maven repository by including the following dependency:
 <dependency>
     <groupId>ai.djl.paddlepaddle</groupId>
     <artifactId>paddlepaddle-model-zoo</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
 
diff --git a/engines/pytorch/pytorch-engine/README.md b/engines/pytorch/pytorch-engine/README.md
index f1fa8a325..0563e2968 100644
--- a/engines/pytorch/pytorch-engine/README.md
+++ b/engines/pytorch/pytorch-engine/README.md
@@ -24,13 +24,13 @@ The javadocs output is built in the `build/doc/javadoc` folder.
 ## Installation
 You can pull the PyTorch engine from the central Maven repository by including the following dependency:
 
-- ai.djl.pytorch:pytorch-engine:0.16.0
+- ai.djl.pytorch:pytorch-engine:0.17.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-engine</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -45,7 +45,8 @@ The following table illustrates which pytorch version that DJL supports:
 
 | PyTorch engine version | PyTorch native library version             |
 |------------------------|--------------------------------------------|
-| pytorch-engine:0.16.0  | pytorch-native-auto: 1.8.1, 1.9.1, 1.10.0  |
+| pytorch-engine:0.17.0  | 1.9.1, 1.10.0, 1.11.0                      |
+| pytorch-engine:0.16.0  | 1.8.1, 1.9.1, 1.10.0                       |
 | pytorch-engine:0.15.0  | pytorch-native-auto: 1.8.1, 1.9.1, 1.10.0  |
 | pytorch-engine:0.14.0  | pytorch-native-auto: 1.8.1, 1.9.0, 1.9.1   |
 | pytorch-engine:0.13.0  | pytorch-native-auto:1.9.0                  |
@@ -69,21 +70,21 @@ You can choose a native library based on your platform if you don't have network
 ### macOS
 For macOS, you can use the following library:
 
-- ai.djl.pytorch:pytorch-jni:1.10.0-0.16.0
-- ai.djl.pytorch:pytorch-native-cpu:1.10.0:osx-x86_64
+- ai.djl.pytorch:pytorch-jni:1.11.0-0.17.0
+- ai.djl.pytorch:pytorch-native-cpu:1.11.0:osx-x86_64
 
 ```xml
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-native-cpu</artifactId>
     <classifier>osx-x86_64</classifier>
-    <version>1.10.0</version>
+    <version>1.11.0</version>
     <scope>runtime</scope>
 </dependency>
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-native-jni</artifactId>
-    <version>1.10.0-0.16.0</version>
+    <version>1.11.0-0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -94,22 +95,22 @@ installed on your GPU machine, you can use one of the following library:
 
 #### Linux GPU
 
-- ai.djl.pytorch:pytorch-jni:1.10.0-0.16.0
-- ai.djl.pytorch:pytorch-native-cu113:1.10.0:linux-x86_64 - CUDA 11.3
-- ai.djl.pytorch:pytorch-native-cu102:1.10.0:linux-x86_64 - CUDA 10.2
+- ai.djl.pytorch:pytorch-jni:1.11.0-0.17.0
+- ai.djl.pytorch:pytorch-native-cu113:1.11.0:linux-x86_64 - CUDA 11.3
+- ai.djl.pytorch:pytorch-native-cu102:1.11.0:linux-x86_64 - CUDA 10.2
 
 ```xml
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-native-cu113</artifactId>
     <classifier>linux-x86_64</classifier>
-    <version>1.10.0</version>
+    <version>1.11.0</version>
     <scope>runtime</scope>
 </dependency>
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>1.10.0-0.16.0</version>
+    <version>1.11.0-0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -119,21 +120,21 @@ installed on your GPU machine, you can use one of the following library:
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-native-cu102</artifactId>
     <classifier>linux-x86_64</classifier>
-    <version>1.10.0</version>
+    <version>1.11.0</version>
     <scope>runtime</scope>
 </dependency>
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>1.10.0-0.16.0</version>
+    <version>1.11.0-0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
 
 ### Linux CPU
 
-- ai.djl.pytorch:pytorch-jni:1.10.0-0.16.0
-- ai.djl.pytorch:pytorch-native-cpu:1.10.0:linux-x86_64
+- ai.djl.pytorch:pytorch-jni:1.11.0-0.17.0
+- ai.djl.pytorch:pytorch-native-cpu:1.11.0:linux-x86_64
 
 ```xml
 <dependency>
@@ -141,12 +142,33 @@ installed on your GPU machine, you can use one of the following library:
     <artifactId>pytorch-native-cpu</artifactId>
     <classifier>linux-x86_64</classifier>
     <scope>runtime</scope>
-    <version>1.10.0</version>
+    <version>1.11.0</version>
 </dependency>
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>1.10.0-0.16.0</version>
+    <version>1.11.0-0.17.0</version>
+    <scope>runtime</scope>
+</dependency>
+```
+
+### For aarch64 build
+
+- ai.djl.pytorch:pytorch-jni:1.11.0-0.17.0
+- ai.djl.pytorch:pytorch-native-cpu-precxx11:1.11.0:linux-aarch64
+
+```xml
+<dependency>
+    <groupId>ai.djl.pytorch</groupId>
+    <artifactId>pytorch-native-cpu-precxx11</artifactId>
+    <classifier>linux-aarch64</classifier>
+    <scope>runtime</scope>
+    <version>1.11.0</version>
+</dependency>
+<dependency>
+    <groupId>ai.djl.pytorch</groupId>
+    <artifactId>pytorch-jni</artifactId>
+    <version>1.11.0-0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -156,22 +178,22 @@ installed on your GPU machine, you can use one of the following library:
 We also provide packages for the system like CentOS 7/Ubuntu 14.04 with GLIBC >= 2.17.
 All the package were built with GCC 7, we provided a newer `libstdc++.so.6.24` in the package that contains `CXXABI_1.3.9` to use the package successfully.
 
-- ai.djl.pytorch:pytorch-jni:1.10.0-0.16.0
-- ai.djl.pytorch:pytorch-native-cu113-precxx11:1.10.0:linux-x86_64 - CUDA 11.3
-- ai.djl.pytorch:pytorch-native-cpu-precxx11:1.10.0:linux-x86_64   - CPU
+- ai.djl.pytorch:pytorch-jni:1.11.0-0.17.0
+- ai.djl.pytorch:pytorch-native-cu113-precxx11:1.11.0:linux-x86_64 - CUDA 11.3
+- ai.djl.pytorch:pytorch-native-cpu-precxx11:1.11.0:linux-x86_64   - CPU
 
 ```xml
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-native-cu113-precxx11</artifactId>
     <classifier>linux-x86_64</classifier>
-    <version>1.10.0</version>
+    <version>1.11.0</version>
     <scope>runtime</scope>
 </dependency>
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>1.10.0-0.16.0</version>
+    <version>1.11.0-0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -181,13 +203,13 @@ All the package were built with GCC 7, we provided a newer `libstdc++.so.6.24` i
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-native-cpu-precxx11</artifactId>
     <classifier>linux-x86_64</classifier>
-    <version>1.10.0</version>
+    <version>1.11.0</version>
     <scope>runtime</scope>
 </dependency>
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>1.10.0-0.16.0</version>
+    <version>1.11.0-0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -202,22 +224,22 @@ For the Windows platform, you can choose between CPU and GPU.
 
 #### Windows GPU
 
-- ai.djl.pytorch:pytorch-jni:1.10.0-0.16.0
-- ai.djl.pytorch:pytorch-native-cu113:1.10.0:win-x86_64
-- ai.djl.pytorch:pytorch-native-cu102:1.10.0:win-x86_64
+- ai.djl.pytorch:pytorch-jni:1.11.0-0.17.0
+- ai.djl.pytorch:pytorch-native-cu113:1.11.0:win-x86_64
+- ai.djl.pytorch:pytorch-native-cu102:1.11.0:win-x86_64
 
 ```xml
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-native-cu113</artifactId>
     <classifier>win-x86_64</classifier>
-    <version>1.10.0</version>
+    <version>1.11.0</version>
     <scope>runtime</scope>
 </dependency>
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>1.10.0-0.16.0</version>
+    <version>1.11.0-0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -227,21 +249,21 @@ For the Windows platform, you can choose between CPU and GPU.
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-native-cu102</artifactId>
     <classifier>win-x86_64</classifier>
-    <version>1.10.0</version>
+    <version>1.11.0</version>
     <scope>runtime</scope>
 </dependency>
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>1.10.0-0.16.0</version>
+    <version>1.11.0-0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
 
 ### Windows CPU
 
-- ai.djl.pytorch:pytorch-jni:1.10.0-0.16.0
-- ai.djl.pytorch:pytorch-native-cpu:1.10.0:win-x86_64
+- ai.djl.pytorch:pytorch-jni:1.11.0-0.17.0
+- ai.djl.pytorch:pytorch-native-cpu:1.11.0:win-x86_64
 
 ```xml
 <dependency>
@@ -249,12 +271,12 @@ For the Windows platform, you can choose between CPU and GPU.
     <artifactId>pytorch-native-cpu</artifactId>
     <classifier>win-x86_64</classifier>
     <scope>runtime</scope>
-    <version>1.10.0</version>
+    <version>1.11.0</version>
 </dependency>
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>1.10.0-0.16.0</version>
+    <version>1.11.0-0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/engine/PtNDArray.java b/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/engine/PtNDArray.java
index a1cacb83e..a8944cd92 100644
--- a/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/engine/PtNDArray.java
+++ b/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/engine/PtNDArray.java
@@ -248,6 +248,15 @@ public class PtNDArray extends NativeResource<Long> implements NDArray {
         return JniUtils.gather(this, (PtNDArray) index, axis);
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public NDArray take(NDArray index) {
+        if (!(index instanceof PtNDArray)) {
+            throw new IllegalArgumentException("Only PtNDArray is supported.");
+        }
+        return JniUtils.take(this, (PtNDArray) index);
+    }
+
     /** {@inheritDoc} */
     @Override
     public void copyTo(NDArray array) {
diff --git a/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/jni/JniUtils.java b/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/jni/JniUtils.java
index a11719612..5d0f21b61 100644
--- a/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/jni/JniUtils.java
+++ b/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/jni/JniUtils.java
@@ -347,11 +347,23 @@ public final class JniUtils {
     }
 
     public static PtNDArray gather(PtNDArray ndArray, PtNDArray index, long dim) {
+        if (index.getDataType() != DataType.INT64) {
+            index = index.toType(DataType.INT64, true);
+        }
         return new PtNDArray(
                 ndArray.getManager(),
                 PyTorchLibrary.LIB.torchGather(ndArray.getHandle(), index.getHandle(), dim, false));
     }
 
+    public static PtNDArray take(PtNDArray ndArray, PtNDArray index) {
+        if (index.getDataType() != DataType.INT64) {
+            index = index.toType(DataType.INT64, true);
+        }
+        return new PtNDArray(
+                ndArray.getManager(),
+                PyTorchLibrary.LIB.torchTake(ndArray.getHandle(), index.getHandle()));
+    }
+
     public static PtNDArray pick(PtNDArray ndArray, PtNDArray index, long dim) {
         Shape indexShape = index.getShape();
         Shape ndShape = ndArray.getShape();
diff --git a/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/jni/PyTorchLibrary.java b/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/jni/PyTorchLibrary.java
index 63317cb81..7bee9f7ab 100644
--- a/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/jni/PyTorchLibrary.java
+++ b/engines/pytorch/pytorch-engine/src/main/java/ai/djl/pytorch/jni/PyTorchLibrary.java
@@ -198,6 +198,8 @@ final class PyTorchLibrary {
 
     native long torchGather(long handle, long index, long dim, boolean sparseGrad);
 
+    native long torchTake(long handle, long index);
+
     native long torchMaskedSelect(long handle, long maskHandle);
 
     native void torchMaskedPut(long handle, long valueHandle, long maskHandle);
diff --git a/engines/pytorch/pytorch-model-zoo/README.md b/engines/pytorch/pytorch-model-zoo/README.md
index 0f77dd3a5..fd9a973c1 100644
--- a/engines/pytorch/pytorch-model-zoo/README.md
+++ b/engines/pytorch/pytorch-model-zoo/README.md
@@ -25,7 +25,7 @@ You can pull the PyTorch engine from the central Maven repository by including t
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-model-zoo</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
 
diff --git a/engines/pytorch/pytorch-native/build.gradle b/engines/pytorch/pytorch-native/build.gradle
index 77fb51840..66e3e7917 100644
--- a/engines/pytorch/pytorch-native/build.gradle
+++ b/engines/pytorch/pytorch-native/build.gradle
@@ -76,6 +76,10 @@ def downloadBuildAndroid(String ver) {
 }
 
 def prepareNativeLib(String binaryRoot, String ver) {
+    if (!System.properties['os.name'].toLowerCase(Locale.ROOT).contains("mac")) {
+        throw new GradleException("This command must be run from osx")
+    }
+
     def officialPytorchUrl = "https://download.pytorch.org/libtorch"
     def aarch64PytorchUrl = "https://djl-ai.s3.amazonaws.com/publish/pytorch"
     String cu11
@@ -102,6 +106,14 @@ def prepareNativeLib(String binaryRoot, String ver) {
 
     copyNativeLibToOutputDir(files, binaryRoot, officialPytorchUrl)
     copyNativeLibToOutputDir(aarch64Files, binaryRoot, aarch64PytorchUrl)
+
+
+    exec {
+        commandLine 'install_name_tool', '-add_rpath', '@loader_path', "${binaryRoot}/cpu/osx-x86_64/native/lib/libtorch_cpu.dylib"
+    }
+    exec {
+        commandLine 'install_name_tool', '-add_rpath', '@loader_path', "${binaryRoot}/cpu/osx-x86_64/native/lib/libtorch.dylib"
+    }
 }
 
 def copyNativeLibToOutputDir(Map<String, String> fileStoreMap, String binaryRoot, String url) {
diff --git a/engines/pytorch/pytorch-native/src/main/native/ai_djl_pytorch_jni_PyTorchLibrary_tensor.cc b/engines/pytorch/pytorch-native/src/main/native/ai_djl_pytorch_jni_PyTorchLibrary_tensor.cc
index 6ec0bf3c9..0e876784b 100644
--- a/engines/pytorch/pytorch-native/src/main/native/ai_djl_pytorch_jni_PyTorchLibrary_tensor.cc
+++ b/engines/pytorch/pytorch-native/src/main/native/ai_djl_pytorch_jni_PyTorchLibrary_tensor.cc
@@ -176,6 +176,16 @@ JNIEXPORT jlong JNICALL Java_ai_djl_pytorch_jni_PyTorchLibrary_torchGather(
   API_END_RETURN()
 }
 
+JNIEXPORT jlong JNICALL Java_ai_djl_pytorch_jni_PyTorchLibrary_torchTake(
+    JNIEnv* env, jobject jthis, jlong jhandle, jlong jindex_handle) {
+  API_BEGIN()
+  const auto* tensor_ptr = reinterpret_cast<torch::Tensor*>(jhandle);
+  const auto* index_ptr = reinterpret_cast<torch::Tensor*>(jindex_handle);
+  const auto* result_ptr = new torch::Tensor(tensor_ptr->take(*index_ptr));
+  return reinterpret_cast<uintptr_t>(result_ptr);
+  API_END_RETURN()  
+}
+
 JNIEXPORT jlong JNICALL Java_ai_djl_pytorch_jni_PyTorchLibrary_torchMaskedSelect(
     JNIEnv* env, jobject jthis, jlong jhandle, jlong jmasked_handle) {
   API_BEGIN()
diff --git a/engines/tensorflow/tensorflow-api/README.md b/engines/tensorflow/tensorflow-api/README.md
index 3bca85f54..343a0271a 100644
--- a/engines/tensorflow/tensorflow-api/README.md
+++ b/engines/tensorflow/tensorflow-api/README.md
@@ -16,6 +16,6 @@ You can pull the TensorFlow core java API from the central Maven repository by i
 <dependency>
     <groupId>ai.djl.tensorflow</groupId>
     <artifactId>tensorflow-api</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
diff --git a/engines/tensorflow/tensorflow-engine/README.md b/engines/tensorflow/tensorflow-engine/README.md
index 840a3e35d..3ab09d45a 100644
--- a/engines/tensorflow/tensorflow-engine/README.md
+++ b/engines/tensorflow/tensorflow-engine/README.md
@@ -28,13 +28,13 @@ The javadocs output is built in the `build/doc/javadoc` folder.
 
 You can pull the TensorFlow engine from the central Maven repository by including the following dependency:
 
-- ai.djl.tensorflow:tensorflow-engine:0.16.0
+- ai.djl.tensorflow:tensorflow-engine:0.17.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.tensorflow</groupId>
     <artifactId>tensorflow-engine</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/TfNDArray.java b/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/TfNDArray.java
index 026680b97..421cd1fe7 100644
--- a/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/TfNDArray.java
+++ b/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/TfNDArray.java
@@ -212,6 +212,12 @@ public class TfNDArray extends NativeResource<TFE_TensorHandle> implements NDArr
         throw new UnsupportedOperationException("Not implemented yet.");
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public NDArray take(NDArray index) {
+        throw new UnsupportedOperationException("Not implemented yet.");
+    }
+
     /** {@inheritDoc} */
     @Override
     public void attach(NDManager manager) {
diff --git a/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/javacpp/JavacppUtils.java b/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/javacpp/JavacppUtils.java
index d114186f7..18bd6153b 100644
--- a/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/javacpp/JavacppUtils.java
+++ b/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/javacpp/JavacppUtils.java
@@ -425,7 +425,9 @@ public final class JavacppUtils {
                     tensorflow.TFE_TensorHandleCopyToDevice(
                             handle, eagerSessionHandle, deviceName, status);
             status.throwExceptionIfNotOK();
-            return newHandle;
+            // C API does not have deallocator by default
+            newHandle.withDeallocator();
+            return newHandle.retainReference();
         }
     }
 
diff --git a/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/javacpp/LibUtils.java b/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/javacpp/LibUtils.java
index 42d8d96cd..bf818cad9 100644
--- a/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/javacpp/LibUtils.java
+++ b/engines/tensorflow/tensorflow-engine/src/main/java/ai/djl/tensorflow/engine/javacpp/LibUtils.java
@@ -175,8 +175,8 @@ public final class LibUtils {
             boolean found = downloadFiles(lines, link, os, flavor, tmp);
             if (!found && cudaArch != null) {
                 // fallback to cpu
-                flavor = "cpu";
-                dir = cacheDir.resolve(version + '-' + flavor + '-' + classifier);
+                String cpuFlavor = "cpu";
+                dir = cacheDir.resolve(version + '-' + cpuFlavor + '-' + classifier);
                 path = dir.resolve(libName);
                 if (Files.exists(path)) {
                     logger.warn(
diff --git a/engines/tensorflow/tensorflow-model-zoo/README.md b/engines/tensorflow/tensorflow-model-zoo/README.md
index a949aa87c..881997de5 100644
--- a/engines/tensorflow/tensorflow-model-zoo/README.md
+++ b/engines/tensorflow/tensorflow-model-zoo/README.md
@@ -26,7 +26,7 @@ from the central Maven repository by including the following dependency:
 <dependency>
     <groupId>ai.djl.tensorflow</groupId>
     <artifactId>tensorflow-model-zoo</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
 
diff --git a/engines/tensorrt/README.md b/engines/tensorrt/README.md
index 40a68f885..744fe5989 100644
--- a/engines/tensorrt/README.md
+++ b/engines/tensorrt/README.md
@@ -28,13 +28,13 @@ The javadocs output is generated in the `build/doc/javadoc` folder.
 ## Installation
 You can pull the TensorRT engine from the central Maven repository by including the following dependency:
 
-- ai.djl.tensorrt:tensorrt:0.16.0
+- ai.djl.tensorrt:tensorrt:0.17.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.tensorrt</groupId>
     <artifactId>tensorrt</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/tflite/tflite-engine/README.md b/engines/tflite/tflite-engine/README.md
index a9de9d350..54bf58217 100644
--- a/engines/tflite/tflite-engine/README.md
+++ b/engines/tflite/tflite-engine/README.md
@@ -24,13 +24,13 @@ The javadocs output is built in the `build/doc/javadoc` folder.
 ## Installation
 You can pull the TensorFlow Lite engine from the central Maven repository by including the following dependency:
 
-- ai.djl.tflite:tflite-engine:0.16.0
+- ai.djl.tflite:tflite-engine:0.17.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.tflite</groupId>
     <artifactId>tflite-engine</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/examples/pom.xml b/examples/pom.xml
index 6973b189c..975d6c563 100644
--- a/examples/pom.xml
+++ b/examples/pom.xml
@@ -5,12 +5,12 @@
 
     <groupId>ai.djl</groupId>
     <artifactId>examples</artifactId>
-    <version>0.17.0-SNAPSHOT</version>
+    <version>0.18.0-SNAPSHOT</version>
 
     <properties>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
-        <djl.version>0.17.0-SNAPSHOT</djl.version>
+        <djl.version>0.18.0-SNAPSHOT</djl.version>
         <exec.mainClass>ai.djl.examples.inference.ObjectDetection</exec.mainClass>
     </properties>
 
diff --git a/extensions/aws-ai/README.md b/extensions/aws-ai/README.md
index 3493c6848..ca57eefa6 100644
--- a/extensions/aws-ai/README.md
+++ b/extensions/aws-ai/README.md
@@ -58,6 +58,6 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl.aws</groupId>
     <artifactId>aws-ai</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
diff --git a/extensions/benchmark/README.md b/extensions/benchmark/README.md
index 4fcb70a0f..ab3a8ab0f 100644
--- a/extensions/benchmark/README.md
+++ b/extensions/benchmark/README.md
@@ -48,25 +48,25 @@ sudo snap alias djlbench djl-bench
 - Or download .deb package from S3
 
 ```
-curl -O https://publish.djl.ai/djl-bench/0.16.0/djl-bench_0.16.0-1_all.deb
-sudo dpkg -i djl-bench_0.16.0-1_all.deb
+curl -O https://publish.djl.ai/djl-bench/0.17.0/djl-bench_0.17.0-1_all.deb
+sudo dpkg -i djl-bench_0.17.0-1_all.deb
 ```
 
 For centOS or Amazon Linux 2
 
-You can download djl-bench zip file from [here](https://publish.djl.ai/djl-bench/0.16.0/benchmark-0.16.0.zip).
+You can download djl-bench zip file from [here](https://publish.djl.ai/djl-bench/0.17.0/benchmark-0.17.0.zip).
 
 ```
-curl -O https://publish.djl.ai/djl-bench/0.16.0/benchmark-0.16.0.zip
-unzip benchmark-0.16.0.zip
-rm benchmark-0.16.0.zip
-sudo ln -s $PWD/benchmark-0.16.0/bin/benchmark /usr/bin/djl-bench
+curl -O https://publish.djl.ai/djl-bench/0.17.0/benchmark-0.17.0.zip
+unzip benchmark-0.17.0.zip
+rm benchmark-0.17.0.zip
+sudo ln -s $PWD/benchmark-0.17.0/bin/benchmark /usr/bin/djl-bench
 ```
 
 For Windows
 
 We are considering to create a `chocolatey` package for Windows. For the time being, you can
-download djl-bench zip file from [here](https://publish.djl.ai/djl-bench/0.16.0/benchmark-0.16.0.zip).
+download djl-bench zip file from [here](https://publish.djl.ai/djl-bench/0.17.0/benchmark-0.17.0.zip).
 
 Or you can run benchmark using gradle:
 
@@ -77,6 +77,7 @@ gradlew benchmark --args="--help"
 ```
 
 ## Prerequisite
+
 Please ensure Java 8+ is installed and you are using an OS that DJL supported with.
 
 After that, you need to clone the djl project and `cd` into the folder.
@@ -93,6 +94,7 @@ If you are trying to use GPU, please ensure the CUDA driver is installed. You ca
 ```
 nvcc -V
 ```
+
 to checkout the version. For different Deep Learning engine you are trying to run the benchmark,
 they have different CUDA version to support. Please check the individual Engine documentation to ensure your CUDA version is supported.
 
@@ -289,6 +291,7 @@ You can also do multi-threading inference with DJL. For example, if you would li
 ```
 -t 10
 ```
+
 Best thread number for your system: The same number of cores your system have or double of the total cores.
 
 You can also add `-l` to simulate the increment load for your inference server. It will add threads with the delay of time.
diff --git a/extensions/benchmark/snapcraft/snapcraft.yaml b/extensions/benchmark/snapcraft/snapcraft.yaml
index b4b6a691d..afa85c747 100644
--- a/extensions/benchmark/snapcraft/snapcraft.yaml
+++ b/extensions/benchmark/snapcraft/snapcraft.yaml
@@ -1,5 +1,5 @@
 name: djlbench
-version: '0.16.0'
+version: '0.17.0'
 title: DJL Benhmark
 license: Apache-2.0
 summary: A machine learning benchmarking toolkit
diff --git a/extensions/fasttext/README.md b/extensions/fasttext/README.md
index 9063c64b5..0aba6a866 100644
--- a/extensions/fasttext/README.md
+++ b/extensions/fasttext/README.md
@@ -34,7 +34,7 @@ You can pull the fastText engine from the central Maven repository by including
 <dependency>
     <groupId>ai.djl.fasttext</groupId>
     <artifactId>fasttext-engine</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
 
diff --git a/extensions/hadoop/README.md b/extensions/hadoop/README.md
index f5a562684..cf117981e 100644
--- a/extensions/hadoop/README.md
+++ b/extensions/hadoop/README.md
@@ -52,6 +52,6 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl.hadoop</groupId>
     <artifactId>hadoop</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
diff --git a/extensions/opencv/README.md b/extensions/opencv/README.md
index f296bd0ba..62d47f133 100644
--- a/extensions/opencv/README.md
+++ b/extensions/opencv/README.md
@@ -21,6 +21,6 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl.opencv</groupId>
     <artifactId>opencv</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
diff --git a/extensions/sentencepiece/README.md b/extensions/sentencepiece/README.md
index 099864cb4..d850b336d 100644
--- a/extensions/sentencepiece/README.md
+++ b/extensions/sentencepiece/README.md
@@ -21,6 +21,6 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl.sentencepiece</groupId>
     <artifactId>sentencepiece</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
diff --git a/extensions/tokenizers/README.md b/extensions/tokenizers/README.md
index 33846eaca..256f57412 100644
--- a/extensions/tokenizers/README.md
+++ b/extensions/tokenizers/README.md
@@ -21,6 +21,6 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl.huggingface</groupId>
     <artifactId>tokenizers</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
diff --git a/gradle.properties b/gradle.properties
index a1442062b..ef8fc8506 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -7,7 +7,7 @@ systemProp.org.gradle.internal.http.connectionTimeout=60000
 # FIXME: Workaround gradle publish issue: https://github.com/gradle/gradle/issues/11308
 systemProp.org.gradle.internal.publish.checksums.insecure=true
 
-djl_version=0.17.0
+djl_version=0.18.0
 mxnet_version=1.9.0
 pytorch_version=1.11.0
 tensorflow_version=2.7.0
diff --git a/jupyter/BERTQA.ipynb b/jupyter/BERTQA.ipynb
index 7b7dcd9db..4eedc4190 100644
--- a/jupyter/BERTQA.ipynb
+++ b/jupyter/BERTQA.ipynb
@@ -46,11 +46,11 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.16.0\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.16.0\n",
-    "%maven ai.djl.pytorch:pytorch-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.17.0\n",
+    "%maven ai.djl.pytorch:pytorch-engine:0.17.0\n",
+    "%maven ai.djl.pytorch:pytorch-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/load_mxnet_model.ipynb b/jupyter/load_mxnet_model.ipynb
index 4a73ee6e9..4031a926c 100644
--- a/jupyter/load_mxnet_model.ipynb
+++ b/jupyter/load_mxnet_model.ipynb
@@ -22,10 +22,10 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl:model-zoo:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl:model-zoo:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/load_pytorch_model.ipynb b/jupyter/load_pytorch_model.ipynb
index 7fbe6df1e..13ceb96fb 100644
--- a/jupyter/load_pytorch_model.ipynb
+++ b/jupyter/load_pytorch_model.ipynb
@@ -25,8 +25,8 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.pytorch:pytorch-engine:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
@@ -106,7 +106,7 @@
     "...\n",
     "```\n",
     "\n",
-    "Then, we will use this pipeline to create the [`Translator`](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/translate/Translator.html)"
+    "Then, we will use this pipeline to create the [`Translator`](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/translate/Translator.html)"
    ]
   },
   {
diff --git a/jupyter/mxnet/load_your_own_mxnet_bert.ipynb b/jupyter/mxnet/load_your_own_mxnet_bert.ipynb
index 2031e18bd..338b7446f 100644
--- a/jupyter/mxnet/load_your_own_mxnet_bert.ipynb
+++ b/jupyter/mxnet/load_your_own_mxnet_bert.ipynb
@@ -41,9 +41,9 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
@@ -310,7 +310,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Armed with the needed knowledge, you can write an implementation of the `Translator` interface. `BertTranslator` uses the code snippets explained previously to implement the `processInput`method. For more information, see [`NDManager`](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/ndarray/NDManager.html).\n",
+    "Armed with the needed knowledge, you can write an implementation of the `Translator` interface. `BertTranslator` uses the code snippets explained previously to implement the `processInput`method. For more information, see [`NDManager`](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/ndarray/NDManager.html).\n",
     "\n",
     "```\n",
     "manager.create(Number[] data, Shape)\n",
@@ -389,7 +389,7 @@
    "source": [
     "Congrats! You have created your first Translator! We have pre-filled the `processOutput()` function to process the `NDList` and return it in a desired format. `processInput()` and `processOutput()` offer the flexibility to get the predictions from the model in any format you desire. \n",
     "\n",
-    "With the Translator implemented, you need to bring up the predictor that uses your `Translator` to start making predictions. You can find the usage for `Predictor` in the [Predictor Javadoc](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/inference/Predictor.html). Create a translator and use the `question` and `resourceDocument` provided previously."
+    "With the Translator implemented, you need to bring up the predictor that uses your `Translator` to start making predictions. You can find the usage for `Predictor` in the [Predictor Javadoc](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/inference/Predictor.html). Create a translator and use the `question` and `resourceDocument` provided previously."
    ]
   },
   {
diff --git a/jupyter/object_detection_with_model_zoo.ipynb b/jupyter/object_detection_with_model_zoo.ipynb
index 6e0b718c6..5cd661115 100644
--- a/jupyter/object_detection_with_model_zoo.ipynb
+++ b/jupyter/object_detection_with_model_zoo.ipynb
@@ -21,9 +21,9 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/onnxruntime/machine_learning_with_ONNXRuntime.ipynb b/jupyter/onnxruntime/machine_learning_with_ONNXRuntime.ipynb
index 9e77ac6fa..73611c2c8 100644
--- a/jupyter/onnxruntime/machine_learning_with_ONNXRuntime.ipynb
+++ b/jupyter/onnxruntime/machine_learning_with_ONNXRuntime.ipynb
@@ -54,8 +54,8 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.onnxruntime:onnxruntime-engine:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.onnxruntime:onnxruntime-engine:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/paddlepaddle/face_mask_detection_paddlepaddle.ipynb b/jupyter/paddlepaddle/face_mask_detection_paddlepaddle.ipynb
index a5c778d9c..f4a55b009 100644
--- a/jupyter/paddlepaddle/face_mask_detection_paddlepaddle.ipynb
+++ b/jupyter/paddlepaddle/face_mask_detection_paddlepaddle.ipynb
@@ -26,12 +26,12 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32\n",
     "\n",
     "// second engine to do preprocessing and postprocessing\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.16.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.17.0"
    ]
   },
   {
diff --git a/jupyter/paddlepaddle/face_mask_detection_paddlepaddle_zh.ipynb b/jupyter/paddlepaddle/face_mask_detection_paddlepaddle_zh.ipynb
index 4afd631e7..4a1271cae 100644
--- a/jupyter/paddlepaddle/face_mask_detection_paddlepaddle_zh.ipynb
+++ b/jupyter/paddlepaddle/face_mask_detection_paddlepaddle_zh.ipynb
@@ -24,12 +24,12 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32\n",
     "\n",
     "// second engine to do preprocessing and postprocessing\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.16.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.17.0"
    ]
   },
   {
diff --git a/jupyter/paddlepaddle/paddle_ocr_java.ipynb b/jupyter/paddlepaddle/paddle_ocr_java.ipynb
index c75842eb6..7836ba876 100644
--- a/jupyter/paddlepaddle/paddle_ocr_java.ipynb
+++ b/jupyter/paddlepaddle/paddle_ocr_java.ipynb
@@ -25,12 +25,12 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32\n",
     "\n",
     "// second engine to do preprocessing and postprocessing\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.16.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.17.0"
    ]
   },
   {
diff --git a/jupyter/paddlepaddle/paddle_ocr_java_zh.ipynb b/jupyter/paddlepaddle/paddle_ocr_java_zh.ipynb
index aca169821..bcb27e2e9 100644
--- a/jupyter/paddlepaddle/paddle_ocr_java_zh.ipynb
+++ b/jupyter/paddlepaddle/paddle_ocr_java_zh.ipynb
@@ -23,12 +23,12 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32\n",
     "\n",
     "// second engine to do preprocessing and postprocessing\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.16.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.17.0"
    ]
   },
   {
diff --git a/jupyter/pytorch/load_your_own_pytorch_bert.ipynb b/jupyter/pytorch/load_your_own_pytorch_bert.ipynb
index 305a52b5d..9964662be 100644
--- a/jupyter/pytorch/load_your_own_pytorch_bert.ipynb
+++ b/jupyter/pytorch/load_your_own_pytorch_bert.ipynb
@@ -41,9 +41,9 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.16.0\n",
-    "%maven ai.djl.pytorch:pytorch-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.pytorch:pytorch-engine:0.17.0\n",
+    "%maven ai.djl.pytorch:pytorch-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
@@ -272,7 +272,7 @@
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Armed with the needed knowledge, you can write an implementation of the `Translator` interface. `BertTranslator` uses the code snippets explained previously to implement the `processInput`method. For more information, see [`NDManager`](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/ndarray/NDManager.html).\n",
+    "Armed with the needed knowledge, you can write an implementation of the `Translator` interface. `BertTranslator` uses the code snippets explained previously to implement the `processInput`method. For more information, see [`NDManager`](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/ndarray/NDManager.html).\n",
     "\n",
     "```\n",
     "manager.create(Number[] data, Shape)\n",
@@ -345,7 +345,7 @@
    "source": [
     "Congrats! You have created your first Translator! We have pre-filled the `processOutput()` function to process the `NDList` and return it in a desired format. `processInput()` and `processOutput()` offer the flexibility to get the predictions from the model in any format you desire. \n",
     "\n",
-    "With the Translator implemented, you need to bring up the predictor that uses your `Translator` to start making predictions. You can find the usage for `Predictor` in the [Predictor Javadoc](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/inference/Predictor.html). Create a translator and use the `question` and `resourceDocument` provided previously."
+    "With the Translator implemented, you need to bring up the predictor that uses your `Translator` to start making predictions. You can find the usage for `Predictor` in the [Predictor Javadoc](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/inference/Predictor.html). Create a translator and use the `question` and `resourceDocument` provided previously."
    ]
   },
   {
diff --git a/jupyter/rank_classification_using_BERT_on_Amazon_Review.ipynb b/jupyter/rank_classification_using_BERT_on_Amazon_Review.ipynb
index b8d50006c..24c1adf32 100644
--- a/jupyter/rank_classification_using_BERT_on_Amazon_Review.ipynb
+++ b/jupyter/rank_classification_using_BERT_on_Amazon_Review.ipynb
@@ -38,13 +38,13 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl:basicdataset:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl:basicdataset:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.16.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.17.0\n",
     "\n",
     "// PyTorch\n",
-    "// %maven ai.djl.pytorch:pytorch-model-zoo:0.16.0"
+    "// %maven ai.djl.pytorch:pytorch-model-zoo:0.17.0"
    ]
   },
   {
diff --git a/jupyter/tensorflow/pneumonia_detection.ipynb b/jupyter/tensorflow/pneumonia_detection.ipynb
index d8bdbdb8c..97118bfee 100644
--- a/jupyter/tensorflow/pneumonia_detection.ipynb
+++ b/jupyter/tensorflow/pneumonia_detection.ipynb
@@ -36,10 +36,10 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-api:0.16.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-engine:0.16.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-api:0.17.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-engine:0.17.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/tensorflow/rank_classification_using_BERT_on_Amazon_Review.ipynb b/jupyter/tensorflow/rank_classification_using_BERT_on_Amazon_Review.ipynb
index e1fcfe601..075b8e9e8 100644
--- a/jupyter/tensorflow/rank_classification_using_BERT_on_Amazon_Review.ipynb
+++ b/jupyter/tensorflow/rank_classification_using_BERT_on_Amazon_Review.ipynb
@@ -36,9 +36,9 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-engine:0.16.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-api:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-engine:0.17.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-api:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/tensorflow_lite/inference_with_tensorflow_lite.ipynb b/jupyter/tensorflow_lite/inference_with_tensorflow_lite.ipynb
index c09fc0bf4..e98c6f1f1 100644
--- a/jupyter/tensorflow_lite/inference_with_tensorflow_lite.ipynb
+++ b/jupyter/tensorflow_lite/inference_with_tensorflow_lite.ipynb
@@ -22,13 +22,13 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl:model-zoo:0.16.0\n",
-    "%maven ai.djl.tflite:tflite-engine:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl:model-zoo:0.17.0\n",
+    "%maven ai.djl.tflite:tflite-engine:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32\n",
     "\n",
     "// Use secondary engine to help pre-processing and post-processing\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.16.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.17.0"
    ]
   },
   {
diff --git a/jupyter/transfer_learning_on_cifar10.ipynb b/jupyter/transfer_learning_on_cifar10.ipynb
index dfbc409a9..d65cc7a17 100644
--- a/jupyter/transfer_learning_on_cifar10.ipynb
+++ b/jupyter/transfer_learning_on_cifar10.ipynb
@@ -35,10 +35,10 @@
    "source": [
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl:basicdataset:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl:basicdataset:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/tutorial/01_create_your_first_network.ipynb b/jupyter/tutorial/01_create_your_first_network.ipynb
index 35949f26d..55b62459d 100644
--- a/jupyter/tutorial/01_create_your_first_network.ipynb
+++ b/jupyter/tutorial/01_create_your_first_network.ipynb
@@ -27,7 +27,7 @@
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
     "// Add the maven dependencies\n",
-    "%maven ai.djl:api:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
@@ -53,7 +53,7 @@
     "\n",
     "## Application\n",
     "\n",
-    "The first thing to figure out when trying to build a neural network, like building most functions, is what your function signature is. What are your input types and output types? Because most models use relatively consistent signatures, we refer to them as [Applications](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/Application.html). Within the Applications interface, you can find a list of some of the more common model applications used in deep learning.\n",
+    "The first thing to figure out when trying to build a neural network, like building most functions, is what your function signature is. What are your input types and output types? Because most models use relatively consistent signatures, we refer to them as [Applications](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/Application.html). Within the Applications interface, you can find a list of some of the more common model applications used in deep learning.\n",
     "\n",
     "In this tutorial, we will focus on the image classification application. It is one of the most common first applications and has a significant history with deep learning. In image classification, the input is a single image and it is classified based on the main subject of the image into a number of different possible classes. The classes for the image depend on the specific data you are training with."
    ]
@@ -83,7 +83,7 @@
     "\n",
     "![Mnist Image](https://upload.wikimedia.org/wikipedia/commons/2/27/MnistExamples.png)\n",
     "\n",
-    "Once you understand your dataset, you should create an implementation of the [Dataset class](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/dataset/Dataset.html). In this case, we provide the MNIST dataset built-in to make it easy for you to use it.\n",
+    "Once you understand your dataset, you should create an implementation of the [Dataset class](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/dataset/Dataset.html). In this case, we provide the MNIST dataset built-in to make it easy for you to use it.\n",
     "\n",
     "## Multilayer Perceptron\n",
     "\n",
@@ -123,16 +123,16 @@
     "\n",
     "### NDArray\n",
     "\n",
-    "The core data type used for working with deep learning is the [NDArray](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/ndarray/NDArray.html). An NDArray represents a multidimensional, fixed-size homogeneous array. It has very similar behavior to the Numpy python package with the addition of efficient computing. We also have a helper class, the [NDList](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/ndarray/NDList.html) which is a list of NDArrays which can have different sizes and data types.\n",
+    "The core data type used for working with deep learning is the [NDArray](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/ndarray/NDArray.html). An NDArray represents a multidimensional, fixed-size homogeneous array. It has very similar behavior to the Numpy python package with the addition of efficient computing. We also have a helper class, the [NDList](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/ndarray/NDList.html) which is a list of NDArrays which can have different sizes and data types.\n",
     "\n",
     "### Block API\n",
     "\n",
-    "In DJL, [Blocks](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/nn/Block.html) serve a purpose similar to functions that convert an input `NDList` to an output `NDList`. They can represent single operations, parts of a neural network, and even the whole neural network. What makes blocks special is that they contain a number of parameters that are used in their function and are trained during deep learning. As these parameters are trained, the function represented by the blocks get more and more accurate.\n",
+    "In DJL, [Blocks](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/nn/Block.html) serve a purpose similar to functions that convert an input `NDList` to an output `NDList`. They can represent single operations, parts of a neural network, and even the whole neural network. What makes blocks special is that they contain a number of parameters that are used in their function and are trained during deep learning. As these parameters are trained, the function represented by the blocks get more and more accurate.\n",
     "\n",
     "When building these block functions, the easiest way is to use composition. Similar to how functions are built by calling other functions, blocks can be built by combining other blocks. We refer to the containing block as the parent and the sub-blocks as the children.\n",
     "\n",
     "\n",
-    "We provide several helpers to make it easy to build common block composition structures. For the MLP we will use the [SequentialBlock](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/nn/SequentialBlock.html), a container block whose children form a chain of blocks where each child block feeds its output to the next child block in a sequence.\n",
+    "We provide several helpers to make it easy to build common block composition structures. For the MLP we will use the [SequentialBlock](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/nn/SequentialBlock.html), a container block whose children form a chain of blocks where each child block feeds its output to the next child block in a sequence.\n",
     " "
    ]
   },
@@ -151,7 +151,7 @@
    "source": [
     "## Step 4: Add blocks to SequentialBlock\n",
     "\n",
-    "An MLP is organized into several layers. Each layer is composed of a [Linear Block](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/nn/core/Linear.html) and a non-linear activation function. If we just had two linear blocks in a row, it would be the same as a combined linear block ($f(x) = W_2(W_1x) = (W_2W_1)x = W_{combined}x$). An activation is used to intersperse between the linear blocks to allow them to represent non-linear functions. We will use the popular [ReLU](https://javadoc.io/static/ai.djl/api/0.16.0/ai/djl/nn/Activation.html#reluBlock--) as our activation function.\n",
+    "An MLP is organized into several layers. Each layer is composed of a [Linear Block](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/nn/core/Linear.html) and a non-linear activation function. If we just had two linear blocks in a row, it would be the same as a combined linear block ($f(x) = W_2(W_1x) = (W_2W_1)x = W_{combined}x$). An activation is used to intersperse between the linear blocks to allow them to represent non-linear functions. We will use the popular [ReLU](https://javadoc.io/static/ai.djl/api/0.17.0/ai/djl/nn/Activation.html#reluBlock--) as our activation function.\n",
     "\n",
     "The first layer and last layers have fixed sizes depending on your desired input and output size. However, you are free to choose the number and sizes of the middle layers in the network. We will create a smaller MLP with two middle layers that gradually decrease the size. Typically, you would experiment with different values to see what works the best on your data set."
    ]
diff --git a/jupyter/tutorial/02_train_your_first_model.ipynb b/jupyter/tutorial/02_train_your_first_model.ipynb
index e4e82509e..e7d5972d8 100644
--- a/jupyter/tutorial/02_train_your_first_model.ipynb
+++ b/jupyter/tutorial/02_train_your_first_model.ipynb
@@ -23,10 +23,10 @@
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
     "// Add the maven dependencies\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl:basicdataset:0.16.0\n",
-    "%maven ai.djl:model-zoo:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl:basicdataset:0.17.0\n",
+    "%maven ai.djl:model-zoo:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
@@ -59,13 +59,13 @@
    "source": [
     "# Step 1: Prepare MNIST dataset for training\n",
     "\n",
-    "In order to train, you must create a [Dataset class](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/dataset/Dataset.html) to contain your training data. A dataset is a collection of sample input/output pairs for the function represented by your neural network. Each single input/output is represented by a [Record](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/dataset/Record.html). Each record could have multiple arrays of inputs or outputs such as an image question and answer dataset where the input is both an image and a question about the image while the output is the answer to the question.\n",
+    "In order to train, you must create a [Dataset class](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/dataset/Dataset.html) to contain your training data. A dataset is a collection of sample input/output pairs for the function represented by your neural network. Each single input/output is represented by a [Record](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/dataset/Record.html). Each record could have multiple arrays of inputs or outputs such as an image question and answer dataset where the input is both an image and a question about the image while the output is the answer to the question.\n",
     "\n",
-    "Because data learning is highly parallelizable, training is often done not with a single record at a time, but a [Batch](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/dataset/Batch.html). This can lead to significant performance gains, especially when working with images\n",
+    "Because data learning is highly parallelizable, training is often done not with a single record at a time, but a [Batch](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/dataset/Batch.html). This can lead to significant performance gains, especially when working with images\n",
     "\n",
     "## Sampler\n",
     "\n",
-    "Then, we must decide the parameters for loading data from the dataset. The only parameter we need for MNIST is the choice of [Sampler](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/dataset/Sampler.html). The sampler decides which and how many element from datasets are part of each batch when iterating through it. We will have it randomly shuffle the elements for the batch and use a batchSize of 32. The batchSize is usually the largest power of 2 that fits within memory."
+    "Then, we must decide the parameters for loading data from the dataset. The only parameter we need for MNIST is the choice of [Sampler](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/dataset/Sampler.html). The sampler decides which and how many element from datasets are part of each batch when iterating through it. We will have it randomly shuffle the elements for the batch and use a batchSize of 32. The batchSize is usually the largest power of 2 that fits within memory."
    ]
   },
   {
@@ -85,7 +85,7 @@
    "source": [
     "# Step 2: Create your Model\n",
     "\n",
-    "Next we will build a model. A [Model](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/Model.html) contains a neural network [Block](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/nn/Block.html) along with additional artifacts used for the training process. It possesses additional information about the inputs, outputs, shapes, and data types you will use. Generally, you will use the Model once you have fully completed your Block.\n",
+    "Next we will build a model. A [Model](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/Model.html) contains a neural network [Block](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/nn/Block.html) along with additional artifacts used for the training process. It possesses additional information about the inputs, outputs, shapes, and data types you will use. Generally, you will use the Model once you have fully completed your Block.\n",
     "\n",
     "In this part of the tutorial, we will use the built-in Multilayer Perceptron Block from the Model Zoo. To learn how to build it from scratch, see the previous tutorial: [Create Your First Network](01_create_your_first_network.ipynb).\n",
     "\n",
@@ -108,21 +108,21 @@
    "source": [
     "# Step 3: Create a Trainer\n",
     "\n",
-    "Now, you can create a [`Trainer`](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/Trainer.html) to train your model. The trainer is the main class to orchestrate the training process. Usually, they will be opened using a try-with-resources and closed after training is over.\n",
+    "Now, you can create a [`Trainer`](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/Trainer.html) to train your model. The trainer is the main class to orchestrate the training process. Usually, they will be opened using a try-with-resources and closed after training is over.\n",
     "\n",
     "The trainer takes an existing model and attempts to optimize the parameters inside the model's Block to best match the dataset. Most optimization is based upon [Stochastic Gradient Descent](https://en.wikipedia.org/wiki/Stochastic_gradient_descent) (SGD).\n",
     "\n",
     "## Step 3.1: Setup your training configurations\n",
     "\n",
-    "Before you create your trainer, we we will need a [training configuration](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/DefaultTrainingConfig.html) that describes how to train your model.\n",
+    "Before you create your trainer, we we will need a [training configuration](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/DefaultTrainingConfig.html) that describes how to train your model.\n",
     "\n",
     "The following are a few common items you may need to configure your training:\n",
     "\n",
-    "* **REQUIRED** [`Loss`](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/loss/Loss.html) function: A loss function is used to measure how well our model matches the dataset. Because the lower value of the function is better, it's called the \"loss\" function. The Loss is the only required argument to the model\n",
-    "* [`Evaluator`](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/evaluator/Evaluator.html) function: An evaluator function is also used to measure how well our model matches the dataset. Unlike the loss, they are only there for people to look at and are not used for optimizing the model. Since many losses are not as intuitive, adding other evaluators such as Accuracy can help to understand how your model is doing. If you know of any useful evaluators, we recommend adding them.\n",
-    "* [`Training Listeners`](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/repository/zoo/ZooModel.html): The training listener adds additional functionality to the training process through a listener interface. This can include showing training progress, stopping early if training becomes undefined, or recording performance metrics. We offer several easy sets of [default listeners](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/repository/zoo/ZooModel.html).\n",
+    "* **REQUIRED** [`Loss`](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/loss/Loss.html) function: A loss function is used to measure how well our model matches the dataset. Because the lower value of the function is better, it's called the \"loss\" function. The Loss is the only required argument to the model\n",
+    "* [`Evaluator`](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/evaluator/Evaluator.html) function: An evaluator function is also used to measure how well our model matches the dataset. Unlike the loss, they are only there for people to look at and are not used for optimizing the model. Since many losses are not as intuitive, adding other evaluators such as Accuracy can help to understand how your model is doing. If you know of any useful evaluators, we recommend adding them.\n",
+    "* [`Training Listeners`](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/repository/zoo/ZooModel.html): The training listener adds additional functionality to the training process through a listener interface. This can include showing training progress, stopping early if training becomes undefined, or recording performance metrics. We offer several easy sets of [default listeners](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/repository/zoo/ZooModel.html).\n",
     "\n",
-    "You can also configure other options such as the Device, Initializer, and Optimizer. See [more details](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/training/TrainingConfig.html)."
+    "You can also configure other options such as the Device, Initializer, and Optimizer. See [more details](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/training/TrainingConfig.html)."
    ]
   },
   {
diff --git a/jupyter/tutorial/03_image_classification_with_your_model.ipynb b/jupyter/tutorial/03_image_classification_with_your_model.ipynb
index 36c11888b..587aeea87 100644
--- a/jupyter/tutorial/03_image_classification_with_your_model.ipynb
+++ b/jupyter/tutorial/03_image_classification_with_your_model.ipynb
@@ -26,10 +26,10 @@
     "// %mavenRepo snapshots https://oss.sonatype.org/content/repositories/snapshots/\n",
     "\n",
     "// Add the maven dependencies\n",
-    "%maven ai.djl:api:0.16.0\n",
-    "%maven ai.djl:model-zoo:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.16.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.16.0\n",
+    "%maven ai.djl:api:0.17.0\n",
+    "%maven ai.djl:model-zoo:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.17.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.17.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
@@ -100,7 +100,7 @@
     "\n",
     "## Step 3: Create a `Translator`\n",
     "\n",
-    "The [`Translator`](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/translate/Translator.html) is used to encapsulate the pre-processing and post-processing functionality of your application. The input to the processInput and processOutput should be single data items, not batches."
+    "The [`Translator`](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/translate/Translator.html) is used to encapsulate the pre-processing and post-processing functionality of your application. The input to the processInput and processOutput should be single data items, not batches."
    ]
   },
   {
@@ -141,7 +141,7 @@
    "source": [
     "## Step 4: Create Predictor\n",
     "\n",
-    "Using the translator, we will create a new [`Predictor`](https://javadoc.io/static/ai.djl/api/0.16.0/index.html?ai/djl/inference/Predictor.html). The predictor is the main class to orchestrate the inference process. During inference, a trained model is used to predict values, often for production use cases. The predictor is NOT thread-safe, so if you want to do prediction in parallel, you should call newPredictor multiple times to create a predictor object for each thread."
+    "Using the translator, we will create a new [`Predictor`](https://javadoc.io/static/ai.djl/api/0.17.0/index.html?ai/djl/inference/Predictor.html). The predictor is the main class to orchestrate the inference process. During inference, a trained model is used to predict values, often for production use cases. The predictor is NOT thread-safe, so if you want to do prediction in parallel, you should call newPredictor multiple times to create a predictor object for each thread."
    ]
   },
   {
@@ -159,7 +159,7 @@
    "source": [
     "## Step 5: Run inference\n",
     "\n",
-    "With our predictor, we can simply call the [predict](https://javadoc.io/static/ai.djl/api/0.16.0/ai/djl/inference/Predictor.html#predict-I-) method to run inference. For better performance, you can also call [batchPredict](https://javadoc.io/static/ai.djl/api/0.16.0/ai/djl/inference/Predictor.html#batchPredict-java.util.List-) with a list of input items. Afterwards, the same predictor should be used for further inference calls. "
+    "With our predictor, we can simply call the [predict](https://javadoc.io/static/ai.djl/api/0.17.0/ai/djl/inference/Predictor.html#predict-I-) method to run inference. For better performance, you can also call [batchPredict](https://javadoc.io/static/ai.djl/api/0.17.0/ai/djl/inference/Predictor.html#batchPredict-java.util.List-) with a list of input items. Afterwards, the same predictor should be used for further inference calls. "
    ]
   },
   {
diff --git a/model-zoo/README.md b/model-zoo/README.md
index bee9f15f7..111ff70f0 100644
--- a/model-zoo/README.md
+++ b/model-zoo/README.md
@@ -33,7 +33,7 @@ You can pull the model zoo from the central Maven repository by including the fo
 <dependency>
     <groupId>ai.djl</groupId>
     <artifactId>model-zoo</artifactId>
-    <version>0.16.0</version>
+    <version>0.17.0</version>
 </dependency>
 ```
 


Test patch:
diff --git a/integration/src/main/java/ai/djl/integration/tests/ndarray/NDIndexTest.java b/integration/src/main/java/ai/djl/integration/tests/ndarray/NDIndexTest.java
index a954f3e0f..49e9f652c 100644
--- a/integration/src/main/java/ai/djl/integration/tests/ndarray/NDIndexTest.java
+++ b/integration/src/main/java/ai/djl/integration/tests/ndarray/NDIndexTest.java
@@ -16,7 +16,6 @@ import ai.djl.ndarray.NDArray;
 import ai.djl.ndarray.NDManager;
 import ai.djl.ndarray.index.NDIndex;
 import ai.djl.ndarray.types.Shape;
-import ai.djl.testing.TestRequirements;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -55,20 +54,26 @@ public class NDIndexTest {
 
     @Test
     public void testGather() {
-        // Currently in windows gradle cannot find all the engines.
-        // In the dependencies, changing runtimeOnly to api however will remedy the problem.
-        // TODO: remove this when gradle problem is fixed.
-        TestRequirements.notWindows();
         try (NDManager manager = NDManager.newBaseManager()) {
             NDArray arr = manager.arange(20f).reshape(-1, 4);
-            long[] idx = {0, 0, 2, 1, 1, 2};
-            NDArray index = manager.create(idx, new Shape(3, 2));
+            NDArray index = manager.create(new long[] {0, 0, 2, 1, 1, 2}, new Shape(3, 2));
             NDArray actual = arr.gather(index, 1);
             NDArray expected = manager.create(new float[] {0, 0, 6, 5, 9, 10}, new Shape(3, 2));
             Assert.assertEquals(actual, expected);
         }
     }
 
+    @Test
+    public void testTake() {
+        try (NDManager manager = NDManager.newBaseManager()) {
+            NDArray arr = manager.arange(1, 7f).reshape(-1, 3);
+            NDArray index = manager.create(new long[] {0, 4, 1, 2}, new Shape(2, 2));
+            NDArray actual = arr.take(index);
+            NDArray expected = manager.create(new float[] {1, 5, 2, 3}, new Shape(2, 2));
+            Assert.assertEquals(actual, expected);
+        }
+    }
+
     @Test
     public void testGet() {
         try (NDManager manager = NDManager.newBaseManager()) {
@@ -112,6 +117,13 @@ public class NDIndexTest {
             NDArray bool = manager.create(new boolean[] {true, false});
             expected = manager.arange(5).reshape(1, 5);
             Assert.assertEquals(original.get(bool), expected);
+
+            // get from int array
+            original = manager.arange(1, 7f).reshape(-1, 3);
+            NDArray index = manager.create(new long[] {0, 4, 1, 2}, new Shape(2, 2));
+            NDArray actual = original.get(index);
+            expected = manager.create(new float[] {1, 5, 2, 3}, new Shape(2, 2));
+            Assert.assertEquals(actual, expected);
         }
     }