Как мне сделать 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})
Другие вопросы по тегам