Как удвоить объем памяти
Обновлено: 21.11.2024
На этой странице объясняется, как запрашивать память в скриптах Slurm и как справляться с распространенными ошибками, связанными с памятью CPU и GPU. Обратите внимание, что под «памятью» на веб-сайте Research Computing всегда подразумевается ОЗУ, а не пространство для хранения файлов.
Память процессора
Распространенная ошибка при выполнении заданий в кластерах HPC
Эта ошибка указывает на то, что ваше задание пыталось использовать больше памяти (ОЗУ), чем было запрошено вашим скриптом Slurm. По умолчанию в большинстве кластеров планировщик Slurm выделяет 4 ГБ на ядро ЦП. Если вам нужно больше или меньше этого, вам нужно явно указать количество в вашем скрипте Slurm. Наиболее распространенный способ сделать это — использовать следующую директиву Slurm:
Альтернативная директива для указания требуемой памяти
Как узнать, сколько памяти нужно запросить? Для простого кода можно посмотреть на используемые структуры данных и вычислить их вручную. Например, код, который объявляет массив из 1 миллиона элементов с двойной точностью, потребует 8 МБ, поскольку для двойной точности требуется 8 байт. Для других случаев, таких как предварительно скомпилированный исполняемый файл или код, который динамически выделяет память во время выполнения, оценка потребности в памяти намного сложнее. Далее описаны два подхода.
Проверка использования памяти выполняющимся заданием
В некоторых случаях оценку необходимого объема памяти можно получить, запустив код на ноутбуке или рабочей станции и выполнив команду Linux htop -u $USER или на Mac с помощью Activity Monitor, который находится в папке /Applications/Utilities. Если вы используете htop, посмотрите интересующий процесс в столбце RES.
Для этого в кластере Research Computing можно использовать веб-интерфейс stats.rc.
Это также можно сделать следующим образом. Используйте команду squeue -u $USER, чтобы получить имя хоста вычислительного узла, на котором выполняется задание (см. крайний правый столбец с надписью «NODELIST(REASON)»). Затем ssh к этому узлу: ssh (например, ssh tiger-i19g1). Наконец, запустите htop -u $USER, что приведет к следующему выводу:
В столбце RES показано использование памяти заданием. В данном случае используется 3846M или 3,846 ГБ. Чтобы выйти из htop, нажмите Ctrl+C. Запустите команду выхода, чтобы покинуть вычислительный узел и вернуться на узел входа.
Эмпирический подход
Секундная стратегия оценки требуемого объема памяти — начать с 4 ГБ по умолчанию на ядро ЦП и запустить задание. Если он работает успешно, просмотрите отчет по электронной почте (см. ниже) и при необходимости отрегулируйте требуемый объем памяти. Если произойдет сбой из-за ошибки нехватки памяти, удвойте требования к памяти и повторите отправку. Продолжайте эту процедуру до тех пор, пока задание не будет выполнено успешно, а затем используйте отчет по электронной почте, чтобы установить значение более точно.
Чтобы получать отчеты по электронной почте, добавьте в скрипт Slurm следующие строки:
Обязательно замените свой NetID указанным выше.
Ниже приведен пример отчета по электронной почте от Slurm:
Еще один способ увидеть использование памяти завершенным заданием — использовать команду seff:
JobID можно получить из выходного файла Slurm в каталоге, где было запущено задание (например, seff 4281297). Обратите внимание, что эта команда будет выдавать неточные значения при использовании для активно выполняющихся заданий.
Итак, если вы запросите слишком мало памяти, ваше задание завершится ошибкой нехватки памяти (OOM). Если вы запросите чрезмерную сумму, задание будет выполнено успешно, но вам может потребоваться немного больше времени, чем необходимо, для его запуска. Используйте отчеты по электронной почте Slurm и seff, чтобы установить запрошенный объем памяти для будущих заданий. При этом не забудьте запросить немного больше памяти, чем, по вашему мнению, вам потребуется для безопасности.
Память на кластер
Чтобы узнать, сколько памяти имеется на узел в данном кластере, используйте команду snodes и просмотрите столбец MEMORY, в котором перечислены значения в мегабайтах. Вы также можете использовать команду showodes. Обратите внимание, что некоторые узлы могут быть вам недоступны, поскольку они были приобретены определенными группами или отделами.
Кластер | Память на узел (ГБ) | Память на ядро ЦП (ГБ) |
---|---|---|
Ловко (skylake) Ловко (broadwell) Ловко (узел V100) Ловко (узел A100) | 384 128 770 1000 | 12 (384/32) 4,6 (128/28) 19,3 (770/40) 31,3 (1000/32) |
Della (broadwell) Della (каскад) Della (GPU) Della (физика) Della (большая память) | 128 190 768 380 1510, 3080 или 6150 | 4,6 ( 128/28) 5,9 (190/32) 6 (768/128) 9,5 (380/40) 31,5 (1510/48), 32,1 (3080/96) ) или 64,1 (6150/96) |
Stellar (Intel) Stellar (AMD) Stellar (GPU) Stellar (bigmem) | 768 512 512 4000 | 8 (768/96) 4 (512/128) 4 (512/128) 31,2 (4000/128) |
TigerCPU TigerGPU | 192 или 768 256 | 4.8 (192/40) или 19,2 (768/40) 9,1 (256/28) |
Траверс | 250 | 1,95 (250/128) |
Узел Adroit adroit-h11g1 имеет 770 ГБ ОЗУ, 40 ядер ЦП и четыре графических процессора V100. Каждый графический процессор V100 имеет 32 ГБ памяти. Члены группы физики на Della имеют доступ к дополнительным узлам с 380 ГБ памяти. В Della также есть несколько узлов с большим объемом памяти, которые принадлежат CSML, но доступны для всех пользователей, когда они не используются. Есть один узел с 1,51 ТБ, десять узлов с 3 ТБ и три с 6,15 ТБ. Их можно использовать только для заданий, которые нельзя выполнять на обычных узлах. Ваши задания попадут на эти узлы, если вы запросите больше памяти, чем доступно на обычных узлах. Traverse имеет 32 ядра ЦП с 4 аппаратными потоками на ядро ЦП.
Вы не можете вводить нецелые значения памяти (например, 4,2 ГБ не допускается). Это приведет к следующей ошибке:
Решение приведенной выше ошибки заключается в использовании целых значений (например, 4200M).
Использование памяти в зависимости от времени
Историю работы с памятью можно просмотреть с помощью веб-интерфейса stats.rc. См. пакет memory_profiler Python для мониторинга использования памяти с течением времени, а также построчно в вашем скрипте Python. Он доступен через conda или pip. Профилировщик MAP также можно использовать для измерения использования памяти в зависимости от времени.
ГП-память
Подобно тому, как центральный процессор имеет собственную память, так и графический процессор. Память графического процессора намного меньше, чем память процессора. Например, каждый GPU в кластере TigerGPU имеет только 16 ГБ памяти по сравнению с 256 ГБ, доступными ядрам CPU. Узлы Traverse имеют 32 ГБ на каждый GPU, что соответствует узлу V100 Adroit.
Запрос большего объема памяти графического процессора, чем доступно, приведет к ошибке. Вот пример для PyTorch:
Директивы Slurm для указания памяти графического процессора отсутствуют. В случае ошибки нехватки памяти (OOM) необходимо изменить сценарий приложения или само приложение, чтобы устранить ошибку. При обучении нейронных сетей наиболее распространенной причиной ошибок нехватки памяти на графическом процессоре является использование слишком большого размера пакета.
Такие вещи, как RAM-флешки и RAM на графических картах, кажется, удваиваются. Например, с течением времени их объем увеличивается с 1 ГБ, 2 ГБ, 4 ГБ, 16 ГБ и т. д. Почему этот материал постоянно удваивается, а не имеет случайных чисел, таких как 1,8? ГБ. Переход от 16 МБ графической карты к 32 ГБ в следующем поколении кажется чрезмерным. Почему не 20 ГБ или 22 ГБ??
Как правило, воспоминания представляют собой регулярные структуры, которые просто повторяются. Переход с 16 на 32G означает всего лишь 2 тайла по 16G. Ячейка памяти 16G, вероятно, состоит из 2 плиток 8G и т. д. и т. д. Пока вы не перейдете к какой-то фундаментальной плитке [которая обычно компилируется «компилятором памяти»].
Вы можете полностью построить память объемом 20 ГБ, но в основном она будет состоять из плиток 16 ГБ и 4 ГБ и не сэкономит вам денег [вы по-прежнему используете площадь кристалла, поскольку чипы прямоугольные. ]. Можно просто удвоить, если вы собираетесь добавить больше.
Одна из причин, по которой я не увидел в комментариях, заключается в том, как адресованы данные. Строки адреса, которые используются для одного модуля памяти, должны адресовать допустимую единицу хранения для каждой комбинации, которую вы устанавливаете в этих строках. Добавление еще одной адресной строки означает удвоение адресуемой памяти. Поэтому, если вам нужна непрерывная память, вам нужно удваивать емкость с каждым увеличением размера одного модуля. Или добавьте дополнительную логику для работы с прерывистой памятью.
Но большая часть памяти не соответствует этому — если вы купите 1 ГБ памяти, в нем будет 10 9 байт, а не 2 30 байт — так было раньше, но не на чем-то даже относительно современном
Факторов много, но нет жестких и быстрых физических причин — в основном все сводится к решениям, которые принимают инженеры. Одной из основных причин является маркетинг: постепенные улучшения в спецификациях создают возможность быть на шаг впереди лишь немного более высоких спецификаций от других поставщиков. В то время как значительные улучшения нравятся потребителям и оправдывают более высокие цены.
Еще одна причина заключается в том, что многие физические устройства улучшаются путем добавления к ним дополнительных копий существующих субъединиц. Снижение общего энергопотребления видеокарты ниже определенного порога (например) может сделать возможным буквально припаять лишний объем ОЗУ и т. д.
Одним из них является закон Мура, который обычно говорит нам, что развитие технологий происходит экспоненциально. Вместо того, чтобы увеличиваться на такое-то количество МБ в год, память имеет тенденцию увеличиваться на столько-то % в год, поэтому она постоянно ускоряется. Таким образом, чтобы соответствовать этому, вы хотите, чтобы ваши палки увеличивались на столько-то процентов каждый раз, когда вы обновляетесь. Так что они ушли с 200%
Второй: почему 200%? Это происходит из-за того, как компьютеры хранят данные.Все в двоичном формате, где 16 выглядит как 10000, а 32 выглядит как 100000. Удвоение чего-либо в двоичном формате так же «естественно», как умножение на 10 в обычных числах. Вы можете увеличить в 3 раза, если хотите, но удвоение чего-то дает вам хорошие круглые числа в двоичном формате, с которыми немного проще работать, а также экономит небольшое количество места. . Итак, у нас есть вещи, которые идут 2, 4, 8, 16, 32, 64, 128, 256 и т. д.
Для хранения числа с плавающей запятой в компьютере будет выделено 4 байта (32 бита) памяти.
8 бит для экспоненциальной части
23 бита для значащей части
Давайте обсудим процедуру шаг за шагом на примере,
1.Число с плавающей запятой будет преобразовано в двоичное число
С помощью этой процедуры мы преобразовали 10,75 в (1010,11) 2
2.Приведите преобразованное двоичное число к нормализованной форме
Для чисел с плавающей запятой мы всегда нормализуем их как 1.значащий бит * 2 степени
Итак, 1010.11 будет нормализован как,
1,01011 * 2 3 . Так как я сдвинул 3 бита влево.
Объяснение в картинках
3.Добавить смещение к показателю степени
В плавающих числах нет понятия, называемого дополнением до 2, для хранения отрицательных чисел. Чтобы преодолеть это, они придумали концепцию смещения, в которой мы добавляем некоторое положительное значение к отрицательному показателю и делаем его положительным.
Как правило, независимо от того, положительное оно или отрицательное, они добавляют значение смещения к показателю степени, чтобы упростить реализацию.
Формула для расчета значения смещения
Здесь мы выделили 8 бит для экспоненты. Таким образом, n будет равно 8
Следовательно, нормализованное значение экспоненты будет,
Фактический показатель степени + значение смещения, равное 130 (3 + 127)
Двоичная форма числа 130: (10000010) 2
Представление
Знаковый бит 0, потому что 10,75 — положительное число
Показатель степени равен 130, что равно (10000010) 2
Значимое значение равно 1,01011, здесь мы можем исключить 1 перед точкой (.), потому что каким бы ни было число, мы всегда будем нормализовать его как 1.something. Таким образом, нет необходимости сохранять 1. Просто возьмите биты после точки (.), которая равна 01011.
Объяснение в картинках
Для хранения числа double компьютер выделит 8 байт (64 бита) памяти.
11 бит для экспоненты,
52 бита для значащих.
Единственная разница между двойным представлением и представлением с плавающей запятой заключается в значении смещения.
Здесь мы используем 11 бит для экспоненты. Таким образом, значение смещения будет 2 11 - 1 - 1, т.е. 2 10 - 1, что равно 1023 .
в случае двойного числа к показателю степени будет добавлено 1023. Остальные процедуры аналогичны плавающему представлению.
Ответ зависит от того, какую операционную систему и программы вы используете на компьютере и сколько программ работает одновременно. Мы рекомендуем посмотреть системные требования для программ или игр, которые вы запускаете на своем компьютере, и удвоить это число. Однако ниже приведены наши рекомендации по объему памяти, который должны иметь современные (2022 г.) компьютеры.
Минимум: 4 ГБ
Рекомендуется: 8 ГБ
Отлично: 16 ГБ или больше.
Если вы используете старый компьютер с более старой версией операционной системы, минимальные требования к памяти ниже. Например, пользователи, все еще работающие под управлением Microsoft Windows XP, могут обойтись 128 МБ памяти, поскольку ее требования составляют всего 64 МБ.
Важно знать, что 32-разрядные версии любой операционной системы Microsoft Windows могут обнаруживать только до 4 ГБ общей системной памяти. Обновление до 64-разрядного процессора и 64-разрядной версии Windows увеличивает требования к памяти, но также позволяет компьютеру распознавать больше памяти.
Что произойдет, если на моем компьютере меньше 2 ГБ?
Если вы используете более старую операционную систему, как упоминалось выше, вы все равно можете обойтись 2 ГБ памяти или меньше. Однако запуск более старой операционной системы представляет угрозу безопасности, поскольку они больше не обновляются. Кроме того, более новое программное обеспечение часто не работает на старых компьютерах и операционных системах.
Если вы используете более новую операционную систему, например Windows 10 или Windows 11, с объемом памяти 2 ГБ или меньше, компьютер может работать довольно медленно. Вы также можете получать предупреждения о нехватке памяти на вашем компьютере, и программы могут зависать, если памяти недостаточно.
Не слишком ли много у вас 32 ГБ памяти?
Нет, но обычно в этом нет необходимости. Если компьютер поддерживает 32 ГБ или более памяти и это соответствует вашему бюджету, добавьте столько памяти, сколько хотите.Хотя многие приложения, в том числе современные игры, программы для редактирования видео и программы для трехмерного моделирования, могут работать более плавно с дополнительной оперативной памятью, редко одновременно используется более 32 ГБ.
Читайте также: