python-3.x - 如何使 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
可重现?
解决方案
(此答案侧重于类 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})
推荐阅读
- javascript - 当系统时间错误时,如何在javascript中获得正确的时间?
- pointers - 在不使用 reflrect 的情况下打印类型并创建新对象
- c# - Xamarin.Android:无法从“System.Collections.Generic.List”转换
" 到 "[namespace_name].Item[]" - android - 我如何使用 API28 访问片段中的当前用户位置?
- git - Git/SourceTree - 推送合并的回滚或撤消
- azure - 我们可以在 Azure 中的哪里存储公钥/私钥对?
- angular - 将回调函数传递给 chid 会给出“ERROR TypeError:
不是函数” - html - 使用引导程序 4 缩小两个 div 之间的差距
- json - 动态构建 JSON-LD Schema
- javascript - reactJs import ckeditor config correctly - CORS