Вирішення необмежених задач нелінійної оптимізації на GPU


18

Я намагаюся вирішити деякі необмежені проблеми нелінійної оптимізації на GPU (CUDA).

Цільова функція - це плавна нелінійна функція, а її градієнт порівняно дешевий для аналітичного обчислення, тому мені не потрібно зациклюватися на числовому наближенні.

Я хочу вирішити цю проблему в основному з fp32 maths ops (з різних причин), тож який метод нелінійної оптимізації є більш надійним проти помилок округлення, хоча має хороші показники? (наприклад, кон'югатний градієнт / квазі ньютон / довірна область), хтось спробував BFGS на GPU з хорошими результатами?

До речі, гессієць, якщо це потрібно, у моєму випадку порівняно невеликий (<64x64 типово), але мені потрібно вирішувати тисячі цих невеликих проблем оптимізації масштабу одночасно.


4
Враховуючи невеликий розмір ваших проблем, я не думаю, що конкретний вибір алгоритму (наприклад, BFGS) стане вашим найважливішим завданням. Натомість це дозволить мінімізувати накладні витрати на GPU <-> CPU. Мабуть, найкращий спосіб зробити це - це вирішити безліч прикладів своїх проблем паралельно на GPU. Завантажте їх усі відразу, вирішіть їх все одразу, завантажте результати відразу. Я не маю конкретних порад щодо алгоритму, але скажу, що GPU краще з циклами, ніж з гілками.
Майкл Грант

1
@Michael C. Grant: Ну, накладні комунікації можна легко приховати обчисленнями в моєму випадку, тому це не вузьке місце, я дуже схильний використовувати BFGS з обмеженою пам’яттю або стандартний BFGS, але не впевнений, чи є кращий підхід.
користувач0002128

Деякі люди впроваджували LBFGS разом із CUDA .
BenC

Відповіді:


8

Я реалізував досить багато різноманітних нелінійних розв'язувачів на графічному процесорі, включаючи LBFGS, градієнт спуску Barzilai Borwein та нелінійний спряжений градієнт.

Для цього нелінійний спряжений градієнт Dai & Yuan виявився найбільш ефективним. Взагалі, інший варіант нелінійного градієнта спряжених може бути більш ефективним (наприклад, CG-DESCENT), але також може бути складнішим для реалізації.

Загалом LBFGS - це дуже солідний вибір, і якщо ви дійсно не прив'язані до пам'яті, це, мабуть, найкраще місце для початку.

І кон'югатний градієнт, і BFGS вимагають пошуку рядків, і саме тут fp32 стає проблемою. Замість використання стандартних умов Вулфа для пошуку рядків я б запропонував використати приблизну умову Вулфа, запропоновану тут . У роботі трохи залучено, але важливим елементом є рівняння 4.1. По суті вони прямо вводять точність, з якою ви можете обчислити свою функцію.

Міркування щодо GPU:

У вас дуже багато дрібних проблем, що трохи відрізняється від мого використання однієї великої проблеми. Подумайте про те, щоб запустити 1 задачу на блок GPU (або, швидше, основи), якщо ви можете паралельно оцінювати функції та градієнти, щоб використовувати всі потоки в блоці. Таким чином, це не проблема, якщо різні проблеми вимагають різної кількості ітерацій.

Якщо це не варіант, я б пішов з вирішувачем LBFGS. Якщо ваша функція добре поводиться, ви можете уникнути, просто скориставшись кроком розміром 1 (уникаючи пошуку рядків) і просто запустивши всі проблеми на фіксовану кількість ітерацій.


0

Я пропоную вам використовувати Levenberg Marquardt (варіант регіону довіри), оскільки він використовується у багатьох практичних програмах і демонструє дуже хороші показники швидкості та точності. Крім того, для GPU є деякі бібліотеки (наприклад, cuLM https://github.com/zitmen/cuLM ), які ви можете спробувати. Якщо вони не виконають цю роботу, для вас є багато ресурсів. Реалізація ЛМ зовсім не важка. Вам слід подбати лише про те, щоб мінімізувати GPU-зв’язок. Щоб отримати коротке уявлення:

http://on-demand.gputechconf.com/gtc/2012/presentations/S0231-Levenberg-Marquardt-Using-Block-Sparse-Matrices-on-CUDA.pdf


2
Левенберг-Маркварт призначений для нелінійних найменших квадратів. Я не думаю, що він / вона нічого не згадувала про найменші квадрати.
Курт

0

Можливо, змодельована процедура відпалу може краще впоратись із помилками округлення (і їх легко паралелізувати).

Ви починаєте з грубої сітки області пошуку та початкового параметра "температура"

На кожному кроці ви обчислюєте можливі точки рішення (можна також приймати точки, що не мають рішення, з певною вірогідністю, обернено аналогічною температурі)

Потім зберігайте лише розчини на цьому етапі і збільшуйте температуру, що забезпечує більш дрібну зернисту сітку для наступної ітерації

Робіть це до тих пір, поки температура <задана межа / поріг точності

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.