【DEBUG】Debug日志001:RL项目记录
Debug日志001
-
报错:
ImportError: /lib64/libc.so.6: version 'GLIBC_2.32' not found
- 分析:
- 因为linux版本不够新,所以不支持GLIBC_2.32,只支持GLIBC 2.31
- 不能直接升级服务器的linux版本,所以得调整flash attention的版本
- 方法:flash_attn 版本从 2.8.1.post2 下降至 2.7.4.post1
- 分析:
-
报错:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
- 分析:
- opencv库存在问题
- 方法限制:
- 不能用sudo权限
- 也不能用opencv的headless版本
- 方法:
conda install -c conda-forge libgl libglu
(只下载这两个库)
- 分析:
-
报错:
tensor和随机数生成器不在一个设备上
- 分析:和SFT中的问题很像,于是同样采取monkey patch来解决
- 方法:用新函数覆盖原来的函数
def safe_trunc_normal_(tensor, mean=0., std=1., a=-2., b=2., generator=None):if tensor.dtype == torch.bfloat16:tmp = torch.empty_like(tensor, dtype=torch.float32)torch.nn.init._no_grad_trunc_normal_(tmp, mean, std, a, b, generator=generator)tensor.copy_(tmp.to(torch.bfloat16))return tensorelse:return torch.nn.init._no_grad_trunc_normal_(tensor, mean, std, a, b, generator=generator)torch.nn.init.trunc_normal_ = safe_trunc_normal_
-
报错:
wandb.errors.errors.CommError: Run initialization has timed out after 90.0 sec.
-
分析:wandb初始化超时,因为连不上网
-
方法:配置文件中,将其设置成离线模式
export WANDB_MODE=offline
-
-
报错:
size mismatch...
- 分析:
- 模型没有正确加载,才会导致这个错误
- 因为模型checkpoint用的是相对路径,所以代码运行位置会决定模型是否正确加载
- 方法:
- 需要在
VARGPT1.1
处运行代码 - 若在
VARGPT1.1/VARGPT-RL
则会报这个错
- 需要在
- 分析:
-
报错:
IndexKernel.cu:93: ... Assertion -sizes[i] <= index && index < sizes[i] && "index out of bounds"failed.
- 分析: cuda数组越界
- 方法:
- 因为分布式训练不好定位,且网上有人说降pytorch版本就可以解决
- 所以将pytorch版本降到2.4,报错解决
-
报错:
cu92:device-side assert triggered
-
分析:还是cuda越界,和cu93似乎略有区别
- 网上说需要
export CUDA_LAUNCH_BLOCKING=1
来显示具体报错位置- 但模型很大,需要分布式训练的话,这个方法可能会失效
- 所以我把模型所有参数都冻结了,然后就可以在单卡上运行代码
- 这时候再配置这个就可以准确报错了
- 设置完后,我们看Traceback
[rank0]: File "xxx/modeling_vargpt_qwen2_vl.py", line 2244, in forward [rank0]: x_BLC_wo_prefix, scale_schedule, training_scales, gt_BL = self.get_vae_gt_xin_v1_1(pixel_gen_values, self.vargpt_gen_args) # torch.Size([2, 640, 2048]) [rank0]: File "xxx/modeling_vargpt_qwen2_vl.py", line 1552, in get_vae_gt_xin_v1_1 [rank0]: T = 1 if inp_B3HW.dim() == 4 else inp_B3HW.shape[2] [rank0]: IndexError: tuple index out of range
- 找到越界发生的位置,发现
pixel_gen_values
这个变量传入的维度有问题。 - 但是这个应该是执行生成的时候,才会去使用的参数,为什么会有这个问题?
- 打印输出发现,pixel_gen_values前81个都是none,但在completion的token处,显示被赋了值
- 强制改掉程序路径后(即不走生成任务),发现input_id一直没有赋值,所以猜测是pixel_gen_values和input_id的值传反了
- 网上说需要
-
方法:加一个条件判断,让错误的传参,重新传递
-
if pixel_gen_values is not None and pixel_gen_values.dim()!= 4: # fix the problem of pixel_gen_values has a worng shapeinput_ids = pixel_gen_valuespixel_gen_values = None
- CUDA报错非常折磨,一定要想办法让其能够准确输出报错点。
- 可以通过让程序在CPU上运行;或者配置CUDA参数,让其traceback。