[tflite] add xnnpack delegate to label_image
rebase and resubmit #36749 to see if it works.
This commit is contained in:
parent
69396208c8
commit
70cb1703c4
|
@ -33,6 +33,7 @@ cc_binary(
|
||||||
"//tensorflow/lite:framework",
|
"//tensorflow/lite:framework",
|
||||||
"//tensorflow/lite:string_util",
|
"//tensorflow/lite:string_util",
|
||||||
"//tensorflow/lite/delegates/nnapi:nnapi_delegate",
|
"//tensorflow/lite/delegates/nnapi:nnapi_delegate",
|
||||||
|
"//tensorflow/lite/delegates/xnnpack:xnnpack_delegate",
|
||||||
"//tensorflow/lite/kernels:builtin_ops",
|
"//tensorflow/lite/kernels:builtin_ops",
|
||||||
"//tensorflow/lite/profiling:profiler",
|
"//tensorflow/lite/profiling:profiler",
|
||||||
"//tensorflow/lite/tools/evaluation:utils",
|
"//tensorflow/lite/tools/evaluation:utils",
|
||||||
|
|
|
@ -90,39 +90,96 @@ adb push tensorflow/lite/examples/label_image/testdata/grace_hopper.bmp /data/l
|
||||||
adb push /tmp/labels.txt /data/local/tmp
|
adb push /tmp/labels.txt /data/local/tmp
|
||||||
```
|
```
|
||||||
|
|
||||||
Run it, `adb shell "/data/local/tmp/label_image \ -m
|
Run it,
|
||||||
/data/local/tmp/mobilenet_v1_1.0_224.tflite \ -i
|
```
|
||||||
/data/local/tmp/grace_hopper.bmp \ -l /data/local/tmp/labels.txt"` then you
|
adb shell "/data/local/tmp/label_image \
|
||||||
should see something like the followings: `Loaded model
|
-m /data/local/tmp/mobilenet_v1_1.0_224.tflite \
|
||||||
/data/local/tmp/mobilenet_v1_1.0_224.tflite resolved reporter INFO: Initialized
|
-i /data/local/tmp/grace_hopper.bmp \
|
||||||
TensorFlow Lite runtime. invoked average time: 25.03 ms 0.907071: 653 military
|
-l /data/local/tmp/labels.txt"
|
||||||
uniform 0.0372416: 907 Windsor tie 0.00733753: 466 bulletproof vest 0.00592852:
|
```
|
||||||
458 bow tie 0.00414091: 514 cornet`
|
then you should see something like the followings:
|
||||||
|
```
|
||||||
|
Loaded model
|
||||||
|
/data/local/tmp/mobilenet_v1_1.0_224.tflite
|
||||||
|
resolved reporter
|
||||||
|
INFO: Initialized TensorFlow Lite runtime.
|
||||||
|
invoked
|
||||||
|
average time: 25.03 ms
|
||||||
|
0.907071: 653 military uniform
|
||||||
|
0.0372416: 907 Windsor tie
|
||||||
|
0.00733753: 466 bulletproof vest
|
||||||
|
0.00592852: 458 bow tie
|
||||||
|
0.00414091: 514 cornet
|
||||||
|
```
|
||||||
|
|
||||||
Run the model with NNAPI delegate (`-a 1`), `adb shell
|
Run the model with NNAPI delegate (`-a 1`),
|
||||||
"/data/local/tmp/label_image \ -m /data/local/tmp/mobilenet_v1_1.0_224.tflite \
|
```
|
||||||
-i /data/local/tmp/grace_hopper.bmp \ -l /data/local/tmp/labels.txt -a 1 -f 1"`
|
adb shell "/data/local/tmp/label_image \
|
||||||
then you should see something like the followings: `Loaded model
|
-m /data/local/tmp/mobilenet_v1_1.0_224.tflite \
|
||||||
/data/local/tmp/mobilenet_v1_1.0_224.tflite resolved reporter INFO: Initialized
|
-i /data/local/tmp/grace_hopper.bmp \
|
||||||
TensorFlow Lite runtime. INFO: Created TensorFlow Lite delegate for NNAPI.
|
-l /data/local/tmp/labels.txt -a 1 -f 1"
|
||||||
Applied NNAPI delegate.invoked average time: 10.348 ms 0.905401: 653 military
|
```
|
||||||
uniform 0.0379589: 907 Windsor tie 0.00735866: 466 bulletproof vest 0.00605307:
|
then you should see something like the followings:
|
||||||
458 bow tie 0.00422573: 514 cornet`
|
```
|
||||||
|
Loaded model /data/local/tmp/mobilenet_v1_1.0_224.tflite
|
||||||
|
resolved reporter
|
||||||
|
INFO: Initialized TensorFlow Lite runtime.
|
||||||
|
INFO: Created TensorFlow Lite delegate for NNAPI.
|
||||||
|
Applied NNAPI delegate.
|
||||||
|
invoked average time:10.348 ms
|
||||||
|
0.905401: 653 military uniform
|
||||||
|
0.0379589: 907 Windsor tie
|
||||||
|
0.00735866: 466 bulletproof vest
|
||||||
|
0.00605307: 458 bow tie
|
||||||
|
0.00422573: 514 cornet
|
||||||
|
```
|
||||||
|
|
||||||
To run a model with the Hexagon Delegate, assuming we have followed the
|
To run a model with the Hexagon Delegate, assuming we have followed the
|
||||||
[Hexagon Delegate Guide](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/performance/hexagon_delegate.md)
|
[Hexagon Delegate Guide](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/g3doc/performance/hexagon_delegate.md)
|
||||||
and installed Hexagon libraries in `/data/local/tmp`. Run it `adb shell
|
and installed Hexagon libraries in `/data/local/tmp`. Run it
|
||||||
"/data/local/tmp/label_image \ -m
|
```
|
||||||
/data/local/tmp/mobilenet_v1_1.0_224_quant.tflite \ -i
|
adb shell "/data/local/tmp/label_image \
|
||||||
/data/local/tmp/grace_hopper.bmp \ -l /data/local/tmp/labels.txt -j 1"` then you
|
-m /data/local/tmp/mobilenet_v1_1.0_224_quant.tflite \
|
||||||
should see something like the followings: ``` Loaded model
|
-i /data/local/tmp/grace_hopper.bmp \
|
||||||
/data/local/tmp/mobilenet_v1_1.0_224_quant.tflite resolved reporter INFO:
|
-l /data/local/tmp/labels.txt -j 1"
|
||||||
Initialized TensorFlow Lite runtime. INFO: Created TensorFlow Lite delegate for
|
```
|
||||||
Hexagon. INFO: Hexagon delegate: 31 nodes delegated out of 31 nodes.
|
then you should see something like the followings:
|
||||||
|
```
|
||||||
|
Loaded model /data/local/tmp/mobilenet_v1_1.0_224_quant.tflite
|
||||||
|
resolved reporter
|
||||||
|
INFO: Initialized TensorFlow Lite runtime.
|
||||||
|
INFO: Created TensorFlow Lite delegate for Hexagon.
|
||||||
|
INFO: Hexagon delegate: 31 nodes delegated out of 31 nodes.
|
||||||
|
|
||||||
remote_handle_control available and used Applied Hexagon delegate.invoked
|
remote_handle_control available and used
|
||||||
average time: 8.307 ms 0.729412: 653 military uniform 0.0980392: 907 Windsor tie
|
Applied Hexagon delegate.invoked
|
||||||
0.0313726: 466 bulletproof vest 0.0313726: 458 bow tie 0.0117647: 700 panpipe
|
average time: 8.307 ms
|
||||||
|
0.729412: 653 military uniform
|
||||||
|
0.0980392: 907 Windsor tie
|
||||||
|
0.0313726: 466 bulletproof vest
|
||||||
|
0.0313726: 458 bow tie
|
||||||
|
0.0117647: 700 panpipe
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the model with the XNNPACK delegate (`-x 1`),
|
||||||
|
```
|
||||||
|
adb shell "/data/local/tmp/label_image \
|
||||||
|
-m /data/local/tmp/mobilenet_v1_1.0_224.tflite \
|
||||||
|
-i /data/local/tmp/grace_hopper.bmp \
|
||||||
|
-l /data/local/tmp/labels.txt -x 1"
|
||||||
|
```
|
||||||
|
then you should see something like the followings:
|
||||||
|
```
|
||||||
|
Loaded model /data/local/tmp/mobilenet_v1_1.0_224.tflite
|
||||||
|
resolved reporter
|
||||||
|
INFO: Initialized TensorFlow Lite runtime.
|
||||||
|
Applied XNNPACK delegate.invoked
|
||||||
|
average time: 11.0237 ms
|
||||||
|
0.90707: 653 military uniform
|
||||||
|
0.0372418: 907 Windsor tie
|
||||||
|
0.0073376: 466 bulletproof vest
|
||||||
|
0.00592856: 458 bow tie
|
||||||
|
0.00414093: 514 cornet
|
||||||
```
|
```
|
||||||
|
|
||||||
See the `label_image.cc` source code for other command line options.
|
See the `label_image.cc` source code for other command line options.
|
||||||
|
|
|
@ -37,6 +37,7 @@ limitations under the License.
|
||||||
|
|
||||||
#include "absl/memory/memory.h"
|
#include "absl/memory/memory.h"
|
||||||
#include "tensorflow/lite/delegates/nnapi/nnapi_delegate.h"
|
#include "tensorflow/lite/delegates/nnapi/nnapi_delegate.h"
|
||||||
|
#include "tensorflow/lite/delegates/xnnpack/xnnpack_delegate.h"
|
||||||
#include "tensorflow/lite/examples/label_image/bitmap_helpers.h"
|
#include "tensorflow/lite/examples/label_image/bitmap_helpers.h"
|
||||||
#include "tensorflow/lite/examples/label_image/get_top_n.h"
|
#include "tensorflow/lite/examples/label_image/get_top_n.h"
|
||||||
#include "tensorflow/lite/kernels/register.h"
|
#include "tensorflow/lite/kernels/register.h"
|
||||||
|
@ -101,6 +102,19 @@ TfLiteDelegatePtrMap GetDelegates(Settings* s) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (s->xnnpack_delegate) {
|
||||||
|
TfLiteXNNPackDelegateOptions xnnpack_options =
|
||||||
|
TfLiteXNNPackDelegateOptionsDefault();
|
||||||
|
xnnpack_options.num_threads = s->number_of_threads;
|
||||||
|
|
||||||
|
auto delegate = evaluation::CreateXNNPACKDelegate(&xnnpack_options);
|
||||||
|
if (!delegate) {
|
||||||
|
LOG(INFO) << "XNNPACK acceleration is unsupported on this platform.";
|
||||||
|
} else {
|
||||||
|
delegates.emplace("XNNPACK", std::move(delegate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return delegates;
|
return delegates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,6 +374,7 @@ void display_usage() {
|
||||||
<< "--threads, -t: number of threads\n"
|
<< "--threads, -t: number of threads\n"
|
||||||
<< "--verbose, -v: [0|1] print more information\n"
|
<< "--verbose, -v: [0|1] print more information\n"
|
||||||
<< "--warmup_runs, -w: number of warmup runs\n"
|
<< "--warmup_runs, -w: number of warmup runs\n"
|
||||||
|
<< "--xnnpack_delegate, -x: xnnpack delegate\n"
|
||||||
<< "\n";
|
<< "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -386,13 +401,14 @@ int Main(int argc, char** argv) {
|
||||||
{"warmup_runs", required_argument, nullptr, 'w'},
|
{"warmup_runs", required_argument, nullptr, 'w'},
|
||||||
{"gl_backend", required_argument, nullptr, 'g'},
|
{"gl_backend", required_argument, nullptr, 'g'},
|
||||||
{"hexagon_delegate", required_argument, nullptr, 'j'},
|
{"hexagon_delegate", required_argument, nullptr, 'j'},
|
||||||
|
{"xnnpack_delegate", required_argument, nullptr, 'x'},
|
||||||
{nullptr, 0, nullptr, 0}};
|
{nullptr, 0, nullptr, 0}};
|
||||||
|
|
||||||
/* getopt_long stores the option index here. */
|
/* getopt_long stores the option index here. */
|
||||||
int option_index = 0;
|
int option_index = 0;
|
||||||
|
|
||||||
c = getopt_long(argc, argv,
|
c = getopt_long(argc, argv,
|
||||||
"a:b:c:d:e:f:g:i:j:l:m:p:r:s:t:v:w:", long_options,
|
"a:b:c:d:e:f:g:i:j:l:m:p:r:s:t:v:w:x:", long_options,
|
||||||
&option_index);
|
&option_index);
|
||||||
|
|
||||||
/* Detect the end of the options. */
|
/* Detect the end of the options. */
|
||||||
|
@ -460,6 +476,9 @@ int Main(int argc, char** argv) {
|
||||||
s.number_of_warmup_runs =
|
s.number_of_warmup_runs =
|
||||||
strtol(optarg, nullptr, 10); // NOLINT(runtime/deprecated_fn)
|
strtol(optarg, nullptr, 10); // NOLINT(runtime/deprecated_fn)
|
||||||
break;
|
break;
|
||||||
|
case 'x':
|
||||||
|
s.xnnpack_delegate = optarg;
|
||||||
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
case '?':
|
case '?':
|
||||||
/* getopt_long already printed an error message. */
|
/* getopt_long already printed an error message. */
|
||||||
|
|
|
@ -31,6 +31,7 @@ struct Settings {
|
||||||
bool allow_fp16 = false;
|
bool allow_fp16 = false;
|
||||||
bool gl_backend = false;
|
bool gl_backend = false;
|
||||||
bool hexagon_delegate = false;
|
bool hexagon_delegate = false;
|
||||||
|
bool xnnpack_delegate = false;
|
||||||
int loop_count = 1;
|
int loop_count = 1;
|
||||||
float input_mean = 127.5f;
|
float input_mean = 127.5f;
|
||||||
float input_std = 127.5f;
|
float input_std = 127.5f;
|
||||||
|
|
|
@ -100,6 +100,8 @@ MACH_ARM_SRCS = [
|
||||||
cc_library(
|
cc_library(
|
||||||
name = "cpuinfo_impl",
|
name = "cpuinfo_impl",
|
||||||
srcs = select({
|
srcs = select({
|
||||||
|
":linux_aarch64": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM64_SRCS,
|
||||||
|
":linux_arm": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS,
|
||||||
":linux_x86_64": COMMON_SRCS + X86_SRCS + LINUX_SRCS + LINUX_X86_SRCS,
|
":linux_x86_64": COMMON_SRCS + X86_SRCS + LINUX_SRCS + LINUX_X86_SRCS,
|
||||||
":macos_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS,
|
":macos_x86_64": COMMON_SRCS + X86_SRCS + MACH_SRCS + MACH_X86_SRCS,
|
||||||
":android_armv7": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS + ANDROID_ARM_SRCS,
|
":android_armv7": COMMON_SRCS + ARM_SRCS + LINUX_SRCS + LINUX_ARM32_SRCS + ANDROID_ARM_SRCS,
|
||||||
|
@ -158,6 +160,18 @@ cc_library(
|
||||||
|
|
||||||
############################# Build configurations #############################
|
############################# Build configurations #############################
|
||||||
|
|
||||||
|
config_setting(
|
||||||
|
name = "linux_aarch64",
|
||||||
|
values = {"cpu": "aarch64"},
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
|
config_setting(
|
||||||
|
name = "linux_arm",
|
||||||
|
values = {"cpu": "arm"},
|
||||||
|
visibility = ["//visibility:public"],
|
||||||
|
)
|
||||||
|
|
||||||
config_setting(
|
config_setting(
|
||||||
name = "linux_x86_64",
|
name = "linux_x86_64",
|
||||||
values = {"cpu": "k8"},
|
values = {"cpu": "k8"},
|
||||||
|
|
Loading…
Reference in New Issue