Командные файлы LoadLeveler для Blue Gene/P

Очередью заданий на системах IBM Blue Gene/P и Regatta, установленных на факультете ВМК МГУ, управляет планировщик IBM Tivoli LoadLeveler. Чтобы поставить задание в очередь, необходимо подготовить специальный командный файл, в котором будет указан путь к исполняемому файлу и запрашиваемые программой ресурсы. Вопросы запуска заданий и управления очередью рассмотрены в отдельных секциях. Необходимо подчеркнуть, что на этом сайте мы не рассматриваем многошаговые задания и зависимости между шагами; интересующийся пользователь может найти описание указанных тем в официальной документации. В данном разделе описывается формат командного файла для запуска заданий на системе Blue Gene/P:

Пример простейшего командного файла

Имя командного файла является любым допустимым в данной операционной системе, но традиционно имеет расширение jcf («jcf» — сокращение от «job command file» — командный файл задачи). Рассмотрим пример простейшего командного файла bgp_run.jcf:

# @ job_type = bluegene
# @ class = large
# @ output = $(jobid).out
# @ error = $(jobid).err
# @ wall_clock_limit = 00:05:00
# @ bg_size = 128
# @ queue
/bgsys/drivers/ppcfloor/bin/mpirun -exe /gpfs/data/pozdneev/test/a.out -env OMP_NUM_THREADS=2 -mode DUAL

Строки, начинающиеся с символов # @, задают параметры планировщику. Команда

# @ job_type = bluegene

является обязательной — она информирует LoadLeveler о том, что задача предназначена для системы Blue Gene. Следующая строка

# @ class = large

определяет класс запускаемой задачи. В общем случае в системе может быть предопределено несколько классов задач, отличающихся приоритетом и требуемыми ресурсами. Строки

# @ output = $(jobid).out
# @ error = $(jobid).err

указывают планировщику, какие имена присвоить файлам стандартного вывода и потока сообщений об ошибках. Переменная $(jobid) будет автоматически заменена LoadLeveler'ом на уникальный числовой идентификатор задания. Файлы будут созданы в текущей директории. Лимит счетного времени в формате чч:мм:сс пользователь задает командой

# @ wall_clock_limit = 00:05:00

Время начинает отсчитываться с момента принятия задачи на счет, но не с момента постановки ее в очередь. Если программа превышает указанный пользователем лимит времени, она принудительно снимается системой со счета.

Число вычислительных узлов, которые будут выделены для задачи, указывается командой

# @ bg_size = 128

Доступны следующие значения: 128, 256, 512, 1024 и 2048. После подключения дополнительных узлов ввода-вывода, станет возможно использовать разделы, включающие 64 вычислительных узла. Строка

# @ queue

также является обязательной и отмечает конец списка операторов. Исполняемый файл, режим запуска, число OpenMP-нитей и путь к программе mpirun указываются в последней строчке командного файла:

/bgsys/drivers/ppcfloor/bin/mpirun -exe /gpfs/data/pozdneev/test/a.out -env OMP_NUM_THREADS=2 -mode DUAL

Обратите внимание, что для OpenMP-программ, которые запускаются в VN- или DUAL-режимах, необходимо явным образом указывать число нитей (-env OMP_NUM_THREADS=1 и -env OMP_NUM_THREADS=2 соответственно), в противном случае система попытается создать четыре нити, и программа будет аварийно завершена.

Синтаксис командного файла

Задание LoadLeveler'а в общем случае состоит из одного или нескольких шагов (job steps), которые определяются в одном командном файле. Кроме параметров, указывающих запрашиваемые ресурсы, в командном файле можно задать имя для задания и его конкретных шагов.

Общие правила составления командного файла

  • Строки с операторами (keyword statement) начинаются с символов #@, причем между этими символами допустимо любое число пробелов, т.е. каждая из следующих строк будет проинтерпретирована как строка с оператором:
    #@      job_type = bluegene
    # @     bg_connection = PREFER_TORUS
      #   @ bg_size = 128
    
  • Комментарии начинаются с символа #. Таким образом, каждая строка, первым печатным символом которой является #, но не представляющая собой строку с операторами, будет считаться комментарием:
    #
    # Single pound sign (#) is normally used only in the beginning
    # of a jcf and after keyword statements
    #
    ### Let's comment out the following line for a while
    ##@ environment = COPY_ALL
    #
    ### Triple pound sign (###) is typically used between keyword 
    ### statements to improve readability
    #
    
  • Компоненты операторных строк отделяются друг от друга пробелами. Пробелы также можно использовать, чтобы повысить удобочитаемость кода, но это необязательно, если уже использованы другие разделители:
    # @ bg_connection=PREFER_TORUS
    # @ environment = COPY_ALL ; MPIRUN_MODE=DUAL;MPIRUN_LABEL =1; MPIRUN_VERBOSE= 2
    
  • Обратная наклонная черта (backslash, \) используется для продолжения оператора не следующую строку, которая при этом не должна начинаться с символов #@:
    # @ environment = \
            COPY_ALL; \
            MPIRUN_MODE = DUAL; \
            MPIRUN_LABEL = 1; \
            MPIRUN_VERBOSE = 2;
    
  • Ключевые слова являются регистронезависимыми:
    #@ JOB_TYPE = bluegene
    #@ ErRoR = $(jobid).err
    #@ Bg_Connection = PREFER_TORUS
    #@ BG_size = 128
    

Замечание о признаке конца строки

Обратите внимание, что командный файл должен подчиняться соглашениям UNIX о формате текстовых файлов. Т.е., если вы подготовили файл с использованием Windows-редактора, и признаком окончания строки в нем служит пара символов OD OA, то вам будет необходимо воспользоваться утилитой dos2unix, чтобы преобразовать файл к формату UNIX, например,

$> dos2unix run.jcf

В противном случае вы будете получать сообщения о неправильных параметрах:

<Oct 15 19:21:36.296950> FE_MPI (ERROR): Incorrect value on the '-mode' command line option: 'DUAL
'

Try /bgsys/drivers/ppcfloor/bin/mpirun -help for more details

Ключевые слова командного файла

Параметры задания специфицируются с использованием ключевых слов. Если после ключевого слова не указано никакого значения, ключевое слово игнорируется.

Ключевое слово Описание
bg_connection = TORUS | MESH | PREFER_TORUS

Тип запрашиваемой топологии:

  • TORUS — трехмерный тор
  • MESH — трехмерная сетка (по умолчанию)
  • PREFER_TORUS — если возможно, будет использован тор, в противном случает — сетка

Если запрашиваемая топология недоступна для специфицированного числа вычислительных узлов или указанного раздела, то задание не может быть принято к исполнению и будет переведено в состояние Idle. Диагностическое сообщение, выдаваемое командой llq -l <jobid> будет содержать строку примерно следующего вида:

bg_connection=TORUS not supported for small partitions.
bg_partition Запустить задачу на одном из предопределенных разделов (см. тж. команду llstatus); это ключевое слово несовместимо с ключевыми словами bg_size, bg_connection и некоторыми другими, которые здесь не описаны.
bg_size Число запрашиваемых вычислительных узлов. Может принимать следующие значения: 128, 256, 512, 1024, 2048. После ввода в строй дополнительных узлов ввода-вывода станет доступно значение 64.
class Класс задачи (см. тж. команду llclass)
environment

Описывает переменные окружения задачи, их список разделяется точками с запятыми. Возможны следующие значения:

  • COPY_ALL — скопировать все переменные из текущего окружения
  • $var — скопировать переменную var из текущего окружения
  • !var — при использовании COPY_ALL не копировать переменную var из текущего окружения
  • var=value — задать значение value для переменной var
error

Имя файла, в который будет направлен поток stderr. Обычно используют значение (о переменной $(jobid) см. ниже):

# @ error = $(jobid).err
initialdir Рабочая директория, в которую переходит LoadLeveler, когда начинает выполнять задание. Не начинающиеся с прямой косой черты (slash, /) пути считаются относительными к данной директории. Значением по умолчанию является путь к директории, из которой задание было поставлено в очередь. Доступ к этой директории со стороны вычислительной системы будет проверен на этапе постановки задачи в очередь. Если директория будет недоступна, то запуск задачи завершится неудачно.
input Имя файла, который с которым будет ассоциирован stdin. По умолчанию это /dev/null.
job_type Тип задания. На системе Blue Gene/P этому ключевому слову должно быть присвоено значение bluegene:
# @ job_type = bluegene
notification = always | error | start | never | complete Определяет, в каких случаях извещать пользователя, указанного в notify_user:
  • always — при постановке задачи на счет, ее завершении и при возникновении ошибочных ситуаций
  • error — только при возникновении ошибочных ситуаций
  • start — только при постановке задачи на счет
  • never — никогда
  • complete — только при завершении задания (по умолчанию)
notify_user

Имя пользователя или электронный адрес, на который будет отсылаться почта при наступлении события, указанного в notification, например

# @ notify_user = yourusername

или

# @ notify_user = yourusername@example.com
output

Имя файла, в который будет направлен поток stdout. Обычно используют значение (о переменной $(jobid) см. ниже):

# @ output = $(jobid).out
queue Помещает задание в очередь. Этот оператор обязателен.
wall_clock_limit Лимит счетного времени в формате чч:мм:сс или мм:сс или сс; время отсчитывается с момента принятия задачи к счету (но не с момента отправки задачи в очередь):
# @ wall_clock_limit = 12:00:00

Переменные в командном файле

Диспетчер очереди LoadLeveler определяет несколько переменных, которые доступные для использования в командном файле. Например, их можно использовать для задания уникальных имен для файлов, с которыми будут связаны стандартные потоки вывода и ошибок. Обращение к переменным осуществляется как

$(variable_name)

Среди доступных переменных выделим следующие:

Переменная Описание
$(jobid) Номер задания
$(stepid) Номер этапа в рамках задания (подробнее об этапах заданий можно прочитать в официальной документациии

Текст составлен на основе материала книги «Tivoli Workload Scheduler LoadLeveler: Using and Administering» (Version 3 Release 4.3)