用戶體驗測評筆記:OpenFaaS 和騰訊雲 Serverless

最近看到《用 Serverless 架構部署 TensorFlow 模型推理函數》的活動,對 serverless 非常感興趣,本着學習的心態初步探索兩個 serverless 框架,一個是開源的 OpenFaaS,一個是騰訊雲,通過實際使用和對比初步入門 Serverless。

OpenFaaS
按文檔說明在 Ubuntu 20.04 上部署這個框架。

然後創建 Python 函數:

def handle(req):
print("Hello! You said: " + req)
修改配置,這裏需要寫入 docker hub 的帳號。

version: 1.0
provider:
name: openfaas
gateway: http://127.0.0.1:8080
functions:
pycon:
lang: python3
handler: ./pycon
image: >>> dockerhub 用戶名<<</pycon
OpenFaaS 提供一個叫 faas-cli 的部署工具,faas-cli 會先將鏡像上傳到相應的 docker hub 帳號名下,然後再下拉到 OpenFaaS 服務。

開始部署成功後在 Web 界面 127.0.0.1:8080/ui/ 看到剛纔創建的函數。

測試:

╰─➤ curl localhost:8080/function/pycon -d "Hi"
Hello! You said: Hi
從上面的例子可以看出:

開發者只需要寫好事件處理的函數,修改配置文件,確認部署即可,而不需要了解服務器的基礎架構,甚至也不需要了解代碼實際部署在哪個 Web 框架。
FaaS 服務返回調用接口。
將圖像識別服務部署到騰訊雲
除了將 Serverless 業務構建在硬件和容器(比如,OpenFaaS 使用 docker)之外,還有一種新興的方法: 使用特定於應用程序的虛擬機,比如 WebAssembly(Wasm)。

這個例子通過 Second State 的 Serverless Wasm 虛擬機 (SSVM), 把用 Rust 編寫的圖像識別業務代碼最終編譯成 .so 文件,通過 serverless 工具 上傳到騰訊雲的 FaaS 中。

根據 Second State 的 demo 部署之後,在項目根目錄輸入 sls deploy, 驗證騰訊雲帳號,100 秒左右就部署成功,查看騰訊雲的控制檯,可以看到剛纔部署的功能。

測試:

魔改
通過魔改 Second State 的例子學習騰訊雲 Serverless 的用法。

先了解 tencent-tensorflow-scf 的結構:

cos, layer, scf 三個目錄都有 serveress.yml,執行 sls deploy 的時候,可以看到這三個目錄的文件被打包上傳。

執行 ssvmup build --enable-ext --enable-aot 生成 pkg/scf.so, 需要將它拷貝至 scf/ 目錄。

scf/bootstrap 是一個腳本,運行後是一個服務進程。

核心命令如下,其中 "$_HANDLER" 是 scf.so

RESPONSE=$(LD_LIBRARY_PATH=/opt /opt/ssvm-tensorflow "$_HANDLER" <<< "$EVENT_DATA")
這就說明,我們可以在本地運行 "$_HANDLER"。我們可以先在本地調試業務功能。

首先需要編譯 ssvm-tensorflow , 也可以直接下載二進制運行。

編譯完之後,將 這個 demo 的代碼遷移到 tencent-tensorflow-scf/src/main.rs, 實現魔改:

use std::io::{self, Read};
use ssvm_tensorflow_interface;
use serde::Deserialize;

fn search_vec(vector: &Vec, labels: &Vec<&str>, value: &f32) -> (i32, String) {
for (i, f) in vector.iter().enumerate() {
if f == value {
return (i as i32, labels[i].to_owned());
}
}
return (-1, "Unclassified".to_owned());
}

fn main() {
let model_data: &[u8] = include_bytes!("mobilenet_v2_1.4_224_frozen.pb");
let labels = include_str!("imagenet_slim_labels.txt");
let label_lines : Vec<&str> = labels.lines().collect();

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();

let flat_img = ssvm_tensorflow_interface::load_jpg_image_to_rgb32f(&img_buf, 224, 224);

let mut session = ssvm_tensorflow_interface::Session::new(model_data, ssvm_tensorflow_interface::ModelType::TensorFlow);
session.add_input("input", &flat_img, &[1, 224, 224, 3])
       .add_output("MobilenetV2/Predictions/Softmax")
       .run();
let res_vec: Vec<f32> = session.get_output("MobilenetV2/Predictions/Softmax");
let mut sorted_vec = res_vec.clone(); 
sorted_vec.sort_by(|a, b| b.partial_cmp(a).unwrap());

let top1 = sorted_vec[0];
let top2 = sorted_vec[1];
let top3 = sorted_vec[2];

let r1 = search_vec(&res_vec, &label_lines, &top1);
let r2 = search_vec(&res_vec, &label_lines, &top2);
let r3 = search_vec(&res_vec, &label_lines, &top3);

println!("{}: {:.2}%\n{}: {:.2}%\n{}: {:.2}%"
    , r1.1, top1 * 100.0
    , r2.1, top2 * 100.0   
    , r3.1, top3 * 100.0   
    );

}

[derive(Deserialize, Debug)]

struct FaasInput {
body: String
}
測試:

輸出排名前三的可能結果。

tomato.json 用於模擬請求數據,將圖片數據 base64 之後放在 "body" 後面。

最後重新 sls deploy 部署上線:

總結
本文通過 OpenFaaS 和騰訊雲 Serverless 兩種服務,初步瞭解了將業務部署到雲平臺的過程。通過 FaaS 服務商提供的工具,用戶可以避免直接操作 docker, 或設置腳本運行環境變量等不重要的細節,從而將注意力集中在業務開發上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章