Hub documentation
Yinelenenlerin Giderilmesi
Yinelenenlerin Giderilmesi
Xet destekli depolar, bayt düzeyinde (~64KB veri, “chunk” olarak da adlandırılır) yinelenen verileri kaldırmak için içerik tanımlı parçalama (CDC) kullanır. Her chunk, dosya içeriğine göre chunk sınırlarını belirleyen ve dosyanın herhangi bir yerindeki ekleme veya silmelere karşı dayanıklı olan kayan bir hash ile tanımlanır. Bir dosya, Xet destekli bir depoya Xet farkındalıklı bir istemci kullanılarak yüklendiğinde, içeriği bu değişken boyutlu chunk'lara ayrılır. Parçalama işleminden sonra, Xet depolamasında zaten bulunmayan yalnızca yeni chunk'lar saklanır, geri kalanı atılır.
Parça düzeyinde kopya kaldırma, sunucu tarafı kopyaların anında yapılmasını da sağlar: depolar ve varlıklar arasında
hf buckets cpyalnızca içerik özetlerini taşır, veri yeniden yüklenmez. Depolar ve varlıklar arasında dosya kopyalama bölümüne bakın.
İçerik Tanımlı Parçalamanın Nasıl Çalıştığı
İçerik tanımlı parçalama (content-defined chunking) kavramını anlamak için bir dosyayı uzun bir metin parçası olarak hayal edin. Sistem, verileri kayan bir hash (rolling hash) kullanarak tarar; bu, baytlar üzerinde kayan küçük bir matematiksel işlevdir. Hash belirli bir özel desene ulaştığında, o konuma bir parça sınırı yerleştirilir. Sınırlar içeriğin kendisi tarafından (sabit konumlar tarafından değil) belirlendiği için, çevresindeki içerik değişse bile verinin aynı bölgeleri her zaman aynı parçaları üretir.
Neden Sabit Boyutlu Parçalar Değil?
Bir dosyanın ortasına küçük miktarda veri eklediğinizde ne olduğunu düşünün. Sabit boyutlu parçalama kullanıldığında, ekleme noktasından sonraki tüm parça sınırları kayar ve tüm aşağı akış parçalarını geçersiz kılar — verilerin çoğu değişmemiş olsa bile:
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!Sadece 5 bayt eklenmiş olmasına rağmen, düzenlemeden sonraki tüm sınırlar 5 konum kaydırıldığı için 8 parçanın 3'ü değişti. Gerçek dosyalarda 64KB parça boyutunda, küçük bir düzenleme yüzlerce megabaytlık parçaları geçersiz kılabilir.
İçerik Tanımlı Parçalama Sınırların Kararlı Kalmasını Sağlar
CDC ile sınırlar, içerik bir kalıpla eşleştiği yerlere konur — sabit aralıklara değil. Bu, bir ekleme işleminin yalnızca düzenlemenin yapıldığı parçayı etkilediği anlamına gelir. Öncesindeki ve sonrasındaki parçalar aynı kalır:
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)Sadece 4 parçadan 1'i değişti — düzenlemeyi içeren parça. Diğer üçü bayt bayt aynıdır ve yinelenen kısımlar giderilir. CDC'nin sürümlü veriler için bu kadar etkili olmasının nedeni budur: bir model kontrol noktasını güncellediğinizde veya bir veri setine satır eklediğinizde, yalnızca değiştirilen kısımların yüklenmesi ve saklanması gerekir.
Parçalardan Depolamaya
Tamamlanmış deduplication hattı şu şekilde çalışır:
Bir dosya parçalara ayrıldığında, her parçanın özeti (hash) mevcut depolananlarla karşılaştırılır. Bu işlem birden fazla düzeyde gerçekleşir: önce mevcut yükleme oturumunda zaten görülmüş parçalarla, ardından daha önce yüklenmiş metaverilerin yerel önbelleğiyle ve son olarak parçaların bir alt kümesi, küresel bir yinelenme giderme (deduplication) sorgusu aracılığıyla Xet depolamasının tamamıyla karşılaştırılır. Yinelenen parçalar tamamen atlanır. Yeni parçalar 64 MB'lık bloklara gruplandırılır ve yüklenir. Her blok, özeti (hash) anahtar olarak kullanılarak içerik adresli bir depoda (CAS) bir kez saklanır.
Uygulamada Depolama Tasarrufu
Hub’ın güncel önerisi, dosyaları 200 GB ile sınırlamaktır. 64KB parça boyutunda, 20GB’lık bir dosya 312.500 parçaya sahiptir ve bunların çoğu sürüm sürüme değişmeden kalır. Git LFS, yalnızca bir dosyanın değiştiğini fark etmeye ve o revizyonun tamamını depolamaya yönelik tasarlanmıştır. Parça düzeyinde yinelenenleri ortadan kaldırarak Xet arka ucu, bir dosyada yalnızca değiştirilen içeriğin (bu birkaç KB veya MB olabilir) depolanmasını ve paylaşılan blokların depolar arasında güvenli bir şekilde yinelenenlerin ortadan kaldırılmasını sağlar. Model ve Veri Seti depolarında bulunan büyük ikili dosyalar için bu, dosya aktarım sürelerinde önemli iyileştirmeler sağlar.
Daha fazla ayrıntı için From Files to Chunks ve From Chunks to Blocks blog yazılarına veya Hugging Face tarafından satın alınmadan önce XetHub'ın başlangıç noktası olarak hizmet veren Low ve ark.'nın Git is for Data makalesine başvurun.
Update on GitHub