Як відправити задачу в ГРІД
У тих, хто тільки почав розбиратися з ГРІД-обчисленнями, виникає дуже багато запитань. Здається, ідею ГРІД ти розумієш, але щойно починаєш копати глибше в технічні деталі — опиняєшся над прірвою власного незнання. Інформації на ці теми GOOGLE видає багато, і часто натрапляєш на чиїсь наукові статті та монографії, де все дуже «красиво» розписано з філософського боку, а практичної користі з того рівно «0» — хоча від запиту чекаєш якогось «How to».
Сьогодні я хочу без зайвих наукових відступів відповісти на одне з найчастіших запитань: «Як відправити задачу в ГРІД?».
Перш ніж розповідати, що робити для запуску задачі в ГРІД, хочу пояснити, як це все влаштовано.
Як ми знаємо, ГРІД-обчислення — це не що інше, як розподілене виконання поставлених задач на віддалених (зокрема й географічно) кластерах, які входять до єдиної ГРІД-мережі.
Звісно, одразу виникає питання: «Як це все працює на програмному рівні?». Повної відповіді в одній статті не дати, але спробую окреслити загальну картину.
Уявіть собі абстрактну ситуацію — ви директор підприємства з виробництва шпаківень :). Виробництво у вас успішне й стабільно-середнє — близько 4 000 шпаківень на місяць. Раптом Вам надходить замовлення з Німеччини: «Терміново потрібно зробити 40 000 шпаківень за 1 місяць». Ясна річ, власними силами ви цього не подужаєте. Тому наймаєте 10 підприємств із різних міст, які роблять те саме, щоб виконати замовлення паралельно. Але щоб ці підприємства взялися до роботи, вам потрібно:
– Підписати договір про співпрацю;
– Надіслати технічне завдання (креслення, розміри, уточнення);
Після узгодження й затвердження підприємства почали працювати паралельно.
Коли шпаківні виготовлено, вам надходять сповіщення, що продукція готова до відвантаження. Ви зв’язуєтеся зі службою доставки і забираєте товар зі складів виробників.
У підсумку ваше підприємство виготовило й відправило до Німеччини 40 000 шпаківень точно в строк.
До чого тут приклад із виробництвом шпаківень? До того, що він точно описує порядок роботи в ГРІД. Переконаймося в цьому самі на такому практичному прикладі. Отже, у вас є задача: «Існує математична модель розвитку економіки України. Є набір статистичних даних за 10 років. Потрібно розрахувати, як зміна курсу долара в діапазоні від 8.00 до 20.00 грн. вплине на розвиток малого та середнього бізнесу на 5 років уперед. Деталізація за кожним місяцем. За умови зміни ціни на газ у діапазоні від 500 до 1000 доларів. Підзадача: треба вибрати, за якого курсу долара й ціни на газ умови для розвитку бізнесу найсприятливіші». Непогана задачка, правда? А найголовніше — це одна з реальних задач, які ми розв’язуємо в Донецькому інституті економіки промисловості НАН України. На локальному комп’ютері вона обчислюється дуже довго. Локальний кластер теж не підходить, коли дані потрібні оперативно, щоб ухвалювати рішення. Тож вирішуємо звернутися по допомогу до ГРІД. Що нам для цього потрібно:
1) У нас має бути сертифікат учасника ГРІД, отриманий у реєстратора;
2) Ми маємо перебувати у віртуальній організації, яка відповідає тематиці наших досліджень;
3) У нас має бути сервер із передвстановленим middleware для роботи в ГРІД (у нашому випадку доступ до свого сервера надавав Київський Інститут проблем математичних машин і систем, за що окрема подяка!);
Якщо все це є, переходимо до практичного запуску:
Крок 1: Заходимо на наш сервер. Я, наприклад, підключаюся через SSH:

Крок 2: Щоб авторизуватися в ГРІД, треба додати свій сертифікат, отриманий у реєстратора. Для цього створюємо в кореневому каталозі користувача папку «.globus».
У цю папку кладемо файл сертифіката і файл відкритого ключа (.pem).

Далі виконуємо команду grid-cert-info. Якщо сертифікати вказано правильно, на екран виведеться інформація про власника сертифіката.
Крок 3: Тепер треба зареєструвати проксі-сертифікат. Цей крок відкриє доступ до роботи з ГРІД.
Для цього достатньо ввести команду: grid-proxy-init
Ця команда автоматично відкриває сесію тривалістю 12 годин.
Щоб задати власну тривалість сесії, є команда: grid-proxy-init -valid 27:45, де 27:45 = 27 годин 45 хвилин
Крок 4: Спробуймо запустити нашу задачу на локальному кластері (без використання ГРІД).
Задачу реалізовано мовою Сі, код лежить у файлі 062.c. Ще є база статистики в каталозі variants і база регуляторів у каталозі delays.

Програма використовує вхідні дані з файлів:
./delays/d251
./variants/251
Щоб запустити програму, її треба скомпілювати командою: gcc ./062.c –lm –static –m32
У результаті компіляції буде створено виконуваний файл ./a.out
Щоб запустити файл, виконуємо команду: ./a.out 251 ,де 251 — це параметр з іменем файлів для вхідних даних (з папок delays, variants)
Результатом виконання програми буде файл 251 у каталозі /prognosis

На цьому кроці ми навчилися запускати програму локально, але в нас є складна задача, яку треба рахувати паралельно на серверах ГРІД-мережі. Тож переходимо до наступного кроку.
Крок 5: Щоб запустити задачу в ГРІД, її потрібно описати мовою xRSL. Цей опис можна порівняти з технічним завданням із прикладу про шпаківні. Пам’ятаєте? Щоб віддалене підприємство виконало замовлення, йому треба дати креслення й розміри шпаківні. Так само й тут: коли задача піде в ГРІД, віддалений кластер не знатиме, що з нею робити. Ну так, є якісь файли, які роблять щось важливе. Але в якій послідовності їх запускати? Які параметри передавати? Усе це описується в xRSL.
Коли візьметеся вивчати мову опису детальніше, побачите, що кластерам можна виставляти вимоги. Наприклад, якщо вам потрібно виділити 4 процесорні ядра, 8 ГБ оперативної пам’яті та 500 ГБ дискового простору — усе це зазначається в описі задачі, і задача піде на кластер, який задовольняє Ваші вимоги.
Синтаксис xRSL описано в робочій документації на сайті www.nordugrid.org
Створимо файл task1.xrsl:
&(executable="./task.sh") (inputFiles=(062.c "") (./delays/d251 "")(./delays/d252 "")(./delays/d253 "") (./delays/d254 "")(./delays/d255 "")(./delays/d256 "") (./variants/251 "")(./variants/252 "")(./variants/253 "") (./variants/254 "")(./variants/255 "")(./variants/256 "") ) (stderr="ferr.txt") (outputFiles=(./prognosis/p251 "")(./prognosis/p252 "")(./prognosis/p253 "") (./prognosis/p254 "")(./prognosis/p255 "")(./prognosis/p256 "")) (jobname="IASBPG17122011-хх") (notify="e mymail@gmail.com")
Команда executable каже: коли ваша задачка потрапить на будь-який віддалений кластер, там має запуститися саме цей файл.
Команда notify надішле Вам на пошту сповіщення про виконання задачі.
inputFiles перелічує всі файли, потрібні для роботи програми. Якщо є додаткові бібліотеки чи файли вхідних даних, їх теж треба внести до переліку.
Вміст файлу task.sh такий самий, як на кроці локального запуску програми:
#!/bin/sh gcc ./062.c –lm –static –m32 sleep 1 ./a.out 251 ./a.out 252 ./a.out 253 ./a.out 254 ./a.out 255 ./a.out 256
У task.sh ми вказуємо набір команд, які мають запуститися на віддаленому ГРІД-кластері.
На віддаленому кластері нам треба скомпілювати файл 062.с. Власне, це й зробимо.
Коли файли task.sh і task1.xrsl створено, переходимо до передавання задачі в ГРІД.
NorduGrid Middleware передбачає таку команду: ngsub –f ./task1.xrsl
Після цього задачу розмістять на доступному кластері. Якщо передавання пройшло успішно, на екран вийде повідомлення з номером задачі на зразок:
[nicitiep@cluster iasbpg]$ ngsub -f ./task1.xrsl
Job submitted with jobid: gsiftp://uagrid.org.ua:2811/jobs/7429132311440713023391
Переглянути статус виконання задачі можна командою ngstat:
[nicitiep@cluster iasbpg]$ ngstat gsiftp://uagrid.org.ua:2811/jobs/7429132311440713023391
Job gsiftp://uagrid.org.ua:2811/jobs/7429132311440713023391

Крок 6: Коли задачу виконано і статус стане FINISH, результати треба забрати. Для цього використовуємо команду ngget:
ngget gsiftp://uagrid.org.ua:2811/jobs/7429132311440713023391
Результати буде скопійовано в кореневу директорію користувача
Ресурси ГРІД можна моніторити через Web-інтерфейс: http://www.nordugrid.org/monitor/
Монітор ресурсів показує поточний стан усіх кластерів Європи. Через цей сайт можна стежити за статусами виконання задач, активністю кластерів, їхньою завантаженістю, активними користувачами ГРІД тощо.
Ось, власне, і все. Дуже сподіваюся, що інформація допомогла Вам розібратися в цьому питанні.
Якщо є ще запитання з цієї теми, не соромтеся ставити їх під статтею або пишіть мені через форму зворотного зв’язку.
Успіхів!
