您好,登錄后才能下訂單哦!
本篇文章為大家展示了Labelhub 基于Serverless 技術為人工智能企業提供數據與模型的解決方案是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
Labelhub 是一家致力于為人工智能企業提供完善的數據與模型解決方案公司,可以幫助 AI 企業更好的管理數據,從而提高其核心 AI 產品迭代速度,Labelhub 擁有優秀的敏捷團隊,開發領域涉及機器學習、模型訓練以及軟件應用。目前已經與多家大中型企業進行深度合作,在行業相關比賽中也多次獲獎。
Labelhub 團隊在業務極速擴張的時期,選擇使用Serverless
技術來打造一個輕量的內部運維及數據可視化系統。通過使用 Tencent Serverless Framework,基于云上 Serverless 服務(云函數及觸發器等),無需配置和部署,即可快速開發一套定制化數據可視化系統, Serverless
技術不僅滿足了業務發展的需求,而且不需要耗費太多的人力和資金成本,是 Labelhub 的不二之選。
我所在的團隊開發了一款針對人工智能企業數據標注產品Labelhub,目前正式的銷售工作處于摸索階段,對于目標客戶,產品的定位,一直沒有很好進行梳理。隨著業務的逐漸開展,平臺的運維安全也并沒有進行系統的監控管理。因此我考慮將產品的業務數據、服務器數據及應用監控數據做一個基本的內部運維及數據可視化系統。
雖然有很多的開源工具選擇,但是都避免不了部署及配置,二次開發也比較麻煩,因此考慮自行開發一套簡單的按內部需求完全定制化的系統。
最終,我決定使用 Serverless
來打造這樣一個輕量的內部系統,Serverless
無疑是時下最熱的 IT 詞匯之一,作為一種新型的互聯網軟件產品架構,雖然早在 2012 年就被提出,但隨著近幾年容器技術、IoT
、區塊鏈以及 5G技術的快速發展,Serverless
的概念也借勢得以迅速發展。
它究竟能夠帶來什么,它的紅利是否有門檻,離我們究竟有多遠,值不值得現在開始投入,我會通過這一個項目的一系列文章來和大家一起探討,從一名普通開發者的角度去看看 Serverless
。
我希望此系列文章能夠淺顯易懂,我會盡可能詳細的介紹我在開發這個系統的過程中,對于Serverless
的理解。通過這一系列文章,我希望能夠提供給大家的內容包括:
如何開發一個real world serverless app
對于服務拆分的理解,如何更有效的利用資源
現有的BaaS遷移至FaaS的設想
(如果想到更多會繼續補全)
是基于 Serverless Framework 工具,同時后端使用 Python
進行開發
搭建后端項目結構
Serverless Framework
的文檔中心里,框架支持里目前有 Flask
以及 Django
,按照文檔示例中進行,會發現部署一個簡單的 rest api
十分容易,整個過程如官方宣稱的極速部署。 但看一下項目的結構會發現,只有一個 yml
配置文件、一個依賴文本和一個 app.py
文件,由于配置文件中會使用 hooks
參數將依賴安裝到當前文件夾,這是一個非常簡單的一個示例。 在搭建后端項目目錄的時候,通常情況下本地開發時并不需要考慮以下兩點:
三方庫的引入
公共函數的調用
對于 Serverless
,則需要考慮這兩個問題。
當在示例中執行 sls deploy
,部署成功后可以在控制臺查看函數代碼,此時會發現依賴文件也在文件列表中,這很好的解釋了為什么說 一個函數是一個應用
。 但是實際開發過程中,我們不可能每一個功能模塊都會去安裝一次依賴,因此我們可以借助公共模塊來解決這個問題。但是公共模塊如何進行引入呢。 由于 Serverless cli Component v2
已經取消了 include
配置,對于 v1
可以很輕松的使用 include
配置將公共組件包含在函數中,從而各子函數能夠很方便的進行調用。而對于 v2
,其實我們可以通過 Layer
來解決這個問題。
對于 v1 和 v2 的區別以及詳細介紹,可參考Serverless Framework Cli的版本進化
模塊的拆分,我們則可以通過應用管理中的多實例管理來進行。
項目根目錄的處理
創建項目文件夾
mkdir labelhub-dashboard
在項目根目錄下應用配置文件
cd labelhub-dashboard touch serverless.yml
在應用配置文件中只用定義應用的名稱
app: labelhub-dashboard
公共文件及三方依賴目錄的處理
在根目錄文件夾下創建公共模塊文件夾
mkdir common
我們將依賴以及公共函數放到common
中便于其他模塊進行調用
# labelhub-dashboard/common touch requirements.txt # 創建數據庫連接工具類 touch dataUtils.py
由于只是測試,也可以直接在 common
下運行 pip install pymysql -t ./
將依賴安裝到當前路徑下。
這里使用pymysql來連接數據庫進行測試
編輯 dataUtils.py
文件:
import pymysql class MysqlUtils: def __init__(self): self.getConn({ 'host': 'xxx', 'user': 'xxx', 'port': 3306, 'db': 'xxx', 'password': 'xxx' }) def getConn(self, conf): self.connection = pymysql.connect( host=conf['host'], user=conf['user'], password=conf['password'], port=conf['port'], db=conf['db'], charset='utf8', cursorclass=pymysql.cursors.DictCursor, autocommit=1 ) def doAction(self, stmt, data): try: self.connection.ping(reconnect=True) cursor = self.connection.cursor() cursor.execute(stmt, data) result = cursor cursor.close() return result except Exception as e: try: cursor.close() except: pass return False
準備就緒,就可以進行部署了。前面說過,因為 common
我們會作為 公共函數及三方庫
存放的地方,因此我們需要用 Layer
組件來進行部署。在 common
中創建配置文件
touch serverless.yml
編輯配置文件:
component: layer # 注意,這里使用的是layer組件 name: common-layer org: labelhub-dashboard app: labelhub-dashboard stage: dev inputs: name: commonfiles # 記住這個名字 region: ap-guangzhou src: src: ./ exclude: - .env runtimes: - Python3.6 description: packages
然后執行 sls deploy
,Layer
層部署成功后,會出現函數的詳細信息,需要注意其中version
字段的值,部署完成后我們開始創建功能模塊目錄。
功能模塊目錄的處理
在根目錄下創建一個測試子模塊
mkdir user-data
創建測試文件
touch index.py
編輯測試文件
from mysqlUtils import MysqlUtils import json db = MysqlUtils() def get_users(): search_stmt = ( "SELECT * FROM `user` limit 100;" ) result = db.doAction(search_stmt, ()) if result == False: return False return result def main_handler(event, context): result = get_users() data = [{'id': user['id'], 'name': str(user['name']), 'created_at': user['created_at'].strftime('%Y-%m-%d %H:%M:%S')} for user in result.fetchall()] return data
這里有兩點需要說明:
明明 mysqlUtils
是在 common
文件夾中,而這里卻直接引入 mysqlUtils
,稍后在配置文件中會說明
查詢函數 get_users()
為何寫在這里。其實也可以寫在 mysqlUtils.py
中,但是因為 mysqlUtils.py
是在 Layer
層,而 Layer
層的部署目前使用情況來看,比函數組件部署要耗時更長,因此我把它放在需要使用的函數文件中。即盡量不去修改 common
里的文件。
準備就緒后就可以部署函數了。首先仍然是創建配置文件:
touch serverless.yml
編輯配置文件:
component: scf # 注意,這里使用的是scf組件 name: userdata stage: dev app: labelhub-dashboard org: labelhub-dashboard #組件參數 inputs: name: ${name}-${stage}-${app} #函數名稱 src: src: ./ #代碼路徑 exclude: - .env handler: index.main_handler #入口 runtime: Python3.6 # 云函數運行時的環境 region: ap-guangzhou # 云函數所在區域 layers: - name: commonfiles version: 1 events: # 觸發器 - apigw: # 網關觸發器 parameters: endpoints: - path: / method: GET
通過配置文件,我們可以發現,其中的 layers
配置中的 name
以及 version
,就是在部署 common
時的名稱和部署成功后的版本號。
最后執行 sls deploy
完成部署,直接訪問生成的 url
地址,可以查看到正確的返回信息。
最終文件夾的結構為:
labelhub-dashboard/ serverless.yml common/ requirements.txt serverless.yml mysqlUtils.py user-data/ serverless.yml index.py
在部署 user-data
函數時,我們看到引入 mysqlUtils
,是通過直接引入的方式,而在 user-data
函數的配置文件中可以看到我們使用了對應的 layers
配置。從這里可以看出,在函數的配置中,layers
其實就相當于 v1
中的 include
配置,默認 Layer
組件中的文件與函數文件在相同目錄下。
其實我們可以將所有文件創建好后,在根目錄中執行 sls deploy --all
來一次性進行部署,但在使用過程中會出現函數組件部署報錯,找不到對應的 Layer
組件,這也是因為函數組件部署過程中會去讀取 layers
的配置,而通過實際使用過程中發現 Layer
組件的部署幾乎都會比函數組件慢很多,因此官方也是建議優先部署 Layer
組件,之后再統一部署函數組件。那么我們就需要考慮,函數的應用根目錄,是否可以和公共組件目錄同級,這樣在使用 sls deploy --all
的時候,才可以避免同時更新 Layer 層。
上述內容就是Labelhub 基于Serverless 技術為人工智能企業提供數據與模型的解決方案是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。