การแก้ปัญหาการเพิ่มประสิทธิภาพที่ไม่เชิงเส้นแบบไม่มีข้อ จำกัด บน GPU


18

ฉันกำลังพยายามแก้ปัญหาการเพิ่มประสิทธิภาพแบบไม่เชิงเส้นที่ไม่มีข้อ จำกัด บน GPU (CUDA)

ฟังก์ชันวัตถุประสงค์เป็นฟังก์ชันที่ไม่เชิงเส้นอย่างราบรื่นและการไล่ระดับสีนั้นค่อนข้างถูกในการคำนวณเชิงวิเคราะห์ดังนั้นฉันไม่จำเป็นต้องกังวลกับการประมาณเชิงตัวเลข

ฉันต้องการที่จะแก้ปัญหานี้โดยส่วนใหญ่ fp32 maths ops (ด้วยเหตุผลต่าง ๆ ) ดังนั้นวิธีการเพิ่มประสิทธิภาพแบบไม่เชิงเส้นที่มีประสิทธิภาพมากขึ้นเมื่อเทียบกับข้อผิดพลาดในการปัดเศษขึ้นในขณะที่มีประสิทธิภาพที่ดี? (เช่นคอนจูเกตการไล่ระดับสี / เสมือนนิวตัน / ภูมิภาคที่เชื่อถือได้) มีใครเคยลองใช้ BFGS บน GPU ด้วยผลลัพธ์ที่ดีหรือไม่?

BTW, Hessian ถ้าจำเป็นมีขนาดค่อนข้างเล็กในกรณีของฉัน (โดยทั่วไป <64x64) แต่ฉันต้องแก้ปัญหาการเพิ่มประสิทธิภาพขนาดเล็กหลายพันรายการพร้อมกันนี้


4
ด้วยขนาดที่เล็กของปัญหาของคุณฉันไม่คิดว่าตัวเลือกเฉพาะของอัลกอริทึม (เช่น BFGS) จะเป็นความท้าทายที่สำคัญที่สุดของคุณ แต่จะลดค่าใช้จ่ายการสื่อสารของ CPU <-> ให้น้อยที่สุด อาจเป็นวิธีที่ดีที่สุดในการแก้ไขปัญหาของคุณควบคู่ไปกับ GPU โหลดพวกมันทั้งหมดพร้อมกันแก้ปัญหาทั้งหมดในครั้งเดียวดาวน์โหลดผลลัพธ์ทั้งหมดในครั้งเดียว ฉันไม่มีคำแนะนำเฉพาะเกี่ยวกับอัลกอริทึม แต่ฉันจะบอกว่า GPU ดีกว่าลูปมากกว่ากับสาขา
Michael Grant

1
@Michael C. Grant: ค่าโสหุ้ยการสื่อสารสามารถถูกซ่อนได้โดยการคำนวณในกรณีของฉันดังนั้นมันจึงไม่ใช่คอขวดฉันมีแนวโน้มที่จะใช้ BFGS หน่วยความจำ จำกัด หรือ BFGS มาตรฐานที่นี่ แต่ไม่แน่ใจว่ามี แนวทางที่ดีกว่า
user0002128

บางคนดำเนินการLBFGS กับ CUDA
BenC

คำตอบ:


8

ฉันได้ใช้งานตัวแก้ปัญหาแบบไม่เชิงเส้นบน GPU รวมถึง LBFGS, Barzilai Borwein gradient descent และการไล่ระดับสีคอนจูเกตที่ไม่ใช่เชิงเส้นค่อนข้างหลากหลาย

สำหรับสิ่งนี้การไล่ระดับสีแบบคอนจูเกตแบบไม่เชิงเส้นของ Dai & Yuanนั้นมีประสิทธิภาพมากที่สุด โดยทั่วไปรุ่นอื่น ๆ ของการไล่ระดับสีแบบคอนจูเกตแบบไม่เชิงเส้นอาจมีประสิทธิภาพมากกว่า (เช่น CG-DESCENT) แต่อาจมีเล่ห์เหลี่ยมในการใช้งาน

LBFGS โดยทั่วไปแล้วเป็นตัวเลือกที่ดีมากและถ้าคุณไม่ได้คาดเข็มขัดไว้สำหรับความทรงจำมันอาจเป็นจุดเริ่มต้นที่ดีที่สุด

ทั้งการไล่ระดับสีคอนจูเกตและ BFGS ต้องการการค้นหาบรรทัดซึ่งเป็นที่ที่ fp32 กลายเป็นปัญหา แทนที่จะใช้เงื่อนไขวูล์ฟมาตรฐานสำหรับการค้นหาสายผมจะแนะนำให้ใช้ประมาณสภาพวูล์ฟแนะนำที่นี่ กระดาษมีส่วนเกี่ยวข้องน้อย แต่สิ่งที่สำคัญคือสมการ 4.1 โดยพื้นฐานแล้วพวกเขาแนะนำความแม่นยำอย่างชัดเจนซึ่งคุณสามารถคำนวณฟังก์ชันของคุณได้

ข้อควรพิจารณาสำหรับ GPU:

คุณมีปัญหาเล็ก ๆ มากมายซึ่งแตกต่างจากกรณีการใช้งานของฉันเล็กน้อยของปัญหาใหญ่ ลองใช้ 1 ปัญหาต่อ GPU block (หรือ warp,) ถ้าคุณสามารถขนานฟังก์ชั่นและการประเมินผลการไล่ระดับสีเพื่อใช้เธรดทั้งหมดในบล็อก ด้วยวิธีนี้ไม่ใช่ปัญหาหากปัญหาที่แตกต่างต้องใช้การวนซ้ำหลายครั้ง

หากนี่ไม่ใช่ตัวเลือกฉันจะไปกับ LBFGS solver หากฟังก์ชั่นของคุณทำงานได้ดีคุณอาจหายไปได้ง่ายๆด้วยการใช้ขนาดขั้นตอนที่ 1 (หลีกเลี่ยงการค้นหาบรรทัด) และเรียกใช้ปัญหาทั้งหมดสำหรับการวนซ้ำที่แน่นอน


0

ฉันขอแนะนำให้คุณใช้ Levenberg Marquardt (ตัวแปรภูมิภาคที่เชื่อถือได้) เนื่องจากมันถูกใช้ในแอปพลิเคชั่นที่ใช้งานได้จริงและแสดงให้เห็นถึงประสิทธิภาพความเร็วและความแม่นยำที่ดีมาก ยิ่งไปกว่านั้นสำหรับ GPU มีห้องสมุดบางแห่ง (เช่น cuLM https://github.com/zitmen/cuLM ) ซึ่งคุณสามารถลองใช้ได้ หากพวกเขาไม่ทำงานมีทรัพยากรมากมายให้คุณใช้ การใช้ LM นั้นไม่ยากเลย คุณควรระมัดระวังเกี่ยวกับการลดการสื่อสาร GPU ให้น้อยที่สุด วิธีรับแนวคิดสั้น ๆ :

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


2
Levenberg-Marquart สำหรับสี่เหลี่ยมที่ไม่เชิงเส้นอย่างน้อย ฉันไม่คิดว่าเขา / เธอพูดอะไรเกี่ยวกับสี่เหลี่ยมจัตุรัสน้อยที่สุด
Kurt

0

บางทีขั้นตอนการหลอมแบบจำลองสามารถจัดการข้อผิดพลาดในการปัดเศษได้ดีขึ้น (และขนานกันได้ง่าย)

คุณเริ่มต้นด้วยตารางน้ำมันดิบของพื้นที่การค้นหาและพารามิเตอร์ "อุณหภูมิ" เริ่มต้น

ในแต่ละขั้นตอนคุณคำนวณคะแนนโซลูชันที่เป็นไปได้ (หนึ่งสามารถยอมรับจุดที่ไม่ใช่วิธีแก้ปัญหาด้วยความน่าจะเป็นบางอย่างที่ตรงกันข้ามกับอุณหภูมิ)

จากนั้นเก็บเฉพาะโซลูชันในขั้นตอนนั้นและเพิ่มอุณหภูมิซึ่งให้กริดที่ละเอียดยิ่งขึ้นสำหรับการวนซ้ำครั้งถัดไป

ทำสิ่งนี้จนกระทั่งอุณหภูมิ <ขีด จำกัด / ขีดจำกัดความแม่นยำที่กำหนด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.