本篇文章為大家展示了Labelhub 基于Serverless 技術(shù)為人工智能企業(yè)提供數(shù)據(jù)與模型的解決方案是什么,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司是創(chuàng)新、創(chuàng)意、研發(fā)型一體的綜合型網(wǎng)站建設(shè)公司,自成立以來公司不斷探索創(chuàng)新,始終堅(jiān)持為客戶提供滿意周到的服務(wù),在本地打下了良好的口碑,在過去的十余年時(shí)間我們累計(jì)服務(wù)了上千家以及全國(guó)政企客戶,如木屋等企業(yè)單位,完善的項(xiàng)目管理流程,嚴(yán)格把控項(xiàng)目進(jìn)度與質(zhì)量監(jiān)控加上過硬的技術(shù)實(shí)力獲得客戶的一致贊美。
Labelhub 是一家致力于為人工智能企業(yè)提供完善的數(shù)據(jù)與模型解決方案公司,可以幫助 AI 企業(yè)更好的管理數(shù)據(jù),從而提高其核心 AI 產(chǎn)品迭代速度,Labelhub 擁有優(yōu)秀的敏捷團(tuán)隊(duì),開發(fā)領(lǐng)域涉及機(jī)器學(xué)習(xí)、模型訓(xùn)練以及軟件應(yīng)用。目前已經(jīng)與多家大中型企業(yè)進(jìn)行深度合作,在行業(yè)相關(guān)比賽中也多次獲獎(jiǎng)。
Labelhub 團(tuán)隊(duì)在業(yè)務(wù)極速擴(kuò)張的時(shí)期,選擇使用Serverless
技術(shù)來打造一個(gè)輕量的內(nèi)部運(yùn)維及數(shù)據(jù)可視化系統(tǒng)。通過使用 Tencent Serverless Framework,基于云上 Serverless 服務(wù)(云函數(shù)及觸發(fā)器等),無需配置和部署,即可快速開發(fā)一套定制化數(shù)據(jù)可視化系統(tǒng), Serverless
技術(shù)不僅滿足了業(yè)務(wù)發(fā)展的需求,而且不需要耗費(fèi)太多的人力和資金成本,是 Labelhub 的不二之選。
我所在的團(tuán)隊(duì)開發(fā)了一款針對(duì)人工智能企業(yè)數(shù)據(jù)標(biāo)注產(chǎn)品Labelhub,目前正式的銷售工作處于摸索階段,對(duì)于目標(biāo)客戶,產(chǎn)品的定位,一直沒有很好進(jìn)行梳理。隨著業(yè)務(wù)的逐漸開展,平臺(tái)的運(yùn)維安全也并沒有進(jìn)行系統(tǒng)的監(jiān)控管理。因此我考慮將產(chǎn)品的業(yè)務(wù)數(shù)據(jù)、服務(wù)器數(shù)據(jù)及應(yīng)用監(jiān)控?cái)?shù)據(jù)做一個(gè)基本的內(nèi)部運(yùn)維及數(shù)據(jù)可視化系統(tǒng)。
雖然有很多的開源工具選擇,但是都避免不了部署及配置,二次開發(fā)也比較麻煩,因此考慮自行開發(fā)一套簡(jiǎn)單的按內(nèi)部需求完全定制化的系統(tǒng)。
最終,我決定使用 Serverless
來打造這樣一個(gè)輕量的內(nèi)部系統(tǒng),Serverless
無疑是時(shí)下最熱的 IT 詞匯之一,作為一種新型的互聯(lián)網(wǎng)軟件產(chǎn)品架構(gòu),雖然早在 2012 年就被提出,但隨著近幾年容器技術(shù)、IoT
、區(qū)塊鏈以及 5G技術(shù)的快速發(fā)展,Serverless
的概念也借勢(shì)得以迅速發(fā)展。
它究竟能夠帶來什么,它的紅利是否有門檻,離我們究竟有多遠(yuǎn),值不值得現(xiàn)在開始投入,我會(huì)通過這一個(gè)項(xiàng)目的一系列文章來和大家一起探討,從一名普通開發(fā)者的角度去看看 Serverless
。
我希望此系列文章能夠淺顯易懂,我會(huì)盡可能詳細(xì)的介紹我在開發(fā)這個(gè)系統(tǒng)的過程中,對(duì)于Serverless
的理解。通過這一系列文章,我希望能夠提供給大家的內(nèi)容包括:
如何開發(fā)一個(gè)real world serverless app
對(duì)于服務(wù)拆分的理解,如何更有效的利用資源
現(xiàn)有的BaaS遷移至FaaS的設(shè)想
(如果想到更多會(huì)繼續(xù)補(bǔ)全)
是基于 Serverless Framework 工具,同時(shí)后端使用 Python
進(jìn)行開發(fā)
搭建后端項(xiàng)目結(jié)構(gòu)
Serverless Framework
的文檔中心里,框架支持里目前有 Flask
以及 Django
,按照文檔示例中進(jìn)行,會(huì)發(fā)現(xiàn)部署一個(gè)簡(jiǎn)單的 rest api
十分容易,整個(gè)過程如官方宣稱的極速部署。 但看一下項(xiàng)目的結(jié)構(gòu)會(huì)發(fā)現(xiàn),只有一個(gè) yml
配置文件、一個(gè)依賴文本和一個(gè) app.py
文件,由于配置文件中會(huì)使用 hooks
參數(shù)將依賴安裝到當(dāng)前文件夾,這是一個(gè)非常簡(jiǎn)單的一個(gè)示例。 在搭建后端項(xiàng)目目錄的時(shí)候,通常情況下本地開發(fā)時(shí)并不需要考慮以下兩點(diǎn):
三方庫(kù)的引入
公共函數(shù)的調(diào)用
對(duì)于 Serverless
,則需要考慮這兩個(gè)問題。
當(dāng)在示例中執(zhí)行 sls deploy
,部署成功后可以在控制臺(tái)查看函數(shù)代碼,此時(shí)會(huì)發(fā)現(xiàn)依賴文件也在文件列表中,這很好的解釋了為什么說 一個(gè)函數(shù)是一個(gè)應(yīng)用
。 但是實(shí)際開發(fā)過程中,我們不可能每一個(gè)功能模塊都會(huì)去安裝一次依賴,因此我們可以借助公共模塊來解決這個(gè)問題。但是公共模塊如何進(jìn)行引入呢。 由于 Serverless cli Component v2
已經(jīng)取消了 include
配置,對(duì)于 v1
可以很輕松的使用 include
配置將公共組件包含在函數(shù)中,從而各子函數(shù)能夠很方便的進(jìn)行調(diào)用。而對(duì)于 v2
,其實(shí)我們可以通過 Layer
來解決這個(gè)問題。
對(duì)于 v1 和 v2 的區(qū)別以及詳細(xì)介紹,可參考Serverless Framework Cli的版本進(jìn)化
模塊的拆分,我們則可以通過應(yīng)用管理中的多實(shí)例管理來進(jìn)行。
項(xiàng)目根目錄的處理
創(chuàng)建項(xiàng)目文件夾
mkdir labelhub-dashboard
在項(xiàng)目根目錄下應(yīng)用配置文件
cd labelhub-dashboard touch serverless.yml
在應(yīng)用配置文件中只用定義應(yīng)用的名稱
app: labelhub-dashboard
公共文件及三方依賴目錄的處理
在根目錄文件夾下創(chuàng)建公共模塊文件夾
mkdir common
我們將依賴以及公共函數(shù)放到common
中便于其他模塊進(jìn)行調(diào)用
# labelhub-dashboard/common touch requirements.txt # 創(chuàng)建數(shù)據(jù)庫(kù)連接工具類 touch dataUtils.py
由于只是測(cè)試,也可以直接在 common
下運(yùn)行 pip install pyMySQL -t ./
將依賴安裝到當(dāng)前路徑下。
這里使用pymysql來連接數(shù)據(jù)庫(kù)進(jìn)行測(cè)試
編輯 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
準(zhǔn)備就緒,就可以進(jìn)行部署了。前面說過,因?yàn)?common
我們會(huì)作為 公共函數(shù)及三方庫(kù)
存放的地方,因此我們需要用 Layer
組件來進(jìn)行部署。在 common
中創(chuàng)建配置文件
touch serverless.yml
編輯配置文件:
component: layer # 注意,這里使用的是layer組件 name: common-layer org: labelhub-dashboard app: labelhub-dashboard stage: dev inputs: name: commonfiles # 記住這個(gè)名字 region: ap-guangzhou src: src: ./ exclude: - .env runtimes: - Python3.6 description: packages
然后執(zhí)行 sls deploy
,Layer
層部署成功后,會(huì)出現(xiàn)函數(shù)的詳細(xì)信息,需要注意其中version
字段的值,部署完成后我們開始創(chuàng)建功能模塊目錄。
功能模塊目錄的處理
在根目錄下創(chuàng)建一個(gè)測(cè)試子模塊
mkdir user-data
創(chuàng)建測(cè)試文件
touch index.py
編輯測(cè)試文件
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
這里有兩點(diǎn)需要說明:
明明 mysqlUtils
是在 common
文件夾中,而這里卻直接引入 mysqlUtils
,稍后在配置文件中會(huì)說明
查詢函數(shù) get_users()
為何寫在這里。其實(shí)也可以寫在 mysqlUtils.py
中,但是因?yàn)?mysqlUtils.py
是在 Layer
層,而 Layer
層的部署目前使用情況來看,比函數(shù)組件部署要耗時(shí)更長(zhǎng),因此我把它放在需要使用的函數(shù)文件中。即盡量不去修改 common
里的文件。
準(zhǔn)備就緒后就可以部署函數(shù)了。首先仍然是創(chuàng)建配置文件:
touch serverless.yml
編輯配置文件:
component: scf # 注意,這里使用的是scf組件 name: userdata stage: dev app: labelhub-dashboard org: labelhub-dashboard #組件參數(shù) inputs: name: ${name}-${stage}-${app} #函數(shù)名稱 src: src: ./ #代碼路徑 exclude: - .env handler: index.main_handler #入口 runtime: Python3.6 # 云函數(shù)運(yùn)行時(shí)的環(huán)境 region: ap-guangzhou # 云函數(shù)所在區(qū)域 layers: - name: commonfiles version: 1 events: # 觸發(fā)器 - apigw: # 網(wǎng)關(guān)觸發(fā)器 parameters: endpoints: - path: / method: GET
通過配置文件,我們可以發(fā)現(xiàn),其中的 layers
配置中的 name
以及 version
,就是在部署 common
時(shí)的名稱和部署成功后的版本號(hào)。
最后執(zhí)行 sls deploy
完成部署,直接訪問生成的 url
地址,可以查看到正確的返回信息。
最終文件夾的結(jié)構(gòu)為:
labelhub-dashboard/ serverless.yml common/ requirements.txt serverless.yml mysqlUtils.py user-data/ serverless.yml index.py
在部署 user-data
函數(shù)時(shí),我們看到引入 mysqlUtils
,是通過直接引入的方式,而在 user-data
函數(shù)的配置文件中可以看到我們使用了對(duì)應(yīng)的 layers
配置。從這里可以看出,在函數(shù)的配置中,layers
其實(shí)就相當(dāng)于 v1
中的 include
配置,默認(rèn) Layer
組件中的文件與函數(shù)文件在相同目錄下。
其實(shí)我們可以將所有文件創(chuàng)建好后,在根目錄中執(zhí)行 sls deploy --all
來一次性進(jìn)行部署,但在使用過程中會(huì)出現(xiàn)函數(shù)組件部署報(bào)錯(cuò),找不到對(duì)應(yīng)的 Layer
組件,這也是因?yàn)楹瘮?shù)組件部署過程中會(huì)去讀取 layers
的配置,而通過實(shí)際使用過程中發(fā)現(xiàn) Layer
組件的部署幾乎都會(huì)比函數(shù)組件慢很多,因此官方也是建議優(yōu)先部署 Layer
組件,之后再統(tǒng)一部署函數(shù)組件。那么我們就需要考慮,函數(shù)的應(yīng)用根目錄,是否可以和公共組件目錄同級(jí),這樣在使用 sls deploy --all
的時(shí)候,才可以避免同時(shí)更新 Layer 層。
上述內(nèi)容就是Labelhub 基于Serverless 技術(shù)為人工智能企業(yè)提供數(shù)據(jù)與模型的解決方案是什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁(yè)標(biāo)題:Labelhub基于Serverless技術(shù)為人工智能企業(yè)提供數(shù)據(jù)與模型的解決方案是什么
標(biāo)題路徑:http://jinyejixie.com/article36/pshepg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、網(wǎng)站內(nèi)鏈、網(wǎng)站導(dǎo)航、網(wǎng)站設(shè)計(jì)公司、網(wǎng)頁(yè)設(shè)計(jì)公司、域名注冊(cè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)