强化学习算法如何将GPU利用率提高到100%——在线强化学习如何将GPU利用率提升至100%

Angry Panda / 2023-08-19 / 原文

一直有个疑问,那就是“强化学习算法如何将GPU利用率提高到100%”,在一些论坛中也有人会提出这样的问题,但是一直也没有人比较正面的回答过这个问题,为此正好自己又想到了这么一个问题,于是想在这里正面的谈论下这个问题。

 

特别说明下,本文主要讨论的是在线强化学习算法(其实离线强化学习算法的这个问题可以参考下面的相关回答)

 

首先说下,强化学习算法由于计算过程包括多个部分,因此要想使强化学习算法的GPU利用率为100%就必然要使用并行化算法,串行方式下的强化学习算法是无法保证GPU利用率为100%的。

 

在线强化学习算法的并行化可以分为同步并行和异步并行,在同步并行化的情况下GPU的利用率也难以达到100%,因为GPU的利用率并不意味着GPU的核心的利用率,而是代表GPU的使用时长,而GPU在没有开启单独用户独享的模式下每个进程在调用GPU的时候都是独占使用的,因此同步并行化情况下GPU的利用率可以写为b/(a+b),其中b为每step计算过程中GPU的使用时长,a为每step计算过程中CPU的使用时长,因此如果b/(a+b)近似的等于100%,那么必然存在两种可能,第一种就是a足够小,另一种就是b足够大;之所以前面说到强化学习算法如果要想GPU的利用率为100%就必须使用并行化,其原因就是只有并行化才会减少a的时长,而b的时长却是无法无限制的增大的,因为强化学习所使用的网络往往比较简单,因此一次正反传的时间往往很短,唯一可以增加b的时长的方法就是增大batch_size,而由于GPU的计算特性所限制,在GPU的计算能力下batch_size为1和某个较大数值(如:32或64)下的单次计算时长相同,而大于这个数值的batch_size则会显著的增加GPU的计算时长(这里可以看做是使数值b增加),但是该种情况下并不会对计算性能有显著提升,比如batch_size为64时GPU的正反传是0.01秒,但是batch_size为128时则为0.02秒,该种方式支行减低整体计算的效率与提高GPU利用率的初衷相反(该种方式虽然会提高GPU利用率但是会使整体算法的计算效率下降),因此我们知道同步并行强化学习算法可以去提高GPU的利用率但是却无法到达100%;单step的CPU计算时长a是无法降低到足够小,而GPU的计算时长b也是无法增加到足够大,因此b/(a+b)是无法近似等于100%的。

 

有了上面的分析我们也就知道了这么一个结论,那就是只有异步的并行强化学习算法才可以保证GPU的利用率达到100%,当然这里讨论的都是在线强化学习算法,正是因为在线强化学习必须要在每step的计算中都要生成数据才导致出这个GPU利用率低的问题;虽然异步强化学习算法可以保证GPU的利用率为100%,但是其实这里有两种情况,分别为同策略的异步强化学习算法和异策略的异步强化学习算法。异策略的强化学习算法,如DQN算法的异步形式是可以保证GPU的利用率为100%的,同时该种异步方式是不会对算法性能起到不良影响的;但是同策略的强化学习算法就存在影响算法性能的问题,因为异步计算的方式难以保证同策略中的同策略要求,这样必然导致由于数据的生成策略和训练策略存在一定的分布偏差从而影响算法的整体性能,该种情况完全可以在GPU利用率为100%的情况下使算法的整体性能下降,这也是为什么A3C算法没有A2C算法好的一个主要原因。

 

可以说在不影响算法整体性能的情况下,通过并行方式加速计算且保证GPU利用率为100%的算法只有异步并行的异策略强化学习算法,如异步并行化的DQN,给出示意图:

 

 

 

上面讨论的都是在线学习强化学习算法,可以说由于强化学习算法的特殊性所以难以是GPU利用率达到100%,而将GPU利用率提高也难免会影响算法的整体性能,可以说往往没有使GPU利用率达到100%的强化学习算法才是计算效率最高的,如果一味的去求GPU的高利用率甚至会使强化学习算法更加难以收敛,如同策略算法。而同步并行的方式使GPU利用率到达100%,即使不影响算法收敛也会较大程度增加算法的复杂度,从而引发其他的问题。

这里再多说一下,由于强化学习的神经网络比较简单,难以在不影响整体性能的情况下增加单次计算的GPU时长,但是我们可以通过设置用户独享GPU的计算模式从而开启多个GPU进程,以此来提高GPU的使用率,该种情况往往两个或三个GPU进程就可以使GPU的利用率达到100%,但是这里就不仅存在数据生成策略间的同异步并行的问题也有了训练进程的同异步并行的问题,当然这种方式也有较为简单的形式,那就是在标准串行DQN基础上增加训练进程的数量,该种情况也可以保证GPU利用率100%。

在不影响算法收敛,不影响算法整体性能的情况下提升GPU利用率才是有意义的。

也正是因为使用GPU训练难以最大限度的提高运行效率,因此也有人提出使用CPU训练的方式,该种情况则需要使用大量的CPU进行计算,如A2C,而该种情况则可以使用HPC平台进行计算,往往也可以得到非常好的性能。

 

 

 

 

 

 

 

 

 

https://github.com/PacktPublishing/Deep-Reinforcement-Learning-Hands-On-Second-Edition