看完費老師 2020 在線開發者大會 reinvent 的《在雲端運行你的Tiny ML 推理》主題演講,才發現自己又被推入了絕望深淵(太多令人興奮的內容)尤其是函數計算 AWS Lambda 的發展,今年發布的一系列新特性,包括 AWS Lambda 支持自定義容器鏡像,更多的資源支持,完整的開發語言和官方容器環境等等,我感覺函數計算從早期採用,逐漸走向成熟,必定會成為雲原生應用的一個潮流。
這幾天一直動手體驗 Tiny ML 的代碼(https://github.com/lianghong/reinvent2020),發現遇到最大的坑是 OpenCV 的編譯,比如指定 Python3.8,C++11,去除掉一些不必要的模塊等等,這方面後續會繼續整理成在 AWS EC2 Amazon Linux2 環境中如何編譯 OpenCV 4.5版本公布在 Github 上;
OpenCV 的正面人臉識別是費老師這個視頻的第一個示例,同時是學習 AWS Lambda 的很好的教程,先看看最後的效果,基於原來的代碼(最右側是費老師的圖片例子),我進一步添加了眼睛識別,基於 HAAR 特徵的 Cascade 分類器對於側臉效果一般:
以前寫 Lambda 函數最麻煩的就是調試和測試問題,利用這次新發布的對自定義容器鏡像的支持,發現在本地利用容器進行測試對於熟悉雲原生應用開發的同學來說,太方便了,見下圖,常見的 Lambda 項目是需要把主程序和依賴的包放在一個文件夾,opencv 用起來很簡單,但依賴不少其它庫。
- 1 -打包、部署和運行三部曲正如費老師所演示的,通常的習慣是把 AWS Lambda 程序打成一個 ZIP 包,然後部署到 AWS 平臺,再進行調用,利用費老師的腳步,大家可以非常容易提高自己的效率,但假如你的代碼非常順利執行,這個方式大家還可以接受,但通常寫一段代碼需要相應的測試,尤其稍微複雜的場景實現,有沒有本地測試的辦法?
原本的方法,是利用 AWS Toolkit + SAM CLI + 本地 Lambda Docker 模擬環境,老實說,想想頭就有點大,沒想到今年的 reinvent 就給了一個非常大的驚喜,直接支持自定義容器鏡像!
$ ./zipfile.sh
$ ./deploy.sh
$ ./invoke.sh
Execution time was 3355973833 nanoseconds.
Execution time was 3355 milliseconds.
Execution time was 3.355 seconds.
{
"statusCode": 200,
"body": {
"message": "Find 7 face(s),image saved to s3://jxlabs/ml/opencv/vollyballcn.jpg_rs.jpg"
},
"headers": {
"Content-Type": "application/json"
}
}
Done.
這是什麼概念呢?就是開發者可以直接把 Lambda 應用打包成容器,直接部署到 AWS Lambda 環境。
開發者可以從哪裡開始呢?簡單可以直接使用官方Lambda 鏡像,AWS 通過公開鏡像網站 https://gallery.ecr.aws/ 提供了支持 Python, Node.js, Java, .NET, Go, Ruby 基礎鏡像;當然你也可以基於自身的需求定製兼容 Lambda Runtime API 「黃金容器鏡像」;
AWS 開源了一系列的 Runtime Interface Clients (RIC) 的實現,比如 Python 版本的實現,如何使用見文末的參考資料:
https://github.com/aws/aws-lambda-python-runtime-interface-client
同時,AWS 還開源了一個 AWS Lambda Runtime Interface Emulator,該模擬器提供了一個 HTTP/S 的代理接口,允許用戶在本地利用容器來測試 Lambda 代碼。
比如前面的 OpenCV 的例子,我們首先引用官方 Python3.8的基礎鏡像,定義如下大家都熟悉的 Dockerfile:
FROM public.ecr.aws/lambda/python:3.8
COPY ./opencv_project ${LAMBDA_TASK_ROOT}
RUN ls ${LAMBDA_TASK_ROOT}
CMD [ "app.lambda_handler" ]
本地構建該容器鏡像,並在一個 Terminal 中啟動該鏡像,這個案例中,需要提供兩個 Lambda 環境變量,在 docker run 命令中直接設定 S3 的桶名和對象鍵值:
$ docker build -t lopencv .
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lopencv latest 24f55d9e6f7e 7 seconds ago 712MB
public.ecr.aws/lambda/python 3.8 80e51cc8a434 3 days ago 594MB
$ docker run -p 9000:8080 -e "BUCKET_NAME=jxlabs" -e "S3_KEY=ml/opencv/vollyballcn.jpg" lopencv
time="2020-12-13T13:18:55.011" level=info msg="exec '/var/runtime/bootstrap' (cwd=/var/task, handler=)"
接下來就可以進行 Lambda 函數的本地測試了,通過 CURL 命令傳入所需要的事件 JSON 數據(本案例不需要,演示用):
$ curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
{"statusCode": 200, "body": {"message": "Find 7 face(s),image saved to s3://jxlabs/ml/opencv/vollyballcn.jpg_rs.jpg"}, "headers": {"Content-Type": "application/json"}}
完美!!!
- 3 -總結DevOps 中的開發者特別討厭 Ops 中所涉及複雜的 PaaS 環境,比如 K8S,平時我們為了演示一個彈性伸縮,花了很多時間在構建平臺、網絡、訪問以及安全等方面,而無伺服器的興起,把這些複雜工作(運行時)交給平臺,而開發者更能聚焦業務代碼本身,AWS Lambda 函數計算是無伺服器生態的領路者,打通和容器雲原生技術的融合,為企業在採用無伺服器計算的道路上又清除了一個障礙。
參考資料New for AWS Lambda – Container Image Support
費老師-在雲端運行你的Tiny ML 推理
費老師-在雲端運行你的Tiny ML 推理(代碼)
Jump-starting your serverless development environment
python-lambda-local
申明本站點所有文章,僅代表個人想法,不代表任何公司立場,所有數據都來自公開資料,如有不妥的圖片或內容請公眾號「聯繫作者」
轉載請註明出處