Предыстория: мне нужно выполнить огромные вычисления для моделирования климата с более чем 800 [GB]
данными (за последние 50 лет и будущие 80 лет).
Для этого я использую RegCM4 на основе Linux. Я использую Убунту. Самая мощная система, которая у нас есть, имеет процессор Intel XEON с 20 ядрами. Также у нас есть почти 20 менее мощных восьмиядерных процессоров Intel i7 меньшего размера.
Для запуска симуляций одной системы потребуется больше месяца.
Итак, я пытался настроить компьютерные кластеры с доступными ресурсами.
(К вашему сведению: RegCM допускает параллельную обработку с mpi
.)
Характеристики::
Computer socket cores_per_socket threads_per_core CPUs RAM Hard_drives
node0 1 10 2 20 32 GB 256 GB + 2 TB-HDD
node1 1 4 2 8 8 GB 1 TB-HDD
node2 1 4 2 8 8 GB 1 TB-HDD
-> Я использую mpich
v3 (точный номер версии не помню)
И так далее... (все узлы, кроме node0
, такие же, как node1
.)
Все узлы имеют 1 Gbps
поддерживаемые карты Ethernet.
Для проверки я создал небольшой моделирование работы для анализа 6 дней климата. Во всех тестовых симуляциях использовались одни и те же параметры и настройки модели.
Все узлы загружаются со своих собственных жестких дисков.node0
работает на Ubuntu 16.04 LTS.
на других узлах работает Ubuntu 14.04 LTS.
С чего я начал? Я выполнил шаги, описанные в здесь.
- Соединил
node1
иnode2
кабелем Cat 6, присвоив им статические IP-адреса. (пока оставилnode0
) - отредактировал/etc/hosts
с IP-адресами и соответствующими именами -node1
иnode2
как указано в таблице выше - настроить вход без пароля с ssh в обоих - успех
- создал папку в
/home/user
вnode1
(которая будет главной в этом тесте) и экспортировал папку (/etc/exports
), смонтировал эту папку черезNFS
вnode2
и отредактировал/etc/fstab
вnode2
- успех - Прогнал мой
regcm
по кластеру, используя 14 ядер обеих машин - успешно - Я использовал:
iotop
,bmon
,htop
для контроля чтения/записи диска, сетевого трафика и использования ЦП соответственно.
$ mpirun -np 14 -hosts node0,node1 ./bin/regcmMPI test.in
Результат этого теста
Более быстрые вычисления по сравнению с обработкой одного узла
Теперь я попробовал то же самое с node0
(см. характеристики компьютера выше)
-> Я работаю над SSD в node0
.
-> работает нормально, но проблема связана с фактором времени при подключении в кластере.
Вот сводка результатов: - сначала использовалось только node0
- без использования кластера
$ mpirun -np 20 ./bin/regcmMPI test.in
nodes no.of_cores_used run_time_reported_by_regcm_in_sec actual time taken in sec (approx)
node0 20 59.58 60
node0 16 65.35 66
node0 14 73.33 74
это нормально
Теперь, используя кластер
(используйте следующую ссылку, чтобы понять таблицу ниже):
rt
= Время работы процессора, указанное regcm, в секундах
a-rt
= фактическое время в секундах (приблизительно)
LAN
= Максимальная достигнутая скорость локальной сети (прием/отправка) в МБ/с
disk(0 / 1)
= Максимальная скорость записи на диск приnode0
/приnode1
в МБ/с
nodes* cores rt a-rt LAN disk( 0 / 1 )
1,0 16 148 176 100/30 90 / 50
0,1 16 145 146 30/30 6 / 0
1,0 14 116 143 100/25 85 / 75
0,1 14 121 121 20/20 7 / 0
*Примечание:
1,0 (например, для 16 ядер) означает:
$ mpirun -np 16 -hosts node1,node0 ./bin/regcmMPI test.in
0,1 (например, для 16 ядер) означает:
$ mpirun -np 16 -hosts node0,node1 ./bin/regcmMPI test.in
Фактическое время выполнения было рассчитано вручную с использованием времени начала и окончания, сообщаемого regcm.
Выше мы видим, что использование локальной сети и скорость записи на диск значительно различались для двух вариантов: 1. передача node1,node0
в качестве хоста; и 2. передача node0,node1
в качестве хоста ---- обратите внимание на порядок.
Также время работы на одном узле меньше, чем на кластере. Почему?
Я также провел еще один набор тестов, на этот раз с использованием хост-файла (с именем hostlist), содержимое которого было следующим:
node0:16
node1:6
Теперь я запустил следующий скрипт
$ mpirun -np 22 -f hostlist ./bin/regcmMPI test.in
Сообщалось о времени работы ЦП 101 [s]
, фактическое время работы составляло 1 min 42 sec
( 102 [s]
), достигнутая скорость локальной сети составляла около 10-15 [MB/s]
, скорость записи на диск составляла около < сильный>7 [MB/s]
.
Наилучший результат был получен, когда я использовал ту же настройку файла хоста и запускал код с 20 процессорами, таким образом, недоподписываясь
$ mpirun -np 20 -f hostlist ./bin/regcmMPI test.in
CPU runtime : 90 [s]
Actual run time : 91 [s]
LAN : 10 [MB/s]
Когда я изменил число ядер с 20 на 18, время работы увеличилось до 102 [s]
.
Я не еще не подключил node2
к системе.
Вопросы:
- Есть ли способ добиться более высокой скорости вычислений? Я делаю что-то неправильно ?
- Время вычислений для одной машины с 14 ядрами меньше, чем для кластера с 22 или 20 ядрами. Почему это происходит?
- Какое оптимальное количество ядер можно использовать для достижения эффективности по времени?
- Как добиться наилучшей производительности с доступными ресурсами?
- Есть ли какое-нибудь лучшее руководство по использованию mpich, которое может ответить на мои вопросы? (такой информации не нашел)
- Иногда использование меньшего количества ядер дает более быстрое время завершения, чем использование более мощных ядер, хотя я не использую все доступные ядра, оставляя 1 или 2 ядра для ОС и других операций на отдельных узлах. Почему это происходит?