Buckets:
| # | |
| # Apache Lisansı, 2.0 Sürümü ("Lisans") altında lisanslanmıştır; | |
| # bu dosyayı, Lisansa uygun olarak kullanabilirsiniz. | |
| # Lisansın bir kopyasını şu adresten edinebilirsiniz | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Uygulanabilir yasa gerektirmedikçe veya yazılı olarak anlaşılmadıkça, yazılım | |
| # Lisans kapsamında dağıtılan, "OLDUĞU GİBİ" esasına göre dağıtılır, | |
| # HİÇBİR TÜR AÇIK VEYA ZIMMİ GARANTİ VEYA ŞART İÇERMEZ. | |
| # İzinleri ve | |
| # lisans kapsamındaki kısıtlamalar. --> | |
| # PRX | |
| PRX, metin jetonlarının transformer blokları boyunca güncellenmediği basitleştirilmiş bir MMDIT mimarisi kullanarak metinden yüksek kaliteli görseller üretir. Verimli örneklemeler için ayrık zamanlamalı akış eşleştirmesi (flow matching) kullanır ve çok dilli metin kodlaması için Google'ın T5Gemma-2B-2B-UL2 modelini kullanır. ~1.3B parametreli transformer, kaliteden ödün vermeden hızlı çıkarım sağlar. Dengeli kalite ve hız için Flux VAE (8x sıkıştırma, 16 latent kanal) veya latent sıkıştırma ve daha hızlı işleme için DC-AE (32x sıkıştırma, 32 latent kanal) arasında seçim yapabilirsiniz. | |
| ## Mevcut modeller | |
| PRX, farklı VAE yapılandırmalarına sahip birden fazla varyant sunar; her biri belirli çözünürlükler için optimize edilmiştir. Temel modeller, ayrıntılı istemlerle mükemmel performans gösterir; karmaşık kompozisyonları ve ince detayları yakalar. [Alchemist veri seti](https://huggingface.co/datasets/yandex/alchemist) üzerinde eğitilmiş ince ayarlı modeller, özellikle daha basit istemlerle estetik kaliteyi artırır. | |
| | Model | Çözüm | İnce ayarlanmış | Damıtılmış | Açıklama | Önerilen istemler | Önerilen parametreler | Önerilen dtype | | |
| |:-----:|:-----------------:|:----------:|:----------:|:----------:|:----------:|:----------:|:----------:| | |
| | [`Photoroom/prx-256-t2i`](https://huggingface.co/Photoroom/prx-256-t2i)| 256 | Hayır | Hayır | 256'de Flux VAE ile ön eğitilmiş temel model|Doğal dilde ayrıntılı istemlerle en iyi sonucu verir|28 adım, cfg=5.0| `torch.bfloat16` | | |
| | [`Photoroom/prx-256-t2i-sft`](https://huggingface.co/Photoroom/prx-256-t2i-sft)| 512 | Evet | Hayır | Flux VAE ile [Alchemist dataset](https://huggingface.co/datasets/yandex/alchemist) veri setinde ince ayar yapıldı | Daha az detaylı istemleri işleyebilir|28 adım, cfg=5.0| `torch.bfloat16` | | |
| | [`Photoroom/prx-512-t2i`](https://huggingface.co/Photoroom/prx-512-t2i)| 512 | Hayır | Hayır | 512'de Flux VAE ile ön eğitilmiş temel model |Doğal dilde ayrıntılı istemlerle en iyi sonucu verir|28 adım, cfg=5.0| `torch.bfloat16` | | |
| | [`Photoroom/prx-512-t2i-sft`](https://huggingface.co/Photoroom/prx-512-t2i-sft)| 512 | Evet | Hayır | Flux VAE ile [Alchemist dataset](https://huggingface.co/datasets/yandex/alchemist) veri setinde ince ayar yapıldı | Doğal dilde daha az ayrıntılı istekleri işleyebilir|28 adım, cfg=5.0| `torch.bfloat16` | | |
| | [`Photoroom/prx-512-t2i-sft-distilled`](https://huggingface.co/Photoroom/prx-512-t2i-sft-distilled)| 512 | Evet | Evet | [`Photoroom/prx-512-t2i-sft`](https://huggingface.co/Photoroom/prx-512-t2i-sft) modelinden 8 adımlık damıtılmış model | Doğal dilde daha az ayrıntılı istekleri işleyebilir|8 adım, cfg=1.0| `torch.bfloat16` | | |
| | [`Photoroom/prx-512-t2i-dc-ae`](https://huggingface.co/Photoroom/prx-512-t2i-dc-ae)| 512 | Hayır | Hayır | 512'de [Deep Compression Autoencoder (DC-AE)](https://hanlab.mit.edu/projects/dc-ae) ile ön eğitilmiş temel model|Doğal dilde ayrıntılı istemlerle en iyi sonucu verir|28 adım, cfg=5.0| `torch.bfloat16` | | |
| | [`Photoroom/prx-512-t2i-dc-ae-sft`](https://huggingface.co/Photoroom/prx-512-t2i-dc-ae-sft)| 512 | Evet | Hayır | [Alchemist veri seti](https://huggingface.co/datasets/yandex/alchemist) üzerinde [Deep Compression Autoencoder (DC-AE)](https://hanlab.mit.edu/projects/dc-ae) ile ince ayar yapılmıştır | Doğal dilde daha az ayrıntılı istekleri işleyebilir|28 adım, cfg=5.0| `torch.bfloat16` | | |
| | [`Photoroom/prx-512-t2i-dc-ae-sft-distilled`](https://huggingface.co/Photoroom/prx-512-t2i-dc-ae-sft-distilled)| 512 | Evet | Evet | [`Photoroom/prx-512-t2i-dc-ae-sft-distilled`](https://huggingface.co/Photoroom/prx-512-t2i-dc-ae-sft-distilled) modelinden türetilmiş 8 adımlık model | Doğal dilde daha az detaylı istemleri işleyebilir|8 adım, cfg=1.0| `torch.bfloat16` |s | |
| Daha fazla bilgi için [bu](https://huggingface.co/collections/Photoroom/prx-models-68e66254c202ebfab99ad38e) koleksiyona başvurun. | |
| ## Hattın yüklenmesi | |
| Load the pipeline with [from_pretrained()](/docs/diffusers/main/tr/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained). | |
| ```py | |
| from diffusers.pipelines.prx import PRXPipeline | |
| # Load pipeline - VAE and text encoder will be loaded from HuggingFace | |
| pipe = PRXPipeline.from_pretrained("Photoroom/prx-512-t2i-sft", dtype=torch.bfloat16) | |
| pipe.to("cuda") # or "mps", "xpu", "cpu" | |
| prompt = "A front-facing portrait of a lion the golden savanna at sunset." | |
| image = pipe(prompt, num_inference_steps=28, guidance_scale=5.0).images[0] | |
| image.save("prx_output.png") | |
| ``` | |
| ### Manuel Bileşen Yükleme | |
| Örneğin, kuantize modelleri kullanmak için hattı özelleştirmek üzere bileşenleri ayrı ayrı yükleyin. | |
| ```py | |
| import torch | |
| from diffusers.pipelines.prx import PRXPipeline | |
| from diffusers.models import AutoencoderKL, AutoencoderDC | |
| from diffusers.models.transformers.transformer_prx import PRXTransformer2DModel | |
| from diffusers.schedulers import FlowMatchEulerDiscreteScheduler | |
| from transformers import T5GemmaModel, GemmaTokenizerFast | |
| from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig | |
| from transformers import BitsAndBytesConfig as BitsAndBytesConfig | |
| quant_config = DiffusersBitsAndBytesConfig(load_in_8bit=True) | |
| # Load transformer | |
| transformer = PRXTransformer2DModel.from_pretrained( | |
| "checkpoints/prx-512-t2i-sft", | |
| subfolder="transformer", | |
| quantization_config=quant_config, | |
| dtype=torch.bfloat16, | |
| ) | |
| # Load scheduler | |
| scheduler = FlowMatchEulerDiscreteScheduler.from_pretrained( | |
| "checkpoints/prx-512-t2i-sft", subfolder="scheduler" | |
| ) | |
| # Load T5Gemma text encoder | |
| t5gemma_model = T5GemmaModel.from_pretrained("google/t5gemma-2b-2b-ul2", | |
| quantization_config=quant_config, | |
| dtype=torch.bfloat16) | |
| text_encoder = t5gemma_model.encoder.to(dtype=torch.bfloat16) | |
| tokenizer = GemmaTokenizerFast.from_pretrained("google/t5gemma-2b-2b-ul2") | |
| tokenizer.model_max_length = 256 | |
| # Load VAE - choose either Flux VAE or DC-AE | |
| # Flux VAE | |
| vae = AutoencoderKL.from_pretrained("black-forest-labs/FLUX.1-dev", | |
| subfolder="vae", | |
| quantization_config=quant_config, | |
| dtype=torch.bfloat16) | |
| pipe = PRXPipeline( | |
| transformer=transformer, | |
| scheduler=scheduler, | |
| text_encoder=text_encoder, | |
| tokenizer=tokenizer, | |
| vae=vae | |
| ) | |
| pipe.to("cuda") # or "mps", "xpu", "cpu" | |
| ``` | |
| ## Bellek Optimizasyonu | |
| Bellek kısıtlamalı ortamlar için: | |
| ```py | |
| import torch | |
| from diffusers.pipelines.prx import PRXPipeline | |
| pipe = PRXPipeline.from_pretrained("Photoroom/prx-512-t2i-sft", dtype=torch.bfloat16) | |
| pipe.enable_model_cpu_offload() # Offload components to CPU when not in use | |
| # Or use sequential CPU offload for even lower memory | |
| pipe.enable_sequential_cpu_offload() | |
| ``` | |
| ## PRXPipeline[[diffusers.PRXPipeline]] | |
| #### diffusers.PRXPipeline[[diffusers.PRXPipeline]] | |
| ```python | |
| diffusers.PRXPipeline(transformer: PRXTransformer2DModel, scheduler: FlowMatchEulerDiscreteScheduler, text_encoder: T5GemmaEncoder, tokenizer: transformers.models.t5.tokenization_t5.T5Tokenizer | transformers.models.gemma.tokenization_gemma.GemmaTokenizer | transformers.models.auto.tokenization_auto.AutoTokenizer, vae: diffusers.models.autoencoders.autoencoder_kl.AutoencoderKL | diffusers.models.autoencoders.autoencoder_dc.AutoencoderDC | None = None, default_sample_size: int | None = 512) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/prx/pipeline_prx.py#L257) | |
| **Parametreler:** | |
| transformer (`PRXTransformer2DModel`) : Kodlanmış görüntü latentlerini gürültüden arındırmak için kullanılan PRX transformer modeli. | |
| scheduler ([FlowMatchEulerDiscreteScheduler](/docs/diffusers/main/tr/api/schedulers/flow_match_euler_discrete#diffusers.FlowMatchEulerDiscreteScheduler)) : Kodlanmış görüntü latentlerini gürültüden arındırmak için `transformer` ile birlikte kullanılacak bir zamanlayıcı. | |
| text_encoder (`T5GemmaEncoder`) : İfadeleri kodlamak için metin kodlayıcı modeli. | |
| tokenizer ([`T5TokenizerFast` veya `GemmaTokenizerFast`]) : Metin kodlayıcısı için tokenizer. | |
| vae ([AutoencoderKL](/docs/diffusers/main/tr/api/models/autoencoderkl#diffusers.AutoencoderKL) veya [AutoencoderDC](/docs/diffusers/main/tr/api/models/autoencoder_dc#diffusers.AutoencoderDC)) : Görüntüleri latent temsillere kodlamak ve bu temsillerden çözmek için kullanılan Varyasyonel Oto-Kodlayıcı (VAE) Modeli. Hem AutoencoderKL (8x sıkıştırma) hem de AutoencoderDC (32x sıkıştırma) desteklenir. | |
| PRX Transformer kullanılarak metinden görüntüye üretim için Pipeline. | |
| Bu model [DiffusionPipeline](/docs/diffusers/main/tr/api/pipelines/overview#diffusers.DiffusionPipeline) sınıfından devralır. Kütüphanenin tüm pipeline'lar için uyguladığı genel yöntemler (indirme veya kaydetme, belirli bir cihazda çalıştırma vb.) için üst sınıf belgelendirmesine bakın. | |
| #### __call__[[diffusers.PRXPipeline.__call__]] | |
| ```python | |
| __call__(prompt: str | list[str] = None, negative_prompt: str = '', height: int | None = None, width: int | None = None, num_inference_steps: int = 28, timesteps: list = None, guidance_scale: float = 4.0, num_images_per_prompt: int | None = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.FloatTensor] = None, negative_prompt_embeds: typing.Optional[torch.FloatTensor] = None, prompt_attention_mask: typing.Optional[torch.BoolTensor] = None, negative_prompt_attention_mask: typing.Optional[torch.BoolTensor] = None, output_type: str | None = 'pil', return_dict: bool = True, use_resolution_binning: bool = True, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list = ['latents'], tokenizer_max_length: int | None = None, skip_text_cleaning: bool = False) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/prx/pipeline_prx.py#L554) | |
| **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. | |
| negative_prompt (*str*, *optional*, varsayılan *""*) : Görsel üretimi yönlendirmemek için kullanılan istem veya istemler. Yönlendirme kullanılmadığında yok sayılır (yani *guidance_scale* *1*'den küçükse yok sayılır). | |
| height (*int*, *optional*, varsayılan: self.transformer.config.sample_size * self.vae_scale_factor) : Üretilen görüntünün piksel cinsinden yüksekliği. | |
| width (*int*, *optional*, varsayılan: self.transformer.config.sample_size * self.vae_scale_factor) : Üretilen görüntünün piksel cinsinden genişliği. | |
| num_inference_steps (*int*, *optional*, varsayılan 28) : 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. | |
| timesteps (*list[int]*, *opsiyonel*) : *set_timesteps* metodunda *timesteps* argümanını destekleyen zamanlayıcılarla (scheduler) gürültü azaltma (denoising) süreci için kullanılacak özel zaman adımları. Tanımlanmamışsa, *num_inference_steps* geçirildiğinde varsayılan davranış kullanılır. Azalan sırada olmalıdır. | |
| guidance_scale (*float*, *optional*, varsayılan 4.0) : [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598)'de tanımlanan yönlendirme ölçeği. *guidance_scale*, [Imagen Paper](https://huggingface.co/papers/2205.11487)'deki 2. denklemindeki *w* olarak tanımlanır. *guidance_scale > 1* ayarlanarak yönlendirme ölçeği 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. | |
| num_images_per_prompt (*int*, *optional*, varsayılan 1) : Her istem için üretilecek görsel sayısı. | |
| generator (*torch.Generator* veya *list[torch.Generator]*, *opsiyonel*) : Üretimi deterministik hale getirmek için bir veya bir [torch generator(ları)](https://pytorch.org/docs/stable/generated/torch.Generator.html) listesi. | |
| latents (*torch.Tensor*, *opsiyonel*) : Görsel üretimi için girdi olarak kullanılacak, Gauss dağılımından örneklenen önceden oluşturulmuş gürültülü latensler. Farklı istemlerle aynı üretimi ayarlamak için kullanılabilir. Sağlanmazsa, sağlanan rastgele *generator* kullanılarak örneklem yoluyla bir latens tensörü oluşturulur. | |
| prompt_embeds (*torch.FloatTensor*, *opsiyonel*) : Ö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.FloatTensor*, *opsiyonel*) : Ön oluşturulmuş negatif metin gömme değerleri. Metin girdilerini kolayca ayarlamak için kullanılabilir, *ör.* istem ağırlıklandırması. Sağlanmaz ve *guidance_scale > 1* ise, negatif gömme değerleri boş bir diziden oluşturulur. | |
| prompt_attention_mask (*torch.BoolTensor*, *opsiyonel*) : *prompt_embeds* için önceden oluşturulmuş dikkat maskesi. Sağlanmazsa, dikkat maskesi *prompt* girdi argümanından oluşturulur. | |
| negative_prompt_attention_mask (*torch.BoolTensor*, *opsiyonel*) : *negative_prompt_embeds* için önceden oluşturulmuş dikkat maskesi. Sağlanmazsa ve *guidance_scale > 1* ise, dikkat maskesi boş bir diziden oluşturulur. | |
| output_type (*str*, *opsiyonel*, 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. | |
| tokenizer_max_length (*int*, *opsiyonel*) : İfadenin (prompt) tokenize edilmesinde kullanılan maksimum token sayısını geçersiz kılar. Ayarlanmadığında, varsayılan olarak tokenizer'ın kendi `model_max_length` değerini kullanır. | |
| skip_text_cleaning (*bool*, *isteğe bağlı*, varsayılan *False*) : *True* ise, tam DeepFloyd temizleme hattı yerine yalnızca hafif istem temizliği (kodlamayı düzelt + HTML kaçışlarını kaldır) kullanılır. | |
| return_dict (*bool*, *opsiyonel*, varsayılan *True*) : Düz bir tuple yerine [*~pipelines.prx.PRXPipelineOutput*] döndürülüp döndürülmediğini belirtir. | |
| use_resolution_binning (*bool*, *opsiyonel*, varsayılan *True*) : *True* olarak ayarlanırsa, istenen yükseklik ve genişlik, önceden tanımlı en-boy oranı sınıfları kullanılarak en yakın çözünürlüklere eşlenir. Üretilen latentler görüntülere çözümlendikten sonra, istenen çözünürlüğe yeniden boyutlandırılır. Optimal çözünürlüklerde kare olmayan görüntüler üretmek için faydalıdır. | |
| 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 şu argümanlarla çağrılır: *callback_on_step_end(self, step, timestep, callback_kwargs)*. *callback_kwargs*, *callback_on_step_end_tensor_inputs* tarafından belirtildiği üzere tüm tensörlerin listesini içerecektir. | |
| callback_on_step_end_tensor_inputs (*list*, *optional*) : *callback_on_step_end* fonksiyonu için girdi tensörlerinin listesi. Listede belirtilen tensörler *callback_kwargs* argümanı olarak geçirilir. Yalnızca *._callback_tensor_inputs* özniteliğinde listelenen tensörleri dahil edebilirsiniz. | |
| **Dönüş:** [*~pipelines.prx.PRXPipelineOutput*] veya *tuple` | |
| [*~pipelines.prx.PRXPipelineOutput*] *return_dict* True ise, aksi halde bir *tuple*. Tuple döndürüldüğünde, ilk öğe üretilen görsellerin listesidir. | |
| Üretim için pipeline çağrıldığında tetiklenen işlev. | |
| Örnekler: | |
| ```py | |
| >>> import torch | |
| >>> from diffusers import PRXPipeline | |
| >>> # Load pipeline with from_pretrained | |
| >>> pipe = PRXPipeline.from_pretrained("Photoroom/prx-512-t2i-sft") | |
| >>> pipe.to("cuda") | |
| >>> prompt = "A digital painting of a rusty, vintage tram on a sandy beach" | |
| >>> image = pipe(prompt, num_inference_steps=28, guidance_scale=5.0).images[0] | |
| >>> image.save("prx_output.png") | |
| ``` | |
| #### check_inputs[[diffusers.PRXPipeline.check_inputs]] | |
| ```python | |
| check_inputs(prompt: str | list[str], height: int, width: int, guidance_scale: float, callback_on_step_end_tensor_inputs: list[str] | None = None, prompt_embeds: typing.Optional[torch.FloatTensor] = None, negative_prompt_embeds: typing.Optional[torch.FloatTensor] = None) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/prx/pipeline_prx.py#L500) | |
| Tüm girdilerin doğru formatta olduğunu kontrol edin. | |
| #### encode_prompt[[diffusers.PRXPipeline.encode_prompt]] | |
| ```python | |
| encode_prompt(prompt: str | list[str], device: typing.Optional[torch.device] = None, do_classifier_free_guidance: bool = True, negative_prompt: str = '', num_images_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.FloatTensor] = None, negative_prompt_embeds: typing.Optional[torch.FloatTensor] = None, prompt_attention_mask: typing.Optional[torch.BoolTensor] = None, negative_prompt_attention_mask: typing.Optional[torch.BoolTensor] = None, tokenizer_max_length: int | None = None, skip_text_cleaning: bool = False) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/prx/pipeline_prx.py#L376) | |
| Standart metin kodlayıcı ve belirteçleyiciyi kullanarak metin komutunu kodlayın veya önceden hesaplanmış gömme değerlerini kullanın. | |
| #### get_default_resolution[[diffusers.PRXPipeline.get_default_resolution]] | |
| ```python | |
| get_default_resolution() | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/prx/pipeline_prx.py#L340) | |
| **Dönüş:** `int` | |
| Üretim için kullanılacak varsayılan örnek boyutu (yükseklik/genişlik). | |
| Yüklenen VAE ve yapılandırmaya göre varsayılan çözünürlüğü belirleyin. | |
| #### prepare_latents[[diffusers.PRXPipeline.prepare_latents]] | |
| ```python | |
| prepare_latents(batch_size: int, num_channels_latents: int, height: int, width: int, dtype: dtype, device: device, generator: typing.Optional[torch.Generator] = None, latents: typing.Optional[torch.Tensor] = None) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/prx/pipeline_prx.py#L352) | |
| Difüzyon süreci için başlangıç latenslerini hazırlar. | |
| ## PRXPipelineOutput[[diffusers.pipelines.prx.PRXPipelineOutput]] | |
| #### diffusers.pipelines.prx.PRXPipelineOutput[[diffusers.pipelines.prx.PRXPipelineOutput]] | |
| ```python | |
| diffusers.pipelines.prx.PRXPipelineOutput(images: list[PIL.Image.Image] | numpy.ndarray) | |
| ``` | |
| [Kaynak](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/prx/pipeline_output.py#L24) | |
| **Parametreler:** | |
| images (`list[PIL.Image.Image]` veya `np.ndarray`) : `batch_size` uzunluğunda gürültüsü azaltılmış PIL görselleri listesi veya `(batch_size, height, width, num_channels)` biçiminde numpy dizisi. PIL görselleri veya numpy dizisi, difüzyon hattının gürültüsü azaltılmış görsellerini temsil eder. | |
| PRX hatları için çıktı sınıfı. | |
Xet Storage Details
- Size:
- 20 kB
- Xet hash:
- a53c8e27ed9f3e3e91d72a3c4ccbaa3852a798b25e808b67f24591386a33119d
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.