技术探索与实践的一些思考:从一次图像生成平台重构谈起
引子:我们为什么要折腾这件事?

作为一名在某一线互联网公司做AIGC相关研发的工程师,我过去三年亲历了整个AI生成内容(AIGC)技术的爆发式发展。从最早的文本到图片,到如今的文字、语音、视频甚至3D建模都在被大模型和扩散模型快速重塑。
去年初,我和团队负责一个内部的图像生成平台重构项目。这个平台原本只是一个基于Stable Diffusion 1.x的小型服务,主要用于产品设计、运营素材生成等非生产场景。但随着业务线接入越来越多,特别是市场部开始尝试用它批量制作投放素材后,问题逐渐暴露出来:
- 生成效率低,请求排队严重;
- 模型版本混乱,不同团队使用的模型不一致;
- 推理性能波动大,尤其高峰时段响应超时频繁;
- 用户体验参差不齐,缺乏统一的内容安全检查机制;
- 扩展性差,新增模型或功能需要停机上线。
这些问题其实并不是个例,而是很多早期AIGC项目在“野蛮生长”阶段都会遇到的典型挑战。当时我们面临的一个关键决策是:是继续小修小补,还是彻底重构整个系统架构?最终我们选择了后者,并在这个过程中经历了大量的技术选型和落地实践。
这篇文章除了记录我们重构过程中的经验教训,也希望分享一些关于AIGC开发中技术探索与工程实践之间的平衡的心得体会。
一、问题描述:当我们面对“老系统+新技术”的时候


我们的原始系统是一个轻量级的图像生成微服务,主要流程如下:
API请求 -> 参数解析 -> 本地调用SD模型生成图片 -> 返回结果
当时的模型版本是Stable Diffusion 1.4,部署方式是单节点GPU推理,没有调度器也没有负载均衡。用户通过UI界面或简单SDK发起请求,系统直接将提示词传给模型生成图片。
随着使用人数增加,我们发现几个核心痛点:
1. 性能瓶颈明显
单节点GTX 3090跑SD 1.4,每张图片生成时间平均7~8秒。一旦并发请求超过3个就开始排队,延迟暴涨。虽然可以多开几个实例,但运维成本高,资源利用率低。
2. 模型版本管理混乱
不同的业务线可能希望用不同的模型,比如有的要写实风格,有的要动漫风。而旧系统无法动态切换模型,更新模型还需要重启服务,影响线上所有用户。
3. 缺乏标准化流程
图像生成之后没有任何校验机制,敏感内容、重复生成、格式错误都可能流入下游。后期想加只能重新开发中间件,导致逻辑越来越复杂。
4. 系统扩展能力弱
如果要支持新任务类型,比如图像修复、文字转草图、ControlNet控制等,必须修改代码并重新部署。灵活性非常有限。
这些问题背后反映了一个本质矛盾:我们正在用传统软件开发的思路去处理AI生成内容的不确定性与复杂性。而这正是大多数早期AIGC项目面临的困境。
二、解决方案:构建一个模块化、可扩展的图像生成平台
我们决定从头设计一个新的图像生成平台,目标是具备良好的伸缩性、模块化结构、以及灵活的模型管理和任务调度能力。
架构升级:从单体服务走向微服务 + 任务队列
我们将系统拆解为以下几个核心模块:
- API入口层:处理用户请求,参数校验,鉴权
- 任务分发中心:负责路由请求到合适的模型组,并分配工作节点
- 模型推理集群:多个节点运行不同版本的模型服务
- 任务队列系统:异步执行生成任务,降低阻塞风险
- 内容安全检测模块:对生成结果进行自动审核
- 结果存储 & 回调机制:处理生成后的图片返回和状态更新
整体架构参考了Kubernetes + Celery + FastAPI的组合,同时引入了一些自研组件用于模型热加载。
模型层改造:支持多版本热切换
为了让平台能够灵活支持不同模型版本,我们在原有基础上做了几点改进:
- 使用TorchScript预编译模型,在服务启动时根据配置动态加载
- 将模型权重分离存储在远程仓库(S3兼容的对象存储)
- 引入Model Manager作为独立服务,负责拉取/缓存模型文件并通知推理节点更新
这样做的好处是可以在不中断服务的情况下完成模型替换,大大提升了系统的可用性。
异步化设计:解决并发瓶颈
为了提升吞吐量,我们采用了Celery作为底层任务队列系统,将图片生成作为一个异步任务来处理:
@app.post("/generate")
def generate_image(prompt: PromptInput):
task = celery.send_task("image_generation", args=[prompt])
return {"task_id": task.id}
@celery.task(name="image_generation")
def image_generation_task(params):
model = load_model_from_config(...) # 根据参数选择模型
result = model.generate(**params)
upload_to_s3(result) # 存储图片
callback_notify(...)
这样的设计让我们可以轻松横向扩展推理节点数量,同时也避免了单点故障。
三、技术选型中的纠结与平衡
在整个重构过程中,有几个技术选型上的争论比较激烈,也值得拿出来分享。
1. 是否使用ONNX Runtime加速推理?
我们对比了PyTorch原生推理和ONNX Runtime两种方案:
| 方案 | 优点 | 缺点 |
|---|---|---|
| PyTorch 原生 | 支持完整diffuser pipeline,调试方便 | 推理速度较慢,内存占用高 |
| ONNX Runtime | 可优化计算图,推理速度快 | 部分功能支持不完善,定制化难 |
最终我们选择保留PyTorch作为主推理引擎,但在某些高频任务中尝试导出ONNX模型用于验证性能,后续会逐步推进优化。
2. 使用哪个框架进行模型管理?
我们调研了ModelZoo、MLflow和自研方案:
- MLflow 功能强大但过于复杂,不适合轻量级系统
- ModelZoo 更适合研究场景,缺乏企业级支撑
- 自研模型管理模块更符合实际需求,可控性强
因此我们采用自研结合YAML配置的方式实现了一套简单的模型注册和调度机制。
3. 内容审核怎么搞?
由于我们平台允许用户输入任意提示词,因此必须考虑内容安全。我们采取了以下策略:
- 对提示词做初步过滤(关键词黑名单)
- 生成的图片送审模型做二次判断
- 对于不确定的结果进入人工复审池
这个部分目前还在持续优化中,未来可能会结合Diffusion Detox之类的模型做前端过滤。
四、效果总结:重构带来的变化
项目历时约两个月完成第一期重构,上线三个月后的反馈数据如下:
| 指标 | 改造前 | 改造后 |
|---|---|---|
| 平均响应时间 | 8s+ | <3s (P95) |
| 单日最大并发量 | ~100次/分钟 | >500次/分钟 |
| 模型更新耗时 | 10分钟以上 | <1分钟 |
| 新增模型支持周期 | 1~2周 | <1天 |
| 故障率 | 0.5% | <0.05% |
更重要的是,这套系统已经具备了良好的扩展能力,后续新增了ControlNet、图像修复、Inpainting等功能模块,均为插拔式集成。
五、经验分享:AIGC开发中的一些坑和建议
如果你也在做类似的AI生成类系统开发,或者准备启动类似项目,这里是我踩过的一些坑和建议:
1. 别一开始就想做“通用平台”
很多人一开始都想着做一个“全栈通用AI生成平台”,但实际上这类系统往往需要大量前置投入,且容易变成“啥都能干,啥都不专业”。我们最初也是这个想法,后来才明白:先聚焦一个业务场景,打磨细节,再逐步扩展才是正途。
2. 不要低估模型管理的成本
一个稳定的模型上线流程比你想的要复杂得多。不仅要考虑版本控制、兼容性测试、灰度发布,还要考虑到训练-部署闭环的打通。建议:
- 统一模型元数据标准
- 建立清晰的模型生命周期管理机制
- 搭配完善的AB测试体系
3. 图像生成 ≠ 模型推理
很多人以为只要模型跑通就能上线,其实远远不够。图像生成涉及到的任务链条远比你想象的长:
用户提示词 → 采样参数配置 → 模型推理 → 图片质量评估 → 安全审查 → 格式标准化 → 结果返回 → 后续使用跟踪
这些环节缺一不可,否则很容易造成用户体验崩坏。
4. 多留些“降级通道”
有时候我们会过于追求先进性,把所有东西都上分布式、异步化,结果一出错连最基础的功能都瘫痪了。建议:
- 设计一些“保底模式”,比如纯CPU退化路径
- 关键任务保留同步接口便于调试
- 提供足够的监控报警,而不是等到用户投诉才发现异常
六、结语:在不确定中寻找确定性
AIGC的发展太快了,快到让人有点眼花缭乱。短短几年内,我们看到文本生成、图像生成、音频生成、视频生成轮番登场,模型结构也不断迭代演进。对于我们这些开发者来说,既充满机遇,也带来了巨大的挑战。
在这次重构过程中,我学到最重要的一点是:技术探索固然重要,但真正的价值在于如何将这些能力稳定地交付到用户手中。
每一个模型的背后,都是一个个真实的需求;每一次性能优化的尝试,都可能换来千万用户的体验提升。
或许未来的路依然漫长,但我相信只要我们保持开放的心态,脚踏实地地做好每一步,终能在AIGC这片热土上留下属于自己的足迹。
如果你也有过类似的开发经历,欢迎留言交流。我也很乐意分享更多具体的实现细节和部署方案。希望这篇文章对你有所帮助。

评论 0