PaddlePaddle / PARL

A high-performance distributed training framework for Reinforcement Learning
https://parl.readthedocs.io/
Apache License 2.0
3.22k stars 817 forks source link

GPU卡接入资源池 #1037 #1041

Closed zhengyuhong closed 1 year ago

zhengyuhong commented 1 year ago

message.py

  1. InitializedJob 新增gpus成员变量,在JobCenter给Client分配Job时,由JobCenter记录当前Job挂载的GPU卡ID列表(CPU场景ID列表为空)
  2. InitializedWorker 初始化参数新增gpu_num,当前gpu_num > 0时,表示当前Worker所在机器的第0块GPU,第1块GPU,....,第gpu_num-1块GPU给Worker接入GPU集群,如果该机器保留部分GPU卡不接入GPU集群,请保留高位ID的GPU。

    status.py

  3. WorkerStatus 新增gpu_num成员变量,记录当前Worker可用的GPU信息。

    start.py

  4. 增加Master、Worker、Monitor的启动参数,xpu, gpu_num,xpu=cpu时用于启动CPU集群,cpu_num指定接入CPU集群的CPU个数,xpu=gpu时用于启动GPU集群,gpu_num指定接入GPU机器的GPU个数 cluster_monitor.py
  5. 增加返回GPU使用情况的信息。

    worker.py

  6. Worker 初始化参数新增gpu_num,默认值为0,取xpu_num=max(gpu_num, cpu_num),使用xpu_num来初始化xpu_num个InitializedJob。当初始化参数gpu_num=None时,表示Worker自动读取GPU卡总数为gpu_num。
  7. 当self.gpu_num > 0时,_get_worker_status返回Worker所在机器的GPU显存使用情况。

    monitor.py

  8. 使用GPU场景,当启动参数xpu=gpu时,读取对应的html文件。
  9. /cluster接口增加返回各个Worker的gpu显存使用情况。

    job_center.py

  10. JobCenter 初始化参数增加xpu,用于区分GPU、CPU场景
  11. 新增成员属性worker_vacant_gpus记录当前各个Worker待分配的GPU信息。
  12. 新增成员属性worker_used_gpus记录当前各个Worker已分配的GPU信息。
  13. request_job增加n_gpus参数,默认值为0,当n_gpus > 0时,则申请至少还有n_gpus个GPU的Worker上的Job,JobCenter将分配的GPU卡ID列表绑定到Job上。并更新worker_vacant_gpus、worker_used_gpus。

    master.py

  14. Master 初始化参数增加xpu,用于区分GPU、CPU场景。
  15. 在Client提交Job申请时,即tag == remote_constants.CLIENT_SUBMIT_TAG分支,判断Client申请的资源是否与当前资源(GPU/CPU)对应,如果不对应则返回remote_constants.REJECT_TAG。
  16. 在Client提交GPU Job申请时,从zmq请求中提取n_gpus信息,转发给JobCenter.request_job(n_gpus),由JobCenter判断是否满足,如果JobCenter满足返回InitialilzedJob对象。
  17. 无论时Client提交CPU Job还是GPU Job,现在给Client返回的响应中均改为[remote_constants.NORMAL_TAG, cloudpickle.dumps(job)],其中job为JobCenter返回InitialilzedJob对象。Client使用cloudpickle.loads获取InitialilzedJob对象,提取想要的信息,如GPU场景,需要从InitialilzedJob对象获取gpus成员变量,由JobCenter记录当前Job挂载的GPU卡ID列表。

    client.py

  18. submit_job 增加参数n_gpus,当n_gpus > 0时,增加GPU Job申请场景,将n_gpus通过请求传递给Master,当没有空闲GPU,则休眠5s再申请,最多重试60次。
  19. 由上面master.py第4点Client申请Job返回值发现变化,因此需要适配InitialilzedJob类型的返回值,从InitialilzedJob对象提取所需信息。 remote_wrapper.py
  20. RemoteWrapper新增request_gpu_resource成员函数
  21. 向InitialilzedJob.job_address提交remote_constants.INIT_OBJECT_TAG请求时,追加CUDA_VISIBLE_DEVICES=','.join(InitialilzedJob.gpus)的xparl_reserved_kwargs信息。

    job.py

  22. 解析RemoteWrapper追加的xparl_reserved_kwargs信息,设置在初始化OBJ前设置环境变量os.environ["CUDA_VISIBLE_DEVICES"] = ... remote_decorator.py
  23. 将修饰符的n_gpus参数传递给RemoteWrapper,RemoteWrapper._n_gpus = n_gpus
CLAassistant commented 1 year ago

CLA assistant check
All committers have signed the CLA.

TomorrowIsAnOtherDay commented 1 year ago

@zhengyuhong 请补充单元测试校验新增功能的有效性。