Làm thế nào để đối phó với kiểm soát phiên bản của một lượng lớn dữ liệu (nhị phân)


46

Tôi là nghiên cứu sinh tiến sĩ địa vật lý và làm việc với lượng lớn dữ liệu hình ảnh (hàng trăm GB, hàng chục nghìn tệp). Tôi biết svngitkhá rõ và đánh giá cao lịch sử dự án, kết hợp với khả năng dễ dàng làm việc cùng nhau và có sự bảo vệ chống lại tham nhũng đĩa. Tôi gitcũng thấy rất hữu ích khi có các bản sao lưu nhất quán nhưng tôi biết rằng git không thể xử lý một lượng lớn dữ liệu nhị phân một cách hiệu quả.

Trong các nghiên cứu thạc sĩ của tôi, tôi đã làm việc trên các tập dữ liệu có kích thước tương tự (cũng như hình ảnh) và có rất nhiều vấn đề khi theo dõi phiên bản khác nhau trên các máy chủ / thiết bị khác nhau. Sử dụng 100GB qua mạng thực sự không thú vị và khiến tôi mất rất nhiều thời gian và công sức.

Tôi biết rằng những người khác trong khoa học dường như có vấn đề tương tự, nhưng tôi không thể tìm ra giải pháp tốt.

Tôi muốn sử dụng các thiết bị lưu trữ của viện của mình, vì vậy tôi cần một cái gì đó có thể sử dụng máy chủ "ngu ngốc". Tôi cũng muốn có một bản sao lưu bổ sung trên một đĩa cứng di động, vì tôi muốn tránh truyền hàng trăm GB qua mạng bất cứ khi nào có thể. Vì vậy, tôi cần một công cụ có thể xử lý nhiều hơn một vị trí từ xa.

Cuối cùng, tôi thực sự cần một cái gì đó mà các nhà nghiên cứu khác có thể sử dụng, vì vậy nó không cần phải cực kỳ đơn giản, nhưng có thể học được trong vài giờ.

Tôi đã đánh giá rất nhiều giải pháp khác nhau, nhưng dường như không có giải pháp nào phù hợp với dự luật:

  • svn hơi kém hiệu quả và cần một máy chủ thông minh
  • hg BIGFILE / largefile chỉ có thể sử dụng một từ xa
  • git bigfile / media cũng chỉ có thể sử dụng một remote, nhưng cũng không hiệu quả lắm
  • gác mái dường như không có nhật ký, hoặc khả năng khác
  • Bup trông thực sự tốt, nhưng cần một máy chủ "thông minh" để hoạt động

Tôi đã thử git-annex, đó là tất cả những gì tôi cần nó để làm (và nhiều hơn nữa), nhưng nó rất khó sử dụng và không được ghi chép tốt. Tôi đã sử dụng nó trong vài ngày và không thể hiểu ý tôi, vì vậy tôi nghi ngờ bất kỳ đồng nghiệp nào khác sẽ quan tâm.

Làm thế nào để các nhà nghiên cứu đối phó với các bộ dữ liệu lớn, và các nhóm nghiên cứu khác đang sử dụng là gì?

Để rõ ràng, tôi chủ yếu quan tâm đến cách các nhà nghiên cứu khác đối phó với tình huống này, không chỉ bộ dữ liệu cụ thể này. Dường như với tôi rằng hầu hết mọi người nên có vấn đề này, nhưng tôi không biết ai đã giải quyết nó. Tôi có nên giữ một bản sao lưu dữ liệu gốc và quên tất cả các công cụ kiểm soát phiên bản này không? Đó có phải là những gì mọi người khác đang làm?


1
@scaaahu Tôi không nghĩ đây là một câu hỏi phần mềm; một câu trả lời chấp nhận được cũng có thể mô tả một quy trình làm việc hoặc sự kết hợp của các công cụ và hệ thống. (Dù sao, đang ở chủ đề ở một nơi khác không nên đưa ra quyết định đóng câu hỏi ở đây.)

2
Để bảo vệ chống tham nhũng dữ liệu với dữ liệu hình ảnh, tôi định kỳ chạy một tập lệnh tính toán lại một tập tin tổng kiểm tra với tất cả các tập tin và tổng kiểm tra md5 của chúng. Các tập tin tổng kiểm tra sau đó được giữ trong git. Bây giờ tôi có thể thấy ngay với git diff nếu bất kỳ tổng kiểm tra nào đã thay đổi. Và tôi cũng có thể xem những tập tin nào đã bị xóa và thêm vào. Và nếu có bất kỳ dấu hiệu tham nhũng dữ liệu nào, thì tôi có thể sử dụng các bản sao lưu thông thường để khôi phục các phiên bản cũ. Không hoàn hảo nhưng tốt hơn là không có gì.

1
@JukkaSuomela Tôi nghĩ đó là một câu hỏi hợp lý khi bạn có bộ dữ liệu rất lớn, nếu những bộ dữ liệu đó thay đổi thường xuyên ... trong những trường hợp đó, sao lưu thường những gì được sử dụng làm kiểm soát phiên bản.

1
Tôi đang bỏ phiếu để đóng câu hỏi này ngoài chủ đề vì nó liên quan đến dữ liệu / cơ sở dữ liệu hơn là một cái gì đó cụ thể cho giới hàn lâm. Các câu hỏi rất hay và (IMHO) nên được chuyển đến DataScience.SE hoặc (có lẽ) Cơ sở dữ liệu.SE.
Piotr Migdal

1
@Johann Nhà khoa học dữ liệu có nền tảng khác nhau. Của tôi là trong cơ học lượng tử, ví dụ. Toàn bộ vấn đề ở đây là: 1. StackExchange không khuyến khích cái gọi là câu hỏi về thuyền và 2. tốt hơn là nên có những thực tiễn tốt nhất thay vì cách giải quyết bởi những người phải giải quyết nó nhưng không có ý tưởng.
Piotr Migdal

Câu trả lời:


12

Những gì tôi đang kết thúc sử dụng là một loại giải pháp lai:

  • sao lưu dữ liệu thô
  • git của quy trình làm việc
  • ảnh chụp nhanh thủ công của quy trình làm việc + dữ liệu đã xử lý, có liên quan, ví dụ:
    • tiền xử lý tiêu chuẩn
    • thực sự tốn thời gian
    • Để xuất bản

Tôi tin rằng hiếm khi có lịch sử sửa đổi đầy đủ số lượng lớn dữ liệu nhị phân, bởi vì thời gian cần thiết để xem xét các thay đổi cuối cùng sẽ quá nhiều đến nỗi nó sẽ không được đền đáp trong thời gian dài. Có thể một quy trình chụp nhanh bán tự động (cuối cùng để tiết kiệm một số dung lượng ổ đĩa, bằng cách không sao chép dữ liệu không thay đổi qua các ảnh chụp nhanh khác nhau) sẽ giúp ích.


Chà, tôi đang sử dụng find . -type f -print0 | xargs -0 md5sum > checksums.md5để tính toán tổng kiểm tra và md5sum -c checksums.md5tổng kiểm tra, và phiên bản kiểm soát tổng kiểm tra. Điều đó giúp kiểm tra dữ liệu tại các vị trí khác nhau / trên các máy khác nhau. Có vẻ là điều tốt nhất chúng ta có thể làm vào lúc này,
Johann

Nếu bằng cách sửa đổi dữ liệu của bạn, bạn luôn thay đổi tên tệp của mình, thì đó có thể là giải pháp tốt. Mặt khác, tôi đặc biệt khuyên bạn nên kiểm tra dữ liệu, ví dụ như rsynctrên (một bản sao) dữ liệu gốc. Một khả năng khác phổ biến trong khoa học thần kinh (mặc dù tôi không thích nó lắm vì đôi khi nó không được ghi chép đầy đủ như vậy), là sử dụng gói python nipype, có thể được xem như là một quy trình (loại) quản lý và nó tự động quản lý bộ đệm của dữ liệu nhị phân của các bước trung gian của phân tích.
norok2

@norok bạn đã mô tả một khung chung tuyệt vời. Tôi đã triển khai một cái gì đó tương tự trong công cụ DVC - vui lòng xem câu trả lời của tôi dưới đây. Tôi đánh giá cao phản hồi của bạn.
Dmitry Petrov

9

Tôi đã xử lý các vấn đề tương tự với các bộ dữ liệu sinh học tổng hợp rất lớn, nơi chúng tôi có nhiều, rất nhiều GB dữ liệu tế bào học dòng chảy trải rộng trên nhiều, hàng ngàn tệp và cần duy trì chúng một cách nhất quán giữa các nhóm cộng tác tại (nhiều) tổ chức khác nhau.

Kiểm soát phiên bản điển hình như svn và git không thực tế cho trường hợp này, vì nó chỉ không được thiết kế cho loại dữ liệu này. Thay vào đó, chúng tôi đã chuyển sang sử dụng các giải pháp "lưu trữ đám mây", đặc biệt là DropBoxBittorrent Sync. DropBox có lợi thế là nó thực hiện ít nhất một số hoạt động kiểm soát phiên bản và ghi nhật ký và quản lý máy chủ cho bạn, nhưng nhược điểm là dịch vụ thương mại, bạn phải trả tiền cho dung lượng lớn và bạn đang đặt dữ liệu chưa được công bố của mình lên lưu trữ thương mại; tuy nhiên, bạn không phải trả nhiều tiền, vì vậy đây là một lựa chọn khả thi. Bittorrent Sync có giao diện rất giống nhau, nhưng bạn tự chạy nó trên các máy chủ lưu trữ của riêng mình và nó không có bất kỳ kiểm soát phiên bản nào. Cả hai đều làm tổn thương tâm hồn lập trình viên của tôi, nhưng chúng là giải pháp tốt nhất mà các cộng tác viên của tôi và tôi đã tìm thấy cho đến nay.


Có một phiên bản mã nguồn mở phổ biến của Dropbox, ownCloud. Tôi đã không thử nó, mặc dù.

9

Tôi đã sử dụng Phiên bản trên các thùng Amazon S3 để quản lý 10 - 100 GB trong 10 - 100 tệp. Chuyển có thể chậm, vì vậy nó đã giúp nén và chuyển song song hoặc chỉ chạy các tính toán trên EC2. Các boto thư viện cung cấp một giao diện python tốt đẹp.



6

Chúng tôi không kiểm soát phiên bản các tệp dữ liệu thực tế. Chúng tôi sẽ không muốn ngay cả khi chúng tôi lưu trữ dưới dạng CSV thay vì ở dạng nhị phân. Như Riccardo M. đã nói, chúng tôi sẽ không dành thời gian để xem xét các thay đổi theo từng hàng trên bộ dữ liệu hàng 10 triệu.

Thay vào đó, cùng với mã xử lý, phiên bản I kiểm soát siêu dữ liệu:

  • Ngày sửa đổi
  • Kích thước tập tin
  • Đếm số hàng
  • Tên cột

Điều này cho phép tôi đủ thông tin để biết nếu một tệp dữ liệu đã thay đổi và một ý tưởng về những gì đã thay đổi (ví dụ, hàng thêm / xóa, mới / đổi tên cột), mà không nhấn mạnh VCS.


5

Đây là một vấn đề khá phổ biến. Tôi bị đau khi làm dự án nghiên cứu cho một trường đại học và bây giờ - trong các dự án khoa học dữ liệu công nghiệp.

Tôi đã tạo và gần đây đã phát hành một công cụ nguồn mở để giải quyết vấn đề này - DVC .

Về cơ bản, nó kết hợp mã của bạn trong Git và dữ liệu trong đĩa hoặc đám mây cục bộ của bạn (lưu trữ S3 và GCP). DVC theo dõi sự phụ thuộc giữa dữ liệu và mã và xây dựng biểu đồ phụ thuộc (DAG). Nó giúp bạn làm cho dự án của bạn có thể tái tạo.

Dự án DVC có thể dễ dàng chia sẻ - đồng bộ hóa dữ liệu của bạn với đám mây (lệnh đồng bộ hóa dvc), chia sẻ kho Git của bạn và cung cấp quyền truy cập vào nhóm dữ liệu của bạn trong đám mây.

"Có thể học trong vài giờ" - là một điểm tốt. Bạn không nên có bất kỳ vấn đề nào với DVC nếu bạn quen thuộc với Git. Bạn thực sự chỉ cần học ba lệnh:

  1. dvc init- thích git init. Nên được thực hiện trong một kho Git hiện có.
  2. dvc import- nhập tệp dữ liệu của bạn (nguồn). Tệp cục bộ hoặc URL.
  3. dvc run- các bước của quy trình làm việc của bạn như thế nào dvc run python mycode.py data/input.jpg data/output.csv. DVC có được sự phụ thuộc giữa các bước của bạn một cách tự động, xây dựng DAG và giữ nó trong Git.
  4. dvc repro- sao chép tập tin dữ liệu của bạn. Ví dụ: vi mycode.py- thay đổi mã, và sau đó dvc repro data/output.csvsẽ sao chép tệp (và tất cả các phụ thuộc.

Bạn cần học thêm một vài lệnh DVC để chia sẻ dữ liệu thông qua các kỹ năng đám mây và S3 hoặc GCP cơ bản.

Hướng dẫn DVC là điểm khởi đầu tốt nhất - "Điều khiển phiên bản dữ liệu: học máy lặp"


1
Điều này có thể được sử dụng chỉ với việc lưu trữ các tệp nhị phân lớn (chủ yếu là video). ML không phải là mục tiêu. Mục tiêu là có một repo để lưu trữ tệp nhị phân lớn. Repo nên có bộ nhớ đệm, kiểm tra chọn lọc / kéo (như perforce) và cơ chế khóa tệp / thư mục. Có phù hợp cho mục đích như vậy?
hemu

1
@hemu Vâng. DVC chỉ hoạt động tốt đối với kịch bản tệp dữ liệu lớn cơ bản không có các tính năng ML (như đường ống ML và độ tái lập). Ngữ nghĩa Perforce-lock không được hỗ trợ do ngữ nghĩa Git. Vui lòng sử dụng kiểm tra mỗi tệp thay thế.
Dmitry Petrov


0

Bạn có thể xem dự án của tôi có tên là DOT: Trình quản lý kho lưu trữ đối tượng theo dõi đối tượng.
Nó là một VCS rất đơn giản cho các tệp nhị phân cho sử dụng cá nhân (không cộng tác).
Nó sử dụng SHA1 để kiểm tra và chặn trùng lặp. Đồng bộ hóa P2P đầy đủ.
Một tính năng độc đáo: adhoc máy chủ TCP một lần để kéo / đẩy.
Nó cũng có thể sử dụng SSH để vận chuyển.

Nó chưa được phát hành, nhưng có thể là một điểm khởi đầu tốt.
http://borg.uu3.net/cgit/cgit.cgi/dot/about/


0

Bạn có thể thử sử dụng hangar . Nó là một người chơi tương đối mới trong thế giới kiểm soát phiên bản dữ liệu nhưng thực hiện công việc thực sự tốt bằng cách phiên bản các tenxơ thay vì phiên bản blob. Các tài liệu phải là nơi tốt nhất để bắt đầu. Vì dữ liệu đang được lưu trữ dưới dạng tenxơ, bạn sẽ có thể sử dụng nó trực tiếp bên trong mã ML của mình (cộng với hangar hiện có bộ tải dữ liệu cho PyTorch và Tensorflow). Với hangar, bạn có thể nhận được tất cả lợi ích của git như phân nhánh không chi phí, sáp nhập, du hành thời gian trong lịch sử. Một tính năng hay về nhân bản trong hangar là bạn có thể nhân bản một phần . Điều đó có nghĩa là, nếu bạn có 10 TB dữ liệu từ xa và chỉ cần 100 MB để tạo mẫu cho mô hình của mình, bạn chỉ có thể tìm nạp 100 MB thông qua nhân bản một phần thay vì nhân bản hoàn toàn.

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.