全新开发体验!腾讯云 Serverless 助力你的 AI 模型进入生产环境

文中带有大量链接,点击阅读原文,查看文中所附资源

阅读本教程后,你将能够独立构建一个用于图像分类的 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 命令来构建和部署整个应用。

代码语言:javascript
复制
$ 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 函数。

安装工具

按照这些简单的指引安装 Rust 和 ssvmup。

Serverless 的 TensorFlow 函数

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

下面是函数源代码的注释版本。注释解释了这个函数执行的7个步骤。在步骤 # 1和 # 2中,我们加载了一个基于食物照片数据集训练的 MobileNet 模型。你可以加载自己重新训练(或微调)的 MobileNet 模型文件及其相应的分类标签文件。

代码语言:javascript
复制
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 的分类标签和自信程度。

代码语言:javascript
复制
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 函数。

代码语言:javascript
复制
$ ssvmup build --enable-aot

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

代码语言:javascript
复制
$ cp pkg/scf.so scf/

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

代码语言:javascript
复制
$ sls deploy

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

相关链接:

One More Thing

立即体验腾讯云 Serverless Demo,获取 Serverless 新用户礼包,请在 PC 端访问:
serverless.cloud.tencent.com/start?c=wx

欢迎进入千人 QQ 群 (537539545) 交流!

  • GitHub: github.com/serverless
  • 官网: cloud.tencent.com/product/serverless-catalog

点击「阅读原文」查看文章所附资源!