两个同事同时提交任务,第二个一直在排队,第一个人不结束第二个就不动。
原因不止一个,得分开看。默认并发限制是一,请求被串行处理;模型是全局单例,无法同时推理;队列长度设得太小,超出直接拒绝;长任务占住唯一的执行槽。
提高默认并发限制
demo.queue(default_concurrency_limit=4).launch()
然后把推理改成批处理合并请求
python -c "print('dynamic batching')"
适当增大队列长度
demo.queue(max_size=64)
监控单次请求耗时定位瓶颈
python -c "print('log latency per request')")
隔了一天再看,现象没变,说明不是偶发。
那几天正好在做别的变更,先把时间线对齐才敢动手。
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
恢复的判定其实很直接。多人同时提交时能并行处理或快速轮流完成,排队时间明显缩短。
并发调高会让显存压力成倍上升,先用单个请求测出显存余量,再决定能开几路。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。