Buckets:

mishig's picture
|
download
raw
30.2 kB
# ๋ชจ๋ธ
๐Ÿค— Diffusers๋Š” ์ธ๊ธฐ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ์‚ฌ์ „ ํ•™์Šต๋œ ๋ชจ๋ธ๊ณผ ์ปค์Šคํ…€ diffusion ์‹œ์Šคํ…œ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์˜ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ๋ถ„ํฌ \\(p_{\theta}(x_{t-1}|x_{t})\\)๋กœ ๋ชจ๋ธ๋ง๋œ ์ž…๋ ฅ ์ƒ˜ํ”Œ์˜ ๋…ธ์ด์ฆˆ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ชจ๋“  ๋ชจ๋ธ์€ ๋กœ์ปฌ ๋ฐ Hugging Face Hub์—์„œ ๋ชจ๋ธ์„ ์ €์žฅํ•˜๊ณ  ๋กœ๋“œํ•˜๋Š” ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” [`torch.nn.Module`](https://pytorch.org/docs/stable/generated/torch.nn.Module.html)์ธ ๊ธฐ๋ณธ [ModelMixin](/docs/diffusers/main/ko/api/models/overview#diffusers.ModelMixin) ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.
## ModelMixin[[diffusers.ModelMixin]]
#### diffusers.ModelMixin[[diffusers.ModelMixin]]
```python
diffusers.ModelMixin()
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L243)
๋ชจ๋“  ๋ชจ๋ธ์˜ ๋ฒ ์ด์Šค ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
[ModelMixin](/docs/diffusers/main/ko/api/models/overview#diffusers.ModelMixin)์€ ๋ชจ๋ธ ๊ตฌ์„ฑ์„ ์ €์žฅํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋ชจ๋ธ์„ ๋กœ๋“œ, ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ €์žฅํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
- **config_name** (`str`) -- [save_pretrained()](/docs/diffusers/main/ko/api/models/overview#diffusers.ModelMixin.save_pretrained)๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋ชจ๋ธ์„ ์ €์žฅํ•  ํŒŒ์ผ ์ด๋ฆ„.
#### compile_repeated_blocks[[diffusers.ModelMixin.compile_repeated_blocks]]
```python
compile_repeated_blocks(*args, **kwargs)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L1678)
๋ชจ๋ธ ์ „์ฒด๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋Œ€์‹ , ๋ชจ๋ธ ๋‚ด์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์„œ๋ธŒ๋ชจ๋“ˆ(์˜ˆ: Transformer ๋ ˆ์ด์–ด)๋งŒ *์ปดํŒŒ์ผ*ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋ฒ•์€ **๋ฆฌ์ „๋„ ์ปดํŒŒ์ผ**(PyTorch ๋ ˆ์‹œํ”ผ https://docs.pytorch.org/tutorials/recipes/regional_compilation.html ์ฐธ์กฐ)์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, ์ „์ฒด `torch.compile`์—์„œ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„ ์†๋„ ํ–ฅ์ƒ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์—”๋“œํˆฌ์—”๋“œ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ปดํŒŒ์ผํ•  ์„œ๋ธŒ๋ชจ๋“ˆ ์ง‘ํ•ฉ์€ ๋ชจ๋ธ ์ •์˜์— **`_repeated_blocks`** ์†์„ฑ์ด ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋กœ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ์ด ์†์„ฑ์„ ๋ชจ๋ธ ์„œ๋ธŒํด๋ž˜์Šค์— ํด๋ž˜์Šค ์ด๋ฆ„(๋ฌธ์ž์—ด)์˜ ๋ฆฌ์ŠคํŠธ/ํŠœํ”Œ๋กœ ์ •์˜ํ•˜์‹ญ์‹œ์˜ค. ํด๋ž˜์Šค ์ด๋ฆ„์ด ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๋ชจ๋“ˆ์ด ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.
๋ฐœ๊ฒฌ๋œ ๊ฐ ๋งค์นญ ์„œ๋ธŒ๋ชจ๋“ˆ์€ `submodule.compile(*args, **kwargs)`๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. `compile_repeated_blocks`์— ์ „๋‹ฌํ•˜๋Š” ๋ชจ๋“  ์œ„์น˜ ์ธ์ž ๋˜๋Š” ํ‚ค์›Œ๋“œ ์ธ์ž๋Š” `torch.compile`์— ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
#### cuda[[diffusers.ModelMixin.cuda]]
```python
cuda(*args, **kwargs)
```
์ ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๊ฒฝ๋กœ(์˜ˆ: `torch.float32`)์˜ mock ๊ฐ’์ž…๋‹ˆ๋‹ค: ์†์„ฑ ์ ‘๊ทผ ์ฒด์ธ, ํ˜ธ์ถœ์€ pass-through ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋ฉฐ, `repr`์€ ํ•ด๋‹น ์ ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•˜๋ฉด plain-`type` ๋ฒ ์ด์Šค๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค(PEP 560 `__mro_entries__`). ๋”ฐ๋ผ์„œ ์‹ค์ œ ์„œ๋ธŒํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฉ”ํƒ€ํด๋ž˜์Šค๋ฅผ ์œ ์ง€ํ•˜๊ณ , `inspect.signature`๋Š” mock์˜ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ `__init__`๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
#### dequantize[[diffusers.ModelMixin.dequantize]]
```python
dequantize()
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L894)
์–‘์žํ™” ๋ฐฉ๋ฒ• ์ค‘ ์—ญ์–‘์žํ™”๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์–‘์žํ™”๋œ ๊ฒฝ์šฐ, ๋ชจ๋ธ์„ ์—ญ์–‘์žํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
#### disable_gradient_checkpointing[[diffusers.ModelMixin.disable_gradient_checkpointing]]
```python
disable_gradient_checkpointing()
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L327)
ํ˜„์žฌ ๋ชจ๋ธ์— ๋Œ€ํ•œ gradient checkpointing์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” *activation checkpointing* ๋˜๋Š” *checkpoint activations*๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค).
#### disable_npu_flash_attention[[diffusers.ModelMixin.disable_npu_flash_attention]]
```python
disable_npu_flash_attention()
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L358)
torch_npu์—์„œ npu flash attention ๋น„ํ™œ์„ฑํ™”
#### disable_xformers_memory_efficient_attention[[diffusers.ModelMixin.disable_xformers_memory_efficient_attention]]
```python
disable_xformers_memory_efficient_attention()
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L441)
[xFormers](https://facebookresearch.github.io/xformers/)์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์  ์–ดํ…์…˜์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
#### disable_xla_flash_attention[[diffusers.ModelMixin.disable_xla_flash_attention]]
```python
disable_xla_flash_attention()
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L388)
torch_xla์˜ flash attention pallals ์ปค๋„์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
#### enable_gradient_checkpointing[[diffusers.ModelMixin.enable_gradient_checkpointing]]
```python
enable_gradient_checkpointing(gradient_checkpointing_func: typing.Optional[typing.Callable] = None)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L297)
**๋งค๊ฐœ๋ณ€์ˆ˜:**
gradient_checkpointing_func (`Callable`, *์„ ํƒ ์‚ฌํ•ญ*) : gradient checkpointing์— ์‚ฌ์šฉํ•  ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. `None`์ธ ๊ฒฝ์šฐ, ๊ธฐ๋ณธ PyTorch checkpointing ํ•จ์ˆ˜(`torch.utils.checkpoint.checkpoint`)๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋ชจ๋ธ์— ๋Œ€ํ•ด gradient checkpointing์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” *activation checkpointing* ๋˜๋Š” *checkpoint activations*๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค).
#### enable_group_offload[[diffusers.ModelMixin.enable_group_offload]]
```python
enable_group_offload(onload_device: device, offload_device: device = torch.device(), offload_type: str = 'block_level', num_blocks_per_group: int | None = None, non_blocking: bool = False, use_stream: bool = False, record_stream: bool = False, low_cpu_mem_usage = False, offload_to_disk_path: str | None = None, block_modules: str | None = None, exclude_kwargs: str | None = None)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L532)
ํ˜„์žฌ ๋ชจ๋ธ์— ๋Œ€ํ•œ ๊ทธ๋ฃน ์˜คํ”„๋กœ๋”ฉ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
์ž์„ธํ•œ ๋‚ด์šฉ์€ [apply_group_offloading()](/docs/diffusers/main/ko/api/utilities#diffusers.hooks.apply_group_offloading)์„ ์ฐธ์กฐํ•˜์„ธ์š”.
์˜ˆ:
```python
>>> from diffusers import CogVideoXTransformer3DModel
>>> transformer = CogVideoXTransformer3DModel.from_pretrained(
... "THUDM/CogVideoX-5b", subfolder="transformer", torch_dtype=torch.bfloat16
... )
>>> transformer.enable_group_offload(
... onload_device=torch.device("cuda"),
... offload_device=torch.device("cpu"),
... offload_type="leaf_level",
... use_stream=True,
... )
```
#### enable_layerwise_casting[[diffusers.ModelMixin.enable_layerwise_casting]]
```python
enable_layerwise_casting(storage_dtype: dtype = torch.float8_e4m3fn, compute_dtype: typing.Optional[torch.dtype] = None, skip_modules_pattern: tuple[str, ...] | None = None, skip_modules_classes: tuple[typing.Type[torch.nn.Module], ...] | None = None, non_blocking: bool = False)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L447)
**๋งค๊ฐœ๋ณ€์ˆ˜:**
storage_dtype (`torch.dtype`) : ๋ชจ๋ธ์ด ์ €์žฅ๋˜๋„๋ก ์บ์ŠคํŒ…๋˜์–ด์•ผ ํ•  dtype์ž…๋‹ˆ๋‹ค.
compute_dtype (`torch.dtype`) : forward pass ์ค‘์— ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ์บ์ŠคํŒ…ํ•  dtype์ž…๋‹ˆ๋‹ค.
skip_modules_pattern (`tuple[str, ...]`, *์„ ํƒ ์‚ฌํ•ญ*) : ๋ ˆ์ด์–ด๋ณ„ ์บ์ŠคํŒ… ๊ณผ์ •์—์„œ ๊ฑด๋„ˆ๋›ธ ๋ชจ๋“ˆ์˜ ์ด๋ฆ„์„ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•œ ํŒจํ„ด ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค. `None`์œผ๋กœ ์„ค์ •ํ•˜๋ฉด, ๋ชจ๋“ˆ์˜ ํŠน์ • ๋‚ด๋ถ€ ๋ ˆ์ด์–ด์™€ PEFT ๋ ˆ์ด์–ด๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ฑด๋„ˆ๋›ฐ๊ธฐ ํŒจํ„ด์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
skip_modules_classes (`tuple[Type[torch.nn.Module], ...]`, *์„ ํƒ ์‚ฌํ•ญ*) : ๋ ˆ์ด์–ด๋ณ„ ์บ์ŠคํŒ… ๊ณผ์ •์—์„œ ๊ฑด๋„ˆ๋›ธ ๋ชจ๋“ˆ ํด๋ž˜์Šค ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
non_blocking (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `False`) : `True`์ธ ๊ฒฝ์šฐ, ๊ฐ€์ค‘์น˜ ์บ์ŠคํŒ… ์ž‘์—…์ด ๋น„์ฐจ๋‹จ(non-blocking) ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋ชจ๋ธ์— ๋Œ€ํ•ด ๋ ˆ์ด์–ด๋ณ„ ์บ์ŠคํŒ…์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
Layerwise casting์€ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ์ €์žฅ์„ ์œ„ํ•ด ๋” ๋‚ฎ์€ ์ •๋ฐ€๋„์˜ dtype์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋˜, ๊ณ„์‚ฐ ์‹œ์—๋Š” ๋” ๋†’์€ ์ •๋ฐ€๋„์˜ dtype์œผ๋กœ ์ฆ‰์‹œ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋กœ ์ธํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ถœ๋ ฅ์˜ ํ’ˆ์งˆ์ด ์ผ๋ถ€ ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ’ˆ์งˆ ์ €ํ•˜๋Š” ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด๋ฉฐ, ์ฃผ๋กœ ์ •๊ทœํ™” ๋ฐ ๋ณ€์กฐ ๋ ˆ์ด์–ด์˜ ๊ฐ€์ค‘์น˜ ๋ณ€ํ™˜์—์„œ ๋น„๋กฏ๋ฉ๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ diffusers์˜ ๋Œ€๋ถ€๋ถ„์˜ ๋ชจ๋ธ์€ ํŒจ์น˜ ์ž„๋ฒ ๋”ฉ, ์œ„์น˜ ์ž„๋ฒ ๋”ฉ ๋ฐ ์ •๊ทœํ™” ๋ ˆ์ด์–ด๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก `_skip_layerwise_casting_patterns` ์†์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋Ÿฌํ•œ ๋ ˆ์ด์–ด๊ฐ€ ํ’ˆ์งˆ์— ์žˆ์–ด ์ •๋ฐ€๋„๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด `_skip_layerwise_casting_patterns` ์†์„ฑ์„ `None`์œผ๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ์ •์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ [apply_layerwise_casting()](/docs/diffusers/main/ko/api/utilities#diffusers.hooks.apply_layerwise_casting)์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ:
[enable_layerwise_casting()](/docs/diffusers/main/ko/api/models/overview#diffusers.ModelMixin.enable_layerwise_casting) ์‚ฌ์šฉ:
```python
>>> from diffusers import CogVideoXTransformer3DModel
>>> transformer = CogVideoXTransformer3DModel.from_pretrained(
... "THUDM/CogVideoX-5b", subfolder="transformer", torch_dtype=torch.bfloat16
... )
>>> # Enable layerwise casting via the model, which ignores certain modules by default
>>> transformer.enable_layerwise_casting(storage_dtype=torch.float8_e4m3fn, compute_dtype=torch.bfloat16)
```
#### enable_npu_flash_attention[[diffusers.ModelMixin.enable_npu_flash_attention]]
```python
enable_npu_flash_attention()
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L351)
torch_npu์—์„œ npu flash attention ํ™œ์„ฑํ™”
#### enable_xformers_memory_efficient_attention[[diffusers.ModelMixin.enable_xformers_memory_efficient_attention]]
```python
enable_xformers_memory_efficient_attention(attention_op: typing.Optional[typing.Callable] = None)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L409)
**๋งค๊ฐœ๋ณ€์ˆ˜:**
attention_op (`Callable`, *์„ ํƒ ์‚ฌํ•ญ*) : xFormers์˜ [`memory_efficient_attention()`](https://facebookresearch.github.io/xformers/components/ops.html#xformers.ops.memory_efficient_attention) ํ•จ์ˆ˜์— `op` ์ธ์ˆ˜๋กœ ์‚ฌ์šฉ๋  ๋•Œ ๊ธฐ๋ณธ `None` ์—ฐ์‚ฐ์ž๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
[xFormers](https://facebookresearch.github.io/xformers/)์—์„œ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ธ ์–ดํ…์…˜์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
์ด ์˜ต์…˜์ด ํ™œ์„ฑํ™”๋˜๋ฉด GPU ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋‚ฎ์•„์ง€๊ณ  ์ถ”๋ก  ๊ณผ์ •์—์„œ ์†๋„ ํ–ฅ์ƒ์ด ๊ด€์ฐฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•™์Šต ๊ณผ์ •์—์„œ์˜ ์†๋„ ํ–ฅ์ƒ์€ ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
> [!WARNING] > โš ๏ธ memory efficient attention๊ณผ sliced attention์ด ๋ชจ๋‘ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ, memory efficient
attention์€ > ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
์˜ˆ:
```py
>>> import torch
>>> from diffusers import UNet2DConditionModel
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp
>>> model = UNet2DConditionModel.from_pretrained(
... "stabilityai/stable-diffusion-2-1", subfolder="unet", torch_dtype=torch.float16
... )
>>> model = model.to("cuda")
>>> model.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
```
#### enable_xla_flash_attention[[diffusers.ModelMixin.enable_xla_flash_attention]]
```python
enable_xla_flash_attention(partition_spec: typing.Optional[typing.Callable] = None, **kwargs)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L382)
torch_xla์— ๋Œ€ํ•œ flash attention pallals ์ปค๋„์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
#### from_pretrained[[diffusers.ModelMixin.from_pretrained]]
```python
from_pretrained(pretrained_model_name_or_path: str | os.PathLike | None, **kwargs)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L906)
**๋งค๊ฐœ๋ณ€์ˆ˜:**
pretrained_model_name_or_path (`str` ๋˜๋Š” `os.PathLike`, *์„ ํƒ ์‚ฌํ•ญ*) : ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - Hub์— ํ˜ธ์ŠคํŒ…๋œ ์‚ฌ์ „ ํ•™์Šต ๋ชจ๋ธ์˜ *๋ชจ๋ธ ID* ๋ฌธ์ž์—ด(์˜ˆ: `google/ddpm-celebahq-256`). - [save_pretrained()](/docs/diffusers/main/ko/api/models/overview#diffusers.ModelMixin.save_pretrained)๋กœ ์ €์žฅ๋œ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ ํฌํ•จํ•˜๋Š” *๋””๋ ‰ํ„ฐ๋ฆฌ* ๊ฒฝ๋กœ(์˜ˆ: `./my_model_directory`).
cache_dir (`str | os.PathLike`, *์„ ํƒ ์‚ฌํ•ญ*) : ํ‘œ์ค€ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, ๋‹ค์šด๋กœ๋“œ๋œ ์‚ฌ์ „ ํ•™์Šต ๋ชจ๋ธ ๊ตฌ์„ฑ์ด ์บ์‹œ๋˜๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.
dtype (`torch.dtype`, *์„ ํƒ ์‚ฌํ•ญ*) : ๊ธฐ๋ณธ `torch.dtype`๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ๋‹ค๋ฅธ dtype๋กœ ๋ชจ๋ธ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
force_download (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `False`) : ์บ์‹œ๋œ ๋ฒ„์ „์ด ์กด์žฌํ•˜๋”๋ผ๋„ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜ ๋ฐ ๊ตฌ์„ฑ ํŒŒ์ผ์˜ (์žฌ)๋‹ค์šด๋กœ๋“œ๋ฅผ ๊ฐ•์ œํ• ์ง€ ์—ฌ๋ถ€.
proxies (`dict[str, str]`, *์„ ํƒ ์‚ฌํ•ญ*) : ํ”„๋กœํ† ์ฝœ ๋˜๋Š” ์—”๋“œํฌ์ธํŠธ๋ณ„๋กœ ์‚ฌ์šฉํ•  ํ”„๋ก์‹œ ์„œ๋ฒ„์˜ ์‚ฌ์ „์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, `{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ ์š”์ฒญ์— ํ”„๋ก์‹œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
output_loading_info (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `False`) : ๋ˆ„๋ฝ๋œ ํ‚ค, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ‚ค ๋ฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํฌํ•จ๋œ ์‚ฌ์ „๋„ ํ•จ๊ป˜ ๋ฐ˜ํ™˜ํ• ์ง€ ์—ฌ๋ถ€.
local_files_only(`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `False`) : ๋กœ์ปฌ ๋ชจ๋ธ ๊ฐ€์ค‘์น˜ ๋ฐ ๊ตฌ์„ฑ ํŒŒ์ผ๋งŒ ๋กœ๋“œํ• ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. `True`๋กœ ์„ค์ •ํ•˜๋ฉด Hub์—์„œ ๋ชจ๋ธ์„ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
token (`str` ๋˜๋Š” *bool*, *์„ ํƒ ์‚ฌํ•ญ*) : ์›๊ฒฉ ํŒŒ์ผ์— ๋Œ€ํ•œ HTTP bearer ์ธ์ฆ์œผ๋กœ ์‚ฌ์šฉํ•  ํ† ํฐ์ž…๋‹ˆ๋‹ค. `True`์ธ ๊ฒฝ์šฐ, `diffusers-cli login`์—์„œ ์ƒ์„ฑ๋œ ํ† ํฐ(`~/.huggingface`์— ์ €์žฅ๋จ)์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
revision (`str`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `"main"`) : ์‚ฌ์šฉํ•  ํŠน์ • ๋ชจ๋ธ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. Git์—์„œ ํ—ˆ์šฉํ•˜๋Š” ๋ธŒ๋žœ์น˜ ์ด๋ฆ„, ํƒœ๊ทธ ์ด๋ฆ„, ์ปค๋ฐ‹ ID ๋˜๋Š” ๊ธฐํƒ€ ์‹๋ณ„์ž์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
subfolder (`str`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `""`) : Hub ๋˜๋Š” ๋กœ์ปฌ์˜ ๋” ํฐ ๋ชจ๋ธ ์ €์žฅ์†Œ ๋‚ด์—์„œ ๋ชจ๋ธ ํŒŒ์ผ์˜ ์„œ๋ธŒํด๋” ์œ„์น˜์ž…๋‹ˆ๋‹ค.
mirror (`str`, *์„ ํƒ ์‚ฌํ•ญ*) : ์ค‘๊ตญ์—์„œ ๋ชจ๋ธ์„ ๋‹ค์šด๋กœ๋“œํ•  ๋•Œ ์ ‘๊ทผ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฏธ๋Ÿฌ ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์†Œ์Šค์˜ ์ ์‹œ์„ฑ์ด๋‚˜ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฏธ๋Ÿฌ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
device_map (`int | str | torch.device` ๋˜๋Š” `dict[str, int | str | torch.device]`, *์„ ํƒ ์‚ฌํ•ญ*) : ๊ฐ ์„œ๋ธŒ๋ชจ๋“ˆ์ด ์–ด๋””์— ๋ฐฐ์น˜๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ง€์ •ํ•˜๋Š” ๋งต์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ๋ผ๋ฏธํ„ฐ/๋ฒ„ํผ ์ด๋ฆ„์— ๋Œ€ํ•ด ์ •์˜ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ, ํŠน์ • ๋ชจ๋“ˆ ์ด๋ฆ„์ด ๋งต์— ํฌํ•จ๋˜๋ฉด ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ๋ชจ๋“  ์„œ๋ธŒ๋ชจ๋“ˆ์ด ๋™์ผํ•œ ๋””๋ฐ”์ด์Šค๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ `None`์ด๋ฉฐ, ์ด๋Š” ๋ชจ๋ธ์ด CPU์— ๋กœ๋“œ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ: ```py >>> from diffusers import AutoModel >>> import torch >>> # This works. >>> model = AutoModel.from_pretrained( ... "stabilityai/stable-diffusion-xl-base-1.0", subfolder="unet", device_map="cuda" ... ) >>> # This also works (integer accelerator device ID). >>> model = AutoModel.from_pretrained( ... "stabilityai/stable-diffusion-xl-base-1.0", subfolder="unet", device_map=0 ... ) >>> # Specifying a supported offloading strategy like "auto" also works. >>> model = AutoModel.from_pretrained( ... "stabilityai/stable-diffusion-xl-base-1.0", subfolder="unet", device_map="auto" ... ) >>> # Specifying a dictionary as `device_map` also works. >>> model = AutoModel.from_pretrained( ... "stabilityai/stable-diffusion-xl-base-1.0", ... subfolder="unet", ... device_map={"": torch.device("cuda")}, ... ) ``` `device_map="auto"`๋ฅผ ์„ค์ •ํ•˜๋ฉด ๐Ÿค— Accelerate๊ฐ€ ๊ฐ€์žฅ ์ตœ์ ํ™”๋œ `device_map`์„ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์˜ต์…˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [device map ์„ค๊ณ„](https://huggingface.co/docs/accelerate/en/concept_guides/big_model_inference#the-devicemap)๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. ๋” ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋Š” [Diffusers ์ „์šฉ ๋ฌธ์„œ](https://huggingface.co/docs/diffusers/main/en/training/distributed_inference#model-sharding)๋ฅผ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
max_memory (`Dict`, *์„ ํƒ ์‚ฌํ•ญ*) : ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ๋””๋ฐ”์ด์Šค ์‹๋ณ„์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์‚ฌ์ „์ž…๋‹ˆ๋‹ค. ์„ค์ •๋˜์ง€ ์•Š์œผ๋ฉด ๊ฐ GPU์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ์™€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ CPU RAM์ด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
offload_folder (`str` ๋˜๋Š” `os.PathLike`, *์„ ํƒ ์‚ฌํ•ญ*) : `device_map`์— `"disk"` ๊ฐ’์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ, ๊ฐ€์ค‘์น˜๋ฅผ ์˜คํ”„๋กœ๋“œํ•  ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.
offload_state_dict (`bool`, *์„ ํƒ ์‚ฌํ•ญ*) : `True`์ธ ๊ฒฝ์šฐ, CPU ์ƒํƒœ ์‚ฌ์ „์˜ ๊ฐ€์ค‘์น˜์™€ ์ฒดํฌํฌ์ธํŠธ์˜ ๊ฐ€์žฅ ํฐ ์ƒค๋“œ ํ•ฉ์ด CPU RAM์— ๋งž์ง€ ์•Š์„ ๋•Œ CPU RAM ๋ถ€์กฑ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด CPU ์ƒํƒœ ์‚ฌ์ „์„ ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ๋กœ ์ผ์‹œ์ ์œผ๋กœ ์˜คํ”„๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋””์Šคํฌ ์˜คํ”„๋กœ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์€ `True`์ž…๋‹ˆ๋‹ค.
low_cpu_mem_usage (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, torch ๋ฒ„์ „์ด 1.9.0 ์ด์ƒ์ด๋ฉด ๊ธฐ๋ณธ๊ฐ’์€ `True`, ๊ทธ ์™ธ์—๋Š” `False`) : ๊ฐ€์ค‘์น˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์ „ ํ•™์Šต๋œ ๊ฐ€์ค‘์น˜๋งŒ ๋กœ๋“œํ•˜์—ฌ ๋ชจ๋ธ ๋กœ๋”ฉ ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. ๋ชจ๋ธ ๋กœ๋”ฉ ์‹œ CPU ๋ฉ”๋ชจ๋ฆฌ(ํ”ผํฌ ๋ฉ”๋ชจ๋ฆฌ ํฌํ•จ)๋ฅผ ๋ชจ๋ธ ํฌ๊ธฐ์˜ 1๋ฐฐ๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. PyTorch 1.9.0 ์ด์ƒ์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค. PyTorch์˜ ์ด์ „ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์ธ์ˆ˜๋ฅผ `True`๋กœ ์„ค์ •ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
variant (`str`, *์„ ํƒ ์‚ฌํ•ญ*) : `"fp16"` ๋˜๋Š” `"ema"`์™€ ๊ฐ™์€ ์ง€์ •๋œ `variant` ํŒŒ์ผ ์ด๋ฆ„์—์„œ ๊ฐ€์ค‘์น˜๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
use_safetensors (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `None`) : `None`์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, `safetensors` ๊ฐ€์ค‘์น˜๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ **๊ทธ๋ฆฌ๊ณ ** `safetensors` ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉด ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. `True`๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, ๋ชจ๋ธ์€ `safetensors` ๊ฐ€์ค‘์น˜์—์„œ ๊ฐ•์ œ๋กœ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. `False`๋กœ ์„ค์ •๋œ ๊ฒฝ์šฐ, `safetensors` ๊ฐ€์ค‘์น˜๋Š” ๋กœ๋“œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
disable_mmap ('bool', *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ 'False') : Safetensors ๋ชจ๋ธ์„ ๋กœ๋“œํ•  ๋•Œ mmap์„ ๋น„ํ™œ์„ฑํ™”ํ• ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๋งˆ์šดํŠธ๋‚˜ ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ์— ๋ชจ๋ธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, mmap์˜ seek ๋™์ž‘์„ ์ž˜ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ๋” ์ข‹์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
use_flashpack (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `False`) : `True`๋กœ ์„ค์ •ํ•˜๋ฉด ๋ชจ๋ธ์€ `flashpack` ๊ฐ€์ค‘์น˜์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
flashpack_kwargs(`dict[str, Any]`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `{}`) : [`flashpack.deserialization.assign_from_file`](https://github.com/fal-ai/flashpack/blob/f1aa91c5cd9532a3dbf5bcc707ab9b01c274b76c/src/flashpack/deserialization.py#L408-L422)์— ์ „๋‹ฌ๋˜๋Š” Kwargs
pretrained model configuration์—์„œ ์‚ฌ์ „ ํ•™์Šต๋œ PyTorch ๋ชจ๋ธ์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋ธ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‰๊ฐ€ ๋ชจ๋“œ(`model.eval()`)๋กœ ์„ค์ •๋˜๋ฉฐ, dropout ๋ชจ๋“ˆ์€ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์„ ํ•™์Šตํ•˜๋ ค๋ฉด `model.train()`์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ํ•™์Šต ๋ชจ๋“œ๋กœ ์„ค์ •ํ•˜์„ธ์š”.
> [!TIP] > ๋น„๊ณต๊ฐœ ๋˜๋Š” [๊ฒŒ์ดํŠธ๋œ ๋ชจ๋ธ](https://huggingface.co/docs/hub/models-gated#gated-models)์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋กœ๊ทธ์ธํ•˜์„ธ์š”
`hf > auth login`์„(๋ฅผ) ํ†ตํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐฉํ™”๋ฒฝ์ด ์žˆ๋Š” ํ™˜๊ฒฝ์—์„œ ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํŠน์ˆ˜ํ•œ ["์˜คํ”„๋ผ์ธ ๋ชจ๋“œ"](https://huggingface.co/diffusers/installation.html#offline-mode)๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ:
```py
from diffusers import UNet2DConditionModel
unet = UNet2DConditionModel.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", subfolder="unet")
```
์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๋‹ค์šด์ŠคํŠธ๋ฆผ ์ž‘์—…์„ ์œ„ํ•ด ๊ฐ€์ค‘์น˜๋ฅผ ๋ฏธ์„ธ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
```bash
Some weights of UNet2DConditionModel were not initialized from the model checkpoint at stable-diffusion-v1-5/stable-diffusion-v1-5 and are newly initialized because the shapes did not match:
- conv_in.weight: found shape torch.Size([320, 4, 3, 3]) in the checkpoint and torch.Size([320, 9, 3, 3]) in the model instantiated
You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.
```
#### get_memory_footprint[[diffusers.ModelMixin.get_memory_footprint]]
```python
get_memory_footprint(return_buffers = True)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L2186)
**๋งค๊ฐœ๋ณ€์ˆ˜:**
return_buffers (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `True`) : ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ณ„์‚ฐ ์‹œ ๋ฒ„ํผ ํ…์„œ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋ฒ„ํผ๋Š” ๊ทธ๋ž˜๋””์–ธํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ํ…์„œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐฐ์น˜ ์ •๊ทœํ™” ๋ ˆ์ด์–ด์˜ mean๊ณผ std๊ฐ€ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”: https://discuss.pytorch.org/t/what-pytorch-means-by-buffers/120266/2
๋ชจ๋ธ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋ชจ๋ธ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋ธ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ฒค์น˜๋งˆํ‚นํ•˜๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. PyTorch ํ† ๋ก ์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ํ•ด๊ฒฐ์ฑ…์ž…๋‹ˆ๋‹ค: https://discuss.pytorch.org/t/gpu-memory-that-model-uses/56822/2
#### num_parameters[[diffusers.ModelMixin.num_parameters]]
```python
num_parameters(only_trainable: bool = False, exclude_embeddings: bool = False)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L2122)
**๋งค๊ฐœ๋ณ€์ˆ˜:**
only_trainable (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `False`) : ํ•™์Šต ๊ฐ€๋Šฅํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ˆ˜๋งŒ ๋ฐ˜ํ™˜ํ• ์ง€ ์—ฌ๋ถ€.
exclude_embeddings (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `False`) : ์ž„๋ฒ ๋”ฉ์ด ์•„๋‹Œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜๋งŒ ๋ฐ˜ํ™˜ํ• ์ง€ ์—ฌ๋ถ€.
**๋ฐ˜ํ™˜๊ฐ’:** `int`
ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ˆ˜.
๋ชจ๋“ˆ์˜ (ํ•™์Šต ๊ฐ€๋Šฅ ๋˜๋Š” ์ž„๋ฒ ๋”ฉ์ด ์•„๋‹Œ) ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
์˜ˆ:
```py
from diffusers import UNet2DConditionModel
model_id = "stable-diffusion-v1-5/stable-diffusion-v1-5"
unet = UNet2DConditionModel.from_pretrained(model_id, subfolder="unet")
unet.num_parameters(only_trainable=True)
859520964
```
#### reset_attention_backend[[diffusers.ModelMixin.reset_attention_backend]]
```python
reset_attention_backend()
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L667)
๋ชจ๋ธ์˜ attention backends๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ `forward` ํ˜ธ์ถœ ์‹œ ์„ค์ •๋œ ํ™˜๊ฒฝ ๊ธฐ๋ณธ๊ฐ’ ๋˜๋Š” torch ๋„ค์ดํ‹ฐ๋ธŒ scaled dot product attention์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
#### save_pretrained[[diffusers.ModelMixin.save_pretrained]]
```python
save_pretrained(save_directory: str | os.PathLike, is_main_process: bool = True, save_function: typing.Optional[typing.Callable] = None, safe_serialization: bool = True, variant: str | None = None, max_shard_size: int | str = '10GB', push_to_hub: bool = False, use_flashpack: bool = False, **kwargs)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L686)
**๋งค๊ฐœ๋ณ€์ˆ˜:**
save_directory (`str` ๋˜๋Š” `os.PathLike`) : ๋ชจ๋ธ๊ณผ ํ•ด๋‹น ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
is_main_process (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `True`) : ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์ธ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ๋ถ„์‚ฐ ํ•™์Šต ์ค‘์— ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋ ˆ์ด์Šค ์กฐ๊ฑด์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์—์„œ๋งŒ `is_main_process=True`๋กœ ์„ค์ •ํ•˜์„ธ์š”.
save_function (`Callable`) : ์ƒํƒœ ์‚ฌ์ „(state dictionary)์„ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋ถ„์‚ฐ ํ•™์Šต ์ค‘์— `torch.save`๋ฅผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ `DIFFUSERS_SAVE_MODE`๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
safe_serialization (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `True`) : `safetensors` ๋˜๋Š” `pickle`๋ฅผ ์‚ฌ์šฉํ•œ ์ „ํ†ต์ ์ธ PyTorch ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋ธ์„ ์ €์žฅํ• ์ง€ ์—ฌ๋ถ€.
variant (`str`, *์„ ํƒ ์‚ฌํ•ญ*) : ์ง€์ •๋œ ๊ฒฝ์šฐ, ๊ฐ€์ค‘์น˜๊ฐ€ `pytorch_model.<variant>.bin` ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
max_shard_size (`int` ๋˜๋Š” `str`, ๊ธฐ๋ณธ๊ฐ’์€ `"10GB"`) : ์ƒค๋”ฉ๋˜๊ธฐ ์ „ ์ฒดํฌํฌ์ธํŠธ์˜ ์ตœ๋Œ€ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ์ƒค๋”ฉ๋œ ๊ฐ ์ฒดํฌํฌ์ธํŠธ์˜ ํฌ๊ธฐ๋Š” ์ด ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์•„์ง‘๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•  ๊ฒฝ์šฐ, ์ˆซ์ž ๋’ค์— ๋‹จ์œ„(์˜ˆ: `"5GB"`)๊ฐ€ ๋”ฐ๋ผ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•  ๊ฒฝ์šฐ, ๋‹จ์œ„๋Š” ๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. 2024๋…„ 10์›”๋ถ€ํ„ฐ ํŠน์ • ๊ธฐ๊ฐ„์ด ์ง€๋‚œ ํ›„ ์ด ์ œํ•œ์ด ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ `diffusers`์˜ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” Hugging Face ์ƒํƒœ๊ณ„์˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: `transformers`, `accelerate`)์—์„œ ์ด ์ธ์ˆ˜์˜ ๊ณตํ†ต ๊ธฐ๋ณธ ํฌ๊ธฐ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
push_to_hub (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `False`) : ๋ชจ๋ธ์„ ์ €์žฅํ•œ ํ›„ Hugging Face Hub์— ํ‘ธ์‹œํ• ์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. `repo_id`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘ธ์‹œํ•  ์ €์žฅ์†Œ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ `save_directory` ์ด๋ฆ„์ž…๋‹ˆ๋‹ค).
kwargs (`dict[str, Any]`, *์„ ํƒ ์‚ฌํ•ญ*) : [push_to_hub()](/docs/diffusers/main/ko/api/schedulers/overview#diffusers.utils.PushToHubMixin.push_to_hub) ๋ฉ”์„œ๋“œ์— ํ•จ๊ป˜ ์ „๋‹ฌ๋˜๋Š” ์ถ”๊ฐ€ ํ‚ค์›Œ๋“œ ์ธ์ž์ž…๋‹ˆ๋‹ค.
๋ชจ๋ธ๊ณผ ํ•ด๋‹น ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•˜์—ฌ [from_pretrained()](/docs/diffusers/main/ko/api/models/overview#diffusers.ModelMixin.from_pretrained) ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
#### set_attention_backend[[diffusers.ModelMixin.set_attention_backend]]
```python
set_attention_backend(backend: str)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L608)
**๋งค๊ฐœ๋ณ€์ˆ˜:**
backend (`str`) : ์„ค์ •ํ•  ๋ฐฑ์—”๋“œ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. `AttentionBackendName`์— ์ •์˜๋œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ๋Š” `diffusers.attention_dispatch.AttentionBackendName`์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ torch ๋„ค์ดํ‹ฐ๋ธŒ scaled dot product attention์„ ๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋ชจ๋ธ์˜ attention ๋ฐฑ์—”๋“œ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
#### set_use_npu_flash_attention[[diffusers.ModelMixin.set_use_npu_flash_attention]]
```python
set_use_npu_flash_attention(valid: bool)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/modeling_utils.py#L335)
npu flash attention ์Šค์œ„์น˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
#### (์œผ)๋กœ[[diffusers.ModelMixin.to]]
```python
to(*args, **kwargs)
```
์ ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๊ฒฝ๋กœ(์˜ˆ: `torch.float32`)์˜ mock ๊ฐ’์ž…๋‹ˆ๋‹ค: ์†์„ฑ ์ ‘๊ทผ ์ฒด์ธ, ํ˜ธ์ถœ์€ pass-through ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋ฉฐ, `repr`์€ ํ•ด๋‹น ์ ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฒ ์ด์Šค ํด๋ž˜์Šค๋กœ ์‚ฌ์šฉํ•˜๋ฉด plain-`type` ๋ฒ ์ด์Šค๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค(PEP 560 `__mro_entries__`). ๋”ฐ๋ผ์„œ ์‹ค์ œ ์„œ๋ธŒํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฉ”ํƒ€ํด๋ž˜์Šค๋ฅผ ์œ ์ง€ํ•˜๊ณ , `inspect.signature`๋Š” mock์˜ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ `__init__`๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
## PushToHubMixin[[diffusers.utils.PushToHubMixin]]
#### diffusers.utils.PushToHubMixin[[diffusers.utils.PushToHubMixin]]
```python
diffusers.utils.PushToHubMixin()
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/utils/hub_utils.py#L491)
Hugging Face Hub์— ๋ชจ๋ธ, ์Šค์ผ€์ค„๋Ÿฌ ๋˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ์„ ํ‘ธ์‹œํ•˜๊ธฐ ์œ„ํ•œ Mixin์ž…๋‹ˆ๋‹ค.
#### push_to_hub[[diffusers.utils.PushToHubMixin.push_to_hub]]
```python
push_to_hub(repo_id: str, commit_message: str | None = None, private: bool | None = None, token: str | None = None, create_pr: bool = False, safe_serialization: bool = True, variant: str | None = None, subfolder: str | None = None)
```
[์†Œ์Šค](https://github.com/huggingface/diffusers/blob/main/src/diffusers/utils/hub_utils.py#L526)
**๋งค๊ฐœ๋ณ€์ˆ˜:**
repo_id (`str`) : ๋ชจ๋ธ, ์Šค์ผ€์ค„๋Ÿฌ ๋˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ํŒŒ์ผ์„ ํ‘ธ์‹œํ•  ์ €์žฅ์†Œ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์กฐ์ง์— ํ‘ธ์‹œํ•  ๊ฒฝ์šฐ ์กฐ์ง ์ด๋ฆ„์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. `repo_id`๋Š” ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๊ฒฝ๋กœ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
commit_message (`str`, *์„ ํƒ ์‚ฌํ•ญ*) : pushํ•  ๋•Œ ์ปค๋ฐ‹ํ•  ๋ฉ”์‹œ์ง€. ๊ธฐ๋ณธ๊ฐ’์€ `"Upload {object}"`์ž…๋‹ˆ๋‹ค.
private (`bool`, *์„ ํƒ ์‚ฌํ•ญ*) : ์ €์žฅ์†Œ๋ฅผ ๋น„๊ณต๊ฐœ๋กœ ๋งŒ๋“ค์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. `None`(๊ธฐ๋ณธ๊ฐ’)์ธ ๊ฒฝ์šฐ, ์กฐ์ง์˜ ๊ธฐ๋ณธ ์„ค์ •์ด ๋น„๊ณต๊ฐœ๊ฐ€ ์•„๋‹Œ ํ•œ ์ €์žฅ์†Œ๋Š” ๊ณต๊ฐœ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ์ €์žฅ์†Œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ์ด ๊ฐ’์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.
token (`str`, *์„ ํƒ ์‚ฌํ•ญ*) : ์›๊ฒฉ ํŒŒ์ผ์— ๋Œ€ํ•œ HTTP bearer ์ธ์ฆ์œผ๋กœ ์‚ฌ์šฉํ•  ํ† ํฐ์ž…๋‹ˆ๋‹ค. `hf auth login` ์‹คํ–‰ ์‹œ ์ƒ์„ฑ๋œ ํ† ํฐ์ด๋ฉฐ `~/.huggingface`์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
create_pr (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `False`) : ์—…๋กœ๋“œ๋œ ํŒŒ์ผ๋กœ PR์„ ์ƒ์„ฑํ• ์ง€ ์•„๋‹ˆ๋ฉด ์ง์ ‘ ์ปค๋ฐ‹ํ• ์ง€ ์—ฌ๋ถ€.
safe_serialization (`bool`, *์„ ํƒ ์‚ฌํ•ญ*, ๊ธฐ๋ณธ๊ฐ’ `True`) : ๋ชจ๋ธ ๊ฐ€์ค‘์น˜๋ฅผ `safetensors` ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ• ์ง€ ์—ฌ๋ถ€.
variant (`str`, *์„ ํƒ ์‚ฌํ•ญ*) : ์ง€์ •๋œ ๊ฒฝ์šฐ, ๊ฐ€์ค‘์น˜๊ฐ€ `pytorch_model.<variant>.bin` ํ˜•์‹์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
๋ชจ๋ธ, ์Šค์ผ€์ค„๋Ÿฌ ๋˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ํŒŒ์ผ์„ ๐Ÿค— Hugging Face Hub์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ:
```python
from diffusers import UNet2DConditionModel
unet = UNet2DConditionModel.from_pretrained("stabilityai/stable-diffusion-2", subfolder="unet")
# Push the `unet` to your namespace with the name "my-finetuned-unet".
unet.push_to_hub("my-finetuned-unet")
# Push the `unet` to an organization with the name "my-finetuned-unet".
unet.push_to_hub("your-org/my-finetuned-unet")
```

Xet Storage Details

Size:
30.2 kB
ยท
Xet hash:
98286f9bf0d3f2696c5c4826ae6ac40835636830a9489ccd4303c69da11ecc33

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