From 20442c5f8adaf9df9b5485b37fc9e8d3a4825497 Mon Sep 17 00:00:00 2001 From: Qing Date: Fri, 2 Nov 2018 14:01:26 -0700 Subject: [PATCH 1/6] add java benchmark --- .../benchmark/run_java_inference_bm.sh | 40 ++++++ .../objectdetector/run_ssd_java_example.sh | 2 +- .../javaapi/benchmark/InferBase.java | 33 +++++ .../javaapi/benchmark/JavaBenchmark.java | 114 ++++++++++++++++++ .../benchmark/ObjectDetectionBenchmark.java | 66 ++++++++++ .../infer}/objectdetector/README.md | 0 .../objectdetector/SSDClassifierExample.java | 2 +- .../mxnet/infer/javaapi/ObjectDetector.scala | 10 ++ 8 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 scala-package/examples/scripts/benchmark/run_java_inference_bm.sh create mode 100644 scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java create mode 100644 scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java create mode 100644 scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java rename scala-package/examples/src/main/java/org/apache/mxnetexamples/{infer/javapi => javaapi/infer}/objectdetector/README.md (100%) rename scala-package/examples/src/main/java/org/apache/mxnetexamples/{infer/javapi => javaapi/infer}/objectdetector/SSDClassifierExample.java (99%) diff --git a/scala-package/examples/scripts/benchmark/run_java_inference_bm.sh b/scala-package/examples/scripts/benchmark/run_java_inference_bm.sh new file mode 100644 index 000000000000..5a468e344829 --- /dev/null +++ b/scala-package/examples/scripts/benchmark/run_java_inference_bm.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -e + +hw_type=cpu +if [ "$USE_GPU" = "1" ] +then + hw_type=gpu +fi + +platform=linux-x86_64 + +if [[ $OSTYPE = [darwin]* ]] +then + platform=osx-x86_64 +fi + +MXNET_ROOT=$(cd "$(dirname $0)/../../../.."; pwd) +CLASS_PATH=$MXNET_ROOT/scala-package/assembly/$platform-$hw_type/target/*:$MXNET_ROOT/scala-package/examples/target/* + +java -Xmx8G -Dmxnet.traceLeakedObjects=true -cp $CLASS_PATH \ + org.apache.mxnetexamples.javaapi.benchmark.JavaBenchmark $@ + diff --git a/scala-package/examples/scripts/infer/objectdetector/run_ssd_java_example.sh b/scala-package/examples/scripts/infer/objectdetector/run_ssd_java_example.sh index f444a3a59af7..00ed793a7bb5 100755 --- a/scala-package/examples/scripts/infer/objectdetector/run_ssd_java_example.sh +++ b/scala-package/examples/scripts/infer/objectdetector/run_ssd_java_example.sh @@ -41,7 +41,7 @@ INPUT_IMG=$2 INPUT_DIR=$3 java -Xmx8G -cp $CLASS_PATH \ - org.apache.mxnetexamples.infer.javapi.objectdetector.SSDClassifierExample \ + org.apache.mxnetexamples.javaapi.infer.objectdetector.SSDClassifierExample \ --model-path-prefix $MODEL_DIR \ --input-image $INPUT_IMG \ --input-dir $INPUT_DIR diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java new file mode 100644 index 000000000000..5e9f7753c1c8 --- /dev/null +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.mxnetexamples.javaapi.benchmark; + +import org.apache.mxnet.javaapi.Context; +import org.kohsuke.args4j.Option; + +import java.util.List; + +public abstract class InferBase { + @Option(name = "--num-runs", usage = "Number of runs") + public int numRun = 1; + @Option(name = "--model-name", usage = "Name of the model") + public String modelName = ""; + + public abstract void preProcessModel(List context); + public abstract void runSingleInference(); + public abstract void runBatchInference(); +} diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java new file mode 100644 index 000000000000..12f1bb29d2ec --- /dev/null +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java @@ -0,0 +1,114 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.mxnetexamples.javaapi.benchmark; + +import org.apache.mxnet.javaapi.Context; +import org.kohsuke.args4j.CmdLineParser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class JavaBenchmark { + + private static boolean runBatch = false; + + private static void parse(Object inst, String[] args) { + CmdLineParser parser = new CmdLineParser(inst); + try { + parser.parseArgument(args); + } catch (Exception e) { + System.err.println(e.getMessage() + e); + parser.printUsage(System.err); + System.exit(1); + } + } + + private static long percentile(int p, long[] seq) { + Arrays.sort(seq); + int k = (int) Math.ceil((seq.length - 1) * (p / 100.0)); + return seq[k]; + } + + private static void printStatistics(long[] inferenceTimes, String metricsPrefix) { + + double p50 = percentile(50, inferenceTimes) / 1.0e6; + double p99 = percentile(99, inferenceTimes) / 1.0e6; + double p90 = percentile(90, inferenceTimes) / 1.0e6; + long sum = 0; + for (long time: inferenceTimes) sum += time; + double average = sum / (inferenceTimes.length * 1.0e6); + + System.out.println( + String.format("\n%s_p99 %fms\n%s_p90 %fms\n%s_p50 %fms\n%s_average %1.2fms", + metricsPrefix, p99, metricsPrefix, p90, + metricsPrefix, p50, metricsPrefix, average) + ); + + } + + public static void main(String[] args) { + if (args.length < 2) { + System.out.println("Please specify model name"); + return; + } + String modelName = args[1]; + InferBase model; + if (modelName.equals("ObjectDetection")) { + runBatch = true; + ObjectDetectionBenchmark inst = new ObjectDetectionBenchmark(); + parse(inst, args); + model = inst; + } else { + System.out.println("Model name not found! " + modelName); + return; + } + List context = new ArrayList(); + if (System.getenv().containsKey("SCALA_TEST_ON_GPU") && + Integer.valueOf(System.getenv("SCALA_TEST_ON_GPU")) == 1) { + context.add(Context.gpu()); + } else { + context.add(Context.cpu()); + } + + long[] result = new long[model.numRun]; + model.preProcessModel(context); + if (runBatch) { + for (int i =0;i < model.numRun; i++) { + long currTime = System.nanoTime(); + model.runBatchInference(); + result[i] = System.nanoTime() - currTime; + } + printStatistics(result, modelName +"Batch"); + } + + ((ObjectDetectionBenchmark) model).batchSize = 1; + model.preProcessModel(context); + result = new long[model.numRun]; + for (int i = 0; i < model.numRun; i++) { + long currTime = System.nanoTime(); + model.runSingleInference(); + result[i] = System.nanoTime() - currTime; + } + printStatistics(result, modelName); + + + } +} diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java new file mode 100644 index 000000000000..4495a8ef2760 --- /dev/null +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.mxnetexamples.javaapi.benchmark; + +import org.apache.mxnet.infer.javaapi.ObjectDetector; +import org.apache.mxnet.javaapi.*; +import org.kohsuke.args4j.Option; + +import java.util.ArrayList; +import java.util.List; + +public class ObjectDetectionBenchmark extends InferBase { + @Option(name = "--model-path-prefix", usage = "input model directory and prefix of the model") + public String modelPathPrefix = "/model/ssd_resnet50_512"; + @Option(name = "--input-image", usage = "the input image") + public String inputImagePath = "/images/dog.jpg"; + @Option(name = "--batchsize", usage = "Size of the batch") + public int batchSize = 1; + + private ObjectDetector objDet; + private NDArray img; + private NDArray$ NDArray = NDArray$.MODULE$; + + public void preProcessModel(List context) { + Shape inputShape = new Shape(new int[] {this.batchSize, 3, 512, 512}); + List inputDescriptors = new ArrayList<>(); + inputDescriptors.add(new DataDesc("data", inputShape, DType.Float32(), "NCHW")); + objDet = new ObjectDetector(modelPathPrefix, inputDescriptors, context, 0); + img = ObjectDetector.bufferedImageToPixels( + ObjectDetector.reshapeImage( + ObjectDetector.loadImageFromFile(inputImagePath), 512, 512 + ), + new Shape(new int[] {1, 3, 512, 512}) + ); + } + + public void runSingleInference() { + List nd = new ArrayList<>(); + nd.add(img); + objDet.objectDetectWithNDArray(nd, 3); + } + + public void runBatchInference() { + List nd = new ArrayList<>(); + NDArray[] temp = new NDArray[batchSize]; + for (int i = 0; i < batchSize; i++) temp[i] = img.copy(); + NDArray batched = NDArray.concat(temp, batchSize).setdim(0).invoke().get(); + nd.add(batched); + objDet.objectDetectWithNDArray(nd, 3); + } +} diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/infer/javapi/objectdetector/README.md b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/infer/objectdetector/README.md similarity index 100% rename from scala-package/examples/src/main/java/org/apache/mxnetexamples/infer/javapi/objectdetector/README.md rename to scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/infer/objectdetector/README.md diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/infer/javapi/objectdetector/SSDClassifierExample.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/infer/objectdetector/SSDClassifierExample.java similarity index 99% rename from scala-package/examples/src/main/java/org/apache/mxnetexamples/infer/javapi/objectdetector/SSDClassifierExample.java rename to scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/infer/objectdetector/SSDClassifierExample.java index 13f9d2d9a3e5..4befc8edde6b 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/infer/javapi/objectdetector/SSDClassifierExample.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/infer/objectdetector/SSDClassifierExample.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.mxnetexamples.infer.javapi.objectdetector; +package org.apache.mxnetexamples.javaapi.infer.objectdetector; import org.apache.mxnet.infer.javaapi.ObjectDetectorOutput; import org.kohsuke.args4j.CmdLineParser; diff --git a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala index f48375ffe4a7..339b935f5df9 100644 --- a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala +++ b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala @@ -19,6 +19,8 @@ package org.apache.mxnet.infer.javaapi // scalastyle:off import java.awt.image.BufferedImage + +import org.apache.mxnet.javaapi.Shape // scalastyle:on import org.apache.mxnet.javaapi.{Context, DataDesc, NDArray} @@ -113,6 +115,14 @@ object ObjectDetector { org.apache.mxnet.infer.ImageClassifier.loadImageFromFile(inputImagePath) } + def reshapeImage(img : BufferedImage, newWidth: Int, newHeight: Int): BufferedImage = { + org.apache.mxnet.infer.ImageClassifier.reshapeImage(img, newWidth, newHeight) + } + + def bufferedImageToPixels(resizedImage: BufferedImage, inputImageShape: Shape): NDArray = { + org.apache.mxnet.infer.ImageClassifier.bufferedImageToPixels(resizedImage, inputImageShape) + } + def loadInputBatch(inputImagePaths: java.util.List[String]): java.util.List[BufferedImage] = { org.apache.mxnet.infer.ImageClassifier .loadInputBatch(inputImagePaths.asScala.toList).toList.asJava From 6edb6454b610cd68f19ab107d85b928d270a7dfe Mon Sep 17 00:00:00 2001 From: Qing Date: Sun, 4 Nov 2018 19:33:57 -0800 Subject: [PATCH 2/6] applied changes based on Piyush comments --- .../javaapi/benchmark/InferBase.java | 2 ++ .../javaapi/benchmark/JavaBenchmark.java | 34 ++++++++++++------- .../benchmark/ObjectDetectionBenchmark.java | 2 -- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java index 5e9f7753c1c8..11c920480ff5 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java @@ -26,6 +26,8 @@ public abstract class InferBase { public int numRun = 1; @Option(name = "--model-name", usage = "Name of the model") public String modelName = ""; + @Option(name = "--batchsize", usage = "Size of the batch") + public int batchSize = 1; public abstract void preProcessModel(List context); public abstract void runSingleInference(); diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java index 12f1bb29d2ec..8e1117dc5cd2 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java @@ -64,6 +64,17 @@ private static void printStatistics(long[] inferenceTimes, String metricsPrefix) } + private static List getContext() { + List context = new ArrayList(); + if (System.getenv().containsKey("SCALA_TEST_ON_GPU") && + Integer.valueOf(System.getenv("SCALA_TEST_ON_GPU")) == 1) { + context.add(Context.gpu()); + } else { + context.add(Context.cpu()); + } + return context; + } + public static void main(String[] args) { if (args.length < 2) { System.out.println("Please specify model name"); @@ -71,16 +82,17 @@ public static void main(String[] args) { } String modelName = args[1]; InferBase model; - if (modelName.equals("ObjectDetection")) { - runBatch = true; - ObjectDetectionBenchmark inst = new ObjectDetectionBenchmark(); - parse(inst, args); - model = inst; - } else { - System.out.println("Model name not found! " + modelName); - return; + switch(modelName) { + case "ObjectDetection": + runBatch = true; + ObjectDetectionBenchmark inst = new ObjectDetectionBenchmark(); + parse(inst, args); + model = inst; + default: + System.err.println("Model name not found! " + modelName); + System.exit(1); } - List context = new ArrayList(); + List context = getContext(); if (System.getenv().containsKey("SCALA_TEST_ON_GPU") && Integer.valueOf(System.getenv("SCALA_TEST_ON_GPU")) == 1) { context.add(Context.gpu()); @@ -99,7 +111,7 @@ public static void main(String[] args) { printStatistics(result, modelName +"Batch"); } - ((ObjectDetectionBenchmark) model).batchSize = 1; + model.batchSize = 1; model.preProcessModel(context); result = new long[model.numRun]; for (int i = 0; i < model.numRun; i++) { @@ -108,7 +120,5 @@ public static void main(String[] args) { result[i] = System.nanoTime() - currTime; } printStatistics(result, modelName); - - } } diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java index 4495a8ef2760..5f23cd0ebc64 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java @@ -29,8 +29,6 @@ public class ObjectDetectionBenchmark extends InferBase { public String modelPathPrefix = "/model/ssd_resnet50_512"; @Option(name = "--input-image", usage = "the input image") public String inputImagePath = "/images/dog.jpg"; - @Option(name = "--batchsize", usage = "Size of the batch") - public int batchSize = 1; private ObjectDetector objDet; private NDArray img; From 96eea0e6c1a8bf2386472656d05e3eb71771f7d5 Mon Sep 17 00:00:00 2001 From: Qing Date: Mon, 5 Nov 2018 22:53:03 -0800 Subject: [PATCH 3/6] applies Andrew's change --- .../apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java | 2 -- .../scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java index 8e1117dc5cd2..44cd2a8e4c21 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java @@ -19,8 +19,6 @@ import org.apache.mxnet.javaapi.Context; import org.kohsuke.args4j.CmdLineParser; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Arrays; diff --git a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala index 339b935f5df9..447518b5a89c 100644 --- a/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala +++ b/scala-package/infer/src/main/scala/org/apache/mxnet/infer/javaapi/ObjectDetector.scala @@ -19,11 +19,9 @@ package org.apache.mxnet.infer.javaapi // scalastyle:off import java.awt.image.BufferedImage - -import org.apache.mxnet.javaapi.Shape // scalastyle:on -import org.apache.mxnet.javaapi.{Context, DataDesc, NDArray} +import org.apache.mxnet.javaapi.{Context, DataDesc, NDArray, Shape} import scala.collection.JavaConverters import scala.collection.JavaConverters._ From 08dc793382e808e8398d503264873ed608356d30 Mon Sep 17 00:00:00 2001 From: Qing Date: Tue, 6 Nov 2018 09:55:13 -0800 Subject: [PATCH 4/6] fix clojure test issue --- .../apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java index 44cd2a8e4c21..199858e4a6de 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java @@ -79,7 +79,7 @@ public static void main(String[] args) { return; } String modelName = args[1]; - InferBase model; + InferBase model = null; switch(modelName) { case "ObjectDetection": runBatch = true; From 49fb91856bf07bf1a7d58cda9dba618aecb40b89 Mon Sep 17 00:00:00 2001 From: Qing Date: Wed, 7 Nov 2018 10:08:13 -0800 Subject: [PATCH 5/6] update the statistic names --- .../apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java index 199858e4a6de..63057c7810f5 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java @@ -106,7 +106,7 @@ public static void main(String[] args) { model.runBatchInference(); result[i] = System.nanoTime() - currTime; } - printStatistics(result, modelName +"Batch"); + printStatistics(result, modelName +"batch_inference"); } model.batchSize = 1; @@ -117,6 +117,6 @@ public static void main(String[] args) { model.runSingleInference(); result[i] = System.nanoTime() - currTime; } - printStatistics(result, modelName); + printStatistics(result, modelName + "single_inference"); } } From b28b9707a9ef5943b2fa9540c846860191be8a4d Mon Sep 17 00:00:00 2001 From: Qing Date: Thu, 8 Nov 2018 20:34:08 -0800 Subject: [PATCH 6/6] follow Naveen's instruction --- .../javaapi/benchmark/InferBase.java | 2 +- .../javaapi/benchmark/JavaBenchmark.java | 19 ++++++++++++++++--- .../benchmark/ObjectDetectionBenchmark.java | 2 +- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java index 11c920480ff5..fdcde6b4152c 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/InferBase.java @@ -21,7 +21,7 @@ import java.util.List; -public abstract class InferBase { +abstract class InferBase { @Option(name = "--num-runs", usage = "Number of runs") public int numRun = 1; @Option(name = "--model-name", usage = "Name of the model") diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java index 63057c7810f5..1baca20fbe6d 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/JavaBenchmark.java @@ -45,8 +45,13 @@ private static long percentile(int p, long[] seq) { return seq[k]; } - private static void printStatistics(long[] inferenceTimes, String metricsPrefix) { - + private static void printStatistics(long[] inferenceTimesRaw, String metricsPrefix) { + long[] inferenceTimes = inferenceTimesRaw; + // remove head and tail + if (inferenceTimes.length > 2) { + inferenceTimes = Arrays.copyOfRange(inferenceTimesRaw, + 1, inferenceTimesRaw.length - 1); + } double p50 = percentile(50, inferenceTimes) / 1.0e6; double p99 = percentile(99, inferenceTimes) / 1.0e6; double p90 = percentile(90, inferenceTimes) / 1.0e6; @@ -75,7 +80,12 @@ private static List getContext() { public static void main(String[] args) { if (args.length < 2) { - System.out.println("Please specify model name"); + StringBuilder sb = new StringBuilder(); + sb.append("Please follow the format:"); + sb.append("\n --model-name "); + sb.append("\n --num-runs "); + sb.append("\n --batchsize "); + System.out.println(sb.toString()); return; } String modelName = args[1]; @@ -106,6 +116,8 @@ public static void main(String[] args) { model.runBatchInference(); result[i] = System.nanoTime() - currTime; } + System.out.println("Batchsize: " + model.batchSize); + System.out.println("Num of runs: " + model.numRun); printStatistics(result, modelName +"batch_inference"); } @@ -117,6 +129,7 @@ public static void main(String[] args) { model.runSingleInference(); result[i] = System.nanoTime() - currTime; } + System.out.println("Num of runs: " + model.numRun); printStatistics(result, modelName + "single_inference"); } } diff --git a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java index 5f23cd0ebc64..485e0afa3e46 100644 --- a/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java +++ b/scala-package/examples/src/main/java/org/apache/mxnetexamples/javaapi/benchmark/ObjectDetectionBenchmark.java @@ -24,7 +24,7 @@ import java.util.ArrayList; import java.util.List; -public class ObjectDetectionBenchmark extends InferBase { +class ObjectDetectionBenchmark extends InferBase { @Option(name = "--model-path-prefix", usage = "input model directory and prefix of the model") public String modelPathPrefix = "/model/ssd_resnet50_512"; @Option(name = "--input-image", usage = "the input image")