部署您的第一個機器學習API
譯文【51CTO.com快譯】介紹
我們在本項目中將學習如何用簡單的代碼為您的機器學習模型構建應用編程接口(API)并加以部署。我花了1小時學習FastAPI,花了5分鐘學習如何部署到Deta服務器。我們還將使用Python Request在本地服務器和遠程服務器上測試API。不妨更深入地了解我們將在項目中使用的這些技術。
spaCy
與用于試驗和評估的著名NLTK Python庫相比,spaCy對應用程序和部署更友好。spaCy 帶有預構建的統計神經網絡NLP模型,有強大的功能,易于在您的項目spaCy中使用和實現。我們將使用一個很簡單的小型預構建英文模型從我們的文本提取實體。
FastAPI
FastAPI是一個使用Python構建API的快速Web框架,它有更短的查詢時間、簡單且代碼最小化,讓您在幾分鐘內即可用FastAPI設計第一個API。我們將學習FastAPI的工作原理以及如何使用預構建模型從英文文本獲取實體。
Deta
我們將為API使用Deta Micros服務,并在沒有Docker或YAML文件的情況下部署項目。Deta平臺擁有易于部署的CLI、高可擴展性、安全的API身份驗證密鑰、更改子域的選項以及Web流量日志功能。這些功能在Deta上可以完全免費使用。我們在項目中將使用Deta CLI,僅用幾行腳本來部署Fast API。
代碼
我在學習FastAPI時偶然發現了促使我寫本文的YouTube視頻。Sebastián Ramírez 解釋了Fast API的工作原理以及它如何成為最快速的Python Web框架。我們將編寫兩個Python 文件,一個含有機器學習模型,另一個含有您的API代碼。
需求
我們在開始之前,需要創建一個含有requirements.txt文件的新目錄。您可以在下面找到我們將要使用的所有必要庫:
- 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
我們將為該項目使用預訓練的NLP模型,因此需要從GitHub存儲庫下載,或者只運行需求文件,它會自動下載并安裝。
機器學習模型
我們將使用預訓練的Spacy NLP模型從文本提取實體。如果您使用Jupyter notebook,嘗試使用%%writefile 在您的目錄中創建python文件。
首先加載NLP模型,然后從CBS 新聞文章提取實體。只需幾行代碼,您就可以運行第一個機器學習模型。還可以使用相同的方法加載經過訓練的模型。
API文件
這是您的主文件,該文件含有:
1. read_main:使用GET,即從資源請求數據,它會顯示一條歡迎消息。
2. 類Article:使用pydantic BaseModel來定義將用于您的API (helpmanual.io)的對象和變量。在本例中,我們將內容定義為字符串,將評論定義為字符串列表。
3. analyze_article:它使用來自ml文件的NLP對象,獲取附有評論的文本列表,并顯示實例。
我知道這讓人有點困惑,不妨分解成幾個小部分以便了解。
- %%writefile FastAPI-ML-Project/main.py
- from fastapi import FastAPI
- from ml import nlp
- from pydantic import BaseModel
- import starlette
- from typing import List
分解
我們創建了FastAPI的對象,然后使用@app. get(“/”),把它用作函數上的裝飾器。
- @app是FastAPI對象的裝飾器
- .get or .post:用于返回數據或處理輸入的HTTP方法
- (“/”)是Web服務器上的位置,本例中是主頁面。如果您想添加另一個目錄,可以使用 (“/
/”)
我們創建了read_main函數顯示主頁上的消息,這很簡單。
- app = FastAPI()
- @app.get("/")
- def read_main():
- return {"message": "Welcome"}
現在我們將創建從BaseModel繼承函數和變量的Article類。該函數幫助我們創建將在POST方法中使用的參數類型。在本例中,我們將內容創建為字符串變量,將評論創建為字符串列表。
- class Article(BaseModel):
- content: str
- comments: List[str] = []
在最后一部分,我們為API創建了POST方法(“/article/”)。這意味著我們將創建一個新部分,該部分將參數作為輸入并在處理后返回結果。
- Article類作為參數:使用Article列表創建文章參數,這將讓我們可以添加多個文本條目。
- 從文章提取數據:創建循環先后從文章列表和評論列表提取數據。它還向數組添加評論。
- 將文本加載到NLP模型中:將內容加載到NLP預訓練模型中。
- 提取實體:從nlp對象提取實體,然后添加到ents 數組中。這將堆疊結果。
- Display:該函數將返回實體和評論列表。
- @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}
測試
Fast API建立在Uvicorn上,因此服務器也運行在Uvicorn上。在Jupyter notebook中,您可以使用以下代碼運行應用程序,或在終端中輸入uvicorn,然后輸入main文件,其中FastAPI對象是本例中的 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.
我們的服務器運行流暢,于是不妨使用request.get方法來訪問它。API在主頁上顯示“歡迎”消息,表明一切正常。
- import requests
- response = requests.get("http://127.0.0.1:8000")
- print(response.text)
- {"message":"Welcome"}
現在不妨在列表中添加單個文本和評論作為字典。我們將使用POST請求方法和/article/來訪問NLP模型函數。將您的輸出轉換成.json() ,以便易于提取數據。
我們有字典鍵:['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()
不妨查看一下整個輸出是什么樣的。看起來我們有帶有標簽和實體列表的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"]}
現在不妨提取單個實體及其文本,檢查輸出的靈活性。在本例中,我們從輸出提取第二個實體。
結果顯示完美。
- print("Label: ",list(data_dict["ents"][1].values())[1])
- print("Text: ",list(data_dict["ents"][1].values())[0])
- Label: EVENT
- Text: Cricket World Cup
部署
進入到終端,或者您可以在Jupyter notebook單元中執行相同的步驟,不過在任何腳本之前添加“!”。先要使用cd訪問main.py和 ml.py文件所在的目錄。
- cd ~”/FastAPI-ML-Project”
Deta需要的三個主文件是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,會將您帶到瀏覽器,要求您輸入username和password。如果您已登錄,需要幾秒鐘來驗證。
- deta login
Deta驗證 | deta
終端中的這兩個詞是魔法詞,會在2分鐘內上傳文件并部署您的應用程序。
- deta new
您的應用程序已上傳到端點鏈接,本例中是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看到錯誤檢查日志,作出一些更改,然后使用deta deploy來更新更改。
如您所見,我們的應用程序已部署在Deta服務器上并運行。
項目摘要| deta
您可以進入到Deta提供的鏈接,自行檢查。
測試 Web API
最后不妨在Deta平臺上將我們的遠程API作為微服務來測試。這次我們將添加Deta端點鏈接,而不是添加本地IP。可以在沒有標頭的情況下運行,因為我們沒有啟用API身份驗證。啟用身份驗證后,Deta還提供免費的API密鑰。這意味著只有您或擁有API密鑰的人才能訪問Web服務器。想了解有關身份驗證和子域的更多信息,建議查閱文檔。
我們將添加相同的參數和相同的代碼以獲得相同的結果,瞧它多神奇。您的API在網上,可以通過使用鏈接即可輕松訪問。
- 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)
結論
我在學習FastAPI后考慮下一步做什么,于是有一天我在網上偶然發現了引起我注意的 Deta。我花了幾分鐘來安裝Deta CLI,并在遠程服務器上部署API。Deta的子域和免費API密鑰功能給我留下了深刻印象。我很快了解了該服務的工作原理以及我將如何在未來的項目中使用它。
在學習幾個機器學習模型之后,我們都會問這個問題:
我知道如何訓練我的模型并獲得預測,但下一步是什么?如何與他人分享我的模型,以便他們可以看到我構建的內容并在他們的項目中使用這些功能?
這時候Heroku、Google或Azure等云平臺有了用武之地,但這些平臺有點復雜,您需要學習為Docker文件編寫代碼,這有時令人沮喪。Deta用簡單的兩個字腳本解決您的所有問題,腳本在幾秒鐘內即可部署和運行您的應用程序。
原文標題:Deploying Your First Machine Learning API,作者:Abid Ali Awan
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】