ประโยชน์ของการแยกไฟล์ tfrecord ออกมาคืออะไร?


17

ฉันกำลังทำงานเกี่ยวกับการจดจำเสียงด้วย Tensorflow และวางแผนที่จะฝึกอบรม LSTM NN ด้วยชุดข้อมูลคลื่นขนาดใหญ่ เนื่องจากประสิทธิภาพที่เพิ่มขึ้นฉันวางแผนที่จะใช้ tfrecords มีตัวอย่างหลายอย่างในอินเทอร์เน็ต (Inception for ex.) ที่ไฟล์ tfrecords ถูกแบ่งออกเป็นเศษ คำถามของฉันคืออะไรประโยชน์ของการมีไฟล์ tfrecords เป็นชิ้น? มีการเพิ่มประสิทธิภาพใด ๆ ของการแยกนี้หรือไม่?

คำตอบ:


11

ในการค้นคว้าถึงประโยชน์ของการแยกไฟล์หลาย ๆ ไฟล์คำตอบที่สมเหตุสมผลเพียงอย่างเดียวนั้นมาจากหนึ่งใน Google folks

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

โปรดทราบว่าตอนนี้คุณไม่จำเป็นต้องสลับก่อนบันทึกเพราะ (ปัจจุบัน) วิธีที่แนะนำในการอ่าน TFRecords ใช้วิธีการที่tf.data.TFRecordDatasetมีประโยชน์มาก.shuffle()


2
.shuffle()เมธอดไม่ใช่โซลูชันที่เหมาะสมถ้าคุณมีไฟล์ tfrecord ขนาดใหญ่หนึ่งไฟล์ เอาท์พุทแบบสับจะค่อนข้างเกี่ยวข้องกับคำสั่งเดิมถ้าคุณไม่ได้ใช้ขนาดบัฟเฟอร์ขนาดใหญ่ ฉันคิดว่าการสับเปลี่ยนข้อมูลก่อนบันทึกเป็น tfrecord หรือแยกเป็นส่วนที่จำเป็นเมื่อคุณมีชุดข้อมูลขนาดใหญ่
Bruce Chou

7

สำหรับผู้ที่ยังสงสัย: มันคือเพื่อให้คุณสามารถสลับข้อมูลของคุณได้ ด้วย TFrecords ของคุณในหนึ่งไฟล์คุณจะไม่สามารถสลับคำสั่งซื้อได้ โดยทั่วไปสิ่งนี้จำเป็นสำหรับ SGD

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

ทางเลือกคือสับเปลี่ยนข้อมูลของคุณล่วงหน้าด้วยการทำซ้ำหรือไม่ใช้ TFRecords เลย


4

การแบ่งไฟล์ TFRecord เป็นส่วนช่วยให้คุณสลับชุดข้อมูลขนาดใหญ่ที่ไม่พอดีกับหน่วยความจำ

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

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

อีกวิธีหนึ่งคือการอ่านตัวอย่างการฝึกอบรมตามลำดับจากไฟล์ TFRecord ขนาดใหญ่หนึ่งไฟล์และสุ่มตัวอย่างในหน่วยความจำโดยใช้บัฟเฟอร์แบบสุ่ม อย่างไรก็ตามโดยทั่วไปแล้วบัฟเฟอร์การสับเปลี่ยนไม่สามารถมีขนาดใหญ่กว่าหน่วยความจำ DDR ที่มีให้สำหรับ CPU ของคุณ และหากบัฟเฟอร์แบบสุ่มมีขนาดเล็กกว่าชุดข้อมูลของคุณอย่างมากอาจไม่สามารถสลับข้อมูลได้อย่างเพียงพอ ข้อมูลอาจมีการสับ "ในเครื่อง" แต่ไม่สามารถสลับแบบ "ทั่วโลก" ได้ นั่นคือตัวอย่างจากจุดเริ่มต้นของชุดข้อมูลอาจไม่ได้สับด้วยตัวอย่างจากจุดสิ้นสุดของชุดข้อมูล

ทางออกที่ดีคือการใช้การผสมผสานที่สมดุลของสองวิธีข้างต้นโดยแยกชุดข้อมูลของคุณออกเป็นไฟล์ TFRecord หลายไฟล์ (เรียกว่าเศษ) ในระหว่างแต่ละยุคคุณสามารถสลับชื่อไฟล์ shard เพื่อรับ shuffling ทั่วโลกและใช้ shuffle buffer เพื่อรับ shuffling ในเครื่อง ความสมดุลที่ดีจะทำให้เศษมีขนาดใหญ่พอที่จะป้องกันปัญหาความเร็วดิสก์ แต่จะทำให้เศษเล็ก ๆ พอที่จะอนุญาตให้มีการสับแบบสับเปลี่ยนโดยบัฟเฟอร์แบบสุ่ม

นี่คือขั้นตอนที่แน่นอน:

  1. วางตัวอย่างการฝึกอบรมทั้งหมดลงในไฟล์ TFRecord หลายไฟล์ (เศษ)
  2. ที่จุดเริ่มต้นของแต่ละยุคให้สลับรายชื่อไฟล์ที่มีชาร์ด
  3. อ่านตัวอย่างการฝึกอบรมจากเศษและส่งตัวอย่างผ่านบัฟเฟอร์แบบสุ่ม โดยทั่วไปบัฟเฟอร์ shuffle ควรมีขนาดใหญ่กว่าขนาดของ shard เพื่อให้แน่ใจว่ามีการสับที่ดีข้ามเศษ
  4. ส่งตัวอย่างที่สับเข้าไปในกระบวนการฝึกอบรมของคุณ

3

การแบ่งไฟล์ TFRecords ออกเป็นหลายส่วนมีข้อดี 3 ประการ:

  1. ง่ายต่อการสับเปลี่ยน ตามที่คนอื่น ๆ ชี้ให้เห็นมันทำให้การสับเปลี่ยนข้อมูลในระดับหยาบนั้นเป็นเรื่องง่าย (ก่อนที่จะใช้บัฟเฟอร์แบบสุ่ม)
  2. ได้เร็วขึ้นเพื่อดาวน์โหลด หากไฟล์ถูกกระจายไปในหลาย ๆ เซิร์ฟเวอร์การดาวน์โหลดหลายไฟล์จากเซิร์ฟเวอร์ที่แตกต่างกันในแบบขนานจะช่วยเพิ่มประสิทธิภาพการใช้แบนด์วิดท์ (แทนที่จะดาวน์โหลดไฟล์เดียวจากเซิร์ฟเวอร์เดียว) สิ่งนี้สามารถปรับปรุงประสิทธิภาพได้อย่างมากเมื่อเทียบกับการดาวน์โหลดข้อมูลจากเซิร์ฟเวอร์เดียว
  3. ง่ายในการจัดการ ง่ายต่อการจัดการกับไฟล์ 10,000 ไฟล์แต่ละไฟล์ 100MB แทนที่จะเป็นไฟล์ 1TB เดียว ไฟล์ขนาดใหญ่อาจเป็นปัญหาในการจัดการ: โดยเฉพาะอย่างยิ่งการถ่ายโอนมีแนวโน้มที่จะล้มเหลว นอกจากนี้ยังยากที่จะจัดการกับชุดย่อยของข้อมูลเมื่อทุกอย่างอยู่ในไฟล์เดียว
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.