Проблема с запуском нескольких моделей в PyTorch Lightning - PullRequest
0 голосов
/ 03 августа 2020

Я разрабатываю систему, которая должна обучать десятки отдельных моделей (> 50) с помощью Lightning, каждая со своими собственными графиками и журналами TensorBoard. Моя текущая реализация имеет один объект Trainer для каждой модели, и кажется, что я сталкиваюсь с этой ошибкой, когда я go более ~ 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, я не уверен, есть ли у меня один тренер / модель. лучший подход. Однако мне требуются отдельные графики для каждой модели, и кажется, что если я использую один тренажер для нескольких моделей, результаты будут отменены.

Для справки, я определяю разные списки тренеров как таковые:

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)

Спасибо!

1 Ответ

2 голосов
/ 03 августа 2020

Насколько мне известно, ожидается только одна модель на Trainer. Вы можете явно передать объект 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 s, но вы можете попробовать , чтобы удалить эту строку:

RANDOM_PORTS = RANDOM_PORTS[:-1]
...