当前位置:首页 > 技术文章 > 正文内容

Ascend+FastAPI+ Uvicorn 实现推理

arlanguage3个月前 (02-09)技术文章30

1、FastAPI & Uvicorn

FastAPI

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 Python Web 框架,专为在 Python 中构建 RESTful API 而设计,具有以下特点:

高性能

  • 性能卓越:FastAPI 的性能可与 NodeJS 和 Go 等语言的高性能 Web 框架相媲美,是最快的 Python Web 框架之一。这得益于其底层的 Starlette 框架和异步编程模型,能够充分利用 Python 异步生态系统,提供卓越的性能和吞吐量。
  • 异步支持:FastAPI 支持基于 Python 3.7 及以上版本的异步编程,使得处理 IO 密集型任务更加高效,非常适合高并发的场景。
from fastapi import FastAPI
app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

在这个例子中,我们定义了两个路由:一个根路由 / 和一个带参数的路由 /items/{item_id}。通过装饰器 @app.get(),我们指定了 HTTP 方法和路由路径。函数参数将自动从查询参数、路径参数、请求头等中提取,并进行数据验证。

Uvicorn

Uvicorn 是一个基于 ASGI(Asynchronous Server Gateway Interface)的轻量级异步服务器,用于运行 Python Web 应用程序,特别是那些基于 ASGI 的现代异步框架,如 FastAPI、Starlette 等。以下是关于 Uvicorn 的详细介绍:

基本功能

  • 异步支持:Uvicorn 是一个异步服务器,能够充分利用 Python 的异步编程特性。它使用 Python 的 asyncio 库来处理并发请求,使得应用程序能够更高效地处理大量并发连接,特别适合处理 IO 密集型任务,如网络请求、数据库操作等。
  • 高性能:Uvicorn 的性能非常出色,它能够快速地处理请求和响应,提供高吞吐量和低延迟的服务。在许多基准测试中,Uvicorn 的性能表现与一些传统的同步服务器(如 Gunicorn)相比具有显著优势,尤其是在处理大量并发请求时。

FastAPI + Uvicorn 的结合

  • 无缝集成:Uvicorn 与 FastAPI 结合使用非常方便。FastAPI 生成的 ASGI 应用可以直接由 Uvicorn 运行,无需额外的适配。这种组合充分利用了 FastAPI 的开发友好性和 Uvicorn 的高性能,使得开发和部署异步 Web 应用变得非常简单。
  • 生产环境:在生产环境中,Uvicorn 可以与 Nginx 等反向代理服务器配合使用,提供更稳定、更安全的服务。Nginx 可以处理静态文件、负载均衡、SSL/TLS 加密等任务,而 Uvicorn 专注于处理动态请求。

假设有一个简单的 FastAPI 应用 app.py

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"Hello": "World"}

可以通过以下命令使用 Uvicorn 启动该应用:

bash复制uvicorn app:app --host 0.0.0.0 --port 8000

访问 http://localhost:8000 即可看到返回的 JSON 响应。

2、Ascend上跑推理

方案设计

具体的模型通过transformers 库的from_pretrained接口从xxx-config配置文章引入。

model = AutoModel.from_pretrained("xxx-config", torch_dtype="auto").to("npu:0"),

引入。然后就是,以FastAPI + Uvicorn启动一个web服务,通过generate_chat_output运行推理,获取推理结果。

整体方案代码参考如下

import torch
import torch_npu
import uvicorn
from typing import List
from fastapi import FastAPI
from contextlib import asynccontextmanager
from transformers import AutoTokenizer, AutoModel
from fastapi.middleware.cors import CORSMiddleware

# 设置卡
torch.npu.set_device("npu:0")

# 配置tokenizer 
tokenizer = AutoTokenizer.from_pretrained("xxx-config")

# 获取模型
model = AutoModel.from_pretrained("xxx-config", torch_dtype="auto").to("npu:0")

@asynccontextmanager
async def lifespan(app: FastAPI):
    yield
    if torch_npu.npu.is_available():
        torch_npu.npu.empty_cache()

# 实例化api服务器
app = FastAPI(lifespan=lifespan)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
)

# 推理实现
@app.post("/llm/chat")
async def generate_chat_output(item: Item):
    try:
        texts = [t.replace("\n", " ") for t in item.sentences]
        encoded_inputs = tokenizer(texts, truncation=True, return_tensors="pt", padding=True, max_length=512).to("npu:0")
        with torch.no_grad():
            model_output = model(**encoded_inputs)
    except Exception as e:
        traceback.print_exc()

    return sequence_embeddings.tolist()

# uvicorn提供服务化
if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8080)

构建测试

测试文件test.py如下:

import httpx
data = {
    "sentences": ["中国GDP为129.43万亿元,GDP增速为5.25%,人均GDP为8.94万元/人,人均GDP增速为5.40%,其中第一产业占6.90%,第二产业占36.80%,第三产业占56.30%"]
}
def request_url():
    with httpx.Client() as client:
        res = client.post("http://127.0.0.1:1025/llm/chat", json=data)
        print(res.json())

运行

python test.py

客户端和服务器均正常。

添加图片注释,不超过 140 字(可选)

上述他图片结果,仅攻参考。

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/2402.html

标签: cas nginx
分享给朋友:

“Ascend+FastAPI+ Uvicorn 实现推理” 的相关文章

Linux下各种连接数配置及高并发Nginx优化

前言在性能测试过程中,经常会接触到链接数相关的问题,那就是一台服务器最多能支持多少链接数呢?有的朋友可能会说是65535,因为操作系统有65535个端口,那么这个答案准确吗?首先先了解下如何标识一个链接,操作系统是通过一个四元组来标识一个TCP链接:{本地ip,本地port,远程ip,远程port}...

陪你一起学kafka(五)——kafka如何发送消息到nginx

背景在实际的项目中,我们经常会遇到各种网络域的隔离,通常各个网络域之间的通信,我们会通过nginx做代理,进行转发。那kafka的消息可以通过nginx转发吗,答案是肯定的。今天分享给大家详细的过程。美好的一天,从分享开始,加油!准备kafka,版本2.13-3.0.0nginx,版本1.9.9环境...

nginx -> frps -> frpc -> 内网服务器

1. Nginx简介概述Nginx是一个高性能的HTTP和反向代理服务器,也可以作为邮件代理服务器。它以其高并发处理能力、低内存占用和高效的事件驱动模型而闻名。其主要功能包括处理静态文件服务、反向代理、负载均衡等。例如,在处理大量的静态网页请求时,Nginx可以快速地将请求对应的静态文件发送给客户端...

技巧:PHP版本怎样隐藏在Linux服务器

通常情况下,大多数安装web服务器软件的默认设置存在信息泄露,这些软件其中之一就是PHP。PHP是如今最流行的服务端html嵌入式语言之一。而在如今这个充满挑战的时代,有许多黑客会尝试发现你服务端的漏洞。因此,ehowstuff网站一篇简单描述如何在Linux服务器中隐藏PHP信息值得关注。(图片来...

SeaTunnel 实践 | SeaTunnel 帮你快速玩转 Spark 数据处理

Databricks 开源的 Apache Spark 对于分布式数据处理来说是一个伟大的进步。我们在使用 Spark 时发现了很多可圈可点之处,我们在此与大家分享一下我们在简化 Spark 使用和编程以及加快 Spark 在生产环境落地上做的一些努力。01一个 Spark Streaming 读取...

Nginx专题(1):Nginx之反向代理及配置

一、Nginx概念解读对于新事物的理解,最好的方式就是从概念入手,本文作为《Nginx专题》系列文章的第一篇,先从Nginx的名称开始来分解这个神秘的引擎。Nginx,是engine X的缩写,发音也是'engine x',2004年由俄罗斯大神伊戈尔·赛索耶夫开发,提供了高性能而易...