用 Flask 封装 GPT-2 INT8 推理服务:轻量部署与接口调用实战

本文基于 quant_api_server.py 脚本,展示如何使用 Flask 封装动态量化后的 GPT-2 模型为 Web 接口,支持 JSON 调用、网页交互与远程部署,适合搭建本地轻量级 NLP 服务。


📁 项目结构建议

.
├── quant_api_server.py
├── gpt2_student_v2_quantized/
│   ├── pytorch_model.bin
│   └── config.json
├── ../python3_distillation/gpt2_student_v2/  # tokenizer
├── templates/index.html                     # 前端页面(可选)

1️⃣ Flask 服务结构核心

from flask import Flask, request, jsonify, render_template
from transformers import GPT2LMHeadModel, GPT2Tokenizer
import torch

app = Flask(__name__, static_folder="static", template_folder="templates")

# 加载 tokenizer
tokenizer = GPT2Tokenizer.from_pretrained("../python3_distillation/gpt2_student_v2")

# 加载量化模型结构与权重
model = GPT2LMHeadModel.from_pretrained("./gpt2_student_v2_quantized")
state_dict = torch.load("./gpt2_student_v2_quantized/pytorch_model.bin")
model.load_state_dict(state_dict)
model.eval()

2️⃣ 接口路由设置

网页主页(可选)

@app.route("/", methods=["GET"])
def home():
    return render_template("index.html")

推理 API 接口

@app.route("/infer", methods=["POST"])
def infer():
    data = request.get_json()
    prompt = data.get("prompt", "").strip()
    if not prompt:
        return jsonify({"error": "Missing prompt"}), 400

    inputs = tokenizer(prompt, return_tensors="pt")
    with torch.no_grad():
        logits = model(**inputs).logits

    token_id = int(logits[0, -1].argmax())
    token_text = tokenizer.decode([token_id], clean_up_tokenization_spaces=True).strip()

    return jsonify({
        "response": f"INT8 模型生成词: {token_text}",
        "token_id": token_id
    })

3️⃣ 启动服务

python quant_api_server.py

默认监听 http://localhost:6006,可通过浏览器、Postman 或 curl 调用。


4️⃣ 示例调用(Postman)

请求:

POST /infer
Content-Type: application/json

{
  "prompt": "I love"
}

返回:

{
  "response": "INT8 模型生成词: you",
  "token_id": 345
}

5️⃣ 前端网页支持(可选)

你可以在 templates/index.html 添加表单输入页面:

<form id="prompt-form">
  <input type="text" id="prompt" placeholder="输入你的问题..." />
  <button type="submit">生成</button>
</form>
<div id="result"></div>

<script>
document.getElementById("prompt-form").addEventListener("submit", async (e) => {
  e.preventDefault();
  const prompt = document.getElementById("prompt").value;
  const res = await fetch("/infer", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ prompt })
  });
  const data = await res.json();
  document.getElementById("result").innerText = data.response;
});
</script>

6️⃣ 实战技巧总结

场景推荐方式
API 部署Flask + Gunicorn
测试调用Postman 或 curl
远程公网访问配合 Ngrok 或 Cloudflare Tunnel
容器化部署可封装为 Docker 镜像运行

📌 总结

  • Flask 可快速封装 INT8 模型为 JSON 接口
  • from_pretrained + load_state_dict 支持加载量化模型
  • 接口支持网页、Postman、脚本多端调用
  • 可拓展为完整对话服务或远程调用平台

🧭 本系列 GPT-2 模型量化部署系列四部曲


📌 YoanAILab 技术导航页

💡 项目源码 × 实战部署 × 转型经验,一页总览
👉 点击查看完整导航页

📚 包含内容:

  • 🧠 GPT-2 项目源码(GitHub)
  • ✍️ 优快云 技术专栏合集
  • 💼 知乎转型日志
  • 📖 公众号 YoanAILab 全文合集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YoanAILab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值