首页 > 其他分享 >用fastapi和sse创建流式输出接口

用fastapi和sse创建流式输出接口

时间:2024-06-13 09:55:11浏览次数:20  
标签:tokenizer fastapi 流式 import text sse new model event

示例为调用huggingface的大模型,使其流式输出

from fastapi import FastAPI, Request
import requests
import json
import os
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer, TextIteratorStreamer
from sse_starlette.sse import EventSourceResponse
from threading import Thread
import asyncio
import os
os.environ["TOKENIZERS_PARALLELISM"] = "false"

app = FastAPI()

class Model:
    model = None
    tokenizer = None

class Message(BaseModel):
    messages: str

# 程序启动时 加载模型
@app.on_event("startup")
async def startup_event():
  # 模型路径 model_id = "/data1/songxiaoyong/model_70b" # model_id = "/data1/songxiaoyong/model_8b_origin" Model.tokenizer = AutoTokenizer.from_pretrained(model_id) Model.model = AutoModelForCausalLM.from_pretrained( model_id, torch_dtype="auto", device_map="auto" ) @app.get("/") async def index(): """ 注册一个根路径 :return: """ return {"message": "Welcome"} @app.post("/chat") async def chat(request: Request): """ 项目信息 :return: """ model = Model.model tokenizer = Model.tokenizer messages=await request.json() messages=messages["messages"] print(messages) # messages = [ # # {"role": "user", "content": "写一篇100字的作文"}, # ] input_ids = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=False ) encoding = tokenizer(input_ids, return_tensors="pt") # streamer = TextStreamer(tokenizer) streamer = TextIteratorStreamer(tokenizer) encoding = encoding.to('cuda') generation_kwargs = dict(encoding, streamer=streamer, max_new_tokens=8192, do_sample=True, temperature=0.8, top_p=0.9) thread = Thread(target=model.generate, kwargs=generation_kwargs) thread.start() # generated_text = "" async def event_generator(streamer): for index, new_text in enumerate(streamer): if index == 0: continue print(new_text) if "<|eot_id|>" in str(new_text): new_text = str(new_text).replace("<|eot_id|>", "")

       # 处理换行符 if "\n" in str(new_text): new_text=str(new_text).replace("\n", "@@@@") # yield json.dumps({ # "event": "message", # "data": new_text # },ensure_ascii=False) yield new_text await asyncio.sleep(0.1) event_source = EventSourceResponse(event_generator(streamer))
  # 把发送Ping信息的间隔设置长一点 event_source.ping_interval = 60000 return event_source

nohup uvicorn erver:app --host '0.0.0.0' --port 8000 --reload > server.logs 2>&1 &

标签:tokenizer,fastapi,流式,import,text,sse,new,model,event
From: https://www.cnblogs.com/sxy-blog/p/18245267

相关文章

  • FastAPI-8:Web层
    8Web层本章将进一步介绍FastAPI应用程序的顶层(也可称为接口层或路由器层)及其与服务层和数据层的集成。一般来说,我们如何处理信息?与大多数网站一样,我们的网站将提供以下方法:检索创建修改替换删除8.1插曲:自顶向下、自底向上、中间向外?(Top-Down,Bottom-Up,Middle-Out......
  • python系列:python fastapi + uvicorn 记录日志的最佳实践,结合nb_log
    pythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,要记录对fastapi什么时候请求了什么url和入......
  • 解决报错 cuDNN error: CUDNN_STATUS_NOT_SUPPORTED. This error may appear if you p
      训练模型出现报错cuDNNerror: CUDNN_STATUS_NOT_SUPPORTED.Thiserrormayappearifyoupassedinanon-contiguousinput.1.尝试了对可能的tensor添加.contiguous()函数,不能解决问题,排除。2.尝试将batch_size=12减小到10,不再报错,但实验要求不能减小batch_s......
  • FastAPI+MemFire Cloud+LangChain开发ChatGPT应用
    为什么选择这三个组合OpenAI官方SDK是Python,此开发语言首选PythonFastAPI是Python语言编写的高性能的现代化Web框架MemFireCloud提供向量数据库支持,向量数据库是开发知识库应用的必选项MemFireCloud提供Supabase托管,LangChain原生支持SupabaseAPILangChain是AI应用开发......
  • Attacking organizations with big scopes: from zero to hero -- by Hussein Daher
    SRC意识:1.模仿与抄袭某个知识点,某个writeup,某个主题,某个赏猎报告等;2.对现网中所有实际SRC目标进行遍历;3.枯草且乏味的持之以恒的坚持前面的第1步与第2步。错误的SRC意识:学了OWASPTOP10和BP官网靶场的所有漏洞主题之后依旧在SRC方面没有表现出应该具备的自信心?错误的做法在于,选......
  • python系列:FastAPI系列 10-路由管理APIRouter
    FastAPI系列10-路由管理APIRouterFastAPI系列10-路由管理APIRouter前言一、路由管理APIRouter二、FastAPI主体总结FastAPI系列10-路由管理APIRouter前言在fastapi中也有类似的功能通过APIRouter来管理一、路由管理APIRouter正在开发一个应用程序或We......
  • 靶机练习:Assertion 1.0.1
    信息收集扫描全端口以发现服务nmap-n-v--max-retries=0-p-172.16.33.99--max-rate=500-Pn访问80端口,使用dirsearch扫描目录目录中没发现啥可以利用的拿shell随便点点,疑似有路径可以进行本地文件包含想看/etc/passwd失败了可以尝试一下这种方法成功读取到......
  • 深入理解交叉熵损失 CrossEntropyLoss - CrossEntropyLoss
    深入理解交叉熵损失CrossEntropyLoss-CrossEntropyLossflyfish本系列的主要内容是在2017年所写,GPT使用了交叉熵损失函数,所以就温故而知新,文中代码又用新版的PyTorch写了一遍,在看交叉熵损失函数遇到问题时,可先看链接提供的基础知识,可以有更深的理解。深入理解交叉熵损......
  • FastAPI-6:依赖
    6依赖FastAPI非常出色的设计特性之一是“依赖注入”的技术。这个术语听起来既专业又深奥,但它却是FastAPI的一个关键方面,而且在很多层面上都有惊人的作用。本章将介绍FastAPI的内置功能以及如何编写自己的功能。6.1什么是依赖依赖项是某一时刻需要的特定信息。获取这......
  • FastAPI-5:Pydantic、类型提示和模型预览
    5Pydantic、类型提示和模型FastAPI主要基于Pydantic。它使用模型(Python对象类)来定义数据结构。这些模型在FastAPI应用程序中被大量使用,是编写大型应用程序时的真正优势。5.1类型提示在许多计算机语言中,变量直接指向内存中的值。这就要求程序员声明它的类型,以便确定值的大小......