Lợi ích của việc chia tập tin tfrecord thành các phân đoạn là gì?


17

Tôi đang làm việc về nhận dạng giọng nói với Tensorflow và dự định đào tạo LSTM NN với bộ dữ liệu sóng lớn. Vì hiệu suất tăng, tôi dự định sử dụng tfrecords. Có một số ví dụ trên internet (Inception for ex.) Trong đó các tệp tfrecords được chia thành các phân đoạn. Câu hỏi của tôi là: lợi ích của việc có tập tin tfrecords vào phân đoạn là gì? Có bất kỳ tăng hiệu suất bổ sung của sự phân chia này?

Câu trả lời:


11

Trong nghiên cứu lợi ích của việc chia thành nhiều tệp, câu trả lời hợp lý duy nhất đến từ một trong những người của Google.

Họ nói rằng hiệu suất tăng không đáng kể, nhưng tôi đồng ý rằng việc chia nhỏ tệp có thể giúp ích, đặc biệt nếu bạn muốn chuyển tập dữ liệu sang vị trí khác.

Hãy nhớ rằng bây giờ bạn không cần xáo trộn trước khi lưu, bởi vì (hiện tại) phương pháp được đề xuất để đọc TFRecords sử dụng phương thức tf.data.TFRecordDatasetrất hữu ích .shuffle().


2
.shuffle()phương pháp không phải là một giải pháp lý tưởng nếu bạn có một tệp tfrecord lớn. Đầu ra được xáo trộn có phần liên quan đến thứ tự ban đầu nếu bạn không sử dụng kích thước bộ đệm lớn. Tôi nghĩ việc trộn trước dữ liệu trước khi lưu vào tfrecord hoặc chia thành các phân đoạn là cần thiết khi bạn có một tập dữ liệu lớn.
Bruce Chou

7

Đối với những người vẫn đang tự hỏi: đó là để bạn có thể xáo trộn dữ liệu của mình. Với TFrecords của bạn trong một tệp, bạn không thể xáo trộn đơn hàng. Điều này thường là cần thiết với SGD.

Tuy nhiên, với các phân đoạn, bạn có thể xáo trộn thứ tự của các phân đoạn cho phép bạn xấp xỉ xáo trộn dữ liệu như thể bạn có quyền truy cập vào các TFRecords riêng lẻ. Điều này rõ ràng tốt hơn không có gì, và rõ ràng bạn càng có nhiều phân đoạn thì sự gần đúng này càng tốt.

Phương án thay thế là trộn trước dữ liệu của bạn thông qua sao chép dữ liệu hoặc không sử dụng TFRecords.


4

Việc chia các tệp TFRecord thành các phân đoạn giúp bạn xáo trộn các bộ dữ liệu lớn không phù hợp với bộ nhớ.

Hãy tưởng tượng bạn có hàng triệu ví dụ đào tạo được lưu trên đĩa và bạn muốn liên tục chạy chúng thông qua một quy trình đào tạo. Hơn nữa, giả sử rằng với mỗi lần lặp lại dữ liệu huấn luyện (tức là mỗi kỷ nguyên), bạn muốn tải dữ liệu theo thứ tự hoàn toàn ngẫu nhiên.

Một cách tiếp cận là có một tệp cho mỗi ví dụ đào tạo và tạo danh sách tất cả tên tệp. Sau đó, ở đầu mỗi epoch, bạn xáo trộn danh sách tên tệp và tải các tệp riêng lẻ. Vấn đề với phương pháp này là bạn đang tải hàng triệu tệp từ các vị trí ngẫu nhiên trên đĩa của bạn. Điều này có thể chậm đặc biệt là trên một ổ đĩa cứng. Ngay cả một mảng RAID 0 cũng không giúp ích gì về tốc độ nếu bạn đang tải hàng triệu tệp nhỏ từ các vị trí ngẫu nhiên. Vấn đề thậm chí còn tồi tệ hơn nếu bạn đang truy cập các tệp qua kết nối mạng.

Một cách tiếp cận khác là đọc các ví dụ huấn luyện theo trình tự từ một tệp TFRecord lớn và xáo trộn các ví dụ trong bộ nhớ bằng cách sử dụng bộ đệm xáo trộn. Tuy nhiên, bộ đệm xáo trộn thường không thể lớn hơn bộ nhớ DDR có sẵn cho CPU của bạn. Và nếu bộ đệm xáo trộn nhỏ hơn đáng kể so với tập dữ liệu của bạn, thì nó có thể không xáo trộn đầy đủ dữ liệu. Dữ liệu có thể được xáo trộn "cục bộ" nhưng không bị xáo trộn "toàn cầu". Đó là, các ví dụ từ đầu tập dữ liệu có thể không được xáo trộn với các ví dụ từ cuối tập dữ liệu.

Một giải pháp tốt là sử dụng kết hợp cân bằng hai cách tiếp cận trên bằng cách chia dữ liệu của bạn thành nhiều tệp TFRecord (được gọi là phân đoạn). Trong mỗi kỷ nguyên, bạn có thể xáo trộn tên tập tin shard để có được sự xáo trộn toàn cầu và sử dụng bộ đệm xáo trộn để có được sự xáo trộn cục bộ. Một sự cân bằng tốt sẽ làm cho các mảnh vỡ đủ lớn để ngăn chặn các vấn đề về tốc độ đĩa nhưng sẽ giữ cho các mảnh vỡ đủ nhỏ để cho phép xáo trộn đầy đủ bởi một bộ đệm xáo trộn.

Dưới đây là các bước chính xác:

  1. Đặt ngẫu nhiên tất cả các ví dụ đào tạo vào nhiều tệp TFRecord (phân đoạn).
  2. Vào đầu mỗi kỷ nguyên, xáo trộn danh sách tên tập tin shard.
  3. Đọc các ví dụ đào tạo từ các phân đoạn và chuyển các ví dụ thông qua bộ đệm xáo trộn. Thông thường, bộ đệm xáo trộn phải lớn hơn kích thước phân đoạn để đảm bảo xáo trộn tốt trên các mảnh vỡ.
  4. Vượt qua các ví dụ xáo trộn vào quá trình đào tạo của bạn.

3

Chia tệp TFRecords thành nhiều phân đoạn về cơ bản có 3 ưu điểm:

  1. Dễ xáo trộn hơn . Như những người khác đã chỉ ra, nó giúp dễ dàng xáo trộn dữ liệu ở mức độ thô (trước khi sử dụng bộ đệm xáo trộn).
  2. Tải nhanh hơn . Nếu các tệp được trải rộng trên nhiều máy chủ, việc tải xuống nhiều tệp từ các máy chủ khác nhau sẽ tối ưu hóa việc sử dụng băng thông (thay vì tải xuống một tệp từ một máy chủ). Điều này có thể cải thiện hiệu suất đáng kể so với việc tải xuống dữ liệu từ một máy chủ.
  3. Đơn giản hơn để thao tác . Việc xử lý 10.000 tệp 100 MB mỗi tệp dễ dàng hơn thay vì với một tệp 1TB. Các tập tin khổng lồ có thể là một nỗi đau để xử lý: đặc biệt, chuyển có nhiều khả năng thất bại. Việc xử lý các tập hợp con của dữ liệu cũng khó hơn khi tất cả chỉ trong một tệp.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.