Buckets:
| # InstructPix2Pix | |
| [InstructPix2Pix](https://hf.co/papers/2211.09800) là một mô hình Stable Diffusion được huấn luyện để chỉnh sửa hình ảnh dựa trên các hướng dẫn do con người cung cấp. Ví dụ, prompt của bạn có thể là "turn the clouds rainy" và mô hình sẽ chỉnh sửa hình ảnh đầu vào cho phù hợp. Mô hình này được điều kiện bởi prompt văn bản (hoặc hướng dẫn chỉnh sửa) và hình ảnh đầu vào. | |
| Hướng dẫn này sẽ khám phá script huấn luyện [train_instruct_pix2pix.py](https://github.com/huggingface/diffusers/blob/main/examples/instruct_pix2pix/train_instruct_pix2pix.py) để giúp bạn làm quen với nó, cũng như 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: | |
| ```bash | |
| git clone https://github.com/huggingface/diffusers | |
| cd diffusers | |
| pip install . | |
| ``` | |
| Sau đó, điều hướng đến thư mục ví dụ chứa 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: | |
| ```bash | |
| cd examples/instruct_pix2pix | |
| pip install -r requirements.txt | |
| ``` | |
| > [!TIP] | |
| > 🤗 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](https://huggingface.co/docs/accelerate/quicktour) để tìm hiểu thêm. | |
| Khởi tạo một môi trường 🤗 Accelerate: | |
| ```bash | |
| 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: | |
| ```bash | |
| 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: | |
| ```py | |
| 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](create_dataset) để 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. | |
| > [!TIP] | |
| > 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](https://github.com/huggingface/diffusers/blob/main/examples/instruct_pix2pix/train_instruct_pix2pix.py) 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 kịch bản huấn luyện có nhiều tham số để giúp bạn tùy chỉnh phiên huấn luyện của mình. Tất cả các tham số và mô tả của chúng được tìm thấy trong hàm [`parse_args()`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L65). Các giá trị mặc định được cung cấp cho hầu hết các tham số và hoạt động khá tốt, nhưng bạn cũng có thể đặt giá trị của riêng mình trong lệnh huấn luyện nếu muốn. | |
| Ví dụ, để tăng độ phân giải của hình ảnh đầu vào: | |
| ```bash | |
| accelerate launch train_instruct_pix2pix.py \ | |
| --resolution=512 \ | |
| ``` | |
| Nhiều tham số cơ bản và quan trọng được mô tả trong hướng dẫn huấn luyện [Text-to-image](text2image#script-parameters), vì vậy hướng dẫn này chỉ tập trung vào các tham số liên quan đến InstructPix2Pix: | |
| - `--original_image_column`: hình ảnh gốc trước khi các chỉnh sửa được thực hiện | |
| - `--edited_image_column`: hình ảnh sau khi các chỉnh sửa được thực hiện | |
| - `--edit_prompt_column`: các hướng dẫn để chỉnh sửa hình ảnh | |
| - `--conditioning_dropout_prob`: xác suất dropout cho ảnh đã chỉnh sửa và các prompt chỉnh sửa trong quá trình huấn luyện, cho phép classifier-free guidance (CFG) cho một hoặc cả hai đầu vào điều kiện | |
| ## Script huấn luyện | |
| Mã tiền xử lý tập dữ liệu và vòng lặp huấn luyện nằm trong hàm [`main()`](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L374). Đây là nơi bạn sẽ thực hiện các thay đổi đối với script huấn luyện để điều chỉnh cho trường hợp sử dụng của riêng mình. | |
| Tương tự như các tham số của script, một hướng dẫn chi tiết về script huấn luyện được cung cấp trong hướng dẫn huấn luyện [Text-to-image](text2image#training-script). Thay vào đó, hướng dẫn này sẽ xem xét các phần liên quan đến InstructPix2Pix trong script. | |
| Script bắt đầu bằng việc sửa đổi [số lượng kênh đầu vào](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L445) trong lớp tích chập đầu tiên của UNet để tính đến ảnh điều kiện bổ sung của InstructPix2Pix: | |
| ```py | |
| in_channels = 8 | |
| out_channels = unet.conv_in.out_channels | |
| unet.register_to_config(in_channels=in_channels) | |
| with torch.no_grad(): | |
| new_conv_in = nn.Conv2d( | |
| in_channels, out_channels, unet.conv_in.kernel_size, unet.conv_in.stride, unet.conv_in.padding | |
| ) | |
| new_conv_in.weight.zero_() | |
| new_conv_in.weight[:, :4, :, :].copy_(unet.conv_in.weight) | |
| unet.conv_in = new_conv_in | |
| ``` | |
| Các tham số UNet này được [cập nhật](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L545C1-L551C6) bởi optimizer: | |
| ```py | |
| optimizer = optimizer_cls( | |
| unet.parameters(), | |
| lr=args.learning_rate, | |
| betas=(args.adam_beta1, args.adam_beta2), | |
| weight_decay=args.adam_weight_decay, | |
| eps=args.adam_epsilon, | |
| ) | |
| ``` | |
| Tiếp theo, các hình ảnh đã chỉnh sửa và các hướng dẫn chỉnh sửa sẽ được [xử lý trước](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L624) và [token hóa](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L610C24-L610C24). Điều quan trọng là các phép biến đổi hình ảnh giống nhau phải được áp dụng cho cả hình ảnh gốc và hình ảnh đã chỉnh sửa. | |
| ```py | |
| def preprocess_train(examples): | |
| preprocessed_images = preprocess_images(examples) | |
| original_images, edited_images = preprocessed_images.chunk(2) | |
| original_images = original_images.reshape(-1, 3, args.resolution, args.resolution) | |
| edited_images = edited_images.reshape(-1, 3, args.resolution, args.resolution) | |
| examples["original_pixel_values"] = original_images | |
| examples["edited_pixel_values"] = edited_images | |
| captions = list(examples[edit_prompt_column]) | |
| examples["input_ids"] = tokenize_captions(captions) | |
| return examples | |
| ``` | |
| Cuối cùng, trong [vòng lặp huấn luyện](https://github.com/huggingface/diffusers/blob/64603389da01082055a901f2883c4810d1144edb/examples/instruct_pix2pix/train_instruct_pix2pix.py#L730), nó bắt đầu bằng cách mã hóa các hình ảnh đã chỉnh sửa vào không gian tiềm ẩn: | |
| ```py | |
| latents = vae.encode(batch["edited_pixel_values"].to(weight_dtype)).latent_dist.sample() | |
| latents = latents * vae.config.scaling_factor | |
| ``` | |
| Sau đó, script áp dụng dropout vào các embedding của hình ảnh gốc và hướng dẫn chỉnh sửa để hỗ trợ CFG. Đây là yếu tố cho phép mô hình điều chỉnh mức độ ảnh hưởng của hướng dẫn chỉnh sửa và hình ảnh gốc lên hình ảnh đã chỉnh sửa. | |
| ```py | |
| encoder_hidden_states = text_encoder(batch["input_ids"])[0] | |
| original_image_embeds = vae.encode(batch["original_pixel_values"].to(weight_dtype)).latent_dist.mode() | |
| if args.conditioning_dropout_prob is not None: | |
| random_p = torch.rand(bsz, device=latents.device, generator=generator) | |
| prompt_mask = random_p < 2 * args.conditioning_dropout_prob | |
| prompt_mask = prompt_mask.reshape(bsz, 1, 1) | |
| null_conditioning = text_encoder(tokenize_captions([""]).to(accelerator.device))[0] | |
| encoder_hidden_states = torch.where(prompt_mask, null_conditioning, encoder_hidden_states) | |
| image_mask_dtype = original_image_embeds.dtype | |
| image_mask = 1 - ( | |
| (random_p >= args.conditioning_dropout_prob).to(image_mask_dtype) | |
| * (random_p < 3 * args.conditioning_dropout_prob).to(image_mask_dtype) | |
| ) | |
| image_mask = image_mask.reshape(bsz, 1, 1, 1) | |
| original_image_embeds = image_mask * original_image_embeds | |
| ``` | |
| Đó là phần chính! Ngoài những khác biệt được mô tả ở đây, phần còn lại của script rất giống với script huấn luyện [Text-to-image](text2image#training-script), vì vậy bạn có thể xem thêm để biết chi tiết. Nếu bạn muốn tìm hiểu sâu hơn về cách hoạt động của vòng lặp huấn luyện, hãy xem hướng dẫn [Understanding pipelines, models and schedulers](../using-diffusers/write_own_pipeline) để nắm rõ mô hình cơ bản của quá trình khử nhiễu. | |
| ## Chạy script | |
| Khi bạn đã hài lòng với các thay đổi trong script của mình hoặc chấp nhận cấu hình mặc định, bạn đã sẵn sàng để khởi chạy script huấn luyện! 🚀 | |
| Hướng dẫn này sử dụng bộ dữ liệu [fusing/instructpix2pix-1000-samples](https://huggingface.co/datasets/fusing/instructpix2pix-1000-samples), đây là phiên bản nhỏ hơn của [bộ dữ liệu gốc](https://huggingface.co/datasets/timbrooks/instructpix2pix-clip-filtered). Bạn cũng 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](create_dataset)). | |
| Đặt biến môi trường `MODEL_NAME` thành tên của model (có thể là model id trên Hub hoặc đường dẫn đến model cục bộ), và `DATASET_ID` thành tên của dataset trên Hub. Script sẽ tạo và lưu tất cả các thành phần (feature extractor, scheduler, text encoder, UNet, v.v.) vào một thư mục con trong repository của bạn. | |
| > [!TIP] | |
| > Để đạt kết quả tốt hơn, hãy thử các phiên bản huấn luyện dài hơn với bộ dữ liệu lớn hơn. Chúng tôi chỉ kiểm tra script huấn luyện này trên bộ dữ liệu quy mô nhỏ. | |
| > | |
| > | |
| > | |
| > Để theo dõi tiến độ huấn luyện với Weights and Biases, hãy thêm tham số `--report_to=wandb` vào lệnh huấn luyện và chỉ định một hình ảnh kiểm chứng bằng `--val_image_url` cùng một prompt kiểm chứng bằng `--validation_prompt`. Điều này có thể rất hữu ích để gỡ lỗi mô hình. | |
| Nếu bạn đang huấn luyện trên nhiều hơn một GPU, hãy thêm tham số `--multi_gpu` vào lệnh `accelerate launch`. | |
| ```bash | |
| accelerate launch --mixed_precision="fp16" train_instruct_pix2pix.py \ | |
| --pretrained_model_name_or_path=$MODEL_NAME \ | |
| --dataset_name=$DATASET_ID \ | |
| --enable_xformers_memory_efficient_attention \ | |
| --resolution=256 \ | |
| --random_flip \ | |
| --train_batch_size=4 \ | |
| --gradient_accumulation_steps=4 \ | |
| --gradient_checkpointing \ | |
| --max_train_steps=15000 \ | |
| --checkpointing_steps=5000 \ | |
| --checkpoints_total_limit=1 \ | |
| --learning_rate=5e-05 \ | |
| --max_grad_norm=1 \ | |
| --lr_warmup_steps=0 \ | |
| --conditioning_dropout_prob=0.05 \ | |
| --mixed_precision=fp16 \ | |
| --seed=42 \ | |
| --push_to_hub | |
| ``` | |
| Sau khi huấn luyện hoàn tất, bạn có thể sử dụng InstructPix2Pix mới của mình để suy luận: | |
| ```py | |
| import PIL | |
| import requests | |
| import torch | |
| from diffusers import StableDiffusionInstructPix2PixPipeline | |
| from diffusers.utils import load_image | |
| pipeline = StableDiffusionInstructPix2PixPipeline.from_pretrained("your_cool_model", dtype=torch.float16).to("cuda") # or "mps", "xpu", "cpu" | |
| generator = torch.Generator("cuda").manual_seed(0) | |
| image = load_image("https://huggingface.co/datasets/sayakpaul/sample-datasets/resolve/main/test_pix2pix_4.png") | |
| prompt = "add some ducks to the lake" | |
| num_inference_steps = 20 | |
| image_guidance_scale = 1.5 | |
| guidance_scale = 10 | |
| edited_image = pipeline( | |
| prompt, | |
| image=image, | |
| num_inference_steps=num_inference_steps, | |
| image_guidance_scale=image_guidance_scale, | |
| guidance_scale=guidance_scale, | |
| generator=generator, | |
| ).images[0] | |
| edited_image.save("edited_image.png") | |
| ``` | |
| Bạn nên thử nghiệm với các giá trị khác nhau của `num_inference_steps`, `image_guidance_scale` và `guidance_scale` để xem chúng ảnh hưởng như thế nào đến tốc độ và chất lượng suy luận. Các tham số guidance scale đặc biệt có tác động lớn vì chúng kiểm soát mức độ ảnh hưởng của hình ảnh gốc và các hướng dẫn chỉnh sửa đối với hình ảnh đã chỉnh sửa. | |
| ## Stable Diffusion XL | |
| Stable Diffusion XL (SDXL) là một mô hình text-to-image mạnh mẽ, tạo ra các hình ảnh độ phân giải cao, và bổ sung một text-encoder thứ hai vào kiến trúc của nó. Sử dụng script [`train_instruct_pix2pix_sdxl.py`](https://github.com/huggingface/diffusers/blob/main/examples/instruct_pix2pix/train_instruct_pix2pix_sdxl.py) để huấn luyện một mô hình SDXL nhằm tuân theo các hướng dẫn chỉnh sửa hình ảnh. | |
| Tài liệu hướng dẫn [huấn luyện SDXL](sdxl) thảo luận chi tiết hơn về script huấn luyện SDXL. | |
| ## Các bước tiếp theo | |
| Chúc mừng bạn đã huấn luyện thành công mô hình InstructPix2Pix của riêng mình! 🥳 Để tìm hiểu thêm về mô hình, bạn có thể tham khảo: | |
| - Đọc bài đăng trên blog [Instruction-tuning Stable Diffusion with InstructPix2Pix](https://huggingface.co/blog/instruction-tuning-sd) để tìm hiểu thêm về một số thí nghiệm chúng tôi đã thực hiện với InstructPix2Pix, việc chuẩn bị bộ dữ liệu và kết quả cho các chỉ lệnh khác nhau. | |
Xet Storage Details
- Size:
- 14.7 kB
- Xet hash:
- 5ba3416fc7d0c858f18ae904dbf4679aa32bf49065d4abdf8edd983052ebe9ed
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.