Как мне сделать 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 результаты по-прежнему разные, вероятно, причина в том, что у каждого лучевого актора по-прежнему разные начальные значения.

Вопрос: как сделать ray.tune.run воспроизводимым?


person ptyshevs    schedule 20.08.2020    source источник


Ответы (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

Это распределяется между рабочими процессами, что требует заполнения в _3 _ класс. В зависимости от логики 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})
person ptyshevs    schedule 20.08.2020
comment
Я использую функциональный API и все еще не могу воспроизвести результаты. Перед вызовом tune.run (...) я использую random.seed (...) np.random.seed (...). - person Roxana; 07.01.2021
comment
@Roxana вам нужно сделать random.seed(...) внутри функции, сделать это до tune.run будет недостаточно. Функция распределяется между рабочими, поэтому поместите логику инициализации внутрь. - person ptyshevs; 07.01.2021
comment
HI @ptyshevs, у меня проблема не во время обучения (при тех же конфигах я получаю те же результаты), а в самих конфигах. Если я запустил свой код несколько раз, полученные конфигурации будут другими. Я могу поделиться кодом, который вы можете использовать для проверки того, что я говорю ... - person Roxana; 07.01.2021
comment
Привет, @ptyshevs, если вы хотите взглянуть, я спросил: stackoverflow.com/questions/65617962/. - person Roxana; 07.01.2021