Apa manfaat membagi file tfrecord ke dalam pecahan?


17

Saya sedang mengerjakan pengenalan suara dengan Tensorflow dan berencana untuk melatih LSTM NN dengan dataset gelombang besar. Karena keuntungan kinerja, saya berencana menggunakan tfrecords. Ada beberapa contoh di internet (Inception for ex.) Di mana file tfrecords dibagi menjadi pecahan. Pertanyaan saya adalah: apa manfaat memiliki file tfrecords ke dalam pecahan? Apakah ada penambahan kinerja tambahan dari pemisahan ini?

Jawaban:


11

Dalam meneliti manfaat pemisahan menjadi beberapa file, satu-satunya jawaban yang masuk akal datang dari salah satu orang Google.

Mereka mengatakan peningkatan kinerja dapat diabaikan, tetapi saya setuju bahwa pemisahan file dapat membantu, terutama jika Anda ingin mentransfer dataset ke lokasi lain.

Ingatlah bahwa sekarang Anda tidak perlu mengocok sebelum menyimpan, karena (saat ini) metode yang disarankan untuk membaca TFRecords menggunakan tf.data.TFRecordDatasetyang mengimplementasikan .shuffle()metode yang sangat berguna .


2
.shuffle()Metode bukan solusi ideal jika Anda memiliki satu file tfrecord besar. Output yang dikocok agak terkait dengan pesanan asli jika Anda tidak menggunakan ukuran buffer yang besar. Saya pikir pre-shuffle data sebelum menyimpan ke tfrecord atau membelah menjadi pecahan diperlukan ketika Anda memiliki dataset besar.
Bruce Chou

7

Bagi mereka yang masih bertanya-tanya: itu agar Anda dapat mengocok data Anda. Dengan TF record Anda dalam satu file, Anda tidak dapat mengacak pesanan. Ini biasanya diperlukan dengan SGD.

Namun, dengan pecahan, Anda dapat mengacak urutan pecahan yang memungkinkan Anda untuk memperkirakan pengacakan data seolah-olah Anda memiliki akses ke TFRecords individu. Ini jelas lebih baik daripada tidak sama sekali, dan jelas semakin banyak pecahan yang Anda miliki, semakin baik perkiraan ini.

Alternatifnya adalah pre-shuffle data Anda melalui menduplikasi atau tidak menggunakan TFRecords sama sekali.


4

Memisahkan file TFRecord ke dalam pecahan membantu Anda mengocok kumpulan data besar yang tidak akan masuk ke dalam memori.

Bayangkan Anda memiliki jutaan contoh pelatihan yang disimpan di disk dan Anda ingin berulang kali menjalankannya melalui proses pelatihan. Lebih jauh, anggaplah bahwa untuk setiap pengulangan data pelatihan (yaitu setiap zaman) Anda ingin memuat data dalam urutan yang benar-benar acak.

Satu pendekatan adalah memiliki satu file per contoh pelatihan dan menghasilkan daftar semua nama file. Kemudian pada awal setiap zaman, Anda mengacak daftar nama file dan memuat file-file individual. Masalah dengan pendekatan ini adalah Anda memuat jutaan file dari lokasi acak pada disk Anda. Ini bisa lambat terutama pada hard disk drive. Bahkan array RAID 0 tidak akan membantu dengan kecepatan jika Anda memuat jutaan file kecil dari lokasi acak. Masalahnya menjadi lebih buruk jika Anda mengakses file melalui koneksi jaringan.

Pendekatan lain adalah membaca contoh-contoh pelatihan secara berurutan dari satu file TFRecord besar dan mengocok contoh-contoh dalam memori menggunakan buffer shuffle. Namun, shuffle buffer biasanya tidak bisa lebih besar dari memori DDR yang tersedia untuk CPU Anda. Dan jika shuffle buffer secara signifikan lebih kecil dari dataset Anda, maka itu mungkin tidak cukup mengocok data. Data mungkin "dikocok" secara lokal tetapi tidak dikocok "secara global". Artinya, contoh-contoh dari awal dataset tidak boleh dikocok dengan contoh-contoh dari akhir dataset.

Solusi yang baik adalah dengan menggunakan kombinasi seimbang dari dua pendekatan di atas dengan memisahkan dataset Anda menjadi beberapa file TFRecord (disebut pecahan). Selama setiap zaman, Anda dapat mengocok nama file shard untuk mendapatkan pengocokan global dan menggunakan buffer pengocok untuk mendapatkan pengocokan lokal. Keseimbangan yang baik akan membuat shard cukup besar untuk mencegah masalah kecepatan disk tetapi akan membuat shard cukup kecil untuk memungkinkan pengocokan yang cukup oleh shuffle buffer.

Berikut langkah-langkahnya:

  1. Tempatkan secara acak semua contoh pelatihan ke dalam beberapa file TFRecord (pecahan).
  2. Di awal setiap zaman, kocok daftar nama file shard.
  3. Baca contoh pelatihan dari pecahan dan berikan contoh melalui buffer acak. Biasanya, shuffle buffer harus lebih besar dari ukuran shard untuk memastikan pengocokan shard yang baik.
  4. Masukkan contoh-contoh yang diacak ke dalam proses pelatihan Anda.

3

Membagi file TFRecords menjadi beberapa pecahan pada dasarnya memiliki 3 keuntungan:

  1. Lebih mudah mengocok . Seperti yang telah ditunjukkan orang lain, membuatnya mudah untuk mengocok data pada tingkat kasar (sebelum menggunakan penyangga acak).
  2. Lebih cepat mengunduh . Jika file tersebar di beberapa server, mengunduh beberapa file dari server berbeda secara paralel akan mengoptimalkan penggunaan bandwidth (daripada mengunduh satu file dari server tunggal). Ini dapat meningkatkan kinerja secara signifikan dibandingkan dengan mengunduh data dari satu server.
  3. Lebih mudah untuk dimanipulasi . Lebih mudah menangani 10.000 file masing-masing 100MB daripada dengan satu file 1TB. File-file besar dapat menjadi susah untuk ditangani: khususnya, transfer jauh lebih besar kemungkinannya gagal. Ini juga lebih sulit untuk memanipulasi himpunan bagian dari data ketika itu semua dalam satu file.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.