Tfrecord dosyasını parçalara bölmenin faydası nedir?


17

Tensorflow ile konuşma tanıma üzerinde çalışıyorum ve LSTM NN'yi büyük dalgalar veri kümesiyle eğitmeyi planlıyorum. Performans artışları nedeniyle tfrecord kullanmayı planlıyorum. İnternette tfrecords dosyalarının parçalara bölündüğü birkaç örnek vardır (örn. Inception). Benim sorum: tfrecords dosyasını parçalara ayırmanın yararı nedir? Bu bölünmenin ek performans kazancı var mı?

Yanıtlar:


11

Birden çok dosyaya bölünmenin yararlarını araştırırken, tek makul yanıt Google insanlarından birinden geldi.

Performans kazançlarının ihmal edilebilir olduğunu söylediler, ancak özellikle de veri kümesini başka bir konuma aktarmak istiyorsanız dosyaları bölmenin yardımcı olabileceğini kabul ediyorum.

Şimdi kaydetmeden önce karıştırmanız gerekmediğini unutmayın, çünkü (şu anda) TFRecords'u okumak için önerilen yöntem tf.data.TFRecordDatasetçok kullanışlı bir .shuffle()yöntem uygulamaktadır .


2
.shuffle()büyük bir tfrecord dosyanız varsa yöntem ideal bir çözüm değildir. Karıştırılmış çıktı, büyük bir arabellek boyutu kullanmıyorsanız orijinal siparişle bir miktar ilişkilidir. Büyük bir veri kümeniz olduğunda, tfrecord'a kaydetmeden veya parçalara bölmeden önce verileri önceden karıştırmak gerektiğini düşünüyorum.
Bruce Chou

7

Hala merak edenler için: verilerinizi karıştırabilirsiniz. TFrecord'larınız tek bir dosyada olduğunda, siparişi karıştıramazsınız. Bu genellikle SGD için gereklidir.

Bununla birlikte, kırıklarla, ayrı TFRecord'lara erişiminiz varmış gibi verileri karıştırmaya yaklaşık olarak izin vermenizi sağlayan kırıkların sırasını karıştırabilirsiniz. Bu açıkça hiç yoktan iyidir ve ne kadar çok parçaya sahip olursanız bu yaklaşım o kadar iyi olur.

Alternatif, verilerinizi çoğaltarak önceden karıştırmak veya TFRecords'u hiç kullanmamaktır.


4

TFRecord dosyalarını kırıklara bölmek, belleğe sığmayan büyük veri kümelerini karıştırmanıza yardımcı olur.

Diskte kayıtlı milyonlarca eğitim örneğiniz olduğunu ve bunları bir eğitim süreci boyunca tekrar tekrar çalıştırmak istediğinizi düşünün. Ayrıca, egzersiz verilerinin her tekrarında (yani her bir çağda) verileri tamamen rastgele bir sırada yüklemek istediğinizi varsayalım.

Bir yaklaşım, eğitim örneği başına bir dosyaya sahip olmak ve tüm dosya adlarının bir listesini oluşturmaktır. Daha sonra her dönemin başında dosya adları listesini karıştırır ve dosyaları tek tek yüklersiniz. Bu yaklaşımdaki sorun, diskinizdeki rastgele konumlardan milyonlarca dosya yüklemenizdir. Bu özellikle bir sabit disk sürücüsünde yavaş olabilir. Rastgele konumlardan milyonlarca küçük dosya yüklerseniz bir RAID 0 dizisi bile hızda yardımcı olmaz. Bir ağ bağlantısı üzerinden dosyalara erişiyorsanız sorun daha da kötüleşir.

Diğer bir yaklaşım, eğitim örneklerini büyük bir TFRecord dosyasından sırayla okumak ve bir karıştırma tamponu kullanarak bellekteki örnekleri karıştırmaktır. Ancak, karıştırma arabelleği genellikle CPU'nuzun kullanabileceği DDR belleğinden daha büyük olamaz. Karıştırma arabelleği, veri kümenizden önemli ölçüde daha küçükse, verileri yeterince karıştırmayabilir. Veriler "yerel olarak" karıştırılabilir, ancak "global olarak" karıştırılamaz. Yani, veri kümesinin başlangıcından örnekler veri kümesinin sonundan örneklerle karıştırılamaz.

İyi bir çözüm, veri kümenizi birden çok TFRecord dosyasına (parça adı verilir) bölerek yukarıdaki iki yaklaşımın dengeli bir kombinasyonunu kullanmaktır. Her çağda, küresel karıştırma elde etmek için parça dosya adlarını karıştırabilir ve yerel karıştırma için bir karıştırma arabelleği kullanabilirsiniz. İyi bir denge, parçaların disk hızı sorunlarını önleyecek kadar büyük olmasını sağlar, ancak parçaları bir arabellekle yeterince karıştırmaya izin verecek kadar küçük tutar.

İşte tam adımlar:

  1. Tüm eğitim örneklerini rastgele birden fazla TFRecord dosyasına (kırık) yerleştirin.
  2. Her dönemin başında, kırık dosya adları listesini karıştırın.
  3. Kırıklardan eğitim örneklerini okuyun ve örnekleri bir karıştırma tamponundan geçirin. Tipik olarak, karıştırma tamponu, kırıklar arasında iyi karıştırma sağlamak için parça boyutundan daha büyük olmalıdır.
  4. Karıştırılmış örnekleri eğitim sürecinize aktarın.

3

Bir TFRecords dosyasını birden çok parçaya bölmenin temelde 3 avantajı vardır:

  1. Karıştırmak daha kolay . Diğerlerinin işaret ettiği gibi, verilerin kaba bir seviyede karıştırılmasını kolaylaştırır (bir karıştırma tamponu kullanmadan önce).
  2. İndirmek için daha hızlı . Dosyalar birden çok sunucuya yayılmışsa, paralel olarak farklı sunuculardan birkaç dosya indirmek bant genişliği kullanımını optimize eder (tek bir sunucudan bir dosya indirmek yerine). Bu, verileri tek bir sunucudan indirmeye kıyasla performansı önemli ölçüde artırabilir.
  3. Manipüle etmek daha basit . Tek bir 1TB dosyası yerine her biri 100 MB'lık 10.000 dosya ile uğraşmak daha kolaydır. Büyük dosyaların üstesinden gelmek bir acı olabilir: özellikle aktarımların başarısız olma olasılığı daha yüksektir. Tek bir dosyadayken verilerin alt kümelerini değiştirmek de daha zordur.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.