WebAssembly 在 AI 推理中的作用

荒凉一梦 提交于 2021-01-27 02:39:38
文中带有大量链接,点击阅读原文,查看文中所附资源

阅读本教程后,你将能够独立构建一个用于图像分类的 Serverless 应用,比如这个 能识别食物的网页  。你也可以在腾讯云上试试 更多 TensorFlow 函数

人工智能(AI)正在改变我们的生活。但是,AI 应用所需要的,远远不止算法、数据科学和大数据训练模型。据估计,在生产环境中,95% 的人工智能计算都是用于推理的。使用人工智能推理服务的最佳平台是公共云或边缘云 ,因为云能够提供丰富的计算能力、高效安全的模型管理,以及更快的 5G 互联网连接。

把 AI 模型放到云上的生产环境,比如腾讯云,我们有几种方法。
  • 你可以启动一个虚拟机服务器,并使用 TensorFlow Server 等工具运行 AI 模型。这种 DIY 方法需要对人工智能和操作系统都有深入的操作知识,而且通常相当昂贵,因为你需要为闲置资源付费。
  • 你也可以使用公有云的 AI SaaS 服务上传自己的模型,然后使用 web UI 或 API 上传数据进行推理。这很容易,但不太灵活。会受到 SaaS 所支持的模型、配置和数据预处理/后处理的种类的限制。

但是对于大多数开发者来说,在自己的应用程序中使用 AI 推理需要灵活性与易用性兼备。也就是说,大部分的应用需求介于 DIY 和 AI SaaS 之间。这是为什么在生产环境中部署 AI 模型是一件很有挑战的事。

大多数开发者只是想编写几行代码来加载他们自己的人工智能模型,然后根据模型需求准备数据输入和输出。这就是 TensorFlow Serverless 函数的用武之地。它让我们方便快速地将 AI 模型用在 web 应用中。现在让我们开始吧!

腾讯云 Serverless 上的 Second State TensorFlow 函数可以用非常简单的 Rust 语法写。如果你有兴趣了解 Rust 是什么 (Rust 是 Stackoverflow 过去四年来最受欢迎的编程语言) ,现在你的机会来了,请继续阅读这个教程,几分钟就可以编写和发布一个 Rust 函数,并进行 AI 推理!

快速启动

确保安装了 Serverless Framework。Clone 或 fork 下面的 Github 或 Gitee repo:

  • 国际访问 GitHub 页面: 
    https://Github.com/second-state/tencent-TensorFlow-scf/

  • 国内访问 Gitee 页面:  
    https://Gitee.com/secondstate/tencent-TensorFlow-scf/

从 repo 的根目录中,运行 sls deploy 命令来构建和部署整个应用。
      
      
$ sls deploy ... ... website: https://sls-website-ap-hongkong-kfdilz-1302315972.cos-website.ap-hongkong.myqcloud.com vendorMessage: null 63s › tencent-TensorFlow-scf › "deploy" ran for 3 apps successfully.

在浏览器中加载部署得到的网址,就可以使用这个函数来识别上传图片中的食物 了。

接下来,我们将展示如何更改源代码,从而可以让你为自己的 AI 模型创建 TensorFlow 函数。


安装工具

按照这些简单的指引安装 Rustssvmup

Serverless 的 TensorFlow 函数

我们的 Serverless 函数是用 Rust 编写的,并编译为 WebAssembly。Rust 函数负责繁重的数据准备和模型准备工作。这两个任务都高度依赖于函数的实际使用场景。然后调用 API 来执行 TensorFlow 模型,并分析模型的返回值。

下面是函数源代码的注释版本。注释解释了这个函数执行的7个步骤。在步骤 # 1和 # 2中,我们加载了一个基于食物照片数据集训练的 MobileNet 模型。你可以加载自己重新训练(或微调)的 MobileNet 模型文件及其相应的分类标签文件。
     
     
fn main() { //1.加载训练好的 TensorFlow lite 模型。 let model_data: &[u8] = include_bytes!("lite-model_aiy_vision_classifier_food_V1_1.tflite"); //2. 加载与模型相对应的分类标签文件。 //注:模型输出是一系列数字。标签文件会将这些编号(即行号)映射至食物分类的实际文字描述。 let labels = include_str!("aiy_food_V1_labelmap.txt"); //3. 上传图像的格式是 base64 编码,并通过腾讯云 API 网关封装在 JSON 对象中。 let mut buffer = String::new(); io::stdin().read_to_string(&mut buffer).expect("Error reading from STDIN"); let obj: FaasInput = serde_json::from_str(&buffer).unwrap(); let img_buf = base64::decode_config(&(obj.body), base64::STANDARD).unwrap(); //4.加载上传图像并将其调整为192x192,这是这个 MobileNet 模型所需的尺寸。 let flat_img = ssvm_TensorFlow_interface::load_jpg_image_to_rgb8(&img_buf, 192, 192); //5. 用图像作为输入张量运行模型,并获取模型输出张量。 //5.1 初始化模型,并将模型类型指定为 TensorFlow Lite。 let mut session = ssvm_TensorFlow_interface::Session::new(&model_data, ssvm_TensorFlow_interface::ModelType::TensorFlowLite); //5.2 指定模型的输入张量名称、数据和形状,以及输出张量名称。支持多个输入和输出张量。运行该模型。 session.add_input("input", &flat_img, &[1, 192, 192, 3]) .run(); let res_vec: Vec<u8> = session.get_output("MobilenetV1/Predictions/Softmax"); //6. res_vec 向量中的每个数字对应标签文件中每一行标签的概率。 //6.1 找出最高的概率... //6.2 把概率翻译成文本... //6.3 查找相应的标签文本... //7. 文本标签和概率通过 STDOUT 返回给函数的调用者。 let class_name = label_lines.next().unwrap().to_string(); println!("上传的图片里面{} <a href='https://www.google.com/search?q={}'>{}</a>", confidence.to_string(), class_name, class_name); }


步骤 # 3 与 # 4准备模型和图像数据。#5 调用 API 来执行 TensorFlow 模型,并处理返回的张量,把张量转化为概率数组。在 # 6和 # 7中,Serverless 函数通过概率数组找到图像的标签,并输出结果。

Web UI

这篇教程的开发者模板中包含一个 静态网页,展示了如何从 JavaScript 调用 Serverless 函数。网页用 JavaScript AJAX 上传一个图片文件。在提交到腾讯云的 API 网关之前,图像数据被编码成 base64。AJAX 收到的响应是 Serverless 函数的输出,也就是从图片推理的 MobileNet 的分类标签和自信程度。
function callServerlessFunction () {  var reader = new FileReader();  reader.readAsDataURL(document.querySelector('#select_file').files[0]);  reader.onloadend = function () {    $.ajax({      url: window.env.API_URL,      type: "post",      data : reader.result.split("base64,")[1],      dataType: "text",      success: function (data) {        document.querySelector('#msg').innerHTML = data;      },      error: function(jqXHR, exception){        document.querySelector('#msg').innerHTML = '服务繁忙,请稍后重试';      }    });  };  return false;}

在我们的这个示例中,Web UI 与后端的 Serverless 函数完全分离。事实上,我们还可以通过 CDN 、去中心化存储、甚至作为本地文件分发这个静态网页,它仍然会工作。这种设计模式称为 Jamstack 应用程序

部署

到这一步,你已经知道了怎么更新 Serverless 函数来使用自己的 TensorFlow 模型,以及 index.html 中的相应 UI 来反映新模型的功能。是时候部署你的应用了。

首先使用 ssvmup 工具来编译 Rust 函数。
     
     
$ ssvmup build --enable-aot

然后将构建结果 scf.so 文件复制到模版目录中。

     
     
$ cp pkg/scf.so scf/

最后,使用 Serverless Framework 部署整个应用,包括 Serverless 函数和 Web UI。你可以编辑 .env 文件来指定应用程序的可用区域。

     
     
$ sls deploy

按照屏幕上的说明登录腾讯云并给予许可。最后,你会得到一个 Web UI 的 URL。跳转这个 URL 来试试看你的 AI Serverless 应用吧!

相关链接:

  • TensorFlow 函数demo:
    http://secondstate.info/tencent/
  • 腾讯云 Serverless 上的 AI 推理模板:
    https://Github.com/second-state/tencent-TensorFlow-scf/
  • 国内镜像:
    https://Gitee.com/secondstate/tencent-TensorFlow-scf/
  • 腾讯云 Serverless:
    https://cloud.tencent.com/product/scf


点击阅读原文,查看文章所附资源

本文分享自微信公众号 - WebAssembly 中文社区(webassemblywasm)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!