利用uvicorn、Starlette和pipeline将一个训练好的大模型发布成一个web服务

技术名词:

1、Starlette:

它是一个轻量级、高度可用性和可扩展性的Web框架,它专门为异步应用程序设计。 Starlette基于Python 3.6+的异步/协程语法,具有快速响应性能和低延迟。你可以将它理解为Java的Spring。

安装:pip install starlette

2、uvicorn

它是一个Python Web服务器,用于实现基于ASGI(异步服务器网关接口)的异步Web应用程序。它是用Python编写的,可高效、高性能地处理HTTP请求和响应,而且很容易配置和部署。你可以将它理解为Java的Tomcat。

安装:pip install uvicorn

编写一个web服务server.py:

from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route
from transformers import pipeline
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import asyncio

async def homepage(request):
    payload = await request.body()
    string = payload.decode("utf-8")
    response_q = asyncio.Queue()
    await request.app.model_queue.put((string, response_q))
    output = await response_q.get()
    return JSONResponse(output)

async def server_loop(q):
    model_name = "/data/checkpoint-10598"
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    tokenizer.deprecation_warnings["Asking-to-pad-a-fast-tokenizer"] = True
    model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=4)
    pipe = pipeline("text-classification", model=model, tokenizer=tokenizer)
    while True:
        (string, response_q) = await q.get()
        out = pipe(string)
        await response_q.put(out)

app = Starlette(
    routes=[
        Route("/", homepage, methods=["POST"]),
    ],
)

@app.on_event("startup")
async def startup_event():
    q = asyncio.Queue()
    app.model_queue = q
    asyncio.create_task(server_loop(q))

启动服务:

uvicorn server:app --port 8000

测试:

[ipa@comm]$ curl -X POST -d "我爱你" http://127.0.0.1:6788

结果:

[{"label":"LABEL_3","score":0.8000535368919373}]

总结:

利用transformers的pipeline来搭建一个Python的web服务,这样我们微调的大模型就能很简单的发布给他人使用,非常的方便便捷。

当然这个样例程序还有需要待完善的地方,你觉得该如何完善?

你可能感兴趣的:(pipeline,uvicorn,Starlette,model,LLM)