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';
  4. let img = new Image('food.jpg');
  5. let img_rgb = img.to_rgb().resize(192, 192);
  6. let rgb_pix = img_rgb.pixels();
  7. let session = new TensorflowLiteSession(
  8. 'lite-model_aiy_vision_classifier_food_V1_1.tflite');
  9. session.add_input('input', rgb_pix);
  10. session.run();
  11. let output = session.get_output('MobilenetV1/Predictions/Softmax');
  12. let output_view = new Uint8Array(output);
  13. let max = 0;
  14. let max_idx = 0;
  15. for (var i in output_view) {
  16. let v = output_view[i];
  17. if (v > max) {
  18. max = v;
  19. max_idx = i;
  20. }
  21. }
  22. let label_file = std.open('aiy_food_V1_labelmap.txt', 'r');
  23. let label = '';
  24. for (var i = 0; i <= max_idx; i++) {
  25. label = label_file.getline();
  26. }
  27. label_file.close();
  28. print('label:');
  29. print(label);
  30. print('confidence:');
  31. 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 文件里,从而达到更快的性能。

以下示例采用了 wasmedgewasmedgec 的扩展版本以支持 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 倍。