Как обеспечить, чтобы каждый работник использовал только один процессор? - PullRequest
0 голосов
/ 06 апреля 2020

Я использую 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)

Кроме того, в * есть oop 1007 *, которые вызывают методы Worker, когда необходимо взаимодействовать со средой.

Как подсказывает этот документ , я хочу убедиться, что каждый работник использует ровно один ресурс ЦП. Вот некоторые из моих попыток:

  1. При создании worker я установил num_cpus=1: worker=ray.remote(num_cpus=1)(Worker).remote(...)
  2. Я проверил свою конфигурацию numpy, используя np.__config__.show(), что дало мне следующую информацию

blas_mkl_info: НЕ ДОСТУПНО

blis_info: НЕ ДОСТУПНО

openblas_info: library = ['openblas', 'openblas'] library_dirs = ['/ usr / local / lib'] language = c define_macros = [('HAVE_CBLAS', None)] *

blas_opt_info: библиотеки = ['openblas', 'openblas'] library_dirs = [' / usr / local / lib '] language = c define_macros = [(' HAVE_CBLAS ', None)]

lapack_mkl_info: НЕ ДОСТУПНО

openblas_lapack_info: library = [' openblas ',' openblas '] library_dirs = [' / usr / local / lib '] language = c define_macros = [(' HAVE_CBLAS ', None)]

lapack_opt_info: библиотеки = [' openblas ',' openblas '] library_dirs = ['/ usr / local / lib'] language = c define_macros = [('HAVE_CBLAS', None)]

Я заметил, что numpy - это вы спеть OpenBLAS, поэтому я установил os.environ['OPENBLAS_NUM_THREADS'] = '1' в классе Worker, как в приведенном выше коде, следуя этой инструкции .

После того, как оба были выполнены, я открыл top, но все же заметил, что каждый рабочий используйте 130%-180% CPU, точно так же, как и раньше. Я также пытался установить os.environ['OPENBLAS_NUM_THREADS'] = '1' в начале основного python сценария или с помощью export OPENBLAS_NUM_THREADS=1, но ничего не помогает. Что я могу сделать сейчас?

1 Ответ

1 голос
/ 08 апреля 2020

Вы можете закрепить свое ядро ​​на каждом работнике. Например, вы можете использовать что-то вроде psutil.Process (). Cpu_affinity ([i]), чтобы закрепить ядро ​​index i на каждом работнике.

Кроме того, прежде чем вы прикрепите свой процессор, убедитесь, что вы знаете, какой процессор был назначен работнику этим API. 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)                                                                                                                                                                                                                      

...