FastAPI:燒瓶的正確替代品?
完成模型構(gòu)建和適當(dāng)?shù)某瑓?shù)調(diào)整后,數(shù)據(jù)科學(xué)項(xiàng)目的下一步是向公眾展示最終結(jié)果。這樣做非常重要,因?yàn)椴⒎敲總(gè)人都對(duì)查看代碼感興趣,并且他們對(duì)最終結(jié)果更感興趣。它還可以幫助數(shù)據(jù)科學(xué)有抱負(fù)的人建立一個(gè)端到端的項(xiàng)目,從而使他們比其他人更具優(yōu)勢(shì),并使他們對(duì)其他技術(shù)有所了解。
機(jī)器學(xué)習(xí)模型的部署可以采用不同的路線,具體取決于要為其提供模型的平臺(tái)。該網(wǎng)絡(luò)接口是服務(wù)于一個(gè)模型,但不限于最常見(jiàn)的方式Android和iOS應(yīng)用或IOT設(shè)備,如樹(shù)莓派。如果您在詳細(xì)研究這一點(diǎn),那么一個(gè)框架,均居搜索查詢與燒瓶框架這是一個(gè)簡(jiǎn)約的應(yīng)用程序快速設(shè)置Web服務(wù)器,但它有一些問(wèn)題,這是目前解決在最新發(fā)布的框架調(diào)用FastAPI這是獲得了這些天很受歡迎。
在本文中,我們將通過(guò)示例代碼來(lái)了解FastAPI框架在Flask方面的優(yōu)勢(shì),以便更好地理解事物。在此之前,如果您對(duì)Android應(yīng)用程序部署感興趣,則可以閱讀我的文章“在Android App中部署ML”。
FastAPI與Flask
燒瓶
這是一個(gè)基于Python的框架,可讓您使用較少的代碼連接網(wǎng)站。您可以使用它創(chuàng)建一個(gè)小型網(wǎng)站,因?yàn)樗梢栽诿總(gè)步驟進(jìn)行自定義。作為一個(gè)簡(jiǎn)約的軟件包,只有核心組件與此捆綁在一起,所有其他擴(kuò)展都需要顯式設(shè)置。許多開(kāi)發(fā)人員都使用Flask托管其API。API(應(yīng)用程序接口)是一種允許多個(gè)中介之間進(jìn)行通信的接口,這意味著人們可以使用任何技術(shù)來(lái)訪問(wèn)任何類型的數(shù)據(jù)。例如,您可以使用可以使用Python構(gòu)建的Javascript訪問(wèn)API。flask中的一個(gè)簡(jiǎn)單程序如下所示:
從flask導(dǎo)入Flask,jsonify
app = Flask(__ name__)
@ app.route(“ / <名稱>”,方法= ['GET'])
def home(名稱):
返回jsonify({“ message”:f“你好!{name}”})
如果__name__ ==“ __main__”:
app.run(debug = True)
在訪問(wèn)URL localhost / AnyNameHere時(shí),將顯示類似于以下內(nèi)容的JSON結(jié)果:(我使用稱為JSON viewer的chrome擴(kuò)展名。系統(tǒng)可能會(huì)提示您輸入純文本而不是此格式的輸出)
燒瓶
燒瓶問(wèn)題
這種方法的問(wèn)題是沒(méi)有數(shù)據(jù)驗(yàn)證,也就是說(shuō),我們可以傳遞任何類型的數(shù)據(jù),包括字符串,元組,數(shù)字或任何字符。這經(jīng)常會(huì)破壞程序,您可以想象,如果ML模型獲取錯(cuò)誤的數(shù)據(jù)類型,程序?qū)⒈罎。您可以在進(jìn)一步傳遞值之前創(chuàng)建數(shù)據(jù)檢查器,但這會(huì)增加額外的工作。
Flask中的錯(cuò)誤頁(yè)面是簡(jiǎn)單的HTML頁(yè)面,當(dāng)在其他應(yīng)用程序中調(diào)用API時(shí)會(huì)引發(fā)解碼器錯(cuò)誤。Flask還存在其他一些問(wèn)題,例如緩慢的特性,沒(méi)有異步功能以及對(duì)Web套接字的支持,這些問(wèn)題可以加快處理過(guò)程,最終沒(méi)有自動(dòng)化的文檔生成系統(tǒng)。您需要為API的用法和示例手動(dòng)設(shè)計(jì)用戶界面。所有這些問(wèn)題都在新框架中得到解決。
FastAPI
這是一個(gè)現(xiàn)代的框架,可讓您輕松地?zé)o縫構(gòu)建API。它具有將服務(wù)器代碼與業(yè)務(wù)邏輯分開(kāi)的功能,從而提高了代碼的可維護(hù)性。由于名稱本身具有快速性,因此與燒瓶相比要快得多,因?yàn)樗腔贏SGI(異步服務(wù)器網(wǎng)關(guān)接口)而不是WSGI(Web服務(wù)器網(wǎng)關(guān)接口)構(gòu)建的。它具有一個(gè)數(shù)據(jù)驗(yàn)證系統(tǒng),該系統(tǒng)可以在運(yùn)行時(shí)檢測(cè)到任何無(wú)效的數(shù)據(jù)類型,并以JSON格式將錯(cuò)誤輸入的原因返回給用戶,從而使開(kāi)發(fā)人員不必顯式管理此異常。
它生成的文件,當(dāng)你正在開(kāi)發(fā)這是所有開(kāi)發(fā)商最要求的事情API在旅途中。文檔是其他開(kāi)發(fā)人員在項(xiàng)目上進(jìn)行協(xié)作的一種好方法,因?yàn)樗蛩麄冋故玖丝梢杂帽匾恼f(shuō)明完成的所有事情。它還生成了一個(gè)不錯(cuò)的GUI,可以解決燒瓶中缺少的所有問(wèn)題。
它完成了OpenAI規(guī)范和Swagger的所有這些工作,以實(shí)現(xiàn)這些規(guī)范。作為開(kāi)發(fā)人員,您只專注于邏輯構(gòu)建部分,其余所有事情都由FastAPI管理。讓我們看看使用現(xiàn)在在FastAPI中實(shí)現(xiàn)的Flask創(chuàng)建的示例:
進(jìn)口臍帶
從fastapi導(dǎo)入FastAPI
應(yīng)用= FastAPI()
@ app.get(“ /”)
def home(名稱:str):
return {“ message”:f“ Hello!{name}”}
如果__name__ ==“ __main__”:
uvicorn.run(app,host ='127.0.0.1',port = 8000,debug = True)
在訪問(wèn)URL localhost /?name = AnyNameHere時(shí),系統(tǒng)將提示您輸出:
FastAPI
您可以看到該代碼與flask非常相似,但是在這里我們使用的是uvicorn服務(wù)器,它是ASGI的實(shí)現(xiàn)。另外,這里我們沒(méi)有路由任何端點(diǎn),而是直接使用裝飾器創(chuàng)建端點(diǎn),這更有意義。這里的函數(shù)只是簡(jiǎn)單地將所需的參數(shù)作進(jìn)一步處理,從而消除了調(diào)用請(qǐng)求對(duì)象的需要。
現(xiàn)在介紹有趣的部分。要訪問(wèn)自動(dòng)生成的文檔,請(qǐng)單擊端點(diǎn)/ docs,然后將為您提供Swagger UI,該界面允許您測(cè)試API端點(diǎn),還可以定義為示例以供用戶測(cè)試端點(diǎn):
API端點(diǎn)
FastAPI捆綁了另一個(gè)文檔生成器,即ReDoc,它也生成了列出所有端點(diǎn)的精美文檔。可以通過(guò)點(diǎn)擊端點(diǎn)/ redoc來(lái)訪問(wèn)它:
ReDoc
要設(shè)置數(shù)據(jù)驗(yàn)證,我們可以簡(jiǎn)單地創(chuàng)建從Pydantic的基本模型繼承的數(shù)據(jù)類型類。它是一個(gè)使用Python類型注釋提供數(shù)據(jù)驗(yàn)證的庫(kù)。我們可以添加實(shí)體的描述,并提供要在文檔中顯示的自定義示例。
ML FastAPI示例
我想分享一個(gè)使用FastAPI部署ML DecisionTree分類器模型的示例。問(wèn)題的陳述是音樂(lè)流派分類器,其中基于音樂(lè)的技術(shù)方面(例如節(jié)奏,價(jià)態(tài)),音樂(lè)是搖滾或嘻哈音樂(lè)。我制作了一個(gè)音樂(lè)課來(lái)驗(yàn)證要傳遞給模型的數(shù)據(jù),如下所示:
從pydantic導(dǎo)入BaseModel
音樂(lè)(BaseModel)類:
聲學(xué):浮動(dòng)
舞蹈性:浮動(dòng)
能量:浮動(dòng)
工具性:浮動(dòng)
活度:浮動(dòng)
語(yǔ)言:浮動(dòng)
速度:浮動(dòng)
價(jià):浮動(dòng)
這是生成的API:
FastApi示例
如果要查看整個(gè)代碼,請(qǐng)轉(zhuǎn)到此GitHub存儲(chǔ)庫(kù)。
結(jié)論:選擇哪一個(gè)?
在所有討論之后,這個(gè)問(wèn)題仍然沒(méi)有答案,誰(shuí)贏了?基于所有因素,我建議在Flask上采用FastAPI。設(shè)置非常容易,將舊的flask項(xiàng)目遷移到其中不會(huì)花費(fèi)很多時(shí)間,異步,Web套接字和自動(dòng)文檔生成功能是最重要的。
可以選擇flask框架來(lái)設(shè)置整個(gè)Web界面(前端和后端),但涉及ML,而ML的主要目標(biāo)是檢查模型是否在生產(chǎn)環(huán)境中正常工作,因此創(chuàng)建API更為合理因?yàn)槠溆嗟氖虑榭梢杂善渌_(kāi)發(fā)人員團(tuán)隊(duì)管理,并且可以清楚地向他們解釋您開(kāi)發(fā)的程序的用法,所以FastAPI自動(dòng)文檔是一個(gè)很好的解決方案。
題庫(kù)