Ray实例-乒乓球训练学习

在本例中(代码在文末),我们将使用OpenAI Gym训练一个非常简单的神经网络来打乒乓球。这个应用程序改编自Andrej Karpathy的代码,只做了很少的修改(请参阅附带的博客文章)。

首先安装依赖包gym

pip install gym[atari]

运行代码:

python ray/examples/rl_pong/driver.py --batch-size=10

如果运行在集群上,在后边加上--redis-address=<redis-address> 标志,其中redis-address为集群IP地址,如下:

python ray/examples/rl_pong/driver.py --batch-size=10  --redis-address=<redis-address>

目前,在拥有64个物理内核的大型计算机上,使用批处理大小为1的更新计算大约需要1秒,而使用批处理大小为10的更新计算大约需要2.5秒。批处理大小为60的代码大约需要3秒。在一个有11个节点(每个节点都有18个物理内核)的集群中,批量为300个节点大约需要10秒。如果您看到的数字与这些数字相差很大,请查看本文底部的故障排除部分,并考虑提交一个问题
注意 ,这些时间取决于推出所需的时间,而这又取决于政策的执行情况。例如,一个非常糟糕的政策很快就会失败。随着政策的发展,我们应该预计这些数字还会增加。

分布式框架

在Andrej代码的核心,神经网络被用来定义打乒乓球的“策略”(也就是说,一个函数选择给的定状态的动作)。在循环中,网络反复播放乒乓球游戏,并记录每个游戏的梯度。每十场比赛,梯度组合在一起,用来更新网络。

这个例子很容易并行化,因为网络可以并行运行10个游戏,而且游戏之间不需要共享任何信息。

为Pong环境定义了一个actor,其中包括一个执行滚动和计算渐变更新的方法。下面是参与者的伪代码。

@ray.remote
class PongEnv(object):
    def __init__(self):
        # 告诉numpy只使用一个核心。 如果我们不这样做,每个参与者可能
        # 会尝试使用所有核心,由此产生的争用可能导致串行版本没有加速。
        #  请注意,如果numpy正在使用OpenBLAS,那么您需要设置
        # OPENBLAS_NUM_THREADS = 1,并且您可能需要从命令行执行此操作
        #(因此它在导入numpy之前发生)。
        os.environ["MKL_NUM_THREADS"] = "1"
        self.env = gym.make("Pong-v0")

    def compute_gradient(self, model):
        # Reset the game.
        observation = self.env.reset()
        while not done:
            # Choose an action using policy_forward.
            # Take the action and observe the new state of the world.
        # Compute a gradient using policy_backward. Return the gradient and reward.
        return [gradient, reward_sum]
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值