PEFT documentation
LoKr
LoKr

Low-Rank Kronecker Product (LoKr) là một phương pháp biến thể của LoRA, xấp xỉ ma trận trọng số lớn bằng hai ma trận hạng thấp và kết hợp chúng bằng tích Kronecker. LoKr cũng cung cấp một ma trận hạng thấp thứ ba tùy chọn để kiểm soát tốt hơn trong quá trình tinh chỉnh. Bằng cách biểu diễn ma trận cập nhật trọng số dưới dạng phân rã của một tích Kronecker, tạo thành một ma trận khối, LoKr có thể bảo toàn hạng của ma trận trọng số gốc. Kích thước của các ma trận nhỏ hơn được xác định bởi rank hoặc r của chúng. Một lợi ích khác của tích Kronecker là nó có thể được vector hóa bằng cách xếp chồng các cột của ma trận. Điều này có thể tăng tốc quá trình vì bạn tránh được việc tái tạo hoàn toàn ∆W.
Tóm tắt từ bài báo là:
Các mô hình tạo ảnh từ văn bản đã thu hút sự chú ý lớn nhờ khả năng tạo ra những hình ảnh có độ trung thực cao từ các câu lệnh văn bản. Trong số đó, Stable Diffusion nổi bật như một mô hình mã nguồn mở hàng đầu trong lĩnh vực đang phát triển nhanh chóng này. Tuy nhiên, những phức tạp trong việc tinh chỉnh các mô hình này đặt ra nhiều thách thức, từ việc tích hợp phương pháp luận mới đến đánh giá có hệ thống. Để giải quyết những vấn đề này, bài báo này giới thiệu LyCORIS Lora beYond Conventional methods, Other Rank adaptation Implementations for Stable diffusion, một thư viện mã nguồn mở cung cấp nhiều phương pháp tinh chỉnh cho Stable Diffusion. Hơn nữa, chúng tôi trình bày một khung đánh giá có hệ thống cho các kỹ thuật tinh chỉnh khác nhau. Khung này sử dụng một bộ chỉ số đa dạng và đi sâu vào nhiều khía cạnh của việc tinh chỉnh, bao gồm việc điều chỉnh siêu tham số và đánh giá với các loại câu lệnh khác nhau trên nhiều danh mục khái niệm. Thông qua cách tiếp cận toàn diện này, công việc của chúng tôi cung cấp những hiểu biết thiết yếu về các tác động tinh tế của các tham số tinh chỉnh, thu hẹp khoảng cách giữa nghiên cứu tiên tiến và ứng dụng thực tế.
Cách sử dụng
from peft import LoKrConfig, get_peft_model
config = LoKrConfig(
r=16,
alpha=16,
target_modules=["query", "value"],
module_dropout=0.1,
modules_to_save=["classifier"],
)
model = get_peft_model(model, config)
model.print_healthcheck()Tổng quan về benchmark
API
LoKrConfig
lớp peft.LoKrConfig
< source >( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falserank_pattern: Optional[dict] = <factory>alpha_pattern: Optional[dict] = <factory>r: int = 8alpha: int = 8rank_dropout: float = 0.0module_dropout: float = 0.0use_effective_conv2d: bool = Falsedecompose_both: bool = Falsedecompose_factor: int = -1rank_dropout_scale: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: Union[bool, Literal['lycoris']] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = None )
Tham số
- r (
int) — Rank của LoKr. - alpha (
int) — Tham số alpha cho việc scale LoKr. - rank_dropout (
float) — Xác suất dropout cho chiều rank trong quá trình huấn luyện. - module_dropout (
float) — Xác suất dropout để vô hiệu hóa các module LoKr trong quá trình huấn luyện. - use_effective_conv2d (
bool) — Sử dụng tham số phân rã hiệu quả cho Conv2d (và Conv1d) với ksize > 1 (“Proposition 3” từ bài báo FedPara). - decompose_both (
bool) — Thực hiện phân rã hạng của ma trận tích kronecker bên trái. - decompose_factor (
int) — Hệ số phân tích tích Kronecker. - rank_dropout_scale (‘bool) —
Có nên nhân hệ số cho rank dropout trong quá trình huấn luyện hay không, mặc định là
False. - target_modules (
Optional[Union[List[str], str]]) — Tên của các module cần áp dụng adapter. Nếu được chỉ định, chỉ các module có tên được chỉ định sẽ được thay thế. Khi truyền một chuỗi, một phép khớp regex sẽ được thực hiện. Khi truyền một danh sách các chuỗi, một phép khớp chính xác sẽ được thực hiện hoặc kiểm tra xem tên của module có kết thúc bằng bất kỳ chuỗi nào được truyền hay không. Nếu được chỉ định là ‘all-linear’, thì tất cả các module linear/Conv1D sẽ được chọn, ngoại trừ lớp output. Nếu không được chỉ định, các module sẽ được chọn theo kiến trúc của model. Nếu kiến trúc không được biết đến, một lỗi sẽ được ném ra — trong trường hợp này, bạn nên chỉ định các module đích một cách thủ công. - exclude_modules (
Optional[Union[List[str], str]]) — Tên của các module không áp dụng adapter. Khi truyền một chuỗi, một phép khớp regex sẽ được thực hiện. Khi truyền một danh sách các chuỗi, một phép khớp chính xác sẽ được thực hiện hoặc kiểm tra xem tên của module có kết thúc bằng bất kỳ chuỗi nào được truyền vào hay không. - init_weights (
bool) — Có thực hiện khởi tạo trọng số của adapter hay không. Mặc định làTrue. Dùng “lycoris” để khởi tạo trọng số theo phong cách của kho LYCORIS. Không khuyến nghị truyềnFalse. - layers_to_transform (
Union[List[int], int]) — Các chỉ số lớp cần biến đổi. Nếu truyền vào một danh sách các số nguyên, adapter sẽ được áp dụng cho các chỉ số lớp được chỉ định trong danh sách này. Nếu truyền vào một số nguyên duy nhất, các phép biến đổi sẽ được áp dụng cho lớp tại chỉ số này. - layers_pattern (
Optional[Union[List[str], str]]) — Tên mẫu lớp, chỉ được sử dụng nếulayers_to_transformkhácNone. Giá trị này cần nhắm đếnnn.ModuleListcủa mô hình, thường được gọi là'layers'hoặc'h'. - rank_pattern (
dict) — Bản ánh xạ từ tên lớp hoặc biểu thức chính quy đến các rank khác với rank mặc định được chỉ định bởir. Ví dụ,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}. - alpha_pattern (
dict) — Bản ánh xạ từ tên lớp hoặc biểu thức chính quy đến các alpha khác với alpha mặc định được chỉ định bởialpha. Ví dụ,{'^model.decoder.layers.0.encoder_attn.k_proj': 16}. - modules_to_save (
Optional[List[str]]) — Danh sách các module ngoài các lớp adapter cần được đặt là có thể huấn luyện và lưu trong checkpoint cuối cùng.
Lớp cấu hình của LoKrModel.
LoKrModel
lớp peft.LoKrModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
Tham số
- model (
torch.nn.Module) — Mô hình mà các lớp adapter tuner sẽ được gắn vào. - config (LoKrConfig) — Cấu hình của mô hình LoKr.
- adapter_name (
str) — Tên của adapter, mặc định là"default". - low_cpu_mem_usage (
bool,optional, mặc định làFalse) — Tạo trọng số adapter rỗng trên thiết bị meta. Hữu ích để tăng tốc quá trình tải.
Trả về
torch.nn.Module
Mô hình LoKr.
Tạo mô hình Low-Rank Kronecker Product từ một mô hình được huấn luyện trước. Phương pháp gốc được mô tả một phần tại https://huggingface.co/papers/2108.06098 và tại https://huggingface.co/papers/2309.14859 Bản triển khai hiện tại mượn phần lớn từ https://github.com/KohakuBlueleaf/LyCORIS/blob/eb460098187f752a5d66406d3affade6f0a07ece/lycoris/modules/lokr.py
Ví dụ:
>>> from diffusers import StableDiffusionPipeline
>>> from peft import LoKrModel, LoKrConfig
>>> config_te = LoKrConfig(
... r=8,
... lora_alpha=32,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... rank_dropout=0.0,
... module_dropout=0.0,
... init_weights=True,
... )
>>> config_unet = LoKrConfig(
... r=8,
... lora_alpha=32,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... rank_dropout=0.0,
... module_dropout=0.0,
... init_weights=True,
... use_effective_conv2d=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = LoKrModel(model.text_encoder, config_te, "default")
>>> model.unet = LoKrModel(model.unet, config_unet, "default")Thuộc tính:
- model (
~torch.nn.Module) — Mô hình cần được thích ứng. - peft_config (LoKrConfig): Cấu hình của mô hình LoKr.