uvicorn、Starlette、パイプラインを使用して、トレーニングされた大規模なモデルを Web サービスに公開します

技術用語:

1、スターレット:

これは、非同期アプリケーション専用に設計された、軽量で可用性が高く、スケーラブルな Web フレームワークです。Starlette は、Python 3.6 以降の非同期/コルーチン構文に基づいており、高速な応答パフォーマンスと低遅延を備えています。これは Java の Spring と考えることができます。

インストール: pip install starlette

2、ユビコーン

ASGI (Asynchronous Server Gateway Interface) に基づいた非同期 Web アプリケーションを実装するための Python Web サーバーです。HTTP リクエストとレスポンスを効率的かつパフォーマンス的に処理するために Python で書かれており、構成と展開が簡単です。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}]

要約:

トランスフォーマーのパイプラインを使用して Python Web サービスを構築すると、微調整された大規模なモデルを他の人に簡単にリリースして使用できるため、非常に便利です。

もちろん、このサンプルプログラムにはまだまだ改善の余地がありますが、どのように改善すべきだと思いますか?

おすすめ

転載: blog.csdn.net/duzm200542901104/article/details/133362517