ASR项目实战-交付过程中遇到的内核崩溃问题

这篇具有很好参考价值的文章主要介绍了ASR项目实战-交付过程中遇到的内核崩溃问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当前参与交付的语音识别产品服务,算法模块基于经典的Kaldi,算法中的一部分运行在GPU之上。
算法团队采用的是声学模型+语言模型的1-pass方案。这个方案的特点在于,语言模型数据文件(HCLG文件)的大小,和训练语料的丰富程度正相关,即语言文本的语料越多,经过训练、转换后得到的语言模型文件越大。
经过数据团队一段时间的努力,当前项目使用的语言模型,已经达到了 XX GB的规模。
这对我负责交付的算法服务组件带来了全方位的挑战:

  • 版本构建,耗时接近30分钟。
  • 安全扫描,耗时接近30分钟,运气不好的话,可能会上升至1小时+。
  • 版本上传软件仓库,耗时至少10分钟。
  • 版本部署,耗时约30分钟。
  • 服务启动,耗时5分钟,其中主要时间都用来解析、加载语言模型文件。

平时在开发的部署环境上远程调试业务时,需要反复给服务打补丁、重启,由于启动时间耗时在5分钟,因此调试效率很低。受限于硬件规格,调试效率低的问题一直没有很好的解决方法,于是开发小伙伴们只好忍着。

但终于有一天的晨会上,开发小伙伴向我抱怨,现在调试算法服务时效率非常低,启动程序时,至少需要两次,等待10分钟,才能将程序运行起来。小伙伴们反复验证,发现打补丁之后,第一次启动算法服务时一定会启动失败。小伙伴反馈的这个信息,一开始我并没有放在心上,但事后证明这是一个大的疏忽。

后来,我交付的一个需求,代码在本地使用UT用例验证完毕,进入在环境上做功能验证的环节。这时由于需要反复的对环境打补丁、重启服务,修复远程调试过程中发现的问题,同样的,我也遇到了小伙伴反馈的现象。不过这个现象被我误判断为网络问题,因为那段时间网络特别差,经常断网,导致控制台程序随机断开,这也会导致服务启动不成功。
网络的问题很好修复,并且持续的时间比较短。而我自己UT做的相对比较充分,因而花在远程调试的时间比较短,因此业务需多次启动的问题,对我的困扰不大。于是,这个多次启动的问题被我轻易放过了。

版本转测试之后,测试同事反馈两个现象:

  • 在配置中心修改配置后,无法自动生效。
  • 测试同事部署新版本之后,需要至少需要启动两次,才能把服务正常运行起来。

这两个现象都很奇怪。
对于第一个现象,我们基于基础平台来交付业务,很多产品的服务都使用这套框架,而我们团队内部其它的服务也使用了这套框架,都没有遇到过在配置中心修改配置后不生效的现象。
对于第二个现象,正常情况下,使用部署工具完成算法服务的部署之后,算法服务本身是应该处于运行状态的。但测试同学发现使用最近的版本安装完成之后,算法服务经常处于启动失败的状态。而手工启动时,至少需要两次启动,才能启动成功。

测试同事是在做性能压力测试的准备工作时观察到的前述现象,虽然暂时不会阻塞性能测试,但本着怀疑一切、不能放过问题的精神,测试同事提交了问题单,要求尽快解决。于是,现在不能当成偶然事件放过了,需要认真对待,否则必然影响版本发布。

对于测试同事反馈的第一个问题,为便于后续的说明,这里先介绍一下配置管理的实现方案。
配置管理服务,包括配置中心和cnfg_agent。

  • 配置中心集中部署,提供Web界面供用户管理、维护应用服务的配置项和值。
  • cnfg_agent和业务服务组件同机部署,使用相同的运行账号,定时从配置中心服务读取配置项和值,并写入本地文件,由业务服务组件读取。

经过观察测试同事的环境,有如下发现:

  • 环境上的cnfg_agent进程没有处于运行状态。手工启动cnfg_agent后,在配置中心修改的配置值,可以被cnfg_agent正常同步至本地。由此可以确认cnfg_agent自身的业务功能是正常的。
  • 两次启动算法服务后,发现cnfg_agent进程消失了,因此需要确认cnfg_agent消失的原因。

联系配置管理服务的技术支持同学,了解到cnfg_agent的工作原理。

  • cnfg_agent安装过程中,安装脚本会自动定义一个cron任务。
  • 在cron任务的脚本代码中,会主动检查cnfg_agent进程是否存在,如不存在,则拉起cnfg_agent进程。

因此,即便是cnfg_agent由于自身的原因退出运行,理论上讲,应该很快被定时运行的cron任务检测到异常,并自动启动,不应该出现cnfg_agent长时间处于离线状态的现象。

进一步检查测试同事提供的环境,发现一个新的现象。如前所述,cnfg_agent和业务组件同机部署,使用了相同的操作系统的账号。检查测试环境的主机,发现业务账号恰好没有创建cron任务的权限,这意味着安装cron定时任务的操作一定失败。因此当cnfg_agent进程退出后,没有定时任务来检测、并重新拉起cnfg_agent进程。这可以解释为什么cnfg_agent消失后不能自动恢复运行。

于是,在测试环境上,手工给业务账号增加创建、执行cron任务的权限,并增加cnfg_agent的cron任务。之后尝试多次重启算法服务,发现cnfg_agent虽然会退出运行,但很快就会被cron任务拉起。
因此cnfg_agent进程退出后无法恢复运行的问题,可以使用本方法临时规避。

继续分析。

检查cnfg_agent的日志文件,在启动算法服务的时间点,找到了cnfg_agent退出运行的日志记录。
对于我们提供的信息,配置管理服务的技术支持同学给出的答案是,cnfg_agent退出运行,通常只在操作系统重启时才有可能会遇到。

按照这个答复,检查/var/log/messages,居然真的找到了操作系统重启的日志记录,同时观察到了内核crash的记录。检查时间点,发现启动算法服务、cnfg_agent退出运行,这三件事的时间点相同。

这时,基本可以把算法服务第一次启动失败、cnfg_agent退出运行、操作系统重启,这三件事情关联在一起分析。

联系操作系统专家,在其协助下,顺利的找到了操作系统重启的原因。原来是出现了内核crash现象,并且在出现问题的一台主机上提取到了内核crash的相关记录。
我们当前部署算法服务的主机,基于CentOS定制,安装了kdump工具。操作系统专家依据kdump生成的crash信息,找到两类原因:

  • 主机的内存不足,触发内核crash。
  • GPU驱动的代码中存在一处bug,申请内存后,没有对指针判空,当申请内存失败时,C库返回的是空指针,这时GPU驱动的代码直接操作这个指针,触发了空指针异常,进而导致内核crash。

这两个原因都和内存相关。
和操作系统专家、基础设施专家交流后,依据他们的建议,选择一台存在问题的主机,提交扩充规格的申请,将内存放大一倍。再复现操作,发现算法服务只需一次即可正常启动。

经反复重试后,确认:

  • 内核不再crash。
  • cnfg_agent不会出现重启现象。
  • 算法服务只需一次即可启动。由于扩充规格后,CPU数量蛮多,现在启动算法服务的时间也缩短了。

因而有理由推断:

  • cnfg_agent的意外重启现象,和cnfg_agent自身的质量无关,和操作系统重启强相关。
  • 操作系统的重启现象,主要由内核crash导致。
  • 而内核crash现象,目前看和算法服务所在主机的硬件规格过低相关。
  • 扩充规格后,一切问题现象全部消失。

将前述定位的信息同步给测试同事,经过讨论之后,测试同事基本认可分析结论。
大家达成一致结论:

  • 对于硬件规格不足的问题,同意调整测试环境中主机的规格,继续执行其余的验证。
  • 对于GPU驱动中存在的问题,需要算法同事介入,验证高版本的GPU驱动是否解决了相关的问题。
  • 假如高版本的GPU驱动解决了问题,涉及到的版本升级、版本部署包、安装指导等的更新,暂时先放在任务清单。

后记:
升级硬件规格之后,操作系统内核crash的现象不再出现。但前述描述的原因和现象之间的关系,个人感觉还是有点牵强。比如在重启应用时,这时系统其实处于空载状态,内存占用率、显卡的内存占用率,实际上比较低,但内核仍然会出现crash事件,比较怪异。由于不具备分析内核、驱动类故障的技能和经验,并且无法获得操作系统专家进一步的协助,因此本事件暂时放一放。

如下是kdump相关的帖子:文章来源地址https://www.toymoban.com/news/detail-775120.html

  • centos配置kdump捕获内核崩溃
  • CentOS7配置kdump

到了这里,关于ASR项目实战-交付过程中遇到的内核崩溃问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 新建vite+vue3+ts项目,以及解决过程中遇到的问题

    目录 一、新建vite+vue3+ts项目 二、解决过程中遇到的问题 解决报错:Module ‘“xx.vue“‘ has no default export. 解决报错:Error [ERR_MODULE_NOT_FOUND]: Cannot find package ‘uuid’ imported from xxx的解决 解决报错:[plugin:vite:css] Preprocessor dependency \\\"less\\\" not found. Did you install it? 此处我使用npm做一下

    2024年02月06日
    浏览(113)
  • ASR项目实战-架构设计

    一般而言,业务诉求作为架构设计的输入。 对于语音识别产品而言,需满足的需求,举例如下: 功能需求 文件转写。 长文件转写,时长大于60秒,小于X小时,X可以指定为5。 短文件转写,时长小于60秒。 实时语音识别。 长语音识别,时长大于60秒,小于Y小时,Y可以指定为

    2024年02月04日
    浏览(35)
  • ASR项目实战-产品分析

    分析Google、讯飞、百度、阿里、QQ、搜狗等大厂的ASR服务,可以罗列出一款ASR服务所需要具备的能力。 ASR云服务产品,从用户体验、时效性、音频时长,可以划分为如下几类: 实时短音频转写,可以用于支撑输入法、搜索、导航等场景。 实时长音频转写,可以用于支撑视频

    2024年02月04日
    浏览(35)
  • ASR项目实战-后处理

    本文深入探讨后处理环节。 在本环节要处理的重要特性有分词、断句、标点符号、大小写、数字等的格式归一等。 和NLP、搜索等场景下的分词含义不同。对于拼音类的语言,比如英语、法语等,句子由多个单词组成,语音输出的结果,需要按需在各个单词之间补充或者去掉

    2024年02月04日
    浏览(29)
  • ASR项目实战-数据

    使用机器学习方法来训练模型,使用训练得到的模型来预测语音数据,进而得到识别的结果文本,这是实现语音识别产品的一般思路。 本文着重介绍通用语音识别产品对于数据的诉求。 相关要求,如下: 地域,需要覆盖使用人群所在的地域,且数据的比例适中。 口音,需要

    2024年02月04日
    浏览(33)
  • ASR项目实战-语音识别

    本文深入探讨语音识别处理环节。 本阶段的重点特性为语音识别、VAD、热词、文本的时间偏移、讲话人的识别等。 业界流派众多,比如Kaldi、端到端等,具体选择哪一种,需要综合考虑人员能力、训练数据量和质量、硬件设施、交付周期等,作出相对合理的交付规划。 基于

    2024年02月04日
    浏览(37)
  • ASR项目实战-决策点

    针对语音识别的产品,分别记录设计、开发过程中的决策点。 对于实时语音识别来说,客户端和服务端之间实时交换语音数据和识别的结果。 客户端在启动识别时,即开始发送语音数据,期望在等待较短的时间后,即收到最初的识别结果。第一段语音数据和第一个识别结果

    2024年02月04日
    浏览(37)
  • ASR项目实战-构建Kaldi

    软件清单如下: bzip2 python3 automake libtool cmake gcc g++ gfortran git subversion 不同平台安装软件的方式不同,比如可以使用 yum 或者 apt-get 等。 软件清单如下: Libunwind glog OpenFST OpenBLAS Kaldi 按照一定的规则,将下载后的文件放在指定目录,如下是样例 build.sh 的内容,如下为样例:

    2024年02月04日
    浏览(29)
  • ASR项目实战-前处理

    本文深入探讨前处理环节。 首先介绍一些基本的名词,比如 文件名后缀 文件格式 音频格式 采样率和位深 常见的音频文件,比如 .wav 、 .mp3 、 .m4a 、 .wma 等,这些都代表什么? 仅仅是这类音频文件的后缀而已,不一定和音频文件的编码、音频数据的编码相关。 举例说明:

    2024年02月04日
    浏览(29)
  • ASR项目实战-方案设计

    对于语音识别产品的实施方案,给出简易的业务流程,仅供参考。 如下流程图,可以使用如下两个站点查看。 web chart Web Sequence Diagrams 创建文件转写任务 执行文件转写任务 获取转写结果 有两个方案,分别如下。二者差别,比如: 在语音识别的过程中,语音数据是否需要经

    2024年02月04日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包