Buckets:

mishig's picture
|
download
raw
23.6 kB

Bria Fibo 2.0

Fibo 2.0, Bria tarafından geliştirilen, yapılandırılmış JSON açıklamalarından görsel üreten 8,1B parametreli bir akış eşleştirme (flow-matching) transformer'dır. Metin kodlayıcısı Qwen3-VL'dir: bir Perceiver, Qwen3-VL'nin gizli durumlarını özet (gist) jetonlarına sıkıştırır ve bu jetonlar görsel jetonlarıyla tek bir akışta birleşir; transformer'ın beş bloğu da kapılı çapraz dikkat (gated cross-attention) yoluyla Qwen3-VL'yi doğrudan okur.

İki kontrol noktası vardır:

  • briaai/Fibo-2.0-dev, metinden görüntüye dönüştürme ve düzenleme için sınıflandırıcı-ücretsiz yönlendirmeye sahip tam model. Hattın varsayılanları, yönlendirme 5 ile 30 adım, bu kontrol noktası içindir.
  • briaai/Fibo-2.0-edit-turbo, yönlendirme olmadan 4 adımda düzenleme için damıtılmış (guidance_scale=1.0).

Guidance açıkken, varsayılan negatif prompt, modelin eğitildiği null caption'dır: tüm değerleri boş bırakılmış yapılandırılmış caption.

Üretiliyor

Fibo 2.0, yapılandırılmış JSON açıklamaları üzerinde eğitilmiştir ve serbest biçimli metinlerle iyi çalışmaz. Açıklamayı bir JSON dizgesi olarak iletin:

import json

import torch
from diffusers import BriaFibo2Pipeline

pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-dev", dtype=torch.bfloat16).to("cuda")

caption = {
    "short_description": "A red vintage bicycle leaning against a whitewashed wall on a narrow Mediterranean street.",
    "objects": [
        {
            "description": "A red vintage bicycle with a wicker basket of lemons on its handlebars.",
            "location": "center",
            "relative_size": "large within frame",
        }
    ],
    "background_setting": "A whitewashed wall with a blue wooden door and potted red geraniums.",
    "lighting": {"conditions": "bright morning sun", "direction": "from the right", "shadows": "long and crisp"},
    "aesthetics": {"composition": "centered", "color_scheme": "red, white and blue", "mood_atmosphere": "calm"},
    "photographic_characteristics": {"depth_of_field": "deep", "focus": "sharp on the bicycle", "camera_angle": "eye level"},
    "style_medium": "photograph",
    "context": "A travel photograph.",
    "artistic_style": "realistic",
}
image = pipe(json.dumps(caption)).images[0]
image.save("bicycle.png")

Pipeline, eğitimde yapıldığı gibi başlığı temizler: boş değerleri ve hiçbir eğitim başlığında bulunmayan aesthetic_score ile preference_score alanlarını atar ve başlığı kompakt biçimde seri hale getirir. İki kısa form da eğitildi ve olduğu gibi korunur:

# The caption's short description alone, as plain text
image = pipe("A red vintage bicycle leaning against a whitewashed wall on a narrow Mediterranean street.").images[0]

# Exactly a "short_description" and a "text_render" list. The list is kept even when it's empty, to say the image
# has no text
caption = {"short_description": "A bakery storefront at dawn with a painted sign.", "text_render": [{"text": "FRESH BREAD"}]}
image = pipe(json.dumps(caption)).images[0]

Serbest biçimli metni yapılandırılmış bir başlığa dönüştürmek için Bria Fibo sayfasındaki prompt-to-JSON modellerine bakın.

Düzenleme

Aynı boru hattı görüntüleri düzenler. Görüntüyü image olarak ve düzenleme talimatını istem olarak iletin:

import torch
from diffusers import BriaFibo2Pipeline
from diffusers.utils import load_image

pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-dev", dtype=torch.bfloat16).to("cuda")
image = load_image(
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/yarn-art-pikachu.png"
)
edited = pipe("Make the background a snowy forest", image=image).images[0]
edited.save("pikachu_snow.png")

Daha hızlı düzenlemeler için turbo checkpoint'ini yükleyin ve guidance'ı kapatın:

import torch
from diffusers import BriaFibo2Pipeline
from diffusers.utils import load_image

pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-edit-turbo", dtype=torch.bfloat16).to("cuda")
image = load_image(
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/yarn-art-pikachu.png"
)
edited = pipe("Make the background a snowy forest", image=image, num_inference_steps=4, guidance_scale=1.0).images[0]
edited.save("pikachu_snow.png")

Aşağıdaki örnekler, pipe ve image ile devam eder. Turbo checkpoint ile her çağrıya num_inference_steps=4 ve guidance_scale=1.0 parametrelerini iletin.

Düzenleme istemi

İstem, Fibo 2.0'un düzenlemek için eğitildiği biçimlerden herhangi birinde, bir "edit_instruction" anahtarı ve sonucun açıklaması içeren bir JSON nesnesi de olabilir. Hattı, Fibo 2.0'un düzenlemek için eğitildiği isteme dönüştürür.

Tam bir açıklama: "edit_instruction" anahtarının yanı sıra, Bria'nın prompt-to-JSON modellerinin düzenlemeler için yazdığı anahtarlar. İş akışı, eğitim sırasında her açıklamadan kaldırılan boş değerleri ile aesthetic_score ve preference_score alanlarını atar.

import json

prompt = {
    "short_description": "A crocheted yellow Pikachu doll sitting in a snowy pine forest.",
    "objects": [{"description": "A crocheted yellow Pikachu doll with red cheeks.", "location": "center"}],
    "background_setting": "A snowy pine forest with falling snow.",
    "edit_instruction": "Make the background a snowy forest",
}
edited = pipe(json.dumps(prompt), image=image).images[0]

Kısa bir açıklama: "structured_caption" anahtarı içindeki bir dize.

prompt = {
    "structured_caption": "A crocheted yellow Pikachu doll sitting in a snowy pine forest.",
    "edit_instruction": "Make the background a snowy forest",
}
edited = pipe(json.dumps(prompt), image=image).images[0]

Kısa bir açıklama ve metni: tam olarak bir "short_description" ve bir "text_render" listesi. Liste boş olsa bile korunur; bu, Fibo 2.0'a sonucun metin içermediğini bildirir. Bir "structured_caption" anahtarı bu formu veya tam bir altyazıyı da barındırabilir.

prompt = {
    "short_description": "A crocheted yellow Pikachu doll holding a small wooden sign.",
    "text_render": [{"text": "HELLO"}],
    "edit_instruction": "Give the doll a small wooden sign that reads HELLO",
}
edited = pipe(json.dumps(prompt), image=image).images[0]

Birkaç görsel

En fazla 5 görüntü birlikte düzenlenebilir; örneğin bir görüntüdeki nesne diğerine yerleştirilebilir. Talimat, bunlara sırasıyla <image_1>, <image_2> ve benzeri şekilde atıfta bulunur.

cat = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/cat.png")
edited = pipe("Put the cat from <image_2> next to the doll in <image_1>", image=[image, cat]).images[0]

Çıkış boyutu

height ve width verilmediği sürece, sonuç, ilk görüntünün en-boy oranı için Fibo 2.0'ın eğitimde kullandığı boyutu, yaklaşık bir megapikseli alır. Tek bir görüntü, sonucun boyutuna kırpılır. Birden fazla görüntü, her biri kendi en-boy oranı için eğitim boyutuna kırpılır.

edited = pipe("Make the background a snowy forest", image=image, width=1424, height=800).images[0]

Maskeli düzenlemeler

mask, tek bir görüntünün yeniden oluşturulacak bölgesini, görüntünün boyutunda siyah zemin üzerine beyaz olarak işaretler. Fibo 2.0, o bölge gri tonuna çevrilmiş görüntülerle düzenlemeler üzerinde eğitilmiştir ve pipeline, görüntü kodlanmadan önce aynı şekilde gri tonuna çevirir: 128'de ikili hale getirilen maske üzerinden düz (128, 128, 128) gri.

from PIL import Image, ImageDraw

mask = Image.new("L", image.size, 0)
ImageDraw.Draw(mask).rectangle((image.width // 2, 0, image.width, image.height // 2), fill=255)
edited = pipe("Add a red balloon floating in the sky", image=image, mask=mask).images[0]

Görsellerdeki metin

Başlık, text_render girdilerinde metin istediğinde, Fibo 2.0, Qwen3-VL her metni kendi başına çizilmiş olarak gördüğünde onu genellikle daha iyi işler. İş akışı, eğitimde yapıldığı gibi bu görselleri varsayılan olarak çizer ve bunlar kapatılabilir. Yukarıdaki fırın gibi metin içeren bir başlık için:

prompt = json.dumps(caption)
image = pipe(prompt, render_text_images=False).images[0]

Eğitim, Fibo 2.0'a bazı metin içeren açıklamalar için bu görselleri gösterirken diğerleri için göstermedi, bu nedenle her iki durumda da çalışır.

  • text içeren her text_render girdisine bir görüntü atanır: metin tek satırda, beyaz zemin üzerinde siyah, Pillow'un yerleşik fontuyla 20 punto boyutunda. 256 karakterden uzun bir metin, 256 karakterlik satırlara bölünür.
  • Yazı tipinde bulunmayan karakterler, bunlara sahip olan fonts listesinin ilk öğesiyle çizilir. Eğitimde Aileron, ardından DejaVu Sans kullanılmış olup bunlar briaai/Fibo-2.0-dev deposundaki fonts klasöründe yer alır. fonts olmadan bu tür karakterler, Pillow'un yerleşik yazı tipi tarafından nasıl çiziliyorsa öyle çizilir ve pipeline bir uyarı verir.
  • Pipeline, her girdiyi görseli için image_tokens alanıyla işaretler ve Qwen3-VL, düzenlenecek görsellerden sonra görselleri görür.
  • Bir üretim, gürültü seviyesi pipe.text_images_max_noise_level (0.9) değerinin üzerindeyken ilk adımlarını, görseller olmadan başlık üzerinde çalıştırır. Bir düzenleme ise her adımda onları kullanır.
  • Metin içermeyen bir başlık, tıpkı eğitim sırasında olduğu gibi kısa bir açıklama da görsel almaz.

Eğitimde kullanılan fontlarla çizmek için:

from huggingface_hub import hf_hub_download

fonts = [
    hf_hub_download("briaai/Fibo-2.0-dev", name, subfolder="fonts")
    for name in ("Aileron-Regular.otf", "DejaVuSans.ttf")
]
image = pipe(prompt, fonts=fonts).images[0]

Görselleri kendiniz çizecekseniz, bunları text_images olarak, tek bir istem için sırasıyla, text içeren her text_render girdisi için birer adet olarak iletin. Bunlar, hattın kendi görsellerine göre önceliklidir. Eğitimden farklı şekilde çizilen görseller dağıtım dışıdır.

Dikkat arka uçları

Transformer, diffusers'in herhangi bir dikkat (attention) arka uçlarında çalışır; örneğin H100 gibi Hopper GPU'larında FlashAttention-3:

pipe.transformer.set_attention_backend("_flash_3_varlen_hub")

_flash_3_hub tek bir istek için de çalışır ancak maskeler kabul etmediğinden, farklı uzunluklarda bir istek grubunu çalıştıramaz (aşağıya bakın).

Toplu İşleme

Tek bir çağrıda birden fazla prompt üretilebilir. Farklı uzunluklardaki promptlar doldurulur (padding) ve bu doldurma, her dikkat katmanında maskeleme ile dışlanır; bu nedenle böyle bir grup, maskeyi dikkate alan bir dikkat arka ucuna ihtiyaç duyar: varsayılan olan veya flash_varlen gibi bir varlen arka ucu. float32'de, bir grup ayrı çağrıların görüntülerini yeniden üretir; bfloat16'da ise dikkat çekirdekleri doldurulmuş ve doldurulmamış girdiler arasında farklılık gösterdiğinden, gruplanmış görüntüler ayrıntılı düzeyde tekil çağrılardan farklılık gösterebilir.

BriaFibo2Pipeline[[diffusers.BriaFibo2Pipeline]]

diffusers.BriaFibo2Pipeline[[diffusers.BriaFibo2Pipeline]]

diffusers.BriaFibo2Pipeline(transformer: BriaFibo2Transformer2DModel, scheduler: FlowMatchEulerDiscreteScheduler, vae: AutoencoderKLFlux2, text_encoder: Qwen3VLForConditionalGeneration, processor: Qwen3VLProcessor)

Kaynak

Parametreler:

transformer (BriaFibo2Transformer2DModel) : Görüntü latentlerini gürültüden arındıran transformer.

scheduler (FlowMatchEulerDiscreteScheduler) : transformer ile birlikte latentleri gürültüden arındırmak için kullanılan zamanlayıcı.

vae (AutoencoderKLFlux2) : Görüntüleri latentlere ve geriye eşleyen varyasyonel oto-kodlayıcı.

text_encoder (Qwen3VLForConditionalGeneration) : Qwen3-VL. Gizli durumları, transformer'ı koşullandırır.

processor (Qwen3VLProcessor) : İstem ve düzenlenecek görüntüleri Qwen3-VL girdilerine dönüştürür.

Fibo 2.0 ile metinden görüntüye üretim ve görüntü düzenleme için Pipeline.

call[[diffusers.BriaFibo2Pipeline.call]]

__call__(prompt: str | list[str] | None = None, image: PIL.Image.Image | list[PIL.Image.Image] | None = None, mask: PIL.Image.Image | None = None, text_images: list[PIL.Image.Image] | None = None, render_text_images: bool = True, fonts: list[str] | None = None, height: int | None = None, width: int | None = None, num_inference_steps: int = 30, guidance_scale: float = 5.0, negative_prompt: str | list[str] | None = None, num_images_per_prompt: int = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_embeds_mask: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds_mask: typing.Optional[torch.Tensor] = None, output_type: str = 'pil', return_dict: bool = True, callback_on_step_end: typing.Optional[typing.Callable[[int, int, dict], NoneType]] = None, callback_on_step_end_tensor_inputs: list = ['latents'])

Kaynak

Parametreler:

prompt (str veya list[str], isteğe bağlı) : Görsel üretimi yönlendirmek için istem, genellikle yapılandırılmış bir JSON istemi; Fibo 2.0'un eğitimde kullandığı temizlenmiş açıklamalar gibi temizlenir: boş değerler ile aesthetic_score ve preference_score alanları atılır ve içerik sıkı biçimde seri hale getirilir. image ile birlikte, düzenleme talimatı veya bir "edit_instruction" anahtarı ile sonucun açıklamasını içeren bir JSON nesnesi: diğer anahtarları veya açıklamayı ya da kısa bir betimlemeyi içeren bir "structured_caption" anahtarı.

image (PIL.Image.Image veya list[PIL.Image.Image], isteğe bağlı) : Düzenlenecek görüntü veya talimatın <image_1>, <image_2> vb. olarak atıfta bulunabileceği birlikte düzenlenecek en fazla 5 görüntü. image verilmediğinde, pipeline prompt'tan bir görüntü üretir.

mask (PIL.Image.Image, isteğe bağlı) : Tek bir görüntü düzenlenirken, image içinde yeniden oluşturulacak bölge; siyah zemin üzerinde beyaz. Eğitimde olduğu gibi, görüntü kodlanmadan önce, 128'de ikili hale getirilen maske aracılığıyla bölge gri tonlara çevrilir.

text_images (list[PIL.Image.Image], isteğe bağlı) : Altyazının istediği metnin görüntüleri, text içeren her text_render girdisi için bir adet, sırasıyla: her girdinin metni, render_text_images'in çizdiği gibi kendi başına çizilir. Qwen3-VL bunları istemle birlikte görür; her biri altyazı girdisinde işaretlenir ve bu da Fibo 2.0'ın metni render etmesine yardımcı olur. prompt'un tek bir JSON altyazısı olarak verilmesini gerektirir ve render_text_images'e öncelik tanır. Bir üretim, gürültü seviyesi text_images_max_noise_level (0.9) üzerindeyken ilk adımlarını bunlar olmadan çalıştırır; bir düzenleme ise bunları her adımda kullanır.

render_text_images (bool, isteğe bağlı, varsayılan True) : Her açıklamanın text_images değerlerinin, Fibo 2.0'ın eğitim sırasında çizdiği şekilde çizilip çizilmeyeceğini belirtir: her metin tek satırda, beyaz zemin üzerine siyah, Pillow'un yerleşik fontunda 20 boyutunda ve bu fontun eksik karakterleri, bunlara sahip olan fonts listesinin ilkinde bulunur. Eğitimde olduğu gibi, metin içermeyen bir açıklama ve JSON açıklaması olmayan bir istem (örneğin kısa bir açıklama) görsel almaz.

fonts (list[str], isteğe bağlı) : text_images içindeki, Pillow'un yerleşik fontunda bulunmayan karakterlerin çizileceği fontların sırasıyla yolları. Eğitim sırasında bu karakterler, briaai/Fibo-2.0-dev deposundaki fonts klasöründe yer alan Aileron ve ardından DejaVu Sans fontlarıyla çizildi. Bu fontlar sağlanmazsa, söz konusu karakterler Pillow'un yerleşik fontunun çizdiği şekilde görüntülenir.

height (int, isteğe bağlı) : Üretilen görüntünün piksel cinsinden yüksekliği. 16'ya bölünebilir olmalıdır. Varsayılan değer 1024'tür; düzenleme sırasında ise Fibo 2.0'ın ilk görüntünün en-boy oranı için eğitim gördüğü boyuta, yaklaşık bir megapiksele ayarlanır.

width (int, isteğe bağlı) : Üretilen görüntünün piksel cinsinden genişliği. 16'ya bölünebilir olmalıdır. Varsayılan değeri height ile aynıdır.

num_inference_steps (int, isteğe bağlı, varsayılan 30) : Gürültü azaltma adım sayısı.

guidance_scale (float, isteğe bağlı, varsayılan 5.0) : Classifier-free guidance ölçeği. 1'den büyük değerler, her adımda negatif promptu ikinci bir geçiş olarak çalıştırır ve 1.0 guidance'ı kapatır.

negative_prompt (str veya list[str], isteğe bağlı) : Rehberlik açıkken uzak durulacak istem. Varsayılan olarak, Fibo 2.0'un eğitildiği boş başlık kullanılır: tüm değerleri boş olan yapılandırılmış başlık.

num_images_per_prompt (int, isteğe bağlı, varsayılan 1) : Her istem için üretilecek görsel sayısı.

generator (torch.Generator veya list[torch.Generator], isteğe bağlı) : Deterministik üretim için başlangıç gürültüsünü çeken üreteç(ler).

latents (torch.Tensor, isteğe bağlı) : (batch_size, 32, height // 8, width // 8) biçiminde önceden oluşturulmuş başlangıç gürültüsü.

prompt_embeds (torch.Tensor, isteğe bağlı) : encode_prompt tarafından önceden hesaplanmış metin gömümlemeleri, prompt yerine kullanılır.

prompt_embeds_mask (torch.Tensor, isteğe bağlı) : prompt_embeds ile birlikte encode_prompt tarafından döndürülen maske. Dolgu (padding) yapıldığında gereklidir.

negative_prompt_embeds (torch.Tensor, isteğe bağlı) : negative_prompt yerine kullanılan, negatif prompt'un önceden hesaplanmış metin gömme değerleri.

negative_prompt_embeds_mask (torch.Tensor, isteğe bağlı) : negative_prompt_embeds ile birlikte encode_prompt tarafından döndürülen maske. Dolgu (padding) yapıldığında gereklidir.

output_type (str, isteğe bağlı, varsayılan "pil") : Çıktı biçimi: "pil", "np", "pt" veya "latent".

return_dict (bool, isteğe bağlı, varsayılan True) : Düz bir tuple yerine BriaFibo2PipelineOutput döndürülüp döndürülmemesi.

callback_on_step_end (Callable, isteğe bağlı) : callback_on_step_end(self, step, timestep, callback_kwargs) olarak her gürültü azaltma adımının sonunda çağrılan bir işlev.

callback_on_step_end_tensor_inputs (list[str], isteğe bağlı, varsayılan ["latents"]) : callback_kwargs içinde callback_on_step_end'e geçirilen tensörler.

Dönüş: BriaFibo2PipelineOutput veya tuple

oluşturulan görüntüler.

Üretim için pipeline çağrıldığında tetiklenen işlev.

Örnekler:

>>> import json

>>> import torch
>>> from diffusers import BriaFibo2Pipeline
>>> from diffusers.utils import load_image

>>> # Fibo 2.0 reads structured JSON captions, serialized compactly the way it was trained
>>> caption = {
...     "short_description": "A red bicycle leaning against a white brick wall on a sunny morning.",
...     "objects": [{"description": "a red city bicycle with a wicker basket", "location": "center"}],
...     "background_setting": "a white brick wall with a green door",
...     "lighting": {"conditions": "bright morning sun", "direction": "from the right"},
...     "style_medium": "photograph",
... }
>>> prompt = json.dumps(caption, separators=(",", ":"), ensure_ascii=False)

>>> # 30 steps with guidance 5, the defaults
>>> pipe = BriaFibo2Pipeline.from_pretrained("briaai/Fibo-2.0-dev", dtype=torch.bfloat16).to("cuda")
>>> image = pipe(prompt).images[0]
>>> image.save("fibo2.png")

>>> # editing: pass the image, and the instruction as the prompt
>>> image = load_image(
...     "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/yarn-art-pikachu.png"
... )
>>> edited = pipe("Make the background a snowy forest", image=image).images[0]
>>> edited.save("fibo2_edit.png")

encode_prompt[[diffusers.BriaFibo2Pipeline.encode_prompt]]

encode_prompt(prompt: str | list[str], image: list[PIL.Image.Image] | None = None, device: typing.Optional[torch.device] = None, num_images_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_embeds_mask: typing.Optional[torch.Tensor] = None, text_images: list[PIL.Image.Image] | list[list[PIL.Image.Image]] | None = None)

Kaynak

Parametreler:

prompt (str veya list[str]) : Kodlanacak istem veya istemler. image ile birlikte, her istem bir düzenleme talimatıdır veya bir "edit_instruction" anahtarı ve sonucun başlığı içeren bir JSON nesnesidir: diğer anahtarları veya başlığı ya da kısa bir açıklamayı içeren bir "structured_caption" anahtarı. Bir üretim istemi, verildiği gibi kodlanır: __call__ önce Fibo 2.0'ın eğitildiği biçimde bir JSON başlığı yerleştirir.

image (list[PIL.Image.Image], isteğe bağlı) : Düzenlenecek görüntüler, Qwen3-VL'nin onları gördüğü haliyle. Her istem hepsini düzenler.

device (torch.device, isteğe bağlı) : Gömme (embeddings) verilerinin yerleştirileceği cihaz.

num_images_per_prompt (int, varsayılan 1) : Her istem için oluşturulacak görsel sayısı.

prompt_embeds (torch.Tensor, isteğe bağlı) : prompt yerine kullanılan, (batch_size, 6, text_len, 7680) biçiminde önceden hesaplanmış metin gömme değerleri.

prompt_embeds_mask (torch.Tensor, isteğe bağlı) : prompt_embeds içindeki gerçek tokenların Bool maskesi, şekli (batch_size, text_len).

text_images (list[PIL.Image.Image] veya list[list[PIL.Image.Image]], isteğe bağlı) : Başlığın metnine ait görüntüler, text içeren her text_render girdisi için sırasıyla birer adet veya her istem için bunların listesi. Her girdi, kendi görüntüsünün görme işaretçisini alır ve Qwen3-VL, düzenlenecek görüntülerden sonra görüntüleri görür.

Dönüş:

Metin gömlemleri ve maskeleri, ya da prompt dolgu yapılmadıysa None.

Xet Storage Details

Size:
23.6 kB
·
Xet hash:
5b14e667dca18ef62bd51464b613ddb90fb50c4365bcce187b268f851654f0fe

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.