MiniSora推理API开发:FastAPI+ONNX Runtime实现高并发视频生成服务

MiniSora推理API开发:FastAPI+ONNX Runtime实现高并发视频生成服务

【免费下载链接】minisora 【免费下载链接】minisora 项目地址: https://gitcode.com/GitHub_Trending/mi/minisora

项目概述

MiniSora是一个基于扩散模型的视频生成框架,通过结合FastAPI和ONNX Runtime技术,可以构建高性能、高并发的视频生成API服务。本教程将详细介绍如何利用项目现有模块codes/OpenDiT/构建完整的推理服务,包括模型导出、API设计和性能优化。

技术架构

系统架构

MiniSora推理服务采用三层架构设计:

  • 接入层:FastAPI提供RESTful API接口,处理HTTP请求和响应
  • 推理层:ONNX Runtime执行模型推理,支持多线程和批处理
  • 存储层:本地文件系统存储生成的视频结果

系统架构

核心模块

推理服务主要依赖以下核心模块:

环境准备

依赖安装

首先安装必要的依赖包:

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]

推理优化

性能优化

部署与监控

服务部署

使用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服务,主要包括:

  1. 利用现有模型模块构建推理流程
  2. 将PyTorch模型导出为ONNX格式以提高性能
  3. 使用FastAPI设计RESTful API接口
  4. 实现批处理和多线程推理优化

完整项目文档可参考docs/目录,更多技术细节请查看源代码中的实现。

MiniSora架构

【免费下载链接】minisora 【免费下载链接】minisora 项目地址: https://gitcode.com/GitHub_Trending/mi/minisora

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

抵扣说明:

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

余额充值