# PEFT

Diffusers hỗ trợ nạp các adapter như [LoRA](../../tutorials/using_peft_for_inference) bằng thư viện [PEFT](https://huggingface.co/docs/peft/index) với lớp [PeftAdapterMixin](/docs/diffusers/v0.43.0/vi/api/loaders/peft#diffusers.loaders.PeftAdapterMixin). Điều này cho phép các lớp mô hình trong Diffusers như [UNet2DConditionModel](/docs/diffusers/v0.43.0/vi/api/models/unet2d-cond#diffusers.UNet2DConditionModel), [SD3Transformer2DModel](/docs/diffusers/v0.43.0/vi/api/models/sd3_transformer2d#diffusers.SD3Transformer2DModel) hoạt động với một adapter.

> [!TIP]
> Tham khảo hướng dẫn [Suy luận với PEFT](../../tutorials/using_peft_for_inference) để có cái nhìn tổng quan về cách sử dụng PEFT trong Diffusers cho suy luận.

## PeftAdapterMixin[[diffusers.loaders.PeftAdapterMixin]]

#### diffusers.loaders.PeftAdapterMixin[[diffusers.loaders.PeftAdapterMixin]]

```python
diffusers.loaders.PeftAdapterMixin()
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L62)

Một lớp chứa tất cả các hàm để tải và sử dụng trọng số adapter được hỗ trợ trong thư viện PEFT. Để biết thêm chi tiết về adapter và cách tiêm chúng vào một mô hình cơ sở, hãy xem [tài liệu](https://huggingface.co/docs/peft/index) của PEFT.

Cài đặt phiên bản PEFT mới nhất và sử dụng mixin này để:

- Gắn các adapter mới vào mô hình.
- Gắn nhiều adapter và kích hoạt/tắt chúng một cách lặp lại.
- Bật/tắt tất cả các adapter từ mô hình.
- Lấy danh sách các adapter đang hoạt động.

#### active_adapters[[diffusers.loaders.PeftAdapterMixin.active_adapters]]

```python
active_adapters()
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L652)

Lấy danh sách các adapter đang hoạt động hiện tại của mô hình.

Nếu bạn chưa quen thuộc với adapter và các phương pháp PEFT, chúng tôi mời bạn đọc thêm về chúng trong [tài liệu](https://huggingface.co/docs/peft) PEFT.

#### add_adapter[[diffusers.loaders.PeftAdapterMixin.add_adapter]]

```python
add_adapter(adapter_config, adapter_name: str = 'default')
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L518)

**Tham số:**

adapter_config (`[~peft.PeftConfig]`) : Cấu hình của adapter cần thêm; các adapter được hỗ trợ là các phương pháp non-prefix tuning và adaption prompt.

adapter_name (`str`, *tùy chọn*, mặc định là `"default"`) : Tên của adapter cần thêm. Nếu không truyền tên, một tên mặc định sẽ được gán cho adapter.

Thêm một adapter mới vào mô hình hiện tại để huấn luyện. Nếu không truyền tên adapter, một tên mặc định sẽ được gán cho adapter để tuân theo quy ước của thư viện PEFT.

Nếu bạn chưa quen thuộc với adapter và các phương pháp PEFT, chúng tôi mời bạn đọc thêm về chúng trong [tài liệu](https://huggingface.co/docs/peft) PEFT.

#### delete_adapters[[diffusers.loaders.PeftAdapterMixin.delete_adapters]]

```python
delete_adapters(adapter_names: list[str] | str)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L777)

**Tham số:**

adapter_names (`list[str, str]`) : Tên (chuỗi đơn hoặc danh sách các chuỗi) của adapter cần xóa.

Xóa các lớp LoRA của adapter khỏi mô hình cơ sở.

Ví dụ:

```py
from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
    "jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_names="cinematic"
)
pipeline.unet.delete_adapters("cinematic")
```

#### disable_adapters[[diffusers.loaders.PeftAdapterMixin.disable_adapters]]

```python
disable_adapters()
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L607)

Tắt tất cả các adapter được gắn vào mô hình và quay về suy luận chỉ với mô hình cơ sở.

Nếu bạn chưa quen thuộc với adapter và các phương pháp PEFT, chúng tôi mời bạn đọc thêm về chúng trong [tài liệu](https://huggingface.co/docs/peft) PEFT.

#### disable_lora[[diffusers.loaders.PeftAdapterMixin.disable_lora]]

```python
disable_lora()
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L731)

Tắt các lớp LoRA đang hoạt động của mô hình cơ sở.

Ví dụ:

```py
from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
    "jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
)
pipeline.unet.disable_lora()
```

#### enable_adapters[[diffusers.loaders.PeftAdapterMixin.enable_adapters]]

```python
enable_adapters()
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L629)

Bật các adapter được gắn vào mô hình. Mô hình sử dụng `self.active_adapters()` để lấy danh sách các adapter cần bật.

Nếu bạn chưa quen thuộc với adapter và các phương pháp PEFT, chúng tôi mời bạn đọc thêm về chúng trong [tài liệu](https://huggingface.co/docs/peft) PEFT.

#### enable_lora[[diffusers.loaders.PeftAdapterMixin.enable_lora]]

```python
enable_lora()
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L754)

Bật các lớp LoRA đang hoạt động của mô hình cơ sở.

Ví dụ:

```py
from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
    "jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
)
pipeline.unet.enable_lora()
```

#### enable_lora_hotswap[[diffusers.loaders.PeftAdapterMixin.enable_lora_hotswap]]

```python
enable_lora_hotswap(target_rank: int = 128, check_compiled: typing.Literal['error', 'warn', 'ignore'] = 'error')
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L815)

**Tham số:**

target_rank (`int`, *tùy chọn*, mặc định là `128`) : Bậc cao nhất trong số tất cả các adapter sẽ được nạp.

check_compiled (`str`, *tùy chọn*, mặc định là `"error"`) : Cách xử lý khi mô hình đã được biên dịch, điều này thường nên tránh. Các tùy chọn là: - "error" (mặc định): gây ra lỗi - "warn": phát ra cảnh báo - "ignore": không làm gì

Cho phép khả năng thay đổi nóng các bộ thích ứng LoRA.

Việc gọi phương thức này chỉ bắt buộc khi hotswap các adapter và nếu mô hình đã được biên dịch hoặc nếu bậc (ranks) của các adapter được nạp khác nhau.

#### load_lora_adapter[[diffusers.loaders.PeftAdapterMixin.load_lora_adapter]]

```python
load_lora_adapter(pretrained_model_name_or_path_or_dict, prefix = 'transformer', hotswap: bool = False, **kwargs)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L85)

**Tham số:**

pretrained_model_name_or_path_or_dict (`str` hoặc `os.PathLike` hoặc `dict`) : Có thể là:  - Một chuỗi, *model id* (ví dụ `google/ddpm-celebahq-256`) của một model được huấn luyện trước lưu trữ trên Hub. - Một đường dẫn đến *thư mục* (ví dụ `./my_model_directory`) chứa các trọng số model được lưu bằng [ModelMixin.save_pretrained()](/docs/diffusers/v0.43.0/vi/api/models/overview#diffusers.ModelMixin.save_pretrained). - Một [torch state dict](https://pytorch.org/tutorials/beginner/saving_loading_models.html#what-is-a-state-dict).

prefix (`str`, *tùy chọn*) : Tiền tố để lọc state dict.

cache_dir (`str | os.PathLike`, *tùy chọn*) : Đường dẫn đến thư mục nơi cấu hình mô hình được huấn luyện trước đã tải xuống được lưu đệm nếu không sử dụng bộ lưu đệm tiêu chuẩn.

force_download (`bool`, *tùy chọn*, mặc định là `False`) : Xác định có nên ép buộc tải lại (re-download) trọng số mô hình và các tệp cấu hình hay không, ghi đè lên các phiên bản đã được lưu trong bộ nhớ đệm nếu chúng tồn tại.

proxies (`dict[str, str]`, *tùy chọn*) : Một từ điển các máy chủ proxy để sử dụng theo giao thức hoặc điểm cuối, ví dụ, `{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. Các proxy được sử dụng cho mỗi yêu cầu.

local_files_only (`bool`, *tùy chọn*, mặc định là `False`) : Xác định xem có chỉ tải trọng số và tệp cấu hình của mô hình cục bộ hay không. Nếu đặt thành `True`, mô hình sẽ không được tải xuống từ Hub.

token (`str` hoặc *bool*, *tùy chọn*) : Token được sử dụng làm HTTP bearer authorization cho các tệp từ xa. Nếu là `True`, token được tạo từ `diffusers-cli login` (được lưu trong `~/.huggingface`) sẽ được sử dụng.

revision (`str`, *tùy chọn*, mặc định là `"main"`) : Phiên bản mô hình cụ thể cần sử dụng. Nó có thể là tên nhánh, tên thẻ, id commit, hoặc bất kỳ định danh nào được Git cho phép.

subfolder (`str`, *tùy chọn*, mặc định là `""`) : Vị trí của thư mục con chứa tệp mô hình bên trong một kho lưu trữ mô hình lớn hơn trên Hub hoặc cục bộ.

network_alphas (`dict[str, float]`) : Giá trị của network alpha được sử dụng cho việc học ổn định và ngăn ngừa underflow. Giá trị này có cùng ý nghĩa với tùy chọn `--network_alpha` trong script trainer của kohya-ss. Xem [liên kết này](https://github.com/darkstorm2150/sd-scripts/blob/main/docs/train_network_README-en.md#execute-learning).

low_cpu_mem_usage (`bool`, *tùy chọn*) : Tăng tốc độ tải mô hình bằng cách chỉ tải trọng số LoRA được huấn luyện trước và không khởi tạo các trọng số ngẫu nhiên.

hotswap : (`bool`, *tuỳ chọn*) Mặc định là `False`. Xác định có thay thế bộ thích ứng (adapter) hiện có (LoRA) bằng bộ thích ứng mới được nạp tại chỗ hay không. Điều này có nghĩa là, thay vì nạp thêm một bộ thích ứng, phương thức này sẽ lấy trọng số của bộ thích ứng hiện có và thay thế chúng bằng trọng số của bộ thích ứng mới. Cách này có thể nhanh hơn và tiết kiệm bộ nhớ hơn. Tuy nhiên, lợi ích chính của việc hotswap là khi mô hình được biên dịch bằng torch.compile, việc nạp bộ thích ứng mới không yêu cầu biên dịch lại mô hình. Khi sử dụng hotswap, `adapter_name` được truyền vào phải là tên của một bộ thích ứng đã được nạp. Nếu bộ thích ứng mới và bộ thích ứng cũ có rank và/hoặc LoRA alpha (tức là hệ số tỷ lệ) khác nhau, bạn cần gọi thêm một phương thức trước khi nạp bộ thích ứng: ```py pipeline = ...  # load diffusers pipeline max_rank = ...  # the highest rank among all LoRAs that you want to load # call *before* compiling and loading the LoRA adapter pipeline.enable_lora_hotswap(target_rank=max_rank) pipeline.load_lora_weights(file_name) # optionally compile the model now ``` Lưu ý rằng việc hotswap các bộ thích ứng của text encoder hiện chưa được hỗ trợ. Kỹ thuật này có một số hạn chế khác, được tài liệu hóa tại đây: https://huggingface.co/docs/peft/main/en/package_reference/hotswap

metadata : Metadata của adapter LoRA. Khi được cung cấp, metadata suy ra từ state dict sẽ không được dùng để khởi tạo `LoraConfig`.

Tải bộ thích ứng LoRA vào mô hình cơ bản.

#### save_lora_adapter[[diffusers.loaders.PeftAdapterMixin.save_lora_adapter]]

```python
save_lora_adapter(save_directory, adapter_name: str = 'default', upcast_before_saving: bool = False, safe_serialization: bool = True, weight_name: str | None = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L394)

**Tham số:**

save_directory (`str` hoặc `os.PathLike`) : Thư mục để lưu các tham số LoRA. Thư mục sẽ được tạo nếu chưa tồn tại.

adapter_name : (`str`, mặc định là "default"): Tên của adapter cần được serialize. Hữu ích khi mô hình cơ sở có nhiều adapter được nạp.

upcast_before_saving (`bool`, mặc định là `False`) : Có nên chuyển đổi mô hình cơ bản sang `torch.float32` trước khi xuất chuỗi không.

safe_serialization (`bool`, *tùy chọn*, mặc định là `True`) : Có lưu mô hình bằng `safetensors` hay theo cách truyền thống của PyTorch với `pickle` hay không.

weight_name : (`str`, *tùy chọn*, mặc định là `None`): Tên tệp để serialize state dict.

Lưu các tham số LoRA tương ứng với mô hình cơ sở.

#### set_adapter[[diffusers.loaders.PeftAdapterMixin.set_adapter]]

```python
set_adapter(adapter_name: str | list[str])
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L558)

**Tham số:**

adapter_name (str | list[str])) : Danh sách các adapter cần thiết lập hoặc tên adapter trong trường hợp chỉ có một adapter.

Đặt một adapter cụ thể bằng cách buộc mô hình chỉ sử dụng adapter đó và vô hiệu hóa các adapter khác.

Nếu bạn chưa quen thuộc với adapter và các phương pháp PEFT, chúng tôi mời bạn đọc thêm về chúng trong [tài liệu](https://huggingface.co/docs/peft) PEFT.

#### set_adapters[[diffusers.loaders.PeftAdapterMixin.set_adapters]]

```python
set_adapters(adapter_names: list[str] | str, weights: float | dict | list[float] | list[dict] | list[None] | None = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/loaders/peft.py#L462)

**Tham số:**

adapter_names (`list[str]` hoặc `str`) : Tên của các adapter cần sử dụng.

weights (`Union[List[float], float]`, *tùy chọn*) : Trọng số của adapter(s) để sử dụng với UNet. Nếu là `None`, trọng số sẽ được đặt thành `1.0` cho tất cả các adapter.

Đặt các adapter đang hoạt động hiện tại để sử dụng trong mạng khuếch tán (ví dụ: unet, transformer, v.v.).

Ví dụ:

```py
from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights(
    "jbilcke-hf/sdxl-cinematic-1", weight_name="pytorch_lora_weights.safetensors", adapter_name="cinematic"
)
pipeline.load_lora_weights("nerijs/pixel-art-xl", weight_name="pixel-art-xl.safetensors", adapter_name="pixel")
pipeline.unet.set_adapters(["cinematic", "pixel"], weights=[0.5, 0.5])
```

