LISA icon indicating copy to clipboard operation
LISA copied to clipboard

I encountered issues while reproducing the training process.

Open xuewenMei opened this issue 8 months ago • 64 comments

Image

Image

Hi,

  1. 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?

  2. 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.

  3. Do I still need to merge the LoRA weights? Because during merging, it always says the config.json file is missing.

xuewenMei avatar Apr 18 '25 02:04 xuewenMei

你这个也是训练一直是giou0.02,ciou为0吗

ymkasad avatar May 13 '25 03:05 ymkasad

你这个也是训练一直是giou0.02,ciou为0吗

我已经解决这个问题了,需要确保torch的版本要对是老的那个版本,你如果先安装了torch老版本再按照作者的依赖取pip安装各种包,其中有一个包(哪个我忘了)会将老的torch替换,这会导致能够正常训练跑通但是训练的结果很奇怪,解决方法是强制那个包不安装其所需依赖。确保torch为老的版本。

而检查点分片文件代码则需要进行重构,目前我猜测应该还是版本问题,会导致切片为多个bin文件而导致没法合并

xuewenMei avatar May 13 '25 03:05 xuewenMei

您目前能达到多少的精度呢iou,您能为我提供您所使用的pytorch版本吗

ymkasad avatar May 13 '25 04:05 ymkasad

用的依赖中提到的老版本pytorch=1.13.1,应该在pip install peft==0.4.0的时候,会使得环境又安装其他版本的torch,我使用默认的9,3,3,1的数据集采样,项目的推理数据集验证,得到

Image

我猜测后面再将采样设置为0,0,0,1,在这个推理数据集上能有进一步提高或者复现项目论文的准确率。

我使用的llava-llama-2-13b-chat-lightning-preview

xuewenMei avatar May 13 '25 04:05 xuewenMei

好的好的,谢谢

ymkasad avatar May 13 '25 04:05 ymkasad

你好,你有使用自己训练的checkpoints合并然后去推理chat吗,我这边尝试合并推理并没有成功

ymkasad avatar May 14 '25 07:05 ymkasad

你好,你有使用自己训练的checkpoints合并然后去推理chat吗,我这边尝试合并推理并没有成功

有的,且推理正常

xuewenMei avatar May 14 '25 08:05 xuewenMei

请问你有在7b上训练成功过吗,我训练一直iou低于0.1

ymkasad avatar May 15 '25 06:05 ymkasad

稍等,我可以为你尝试一下,因为我正好在做开发测试

xuewenMei avatar May 15 '25 06:05 xuewenMei

好的,非常感谢

ymkasad avatar May 15 '25 06:05 ymkasad

我在h100上配置了环境,但是发现训练不对,我在3090上尝试了llava-v1.5但是无法进行推理,使用了合并了delta的v1版本,iou一直处在0.1以下

ymkasad avatar May 15 '25 06:05 ymkasad

llava-v1.5是怎么设置修改的呢?我也进行了测试,无法训练,iou一直是0.02和0 我看到他用的版本是LLaVA-7B-Lightening-v1-1,目前正在调用这个版本测试 我现在正在重构llava部分,尝试去用llava1.5复现最优结果。

xuewenMei avatar May 15 '25 07:05 xuewenMei

你试了7b也不行吗,我直接使用version=’liuhaotian/llava-v1.5-7b‘训练了,但是chat会报错AttributeError: 'NoneType' object has no attribute 'shape'

ymkasad avatar May 15 '25 07:05 ymkasad

不行,我在确定是不是我环境损坏了 我直接换liuhaotian/llava-v1.5-7b训练不起来,离谱

xuewenMei avatar May 15 '25 07:05 xuewenMei

....我昨天用1.5能有结果,今天,不管用哪个训练,iou都是0了,不知道什么情况

ymkasad avatar May 15 '25 08:05 ymkasad

都能行,能训练,我只有两张a6000,比较慢,环境坏了一个,破玩意,这个项目限制很多,torch就框死死的老版本,不然不至于重弄

xuewenMei avatar May 15 '25 09:05 xuewenMei

你把7b的训练结果正常了是吧,那我这边再试试

ymkasad avatar May 15 '25 09:05 ymkasad

今早起来发现也是都不过0.1的iou了,无论是13b还是7b,你有解决吗?

xuewenMei avatar May 16 '25 00:05 xuewenMei

我已经训练好了7b,已经解决了

ymkasad avatar May 16 '25 01:05 ymkasad

训练了6轮,giou: 0.4167, ciou: 0.3924。我刚看到论文里面有llava1.5版本的,但是它的代码目前好像运行1.5chat会出错。

ymkasad avatar May 16 '25 01:05 ymkasad

今早起来发现也是都不过0.1的iou了,无论是13b还是7b,你有解决吗?

他这个太不稳定了,如果还是无法解决的话我猜测是环境问题

ymkasad avatar May 16 '25 01:05 ymkasad

我认为是数据集或者batchsize设置问题,导致有时候性能可以上去有时候不能,目前为止我没看到任何一个人有复刻出结果,有个segllm项目可能有成功

我试了llava1.5-7b,还是不可以复现,甚至不能训练

xuewenMei avatar May 16 '25 06:05 xuewenMei

论文的结果是真的不敢想了,估计也没几个开源的能达到

ymkasad avatar May 16 '25 08:05 ymkasad

我又跑了同样的设置,一直卡在0.04了。你有什么有效的解决方法吗

ymkasad avatar May 17 '25 09:05 ymkasad

使用这段我重构的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

xuewenMei avatar May 17 '25 09:05 xuewenMei

这个我试了,居然还是不行,真不明白这个怎么回事

ymkasad avatar May 17 '25 12:05 ymkasad

我猜测这个可能与缓存有关系,我又重新将GitHub上源码解压下来,一切又恢复正常了

ymkasad avatar May 17 '25 14:05 ymkasad

可能后面又会继续出问题,因为那天我也尝试了清除了cache和重新gitclone,但是没效果。今天我拿了9张4090做了很多组测试,多次尝试下来归结为可能是收敛过慢和这个大杂烩数据集本身的问题,1.我们的batchsize和累计步数由于设备现在都较小,2.同一个环境和节点上:当我尝试用本身数据集,初始化的权重去复现,经常出现0.0200和0.000,但是在我resume一个较差的数据集上的权重作为基础,之后再用一个好的数据集去微调,giou和ciou性能能够大幅度上升,两个数据集都是同一类,表明目前并非是环境或者是项目文件等等问题,我的建议是每次训练前,尽量拿一个先前训练过的正常的权重作为预训练权重(可以是同类数据集或者不同的,但是是能够正常出现性能指标的),这样就能尽量避免出现一直是这个0.0200和0.000这个的问题。当然它的train最好也是进行修改,因为我认为它的构造方式会有梯度累计混乱的bug。

xuewenMei avatar May 17 '25 15:05 xuewenMei

你知道该怎么去制作这种coco或者作者的reason_seg数据集吗

ymkasad avatar May 19 '25 07:05 ymkasad

你可以去查看utils里的代码,作者所谓的[SEG]都是人为后期模板代码对其数据集进行加入的,你如果也想尝试微调,可以更改dataset.py和创建一个自己的数据集.py,仿照他的处理方式,又或者你可以将你的数据集转换为其中某个数据集相同的格式。然后将名字替换掉,采样率设置下就行。

xuewenMei avatar May 19 '25 07:05 xuewenMei