PyTorch Lightning 中 运行 多个模型的问题
Issue with running multiple models in PyTorch Lightning
我正在开发一个系统,该系统需要使用 Lightning 训练数十个单独的模型 (>50),每个模型都有自己的 TensorBoard 图和日志。我当前的实现每个模型都有一个 Trainer 对象,当我超过 ~90 个 Trainer 对象时,我似乎 运行 陷入了这个错误。有趣的是,错误仅在我 运行 .test() 方法时出现,而不是在 .fit():
期间出现
Traceback (most recent call last):
File "lightning/main_2.py", line 193, in <module>
main()
File "lightning/main_2.py", line 174, in main
new_trainer.test(model=new_model, test_dataloaders=te_loader)
File "\Anaconda3\envs\pyenv\lib\site-packages\pytorch_lightning\trainer\trainer.py", line 1279, in test
results = self.__test_given_model(model, test_dataloaders)
File "\Anaconda3\envs\pyenv\lib\site-packages\pytorch_lightning\trainer\trainer.py", line 1343, in __test_given_model
self.set_random_port(force=True)
File "\Anaconda3\envs\pyenv\lib\site-packages\pytorch_lightning\trainer\distrib_data_parallel.py", line 398, in set_random_port
default_port = RANDOM_PORTS[-1]
IndexError: index -1 is out of bounds for axis 0 with size 0
因为我刚开始使用 Lightning,所以我不确定 Trainer/model 是否是最好的方法。但是,我需要每个模型的单独图,而且如果我对多个模型使用单个训练器,结果似乎会被覆盖。
作为参考,我定义了不同的培训师列表:
for i in range(args["num_users"]):
trainer_list_0.append(Trainer(max_epochs=args["epochs"], gpus=1, default_root_dir=args["save_path"],
fast_dev_run=args["fast_dev_run"], weights_summary=None))
trainer_list_1.append(Trainer(max_epochs=args["epochs"], gpus=1, default_root_dir=args["save_path"],
fast_dev_run=args["fast_dev_run"], weights_summary=None))
trainer_list_2.append(Trainer(max_epochs=args["epochs"], gpus=1, default_root_dir=args["save_path"],
fast_dev_run=args["fast_dev_run"], weights_summary=None))
关于培训:
for i in range(args["num_users"]):
trainer_list_0[i].fit(model_list_0[i], train_dataloader=dataloader_list[i],
val_dataloaders=val_loader)
trainer_list_1[i].fit(model_list_1[i], train_dataloader=dataloader_list[i],
val_dataloaders=val_loader)
trainer_list_2[i].fit(model_list_2[i], train_dataloader=dataloader_list[i],
val_dataloaders=val_loader)
和测试:
for i in range(args["num_users"]):
trainer_list_0[i].test(test_dataloaders=te_loader)
trainer_list_1[i].test(test_dataloaders=te_loader)
trainer_list_2[i].test(test_dataloaders=te_loader)
谢谢!
据我所知,每个 Trainer
预计只有一个模型。您可以使用 pre-defined 实验名称和版本将 TensorBoardLogger
对象显式传递给 Trainer
,以便将绘图分开(参见 docs)。
from pytorch_lightning import Trainer
from pytorch_lightning.loggers import TensorBoardLogger
logger = TensorBoardLogger("tb_logs", name="my_model", version="version_XX")
trainer = Trainer(logger=logger)
您遇到的问题不知何故与ddp模块有关。它的源代码包含以下几行 [1], [2]:
RANDOM_PORTS = RNG1.randint(10000, 19999, 1000)
def set_random_port(self, force=False):
...
default_port = RANDOM_PORTS[-1]
RANDOM_PORTS = RANDOM_PORTS[:-1]
if not force:
default_port = os.environ.get('MASTER_PORT', default_port)
我不确定为什么您会遇到 90+ Trainer
的问题,但您可以尝试 删除此行:
RANDOM_PORTS = RANDOM_PORTS[:-1]
我正在开发一个系统,该系统需要使用 Lightning 训练数十个单独的模型 (>50),每个模型都有自己的 TensorBoard 图和日志。我当前的实现每个模型都有一个 Trainer 对象,当我超过 ~90 个 Trainer 对象时,我似乎 运行 陷入了这个错误。有趣的是,错误仅在我 运行 .test() 方法时出现,而不是在 .fit():
期间出现Traceback (most recent call last):
File "lightning/main_2.py", line 193, in <module>
main()
File "lightning/main_2.py", line 174, in main
new_trainer.test(model=new_model, test_dataloaders=te_loader)
File "\Anaconda3\envs\pyenv\lib\site-packages\pytorch_lightning\trainer\trainer.py", line 1279, in test
results = self.__test_given_model(model, test_dataloaders)
File "\Anaconda3\envs\pyenv\lib\site-packages\pytorch_lightning\trainer\trainer.py", line 1343, in __test_given_model
self.set_random_port(force=True)
File "\Anaconda3\envs\pyenv\lib\site-packages\pytorch_lightning\trainer\distrib_data_parallel.py", line 398, in set_random_port
default_port = RANDOM_PORTS[-1]
IndexError: index -1 is out of bounds for axis 0 with size 0
因为我刚开始使用 Lightning,所以我不确定 Trainer/model 是否是最好的方法。但是,我需要每个模型的单独图,而且如果我对多个模型使用单个训练器,结果似乎会被覆盖。
作为参考,我定义了不同的培训师列表:
for i in range(args["num_users"]):
trainer_list_0.append(Trainer(max_epochs=args["epochs"], gpus=1, default_root_dir=args["save_path"],
fast_dev_run=args["fast_dev_run"], weights_summary=None))
trainer_list_1.append(Trainer(max_epochs=args["epochs"], gpus=1, default_root_dir=args["save_path"],
fast_dev_run=args["fast_dev_run"], weights_summary=None))
trainer_list_2.append(Trainer(max_epochs=args["epochs"], gpus=1, default_root_dir=args["save_path"],
fast_dev_run=args["fast_dev_run"], weights_summary=None))
关于培训:
for i in range(args["num_users"]):
trainer_list_0[i].fit(model_list_0[i], train_dataloader=dataloader_list[i],
val_dataloaders=val_loader)
trainer_list_1[i].fit(model_list_1[i], train_dataloader=dataloader_list[i],
val_dataloaders=val_loader)
trainer_list_2[i].fit(model_list_2[i], train_dataloader=dataloader_list[i],
val_dataloaders=val_loader)
和测试:
for i in range(args["num_users"]):
trainer_list_0[i].test(test_dataloaders=te_loader)
trainer_list_1[i].test(test_dataloaders=te_loader)
trainer_list_2[i].test(test_dataloaders=te_loader)
谢谢!
据我所知,每个 Trainer
预计只有一个模型。您可以使用 pre-defined 实验名称和版本将 TensorBoardLogger
对象显式传递给 Trainer
,以便将绘图分开(参见 docs)。
from pytorch_lightning import Trainer
from pytorch_lightning.loggers import TensorBoardLogger
logger = TensorBoardLogger("tb_logs", name="my_model", version="version_XX")
trainer = Trainer(logger=logger)
您遇到的问题不知何故与ddp模块有关。它的源代码包含以下几行 [1], [2]:
RANDOM_PORTS = RNG1.randint(10000, 19999, 1000)
def set_random_port(self, force=False):
...
default_port = RANDOM_PORTS[-1]
RANDOM_PORTS = RANDOM_PORTS[:-1]
if not force:
default_port = os.environ.get('MASTER_PORT', default_port)
我不确定为什么您会遇到 90+ Trainer
的问题,但您可以尝试 删除此行:
RANDOM_PORTS = RANDOM_PORTS[:-1]