I encountered issues while reproducing the training process.
Hi,
-
When I tried to reproduce the training process, I noticed that the validation results were not satisfactory each time at the default 10 epochs and 500 steps. Is there an issue with the current version of the training code?
-
After obtaining the checkpoint shard files and merging them using zero_to_fp32.py, only the .bin file and pytorch_model.bin.index.json file were generated. When I try to use the generated .bin file for validation, it throws an error.
-
Do I still need to merge the LoRA weights? Because during merging, it always says the config.json file is missing.
你这个也是训练一直是giou0.02,ciou为0吗
你这个也是训练一直是giou0.02,ciou为0吗
我已经解决这个问题了,需要确保torch的版本要对是老的那个版本,你如果先安装了torch老版本再按照作者的依赖取pip安装各种包,其中有一个包(哪个我忘了)会将老的torch替换,这会导致能够正常训练跑通但是训练的结果很奇怪,解决方法是强制那个包不安装其所需依赖。确保torch为老的版本。
而检查点分片文件代码则需要进行重构,目前我猜测应该还是版本问题,会导致切片为多个bin文件而导致没法合并
您目前能达到多少的精度呢iou,您能为我提供您所使用的pytorch版本吗
用的依赖中提到的老版本pytorch=1.13.1,应该在pip install peft==0.4.0的时候,会使得环境又安装其他版本的torch,我使用默认的9,3,3,1的数据集采样,项目的推理数据集验证,得到
我猜测后面再将采样设置为0,0,0,1,在这个推理数据集上能有进一步提高或者复现项目论文的准确率。
我使用的llava-llama-2-13b-chat-lightning-preview
好的好的,谢谢
你好,你有使用自己训练的checkpoints合并然后去推理chat吗,我这边尝试合并推理并没有成功
你好,你有使用自己训练的checkpoints合并然后去推理chat吗,我这边尝试合并推理并没有成功
有的,且推理正常
请问你有在7b上训练成功过吗,我训练一直iou低于0.1
稍等,我可以为你尝试一下,因为我正好在做开发测试
好的,非常感谢
我在h100上配置了环境,但是发现训练不对,我在3090上尝试了llava-v1.5但是无法进行推理,使用了合并了delta的v1版本,iou一直处在0.1以下
llava-v1.5是怎么设置修改的呢?我也进行了测试,无法训练,iou一直是0.02和0 我看到他用的版本是LLaVA-7B-Lightening-v1-1,目前正在调用这个版本测试 我现在正在重构llava部分,尝试去用llava1.5复现最优结果。
你试了7b也不行吗,我直接使用version=’liuhaotian/llava-v1.5-7b‘训练了,但是chat会报错AttributeError: 'NoneType' object has no attribute 'shape'
不行,我在确定是不是我环境损坏了 我直接换liuhaotian/llava-v1.5-7b训练不起来,离谱
....我昨天用1.5能有结果,今天,不管用哪个训练,iou都是0了,不知道什么情况
都能行,能训练,我只有两张a6000,比较慢,环境坏了一个,破玩意,这个项目限制很多,torch就框死死的老版本,不然不至于重弄
你把7b的训练结果正常了是吧,那我这边再试试
今早起来发现也是都不过0.1的iou了,无论是13b还是7b,你有解决吗?
我已经训练好了7b,已经解决了
训练了6轮,giou: 0.4167, ciou: 0.3924。我刚看到论文里面有llava1.5版本的,但是它的代码目前好像运行1.5chat会出错。
今早起来发现也是都不过0.1的iou了,无论是13b还是7b,你有解决吗?
他这个太不稳定了,如果还是无法解决的话我猜测是环境问题
我认为是数据集或者batchsize设置问题,导致有时候性能可以上去有时候不能,目前为止我没看到任何一个人有复刻出结果,有个segllm项目可能有成功
我试了llava1.5-7b,还是不可以复现,甚至不能训练
论文的结果是真的不敢想了,估计也没几个开源的能达到
我又跑了同样的设置,一直卡在0.04了。你有什么有效的解决方法吗
使用这段我重构的train,它原先的有bug,然后尝试调整lora_r为32或者64,累计计算步数-grad_accumulation_steps为8的倍数,目前我已经解决。
def train( train_loader, model, epoch, scheduler, writer, train_iter, args, ): """Main training loop.""" batch_time = AverageMeter("Time", ":6.3f") data_time = AverageMeter("Data", ":6.3f") losses = AverageMeter("Loss", ":.4f") ce_losses = AverageMeter("CeLoss", ":.4f") mask_bce_losses = AverageMeter("MaskBCELoss", ":.4f") mask_dice_losses = AverageMeter("MaskDICELoss", ":.4f") mask_losses = AverageMeter("MaskLoss", ":.4f")
progress = ProgressMeter(
args.steps_per_epoch,
[
batch_time,
losses,
ce_losses,
mask_losses,
mask_bce_losses,
mask_dice_losses,
],
prefix="Epoch: [{}]".format(epoch),
)
# switch to train mode
model.train()
end = time.time()
for global_step in range(args.steps_per_epoch):
# 清零梯度(每个 global_step 开始时)
model.zero_grad()
for i in range(args.grad_accumulation_steps):
try:
input_dict = next(train_iter)
except StopIteration:
train_iter = iter(train_loader)
input_dict = next(train_iter)
data_time.update(time.time() - end)
input_dict = dict_to_cuda(input_dict)
# === 新增精度处理逻辑开始 ===
if args.precision == "fp16":
input_dict["images"] = input_dict["images"].half()
input_dict["images_clip"] = input_dict["images_clip"].half()
elif args.precision == "bf16":
input_dict["images"] = input_dict["images"].bfloat16()
input_dict["images_clip"] = input_dict["images_clip"].bfloat16()
else:
input_dict["images"] = input_dict["images"].float()
input_dict["images_clip"] = input_dict["images_clip"].float()
# === 新增精度处理逻辑结束 ===
output_dict = model(**input_dict)
loss = output_dict["loss"]
ce_loss = output_dict["ce_loss"]
mask_bce_loss = output_dict["mask_bce_loss"]
mask_dice_loss = output_dict["mask_dice_loss"]
mask_loss = output_dict["mask_loss"]
losses.update(loss.item(), input_dict["images"].size(0))
ce_losses.update(ce_loss.item(), input_dict["images"].size(0))
mask_bce_losses.update(mask_bce_loss.item(), input_dict["images"].size(0))
mask_dice_losses.update(mask_dice_loss.item(), input_dict["images"].size(0))
mask_losses.update(mask_loss.item(), input_dict["images"].size(0))
# 反向传播(仅累积梯度)
model.backward(loss)
# 执行参数更新(梯度累积完成)
model.step()
scheduler.step() # 更新学习率
# measure elapsed time
batch_time.update(time.time() - end)
end = time.time()
if global_step % args.print_freq == 0:
if args.distributed:
batch_time.all_reduce()
data_time.all_reduce()
losses.all_reduce()
ce_losses.all_reduce()
mask_bce_losses.all_reduce()
mask_dice_losses.all_reduce()
mask_losses.all_reduce()
if args.local_rank == 0:
progress.display(global_step + 1)
writer.add_scalar("train/loss", losses.avg, global_step)
writer.add_scalar("train/ce_loss", ce_losses.avg, global_step)
writer.add_scalar(
"train/mask_bce_loss", mask_bce_losses.avg, global_step
)
writer.add_scalar(
"train/mask_dice_loss", mask_dice_losses.avg, global_step
)
writer.add_scalar("train/mask_loss", mask_losses.avg, global_step)
writer.add_scalar(
"metrics/total_secs_per_batch", batch_time.avg, global_step
)
writer.add_scalar(
"metrics/data_secs_per_batch", data_time.avg, global_step
)
batch_time.reset()
data_time.reset()
losses.reset()
ce_losses.reset()
mask_bce_losses.reset()
mask_dice_losses.reset()
mask_losses.reset()
if global_step != 0:
curr_lr = scheduler.get_last_lr()
if args.local_rank == 0:
writer.add_scalar("train/lr", curr_lr[0], global_step)
return train_iter
这个我试了,居然还是不行,真不明白这个怎么回事
我猜测这个可能与缓存有关系,我又重新将GitHub上源码解压下来,一切又恢复正常了
可能后面又会继续出问题,因为那天我也尝试了清除了cache和重新gitclone,但是没效果。今天我拿了9张4090做了很多组测试,多次尝试下来归结为可能是收敛过慢和这个大杂烩数据集本身的问题,1.我们的batchsize和累计步数由于设备现在都较小,2.同一个环境和节点上:当我尝试用本身数据集,初始化的权重去复现,经常出现0.0200和0.000,但是在我resume一个较差的数据集上的权重作为基础,之后再用一个好的数据集去微调,giou和ciou性能能够大幅度上升,两个数据集都是同一类,表明目前并非是环境或者是项目文件等等问题,我的建议是每次训练前,尽量拿一个先前训练过的正常的权重作为预训练权重(可以是同类数据集或者不同的,但是是能够正常出现性能指标的),这样就能尽量避免出现一直是这个0.0200和0.000这个的问题。当然它的train最好也是进行修改,因为我认为它的构造方式会有梯度累计混乱的bug。
你知道该怎么去制作这种coco或者作者的reason_seg数据集吗
你可以去查看utils里的代码,作者所谓的[SEG]都是人为后期模板代码对其数据集进行加入的,你如果也想尝试微调,可以更改dataset.py和创建一个自己的数据集.py,仿照他的处理方式,又或者你可以将你的数据集转换为其中某个数据集相同的格式。然后将名字替换掉,采样率设置下就行。