语义分割与实例分割性能差距;yield与return;GPU 资源管理;异步互斥锁与async/await;Worker问题;
1.语义分割与实例分割性能差距
语义分割:给每个像素分配一个类别标签,不区分同类的不同实例。例如,一张图片里有三辆车,语义分割只会标记这些像素为“车”,不会区分是哪一辆。
实例分割:不仅要分类每个像素,还要区分同类的不同实例。例如图上面三辆车,每辆车都要有不同的实例 ID。
结论:实例分割比语义分割多了“实例区分”这个步骤,计算量更大。
2.yield与return
| 特性 | return | yield |
|---|---|---|
| 返回方式 | 一次性返回一个值 | 多次返回多个值(流式输出) |
| 是否结束函数 | 立刻结束 | 不结束,只暂停 |
| 用途 | 普通函数 | 生成器(节省内存 + 流式计算) |
| 能否中途继续执行 | 不能 | 下次会从上次的 yield 继续 |
| 内存占用 | 大(一次性计算所有结果) | 小(一步一步算) |
3.GPU 资源管理架构
由于SAM3模型较大,使用单例模式,不重复加载模型到显存里面
✔ 模型初始化一次
✔ 避免重复占显存
✔ 所有推理都要排队使用同一模型实例
现在有两个接口:预加载视频推理接口与流式视频推理接口
两个接口中调用了SAM3的视频推理模型,都会占用大量GPU资源。
考虑到目前应用场景并不复杂,使用异步互斥锁,放在在调用了SAM3的视频推理模型代码前
video_inference_lock = asyncio.Semaphore(1)
4.异步互斥锁与async/await
异步互斥锁
用来解决多个用户并发,抢夺重要的GPU资源。
不加锁 → GPU必然被多个协程同时调用 → 并行推理。
async/await用来并发处理 I/O
上传视频(用户上传很慢)、读取文件(I/O)、写临时文件(磁盘)、WebSocket 发消息(网络 I/O)、CPU 解码视频(OpenCV)
🔥 async 解决的是「单个请求内部」的等待问题,一个协程(一个用户请求)内部在 I/O 时可以干别的事。
5.Worker问题
Worker = 一个独立运行的 Python 解释器进程,拥有独立 GIL、独立内存、独立 GPU session。
Python 单进程(1 worker)无法并行运行 CPU/GPU 推理。
所有请求都被阻塞调试模式只有 1 worker、所有请求都排队。
浙公网安备 33010602011771号