首页 > 解决方案 > 如何使 ray.tune.run 可重现?

问题描述

我正在使用 Tune基于类的 Trainable API。请参阅代码示例:

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可重现?

标签: python-3.xrayray-tune

解决方案


(此答案侧重于类 API 和 ray 版本 0.8.7。由于实现细节,Function 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种子。configtune.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})

推荐阅读