Diffusers documentation
Textual Inversion
Textual Inversion
Textual Inversion là một kỹ thuật huấn luyện để cá nhân hóa các mô hình tạo hình ảnh chỉ với một vài hình ảnh mẫu về thứ bạn muốn mô hình học. Kỹ thuật này hoạt động bằng cách học và cập nhật các text embeddings (các embeddings mới được gắn với một từ đặc biệt mà bạn phải dùng trong prompt) để khớp với các hình ảnh mẫu bạn cung cấp.
Để suy luận với các embedding đã được huấn luyện, xem Suy luận Textual inversion.
Nếu bạn đang huấn luyện trên GPU có vRAM hạn chế, bạn nên thử bật các tham số gradient_checkpointing và mixed_precision trong lệnh huấn luyện. Bạn cũng có thể giảm lượng bộ nhớ sử dụng bằng cách dùng attention tiết kiệm bộ nhớ với xFormers.
Hướng dẫn này sẽ khám phá script textual_inversion.py để giúp bạn làm quen hơn với nó, và cách bạn có thể điều chỉnh nó cho trường hợp sử dụng của riêng mình.
Trước khi chạy script, hãy đảm bảo bạn cài đặt thư viện từ mã nguồn:
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .Điều hướng đến thư mục chứa ví dụ với script huấn luyện và cài đặt các phụ thuộc cần thiết cho script bạn đang sử dụng:
cd examples/textual_inversion
pip install -r requirements.txt🤗 Accelerate là một thư viện giúp bạn huấn luyện trên nhiều GPU/TPU hoặc với độ chính xác hỗn hợp. Nó sẽ tự động cấu hình thiết lập huấn luyện của bạn dựa trên phần cứng và môi trường của bạn. Hãy xem 🤗 Accelerate Quick tour để tìm hiểu thêm.
Khởi tạo một môi trường 🤗 Accelerate:
accelerate config
Để thiết lập môi trường 🤗 Accelerate mặc định mà không cần chọn bất kỳ cấu hình nào:
accelerate config default
Hoặc nếu môi trường của bạn không hỗ trợ shell tương tác, chẳng hạn như notebook, bạn có thể sử dụng:
from accelerate.utils import write_basic_config
write_basic_config()Cuối cùng, nếu bạn muốn huấn luyện một mô hình trên bộ dữ liệu của riêng mình, hãy xem hướng dẫn Tạo bộ dữ liệu để huấn luyện để tìm hiểu cách tạo một bộ dữ liệu tương thích với script huấn luyện.
Các phần tiếp theo làm nổi bật những phần quan trọng trong script huấn luyện để hiểu cách chỉnh sửa nó, nhưng không đi sâu vào mọi khía cạnh của script. Nếu bạn muốn tìm hiểu thêm, hãy tự do đọc qua script và cho chúng tôi biết nếu bạn có bất kỳ câu hỏi hoặc lo ngại nào.
Tham số của script
Tệp script huấn luyện có nhiều tham số để giúp bạn tùy chỉnh quá trình huấn luyện theo nhu cầu. Tất cả các tham số và mô tả của chúng được liệt kê trong hàm parse_args(). Khi phù hợp, Diffusers cung cấp các giá trị mặc định cho từng tham số, chẳng hạn như kích thước lô huấn luyện (training batch size) và tốc độ học (learning rate), nhưng bạn có thể tự do thay đổi các giá trị này trong lệnh huấn luyện nếu muốn.
Ví dụ, để tăng số bước tích lũy gradient lên trên giá trị mặc định là 1:
accelerate launch textual_inversion.py \ --gradient_accumulation_steps=4
Một số tham số cơ bản và quan trọng khác cần chỉ định bao gồm:
--pretrained_model_name_or_path: tên của model trên Hub hoặc đường dẫn cục bộ đến model được huấn luyện trước--train_data_dir: đường dẫn đến thư mục chứa bộ dữ liệu huấn luyện (các hình ảnh mẫu)--output_dir: nơi lưu trữ mô hình đã được huấn luyện--push_to_hub: có đẩy mô hình đã huấn luyện lên Hub hay không--checkpointing_steps: tần suất lưu checkpoint trong quá trình huấn luyện mô hình; điều này hữu ích nếu vì một lý do nào đó quá trình huấn luyện bị gián đoạn, bạn có thể tiếp tục huấn luyện từ checkpoint đó bằng cách thêm--resume_from_checkpointvào lệnh huấn luyện của bạn--num_vectors: số lượng vector để học các embedding; tăng tham số này giúp mô hình học tốt hơn nhưng đi kèm với chi phí huấn luyện cao hơn--placeholder_token: từ đặc biệt để liên kết các embedding đã học (bạn phải sử dụng từ này trong prompt của mình để suy luận)--initializer_token: một từ duy nhất mô tả khái quát đối tượng hoặc phong cách mà bạn đang cố gắng huấn luyện--learnable_property: xác định xem bạn đang huấn luyện mô hình để học một “phong cách” mới (ví dụ: phong cách vẽ tranh của Van Gogh) hay một “đối tượng” (ví dụ: chú chó của bạn)
Script huấn luyện
Khác với một số script huấn luyện khác, textual_inversion.py có một lớp dataset tùy chỉnh, TextualInversionDataset để tạo dataset. Bạn có thể tùy chỉnh kích thước ảnh, token placeholder, phương pháp nội suy, có nên cắt ảnh hay không, và nhiều hơn nữa. Nếu cần thay đổi cách tạo dataset, bạn có thể sửa TextualInversionDataset.
Tiếp theo, bạn sẽ tìm thấy mã tiền xử lý bộ dữ liệu và vòng lặp huấn luyện trong hàm main().
Script bắt đầu bằng việc nạp tokenizer, scheduler và model:
# Load tokenizer
if args.tokenizer_name:
tokenizer = CLIPTokenizer.from_pretrained(args.tokenizer_name)
elif args.pretrained_model_name_or_path:
tokenizer = CLIPTokenizer.from_pretrained(args.pretrained_model_name_or_path, subfolder="tokenizer")
# Load scheduler and models
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
text_encoder = CLIPTextModel.from_pretrained(
args.pretrained_model_name_or_path, subfolder="text_encoder", revision=args.revision
)
vae = AutoencoderKL.from_pretrained(args.pretrained_model_name_or_path, subfolder="vae", revision=args.revision)
unet = UNet2DConditionModel.from_pretrained(
args.pretrained_model_name_or_path, subfolder="unet", revision=args.revision
)Token placeholder đặc biệt được thêm vào bên cạnh tokenizer, và embedding được điều chỉnh lại để tính đến token mới.
Sau đó, script tạo một dataset từ TextualInversionDataset:
train_dataset = TextualInversionDataset(
data_root=args.train_data_dir,
tokenizer=tokenizer,
size=args.resolution,
placeholder_token=(" ".join(tokenizer.convert_ids_to_tokens(placeholder_token_ids))),
repeats=args.repeats,
learnable_property=args.learnable_property,
center_crop=args.center_crop,
set="train",
)
train_dataloader = torch.utils.data.DataLoader(
train_dataset, batch_size=args.train_batch_size, shuffle=True, num_workers=args.dataloader_num_workers
)Cuối cùng, vòng lặp huấn luyện xử lý mọi thứ còn lại, từ việc dự đoán phần dư nhiễu đến việc cập nhật trọng số nhúng của token đặc biệt dùng làm chỗ giữ.
Nếu bạn muốn tìm hiểu thêm về cách hoạt động của vòng lặp huấn luyện, hãy xem hướng dẫn Hiểu về pipeline, mô hình và trình lập lịch, nơi phân tích chi tiết mẫu cơ bản của quá trình khử nhiễu.
Chạy script
Khi bạn đã thực hiện tất cả các thay đổi hoặc hài lòng với cấu hình mặc định, bạn đã sẵn sàng để chạy script huấn luyện! 🚀
Trong hướng dẫn này, bạn sẽ tải xuống một số hình ảnh về đồ chơi cho mèo và lưu chúng vào một thư mục. Nhưng hãy nhớ rằng bạn có thể tự tạo và sử dụng bộ dữ liệu của riêng mình nếu muốn (xem hướng dẫn Tạo bộ dữ liệu để huấn luyện).
from huggingface_hub import snapshot_download
local_dir = "./cat"
snapshot_download(
"diffusers/cat_toy_example", local_dir=local_dir, repo_type="dataset", ignore_patterns=".gitattributes"
)Đặt biến môi trường MODEL_NAME thành id của một model trên Hub hoặc đường dẫn đến một model cục bộ, và DATA_DIR thành đường dẫn nơi bạn vừa tải xuống các hình ảnh mèo. Script sẽ tạo và lưu các tệp sau vào repository của bạn:
learned_embeds.bin: các vector embedding đã học tương ứng với các hình ảnh ví dụ của bạntoken_identifier.txt: token đặc trưngtype_of_concept.txt: loại khái niệm bạn đang huấn luyện (chọn “object” hoặc “style”)
Một lần chạy huấn luyện đầy đủ mất khoảng 1 giờ trên một GPU V100 đơn lẻ.
Một điều nữa trước khi bạn chạy script. Nếu bạn muốn theo dõi quá trình huấn luyện, bạn có thể định kỳ lưu các hình ảnh được tạo ra khi quá trình huấn luyện diễn ra. Thêm các tham số sau vào lệnh huấn luyện:
--validation_prompt="A <cat-toy> train"
--num_validation_images=4
--validation_steps=100export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export DATA_DIR="./cat"
accelerate launch textual_inversion.py \
--pretrained_model_name_or_path=$MODEL_NAME \
--train_data_dir=$DATA_DIR \
--learnable_property="object" \
--placeholder_token="<cat-toy>" \
--initializer_token="toy" \
--resolution=512 \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--max_train_steps=3000 \
--learning_rate=5.0e-04 \
--scale_lr \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--output_dir="textual_inversion_cat" \
--push_to_hubSau khi huấn luyện hoàn tất, bạn có thể sử dụng mô hình vừa được huấn luyện để suy luận như sau:
from diffusers import StableDiffusionPipeline
import torch
pipeline = StableDiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to("cuda") # or "mps", "xpu", "cpu"
pipeline.load_textual_inversion("sd-concepts-library/cat-toy")
image = pipeline("A <cat-toy> train", num_inference_steps=50).images[0]
image.save("cat-train.png")Các bước tiếp theo
Chúc mừng bạn đã huấn luyện thành công mô hình Textual Inversion của riêng mình! 🎉 Để tìm hiểu thêm về cách sử dụng mô hình mới, các hướng dẫn sau có thể hữu ích:
- Tìm hiểu cách tải các embedding Textual Inversion và sử dụng chúng như các embedding âm.