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 倍。
