Repository: deepjavalibrary/djl
Pull request #2829 (2023-10-30 18:03:40)

Updates doc versions to 0.24.0
Also moves android gradle.properties to the new 0.25.0



Patch:
diff --git a/android/README.md b/android/README.md
index 739cd8609..1dbf363b8 100644
--- a/android/README.md
+++ b/android/README.md
@@ -16,7 +16,7 @@ In gradle, you can add the 5 modules in your dependencies:
 
 ```groovy
 dependencies {
-    implementation platform("ai.djl:bom:0.23.0")
+    implementation platform("ai.djl:bom:0.24.0")
 
     implementation "ai.djl:api"
     implementation "ai.djl.android:core"
diff --git a/android/pytorch-native/README.md b/android/pytorch-native/README.md
index 6a955a9e4..a4220606e 100644
--- a/android/pytorch-native/README.md
+++ b/android/pytorch-native/README.md
@@ -124,7 +124,7 @@ cd ..
 ./gradlew compileAndroidJNI -Ppt_version=${PYTORCH_VERSION}
 ```
 
-`jnilib/0.23.0/android` folder will be created after build, and shared library will be uploaded to S3 in CI build
+`jnilib/0.24.0/android` folder will be created after build, and shared library will be uploaded to S3 in CI build
 
 ## Build PyTorch android library (.aar) and publish to Sonatype snapshot repo
 
@@ -138,7 +138,7 @@ cd ../../../android
 
 # To avoid download jni from S3, manually copy them
 mkdir -p pytorch-native/jnilib
-cp -r ../engines/pytorch/pytorch-native/jnilib/0.23.0/android/* pytorch-native/jnilib
+cp -r ../engines/pytorch/pytorch-native/jnilib/0.24.0/android/* pytorch-native/jnilib
 
 ./gradlew :pytorch-native:assemble
 # publish to local maven repo (~/.m2 folder)
diff --git a/api/README.md b/api/README.md
index d797e17df..06859db77 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 
diff --git a/api/src/main/java/ai/djl/inference/streaming/PublisherBytesSupplier.java b/api/src/main/java/ai/djl/inference/streaming/PublisherBytesSupplier.java
index d83c4678f..d5fdfda87 100644
--- a/api/src/main/java/ai/djl/inference/streaming/PublisherBytesSupplier.java
+++ b/api/src/main/java/ai/djl/inference/streaming/PublisherBytesSupplier.java
@@ -14,13 +14,10 @@ package ai.djl.inference.streaming;
 
 import ai.djl.ndarray.BytesSupplier;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 
 /**
@@ -29,16 +26,14 @@ import java.util.function.Consumer;
  */
 public class PublisherBytesSupplier implements BytesSupplier {
 
-    private final List<byte[]> allData;
-    private final AtomicBoolean completed;
     private Consumer<byte[]> subscriber;
-    private final AtomicInteger dataPushed;
+    private CountDownLatch latch;
+    private CompletableFuture<Void> future;
 
     /** Constructs a {@link PublisherBytesSupplier}. */
     public PublisherBytesSupplier() {
-        allData = new ArrayList<>();
-        completed = new AtomicBoolean();
-        dataPushed = new AtomicInteger();
+        latch = new CountDownLatch(1);
+        future = new CompletableFuture<>();
     }
 
     /**
@@ -48,13 +43,24 @@ public class PublisherBytesSupplier implements BytesSupplier {
      * @param lastChunk true if this is the last chunk
      */
     public void appendContent(byte[] data, boolean lastChunk) {
-        synchronized (allData) {
-            allData.add(data);
+        if (subscriber == null) {
+            try {
+                if (!latch.await(2, TimeUnit.MINUTES)) {
+                    throw new IllegalStateException("Wait for subscriber timeout.");
+                }
+                if (subscriber == null) {
+                    // workaround Spotbugs
+                    throw new IllegalStateException("subscriber is not set.");
+                }
+            } catch (InterruptedException e) {
+                throw new IllegalStateException("Append content interrupted.", e);
+            }
         }
+        subscriber.accept(data);
         if (lastChunk) {
-            completed.set(true);
+            subscriber.accept(null);
+            future.complete(null);
         }
-        pushData();
     }
 
     /**
@@ -62,69 +68,21 @@ public class PublisherBytesSupplier implements BytesSupplier {
      *
      * @param subscriber a consumer function that will receive bytes when new daata is added and
      *     null when completed
+     * @return a {@code CompletableFuture} object
      */
-    public void subscribe(Consumer<byte[]> subscriber) {
+    public CompletableFuture<Void> subscribe(Consumer<byte[]> subscriber) {
         if (this.subscriber != null) {
             throw new IllegalStateException(
                     "The PublisherBytesSupplier only allows a single Subscriber");
         }
         this.subscriber = subscriber;
-        pushData();
-    }
-
-    private void pushData() {
-        if (subscriber == null) {
-            return;
-        }
-
-        int dataAvailable;
-        synchronized (allData) {
-            dataAvailable = allData.size();
-        }
-
-        int sent = dataPushed.getAndSet(dataAvailable);
-        if (sent < dataAvailable) {
-            synchronized (this) {
-                for (; sent < dataAvailable; sent++) {
-                    subscriber.accept(allData.get(sent));
-                }
-                if (completed.get()) {
-                    subscriber.accept(null);
-                }
-            }
-        }
-    }
-
-    /** Waits until completed before passing thread (BLOCKS THREAD!). */
-    @SuppressWarnings("PMD.EmptyControlStatement")
-    public void waitToRead() {
-        // Block until complete!!!
-        while (!completed.get()) {
-            // Do nothing
-        }
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public byte[] getAsBytes() {
-        if (!completed.get()) {
-            throw new IllegalStateException(
-                    "PublisherByteSupplier must be completely filled before reading.");
-        }
-
-        try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
-            for (byte[] data : allData) {
-                bos.write(data);
-            }
-            return bos.toByteArray();
-        } catch (IOException e) {
-            throw new AssertionError("Failed to read BytesSupplier", e);
-        }
+        latch.countDown();
+        return future;
     }
 
     /** {@inheritDoc} */
     @Override
     public ByteBuffer toByteBuffer() {
-        return ByteBuffer.wrap(getAsBytes());
+        throw new UnsupportedOperationException("Not supported.");
     }
 }
diff --git a/basicdataset/README.md b/basicdataset/README.md
index 37bab6795..df27c038b 100644
--- a/basicdataset/README.md
+++ b/basicdataset/README.md
@@ -29,7 +29,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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 
diff --git a/bom/README.md b/bom/README.md
index 445198467..7ee24245a 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.23.0</version>
+            <version>0.24.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.23.0</version>
+            <version>0.24.0</version>
             <type>pom</type>
             <scope>import</scope>
         </dependency>
@@ -65,7 +65,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.23.0")
+    implementation platform("ai.djl:bom:0.24.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 2d2c473cc..b728128f2 100644
--- a/djl-zero/README.md
+++ b/djl-zero/README.md
@@ -49,6 +49,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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
diff --git a/docker/spark/Dockerfile b/docker/spark/Dockerfile
index b715899e2..b777d5a69 100644
--- a/docker/spark/Dockerfile
+++ b/docker/spark/Dockerfile
@@ -13,7 +13,7 @@ FROM 314815235551.dkr.ecr.us-east-2.amazonaws.com/sagemaker-spark-processing:3.3
 LABEL maintainer="djl-dev@amazon.com"
 
 # Install dependencies
-ARG DJL_VERSION=0.23.0
+ARG DJL_VERSION=0.24.0
 ARG JNA_VERSION=5.13.0
 ARG JAVACV_VERSION=1.5.9
 ARG JAVACPP_VERSION=1.5.9
diff --git a/docs/development/example_dataset.md b/docs/development/example_dataset.md
index 2a8593174..671cf5e95 100644
--- a/docs/development/example_dataset.md
+++ b/docs/development/example_dataset.md
@@ -24,8 +24,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.23.0"
-api "ai.djl:basicdataset:0.23.0"
+api "ai.djl:api:0.24.0"
+api "ai.djl:basicdataset:0.24.0"
 ```
 
 There are four parts we need to implement for CSVDataset.
diff --git a/docs/hybrid_engine.md b/docs/hybrid_engine.md
index 58bdbe69c..e8b8827ce 100644
--- a/docs/hybrid_engine.md
+++ b/docs/hybrid_engine.md
@@ -21,17 +21,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.23.0"
+runtimeOnly "ai.djl.mxnet:mxnet-engine:0.24.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.23.0"
+runtimeOnly "ai.djl.pytorch:pytorch-engine:0.24.0"
 ```
 
 ```
-runtimeOnly "ai.djl.tensorflow:tensorflow-engine:0.23.0"
+runtimeOnly "ai.djl.tensorflow:tensorflow-engine:0.24.0"
 ```
 
 ## How Hybrid works
diff --git a/docs/load_model.md b/docs/load_model.md
index 621d75146..530cfefa8 100644
--- a/docs/load_model.md
+++ b/docs/load_model.md
@@ -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.23.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.24.0/ai/djl/repository/zoo/ModelZoo.html#listModels--) API to query available models.
 
 #### List available models using DJL command line
 
diff --git a/engines/ml/lightgbm/README.md b/engines/ml/lightgbm/README.md
index 3ea950c89..cf97caeb5 100644
--- a/engines/ml/lightgbm/README.md
+++ b/engines/ml/lightgbm/README.md
@@ -36,13 +36,13 @@ LightGBM can only run on top of the Linux/Mac/Windows machine using x86_64.
 ## Installation
 You can pull the LightGBM engine from the central Maven repository by including the following dependency:
 
-- ai.djl.ml.lightgbm:lightgbm:0.23.0
+- ai.djl.ml.lightgbm:lightgbm:0.24.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.ml.lightgbm</groupId>
     <artifactId>lightgbm</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/ml/xgboost/README.md b/engines/ml/xgboost/README.md
index d69f18301..02fd3970a 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.23.0
+- ai.djl.ml.xgboost:xgboost:0.24.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.ml.xgboost</groupId>
     <artifactId>xgboost</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/mxnet/mxnet-engine/README.md b/engines/mxnet/mxnet-engine/README.md
index cef559f1e..7cdaa9414 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.23.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.24.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
 
@@ -33,7 +33,7 @@ You can pull the MXNet engine from the central Maven repository by including the
 <dependency>
     <groupId>ai.djl.mxnet</groupId>
     <artifactId>mxnet-engine</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/mxnet/mxnet-model-zoo/README.md b/engines/mxnet/mxnet-model-zoo/README.md
index c4f44fe35..d73d92fd4 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 
diff --git a/engines/onnxruntime/onnxruntime-android/README.md b/engines/onnxruntime/onnxruntime-android/README.md
index e304e78d5..ba17c4a16 100644
--- a/engines/onnxruntime/onnxruntime-android/README.md
+++ b/engines/onnxruntime/onnxruntime-android/README.md
@@ -6,13 +6,13 @@ This module contains the DJL ONNX Runtime engine for Android.
 ## Installation
 You can pull the ONNX Runtime for Android from the central Maven repository by including the following dependency:
 
-- ai.djl.android:onnxruntime:0.23.0
+- ai.djl.android:onnxruntime:0.24.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.android</groupId>
     <artifactId>onnxruntime</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/onnxruntime/onnxruntime-engine/README.md b/engines/onnxruntime/onnxruntime-engine/README.md
index c287819d2..2e9812371 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.23.0
+- ai.djl.onnxruntime:onnxruntime-engine:0.24.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.onnxruntime</groupId>
     <artifactId>onnxruntime-engine</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -61,7 +61,7 @@ Maven:
 <dependency>
     <groupId>ai.djl.onnxruntime</groupId>
     <artifactId>onnxruntime-engine</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
     <exclusions>
         <exclusion>
@@ -81,7 +81,7 @@ Maven:
 Gradle:
 
 ```groovy
-implementation("ai.djl.onnxruntime:onnxruntime-engine:0.23.0") {
+implementation("ai.djl.onnxruntime:onnxruntime-engine:0.24.0") {
     exclude group: "com.microsoft.onnxruntime", module: "onnxruntime"
 }
 implementation "com.microsoft.onnxruntime:onnxruntime_gpu:1.14.0"
diff --git a/engines/paddlepaddle/paddlepaddle-engine/README.md b/engines/paddlepaddle/paddlepaddle-engine/README.md
index 9e65fb766..b79cf89af 100644
--- a/engines/paddlepaddle/paddlepaddle-engine/README.md
+++ b/engines/paddlepaddle/paddlepaddle-engine/README.md
@@ -30,7 +30,7 @@ You can pull the PaddlePaddle engine from the central Maven repository by includ
 <dependency>
     <groupId>ai.djl.paddlepaddle</groupId>
     <artifactId>paddlepaddle-engine</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/paddlepaddle/paddlepaddle-model-zoo/README.md b/engines/paddlepaddle/paddlepaddle-model-zoo/README.md
index e2c9cf603..98e4bb9d7 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 
diff --git a/engines/pytorch/pytorch-engine/README.md b/engines/pytorch/pytorch-engine/README.md
index ef74cf988..3627e9202 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.23.0
+- ai.djl.pytorch:pytorch-engine:0.24.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-engine</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -46,6 +46,7 @@ The following table illustrates which pytorch version that DJL supports:
 
 | PyTorch engine version | PyTorch native library version            |
 |------------------------|-------------------------------------------|
+| pytorch-engine:0.24.0  | 1.11.0, 1.12.1, **1.13.1**, 2.0.1         |
 | pytorch-engine:0.23.0  | 1.11.0, 1.12.1, **1.13.1**, 2.0.1         |
 | pytorch-engine:0.22.1  | 1.11.0, 1.12.1, **1.13.1**, 2.0.0         |
 | pytorch-engine:0.21.0  | 1.11.0, 1.12.1, **1.13.1**                |
@@ -110,7 +111,7 @@ export PYTORCH_FLAVOR=cpu
 ### macOS
 For macOS, you can use the following library:
 
-- ai.djl.pytorch:pytorch-jni:2.0.1-0.23.0
+- ai.djl.pytorch:pytorch-jni:2.0.1-0.24.0
 - ai.djl.pytorch:pytorch-native-cpu:2.0.1:osx-x86_64
 
 ```xml
@@ -124,7 +125,7 @@ For macOS, you can use the following library:
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>2.0.1-0.23.0</version>
+    <version>2.0.1-0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -134,7 +135,7 @@ For macOS, you can use the following library:
 ### macOS M1
 For macOS M1, you can use the following library:
 
-- ai.djl.pytorch:pytorch-jni:2.0.1-0.23.0
+- ai.djl.pytorch:pytorch-jni:2.0.1-0.24.0
 - ai.djl.pytorch:pytorch-native-cpu:2.0.1:osx-aarch64
 
 ```xml
@@ -148,7 +149,7 @@ For macOS M1, you can use the following library:
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>2.0.1-0.23.0</version>
+    <version>2.0.1-0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -159,7 +160,7 @@ installed on your GPU machine, you can use one of the following library:
 
 #### Linux GPU
 
-- ai.djl.pytorch:pytorch-jni:2.0.1-0.23.0
+- ai.djl.pytorch:pytorch-jni:2.0.1-0.24.0
 - ai.djl.pytorch:pytorch-native-cu118:2.0.1:linux-x86_64 - CUDA 11.8
 
 ```xml
@@ -173,14 +174,14 @@ installed on your GPU machine, you can use one of the following library:
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>2.0.1-0.23.0</version>
+    <version>2.0.1-0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
 
 ### Linux CPU
 
-- ai.djl.pytorch:pytorch-jni:2.0.1-0.23.0
+- ai.djl.pytorch:pytorch-jni:2.0.1-0.24.0
 - ai.djl.pytorch:pytorch-native-cpu:2.0.1:linux-x86_64
 
 ```xml
@@ -194,14 +195,14 @@ installed on your GPU machine, you can use one of the following library:
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>2.0.1-0.23.0</version>
+    <version>2.0.1-0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
 
 ### For aarch64 build
 
-- ai.djl.pytorch:pytorch-jni:2.0.1-0.23.0
+- ai.djl.pytorch:pytorch-jni:2.0.1-0.24.0
 - ai.djl.pytorch:pytorch-native-cpu-precxx11:2.0.1:linux-aarch64
 
 ```xml
@@ -215,7 +216,7 @@ installed on your GPU machine, you can use one of the following library:
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>2.0.1-0.23.0</version>
+    <version>2.0.1-0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -225,7 +226,7 @@ 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:2.0.1-0.23.0
+- ai.djl.pytorch:pytorch-jni:2.0.1-0.24.0
 - ai.djl.pytorch:pytorch-native-cu118-precxx11:2.0.1:linux-x86_64 - CUDA 11.8
 - ai.djl.pytorch:pytorch-native-cpu-precxx11:2.0.1:linux-x86_64   - CPU
 
@@ -240,7 +241,7 @@ All the package were built with GCC 7, we provided a newer `libstdc++.so.6.24` i
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>2.0.1-0.23.0</version>
+    <version>2.0.1-0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -256,7 +257,7 @@ All the package were built with GCC 7, we provided a newer `libstdc++.so.6.24` i
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>2.0.1-0.23.0</version>
+    <version>2.0.1-0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
@@ -271,7 +272,7 @@ For the Windows platform, you can choose between CPU and GPU.
 
 #### Windows GPU
 
-- ai.djl.pytorch:pytorch-jni:2.0.1-0.23.0
+- ai.djl.pytorch:pytorch-jni:2.0.1-0.24.0
 - ai.djl.pytorch:pytorch-native-cu118:2.0.1:win-x86_64 - CUDA 11.8
 
 ```xml
@@ -285,14 +286,14 @@ For the Windows platform, you can choose between CPU and GPU.
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>2.0.1-0.23.0</version>
+    <version>2.0.1-0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
 
 ### Windows CPU
 
-- ai.djl.pytorch:pytorch-jni:2.0.1-0.23.0
+- ai.djl.pytorch:pytorch-jni:2.0.1-0.24.0
 - ai.djl.pytorch:pytorch-native-cpu:2.0.1:win-x86_64
 
 ```xml
@@ -306,7 +307,7 @@ For the Windows platform, you can choose between CPU and GPU.
 <dependency>
     <groupId>ai.djl.pytorch</groupId>
     <artifactId>pytorch-jni</artifactId>
-    <version>2.0.1-0.23.0</version>
+    <version>2.0.1-0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/pytorch/pytorch-model-zoo/README.md b/engines/pytorch/pytorch-model-zoo/README.md
index 8d3113842..19c46ed57 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 
diff --git a/engines/tensorflow/tensorflow-api/README.md b/engines/tensorflow/tensorflow-api/README.md
index fd2741dc9..c0509e876 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
diff --git a/engines/tensorflow/tensorflow-engine/README.md b/engines/tensorflow/tensorflow-engine/README.md
index 57bcdda98..62e202c86 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.23.0
+- ai.djl.tensorflow:tensorflow-engine:0.24.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.tensorflow</groupId>
     <artifactId>tensorflow-engine</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/tensorflow/tensorflow-model-zoo/README.md b/engines/tensorflow/tensorflow-model-zoo/README.md
index b34154fa1..bec42e53c 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 
diff --git a/engines/tensorrt/README.md b/engines/tensorrt/README.md
index 637338647..7a1327870 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.23.0
+- ai.djl.tensorrt:tensorrt:0.24.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.tensorrt</groupId>
     <artifactId>tensorrt</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/engines/tflite/tflite-engine/README.md b/engines/tflite/tflite-engine/README.md
index b1dd8fc97..34d47ba26 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.23.0
+- ai.djl.tflite:tflite-engine:0.24.0
 
 ```xml
 <dependency>
     <groupId>ai.djl.tflite</groupId>
     <artifactId>tflite-engine</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
     <scope>runtime</scope>
 </dependency>
 ```
diff --git a/extensions/audio/README.md b/extensions/audio/README.md
index 7e2c89692..3cc19cb69 100644
--- a/extensions/audio/README.md
+++ b/extensions/audio/README.md
@@ -23,6 +23,6 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl.audio</groupId>
     <artifactId>audio</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
diff --git a/extensions/aws-ai/README.md b/extensions/aws-ai/README.md
index 829df0bb0..7ffb23555 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
diff --git a/extensions/fasttext/README.md b/extensions/fasttext/README.md
index 6f5a25064..be522087f 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 
diff --git a/extensions/hadoop/README.md b/extensions/hadoop/README.md
index b3c4ebcc7..812e3f39a 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
diff --git a/extensions/opencv/README.md b/extensions/opencv/README.md
index d6c58f518..3c17f1293 100644
--- a/extensions/opencv/README.md
+++ b/extensions/opencv/README.md
@@ -23,6 +23,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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
diff --git a/extensions/sentencepiece/README.md b/extensions/sentencepiece/README.md
index 430830811..577f7b1af 100644
--- a/extensions/sentencepiece/README.md
+++ b/extensions/sentencepiece/README.md
@@ -23,6 +23,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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
diff --git a/extensions/spark/README.md b/extensions/spark/README.md
index 02ebcc07a..300706b4e 100644
--- a/extensions/spark/README.md
+++ b/extensions/spark/README.md
@@ -34,7 +34,7 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl.spark</groupId>
     <artifactId>spark_2.12</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 
diff --git a/extensions/tablesaw/README.md b/extensions/tablesaw/README.md
index 010c6395e..bab368ed1 100644
--- a/extensions/tablesaw/README.md
+++ b/extensions/tablesaw/README.md
@@ -25,6 +25,6 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl.tablesaw</groupId>
     <artifactId>tablesaw</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
diff --git a/extensions/timeseries/README.md b/extensions/timeseries/README.md
index 9706c9334..86a4d7ca3 100644
--- a/extensions/timeseries/README.md
+++ b/extensions/timeseries/README.md
@@ -245,6 +245,6 @@ You can pull the module from the central Maven repository by including the follo
 <dependency>
     <groupId>ai.djl.timeseries</groupId>
     <artifactId>timeseries</artifactId>
-    <version>0.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
diff --git a/extensions/timeseries/docs/forecast_with_M5_data.md b/extensions/timeseries/docs/forecast_with_M5_data.md
index 66f212401..6119016b4 100644
--- a/extensions/timeseries/docs/forecast_with_M5_data.md
+++ b/extensions/timeseries/docs/forecast_with_M5_data.md
@@ -56,7 +56,7 @@ repositories {
 }
 dependencies {
   implementation "org.apache.logging.log4j:log4j-slf4j-impl:2.17.1"
-  implementation platform("ai.djl:bom:0.23.0")
+  implementation platform("ai.djl:bom:0.24.0")
   implementation "ai.djl:api"
   implementation "ai.djl.timeseries"
   runtimeOnly "ai.djl.mxnet:mxnet-engine"
diff --git a/extensions/tokenizers/README.md b/extensions/tokenizers/README.md
index 1b8562557..a8805c03d 100644
--- a/extensions/tokenizers/README.md
+++ b/extensions/tokenizers/README.md
@@ -23,7 +23,7 @@ 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 
diff --git a/jupyter/BERTQA.ipynb b/jupyter/BERTQA.ipynb
index 4ec97cbd8..8c7cda2cc 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.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.23.0\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.23.0\n",
-    "%maven ai.djl.pytorch:pytorch-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.24.0\n",
+    "%maven ai.djl.pytorch:pytorch-engine:0.24.0\n",
+    "%maven ai.djl.pytorch:pytorch-model-zoo:0.24.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 f90091d1e..2997a7e64 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.23.0\n",
-    "%maven ai.djl:model-zoo:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl:model-zoo:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.24.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 bf4e3db3e..78fcee31a 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.23.0\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.pytorch:pytorch-engine:0.24.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/mxnet/load_your_own_mxnet_bert.ipynb b/jupyter/mxnet/load_your_own_mxnet_bert.ipynb
index 9691a4d68..5a786d1f2 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.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.24.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/object_detection_with_model_zoo.ipynb b/jupyter/object_detection_with_model_zoo.ipynb
index 9435b9de7..0faf55899 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.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.24.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 d068a97e7..91c98ea36 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.23.0\n",
-    "%maven ai.djl.onnxruntime:onnxruntime-engine:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.onnxruntime:onnxruntime-engine:0.24.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
@@ -92,7 +92,7 @@
     "`Predictor`. The post-processing block allows you to convert the output from the `Predictor` to the desired output\n",
     "format.\n",
     "\n",
-    "In our use case, we use a class namely `IrisFlower` as our input class type. We will use [`Classifications`](https://javadoc.io/doc/ai.djl/api/0.23.0/ai/djl/modality/Classifications.html) as our output class type."
+    "In our use case, we use a class namely `IrisFlower` as our input class type. We will use [`Classifications`](https://javadoc.io/doc/ai.djl/api/0.24.0/ai/djl/modality/Classifications.html) as our output class type."
    ]
   },
   {
@@ -164,7 +164,7 @@
    "source": [
     "## Step 2 Prepare your model\n",
     "\n",
-    "We will load a pretrained sklearn model into DJL. We defined a [`ModelZoo`](https://javadoc.io/doc/ai.djl/api/0.23.0/ai/djl/repository/zoo/ModelZoo.html) concept to allow user load model from varity of locations, such as remote URL, local files or DJL pretrained model zoo. We need to define [`Criteria`](https://javadoc.io/doc/ai.djl/api/0.23.0/ai/djl/repository/zoo/Criteria.html) class to help the modelzoo locate the model and attach translator. In this example, we download a compressed ONNX model from S3."
+    "We will load a pretrained sklearn model into DJL. We defined a [`ModelZoo`](https://javadoc.io/doc/ai.djl/api/0.24.0/ai/djl/repository/zoo/ModelZoo.html) concept to allow user load model from varity of locations, such as remote URL, local files or DJL pretrained model zoo. We need to define [`Criteria`](https://javadoc.io/doc/ai.djl/api/0.24.0/ai/djl/repository/zoo/Criteria.html) class to help the modelzoo locate the model and attach translator. In this example, we download a compressed ONNX model from S3."
    ]
   },
   {
diff --git a/jupyter/paddlepaddle/face_mask_detection_paddlepaddle.ipynb b/jupyter/paddlepaddle/face_mask_detection_paddlepaddle.ipynb
index 1249ee12e..f51762156 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.23.0\n",
-    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.24.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.23.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.24.0"
    ]
   },
   {
diff --git a/jupyter/paddlepaddle/face_mask_detection_paddlepaddle_zh.ipynb b/jupyter/paddlepaddle/face_mask_detection_paddlepaddle_zh.ipynb
index 46c86461b..fb4074fe9 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.23.0\n",
-    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.24.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.23.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.24.0"
    ]
   },
   {
diff --git a/jupyter/paddlepaddle/paddle_ocr_java.ipynb b/jupyter/paddlepaddle/paddle_ocr_java.ipynb
index da8527020..a7984acc4 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.23.0\n",
-    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.24.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.23.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.24.0"
    ]
   },
   {
diff --git a/jupyter/paddlepaddle/paddle_ocr_java_zh.ipynb b/jupyter/paddlepaddle/paddle_ocr_java_zh.ipynb
index 2419baf89..1e60b733e 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.23.0\n",
-    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.paddlepaddle:paddlepaddle-model-zoo:0.24.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.23.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.24.0"
    ]
   },
   {
diff --git a/jupyter/pytorch/load_your_own_pytorch_bert.ipynb b/jupyter/pytorch/load_your_own_pytorch_bert.ipynb
index 3c52ee599..2602b42ac 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.23.0\n",
-    "%maven ai.djl.pytorch:pytorch-engine:0.23.0\n",
-    "%maven ai.djl.pytorch:pytorch-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.pytorch:pytorch-engine:0.24.0\n",
+    "%maven ai.djl.pytorch:pytorch-model-zoo:0.24.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/rank_classification_using_BERT_on_Amazon_Review.ipynb b/jupyter/rank_classification_using_BERT_on_Amazon_Review.ipynb
index 2edbc6c19..7afcf3c96 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.23.0\n",
-    "%maven ai.djl:basicdataset:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl:basicdataset:0.24.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.23.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.24.0\n",
     "\n",
     "// PyTorch\n",
-    "// %maven ai.djl.pytorch:pytorch-model-zoo:0.23.0"
+    "// %maven ai.djl.pytorch:pytorch-model-zoo:0.24.0"
    ]
   },
   {
diff --git a/jupyter/tensorflow/pneumonia_detection.ipynb b/jupyter/tensorflow/pneumonia_detection.ipynb
index c790ad13f..76bcc28ff 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.23.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-api:0.23.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-engine:0.23.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-api:0.24.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-engine:0.24.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-model-zoo:0.24.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 1b4647919..b0f69421a 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.23.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-engine:0.23.0\n",
-    "%maven ai.djl.tensorflow:tensorflow-api:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-engine:0.24.0\n",
+    "%maven ai.djl.tensorflow:tensorflow-api:0.24.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 3fb55f979..126376de4 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.23.0\n",
-    "%maven ai.djl:model-zoo:0.23.0\n",
-    "%maven ai.djl.tflite:tflite-engine:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl:model-zoo:0.24.0\n",
+    "%maven ai.djl.tflite:tflite-engine:0.24.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.23.0"
+    "%maven ai.djl.pytorch:pytorch-engine:0.24.0"
    ]
   },
   {
diff --git a/jupyter/transfer_learning_on_cifar10.ipynb b/jupyter/transfer_learning_on_cifar10.ipynb
index 663a9eafc..1692d9872 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.23.0\n",
-    "%maven ai.djl:basicdataset:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl:basicdataset:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.24.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 293fde5fe..461121737 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.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/tutorial/02_train_your_first_model.ipynb b/jupyter/tutorial/02_train_your_first_model.ipynb
index 4905dadfb..a650a781f 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.23.0\n",
-    "%maven ai.djl:basicdataset:0.23.0\n",
-    "%maven ai.djl:model-zoo:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl:basicdataset:0.24.0\n",
+    "%maven ai.djl:model-zoo:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.24.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/jupyter/tutorial/03_image_classification_with_your_model.ipynb b/jupyter/tutorial/03_image_classification_with_your_model.ipynb
index f8d42d797..5de8fa987 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.23.0\n",
-    "%maven ai.djl:model-zoo:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-engine:0.23.0\n",
-    "%maven ai.djl.mxnet:mxnet-model-zoo:0.23.0\n",
+    "%maven ai.djl:api:0.24.0\n",
+    "%maven ai.djl:model-zoo:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-engine:0.24.0\n",
+    "%maven ai.djl.mxnet:mxnet-model-zoo:0.24.0\n",
     "%maven org.slf4j:slf4j-simple:1.7.32"
    ]
   },
diff --git a/model-zoo/README.md b/model-zoo/README.md
index 11ae15c55..15d583c1d 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.23.0</version>
+    <version>0.24.0</version>
 </dependency>
 ```
 


Test patch:
diff --git a/api/src/test/java/ai/djl/inference/streaming/PublisherBytesSupplierTest.java b/api/src/test/java/ai/djl/inference/streaming/PublisherBytesSupplierTest.java
index 8c1406881..a8b2bdfab 100644
--- a/api/src/test/java/ai/djl/inference/streaming/PublisherBytesSupplierTest.java
+++ b/api/src/test/java/ai/djl/inference/streaming/PublisherBytesSupplierTest.java
@@ -15,32 +15,38 @@ package ai.djl.inference.streaming;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
 
 public class PublisherBytesSupplierTest {
 
     @Test
-    public void test() {
+    public void test() throws ExecutionException, InterruptedException {
         AtomicInteger contentCount = new AtomicInteger();
         PublisherBytesSupplier supplier = new PublisherBytesSupplier();
 
-        // Add to supplier without subscriber
-        supplier.appendContent(new byte[] {1}, false);
-        Assert.assertEquals(contentCount.get(), 0);
+        new Thread(
+                        () -> {
+                            // Add to supplier without subscriber
+                            supplier.appendContent(new byte[] {1}, false);
+                            // Add to supplier with subscriber
+                            supplier.appendContent(new byte[] {1}, true);
+                        })
+                .start();
 
         // Subscribing with data should trigger subscriptions
-        supplier.subscribe(
-                d -> {
-                    if (d == null) {
-                        // Do nothing on completion
-                        return;
-                    }
-                    contentCount.getAndIncrement();
-                });
-        Assert.assertEquals(contentCount.get(), 1);
+        CompletableFuture<Void> future =
+                supplier.subscribe(
+                        d -> {
+                            if (d == null) {
+                                // Do nothing on completion
+                                return;
+                            }
+                            contentCount.getAndIncrement();
+                        });
 
-        // Add to supplier with subscriber
-        supplier.appendContent(new byte[] {1}, true);
+        future.get();
         Assert.assertEquals(contentCount.get(), 2);
     }
 }