最近小宇宙的asr系统python服务出现有规律性的内存泄漏,容器crash重启现象,具体表现在如下监控


asr服务最近上线的新功能是接入了vibevoice模型,在此之前从没有发生过内存泄漏,于是立刻把问题定位在vibevoice部分的代码。这次的排查全程在ClaudeCode的协助下完成。

首先让ClaudeCode定位到可能出问题的代码,然后给出如何追踪服务在运行过程中的内存情况。ClaudeCode增加了tracemalloc 以及快照的调试接口。我便开始在服务器上部署调试镜像,调用模型,记录快照,最后把快照的输出发给ClaudeCode分析。vibevoice的模型接入逻辑是把音频转成base64字符串,然后再通过http接口发送给真正的模型推理服务,获得转录结果。ClaudeCode猜测是音频的base64字符串和大json,在调用推理接口报错时,全部会被 traceback 的 frame locals 死死引用。它给出了以下修复代码

1
2
3
4
5
6
7
8
9
10
11
12
# _stream_transcription
try:
with requests.post(..., stream=True, timeout=720) as response:
...
finally:
payload = None # 切断对 data_url 的引用

def _build_data_url(self, segment_file: str) -> str:
with open(segment_file, 'rb') as f:
return f"data:{self.get_mime_type(segment_file)};base64," \
+ base64.b64encode(f.read()).decode('utf-8')

按照它的修复,我重新发版测试了一下,效果还是不好,于是我继续把内存追踪快照结果发给它分析。紧接着它分析出了第二个问题:C 扩展堆 / glibc 碎片

它建议我添加MALLOC_ARENA_MAX=2PYTORCH_ALLOC_CONF=expandable_segments:True 这两个环境变量。我照做了,发版后再次测试,神奇的事情发生了,内存确实不再一直增长,而是增长一部分后就稳定在了固定水平,问题解决了。

最近一直在负责小宇宙asr系统的开发上线,第一版已经上线,实际性能表现在2分半处理完4小时的单集。但是第一版的实现方式是在nodejs里直接执行python transcribe脚本,这就导致了模型会在每次执行脚本的时候重复加载到显存里,浪费资源,不仅如此,因为前置还有语言检测步骤,这一步也需要重复加载whisper模型到显存,为了不让语言检测和transcribe两个步骤重复加载的模型在并发时显存溢出,

所以设置的并发数远远低于预期值。于是为了解决这个问题,我决定对python部分做一次重构,具体实现思路很简单,用FastAPI把python部分变成http服务,在python服务启动时就把asr模型加载好,之后在接口里通过已经加载好的模型直接推理即可。第一版代码很简单:

阅读全文 »

原因是视频的色彩空间问题,QuickTime 默认只支持YUV420的视频,如果ffmpeg输入的原视频色彩空间超过了YUV420,如果没有任何filter,那么输出的视频色彩空间也是保持一致。

所以需要在ffmpeg里指定色彩空间 ffmpeg … -pix_fmt yuv420p output.mp4

2026年春节想去一个暖和的地方过,前几年去过厦门,三亚又太贵,候选项只剩下广东,于是和老婆决定去广州+深圳+香港的旅行计划,品尝一下粤菜的风味。

阅读全文 »

2025年还是发生了蛮多事的,年初公司的各种操作,比如要求精确登记工时,如果工时不够管理层还会找你问责为什么工时不够,实际上是公司没有什么项目能让大家都有工时可做。于是被迫分配到一个上古项目,代码可以说写的非常恶心,真的是忍着恶心劲写完的。

阅读全文 »

今年公司要举行一次团建,正好我赶上了,团建目的地是越南胡志明,总共四天时间。出发前就从一位在胡志明住了好几个月的朋友那要了一份她收藏的店铺合集,非常期待了。

阅读全文 »

今年的国庆节和中秋节一起放8天,正好今年办了护照,且还没有出国旅行过,于是决定选择互联网上普遍认为签证最简单,旅行难度最低的韩国,作为第一个出国目的地。

出发前准备

签证

  • 上海领区的韩国签证和网上说的一样非常简单,即使是5年多次,额外材料也只需要芝麻信用分或者本科学历,如果不是江浙沪户籍,还需要上海居住证。费用是820,我是在临近出发前1周左右提交的申请,大使馆的工作人员告知可能需要7-10个工作日,怕赶不上行程,于是多花了280加急,只用3个工作日就拿到了签证。

  • 拿到签证后,谷歌搜索韩国入境申报,可以在出发前1-3天在官方网站上填写电子申报表,这样在过海关时就不用填写纸质申报表了,可以节省一些时间。

    阅读全文 »

背景

最近有用户反馈平台上产出的clip色彩表现和原视频不一致,下载了原片和clip,对比图如下

阅读全文 »

最近在做一个有关答题系统的需求,前端同事希望能使用JSON Form和JSON Schema作为数据的交互和答案的验证,于是对后端来说就需要将JSON和类互相转换。由于题目有单选和多选两种类型,相应的JSON也有不同的结构如下

阅读全文 »

个人用的Mac M2Max电脑,最近连接OpenVPN一直报错Error calling protect() method on socket,网上搜了一下解决方案,只需要执行以下3条命令即可

1
2
3
4
5
6
sudo su

launchctl load -w /Library/LaunchDaemons/org.openvpn.client.plist

untill reboot // 这条执行报错也无所谓

最后重启一下OpenVPN即可

0%