Отключение Hyperthreading на узлах в кластере AWS EC2 с помощью конфигурации лучей

У меня есть задача, выполняющаяся в кластере EC2, которая начинает постепенно замедляться по мере использования виртуальных ЦП (независимо от размера тома EBS). Чтобы избежать этого, я хочу отключить гиперпоточность на всех узлах и пытался реализовать приведенный здесь совет: https://aws.amazon.com/blogs/compute/disables-intel-hyper-threading-technology-on-amazon-linux/. < br /> Я использую Ray для запуска кластера в Ubuntu 18.04 и предполагаю, что раздел initialization_commands в файле config.yaml является подходящим местом для реализации команд bash (заголовок bootcmd: там не понимается). Я пробовал несколько разных форматов, но, похоже, ни один из них не работает; например.:-

# List of commands run before setup_commands.
initialization_commands:
    - for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d, -f2- | tr ',' '\n' | sort -un); do echo 0 > /sys/devices/system/cpu/cpu$cpunum/online; done

выдает эту ошибку: -

bash: syntax error near unexpected token `sudo'
2020-07-26 22:53:04,949 INFO log_timer.py:17 -- NodeUpdater: i-0eefc0511ce029fb3: Initialization commands completed [LogTimer=139ms]
2020-07-26 22:53:04,949 INFO log_timer.py:17 -- NodeUpdater: i-0eefc0511ce029fb3: Applied config 39910e8bc12541ca5e316063231a2493642efee4 [LogTimer=60603ms]
2020-07-26 22:53:04,950 ERROR updater.py:348 -- NodeUpdater: i-0eefc0511ce029fb3: Error updating (Exit Status 1) ssh -i /home/haines/.ssh/ray-key2_us-east-1.pem -o ConnectTimeout=120s -o StrictHostKeyChecking=no -o ControlMaster=auto -o ControlPath=/tmp/ray_ssh_98734ce2b6/5f5c61af53/%C -o ControlPersist=10s -o IdentitiesOnly=yes -o ExitOnForwardFailure=yes -o ServerAliveInterval=5 -o ServerAliveCountMax=3 [email protected] bash --login -c -i 'true && source ~/.bashrc && export OMP_NUM_THREADS=1 PYTHONWARNINGS=ignore && for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d, -f2- | tr '"'"','"'"' '"'"'\n'"'"' | sort -un); sudo echo 0 > /sys/devices/system/cpu/cpu$cpunum/online; done'
Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/home/haines/Projects/VF83/Ray_Cloud/lib/python3.6/site-packages/ray/autoscaler/updater.py", line 351, in run
    raise e
  File "/home/haines/Projects/VF83/Ray_Cloud/lib/python3.6/site-packages/ray/autoscaler/updater.py", line 341, in run
    self.do_update()
  File "/home/haines/Projects/VF83/Ray_Cloud/lib/python3.6/site-packages/ray/autoscaler/updater.py", line 426, in do_update
    self.cmd_runner.run(cmd)
  File "/home/haines/Projects/VF83/Ray_Cloud/lib/python3.6/site-packages/ray/autoscaler/updater.py", line 263, in run
    self.process_runner.check_call(final_cmd)
  File "/usr/lib/python3.6/subprocess.py", line 311, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['ssh', '-i', '/home/haines/.ssh/ray-key2_us-east-1.pem', '-o', 'ConnectTimeout=120s', '-o', 'StrictHostKeyChecking=no', '-o', 'ControlMaster=auto', '-o', 'ControlPath=/tmp/ray_ssh_98734ce2b6/5f5c61af53/%C', '-o', 'ControlPersist=10s', '-o', 'IdentitiesOnly=yes', '-o', 'ExitOnForwardFailure=yes', '-o', 'ServerAliveInterval=5', '-o', 'ServerAliveCountMax=3', '[email protected]', 'bash', '--login', '-c', '-i', '\'true && source ~/.bashrc && export OMP_NUM_THREADS=1 PYTHONWARNINGS=ignore && for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d, -f2- | tr \'"\'"\',\'"\'"\' \'"\'"\'\\n\'"\'"\' | sort -un); sudo echo 0 > /sys/devices/system/cpu/cpu$cpunum/online; done\'']' returned non-zero exit status 1.

2020-07-26 22:53:05,018 INFO log_timer.py:17 -- AWSNodeProvider: Set tag ray-node-status=setting-up on ['i-0eefc0511ce029fb3'] [LogTimer=205ms]
2020-07-26 22:53:05,140 ERROR commands.py:285 -- get_or_create_head_node: Updating 3.93.77.73 failed

Я пробовал использовать отдельные строки и вместо этого помещать команды в раздел setup_commands, но ничего из этого не работает. Есть способ попроще?

Обновление: я предполагаю, что синтаксическая ошибка может быть связана с некоторым интервалом или символами (хотя я пробовал много вариантов), но даже без цикла, т.е. только команда sudo echo, записывающая на один процессор, я получаю ошибку разрешения: -

bash: /sys/devices/system/cpu/cpu50/online: Permission denied

Обновление 2: я обнаружил, что существует более простой метод: export OMP_NUM_THREADS = 1, но, похоже, это не имеет никакого эффекта, если это делается с помощью команды bash в настройке. Я использую Ray 0.8.6, который, как мне кажется, должен установить OMP_NUM_THREADS = 1, но он не определен на головном узле, когда кластер запущен и работает.


person Nick Mint    schedule 27.07.2020    source источник


Ответы (1)


Что ж, установка OMP_NUM_THREADS кажется бесполезной. Решение было первым, описанным AWS, но оно также требовало добавления разрешений на запись для всех онлайн-флагов ЦП в файле конфигурации Ray:

setup_commands:
    - sudo chmod -R 777 /sys/devices/system/cpu/*
    - for cpunum in $(cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | cut -s -d, -f2- | tr ',' '\n' | sort -un); do echo 0 > /sys/devices/system/cpu/cpu$cpunum/online; done

Это позволяет запускать любое количество задач на всех фактических процессорах одновременно с одним. Конечно, это также означает, что мне приходится запускать вдвое больше рабочих.

person Nick Mint    schedule 01.08.2020