首页  

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