【问题标题】:How to ensure each worker use exactly one CPU?如何确保每个工作人员只使用一个 CPU?
【发布时间】:2020-04-06 01:59:08
【问题描述】:

我正在使用 ray 实现 SEED,因此,我定义了一个 Worker 类,如下所示

import numpy as np
import gym

class Worker:
    def __init__(self, worker_id, env_name, n):
        import os
        os.environ['OPENBLAS_NUM_THREADS'] = '1'
        self._id = worker_id
        self._n_envs = n
        self._envs = [gym.make(env_name) 
            for _ in range(self._n_envs)]

    def reset_env(self, env_id):
        return self._envs[env_id].reset()

    def env_step(self, env_id, action):
        return self._envs[env_id].step(action)

除此之外,Leaner 中有一个循环,它在需要与环境交互时调用Worker 的方法。

正如this document 建议的那样,我想确保每个工作人员都使用一个 CPU 资源。以下是我的一些尝试:

  1. 创建worker时,我设置num_cpus=1worker=ray.remote(num_cpus=1)(Worker).remote(...)
  2. 我使用 np.__config__.show() 检查了我的 numpy 配置,它提供了以下信息

blas_mkl_info: 不可用

幸福信息: 不可用

openblas_info: 库 = ['openblas', 'openblas'] library_dirs = ['/usr/local/lib'] 语言 = c define_macros = [('HAVE_CBLAS', None)]

blas_opt_info: 库 = ['openblas', 'openblas'] library_dirs = ['/usr/local/lib'] 语言 = c define_macros = [('HAVE_CBLAS', None)]

lapack_mkl_info: 不可用

openblas_lapack_info: 库 = ['openblas', 'openblas'] library_dirs = ['/usr/local/lib'] 语言 = c define_macros = [('HAVE_CBLAS', None)]

lapack_opt_info: 库 = ['openblas', 'openblas'] library_dirs = ['/usr/local/lib'] 语言 = c define_macros = [('HAVE_CBLAS', None)]

我注意到 numpy 正在使用 OpenBLAS,因此我在 Worker 类中设置了 os.environ['OPENBLAS_NUM_THREADS'] = '1',就像上面的代码在 this instruction 之后所做的那样。

两者都完成后,我打开top,但仍然注意到每个Worker使用130%-180% CPU,与之前完全相同。我还尝试在主要 python 脚本的开头设置os.environ['OPENBLAS_NUM_THREADS'] = '1' 或使用export OPENBLAS_NUM_THREADS=1,但没有任何帮助。我现在能做什么?

【问题讨论】:

    标签: python numpy ray


    【解决方案1】:

    您可以将核心固定在每个工人身上。例如,您可以使用类似 psutil.Process().cpu_affinity([i]) 之类的东西在每个 worker 上固定一个索引 i 核心。

    另外,在你固定你的 CPU 之前,请确保知道这个 api 分配给工作人员的 CPU 是什么。 https://github.com/ray-project/ray/blob/203c077895ac422b80e31f062d33eadb89e66768/python/ray/worker.py#L457

    例子:

    ray.init(num_cpus=4)
    @ray.remote(num_cpus=1) 
    def f(): 
       import numpy 
       resources = ray.ray.get_resource_ids() 
       cpus = [v[0] for v in resources['CPU']]
       psutil.Process().cpu_affinity(cpus)                                                                                                                                                                                                                      
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多