Как мне сделать ray.tune.run воспроизводимым?
Я использую обучаемый API на основе классов Tune. См. Пример кода:
from ray import tune
import numpy as np
np.random.seed(42)
# first run
tune.run(tune.Trainable, ...)
# second run, expecting same result
np.random.seed(42)
tune.run(tune.Trainable, ...)
Проблема в том, что tune.run
результаты по-прежнему разные, вероятно, причина в том, что у каждого лучевого актора по-прежнему разные seed.
Вопрос: как мне сделатьray.tune.run
воспроизводимый?
1 ответ
(В этом ответе основное внимание уделяется API класса и версии ray 0.8.7, хотя логика случайного заполнения в основном такая же для функционального API)
Есть два основных источника недетерминированных результатов.
1. Алгоритм поиска
Каждый алгоритм поиска поддерживает случайное начальное число, хотя его интерфейс может отличаться. Это инициализирует выборку пространства гиперпараметров.
Например, если вы используете AxSearch
, это выглядит так:
from ax.service.ax_client import AxClient
from ray.tune.suggest.ax import AxSearch
client = AxClient(..., random_seed=42)
client.create_experiment(...)
algo = AxSearch(client)
2. Обучаемый API
Это распределяется между рабочими процессами, что требует заполнения внутри tune.Trainable
учебный класс. В зависимости отtune.Trainable.train
логику, которую вы реализуете, вам нужно вручную засеять numpy
, tf
или любой другой фреймворк, который вы используете, внутри tune.Trainable.setup
передавая семя с config
аргумент tune.run
.
Следующий код основан на RLLib PR5197, который обрабатывал ту же проблему:
См. Пример:
from ray import tune
import numpy as np
import random
class Tuner(tune.Trainable):
def setup(self, config):
seed = config['seed']
np.random.seed(seed)
random.seed(seed)
...
...
seed = 42
tune.run(Tuner, config={'seed': seed})