Buckets:
| # Kandinsky 3 | |
| Kandinsky 3, [Vladimir Arkhipkin](https://github.com/oriBetelgeuse),[Anastasia Maltseva](https://github.com/NastyaMittseva),[Igor Pavlov](https://github.com/boomb0om),[Andrei Filatov](https://github.com/anvilarth),[Arseniy Shakhmatov](https://github.com/cene555),[Andrey Kuznetsov](https://github.com/kuznetsoffandrey),[Denis Dimitrov](https://github.com/denndimitrov) ve [Zein Shaheen](https://github.com/zeinsh) tarafından oluşturulmuştur. | |
| GitHub sayfasındaki açıklama: | |
| *Kandinsky 3.0, Kandinsky2-x model ailesi üzerine inşa edilmiş açık kaynaklı bir metinden görüntüye difüzyon modelidir. Önceki sürümlerine kıyasla, metin kodlayıcı ve Diffusion U-Net modellerinin boyutları sırasıyla artırılarak modelin metin anlama ve görsel kalitesi iyileştirilmiştir.* | |
| Mimarisinde 3 ana bileşen bulunur: | |
| 1. T5 mimarisine dayalı bir kodlayıcı-çözücü modeli olan [FLAN-UL2](https://huggingface.co/google/flan-ul2). | |
| 2. BigGAN-deep blokları içeren yeni U-Net mimarisi, parametre sayısını aynı tutarken derinliği ikiye katlar. | |
| 3. Sber-MoVQGAN, görüntü restorasyonunda üstün sonuçlara sahip olduğu kanıtlanmış bir çözücü (decoder)dur. | |
| Orijinal kod tabanı [ai-forever/Kandinsky-3](https://github.com/ai-forever/Kandinsky-3) adresinde bulunabilir. | |
| > [!TIP] | |
| > Görselden görsel, metinden görsel ve inpainting gibi görevler için resmi model checkpoint'lerini Hub'daki [Kandinsky Community](https://huggingface.co/kandinsky-community) kuruluşunda bulabilirsiniz. | |
| > [!TIP] | |
| > Zamanlayıcı hızı ve kalitesi arasındaki ödünleşimi nasıl keşfedebileceğinizi öğrenmek için zamanlayıcılar [kılavuzunu](../../using-diffusers/schedulers) mutlaka inceleyin ve aynı bileşenleri birden fazla boru hattına nasıl verimli bir şekilde yükleyebileceğinizi öğrenmek için [boru hatları arasında bileşenleri yeniden kullanma](../../using-diffusers/loading#reusing-models-in-multiple-pipelines) bölümüne göz atın. | |
| ## Kandinsky3Pipeline[[diffusers.Kandinsky3Pipeline]] | |
| #### diffusers.Kandinsky3Pipeline[[diffusers.Kandinsky3Pipeline]] | |
| ```python | |
| diffusers.Kandinsky3Pipeline(tokenizer: T5Tokenizer, text_encoder: T5EncoderModel, unet: Kandinsky3UNet, scheduler: DDPMScheduler, movq: VQModel) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/kandinsky3/pipeline_kandinsky3.py#L59) | |
| #### __call__[[diffusers.Kandinsky3Pipeline.__call__]] | |
| ```python | |
| __call__(prompt: str | list[str] = None, num_inference_steps: int = 25, guidance_scale: float = 3.0, negative_prompt: str | list[str] | None = None, num_images_per_prompt: int | None = 1, height: int | None = 1024, width: int | None = 1024, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, attention_mask: typing.Optional[torch.Tensor] = None, negative_attention_mask: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, latents = None, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list = ['latents'], **kwargs) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/kandinsky3/pipeline_kandinsky3.py#L334) | |
| **Parametreler:** | |
| prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimi yönlendirmek için istem veya istemler. Tanımlanmamışsa, bunun yerine `prompt_embeds` geçirilmelidir. | |
| num_inference_steps (`int`, *isteğe bağlı*, varsayılan 25) : Gürültü azaltma adım sayısı. Daha fazla gürültü azaltma adımı genellikle daha yavaş çıkarım pahasına daha yüksek kaliteli bir görüntüye yol açar. | |
| guidance_scale (`float`, *isteğe bağlı*, varsayılan 3.0) : [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598)'de tanımlandığı gibi yönlendirme ölçeği. `guidance_scale`, [Imagen Paper](https://huggingface.co/papers/2205.11487)'deki 2. denklemindeki `w` olarak tanımlanır. Yönlendirme ölçeği, `guidance_scale > 1` olarak ayarlanarak etkinleştirilir. Daha yüksek yönlendirme ölçeği, genellikle daha düşük görüntü kalitesi pahasına, `prompt` ile yakından ilişkili görüntülerin üretilmesini teşvik eder. | |
| negative_prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimi yönlendirmemek için kullanılan istem veya istemler. Tanımlanmazsa, bunun yerine `negative_prompt_embeds` parametresinin geçirilmesi gerekir. Yönlendirme kullanılmadığında (yani `guidance_scale` değeri `1`'den küçükse) yok sayılır. | |
| num_images_per_prompt (`int`, *isteğe bağlı*, varsayılan 1) : Her istem için üretilecek görsel sayısı. | |
| height (`int`, *isteğe bağlı*, varsayılan: self.unet.config.sample_size) : Üretilen görüntünün piksel cinsinden yüksekliği. | |
| width (`int`, *isteğe bağlı*, varsayılan: self.unet.config.sample_size) : Üretilen görüntünün piksel cinsinden genişliği. | |
| generator (`torch.Generator` veya `list[torch.Generator]`, *isteğe bağlı*) : Üretimi deterministik hale getirmek için bir veya [torch üreteci(leri)](https://pytorch.org/docs/stable/generated/torch.Generator.html) listesi. | |
| prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, metin gömme değerleri `prompt` girdi argümanından oluşturulur. | |
| negative_prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş negatif metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, negative_prompt_embeds, `negative_prompt` girdi argümanından oluşturulur. | |
| attention_mask (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş dikkat maskesi. `prompt_embeds` doğrudan geçiriliyorsa sağlanmalıdır. | |
| negative_attention_mask (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş negatif dikkat maskesi. `negative_prompt_embeds` doğrudan geçiriliyorsa sağlanmalıdır. | |
| output_type (`str`, *isteğe bağlı*, varsayılan `"pil"`) : Üretilen görüntünün çıktı biçimi. [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` veya `np.array` arasında seçim yapın. | |
| return_dict (`bool`, *isteğe bağlı*, varsayılan `True`) : Düz bir tuple yerine `~pipelines.stable_diffusion.IFPipelineOutput` döndürülecek mi? | |
| latents (`torch.Tensor`, *isteğe bağlı*) : Görsel üretimi için girdi olarak kullanılacak, Gauss dağılımından örneklenen önceden oluşturulmuş gürültülü latentler. Farklı istemlerle aynı üretimi ayarlamak için kullanılabilir. Sağlanmazsa, sağlanan rastgele `generator` kullanılarak örneklem yoluyla bir latent tensörü oluşturulur. | |
| callback_on_step_end (`Callable`, *isteğe bağlı*) : Çıkarım sırasında her gürültü azaltma adımının sonunda çağrılan bir işlev. İşlev aşağıdaki argümanlarla çağrılır: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs`, `callback_on_step_end_tensor_inputs` tarafından belirtilen tüm tensörlerin listesini içerir. | |
| callback_on_step_end_tensor_inputs (`list`, *isteğe bağlı*) : `callback_on_step_end` işlevi için girdi tensörlerinin listesi. Listede belirtilen tensörler, `callback_kwargs` argümanı olarak geçirilir. Yalnızca pipeline sınıfınızın `._callback_tensor_inputs` özniteliğinde listelenen değişkenleri dahil edebilirsiniz. | |
| **Dönüş:** [ImagePipelineOutput](/docs/diffusers/main/tr/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) veya `tuple` | |
| Üretim için pipeline çağrıldığında tetiklenen işlev. | |
| Örnekler: | |
| ```py | |
| >>> from diffusers import AutoPipelineForText2Image | |
| >>> import torch | |
| >>> pipe = AutoPipelineForText2Image.from_pretrained( | |
| ... "kandinsky-community/kandinsky-3", variant="fp16", torch_dtype=torch.float16 | |
| ... ) | |
| >>> pipe.enable_model_cpu_offload() | |
| >>> prompt = "A photograph of the inside of a subway train. There are raccoons sitting on the seats. One of them is reading a newspaper. The window shows the city in the background." | |
| >>> generator = torch.Generator(device="cpu").manual_seed(0) | |
| >>> image = pipe(prompt, num_inference_steps=25, generator=generator).images[0] | |
| ``` | |
| #### encode_prompt[[diffusers.Kandinsky3Pipeline.encode_prompt]] | |
| ```python | |
| encode_prompt(prompt, do_classifier_free_guidance = True, num_images_per_prompt = 1, device = None, negative_prompt = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, _cut_context = False, attention_mask: typing.Optional[torch.Tensor] = None, negative_attention_mask: typing.Optional[torch.Tensor] = None) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/kandinsky3/pipeline_kandinsky3.py#L91) | |
| **Parametreler:** | |
| prompt (`str` veya `list[str]`, *isteğe bağlı*) : kodlanacak istem | |
| device : (`torch.device`, *isteğe bağlı*): Sonuç olarak elde edilen gömme vektörlerinin yerleştirileceği torch cihazı | |
| num_images_per_prompt (`int`, *isteğe bağlı*, varsayılan 1) : her istem için oluşturulacak görsel sayısı | |
| do_classifier_free_guidance (`bool`, *isteğe bağlı*, varsayılan `True`) : sınıflandırıcı serbest yönlendirmenin (classifier free guidance) kullanılıp kullanılmayacağı | |
| negative_prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimi yönlendirmemek için kullanılan istem veya istemler. Tanımlanmamışsa, bunun yerine `negative_prompt_embeds` geçirilmelidir. Tanımlanmamışsa, bunun yerine `negative_prompt_embeds` geçirilmelidir. Yönlendirme kullanılmadığında yok sayılır (yani `guidance_scale`, `1`'den küçükse yok sayılır). | |
| prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, metin gömme değerleri `prompt` girdi argümanından oluşturulur. | |
| negative_prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş negatif metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, negative_prompt_embeds, `negative_prompt` girdi argümanından oluşturulur. | |
| attention_mask (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş dikkat maskesi. `prompt_embeds` doğrudan geçiriliyorsa sağlanmalıdır. | |
| negative_attention_mask (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş negatif dikkat maskesi. `negative_prompt_embeds` doğrudan geçiriliyorsa sağlanmalıdır. | |
| İsteği metin kodlayıcı gizli durumlarına kodlar. | |
| ## Kandinsky3Img2ImgPipeline[[diffusers.Kandinsky3Img2ImgPipeline]] | |
| #### diffusers.Kandinsky3Img2ImgPipeline[[diffusers.Kandinsky3Img2ImgPipeline]] | |
| ```python | |
| diffusers.Kandinsky3Img2ImgPipeline(tokenizer: T5Tokenizer, text_encoder: T5EncoderModel, unet: Kandinsky3UNet, scheduler: DDPMScheduler, movq: VQModel) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/kandinsky3/pipeline_kandinsky3_img2img.py#L56) | |
| #### __call__[[diffusers.Kandinsky3Img2ImgPipeline.__call__]] | |
| ```python | |
| __call__(prompt: str | list[str] = None, image: typing.Union[torch.Tensor, list[torch.Tensor], PIL.Image.Image, list[PIL.Image.Image]] = None, strength: float = 0.3, num_inference_steps: int = 25, guidance_scale: float = 3.0, negative_prompt: str | list[str] | None = None, num_images_per_prompt: int | None = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, attention_mask: typing.Optional[torch.Tensor] = None, negative_attention_mask: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list = ['latents'], **kwargs) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/kandinsky3/pipeline_kandinsky3_img2img.py#L400) | |
| **Parametreler:** | |
| prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimi yönlendirmek için istem veya istemler. Tanımlanmamışsa, bunun yerine `prompt_embeds` geçirilmelidir. | |
| image (`torch.Tensor`, `PIL.Image.Image`, `np.ndarray`, `list[torch.Tensor]`, `list[PIL.Image.Image]` veya `list[np.ndarray]`) : `Image` veya bir görüntü grubunu temsil eden tensör; süreç için başlangıç noktası olarak kullanılacaktır. | |
| strength (`float`, *opsiyonel*, varsayılan 0.8) : Referans `image`'in dönüştürülme derecesini belirtir. 0 ile 1 arasında olmalıdır. `image` bir başlangıç noktası olarak kullanılır ve `strength` değeri arttıkça daha fazla gürültü eklenir. Gürültü azaltma adımlarının sayısı, başlangıçta eklenen gürültü miktarına bağlıdır. `strength` 1 olduğunda eklenen gürültü maksimumdur ve gürültü azaltma süreci, `num_inference_steps` içinde belirtilen tam tekrar sayısı kadar çalışır. 1 değeri, `image`'ı fiilen yok sayar. | |
| num_inference_steps (`int`, *isteğe bağlı*, varsayılan 50) : Gürültü azaltma adım sayısı. Daha fazla gürültü azaltma adımı genellikle daha yavaş çıkarım pahasına daha yüksek kaliteli bir görüntüye yol açar. | |
| guidance_scale (`float`, *isteğe bağlı*, varsayılan 3.0) : [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598)'de tanımlandığı gibi yönlendirme ölçeği. `guidance_scale`, [Imagen Paper](https://huggingface.co/papers/2205.11487)'deki 2. denklemindeki `w` olarak tanımlanır. Yönlendirme ölçeği, `guidance_scale > 1` olarak ayarlanarak etkinleştirilir. Daha yüksek yönlendirme ölçeği, genellikle daha düşük görüntü kalitesi pahasına, `prompt` ile yakından ilişkili görüntülerin üretilmesini teşvik eder. | |
| negative_prompt (`str` veya `list[str]`, *isteğe bağlı*) : Görsel üretimi yönlendirmemek için kullanılan istem veya istemler. Tanımlanmazsa, bunun yerine `negative_prompt_embeds` parametresinin geçirilmesi gerekir. Yönlendirme kullanılmadığında (yani `guidance_scale` değeri `1`'den küçükse) yok sayılır. | |
| 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ı*) : Üretimi deterministik hale getirmek için bir veya [torch üreteci(leri)](https://pytorch.org/docs/stable/generated/torch.Generator.html) listesi. | |
| prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, metin gömme değerleri `prompt` girdi argümanından oluşturulur. | |
| negative_prompt_embeds (`torch.Tensor`, *isteğe bağlı*) : Ön oluşturulmuş negatif metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, negative_prompt_embeds, `negative_prompt` girdi argümanından oluşturulur. | |
| attention_mask (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş dikkat maskesi. `prompt_embeds` doğrudan geçiriliyorsa sağlanmalıdır. | |
| negative_attention_mask (`torch.Tensor`, *isteğe bağlı*) : Önceden oluşturulmuş negatif dikkat maskesi. `negative_prompt_embeds` doğrudan geçiriliyorsa sağlanmalıdır. | |
| output_type (`str`, *isteğe bağlı*, varsayılan `"pil"`) : Üretilen görüntünün çıktı biçimi. [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` veya `np.array` arasında seçim yapın. | |
| return_dict (`bool`, *isteğe bağlı*, varsayılan `True`) : Düz bir tuple yerine `~pipelines.stable_diffusion.IFPipelineOutput` döndürülecek mi? | |
| callback_on_step_end (`Callable`, *isteğe bağlı*) : Çıkarım sırasında her gürültü azaltma adımının sonunda çağrılan bir işlev. İşlev aşağıdaki argümanlarla çağrılır: `callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`. `callback_kwargs`, `callback_on_step_end_tensor_inputs` tarafından belirtilen tüm tensörlerin listesini içerir. | |
| callback_on_step_end_tensor_inputs (`list`, *isteğe bağlı*) : `callback_on_step_end` işlevi için girdi tensörlerinin listesi. Listede belirtilen tensörler, `callback_kwargs` argümanı olarak geçirilir. Yalnızca pipeline sınıfınızın `._callback_tensor_inputs` özniteliğinde listelenen değişkenleri dahil edebilirsiniz. | |
| **Dönüş:** [ImagePipelineOutput](/docs/diffusers/main/tr/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) veya `tuple` | |
| Üretim için pipeline çağrıldığında tetiklenen işlev. | |
| Örnekler: | |
| ```py | |
| >>> from diffusers import AutoPipelineForImage2Image | |
| >>> from diffusers.utils import load_image | |
| >>> import torch | |
| >>> pipe = AutoPipelineForImage2Image.from_pretrained( | |
| ... "kandinsky-community/kandinsky-3", variant="fp16", torch_dtype=torch.float16 | |
| ... ) | |
| >>> pipe.enable_model_cpu_offload() | |
| >>> prompt = "A painting of the inside of a subway train with tiny raccoons." | |
| >>> image = load_image( | |
| ... "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/kandinsky3/t2i.png" | |
| ... ) | |
| >>> generator = torch.Generator(device="cpu").manual_seed(0) | |
| >>> image = pipe(prompt, image=image, strength=0.75, num_inference_steps=25, generator=generator).images[0] | |
| ``` | |
| #### encode_prompt[[diffusers.Kandinsky3Img2ImgPipeline.encode_prompt]] | |
| ```python | |
| encode_prompt(prompt, do_classifier_free_guidance = True, num_images_per_prompt = 1, device = None, negative_prompt = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, _cut_context = True, attention_mask: typing.Optional[torch.Tensor] = None, negative_attention_mask: typing.Optional[torch.Tensor] = None) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/kandinsky3/pipeline_kandinsky3_img2img.py#L106) | |
| **Parametreler:** | |
| prompt (`str` veya `list[str]`, *isteğe bağlı*) : kodlanacak istem | |
| İsteği metin kodlayıcı gizli durumlarına kodlar. | |
| device: (`torch.device`, *isteğe bağlı*): Sonuçtaki gömme vektörlerinin yerleştirileceği torch cihazı num_images_per_prompt (`int`, *isteğe bağlı*, varsayılan 1): Her istem için oluşturulması gereken görsel sayısı do_classifier_free_guidance (`bool`, *isteğe bağlı*, varsayılan `True`): Sınıflandırıcı serbest yönlendirmenin (classifier free guidance) kullanılıp kullanılmayacağını belirtir negative_prompt (`str` veya `list[str]`, *isteğe bağlı*): Görsel üretimini yönlendirmemek için kullanılan istem veya istemler. Tanımlanmadıysa bunun yerine `negative_prompt_embeds` geçirilmelidir. Tanımlanmadıysa bunun yerine `negative_prompt_embeds` geçirilmelidir. Yönlendirme kullanılmadığında yok sayılır (yani `guidance_scale` `1`'den küçükse yok sayılır). prompt_embeds (`torch.Tensor`, *isteğe bağlı*): Önceden oluşturulmuş metin gömme vektörleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, metin gömme vektörleri `prompt` girdi argümanından oluşturulur. negative_prompt_embeds (`torch.Tensor`, *isteğe bağlı*): Önceden oluşturulmuş negatif metin gömme vektörleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmazsa, negative_prompt_embeds `negative_prompt` girdi argümanından oluşturulur. attention_mask (`torch.Tensor`, *isteğe bağlı*): Önceden oluşturulmuş dikkat maskesi. `prompt_embeds` doğrudan geçiriliyorsa sağlanmalıdır. negative_attention_mask (`torch.Tensor`, *isteğe bağlı*): Önceden oluşturulmuş negatif dikkat maskesi. `negative_prompt_embeds` doğrudan geçiriliyorsa sağlanmalıdır. | |
Xet Storage Details
- Size:
- 20.3 kB
- Xet hash:
- c69b66b4b2d0d145306bd6c74d5ef5353a9129cf2ecc1091f1644797600151e0
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.