关于扩散模型(Diffusion Models)中的P2-weighting使用防坑

前几天用了一个扩散模型,P2,主要还是老板想放弃stylegan和styleclip那一套,想用扩散模型来生成图片。查找新论文,找到了这个,并且还开源了。

这个项目测试训练问题都不大,直到我需要多卡训练的时候,发现了大问题。这个项目默认是单卡的,但是需要多卡的时候,发现其内有ddp相关设置,但是直接用torch的那一套,设置nproc_per_node什么的,这样是不可以的。参考readme说的,他严重依赖于guided-diffusion这个项目,跳转过去之后,他使用mpi来进行分布式的,所以只需要在训练命令前加上mpiexec -n N,N 为显卡数就可以了,如下

mpiexec -n 4 python XXX.py --XXX XXX

当然实际上是,我发现他用了mpi4py这个库,并且设置dist的函数,都不用传参数过去的,就觉得应该不是我熟知的方法,所以百度了mpi4py,结果果然是我孤陋寡闻了。

但是这样还没完,这么做了后,多卡多进程都OK,但是执行会报错,类似这种错“unhandled cuda error, NCCL version 2.7.8”,根据网上查的方法,最终解决是,在设置dist的地方,其设置某块的代码是使用os的CUDA_VISIBLE_DEVICES这样设置的,改为torch.cuda.set_device(device)这样就可以了,如下

# os.environ["CUDA_VISIBLE_DEVICES"] = f"{MPI.COMM_WORLD.Get_rank() % GPUS_PER_NODE}"
torch.cuda.set_device(MPI.COMM_WORLD.Get_rank())

2.这个项目的issue提出有个问题,在测试生成图片的时候,分批生成,每批会把上一批的覆盖掉,作者已经解答了。

3.训练或者测试的时候会提示一个库不存在无法调用什么的,但是一看,明明就在本地,难道还要pip安装不成。我的解决方法是,在代码中,调用前,先执行sys.path.append('.')就可以了。

4.不能resume权重,通过查看issue,guided的这个项目中,有人说了,在加载权重的代码里面,有个判断local_rank是否为0的操作,将这个注释就可以了,原理不清楚,反正可以加载了,执行中,可能还会有类似问题,可以在报错的附近位置,执行类似操作就可以了。

如果后面还有什么坑,再补充完善。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值