Diffusers documentation

Textual Inversion

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Textual Inversion

Textual Inversion adalah teknik pelatihan untuk mempersonalisasi model generasi gambar dengan hanya beberapa gambar contoh dari apa yang ingin dipelajari. Teknik ini bekerja dengan mempelajari dan memperbarui teks embeddings (embeddings baru ini terikat pada kata khusus yang harus Anda gunakan dalam prompt) agar sesuai dengan gambar contoh yang Anda berikan.

Untuk inferensi dengan embedding yang telah dilatih, lihat Inferensi textual inversion.

Jika Anda melatih pada GPU dengan vRAM terbatas, Anda sebaiknya mencoba mengaktifkan parameter gradient_checkpointing dan mixed_precision dalam perintah pelatihan. Anda juga dapat mengurangi jejak memori dengan menggunakan perhatian yang hemat memori dengan xFormers.

Panduan ini akan membahas skrip textual_invention.py untuk membantu Anda lebih mengenalnya, serta bagaimana Anda dapat menyesuaikannya untuk kebutuhan Anda sendiri.

Sebelum menjalankan skrip, pastikan Anda menginstal pustaka dari sumber:

git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .

Navigasi ke folder contoh dengan skrip pelatihan dan instal dependensi yang diperlukan untuk skrip yang Anda gunakan:

cd examples/textual_inversion
pip install -r requirements.txt

🤗 Accelerate adalah pustaka untuk membantu Anda melatih pada beberapa GPU/TPU atau dengan presisi campuran. Pustaka ini akan mengonfigurasi pengaturan pelatihan Anda secara otomatis berdasarkan perangkat keras dan lingkungan Anda. Lihat Tour singkat 🤗 Accelerate untuk mempelajari lebih lanjut.

Inisialisasi lingkungan 🤗 Accelerate:

accelerate config

Untuk menyiapkan lingkungan 🤗 Accelerate default tanpa memilih konfigurasi apa pun:

accelerate config default

Atau jika lingkungan Anda tidak mendukung shell interaktif, seperti notebook, Anda dapat menggunakan:

from accelerate.utils import write_basic_config

write_basic_config()

Terakhir, jika Anda ingin melatih model pada dataset Anda sendiri, lihat panduan Membuat dataset untuk pelatihan untuk mempelajari cara membuat dataset yang berfungsi dengan skrip pelatihan.

Bagian-bagian berikut menyoroti bagian dari skrip pelatihan yang penting untuk dipahami agar Anda dapat memodifikasinya, namun tidak membahas setiap aspek skrip secara detail. Jika Anda tertarik untuk mempelajari lebih lanjut, silakan membaca skrip tersebut dan beri tahu kami jika Anda memiliki pertanyaan atau kekhawatiran.

Parameter skrip

Skrip pelatihan memiliki banyak parameter untuk membantu Anda menyesuaikan proses pelatihan sesuai kebutuhan Anda. Semua parameter beserta deskripsinya tercantum dalam fungsi parse_args(). Di mana berlaku, Diffusers menyediakan nilai default untuk setiap parameter, seperti ukuran batch pelatihan dan learning rate, tetapi silakan ubah nilai-nilai ini dalam perintah pelatihan jika Anda ingin.

Sebagai contoh, untuk meningkatkan jumlah langkah akumulasi gradien di atas nilai default 1:

accelerate launch textual_inversion.py \
  --gradient_accumulation_steps=4

Beberapa parameter dasar dan penting lainnya yang perlu ditentukan meliputi:

  • --pretrained_model_name_or_path: nama model di Hub atau jalur lokal ke model pretrained
  • --train_data_dir: path ke folder yang berisi dataset pelatihan (contoh gambar)
  • --output_dir: tempat menyimpan model yang telah dilatih
  • --push_to_hub: apakah model yang dilatih akan didorong ke Hub
  • --checkpointing_steps: frekuensi penyimpanan checkpoint saat model dilatih; ini berguna jika pelatihan terputus karena alasan tertentu, Anda dapat melanjutkan pelatihan dari checkpoint tersebut dengan menambahkan --resume_from_checkpoint ke perintah pelatihan Anda
  • --num_vectors: jumlah vektor untuk mempelajari embedding; meningkatkan parameter ini membantu model belajar lebih baik tetapi disertai dengan biaya pelatihan yang lebih tinggi
  • --placeholder_token: kata khusus untuk mengaitkan embedding yang dipelajari (Anda harus menggunakan kata ini dalam prompt Anda untuk inferensi)
  • --initializer_token: satu kata yang secara umum menggambarkan objek atau gaya yang sedang Anda latih
  • --learnable_property: apakah Anda melatih model untuk mempelajari “gaya” baru (misalnya, gaya melukis Van Gogh) atau “objek” (misalnya, anjing Anda)

Skrip pelatihan

Unlike some of the other training scripts, textual_inversion.py has a custom dataset class, TextualInversionDataset for creating a dataset. You can customize the image size, placeholder token, interpolation method, whether to crop the image, and more. If you need to change how the dataset is created, you can modify TextualInversionDataset.

Selanjutnya, Anda akan menemukan kode pra-pemrosesan dataset dan loop pelatihan di fungsi main().

Skrip dimulai dengan memuat tokenizer, scheduler dan 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 khusus ditambahkan di samping tokenizer, dan embedding disesuaikan kembali untuk mengakomodasi token baru.

Lalu, skrip membuat dataset dari 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
)

Terakhir, training loop menangani semua hal lainnya, mulai dari memprediksi residual berisik hingga memperbarui bobot embedding dari token placeholder khusus.

Jika Anda ingin mempelajari lebih lanjut tentang cara kerja loop pelatihan, lihat tutorial Memahami pipeline, model, dan scheduler yang menguraikan pola dasar dari proses denoising.

Jalankan skrip

Setelah Anda melakukan semua perubahan atau merasa puas dengan konfigurasi default, Anda siap untuk menjalankan skrip pelatihan! 🚀

Untuk panduan ini, Anda akan mengunduh beberapa gambar mainan kucing dan menyimpannya dalam sebuah direktori. Namun, ingatlah bahwa Anda dapat membuat dan menggunakan dataset Anda sendiri jika diinginkan (lihat panduan Membuat dataset untuk pelatihan).

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"
)

Setel variabel lingkungan MODEL_NAME ke id model di Hub atau path ke model lokal, dan DATA_DIR ke path tempat Anda baru saja mengunduh gambar kucing. Skrip membuat dan menyimpan file-file berikut ke repositori Anda:

  • learned_embeds.bin: vektor embedding yang dipelajari yang sesuai dengan gambar contoh Anda
  • token_identifier.txt: token placeholder khusus
  • type_of_concept.txt: jenis konsep yang sedang Anda latih (baik “object” atau “style”)

Satu siklus pelatihan penuh membutuhkan waktu sekitar 1 jam pada satu GPU V100.

Satu hal lagi sebelum Anda menjalankan skrip. Jika Anda tertarik untuk mengikuti proses pelatihan, Anda dapat menyimpan gambar yang dihasilkan secara berkala seiring kemajuan pelatihan. Tambahkan parameter berikut ke perintah pelatihan:

--validation_prompt="A <cat-toy> train"
--num_validation_images=4
--validation_steps=100
export 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_hub

Setelah pelatihan selesai, Anda dapat menggunakan model yang baru dilatih untuk inferensi seperti:

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")

Langkah selanjutnya

Selamat karena Anda telah melatih model Textual Inversion Anda sendiri! 🎉 Untuk mempelajari lebih lanjut tentang cara menggunakan model baru Anda, panduan berikut mungkin dapat membantu:

Update on GitHub