Rust 与 WASM 在 Serverless AI 推理的作用 🦀🦀🦀

1,076 阅读5分钟

公有云中的 Serverless TensorFlow 函数

对于软件开发者和学生来说,人工智能是有偿的。

2021年,最流行的 AI 框架 Tensorflow 开发者的平均年薪为148508 美元,换算成人民币将近百万。

现在,即使是入门级编程工作,开发者也必须具备人工智能技能。实际上,找到一篇教程,为图像识别和自然语言处理等任务训练自己的 Tensorflow 模型非常容易。只需要一些基本的 Python 知识即可进行培训出来模型,然后运行该模型进行演示。

只不过,仅知道如何使用简单的 Python 来训练模型并不会带来太大的收益。

相较训练模型,将训练好的模型作为可靠的 Web 服务提供给其他人使用要困难得多。对于开发者而言,在生产环境中部署 TensorFlow模型存在重大挑战。公司为能够克服这些挑战的人们付出了高昂的价格。

  • Python语言和框架在准备和处理模型的输入和输出数据方面效率低下。据估计,AI 计算工作量的 90% 用于数据准备。 Python语言实在是太繁琐,太慢。
  • 很难按需扩展服务。由于 AI 推理的计算要求,即使只有几个请求,服务器计算机也可能会被暂时中止。按需上下扩展服务器数量至关重要。

但是,有解决此问题的简单方法。借助 WebAssembly 虚拟机 SSVM腾讯云 serverless,你可以使用50行之内的简单 Rust 代码将 Tensorflow 模型作为服务部署到生产环境中。

简单的意思是指所用到的 Rust 函数语法非常简单,都没有用到生命所有权。

通过此模板函数,你能够免费在腾讯云上部署可用于生产环境的 TensorFlow 模型!

如果您按照本文中的步骤进行操作,并在腾讯云上部署了 Tensorflow serverless 函数,你将获得一系列周边产品。活动详情请点击这里请填写此表单,我们将尽快为您送上礼品。

👉 搭建视频观看更佳

怎么工作的

为应对上文提到的挑战,选择的技术如下:

  • Rust 编程语言非常快速且内存安全,是高性能数据处理和模型执行逻辑的理想选择。

  • WebAssembly 充当了现代 Rust 程序、最新的 Tensorflow 库和强化公共云操作系统之间的桥梁。 WebAssembly 是兼容性沙箱,对开发者的体验至关重要。

  • 腾讯云 serverless 提供可扩展的基础架构,以运行 Rust 和 WebAssembly 函数进行 TensorFlow 推理。结合 Serverless 框架,腾讯云 serverless 为部署简单软件提供了出色的开发者体验。

现在,让我们看看它是如何工作的。首先,从 GitHub fork 此模板项目,并完成所有准备工作。你可以使用 GitHub Codespaces IDE 或 Docker 镜像,也可以在自己的计算机上安装 Rustssvmupserverless framework

这里是图像识别 AI 即服务。它通过训练好的 TensorFlow 模型来识别图像中的食物。只需不到 50行简单的Rust代码,就可以将其部署在腾讯云 serverless 上。腾讯云 serverless 可以按需扩展,并且按照实际使用收取费用。

查看已经部署好的网页

代码

Rust 代码用于加载输入图像加载并执行Tensorflow模型以识别该图像上的内容。 这里的模型是 Tensorflow Lite 格式,可以识别输入图像上的食物。

    // 加载训练好的 TensorFlow lite 模型。
    let model_data: &[u8] = include_bytes!("lite-model_aiy_vision_classifier_food_V1_1.tflite");
    
    // 上传图像的格式是 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();
 
    // 加载上传图像并将其调整为192x192,这是这个 MobileNet 模型所需的尺寸。
    let flat_img = ssvm_TensorFlow_interface::load_jpg_image_to_rgb8(&img_buf, 192, 192);
 
    // 用图像作为输入张量运行模型,并获取模型输出张量。
    let mut session = ssvm_TensorFlow_interface::Session::new(&model_data, ssvm_TensorFlow_interface::ModelType::TensorFlowLite);
    session.add_input("input", &flat_img, &[1, 192, 192, 3])
           .run();
    let res_vec: Vec<u8> = session.get_output("MobilenetV1/Predictions/Softmax");
 

res_vec 向量包含图像中每个对象的概率列表(例如,该图像中蛋糕的概率为0.8)。 下面的 Rust 代码读取这些对象的标签,并从 Tensorflow 模型输出中以最高概率打印出对象标签。

let labels = include_str!("aiy_food_V1_labelmap.txt");

let mut i = 0;
let mut max_index: i32 = -1;
let mut max_value: u8 = 0;
while i < res_vec.len() {
    let cur = res_vec[i];
    if cur > max_value {
        max_value = cur;
        max_index = i as i32;
    }
    i += 1;
}

let mut label_lines = labels.lines();
for _i in 0..max_index {
    label_lines.next();
}

let class_name = label_lines.next().unwrap().to_string();
if max_value > 50 && max_index != 0 {
    println!("The image {} contains a <a href='https://www.google.com/search?q={}'>{}</a>", confidence.to_string(), class_name, class_name);
} else {
    println!("No food item is detected");
}

部署你自己的 TensorFlow AI 推理函数

在后端,Rust 代码被编译为 WebAssembly 字节码,并在 SSVM WebAssembly 运行时中执行。 SSVM 已预先配置为能在多个操作系统环境中访问高性能 TensorFlow 本机库,包括腾讯云的 serverless 容器。 反过来,腾讯云 serverless 提供了一个简单的解决方案,用于扩展 Tensorflow 推理函数。

在 Codespaces IDE 中打开一个 Terminal 窗口,然后从 Docker 或命令行运行以下命令以构建云函数。

$ ssvmup build —enable-aot

在 Terminal 窗口,运行下面的命令行将 TensorFlow 云函数部署到腾讯云。

$ cp pkg/scf.so scf/

$ sls deploy
... ...
website: [https://sls-website-ap-hongkong-kfdilz-1302315972.cos-website.ap-hongkong.myqcloud.com](https://sls-website-ap-hongkong-kfdilz-1302315972.cos-website.ap-hongkong.myqcloud.com/)

在浏览器打开你部署得到的 website URL,来看看你吃了啥吧。

小结

在本文中,我们讨论了如何创建简单、安全和高性能的 Rust 函数来运行 Tensorflow 模型,以及如何将这些函数作为可伸缩和按需的 AI 服务部署到公共云上。

现在,你可以免费在腾讯云上免费部署 Tensorflow serverless 函数,并获得精美周边