Hub documentation
Loại bỏ trùng lặp
Loại bỏ trùng lặp
Các kho lưu trữ được bật Xet sử dụng chia nhỏ định nghĩa theo nội dung (content-defined chunking - CDC) để loại bỏ trùng lặp ở cấp độ byte (~64KB dữ liệu, còn được gọi là một “chunk”). Mỗi chunk được xác định bằng một hash lăn (rolling hash) xác định ranh giới chunk dựa trên nội dung thực tế của tệp, giúp chống lại việc chèn hoặc xóa ở bất kỳ vị trí nào trong tệp. Khi một tệp được tải lên kho lưu trữ có Xet bằng một client nhận biết Xet, nội dung của nó sẽ được chia thành các chunk có kích thước thay đổi này. Chỉ các chunk mới chưa có trong bộ nhớ Xet được giữ lại sau khi chia nhỏ, mọi thứ khác đều bị loại bỏ.
Khử trùng lặp ở mức chunk cũng là điều giúp bản sao phía máy chủ được tạo ngay lập tức:
hf buckets cpgiữa các kho và bucket chỉ di chuyển các hash nội dung, không cần tải lại dữ liệu. Xem Sao chép tệp giữa các kho và bucket.
Cách hoạt động của việc phân mảnh định nghĩa theo nội dung
Để hiểu về chia khối định nghĩa theo nội dung, hãy tưởng tượng một tệp như một đoạn văn bản dài. Hệ thống quét dữ liệu bằng một hàm băm lăn — một hàm toán học nhỏ trượt qua các byte. Mỗi khi hàm băm khớp với một mẫu đặc biệt, một ranh giới khối được đặt tại vị trí đó. Vì các ranh giới được xác định bởi chính nội dung (chứ không phải bởi các vị trí cố định), các vùng dữ liệu giống hệt nhau luôn tạo ra các khối giống nhau, ngay cả khi nội dung xung quanh thay đổi.
Tại Sao Không Dùng Các Khối Có Kích Thước Cố Định?
Hãy xem xét điều gì xảy ra khi bạn chèn một lượng dữ liệu nhỏ vào giữa tệp. Với việc chia khối có kích thước cố định, mọi ranh giới khối sau điểm chèn sẽ bị dịch chuyển, làm cho tất cả các khối phía sau trở nên không còn hiệu lực — mặc dù phần lớn dữ liệu không thay đổi:
Original file, fixed 6-byte chunks:
|The qu|ick br|own fo|x jump|s over| the l|azy do|g |
chunk1 chunk2 chunk3 chunk4 chunk5 chunk6 chunk7 chunk8
Insert "very " before "lazy":
|The qu|ick br|own fo|x jump|s over| the v|ery la|zy dog|
chunk1 chunk2 chunk3 chunk4 chunk5 chunk6 chunk7 chunk8
~~~~~~ ~~~~~~ ~~~~~~
3 chunks changed!Mặc dù chỉ có 5 byte được chèn vào, 3 trong số 8 chunk đã thay đổi vì tất cả các ranh giới sau thao tác chỉnh sửa đều bị dịch chuyển 5 vị trí. Trong các tệp thực tế với kích thước chunk 64KB, một chỉnh sửa nhỏ có thể làm vô hiệu hóa hàng trăm megabyte các chunk.
Chunking định nghĩa theo nội dung giữ cho các ranh giới ổn định
Với CDC, các ranh giới được đặt tại vị trí mà nội dung khớp với một mẫu — không phải tại các khoảng cách cố định. Điều này có nghĩa là một thao tác chèn chỉ ảnh hưởng đến khối chứa thao tác chỉnh sửa đó. Các khối trước và sau vẫn giữ nguyên:
Original file, content-defined chunks (boundaries marked by "|"):
|The quick |brown fox |jumps over |the lazy dog|
chunk 1 chunk 2 chunk 3 chunk 4
Insert "very " before "lazy":
|The quick |brown fox |jumps over |the very lazy dog|
chunk 1 chunk 2 chunk 3 chunk 4'
(same) (same) (same) (changed)Chỉ 1 trong số 4 khối bị thay đổi — khối chứa chỉnh sửa. Ba khối còn lại giống hệt nhau từng byte và được khử trùng lặp. Đây là lý do CDC hiệu quả cao với dữ liệu có phiên bản: khi bạn cập nhật checkpoint của mô hình hoặc thêm hàng vào bộ dữ liệu, chỉ các phần bị sửa đổi cần được tải lên và lưu trữ.
Từ Chunks đến Storage
Quy trình khử trùng lặp đầy đủ hoạt động như sau:
Khi một tệp được chia nhỏ, hash của mỗi phần được kiểm tra so với những gì đã được lưu trữ. Quá trình này diễn ra ở nhiều cấp độ: trước tiên so với các phần đã được nhìn thấy trong phiên tải lên hiện tại, sau đó so với bộ nhớ đệm cục bộ của các metadata đã tải lên trước đó, và cuối cùng một tập con các phần được kiểm tra so với toàn bộ kho lưu trữ Xet thông qua truy vấn khử trùng toàn cục. Các phần trùng lặp bị bỏ qua hoàn toàn. Các phần mới được nhóm thành các khối 64 MB và tải lên. Mỗi khối được lưu một lần trong kho lưu trữ theo địa chỉ nội dung (CAS), được đánh khóa bằng hash của nó.
Tiết kiệm dung lượng lưu trữ trong thực tế
Khuyến nghị hiện tại của Hub là giới hạn dung lượng tệp ở mức 200 GB. Với kích thước chunk là 64KB, một tệp 20GB sẽ có 312.500 chunk, trong đó nhiều chunk không thay đổi giữa các phiên bản. Git LFS được thiết kế để chỉ nhận biết rằng một tệp đã thay đổi và lưu trữ toàn bộ nội dung của phiên bản đó. Bằng cách khử trùng lặp ở cấp độ chunk, backend Xet cho phép chỉ lưu trữ nội dung đã bị sửa đổi trong tệp (có thể chỉ là vài KB hoặc MB) và khử trùng lặp một cách an toàn các khối chung giữa các kho. Đối với các tệp nhị phân lớn được tìm thấy trong các kho Model và Dataset, điều này mang lại cải thiện đáng kể về thời gian chuyển tệp.
Để biết thêm chi tiết, hãy tham khảo các bài đăng trên blog Từ File đến Chunks và Từ Chunks đến Blocks, hoặc bài báo Git is for Data của Low et al. đã đóng vai trò là điểm khởi đầu cho XetHub trước khi được Hugging Face mua lại.
Update on GitHub