部署您的第一個(gè)機(jī)器學(xué)習(xí)API
譯文【51CTO.com快譯】介紹
我們?cè)诒卷?xiàng)目中將學(xué)習(xí)如何用簡(jiǎn)單的代碼為您的機(jī)器學(xué)習(xí)模型構(gòu)建應(yīng)用編程接口(API)并加以部署。我花了1小時(shí)學(xué)習(xí)FastAPI,花了5分鐘學(xué)習(xí)如何部署到Deta服務(wù)器。我們還將使用Python Request在本地服務(wù)器和遠(yuǎn)程服務(wù)器上測(cè)試API。不妨更深入地了解我們將在項(xiàng)目中使用的這些技術(shù)。
spaCy
與用于試驗(yàn)和評(píng)估的著名NLTK Python庫(kù)相比,spaCy對(duì)應(yīng)用程序和部署更友好。spaCy 帶有預(yù)構(gòu)建的統(tǒng)計(jì)神經(jīng)網(wǎng)絡(luò)NLP模型,有強(qiáng)大的功能,易于在您的項(xiàng)目spaCy中使用和實(shí)現(xiàn)。我們將使用一個(gè)很簡(jiǎn)單的小型預(yù)構(gòu)建英文模型從我們的文本提取實(shí)體。
FastAPI
FastAPI是一個(gè)使用Python構(gòu)建API的快速Web框架,它有更短的查詢時(shí)間、簡(jiǎn)單且代碼最小化,讓您在幾分鐘內(nèi)即可用FastAPI設(shè)計(jì)第一個(gè)API。我們將學(xué)習(xí)FastAPI的工作原理以及如何使用預(yù)構(gòu)建模型從英文文本獲取實(shí)體。
Deta
我們將為API使用Deta Micros服務(wù),并在沒(méi)有Docker或YAML文件的情況下部署項(xiàng)目。Deta平臺(tái)擁有易于部署的CLI、高可擴(kuò)展性、安全的API身份驗(yàn)證密鑰、更改子域的選項(xiàng)以及Web流量日志功能。這些功能在Deta上可以完全免費(fèi)使用。我們?cè)陧?xiàng)目中將使用Deta CLI,僅用幾行腳本來(lái)部署Fast API。
代碼
我在學(xué)習(xí)FastAPI時(shí)偶然發(fā)現(xiàn)了促使我寫本文的YouTube視頻。Sebastián Ramírez 解釋了Fast API的工作原理以及它如何成為最快速的Python Web框架。我們將編寫兩個(gè)Python 文件,一個(gè)含有機(jī)器學(xué)習(xí)模型,另一個(gè)含有您的API代碼。
需求
我們?cè)陂_(kāi)始之前,需要?jiǎng)?chuàng)建一個(gè)含有requirements.txt文件的新目錄。您可以在下面找到我們將要使用的所有必要庫(kù):
- fastapi
- spacy
- uvicorn
- https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.1.0/en_core_web_sm-3.1.0.tar.gz
您可以逐一安裝,或者使用:
- $ pip install -r requirements.txt
我們將為該項(xiàng)目使用預(yù)訓(xùn)練的NLP模型,因此需要從GitHub存儲(chǔ)庫(kù)下載,或者只運(yùn)行需求文件,它會(huì)自動(dòng)下載并安裝。
機(jī)器學(xué)習(xí)模型
我們將使用預(yù)訓(xùn)練的Spacy NLP模型從文本提取實(shí)體。如果您使用Jupyter notebook,嘗試使用%%writefile 在您的目錄中創(chuàng)建python文件。
首先加載NLP模型,然后從CBS 新聞文章提取實(shí)體。只需幾行代碼,您就可以運(yùn)行第一個(gè)機(jī)器學(xué)習(xí)模型。還可以使用相同的方法加載經(jīng)過(guò)訓(xùn)練的模型。
API文件
這是您的主文件,該文件含有:
1. read_main:使用GET,即從資源請(qǐng)求數(shù)據(jù),它會(huì)顯示一條歡迎消息。
2. 類Article:使用pydantic BaseModel來(lái)定義將用于您的API (helpmanual.io)的對(duì)象和變量。在本例中,我們將內(nèi)容定義為字符串,將評(píng)論定義為字符串列表。
3. analyze_article:它使用來(lái)自ml文件的NLP對(duì)象,獲取附有評(píng)論的文本列表,并顯示實(shí)例。
我知道這讓人有點(diǎn)困惑,不妨分解成幾個(gè)小部分以便了解。
- %%writefile FastAPI-ML-Project/main.py
- from fastapi import FastAPI
- from ml import nlp
- from pydantic import BaseModel
- import starlette
- from typing import List
分解
我們創(chuàng)建了FastAPI的對(duì)象,然后使用@app. get(“/”),把它用作函數(shù)上的裝飾器。
- @app是FastAPI對(duì)象的裝飾器
- .get or .post:用于返回?cái)?shù)據(jù)或處理輸入的HTTP方法
- (“/”)是Web服務(wù)器上的位置,本例中是主頁(yè)面。如果您想添加另一個(gè)目錄,可以使用 (“/
/”)
我們創(chuàng)建了read_main函數(shù)顯示主頁(yè)上的消息,這很簡(jiǎn)單。
- app = FastAPI()
- @app.get("/")
- def read_main():
- return {"message": "Welcome"}
現(xiàn)在我們將創(chuàng)建從BaseModel繼承函數(shù)和變量的Article類。該函數(shù)幫助我們創(chuàng)建將在POST方法中使用的參數(shù)類型。在本例中,我們將內(nèi)容創(chuàng)建為字符串變量,將評(píng)論創(chuàng)建為字符串列表。
- class Article(BaseModel):
- content: str
- comments: List[str] = []
在最后一部分,我們?yōu)锳PI創(chuàng)建了POST方法(“/article/”)。這意味著我們將創(chuàng)建一個(gè)新部分,該部分將參數(shù)作為輸入并在處理后返回結(jié)果。
- Article類作為參數(shù):使用Article列表創(chuàng)建文章參數(shù),這將讓我們可以添加多個(gè)文本條目。
- 從文章提取數(shù)據(jù):創(chuàng)建循環(huán)先后從文章列表和評(píng)論列表提取數(shù)據(jù)。它還向數(shù)組添加評(píng)論。
- 將文本加載到NLP模型中:將內(nèi)容加載到NLP預(yù)訓(xùn)練模型中。
- 提取實(shí)體:從nlp對(duì)象提取實(shí)體,然后添加到ents 數(shù)組中。這將堆疊結(jié)果。
- Display:該函數(shù)將返回實(shí)體和評(píng)論列表。
- @app.post("/article/")
- def analyze_article(articles: List[Article]):
- ents = []
- comments = []
- for article in articles:
- for comment in article.comments:
- comments.append(comment.upper())
- doc = nlp(article.content)
- for ent in doc.ents:
- ents.append({"text": ent.text, "label": ent.label_})
- return {"ents": ents, "comments": comments}
測(cè)試
Fast API建立在Uvicorn上,因此服務(wù)器也運(yùn)行在Uvicorn上。在Jupyter notebook中,您可以使用以下代碼運(yùn)行應(yīng)用程序,或在終端中輸入uvicorn,然后輸入main文件,其中FastAPI對(duì)象是本例中的 app。
- !cd /work/FastAPI-ML-Project && uvicorn main:app
- 2021-08-04 17:08:56.673584: W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
- 2021-08-04 17:08:56.673627: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
- China GPE
- Beijing GPE
- INFO: Started server process [928]
- INFO: Waiting for application startup.
- INFO: Application startup complete.
- INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
- INFO: 127.0.0.1:51874 - "GET / HTTP/1.1" 200 OK
- INFO: 127.0.0.1:51876 - "POST /article/ HTTP/1.1" 200 OK
- INFO: 127.0.0.1:53028 - "POST /article/ HTTP/1.1" 200 OK
- KernelInterrupted: Execution interrupted by the Jupyter kernel.
我們的服務(wù)器運(yùn)行流暢,于是不妨使用request.get方法來(lái)訪問(wèn)它。API在主頁(yè)上顯示“歡迎”消息,表明一切正常。
- import requests
- response = requests.get("http://127.0.0.1:8000")
- print(response.text)
- {"message":"Welcome"}
現(xiàn)在不妨在列表中添加單個(gè)文本和評(píng)論作為字典。我們將使用POST請(qǐng)求方法和/article/來(lái)訪問(wèn)NLP模型函數(shù)。將您的輸出轉(zhuǎn)換成.json() ,以便易于提取數(shù)據(jù)。
我們有字典鍵:['ents','comments']
- params = [{"content":"The 1992 Cricket World Cup was won by Pakistan",
- "comments":["waooo","not bad"]}]
- article = requests.post(f"http://127.0.0.1:8000/article/",json=params)
- data_dict = article.json()
- data_dict.keys()
不妨查看一下整個(gè)輸出是什么樣的??雌饋?lái)我們有帶有標(biāo)簽和實(shí)體列表的ents。comments鍵也一樣。
- print("Output: ",article.text)
- Output: {"ents":[{"text":"1992","label":"DATE"},{"text":"Cricket World Cup","label":"EVENT"},{"text":"Pakistan","label":"GPE"}],"comments":["WAOOO","NOT BAD"]}
現(xiàn)在不妨提取單個(gè)實(shí)體及其文本,檢查輸出的靈活性。在本例中,我們從輸出提取第二個(gè)實(shí)體。
結(jié)果顯示完美。
- print("Label: ",list(data_dict["ents"][1].values())[1])
- print("Text: ",list(data_dict["ents"][1].values())[0])
- Label: EVENT
- Text: Cricket World Cup
部署
進(jìn)入到終端,或者您可以在Jupyter notebook單元中執(zhí)行相同的步驟,不過(guò)在任何腳本之前添加“!”。先要使用cd訪問(wèn)main.py和 ml.py文件所在的目錄。
- cd ~”/FastAPI-ML-Project”
Deta需要的三個(gè)主文件是ml.py、main.py 和requirments.txt。
如果您使用Windows,在 PowerShell 中使用bellow命令下載并安裝Deta CLI:
- iwr https://get.deta.dev/cli.ps1 -useb | iex
如果使用Linux:
- curl -fsSL https://get.deta.dev/cli.sh | sh
然后使用deta login,會(huì)將您帶到瀏覽器,要求您輸入username和password。如果您已登錄,需要幾秒鐘來(lái)驗(yàn)證。
- deta login
Deta驗(yàn)證 | deta
終端中的這兩個(gè)詞是魔法詞,會(huì)在2分鐘內(nèi)上傳文件并部署您的應(yīng)用程序。
- deta new
您的應(yīng)用程序已上傳到端點(diǎn)鏈接,本例中是https://93t2gn.deta.dev/。
- Successfully created a new micro{“name”: “FastAPI-ML-Project”,“runtime”: “python3.7”,“endpoint”: “https://93t2gn.deta.dev/",“visor”: “enabled”,“http_auth”: “disable”}Adding dependencies…Collecting fastapi…Successfully installed ……
如果您使用deta logs看到錯(cuò)誤檢查日志,作出一些更改,然后使用deta deploy來(lái)更新更改。
如您所見(jiàn),我們的應(yīng)用程序已部署在Deta服務(wù)器上并運(yùn)行。
項(xiàng)目摘要| deta
您可以進(jìn)入到Deta提供的鏈接,自行檢查。
測(cè)試 Web API
最后不妨在Deta平臺(tái)上將我們的遠(yuǎn)程API作為微服務(wù)來(lái)測(cè)試。這次我們將添加Deta端點(diǎn)鏈接,而不是添加本地IP。可以在沒(méi)有標(biāo)頭的情況下運(yùn)行,因?yàn)槲覀儧](méi)有啟用API身份驗(yàn)證。啟用身份驗(yàn)證后,Deta還提供免費(fèi)的API密鑰。這意味著只有您或擁有API密鑰的人才能訪問(wèn)Web服務(wù)器。想了解有關(guān)身份驗(yàn)證和子域的更多信息,建議查閱文檔。
我們將添加相同的參數(shù)和相同的代碼以獲得相同的結(jié)果,瞧它多神奇。您的API在網(wǎng)上,可以通過(guò)使用鏈接即可輕松訪問(wèn)。
- header = {"accept": "application/json", "Content-Type": "application/json"}
- params = [
- {
- "content": "The 1992 Cricket World Cup was won by Pakistan",
- "comments": ["waooo", "not bad"],
- }
- ]
- article = requests.post("https://93t2gn.deta.dev/article/",headers=header ,json=params)
結(jié)論
我在學(xué)習(xí)FastAPI后考慮下一步做什么,于是有一天我在網(wǎng)上偶然發(fā)現(xiàn)了引起我注意的 Deta。我花了幾分鐘來(lái)安裝Deta CLI,并在遠(yuǎn)程服務(wù)器上部署API。Deta的子域和免費(fèi)API密鑰功能給我留下了深刻印象。我很快了解了該服務(wù)的工作原理以及我將如何在未來(lái)的項(xiàng)目中使用它。
在學(xué)習(xí)幾個(gè)機(jī)器學(xué)習(xí)模型之后,我們都會(huì)問(wèn)這個(gè)問(wèn)題:
我知道如何訓(xùn)練我的模型并獲得預(yù)測(cè),但下一步是什么?如何與他人分享我的模型,以便他們可以看到我構(gòu)建的內(nèi)容并在他們的項(xiàng)目中使用這些功能?
這時(shí)候Heroku、Google或Azure等云平臺(tái)有了用武之地,但這些平臺(tái)有點(diǎn)復(fù)雜,您需要學(xué)習(xí)為Docker文件編寫代碼,這有時(shí)令人沮喪。Deta用簡(jiǎn)單的兩個(gè)字腳本解決您的所有問(wèn)題,腳本在幾秒鐘內(nèi)即可部署和運(yùn)行您的應(yīng)用程序。
原文標(biāo)題:Deploying Your First Machine Learning API,作者:Abid Ali Awan
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】