การทำนายความต้องการหน่วยความจำ CPU และ GPU ของการฝึกอบรม DNN


10

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

เป็นตัวอย่างให้พิจารณาโมเดล (ไม่เกิดขึ้นอีก) กับอินพุตของมิติ 1000, เลเยอร์ซ่อนเร้นเชื่อมต่อเต็ม 100 มิติ 4 และเลเยอร์เอาต์พุตเพิ่มเติมของมิติ 10 ขนาดมินิแบทช์คือ 256 ตัวอย่าง วิธีการหนึ่งกำหนดรอยเท้าหน่วยความจำโดยประมาณ (RAM) ของกระบวนการฝึกอบรมบน CPU และ GPU ถ้ามันสร้างความแตกต่างลองสมมติว่ารุ่นนั้นได้รับการฝึกฝนบน GPU ด้วย TensorFlow (เช่นใช้ cuDNN)

คำตอบ:


3

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

ในการวิเคราะห์ตัวอย่างของคุณ:

  1. อินพุตต้องการองค์ประกอบ 1000 รายการ
  2. หลังจากเลเยอร์ 1-4 เลเยอร์คุณมี 100 องค์ประกอบรวม ​​400 รายการ
    1. หลังจากชั้นสุดท้ายคุณมี 10 องค์ประกอบ

รวมทั้งหมด 1 ตัวอย่างคุณต้องการ 1,400 องค์ประกอบสำหรับผ่านไปข้างหน้า ยกเว้นสำหรับการป้อนข้อมูลที่คุณยังจำเป็นต้องมีข้อมูลเกี่ยวกับการไล่ระดับสีแต่ละของพวกเขาสำหรับการส่งผ่านย้อนหลังที่เป็น 410 มากขึ้นรวมเป็นเงินทั้งสิ้น1,820 องค์ประกอบต่อตัวอย่าง ทวีคูณด้วยขนาดแบทช์เพื่อรับ 465 920

ฉันพูดว่า "องค์ประกอบ" เนื่องจากขนาดที่ต้องการต่อองค์ประกอบนั้นขึ้นอยู่กับชนิดข้อมูลที่ใช้ สำหรับความแม่นยำเดียวfloat32คือ 4B และหน่วยความจำทั้งหมดที่จำเป็นในการจัดเก็บ blobs ข้อมูลจะอยู่ที่ประมาณ 1.8MB


1

ฉันเห็นสองตัวเลือก:

  1. เครือข่ายถูกโหลดจากดิสก์
  2. เครือข่ายถูกสร้างขึ้นทันที

ในทั้งสองกรณีขนาดของหน่วยความจำใน GPU จะต้องคูณด้วยขนาดแบตช์เนื่องจากเครือข่ายส่วนใหญ่จะถูกคัดลอกสำหรับแต่ละตัวอย่าง

Rule of Thumb หากโหลดจากดิสก์: หาก DNN ใช้ X MB บนดิสก์เครือข่ายจะเป็น 2 เท่าในหน่วยความจำ GPU สำหรับขนาดแบตช์ 1

เครือข่ายถูกสร้างขึ้นอย่างรวดเร็วสำหรับขนาดแบตช์ 1: นับพารามิเตอร์และคูณด้วย 4 ไบต์ (float32 บิต): การนับจำนวนพารามิเตอร์ด้วยตนเอง: fc1: 1000x100 (น้ำหนัก) + 100 (อคติ) fc2: 100x100 (น้ำหนัก) + 100 (อคติ) fc3: 100x100 (น้ำหนัก) + 100 (อคติ) fc4: 100x100 (น้ำหนัก) + 100 เอาท์พุท (อคติ): 100x10 (น้ำหนัก) + 10 (อคติ)

การนับจำนวนพารามิเตอร์โดยใช้ Keras: model.count_params ()


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

1
@ วิธีนี้ถูกต้องสำหรับการฝึกอบรมตามปกติคุณต้องมีหน่วยความจำในการจัดเก็บน้ำหนักการเปิดใช้งานในการส่งต่อไปข้างหน้าและการไล่ระดับสีในการส่งกลับด้านหลัง (3x หน่วยความจำแม้ไม่มีแรงผลักดัน)
mjul

@mjul การทดลองของฉันแสดงการประมาณการของ 4.5x ik_vision ฉันเข้าใจเหตุผลหลัง 3x แต่ฉันไม่แน่ใจว่าทำไมในทางปฏิบัติมันใช้ 4.5x ต้องมีค่าใช้จ่ายอื่นของ Keras / TF ??
Wes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.