Feinabstimmung des stabilen Diffusionsmodells auf Intel-CPUs

Die Fähigkeit von Diffusionsmodellen, realistische Bilder auf der Grundlage von Texthinweisen zu erzeugen, hat zur Popularisierung generativer künstlicher Intelligenz beigetragen. Man hat damit begonnen, diese Modelle in verschiedenen Anwendungsbereichen zu nutzen, darunter Datensynthese und Inhaltserstellung. Hugging Face Hub enthält mehr als 5.000 vorab trainierte Vinsen-Grafikmodelle. In Kombination mit der Diffusers-Bibliothek machen diese Modelle das Erstellen von Arbeitsabläufen zur Bildgenerierung oder das Experimentieren mit verschiedenen Arbeitsabläufen zur Bildgenerierung unglaublich einfach.

Wie bei Transformer-Modellen können Sie auch bei Diffusionsmodellen eine Feinabstimmung vornehmen, damit sie Inhalte generieren, die besser zu Ihren spezifischen Geschäftsanforderungen passen. Zunächst konnte man nur mit der GPU eine Feinabstimmung vornehmen, aber die Dinge ändern sich! Vor einigen Monaten brachte Intel seine Xeon-CPUs der vierten Generation mit dem Codenamen Sapphire Rapids auf den Markt. In Sapphire Rapids ist Intels Advanced Matrix eXtension (AMX) enthalten, ein neuer Hardwarebeschleuniger für Deep-Learning-Workloads. In mehreren früheren Blog-Beiträgen haben wir die Vorteile von AMX aufgezeigt: Feinabstimmung von NLP-Transformator-Modellen , Rückschluss auf NLP-Transformer-Modelle und Rückschluss auf Stable-Diffusion-Modelle .

In diesem Artikel erfahren Sie, wie Sie das Stable Diffusion-Modell auf einem Intel Xeon-CPU-Cluster der 4. Generation optimieren. Für die Feinabstimmung verwenden wir die Textual Inversion-Technik, die nur eine kleine Anzahl von Trainingsbeispielen erfordert, um das Modell effektiv zu verfeinern. In diesem Artikel kommen wir mit 5 Beispielen gut zurecht!

Lass uns anfangen.

Konfigurieren Sie den Cluster

Die kleinen Partner von Intel stellten uns 4 Server zur Verfügung, die in der Intel Developer Cloud (Intel Developer Cloud, IDC) gehostet wurden. Als Cloud-Service-Plattform bietet IDC eine von Intel umfassend optimierte Bereitstellungsumgebung, die die neuesten Intel-Prozessoren und Software-Stacks mit optimaler Leistung integriert. Benutzer können ihre Workloads problemlos in dieser Umgebung entwickeln und ausführen.

Jeder Server, den wir bekamen, war mit zwei Intel Xeon-CPUs der 4. Generation mit jeweils 56 physischen Kernen und 112 Threads ausgestattet. Hier ist die lscpuAusgabe:

Architecture: x86_64
  CPU op-mode(s): 32-bit, 64-bit
  Address sizes: 52 bits physical, 57 bits virtual
  Byte Order: Little Endian
CPU(s): 224
  On-line CPU(s) list: 0-223
Vendor ID: GenuineIntel
  Model name: Intel(R) Xeon(R) Platinum 8480+
    CPU family: 6
    Model: 143
    Thread(s) per core: 2
    Core(s) per socket: 56
    Socket(s): 2
    Stepping: 8
    CPU max MHz: 3800.0000
    CPU min MHz: 800.0000
    BogoMIPS: 4000.00
    Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_per fmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3 cat_l2 cdp_l3 invpcid_single intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb intel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect avx_vnni avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_pkg_req avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect cldemote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities

Wir schreiben die IP-Adressen der vier Server nodefilein die Datei, wobei die erste Zeile der Hauptserver ist.

cat << EOF > nodefile
192.168.20.2
192.168.21.2
192.168.22.2
192.168.23.2
EOF

Verteiltes Training erfordert eine passwortlose sshKommunikation zwischen dem Masterknoten und anderen Knoten. Wenn Sie damit nicht sehr vertraut sind, können Sie diesen Artikel lesen und ihm Schritt für Schritt folgen, um passwortlos einzurichten ssh.

Als nächstes richten wir die Betriebsumgebung ein und installieren die erforderliche Software auf jedem Knoten. Insbesondere haben wir zwei für Intel optimierte Bibliotheken installiert: oneCCL für die Verwaltung verteilter Kommunikation und die Intel Extension für PyTorch (IPEX), die Softwareoptimierungen enthält, um die Hardwarebeschleunigung in Sapphire Rapids voll auszunutzen. Wir haben auch installiert libtcmalloc, eine leistungsstarke Speicherzuweisungsbibliothek, und ihre Softwareabhängigkeiten gperftools.

conda create -n diffuser python==3.9
conda activate diffuser
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
pip3 install transformers accelerate==0.19.0
pip3 install oneccl_bind_pt -f https://developer.intel.com/ipex-whl-stable-cpu
pip3 install intel_extension_for_pytorch
conda install gperftools -c conda-forge -y

Als Nächstes klonen wir das Diffusor-Repository auf jedem Knoten und installieren es von der Quelle.

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

Als nächstes müssen wir IPEX verwenden, diffusers/examples/textual_inversionum einige Optimierungen am Feinabstimmungsskript vorzunehmen, um die IPEX-Optimierungen für diffusersInferenzmodelle einzubeziehen. Die Inferenzoptimierung seiner Untermodelle kann nicht in der Bibliothek, sondern nur im Skriptcode durchgeführt werden. Und die Feinabstimmung des Clip-Text-Modells kann durch erfolgen. Wir importieren IPEX und optimieren die Inferenz auf U-Net- und Variational Autoencoder (VAE)-Modellen. Vergessen Sie nicht, dass diese Änderung im Code jedes Knotens vorgenommen werden muss.pipelinepipelineaccelerateaccelerate

diff --git a/examples/textual_inversion/textual_inversion.py b/examples/textual_inversion/textual_inversion.py
index 4a193abc..91c2edd1 100644
--- a/examples/textual_inversion/textual_inversion.py
+++ b/examples/textual_inversion/textual_inversion.py
@@ -765,6 +765,10 @@ def main():
     unet.to(accelerator.device, dtype=weight_dtype)
     vae.to(accelerator.device, dtype=weight_dtype)

+ import intel_extension_for_pytorch as ipex
+ unet = ipex.optimize(unet, dtype=weight_dtype)
+ vae = ipex.optimize(vae, dtype=weight_dtype)
+
     # We need to recalculate our total training steps as the size of the training dataloader may have changed.
     num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps)
     if overrode_max_train_steps:

Der letzte Schritt besteht darin, die Trainingsbilder herunterzuladen. Normalerweise würden wir einen freigegebenen NFS-Ordner verwenden, aber hier entscheiden wir uns der Einfachheit halber dafür, das Image auf jeden Knoten herunterzuladen. Stellen Sie sicher, dass das Verzeichnis für Trainingsbilder auf allen Knoten denselben Pfad ( ) hat /home/devcloud/dicoo.

mkdir /home/devcloud/dicoo
cd /home/devcloud/dicoo
wget https://huggingface.co/sd-concepts-library/dicoo/resolve/main/concept_images/0.jpeg
wget https://huggingface.co/sd-concepts-library/dicoo/resolve/main/concept_images/1.jpeg
wget https://huggingface.co/sd-concepts-library/dicoo/resolve/main/concept_images/2.jpeg
wget https://huggingface.co/sd-concepts-library/dicoo/resolve/main/concept_images/3.jpeg
wget https://huggingface.co/sd-concepts-library/dicoo/resolve/main/concept_images/4.jpeg

Die von uns verwendeten Trainingsbilder sind unten dargestellt:

64e2d5f66d69614f80c44542fcf1f3ad.jpeg 30b6d5e6425638eb2a024797df38b92f.jpeg e390af4656e8ffaac23c7ebe6a4f0377.jpeg f5dc9c418f9ce9dfb23253ccf6e94b6d.jpeg fc7b6dea2c2d3596d7c9a095d1406011.jpeg

Zu diesem Zeitpunkt ist die Systemkonfiguration abgeschlossen. Als nächstes beginnen wir mit der Konfiguration der Trainingsaufgabe.

Konfigurieren Sie die Feinabstimmungsumgebung

Nutzen Sie die Accelerate-Bibliothek, um verteiltes Training zu vereinfachen. Wir müssen auf jedem Knoten laufen acclerate configund einige einfache Fragen beantworten.

Unten ist ein Screenshot des Masterknotens. Auf den anderen Knoten müssen Sie rank1, 2 und 3 festlegen und die anderen Antworten gleich lassen.

8e3433ae2ab12e65cf0deea058c57803.png

Schließlich müssen wir einige Umgebungsvariablen auf dem Masterknoten festlegen. Diese Umgebungsvariablen werden an andere Knoten weitergegeben, wenn die Feinabstimmungsaufgabe startet. Die erste Zeile legt den Namen der Netzwerkschnittstelle fest, die mit dem lokalen Netzwerk verbunden ist, auf dem alle Knoten laufen. Möglicherweise müssen Sie verwenden ifconfig, um den Namen der Netzwerkschnittstelle entsprechend Ihren Anforderungen festzulegen.

export I_MPI_HYDRA_IFACE=ens786f1
oneccl_bindings_for_pytorch_path=$(python -c "from oneccl_bindings_for_pytorch import cwd; print(cwd)")
source $oneccl_bindings_for_pytorch_path/env/setvars.sh
export LD_PRELOAD=${LD_PRELOAD}:${CONDA_PREFIX}/lib/libiomp5.so
export LD_PRELOAD=${LD_PRELOAD}:${CONDA_PREFIX}/lib/libtcmalloc.so
export CCL_ATL_TRANSPORT=ofi
export CCL_WORKER_COUNT=1

export MODEL_NAME="runwayml/stable-diffusion-v1-5"
export DATA_DIR="/home/devcloud/dicoo"

Ok, jetzt können wir mit der Feinabstimmung beginnen.

Feinabstimmung des Modells

Wir mpirunbeginnen mit der Feinabstimmung, wodurch automatisch nodefileeine verteilte Kommunikation zwischen den in aufgeführten Knoten eingerichtet wird. Hier führen wir 16 Prozesse aus ( -n), wobei auf jedem Knoten 4 Prozesse ausgeführt werden ( -ppn). AccelerateDie Bibliothek richtet automatisch verteilte Schulungen über alle Prozesse hinweg ein.

Wir starten den folgenden Befehl, um 200 Schritte zu trainieren, es dauert nur etwa 5 Minuten .

mpirun -f nodefile -n 16 -ppn 4                                                         \
accelerate launch diffusers/examples/textual_inversion/textual_inversion.py \
--pretrained_model_name_or_path=$MODEL_NAME --train_data_dir=$DATA_DIR \
--learnable_property="object" --placeholder_token="<dicoo>" --initializer_token="toy" \
--resolution=512 --train_batch_size=1 --seed=7 --gradient_accumulation_steps=1 \
--max_train_steps=200 --learning_rate=2.0e-03 --scale_lr --lr_scheduler="constant" \
--lr_warmup_steps=0 --output_dir=./textual_inversion_output --mixed_precision bf16 \
--save_as_full_pipeline

Der Screenshot unten zeigt den Status des Clusters während des Trainings:

4b30b97d28bb1a3e41e0db27cb2a797c.png

Fehlerbehebung

Verteiltes Training kann manchmal schwierig sein, insbesondere wenn Sie neu darin sind. Kleine Fehlkonfigurationen auf einem einzelnen Knoten sind die wahrscheinlichsten Probleme: fehlende Abhängigkeiten, an verschiedenen Orten gespeicherte Bilder usw.

Sie können sich bei jedem Knoten anmelden und lokal trainieren, um Probleme schnell zu lokalisieren. Richten Sie zunächst dieselbe Umgebung wie den Masterknoten ein und führen Sie dann Folgendes aus:

python diffusers/examples/textual_inversion/textual_inversion.py \
--pretrained_model_name_or_path=$MODEL_NAME --train_data_dir=$DATA_DIR \
--learnable_property="object" --placeholder_token="<dicoo>" --initializer_token="toy" \
--resolution=512 --train_batch_size=1 --seed=7 --gradient_accumulation_steps=1 \
--max_train_steps=200 --learning_rate=2.0e-03 --scale_lr --lr_scheduler="constant" \
--lr_warmup_steps=0 --output_dir=./textual_inversion_output --mixed_precision bf16 \
--save_as_full_pipeline

Wenn das Training erfolgreich gestartet ist, stoppen Sie es und fahren Sie mit dem nächsten Knoten fort. Wenn das Training auf allen Knoten erfolgreich gestartet wurde, kehren Sie bitte zum Hauptknoten zurück und prüfen Sie sorgfältig, ob ein Problem nodefilemit der Umgebung und mpirunden Befehlen vorliegt. Keine Sorge, irgendwann wirst du das Problem finden :).

Generieren Sie Bilder mit dem fein abgestimmten Modell

Nach 5 Minuten Training wird das trainierte Modell lokal gespeichert und wir können es direkt verwenden, um das Modell zu diffusersladen pipelineund Bilder zu generieren. Aber hier werden wir Optimum Intel und OpenVINO verwenden, um das Modell für die Inferenz weiter zu optimieren. Wie im vorherigen Artikel besprochen, optimiert, damit Sie ein Bild in weniger als 5 Sekunden auf einer einzigen CPU erstellen können!

pip install optimum[openvino]

Wir verwenden den folgenden Code, um das Modell zu laden, es für eine feste Ausgabeform zu optimieren und schließlich das optimierte Modell zu speichern:

from optimum.intel.openvino import OVStableDiffusionPipeline

model_id = "./textual_inversion_output"

ov_pipe = OVStableDiffusionPipeline.from_pretrained(model_id, export=True)
ov_pipe.reshape(batch_size=5, height=512, width=512, num_images_per_prompt=1)
ov_pipe.save_pretrained("./textual_inversion_output_ov")

Dann laden wir das optimierte Modell, generieren 5 verschiedene Bilder und speichern sie:

from optimum.intel.openvino import OVStableDiffusionPipeline

model_id = "./textual_inversion_output_ov"

ov_pipe = OVStableDiffusionPipeline.from_pretrained(model_id, num_inference_steps=20)
prompt = ["a yellow <dicoo> robot at the beach, high quality"]*5
images = ov_pipe(prompt).images
print(images)
for idx,img in enumerate(images):
    img.save(f"image{idx}.png")

Unten ist das Bild, das es erzeugt. Erstaunlicherweise brauchte das Model nur fünf Bilder, um zu wissen, dicoodass es eine Brille trug!

9b2ff2acdff40e3322ccfb73761d6565.png

Sie können das Modell auch weiter verfeinern, um bessere Ergebnisse zu erzielen. Unten sehen Sie ein Bild, das von einem Modell generiert wurde, das auf 3.000 Schritte (etwa eine Stunde) feinabgestimmt wurde und recht gut funktioniert.

07a9fa54ab9f55618d712d55b7bd2eae.png

Zusammenfassen

Dank der intensiven Zusammenarbeit zwischen Hugging Face und Intel können Sie jetzt Xeon-CPU-Server verwenden, um qualitativ hochwertige Bilder zu generieren, die Ihren Geschäftsanforderungen entsprechen. Während CPUs im Allgemeinen günstiger und leichter verfügbar sind als spezialisierte Hardware wie GPUs, sind Xeon-CPUs auch Generalisten, die problemlos für andere produktive Aufgaben wie Webserver, Datenbanken und mehr verwendet werden können. Daher sind CPUs eine logische Wahl für eine voll ausgestattete und flexible IT-Infrastruktur.

Für den Einstieg stehen folgende Ressourcen zur Verfügung, die je nach Bedarf genutzt werden können:

  • Dokumentation zu Diffusoren

  • Optimale Intel-Dokumentation

  • Intel IPEX auf GitHub

  • Entwicklerressourcen für Intel und Hugging Face

  • Xeon-CPU-Instanzen der 4. Generation auf IDC, AWS, GCP und Alibaba Cloud

Wenn Sie Fragen oder Feedback haben, können Sie gerne eine Nachricht im Hugging Face-Forum hinterlassen.

Danke fürs Lesen!


Original Englisch: https://hf.co/blog/stable-diffusion-finetuning-intel

Autor: Julien Simon

Übersetzer: Matrix Yao (Yao Weifeng), ein Deep-Learning-Ingenieur bei Intel, arbeitet an der Anwendung von Modellen der Transformer-Familie auf verschiedene Modaldaten sowie am Training und der Argumentation groß angelegter Modelle.

Korrekturlesen/Satz: zhongdongy (阿东)

Ich denke du magst

Origin blog.csdn.net/HuggingFace/article/details/131820999
Empfohlen
Rangfolge