Giải quyết các vấn đề tối ưu hóa phi tuyến không giới hạn trên GPU


18

Tôi đang cố gắng giải quyết một số vấn đề tối ưu hóa phi tuyến không giới hạn trên GPU (CUDA).

Hàm mục tiêu là một hàm phi tuyến trơn tru và độ dốc của nó tương đối rẻ để tính toán phân tích, vì vậy tôi không cần bận tâm đến xấp xỉ bằng số.

Tôi muốn giải quyết vấn đề này với các ops toán học chủ yếu là fp32 (vì nhiều lý do), vì vậy phương pháp tối ưu hóa phi tuyến nào mạnh hơn để chống lại các lỗi làm tròn trong khi có hiệu suất tốt? (ví dụ: gradient liên hợp / quasi newton / vùng tin cậy), có ai đã thử BFGS trên GPU với kết quả tốt chưa?

BTW, Hessian, nếu cần, tương đối nhỏ trong trường hợp của tôi (<64x64 điển hình), nhưng tôi cần giải quyết đồng thời hàng ngàn vấn đề tối ưu hóa quy mô nhỏ này.


4
Với quy mô nhỏ của các vấn đề của bạn, tôi không nghĩ rằng sự lựa chọn cụ thể của thuật toán (ví dụ: BFGS) sẽ là thách thức quan trọng nhất của bạn. Thay vào đó, nó sẽ giảm thiểu GPU <-> chi phí truyền thông CPU. Có lẽ cách tốt nhất để làm điều đó là giải quyết nhiều trường hợp vấn đề của bạn song song trên GPU. Tải tất cả chúng cùng một lúc, giải quyết tất cả chúng cùng một lúc, tải xuống tất cả các kết quả cùng một lúc. Tôi không có lời khuyên cụ thể về thuật toán, nhưng tôi sẽ nói rằng GPU tốt hơn với các vòng lặp so với các nhánh.
Michael Grant

1
@Michael C. Grant: Chà, chi phí liên lạc có thể bị ẩn bằng cách tính toán dễ dàng trong trường hợp của tôi, vì vậy nó không phải là nút cổ chai ở đó, tôi rất có xu hướng sử dụng BFGS bộ nhớ hạn chế hoặc BFGS tiêu chuẩn ở đây, nhưng không chắc có cách tiếp cận tốt hơn.
dùng0002128

Một số người đã triển khai LBFGS với CUDA .
BenC

Câu trả lời:


8

Tôi đã triển khai khá nhiều loại bộ giải phi tuyến tính trên GPU, bao gồm LBFGS, Barzilai Borwein và độ dốc liên hợp phi tuyến tính.

Đối với điều này, gradient liên hợp phi tuyến tính của Dai & Yuan là hiệu quả nhất. Nói chung, phiên bản khác của gradient liên hợp phi tuyến có thể hiệu quả hơn (như CG-DESCENT), nhưng cũng có thể khó thực hiện hơn.

LBFGS nói chung là một lựa chọn rất chắc chắn, và trừ khi bạn thực sự bị trói buộc vào bộ nhớ, đó có lẽ là nơi tốt nhất để bắt đầu.

Cả gradient liên hợp và BFGS đều yêu cầu tìm kiếm dòng, đó là nơi fp32 trở thành một vấn đề. Thay vì sử dụng các điều kiện Wolfe tiêu chuẩn cho tìm kiếm dòng, tôi sẽ đề nghị sử dụng điều kiện Wolfe gần đúng được đề xuất ở đây . Bài viết có một chút liên quan, nhưng điều quan trọng là phương trình 4.1. Về cơ bản họ giới thiệu rõ ràng độ chính xác mà bạn có thể tính toán hàm của mình.

Cân nhắc cho GPU:

Bạn có rất nhiều vấn đề nhỏ, hơi khác với trường hợp sử dụng của tôi về một vấn đề lớn. Xem xét việc chạy 1 vấn đề cho mỗi khối GPU (hoặc cong vênh), nếu bạn có thể song song hóa các đánh giá chức năng và độ dốc để sử dụng tất cả các luồng trong một khối. Theo cách đó, nó không phải là vấn đề nếu các vấn đề khác nhau đòi hỏi số lần lặp khác nhau.

Nếu đây không phải là một tùy chọn, tôi sẽ đi với bộ giải LBFGS. Nếu chức năng của bạn hoạt động tốt, bạn có thể thoát khỏi việc chỉ cần sử dụng kích thước bước 1 (tránh tìm kiếm dòng) và chỉ chạy tất cả các vấn đề cho một số lần lặp cố định.


0

Tôi khuyên bạn nên sử dụng Levenberg Marquest (một biến thể của vùng tin cậy) vì nó được sử dụng trong nhiều ứng dụng thực tế và thể hiện hiệu suất tốc độ so với độ chính xác rất tốt. Hơn nữa, đối với GPU có một số thư viện (ví dụ cuLM https://github.com/zitmen/cuLM ), bạn có thể dùng thử. Nếu họ không thực hiện công việc, có rất nhiều tài nguyên để bạn thực hiện. Thực hiện LM không khó chút nào. Bạn chỉ nên quan tâm đến việc giảm thiểu giao tiếp GPU. Để có được một ý tưởng ngắn gọn:

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


2
Levenberg-Marquart dành cho bình phương nhỏ nhất phi tuyến. Tôi không nghĩ anh ấy / cô ấy đã đề cập bất cứ điều gì về bình phương tối thiểu.
Kurt

0

Có thể một quy trình ủ mô phỏng có thể xử lý các lỗi làm tròn tốt hơn (và dễ dàng song song hóa).

Bạn bắt đầu với một lưới thô của khu vực tìm kiếm và tham số "nhiệt độ" ban đầu

Ở mỗi bước, bạn tính các điểm giải pháp khả thi (người ta cũng có thể chấp nhận các điểm không có giải pháp, với một số xác suất tương tự nghịch với nhiệt độ)

Sau đó chỉ giữ lại các giải pháp ở bước đó và tăng nhiệt độ cung cấp lưới hạt mịn hơn cho lần lặp tiếp theo

Làm điều này cho đến khi nhiệt độ <giới hạn / ngưỡng chính xác nhất định

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.