基于Python的分布式高可用扩展引擎Ray 0.3.0发布

Ray: 0.3发布

我们很高兴宣布发布Ray的0.3版本,本次发布主要包括distributed actor handles 和Ray.tune——一个新的超参搜索库,还包括修复一系列bug和提高稳定性。
为了更新到最新版本,运行:

pip install -U ray

超参搜索工具

本版本增加了Ray.tune,这是一个分布式超参数评估工具,用于强化学习和深度学习等训练时间较长的任务,他目前包括以下功能:

  • 可插入的早期停止算法,包括中值停止规则和超频带
  • 可视化工具融合,比如TensorBoard、rllab’s VisKit, parallel coordinates visualization
  • 灵活的参数自动搜索,包括网格搜索、随机搜索、条件参数分布
  • 资源感知调度,包括支持并行运行需要的GPU算法,或者他们本身是并行和分布的。

Ray.tune 提供用于深度学习和其他计算密集型任务的python api,下面是例子:

from ray.tune import register_trainable, grid_search, run_experiments

def my_func(config, reporter):
    import time, numpy as np
    i = 0
    while True:
        reporter(timesteps_total=i, mean_accuracy=i ** config['alpha'])

        i += config['beta']
        time.sleep(0.01)

register_trainable('my_func', my_func)

run_experiments({
    'my_experiment': {
        'run': 'my_func',
        'resources': {'cpu': 1, 'gpu': 0},
        'stop': {'mean_accuracy': 100},
        'config': {
            'alpha': grid_search([0.2, 0.4, 0.6]),
            'beta': grid_search([1, 2]),
        },
    }
})

可以使用TensorBoard和rllab的VisKit等工具实时显示正在运行的结果
(或者可以直接从驱动程序节点读取JSON格式的日志):

查看文档和代码。

Ray.tune与RLib集成

下面的例子可以用Ray.tune来试验RLlib

cd ray/python/ray/rllib
python train.py -f tuned_examples/cartpole-grid-search-example.yaml

该tuned_examples目录还包含用于诸如Pong和Humanoid之类的常见基准测试任务的预先调整的超参数配置。查看 RLlib文档。

Rllib开始支持PyTorch

优秀的强化学习库应该与多个深度学习框架一起工作。作为迈向这一目标的一步,0.3增加了对RLlib中A3C的PyTorch模型的支持。你可以用下面的A3C配置来试试这个。

cd ray/python/ray/rllib
./train.py --run=A3C \
          --env=PongDeterministic-v4 \
          --config='{"use_pytorch": true, "num_workers": 8, "use_lstm": false, "model": {"grayscale": true, "zero_mean": false, "dim": 80, "channel_major": true}}'

分布式Actor Handles

Ray 0.3添加了对分布式actor操作符的支持,也就是说,可以让多个调用者在同一个actor上调用方法。Actor的创造者可以将actore手柄作为参数传递给其他任务或其他actor方法。下面是一个例子,其中驱动程序创建一个actor来记录消息,并将actor handle传递给其他任务:

import ray

ray.init()

@ray.remote
class Logger(object):
    def __init__(self):
        self.logs = []
    def log(self, log_msg):
        self.logs.append(log_msg)
    def read_logs(self):
        return self.logs

@ray.remote
def task(logger, task_index):
    # Do some work.
    logged = logger.log.remote('Task {} is done'.format(task_index))

# Create an actor and get a handle to it.
logger = Logger.remote()
# Pass the actor handle to some tasks.
tasks = [task.remote(logger, i) for i in range(10)]
# Wait for the tasks to finish.
ray.get(tasks)
# Get the logs from the tasks.
print(ray.get(logger.read_logs.remote()))

这个特性仍然被认为是实验性的,但是我们已经发现了分布式的actor 参数对于实现参数服务器和 流式MapReduce应用程序很有用。

你可能感兴趣的:(python,Ray)