Tôi sử dụng Tensorflow, nhưng tôi đang viết tài liệu cho người dùng thường sẽ thay đổi theo các khung học tập sâu .
Khi làm việc với các bộ dữ liệu không phù hợp với hệ thống tệp cục bộ (TB +), tôi lấy mẫu dữ liệu từ kho lưu trữ dữ liệu từ xa và ghi mẫu cục bộ sang tfrecords
định dạng chuẩn Tensorflow .
Trong kỷ nguyên đào tạo đầu tiên tôi sẽ chỉ lấy mẫu một vài giá trị, do đó, một kỷ nguyên dữ liệu cục bộ là rất nhỏ, tôi huấn luyện về nó. Trong epoch 2, tôi kiểm tra lại những tập tin dữ liệu nào đã được tạo ra bởi các quy trình lấy mẫu của tôi (bây giờ nhiều hơn) và huấn luyện về tập hợp mở rộng của các tệp dữ liệu cục bộ cho kỷ nguyên tiếp theo. Lặp lại quá trình mỗi kỷ nguyên. Theo cách này, tôi xây dựng bộ đệm mẫu cục bộ và có thể đuổi các mẫu cũ hơn khi tôi lấp đầy bộ nhớ cục bộ. Bộ đệm mẫu cục bộ phát triển vào khoảng thời gian mô hình cần phương sai nhiều nhất (hướng tới phần sau của đào tạo).
Trong Python / Tensorflow, điều quan trọng là tôi không khử lưu lượng dữ liệu trong quy trình vòng lặp đào tạo Python vì Python GIL không thể hỗ trợ tốc độ truyền dữ liệu (300-600 MB / giây, dữ liệu không thể nén được về mặt khoa học) và do đó hiệu suất của GPU chịu đựng khi Python GIL không thể phục vụ vòng lặp đào tạo nhanh.
Việc viết các mẫu vào một tfrecords
tệp từ các quy trình con (đa xử lý python) cho phép nguồn gốc của tenorflow thực hiện quá trình khử lưu huỳnh TFRecordsDataset
bên ngoài Python và do đó chúng tôi vượt qua các vấn đề GIL của Python và tôi có thể bão hòa GPU với tốc độ dữ liệu IO cao.
Tôi muốn biết làm thế nào tôi sẽ giải quyết vấn đề này ở Pytorch. Tôi đang viết về chiến lược lấy mẫu đang được sử dụng và muốn cung cấp các đề xuất cụ thể cho người dùng của cả Tensorflow và PyTorch, nhưng tôi không biết rõ về hệ sinh thái tiền xử lý PyTorch đủ để viết đủ chi tiết.
Lưu ý bên lề: giải pháp hoàn toàn dựa trên Python để hỗ trợ các tốc độ truyền dữ liệu này có thể có trong Python 3.8 với bộ nhớ chia sẻ và xử lý đa hệ thống V, nhưng tôi chưa thử vì hỗ trợ cho nó không đủ (sẽ sớm thôi ). Các giải pháp đa xử lý hiện tại không đủ vì chúng yêu cầu khử lưu huỳnh trong quy trình vòng lặp đào tạo và do đó khóa GIL trong quá trình khử lưu huỳnh ở tốc độ IO cao.
DataLoader
như trong câu trả lời của tôi.