Có thư viện tối ưu hóa phi tuyến bị ràng buộc như IPOPT chạy trên GPU không?


8

Ai đó trong nhóm của tôi muốn làm tê liệt IPOPT. (ít nhất là một số chức năng của nó). Tôi đã không thể tìm thấy một triển khai GPU của nó hoặc một gói tương tự. Tôi cũng không tìm thấy bất cứ điều gì trên tài liệu của họ.

Vì vậy, câu hỏi là, có một sự thay thế đã được thực hiện trên GPU? hoặc ít nhất là ai đó làm việc về việc chuyển nó sang GPU để chúng ta có thể làm việc cùng nhau?

Câu trả lời:


12

tl; dr: Ấn tượng chung của tôi từ các tài liệu là tốc độ rất khiêm tốn (nếu chúng tồn tại). Hạt nhân chính bạn sẽ thấy trong các phương thức này là một phương thức trực tiếp thưa thớt (ví dụ: LU thưa thớt, LDLT thưa thớt) và truy cập bộ nhớ không đều; những đặc điểm này không ủng hộ việc sử dụng GPU. Ngoài ra, IPM song song đang ở giai đoạn trứng nước. Tôi vẫn nghi ngờ mọi người sẽ làm việc với việc triển khai GPU, nhưng tôi nghi ngờ nhiều điều sẽ đến với họ. (Tuy nhiên, IPM bộ nhớ phân tán có vẻ hứa hẹn và hữu ích hơn một chút.)


Một vài người đã nghiên cứu các phương pháp điểm nội bộ (IPM) cho GPU:

  • Smith, Gondzio và Hall đã phát triển IPM cho các chương trình tuyến tính (LP) đạt được tốc độ tăng tốc 4-10 lần
  • Jung và O'Leary xem xét một số hạt nhân đại số tuyến tính trong IPM cho LP và thấy sự tăng tốc khiêm tốn cho GPU về các vấn đề lớn hơn trong bộ thử nghiệm của họ

Nói chung, các bài báo không so sánh công việc của họ với người giải quyết LP được điều chỉnh cao. Jung và O'Leary so sánh với linprog, đây không phải là lựa chọn của hầu hết các học viên, và ấn tượng tôi nhận được từ việc quét Smith, et al là một phương pháp điểm bên trong nối tiếp được viết từ đầu. Cho rằng Hall rất tham gia vào các bộ giải LP nguồn mở, tôi coi công việc đó nghiêm túc hơn một chút. Một trong những trình giải mã LP nguồn mở tốt hơn hiện có là Clp, mà Hall duy trì và nếu họ đã sử dụng mã đó, nó sẽ được đề cập theo tên. Vì vậy, tôi sẽ chú ý hơn nếu các mã này đang tăng tốc các bộ giải đã được điều chỉnh cao, thay vì các so sánh nối tiếp một lần mà không phải là công nghệ tiên tiến nhất.

Điều đó nói rằng, công việc hiện tại là dành cho LP và có lẽ bạn đang yêu cầu người giải quyết lập trình phi tuyến (NLP), vì đó là IPOPT. Đây là những gì tôi biết về trường hợp người giải NLP:

Hầu hết các nghiên cứu dường như đang nghiên cứu về tính song song cho trường hợp bộ nhớ phân tán (đủ cứng). Có một số công việc về trường hợp bộ nhớ dùng chung cho bộ giải LP & QP, bởi vì công việc đó biến nó thành mã thương mại (ví dụ: Gurobi, CPLEX, Xpress). Công việc hiện tại rất thú vị, nhưng dường như chưa có gì hấp dẫn cho GPU, ngoại trừ các ứng dụng đặc biệt (ví dụ: học máy, bạn có thể sử dụng các thuật toán khác nhau phù hợp hơn với GPU).


Song song IPM 'cho LP sôi sục để song song hóa hệ số Cholesky thưa thớt. Đây không phải là một vấn đề được lưu tốt, đặc biệt là trên GPU. Song song hóa các phương thức đơn giản cho LP khó hơn nhiều và có rất ít công việc hữu ích trong lĩnh vực đó - nếu bạn muốn giải quyết song song LP quy mô lớn, có lẽ bạn sẽ muốn sử dụng IPM.
Brian Borchers

1
Đối với SDP, ma trận phải được xác định trong mỗi lần lặp thường dày đặc nhất và hệ số Cholesky song song tốt trên một bộ nhớ dùng chung. Việc xây dựng ma trận này cũng khá dễ dàng để song song. Do đó, có thể tăng tốc độ song song khá tốt trên bộ xử lý đa bộ nhớ dùng chung với phương pháp điểm bên trong cho SDP với số lượng bộ xử lý lên tới khoảng 64 (theo như tôi đã đi.)
Brian Borchers

cuSolver là bộ giải quyết CUDA của NVIDIA, và nó cung cấp API như csrlsvchol mà là dựa trên Cholesky thừa docs.nvidia.com/cuda/cusolver
Andrew Hundt

@GeoffOxberry Một số liên kết không hoạt động.
T ....

1

Nói chung, tối ưu hóa phi tuyến rất khó để song song vì thuật toán bước của nó rất tuần tự. GPU chậm hơn CPU, do đó bạn chỉ nhận được tốc độ nếu bạn gặp vấn đề như một thứ gì đó rất song song (tức là hàng ngàn luồng). Do đó, tôi sẽ không mong đợi nhiều về việc tăng tốc (hoặc bất kỳ, nó thường có thể chậm hơn) bằng cách đặt bộ giải phi tuyến trên GPU. Đó rất có thể là lý do tại sao không ai làm tốt điều đó và hầu hết mọi người sẽ không thử nó.

Mặt khác, nếu các chức năng mục tiêu và ràng buộc của bạn có thể được tính theo kiểu song song (hoặc véc tơ), bạn có thể tăng tốc lớn bằng cách giải quyết các chức năng mục tiêu / ràng buộc của mình trên GPU. Đây là một cách phổ biến để sử dụng GPU với tối ưu hóa phi tuyến vì nó sử dụng khả năng tăng tốc GPU trên phần khó nhất (và song song nhất) của mã, và do đó có lẽ là hiệu quả nhất.


1

Tôi đến bữa tiệc muộn một chút, nhưng câu trả lời ngắn gọn là có thể song song hóa phương pháp điểm bên trong cho GPU, nhưng việc đó có thành công hay không phụ thuộc vào cấu trúc của vấn đề. Về phần mềm hiện có, Optizelle có thể làm điều đó. Lấy chi nhánh phát triển cho đến khi một bản phát hành mới xảy ra trong tương lai gần.

Các tình huống hơi khác nhau tùy thuộc vào việc vấn đề ban đầu có chứa bất đẳng thức hay bất đẳng thức hay không. Có nhiều cách để làm điều này, nhưng theo tôi, cách tốt nhất để làm điều này cho các vấn đề chỉ với các ràng buộc bất bình đẳng là sử dụng phương pháp Newton trong vùng tin cậy không chính xác kết hợp với phương pháp điểm nội bộ kép nguyên thủy.

Chỉ đối với bất đẳng thức, phương pháp Newton vùng tin cậy không chính xác cơ bản có thể được tìm thấy trong Tối ưu hóa số của Nocedal và Wright ở trang 171 hoặc trên Phương thức vùng tin cậy của Conn, Gould và Toint trên trang 205. Thuật toán này có thể được kết hợp thành công với một số nguyên tố- Phương pháp điểm bên trong kép bằng cách sử dụng phương pháp cắt ngắn-CG đã sửa đổi từ trang 890 của bài viết Phương pháp điểm nội bộ để lập trình phi tuyến quy mô lớn của Byrd, Hribar và Nocedal. Cá nhân, tôi không thích cách họ thiết lập hệ thống điểm bên trong của họ, vì vậy tôi sẽ không sử dụng công thức điểm bên trong của họ, nhưng đó là sở thích. NITRO là một thuật toán tốt. Theo như chi tiết về điểm bên trong, hướng dẫn của Optizelle giải thích cách thực hiện điều này trong hướng dẫn sử dụng. Tôi có lẽ nên đăng một hướng dẫn cập nhật,

Đối với trường hợp có cả ràng buộc bất bình đẳng và bất đẳng thức, tôi tin rằng thuật toán tốt nhất là kết hợp phương pháp SQP bước hỗn hợp vùng tin cậy không chính xác từ Heinkenschoss và Ridzal trong một bài báo có tiêu đề Phương pháp SQP theo vùng tin cậy không ma trận để tối ưu hóa giới hạn bình đẳng. Về cơ bản, quá trình xử lý một phương pháp điểm bên trong hoạt động khá giống với trường hợp không bị ràng buộc ngoại trừ bước quasin normal cũng cần phải được bảo vệ.

Theo như các cơ hội song song, các thuật toán tôi tham chiếu ở trên hoạt động tốt bởi vì các thuật toán này có thể được thực hiện không có ma trận. Cụ thể, triển khai của Optizelle cho vấn đề này

minxX{f(x):g(x)=0,h(x)0}

Yêu cầu người dùng cung cấp một triển khai cho

  • f(x),f(x),2f(x)x

  • g(x),g(x)x,g(x)y,(g(x)x)y

  • h(x),h(x)x,h(x)y,(h(x)x)y

Nó không quan tâm những việc triển khai này đến từ đâu hoặc làm thế nào song song hóa chúng. Chúng có thể được thực hiện trong bộ nhớ dùng chung, bộ nhớ phân tán hoặc GPU. Không quan trọng. Những gì hoạt động tốt nhất cho một vấn đề cụ thể, phụ thuộc vào cấu trúc. Ngoài ra, nó yêu cầu người dùng cung cấp đại số tuyến tính cho

  • init: Memory allocation and size setting
  • copy: y <- x (Shallow. No memory allocation.)
  • scal: x <- alpha * x
  • axpy: y <- alpha * x + y
  • innr: innr <- <x,y>
  • zero: x <- 0
  • rand: x <- random
  • prod: Jordan product, z <- x o y
  • id: Identity element, x <- e such that x o e = x
  • linv: Jordan product inverse, z <- inv(L(x)) y where L(x) y = x o y
  • barr: Barrier function, barr <- barr(x) where x o grad barr(x) = e
  • srch: Line search, srch <- argmax {alpha \in Real >= 0 : alpha x + y >= 0} where y > 0
  • symm: Symmetrization, x <- symm(x) such that L(symm(x)) is a symmetric operator

Các hoạt động này có thể được thực hiện trong bộ nhớ nối tiếp, song song, bộ nhớ phân tán, bộ nhớ dùng chung hoặc trên GPU. Không quan trọng. Điều gì tốt nhất phụ thuộc vào cấu trúc vấn đề.

Cuối cùng, có các hệ thống tuyến tính và có ba hệ thống có thể được cung cấp:

  • Điều kiện tiên quyết cho2f(x)
  • Điều kiện tiên quyết còn lại chog(x)g(x)
  • Điều kiện tiên quyết bên phải chog(x)g(x)

Mỗi điều kiện tiên quyết này có thể được thực hiện theo bộ nhớ nối tiếp hoặc song song, bộ nhớ phân tán hoặc chia sẻ hoặc trên GPU. Về cơ bản, điều kiện tiên quyết đầu tiên là điều kiện tiên quyết cho hệ thống CG bị cắt cụt liên quan đến các hệ thống tối ưu. Hai điều kiện tiên quyết cuối cùng được sử dụng cho hệ thống tăng cường giải quyết liên quan đến thuật toán SQP bước tổng hợp. Nói chung, đây là nơi bạn sẽ tăng hiệu suất lớn nhất. Hãy tưởng tượng nếu ràng buộc đại diện cho một số loại PDE. Sau đó, điều kiện tiên quyết cho tương ứng với một giải pháp PDE chuyển tiếp theo sau là một giải pháp PDE bổ trợ. Lưu ý, nếu chúng là hình vuông,gg(x)g(x)(g(x)g(x))1=g(x)g(x)1. Đối với một số lượng lớn các công thức PDE, chẳng hạn như các phương pháp sai phân hữu hạn với các tích hợp thời gian rõ ràng, các giải pháp này có thể được song song rất tốt trên GPU.

Cuối cùng, các thuật toán trong Optizelle thực hiện các bài toán về hình nón đối xứng, bao gồm các ràng buộc, hình nón bậc hai và các ràng buộc semidefinite. Tuy nhiên, nói chung, các hình nón tuyến tính sẽ có xu hướng thực hiện nó. Về cơ bản, các giải pháp hình nón tuyến tính có thể làm giảm tính khả thi và khả năng tối ưu hóa được thực hiện đối với một hệ thống thực sự nhỏ gọn có thể được Choleski bao gồm. Vì Optizelle hoạt động với các hệ thống phi tuyến, nên nó thực sự không thể làm được điều đó. Ít nhất, tôi không biết làm thế nào. Trên hết, có những hạn chế về kích thước của các khối SDP mà Optizelle có thể xử lý. Nhà điều hànhlinvở trên đòi hỏi nghịch đảo của ma trận SDP và nghịch đảo đó thực sự tốn kém cho các khối lớn. Ngoài ra, có thêm một người bảo vệ an toàn đòi hỏi phải có nhân tố Choleski. Những yếu tố này không thực sự song song tốt trên GPU. Ít nhất, tôi không biết về một triển khai song song tốt. Dù sao, điểm mấu chốt là nếu đó là chương trình hình nón tuyến tính, hãy sử dụng bộ giải hình nón tuyến tính như CSDP hoặc SDPT3.

TLDR; Sử dụng Optizelle . Nó miễn phí, mã nguồn mở và BSD được cấp phép. Tôi đã nhân rộng nó thành một nửa tỷ biến và nó hoạt động tốt. Tôi đã chạy nó với GPU và nó hoạt động tốt. Việc nó có hoạt động tốt với GPU hay không phụ thuộc vào việc các hoạt động trên có song song tốt với GPU hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.