MiniSora推理API开发:FastAPI+ONNX Runtime实现高并发视频生成服务
【免费下载链接】minisora 项目地址: https://gitcode.com/GitHub_Trending/mi/minisora
项目概述
MiniSora是一个基于扩散模型的视频生成框架,通过结合FastAPI和ONNX Runtime技术,可以构建高性能、高并发的视频生成API服务。本教程将详细介绍如何利用项目现有模块codes/OpenDiT/构建完整的推理服务,包括模型导出、API设计和性能优化。
技术架构
系统架构
MiniSora推理服务采用三层架构设计:
- 接入层:FastAPI提供RESTful API接口,处理HTTP请求和响应
- 推理层:ONNX Runtime执行模型推理,支持多线程和批处理
- 存储层:本地文件系统存储生成的视频结果
核心模块
推理服务主要依赖以下核心模块:
- 模型推理:codes/OpenDiT/opendit/models/latte.py
- 扩散过程:codes/OpenDiT/opendit/diffusion/gaussian_diffusion.py
- 视频处理:codes/OpenDiT/opendit/utils/video_utils.py
- VAE编解码:codes/OpenDiT/opendit/vae/wrapper.py
环境准备
依赖安装
首先安装必要的依赖包:
pip install fastapi uvicorn onnxruntime-gpu torchvision opencv-python
项目完整依赖列表可参考codes/OpenDiT/requirements.txt。
模型准备
使用项目提供的下载工具获取预训练模型:
from opendit.utils.download import download_model
download_model("Latte-XL-2x2x2")
模型下载模块实现于codes/OpenDiT/opendit/utils/download.py。
模型导出为ONNX格式
PyTorch模型转ONNX
将训练好的PyTorch模型导出为ONNX格式,以便ONNX Runtime加载:
import torch
from opendit.models.latte import Latte_XL_2x2x2
# 加载预训练模型
model = Latte_XL_2x2x2(
input_size=(2, 32, 32),
num_classes=1000,
enable_flashattn=False
)
model.load_state_dict(torch.load("latte_pretrained.pth"))
model.eval()
# 创建示例输入
dummy_input = (
torch.randn(1, 4, 2, 32, 32), # z
torch.tensor([1000]), # t
torch.tensor([0]) # y
)
# 导出ONNX模型
torch.onnx.export(
model,
dummy_input,
"latte_model.onnx",
input_names=["z", "t", "y"],
output_names=["output"],
dynamic_axes={
"z": {0: "batch_size"},
"output": {0: "batch_size"}
},
opset_version=16
)
ONNX模型优化
使用ONNX Runtime提供的优化工具对模型进行优化:
python -m onnxruntime.tools.optimize_onnx_model --use_external_data_format latte_model.onnx
API服务实现
FastAPI应用设计
创建main.py实现API服务:
from fastapi import FastAPI, BackgroundTasks
from pydantic import BaseModel
import onnxruntime as ort
import torch
import numpy as np
from opendit.utils.video_utils import save_video_grid
from opendit.vae.wrapper import AutoencoderKLWrapper
from opendit.diffusion import create_diffusion
import uuid
import os
app = FastAPI(title="MiniSora Video Generation API")
# 加载ONNX模型
sess_options = ort.SessionOptions()
sess_options.intra_op_num_threads = 8
sess_options.execution_mode = ort.ExecutionMode.ORT_SEQUENTIAL
ort_session = ort.InferenceSession(
"latte_model.onnx",
sess_options,
providers=["CUDAExecutionProvider", "CPUExecutionProvider"]
)
# 初始化VAE和扩散模型
vae = AutoencoderKLWrapper.from_pretrained("stabilityai/sd-vae-ft-ema")
diffusion = create_diffusion("250")
# 请求模型
class VideoRequest(BaseModel):
prompt: str
num_frames: int = 16
image_size: int = 256
cfg_scale: float = 4.0
# 响应模型
class VideoResponse(BaseModel):
request_id: str
video_path: str
status: str
@app.post("/generate-video", response_model=VideoResponse)
async def generate_video(request: VideoRequest, background_tasks: BackgroundTasks):
request_id = str(uuid.uuid4())
video_path = f"outputs/{request_id}.mp4"
# 生成视频(实际推理过程)
background_tasks.add_task(
run_inference,
request,
request_id,
video_path
)
return {
"request_id": request_id,
"video_path": video_path,
"status": "processing"
}
def run_inference(request: VideoRequest, request_id: str, video_path: str):
# 文本编码(实际实现需使用clip_text_emb.py)
# [codes/OpenDiT/opendit/embed/clip_text_emb.py](https://link.gitcode.com/i/3c219f701c439aacd9a791153d0d018c)
# 生成随机噪声
input_size = (request.num_frames//2, request.image_size//8, request.image_size//8)
z = np.random.randn(1, 4, *input_size).astype(np.float32)
# 扩散过程采样
# 简化实现,实际应参考[codes/OpenDiT/sample.py](https://link.gitcode.com/i/13a5039ffecd836180330188439e2676)
sample = np.random.randn(1, 3, request.num_frames, request.image_size, request.image_size)
# 保存视频
os.makedirs("outputs", exist_ok=True)
save_video_grid(torch.from_numpy(sample), video_path)
return video_path
API文档
FastAPI自动生成的交互式API文档:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
性能优化
批处理推理
通过批处理请求提高GPU利用率,修改推理函数支持批处理:
def batch_inference(requests):
# 准备批处理输入
batch_size = len(requests)
z = np.random.randn(batch_size, 4, 16, 32, 32).astype(np.float32)
# 执行批处理推理
inputs = {
"z": z,
"t": np.array([1000]*batch_size, dtype=np.int64),
"y": np.array([0]*batch_size, dtype=np.int64)
}
outputs = ort_session.run(None, inputs)
return outputs[0]
推理优化
- 使用ONNX Runtime的IO绑定功能减少数据传输开销
- 启用FlashAttention加速注意力计算codes/OpenDiT/opendit/modules/attn.py
- 设置合适的线程数和执行模式
部署与监控
服务部署
使用Gunicorn作为生产服务器,配合Uvicorn工作进程:
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
性能监控
集成Prometheus监控推理性能:
from prometheus_fastapi_instrumentator import Instrumentator
Instrumentator().instrument(app).expose(app)
监控指标包括:
- 请求延迟分布
- GPU内存使用率
- 推理吞吐量
总结
本教程介绍了如何基于MiniSora项目构建高并发视频生成API服务,主要包括:
- 利用现有模型模块构建推理流程
- 将PyTorch模型导出为ONNX格式以提高性能
- 使用FastAPI设计RESTful API接口
- 实现批处理和多线程推理优化
完整项目文档可参考docs/目录,更多技术细节请查看源代码中的实现。
【免费下载链接】minisora 项目地址: https://gitcode.com/GitHub_Trending/mi/minisora
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






