FastAPI 和 Flask
所属分类 python
浏览量 7
FastAPI 和 Flask 是 Python 中两种主流的 Web 框架,分别代表高性能与简易性的不同选择
新增大模型 API 服务:无脑选 FastAPI,性能和开发体验全面领先.
存量项目兼容:Flask 可作为过渡方案,但长期建议迁移至 FastAPI.
学习成本:有 Flask 基础的开发者,3 天内可上手 FastAPI(主要是类型注解和依赖注入).
建议直接从 FastAPI 入门,其设计理念更符合现代 API 开发需求,尤其在大模型应用的高并发、低延迟场景中表现卓越.
一、核心差异对比
特性 Flask FastAPI
诞生时间 2010 年(元老级) 2018 年(新生代)
框架类型 轻量级、无强制依赖(微框架) 重量级、依赖类型注解(全功能框架)
性能 中等(依赖 WSGI 协议) 极快(基于 ASGI,接近 Node.js/Go)
开发体验 自由度高,需手动集成组件 自动生成文档、类型检查、依赖注入
大模型场景适用性 适合原型验证、轻量 API 适合高性能推理服务、高并发场景
二、性能对比:FastAPI 碾压式领先
测试环境:MacBook Pro M1,Python 3.10
测试内容:返回简单 JSON 响应(1000 并发请求)
框架 吞吐量(req/s) 平均响应时间(ms)
Flask + Gunicorn ~1500 650
FastAPI + Uvicorn ~7500 130
原因:
FastAPI 基于 ASGI(异步协议),支持非阻塞 I/O,充分利用多核 CPU.
Flask 基于 WSGI(同步协议),请求处理时会阻塞线程,高并发下性能骤降.
三、代码对比:以大模型 API 为例
1. Flask 实现
from flask import Flask, request, jsonify
from transformers import pipeline
app = Flask(__name__)
generator = pipeline('text-generation', model='gpt2')
@app.route('/generate', methods=['POST'])
def generate():
data = request.json
prompt = data.get('prompt', '')
max_length = data.get('max_length', 50)
try:
result = generator(prompt, max_length=max_length)
return jsonify({"output": result[0]['generated_text']})
except Exception as e:
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(debug=True)
2. FastAPI 实现
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from transformers import pipeline
app = FastAPI()
generator = pipeline('text-generation', model='gpt2')
class GenerationRequest(BaseModel):
prompt: str
max_length: int = 50
@app.post("/generate")
async def generate(request: GenerationRequest):
try:
result = generator(request.prompt, max_length=request.max_length)
return {"output": result[0]["generated_text"]}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
关键差异:
类型安全:FastAPI 通过 Pydantic 模型自动验证请求参数,减少错误.
异步支持:FastAPI 的 async def 可处理并发请求,不阻塞主线程.
文档自动生成:访问 /docs 即可查看交互式 API 文档(基于 Swagger UI).
四、大模型场景下的选择建议
1. 优先选 FastAPI 的场景
高并发推理服务:如面向海量用户的聊天机器人 API.
流式响应需求:支持 SSE(Server-Sent Events)实时返回生成内容.
与异步组件集成:如异步调用 Redis、数据库等.
团队协作项目:自动文档和类型检查可减少沟通成本.
2. 可选 Flask 的场景
快速原型开发:代码简单,5 分钟内可搭建 API.
轻量级服务:内部工具、小规模应用.
已有 Flask 项目扩展:需兼容旧系统.
五、FastAPI 进阶技巧(大模型场景)
1. 模型预热与单例模式
避免每次请求加载模型,采用全局单例:
# app.py
from fastapi import FastAPI
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
app = FastAPI()
# 全局加载模型(启动时执行一次)
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2", torch_dtype=torch.float16)
model.eval() # 设置为评估模式
@app.post("/generate")
async def generate(prompt: str):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(**inputs, max_length=100)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
2. 并发优化
使用 async + torch.inference_mode() 提升吞吐量:
@app.post("/generate")
async def generate(prompt: str):
async with asyncio.Lock(): # 模型非线程安全时加锁
with torch.inference_mode(): # 禁用梯度计算,加速推理
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=100)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
3. 模型量化与加速
集成 bitsandbytes 进行 8-bit 量化:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import bitsandbytes as bnb
model = AutoModelForCausalLM.from_pretrained(
"gpt2",
load_in_8bit=True, # 8-bit 量化
device_map="auto", # 自动设备分配
)
六、部署方案对比
框架 推荐部署方式 资源占用(示例)
Flask Gunicorn + Nginx 单实例 300MB RAM
FastAPI Uvicorn + Nginx(HTTP/2) 单实例 250MB RAM(异步优势)
上一篇
大模型 与 CUDA
12种常见的提示词框架
Python3 VS Python2