基于vLLM实现FastAPI应用多请求并行/并发处理的技术咨询
多用户场景下vLLM并行/并发请求实现方案
核心思路
vLLM基于PagedAttention机制天然支持高效的批量请求调度,无需手动实现复杂并发控制,重点是结合FastAPI异步特性与vLLM异步客户端,最大化吞吐量的同时保证每个请求的有效性。
具体实现步骤
1. 初始化vLLM异步引擎
使用vLLM提供的异步API创建引擎,避免阻塞FastAPI事件循环:
from vllm import AsyncLLMEngine, AsyncEngineArgs from vllm.sampling_params import SamplingParams # 根据GPU资源调整参数,比如gpu_memory_utilization engine_args = AsyncEngineArgs( model="mistralai/Mixtral-8x7B-Instruct-v0.1", gpu_memory_utilization=0.9 ) engine = AsyncLLMEngine.from_engine_args(engine_args) # 定义全局采样参数,也可根据请求动态调整 sampling_params = SamplingParams(max_tokens=512, temperature=0.7)
2. 编写FastAPI异步端点
利用FastAPI异步路由直接对接vLLM异步生成方法,每个请求会被事件循环自动调度,vLLM内部会批量处理并发请求:
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class InferenceRequest(BaseModel): prompt: str temperature: float = 0.7 # 允许请求自定义参数 @app.post("/generate") async def generate_response(req: InferenceRequest): # 动态调整采样参数(可选) req_sampling_params = SamplingParams( max_tokens=512, temperature=req.temperature ) # 异步调用vLLM生成结果 outputs = await engine.generate(req.prompt, req_sampling_params) # 提取单请求结果 final_output = outputs[0].outputs[0].text return {"response": final_output}
3. 适配Langchain RAG异步流程
如果使用Langchain RAG组件,必须采用异步接口避免阻塞,确保端到端异步:
from langchain.chains import RetrievalQA from langchain_community.retrievers import AsyncVectorDBRetriever from langchain_community.llms import VLLM # 初始化异步向量检索器 async_retriever = AsyncVectorDBRetriever(vectorstore=your_vector_store) # 初始化vLLM异步LLM实例 vllm_llm = VLLM( model="mistralai/Mixtral-8x7B-Instruct-v0.1", async_mode=True, max_tokens=512 ) # 创建异步RAG链 rag_chain = RetrievalQA.from_chain_type( llm=vllm_llm, chain_type="stuff", retriever=async_retriever, return_source_documents=True ) # RAG请求端点 @app.post("/rag-query") async def rag_response(req: InferenceRequest): result = await qa_chain.arun(req.prompt) return {"response": result}
4. 配置优化建议
- vLLM引擎调优:根据GPU显存调整
max_num_batched_tokens,提升批量处理能力;开启enable_chunked_prefill优化长请求处理。 - FastAPI运行配置:用Uvicorn启动时,搭配
uvloop事件循环并设置合理workers数(如与CPU核心数匹配),命令示例:uvicorn main:app --host 0.0.0.0 --port 8000 --workers 2 --loop uvloop - 请求过载保护:添加简单的异步队列(如
asyncio.Queue),限制同时处理的请求数,避免vLLM引擎过载。
验证方式
- 用Locust设置多用户并发压测,观察响应时间波动与请求成功率,确保无结果丢失或异常。
- 查看vLLM日志中的
num_requests_in_flight指标,确认引擎在高效处理批量请求。
内容的提问来源于stack exchange,提问作者Volodymyr Bondarenko
相关产品推荐
相关产品推荐

