การเลือกระหว่าง CPU และ GPU สำหรับการฝึกอบรมเครือข่ายประสาท


29

ฉันเคยเห็นการอภิปรายเกี่ยวกับ 'ค่าใช้จ่าย' ของ GPU และสำหรับเครือข่าย 'เล็ก' จริง ๆ แล้วมันอาจจะเร็วกว่าในการฝึกอบรมบน CPU (หรือเครือข่ายของ CPU) กว่า GPU

'เล็ก' มีความหมายว่าอะไร?

ตัวอย่างเช่น MLP แบบชั้นเดียวที่มี 100 หน่วยที่ซ่อนอยู่จะเล็กหรือไม่

คำจำกัดความของเราเกี่ยวกับการเปลี่ยนแปลง 'เล็ก' สำหรับสถาปัตยกรรมที่เกิดขึ้นซ้ำหรือไม่?

มีเกณฑ์อื่น ๆ ที่ควรพิจารณาเมื่อตัดสินใจว่าจะฝึกใช้งาน CPU หรือ GPU หรือไม่?

แก้ไข 1:

ฉันเพิ่งพบโพสต์บล็อก (อาจล้าสมัยหรือไม่มันมาจาก 2014):

"... การ์ดเครือข่ายส่วนใหญ่จะใช้งานได้เฉพาะกับหน่วยความจำที่ลงทะเบียนกับ CPU เท่านั้นดังนั้น GPU กับ GPU ที่ถ่ายโอนระหว่างสองโหนดจะเป็นเช่นนี้: GPU 1 ถึง CPU 1 ไปยังการ์ดเครือข่าย 1 ถึงการ์ดเครือข่าย 2 ไปยัง CPU 2 ถึง GPU 2. สิ่งนี้หมายความว่าหากเลือกการ์ดเครือข่ายที่ช้าแล้วอาจไม่มีการเร่งความเร็วในคอมพิวเตอร์เครื่องเดียวถึงแม้จะมีการ์ดเครือข่ายที่รวดเร็วก็ตามถ้าคลัสเตอร์มีขนาดใหญ่ ถึง CPU ในขณะที่ GPU ทำงานเร็วเกินไปสำหรับการ์ดเครือข่ายที่จะทันกับมัน

นี่คือเหตุผลที่ บริษัท ใหญ่ ๆ อย่าง Google และ Microsoft ใช้ CPU แทนที่จะเป็นกลุ่ม GPU เพื่อฝึกอบรมเครือข่ายประสาทขนาดใหญ่ของพวกเขา "

ดังนั้นในบางจุดตามที่โพสต์นี้มันอาจจะเร็วกว่าที่จะใช้ซีพียู เป็นกรณีนี้หรือไม่?

แก้ไข 2: ใช่โพสต์บล็อกนั้นอาจล้าสมัยไปแล้วเพราะ:

ตอนนี้ดูเหมือนว่า GPUs ภายในโหนดจะเชื่อมต่อผ่านบัส PCIe ดังนั้นการสื่อสารสามารถเกิดขึ้นได้ที่ประมาณ 6GiB / s (ตัวอย่างเช่น: https://www.youtube.com/watch?v=el1iSlP1uOsประมาณ 35 นาที) ลำโพงบอกว่านี่เร็วกว่าการเปลี่ยนจาก GPU1 เป็น CPU ถึง GPU2 มันจะหมายถึงการ์ดเครือข่ายไม่มีคอขวดอีกต่อไป


ผู้ชายคนนั้นที่มีโพสต์บล็อกของเขานำมาซึ่งคะแนนที่ดี ฉันไม่เข้าใจเหตุผลทั้งหมดของเขา อย่างไรก็ตามความจริงที่ว่า Google, Facebook, Twitter และกลุ่มการเรียนรู้เชิงลึกชั้นนำทั้งหมดในสถาบันการศึกษาใช้รหัสของพวกเขาเป็นหลักใน GPUs แสดงให้เห็นว่ามันเป็นความคิดที่ดี แม้ว่าลำเอียง: nvidia.com/content/events/geoInt2015/LBrown_DL.pdf
JahKnows

คำตอบ:


28

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

'เล็ก' มีความหมายว่าอะไร? ตัวอย่างเช่น MLP แบบชั้นเดียวที่มี 100 หน่วยที่ซ่อนอยู่จะเล็กหรือไม่

ใช่ว่ามีขนาดเล็กมากตามมาตรฐานที่ทันสมัย ถ้าคุณไม่มี GPU ที่เหมาะอย่างยิ่งสำหรับการฝึกอบรม (เช่น NVIDIA 1080 หรือ NVIDIA Titan) ฉันจะไม่แปลกใจที่พบว่า CPU ของคุณเร็วขึ้น

โปรดทราบว่าความซับซ้อนของเครือข่ายนิวรัลของคุณนั้นขึ้นอยู่กับจำนวนฟีเจอร์อินพุตของคุณด้วยไม่ใช่แค่จำนวนยูนิตในเลเยอร์ที่ซ่อนอยู่ของคุณ หากเลเยอร์ที่ซ่อนอยู่ของคุณมี 100 หน่วยและการสังเกตแต่ละครั้งในชุดข้อมูลของคุณมีคุณสมบัติการป้อนข้อมูล 4 รายการแสดงว่าเครือข่ายของคุณมีขนาดเล็ก (ประมาณ 400 พารามิเตอร์) หากการสังเกตแต่ละครั้งมีคุณสมบัติอินพุต 1M เช่นเดียวกับในบริบททางการแพทย์ / เทคโนโลยีชีวภาพบางเครือข่ายของคุณค่อนข้างใหญ่ในแง่ของจำนวนพารามิเตอร์ สำหรับส่วนที่เหลือของคำตอบของฉันฉันสมมติว่าคุณมีคุณสมบัติการป้อนข้อมูลค่อนข้างน้อย การสังเกต

ตัวอย่างที่ดีอย่างหนึ่งที่ฉันได้พบเมื่อเปรียบเทียบประสิทธิภาพของ CPU กับ GPU คือเมื่อฉันฝึกฝนบอทโป๊กเกอร์โดยใช้การเรียนรู้การเสริมแรง เพื่อการเรียนรู้การเสริมแรงบ่อยครั้งที่คุณไม่ต้องการเลเยอร์จำนวนมากในโครงข่ายประสาทเทียมของคุณและเราพบว่าเราต้องการเพียงไม่กี่เลเยอร์ที่มีพารามิเตอร์เพียงเล็กน้อย นอกจากนี้จำนวนฟีเจอร์การป้อนข้อมูลก็ค่อนข้างต่ำ ตอนแรกฉันได้รับการฝึกฝนเกี่ยวกับ GPU (NVIDIA Titan) แต่มันใช้เวลานานมากในการเรียนรู้การเสริมความต้องการการทำซ้ำหลายครั้ง โชคดีที่ฉันพบว่าการฝึกอบรม CPU ของฉันทำให้การฝึกอบรมของฉันเร็วขึ้น 10 เท่า! นี่เป็นการบอกว่าบางครั้ง CPU อาจดีกว่าสำหรับการฝึกอบรม

มีเกณฑ์อื่น ๆ ที่ควรพิจารณาเมื่อตัดสินใจว่าจะฝึกใช้งาน CPU หรือ GPU หรือไม่?

สิ่งสำคัญคือให้สังเกตว่าในขณะที่อยู่บน GPU คุณจะต้องเติมหน่วยความจำ GPU ทั้งหมดโดยการเพิ่มขนาดแบทช์ของคุณซึ่งไม่ใช่กรณีของ CPU บน CPU การเพิ่มขนาดแบตช์จะเพิ่มเวลา pr ชุด ดังนั้นหากคุณจำเป็นต้องมีแบทช์ที่มีขนาดใหญ่มาก (เช่นเนื่องจากสัญญาณที่มีเสียงดังมาก) มันจะมีประโยชน์ในการใช้ GPU ฉันไม่ได้มีประสบการณ์นี้ในทางปฏิบัติและโดยปกติแล้วจะต้องการขนาดแบทช์ขนาดเล็ก


ขอบคุณ @pir! คุณมีเอกสารอ้างอิงเฉพาะที่ฉันสามารถอ่านเพิ่มเติมได้หรือไม่
StatsSorceress

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

3
ฉันไม่ได้เห็นการเปรียบเทียบ CPU / GPU จำนวนมากบนเครือข่ายขนาดเล็กเพราะนั่นไม่ใช่สิ่งที่ บริษัท ขนาดใหญ่และห้องปฏิบัติการวิจัยสนใจ
pir

@StatsSorceress หากคุณต้องการทดสอบด้วยตัวเองทำไมไม่เพียงแค่ติดตั้ง Keras MLP อย่างง่ายและทดสอบประสิทธิภาพของ GPU กับ CPU? นอกจากนี้โปรดดู wrt คำตอบที่ปรับปรุงของฉัน ขนาดของเครือข่ายของคุณ
pir

5

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

หากคุณใช้ภาษาการเขียนโปรแกรมยอดนิยมสำหรับการเรียนรู้ของเครื่องเช่น python หรือ MATLAB มันเป็นโค้ดซับโค้ดหนึ่งเดียวที่จะบอกคอมพิวเตอร์ของคุณว่าคุณต้องการให้การดำเนินการทำงานบน GPU ของคุณ

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


4
ฉันพบว่าบางครั้งค่าใช้จ่ายในการถ่ายโอนข้อมูลไปและกลับจาก GPU นั้นจะลดความเร็วที่เพิ่มขึ้นจากความขนาน ไม่ใช่ความคิดที่ดีเสมอไปที่ GPU
Adrian Keister

1
ขึ้นอยู่กับความซับซ้อนของโมเดลของคุณ หากคุณฝึกอบรม K-NN อย่างง่ายบางทีอาจจะไม่คุ้มค่า อย่างไรก็ตามหากคุณกำลังฝึกอบรมแบบจำลองใด ๆ ที่ต้องใช้เมทริกซ์ผกผันหรือเครือข่ายประสาทที่ต้องการการดำเนินการเมทริกซ์ที่ตามมาจำนวนมากจึงเป็นความคิดที่ดีที่จะเลือกใช้ GPU
JahKnows

1
@AdrianKeister ฉันเห็นด้วย นั่นคือสิ่งที่ฉันพยายามจะตอบ สำหรับเครือข่ายที่กล่าวถึงโดย OP ที่น่าจะเป็นคอขวด
pir

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

3

ฉันจะอ้างอิงคำพูดจากคำถามที่คล้ายกันก่อน:

เมื่อพูดถึงการทำงานของเมทริกซ์คุณไม่คิดสองครั้งคุณเลือกใช้ GPU เสมอ แหล่ง

สถาปัตยกรรมคู่ขนานใน GPU นั้นได้รับการปรับให้เข้ากับการทำงานของเวกเตอร์และเมทริกซ์ แหล่ง

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

เหตุผลที่คุณอาจอ่านว่าเครือข่าย 'เล็ก' ควรได้รับการฝึกอบรมด้วย CPU เนื่องจากการใช้การฝึกอบรม GPU สำหรับเครือข่ายขนาดเล็กอาจใช้เวลามากกว่าการฝึกอบรม CPU เพียงอย่างเดียว - นั่นไม่ได้หมายความว่า GPU จะช้าลง

เครือข่ายหน่วยที่ซ่อน 100 เครือข่ายขนาดเล็กฉันเรียกมันว่าเครือข่ายขนาดเล็กเมื่อเทียบกับเครือข่ายขนาดใหญ่ที่ลึก สถาปัตยกรรมที่เกิดขึ้นอีกครั้ง (ส่วนใหญ่) มีซิงก์มากกว่าฟีดไปข้างหน้าเครือข่ายดังนั้นหน่วยที่ซ่อน 100 RNN นั้นใหญ่กว่าหน่วย FFN ที่ซ่อนอยู่ 100 หน่วย


เป็นความจริงไหมถ้าคุณมี MLP ที่มีเลเยอร์ที่ซ่อนอยู่ 100 หน่วยนั่นมีพารามิเตอร์จำนวนเดียวกันกับ RNN มาตรฐานที่มี 100 หน่วยซ่อนเนื่องจากการแบ่งปันน้ำหนัก มันมี 'ซิงก์' มากขึ้น - มากกว่า 'การเปิดใช้งาน' - แต่จำนวนพารามิเตอร์เท่ากันใช่ไหม
StatsSorceress

ฉันไม่คุ้นเคยกับการแบ่งปันคำว่า 'น้ำหนัก' แต่ก็มีจำนวนเดียวกันของการเปิดใช้งาน แต่การเชื่อมต่อมากขึ้นดังนั้นพารามิเตอร์อื่น ๆ ...
โทมัส W

การแบ่งปันน้ำหนักหมายความว่าเมทริกซ์น้ำหนักจากเลเยอร์ที่ซ่อนอยู่ใน RNN ไปยังเลเยอร์ที่ซ่อนถัดไปนั้นเหมือนกัน มันเป็นเมทริกซ์ 'U' เดียวกันซึ่งจำลองแบบตลอดเวลา นอกจากนี้น้ำหนักจากอินพุตไปยังเลเยอร์ที่ซ่อนอยู่จะเหมือนกันตลอดเวลา
StatsSorceress

@StatsSorceress ฉันไม่คุ้นเคยกับการทำงานกับเมทริกซ์ ใช่เมทริกซ์น้ำหนักจากเลเยอร์ที่ซ่อนอยู่ไปยังชั้นถัดไปนั้นเหมือนกัน อย่างไรก็ตามมีการเชื่อมต่อรวมมากกว่า (เพราะเลเยอร์ยังสามารถเชื่อมต่อกับเลเยอร์ก่อนหน้าได้อีกด้วย) ผมไม่แน่ใจว่าวิธีการที่ฉันสามารถอธิบาย แต่ RNN มักจะมีพารามิเตอร์อื่น ๆ ที่มีชั้นเชื่อมต่อมากขึ้น ..
โทมัส W

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