网络上关于Stable Video Diffusion代码运行的相关资料比较少,记录一下自己在运行stable video diffusion中遇到的问题,希望对大家有帮助。
GitHub项目地址:Stability-AI/generative-models: Generative Models by Stability AI (github.com)
代码运行环境:
在Linux系统下按照Installation下的指令安装即可
模型训练中可能遇到的问题
训练命令示例:
python main.py --base configs/example_training/toy/mnist_cond.yaml
其中 --base 是虚拟环境名称,需要替换为自己在Installation时创建的虚拟环境名
运行python main.py --base configs/example_training/toy/mnist.yaml
出现上述报错,分析原因:是trainer_config字典中没有“device”键,以此为突破口查询main.py文件中666行之前和config相关的值,发现都是空值。这时思考,所需要的train_config以及之前代码中的config文件所需要的数据类型为字典,那么尝试直接读取yaml文件,将其转化为字典并赋给config
解决方案:
将630行左右的try部分红框部分注释,替换为638-641行
ps:这个问题大家要结合自己实际,如果没有报错就不要改。我早上这段代码报了上面的错误做了如上修改。晚上再跑,源代码是正确的,修改完是错误的,很奇怪。
在模型训练完成后,会出现如下报错:
raise MisconfigurationException(f"No `{step_name}()` method defined to run `Trainer.{trainer_method}`.")
这个问题,经过查询暂时还没有好的解决方案,目前的解决方案是在main文件中把trainer.test代码注释掉(待补充)
修改为:
运行python main.py --base configs/example_training/toy/mnist_cond.yaml可能出现的问题
在解决完上面minst.yaml的基础上继续解决运行minst_cond.yaml可能出现的问题
在不做任何修改的情况下会出现:
AttributeError: 'IdentityFirstStage' object has no attribute 'decoder'. Did you mean: 'decode'?
这个问题的意思是IdentityFirstStage中没有decoder方法
查看IdentityFirstStage中的代码(IdentityFirstStage的位置是sgm/models/autoencoder.py,用pycharm可以方便定位到)
发现并没有decoder方法,将def decode修改为def decoder
修改完成后继续运行:
报错requests.exceptions.ConnectTimeout: HTTPConnectionPool(host='169.254.169.254', port=80): Max retries exceeded with url: /latest/meta-data/instance-id (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7fdd0d491360>, 'Connection to 169.254.169.254 timed out. (connect timeout=None)'))
定位到报错行:
读一下报错的大致意思是网络问题,下面我做了这样一件事情:查找resp在文件中有多少地方涉及到,发现在main文件中只有924-928行涉及到了resp,接着进一步阅读924-928行代码,明白大致是做什么的(自己阅读、用搜索引擎或者大模型都可以):
在理解代码作用之后,我们可以做出如下判断:这段代码和主要功能无关,那么可以果断注释掉:
解决完成后继续运行,报错:
File "/vhome/shipu/generative-models-main/sgm/models/autoencoder.py", line 90, in decode
raise NotImplementedError("decode()-method of abstract base class called")
NotImplementedError: decode()-method of abstract base class called
看一下报错信息,问题还是聚焦在IdentityFirstStage中,这个问题是说我们没有实现decode方法,那也就是说我们之前将decode方法修改为decoder方法不太妥当,那么怎么处理呢,这里我也不知道处理的方式对不对,仅供参考:
观察IdentityFirstStage类中各方法的实现方式
可以发现各方法的实现大致相同,既然缺少decode方法,那我们就补充decode方法:
其实这里我感觉更有可能的情况是作者在调用decode方法时写成了decoder,导致一开始我们把decode方法名修改为decoder
修改完成后继续运行:
运行成功!