借助HuggingFace輕松實(shí)施一個(gè)端到端項(xiàng)目
譯文譯者 | 布加迪
審校 | 重樓
本文介紹了使用FastAPI和Docker生成一個(gè)隨時(shí)可用的Hugging Face模型。
想象一下,利用Hugging Face模型來確定評(píng)論的情緒。在過去,第一步是制作這樣一個(gè)模型,并確保它正常工作。
然而,今天的預(yù)訓(xùn)練模型讓我們只需花很少的精力,就能準(zhǔn)備好這樣的大語言模型(LLM)。
一旦我們準(zhǔn)備好使用這個(gè)模型,主要目標(biāo)是讓公司的同事能夠使用這個(gè)模型,而不需要下載或從頭開始實(shí)現(xiàn)它。
為此,我們將創(chuàng)建一個(gè)端點(diǎn)API,使用戶能夠獨(dú)立地調(diào)用和使用模型。這就是我們所說的從頭到尾構(gòu)建的端到端項(xiàng)目。
今天,我們將使用Hugging Face、FastAPI和Docker部署一個(gè)簡單的模型,演示如何有效地實(shí)現(xiàn)這個(gè)目標(biāo)。
第1步:選擇我們的Hugging Face模型
首先要做的是選擇一個(gè)適合我們需要的Hugging Face模型。我們可以使用以下命令在我們的環(huán)境中輕松安裝Hugging Face:
pip install transformers
# remember to work with transformers we need either tensorflow or pytorch
installed as well
pip install torch
pip install tensorflow
現(xiàn)在,我們需要導(dǎo)入Transformer庫的管道命令。
from transformers import pipeline
然后,使用pipeline命令,我們可以輕松生成一個(gè)模型來定義特定文本的情緒。我們可以使用兩種不同的方法來做到這一點(diǎn):通過定義任務(wù)“情緒分析”或通過定義模型,如下面的代碼所示。
# Defining directly the task we want to implement.
pipe = pipeline(task="sentiment-analysis")
# Defining the model we choose.
pipe = pipeline(model="model-to-be-used")
值得一提的是,不建議使用基于任務(wù)的方法,因?yàn)樗拗屏宋覀儗?duì)所使用的特定模型的控制。
在本文例子中,我選擇了“distilbert-base-uncase-fine tuned-sst-2-english”,但你可以隨意瀏覽Hugging Face Hub,選擇適合需要的任何型號(hào)。你可以在下面的文章(https://www.datacamp.com/tutorial/what-is-hugging-face)中找到Hugging Face的簡單指南。
pipe =
pipeline(model="distilbert/distilbert-base-uncased-finetuned-sst-2-english")
我們已定義了管道模型,只需發(fā)送一個(gè)簡單的提示,就可以返回結(jié)果。比如說,輸入以下命令:
print(pipe("This tutorial is great!"))
我們將得到[{'label': 'POSITIVE', 'score': 0.9998689889907837}]
想象一下,我們希望我們的用戶得到一個(gè)關(guān)于這個(gè)分類的自然語言句子。我們也可以實(shí)施簡單的Python代碼同樣實(shí)現(xiàn)這個(gè)目的:
def generate_response(prompt:str):
response = pipe("This is a great tutorial!")
label = response[0]["label"]
score = response[0]["score"]
return f"The '{prompt}' input is {label} with a score of {score}"
print(generate_response("This tutorial is great!"))
重復(fù)同樣的試驗(yàn),我們會(huì)得到:
The 'This tutorial is great!' input is POSITIVE with a score of
0.9997909665107727
現(xiàn)在我們有了一個(gè)切實(shí)可行的模型,可以繼續(xù)定義我們的API。
第2步:使用FastAPI為模型編寫API端點(diǎn)
為了定義API,我們將使用FastAPI。它是一個(gè)用于構(gòu)建高性能Web API的Python框架。首先,使用pip命令安裝FastAPI庫,并將其導(dǎo)入到我們的環(huán)境中。此外,我們將利用pydantic庫來確保輸入是所需的類型。
下面的代碼將生成切實(shí)可行的API,我們的同事可以直接使用。
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import pipeline
# You can check any other model in the Hugging Face Hub
pipe =
pipeline(model="distilbert/distilbert-base-uncased-finetuned-sst-2-english")
# We define the app
app = FastAPI()
# We define that we expect our input to be a string
class RequestModel(BaseModel):
input: str
# Now we define that we accept post requests
@app.post("/sentiment")
def get_response(request: RequestModel):
prompt = request.input
response = pipe(prompt)
label = response[0]["label"]
score = response[0]["score"]
return f"The '{prompt}' input is {label} with a score of {score}"
下面是代碼中逐步發(fā)生的事情:
- 導(dǎo)入必要的庫:代碼先導(dǎo)入FastAPI和Pydantic,確保我們收發(fā)的數(shù)據(jù)結(jié)構(gòu)正確。
- 加載模型:加載一個(gè)預(yù)訓(xùn)練的情緒分析模型,正如我們?cè)诘谝徊街兴龅哪菢印?/li>
- 設(shè)置FastAPI應(yīng)用程序:app = FastAPI()初始化FastAPI應(yīng)用程序,使其準(zhǔn)備好處理請(qǐng)求。
- 定義請(qǐng)求模型:使用Pydantic,定義RequestModel類。該類指定了我們期望輸入字符串,確保API只接受正確格式的數(shù)據(jù)。
- 創(chuàng)建端點(diǎn):@app.post("/sentiment")裝飾器告訴FastAPI,當(dāng)向/sentiment端點(diǎn)發(fā)出POST請(qǐng)求時(shí),應(yīng)該觸發(fā)該函數(shù)。get_response函數(shù)接受RequestModel對(duì)象作為輸入,輸入含有我們想要分析的文本。
- 處理請(qǐng)求:在get_response函數(shù)中,從請(qǐng)求中提取文本并傳遞給模型(pipe(prompt))。模型返回帶有情緒標(biāo)簽(比如”POSITIVE”或“NEGATIVE”)的響應(yīng)和表示預(yù)測(cè)置信度的分?jǐn)?shù)。
- 返回響應(yīng):最后,函數(shù)返回格式化的字符串,其中包含輸入文本、情緒標(biāo)簽和置信度分?jǐn)?shù),為用戶提供一個(gè)清晰而簡潔的結(jié)果。
如果我們執(zhí)行代碼,API將在本地主機(jī)中可用,如下圖所示:
簡而言之,這段代碼設(shè)置簡單的Web服務(wù),你可以往該服務(wù)發(fā)送一段文本,其給出的回復(fù)是分析該文本的情緒,通過FastAPI充分利用Hugging Face模型的強(qiáng)大功能。
接下來,我們應(yīng)該將應(yīng)用程序容器化,以便可以在任何地方執(zhí)行,而不僅僅是在本地計(jì)算機(jī)上執(zhí)行。這將確保更好的可移植性和易于部署。
第3步:使用Docker運(yùn)行我們的模型
容器化需要將應(yīng)用程序放入容器中。Docker容器運(yùn)行Docker鏡像的實(shí)例,這包括它自己的操作系統(tǒng)和應(yīng)用程序所需的所有依賴項(xiàng)。
比如說,你可以在容器中安裝Python和所有必需的包,這樣它可以在任何地方運(yùn)行,不需要安裝這些庫。
為了在Docker容器中運(yùn)行我們的情緒分析應(yīng)用程序,我們先需要?jiǎng)?chuàng)建Docker鏡像。這個(gè)過程包括寫一個(gè)Dockerfile,指定Docker鏡像應(yīng)該含有什么。
如果你的系統(tǒng)沒有安裝Docker,可以從Docker的網(wǎng)站上下載。這是我們將在這個(gè)項(xiàng)目中使用的Dockerfile,在存儲(chǔ)庫中名為Dockerfile。
# Use an official Python runtime as a parent image
FROM python:3.10-slim
# Set the working directory in the container
WORKDIR /sentiment
# Copy the requirements.txt file into the root
COPY requirements.txt .
# Copy the current directory contents into the container at /app as well
COPY ./app ./app
# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt
# Make port 8000 available to the world outside this container
EXPOSE 8000
# Run main.py when the container launches, as it is contained under the app
folder, we define app.main
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
然后,我們只需要在終端中運(yùn)行以下命令來構(gòu)建Docker鏡像。
docker build -t sentit-app
然后為了執(zhí)行,我們有兩個(gè)選項(xiàng):
使用帶有命令的終端。
docker run -p 8000:8000 --name name_of_cointainer sentiment-hf
使用docker hub。我們很容易進(jìn)入docker hub,點(diǎn)擊鏡像的運(yùn)行按鈕。
這就是全部細(xì)節(jié)!現(xiàn)在,我們有了一個(gè)切實(shí)可行的情緒分類模型,它可以在任何地方工作,并且可以使用API來執(zhí)行。
結(jié)語
具體流程如下:
- 模型選擇和設(shè)置:選擇和配置一個(gè)Hugging Face預(yù)訓(xùn)練模型進(jìn)行情緒分析,確保它滿足你的要求。
- 使用FastAPI進(jìn)行API開發(fā):使用FastAPI創(chuàng)建API端點(diǎn),實(shí)現(xiàn)與情緒分析模型的輕松交互。
- Docker容器化:使用Docker容器化應(yīng)用程序,以確??梢浦残院涂绮煌h(huán)境的無縫部署。
你可以在下面的GitHub代碼庫中查看我的全部代碼:https://github.com/rfeers/data-science-portfolio/tree/main/end-to-end-projects/simple-docker-hf-model。
原文標(biāo)題:A Simple to Implement End-to-End Project with HuggingFace,作者:Josep Ferrer
鏈接:
https://www.kdnuggets.com/a-simple-to-implement-end-to-end-project-with-huggingface。