WebAssembly 在 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 命令来构建和部署整个应用。
$ 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 模型文件及其相应的分类标签文件。
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
(0)

相关推荐

  • R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

    原文链接:http://tecdat.cn/?p=23184 在本文中,我们将学习如何使用keras,用手写数字图像数据集(即MNIST)进行深度学习.本文的目的是为了让大家亲身体验并熟悉培训课程中的 ...

  • AI再聪明,也很难在实际商业应用中发挥作用

    Venturebeat最近撰文一篇关于AI在企业应用中的报道,原文表达了一个很重要的观点:尽管AI可以在几个小时内精通一款游戏并打败人类冠军,但要很难在实际商业应用中发挥作用,原因是使用AI不像使用一 ...

  • 巧解可能性推理中前提型题目

    [例题]由于我国大城市的房价和物价过高,导致生活成本明显高于中小城市,尤其是对于小城镇来讲,大城市的生活成本是小城镇的数倍.这样一来,势必限制了农村人口向大城市流入.因此,我国仅仅依靠发展大城市来实现 ...

  • 药物在方中的作用【转载】

    药物在方中的作用 发表者:邢卫光 395人已读 1.大黄--大承气汤(配芒硝)--荡涤肠胃热结 温脾汤(配附子)--攻下积滞 桃核承气汤(配核仁)--下瘀泄热 大黄牡丹汤(配核仁)--清泻肠中湿热,活 ...

  • 【智赢智能 | 头条】碳化硅在下一代工业电机驱动器中的作用

    国际能源署(IEA)估计,电机功耗占世界总电力的45%以上.因此,找到最大化其运行能效的方法至关重要.能效更高的驱动装置可以更小,并且更靠近电机,从而减少长电缆带来的挑战.从整体成本和持续可靠性的角度 ...

  • 指标在实战交易中的作用!

    我们在交易当中大部分人都使用指标作为辅助工具来进行买卖.但是也有一些人就看裸k来进行交易,很多人都在探讨这两种方法哪种好用?甚至有些人说指标无用论等等.今天根据我的经验来进行分析和交流,希望能给大家带 ...

  • 研究揭示甲羟戊酸途径在肠道干细胞恶性转化及YAP高活性肠癌中的作用

    来源:上海营养与健康研究所 2021-05-09 09:28 近期,Molecular Cell在线发表了中国科学院上海营养与健康研究所研究员秦骏.研究员肖意传课题组与复旦大学附属肿瘤医院教授彭俊杰团 ...

  • 中药在血液病治疗中的作用

    血液科 郭江水 1 减毒增效 血液病的发生往往是骨髓细胞克隆异常及免疫系统紊乱所致.因此在对血液肿瘤性疾患以细胞毒药物为主,对免疫紊乱而致疾病以免疫抑制剂治疗为主. 中医认为抗肿瘤及免疫抑制剂均属于大 ...

  • 什么是保健食品?植物提取物在保健食品研发中的作用

    自古以来植物就是人类获取药物的主要来源,我国是世界上植物资源最丰富的国家之一,有高等植物约3万种,仅次于巴西和哥伦比亚,特别是药用植物,有11146余种,其资源利用的悠久历史和丰富经验,以及复方的独特 ...

  • AI导航器中的查看边框如何更改颜色?

    在导航器中浏览图片的时候经常会看到中间边框的线,这样的线是可以改变颜色的,下面来看 看如何操作吧! 1.打开导航器,能够看到画面中有一个红色的框. 2.点击右上角的三条横线的按钮. 3.在弹出的对话框 ...