TensorFlow

解释器支持 WasmEdge TensorFlow lite 的推断扩展,从而使你的 JavaScript 能够运行 ImageNet 模型来进行图像分类。本文会向你展示如何在你的 javascript 程序中使用基于 WasmEdge 的 TensorFlow Rust SDK。

下面是一个 JavaScript 的示例。全部代码可参考这里 example_js/tensorflow_lite_demo/

1. import {Image} from 'image';
2. import * as std from 'std';
3. import {TensorflowLiteSession} from 'tensorflow_lite';

5. let img = new Image('food.jpg');
6. let img_rgb = img.to_rgb().resize(192, 192);
7. let rgb_pix = img_rgb.pixels();

9. let session = new TensorflowLiteSession(
10. 'lite-model_aiy_vision_classifier_food_V1_1.tflite');
11. session.add_input('input', rgb_pix);
12. session.run();
13. let output = session.get_output('MobilenetV1/Predictions/Softmax');
14. let output_view = new Uint8Array(output);
15. let max = 0;
16. let max_idx = 0;
17. for (var i in output_view) {
18. let v = output_view[i];
19. if (v > max) {
20. max = v;
21. max_idx = i;
22. }
23. }
24. let label_file = std.open('aiy_food_V1_labelmap.txt', 'r');
25. let label = '';
26. for (var i = 0; i <= max_idx; i++) {
27. label = label_file.getline();
28. }
29. label_file.close();

31. print('label:');
32. print(label);
33. print('confidence:');
34. print(max / 255);

为了在 WasmEdge runtime 中运行 JavaScript,你可以在 CLI 中执行如下操作,这样就可以重新构建一个包含 TensorFlow 的 QuickJS 引擎,然后就可以在 JavaScript 应用中调用 TensorFlow API 了。

1. $ cargo build --target wasm32-wasi --release --features=tensorflow
2. ... ...
3. $ cd example_js/tensorflow_lite_demo
4. $ wasmedge-tensorflow-lite --dir .:. ../../target/wasm32-wasi/release/wasmedge_quickjs.wasm main.js
5. label:
6. Hot dog
7. confidence:
8. 0.8941176470588236

注意: 命令行中的 --dir .:. 是为了给 wasmedge 开启本地文件读取权限, 以便正常读取到 main.js 文件.

注意

  • 编译器标志 --features=tensorflow 构建了一个包含 WasmEdge TensorFlow 扩展的 QuickJS 引擎。
  • 程序 wasmedge-tensorflow-lite 是 WasmEdge 包的一部分。它是内含有 Tensorflow 扩展的 WasmEdge runtime。

你现在应该可以看到食物的名字了,它被 TensorFlow lite ImageNet 模型识别出来了。

使其更快

以上 Tensorflow 推断示例执行一次需要耗时 1-2 秒. 在 web 应用场景中虽然可以接受,但是仍然有改进空间。回想一下,WasmEdge 是如今最快的 WebAssembly runtime,这是由于它的提前编译(AOT, Ahead-of-time compiler)优化。WasmEdge 提供了一个 wasmedgec 实用程序去编译和添加原生机器码段,并放到 wasm 文件里,从而达到更快的性能。

以下示例采用了 wasmedge 和 wasmedgec 的扩展版本以支持 WasmEdge Tensorflow 扩展。

1. $ cd example_js/tensorflow_lite_demo
2. $ wasmedgec-tensorflow ../../target/wasm32-wasi/release/wasmedge_quickjs.wasm wasmedge_quickjs.wasm
3. $ wasmedge-tensorflow-lite --dir .:. wasmedge_quickjs.wasm main.js
4. label:
5. Hot dog
6. confidence:
7. 0.8941176470588236

你可以看到,图像识别任务在 0.1 秒内就完成了。它的性能至少提高了 10 倍。