(此答案侧重于类 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
种子。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})