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

1,349 阅读3分钟

阅读本教程后,你将能够独立构建一个用于图像分类的 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 页面: Github.com/second-stat…

国内访问 Gitee 页面: gitee.com/secondstate…

从 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 应用吧!