部署了很长时间的一个服务突然就不工作了,功能基于qwen lora微调,同时采用clip对输入文本进行了约束,整个程序流程中会用到pretrainedmodels, clip内部会调用hashlib。说下我的debug思路,虽然还没找到根因,但对大家解决问题应该会有些帮助。
1. 首先,我肯定怀疑环境问题,我的推理部署环境平时还用来做一些训练,难免会做一些pip install之类。发现问题之后,我把所有模块重新pip install了一遍,问题没解决。
2. 怀疑系统环境问题,比如python是不是坏了,比如磁盘是不是嗝了一些块,所以我把系统也给重装了一遍,全部软件重新安装了一遍,问题没有解决-_-!!! 吐槽一下,现在安装torch老是会遇到什么hash不匹配之类的,需要加--no-cache-dir,有时候还不管用,折腾死了,不知道世界咋了。NVIDIA driver和cuda也经常更新版本,用最新的容易出问题,快把老血吐没了。ubuntu 22.04也没那么好安装,几个安装盘u盘都会出现问题安装不上,卡在xorg启动上,最后只好用最原始的文本安装模式才搞定。
3. 无论如何,2没起到作用。好,这下安下心来,干脆debug一下各种source code,网上搜下来,无非是调整earlystopping或者temperature之类,或者直接修改transformers代码里multinormal加几个nan值处理的逻辑,也不起作用。还有怀疑和卡的数量或者用哪张卡有关系的,难怪牛顿也要信上帝去了。
4. 抓狂中,幸好!!!我还有一台机器,环境一模一样可以工作的,所以我就开始怀疑是不是有些保存的权重已经出问题了,于是从那台机器同步了一下qwen 14b chat的模型权重。上天眷顾,错误变了,不再是"RuntimeError: probability tensor contains either inf, nan or element < 0 ",出来clip ViT-B-32.pt权重hash不match,这个也是比较奇怪,经过轮番轰炸的print debug之后,总结出规律就是,下面这个代码不工作,两次输出的hash不一样
import hashlib
import pretrainedmodels
print(hashlib.sha256(open("./anyfile", "rb").read()).hexdigest())
print(hashlib.sha256(open("./anyfile", "rb").read()).hexdigest())
第4步里有不少不符合逻辑的地方,按道理同步qwen权重不应该会对hashlib有啥影响,另外,就算hashlib出问题,但和之前标题里的错误,八杆子也关联不到一起。无论如何,基于这个发现,我就对pretrainedmodels进行了调试,也许在这个过程,python会重新解析pretrainedmodels模块,"RuntimeError: probability tensor contains either inf, nan or element < 0 "居然就消失了,模型又重新正常工作了。心累! 不过我猜测,可能还是存放权重的磁盘出了什么问题,导致一系列莫名其妙的行为。