它是一个轻量级、高度可用性和可扩展性的Web框架,它专门为异步应用程序设计。 Starlette基于Python 3.6+的异步/协程语法,具有快速响应性能和低延迟。你可以将它理解为Java的Spring。
安装:pip install starlette
它是一个Python Web服务器,用于实现基于ASGI(异步服务器网关接口)的异步Web应用程序。它是用Python编写的,可高效、高性能地处理HTTP请求和响应,而且很容易配置和部署。你可以将它理解为Java的Tomcat。
安装:pip install uvicorn
- 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服务,这样我们微调的大模型就能很简单的发布给他人使用,非常的方便便捷。
当然这个样例程序还有需要待完善的地方,你觉得该如何完善?