Dieser Artikel wird Stabile Diffusion Nehmen Sie Quick Kit als Beispiel, um im Detail zu erklären, wie man Traumkabine Optimieren Sie das stabile Diffusionsmodell, einschließlich grundlegender Kenntnisse zur Feinabstimmung des stabilen Diffusionsmodells, einer Einführung in die Feinabstimmung von Dreambooth und der Verwendung von Quick Kit, um den Feinabstimmungseffekt anhand einer Demo zu demonstrieren.Offizielle Website von Amazon Web Services:https://www.amazonaws.cn
Offizielle Website von Amazon Cloud Overseas:https://aws.amazon.com/cn/
Feinabstimmung des stabilen DiffusionsmodellsDerzeit gibt es vier Hauptmethoden zur Feinabstimmung des stabilen Diffusionsmodells:Dreambooth, LoRA (Low-Rank-Adaption großer Sprachmodelle), Textinversion, Hypernetzwerke.Die Unterschiede zwischen ihnen sind ungefähr wie folgt:
Textinversion (auch als Embedding bezeichnet) verändert das ursprüngliche Diffusionsmodell nicht. Stattdessen nutzt sie Deep Learning, um die mit dem gewünschten Bild übereinstimmenden Merkmalsparameter des Zeichenbildes zu ermitteln und diese in diesem kleinen Modell zu speichern. Das bedeutet: Wenn das ursprüngliche Modell in diesem Bereich nicht ausreichend trainiert ist, ist es tatsächlich schwierig, es durch Embedding zum „Lernen“ zu bringen. Außerdem kann es dem Diffusionsmodell nicht beibringen, Bildinhalte zu rendern, die es noch nie gesehen hat.Dreambooth passt die Gewichte aller Schichten des gesamten neuronalen Netzwerks an und trainiert das Eingabebild in das stabile Diffusionsmodell. Im Wesentlichen kopiert es zunächst das Quellmodell, nimmt darauf basierend Feinabstimmungen vor und erstellt daraus ein neues Modell. Es ist grundsätzlich für alle Aufgaben geeignet. Der Nachteil ist der hohe VRAM-Bedarf für das Training. Derzeit kann das Training nach der Feinabstimmung mit 16 GB Videospeicher abgeschlossen werden.LoRA verwendet ebenfalls eine kleine Anzahl von Bildern, trainiert jedoch die Gewichte einer bestimmten Netzwerkschicht und fügt eine neue Netzwerkschicht in das ursprüngliche Modell ein. Dadurch wird vermieden, dass die ursprünglichen Modellparameter geändert und das gesamte Modell kopiert werden muss. Darüber hinaus optimiert es die Anzahl der Parameter der eingefügten Schicht und ermöglicht so eine sehr einfache Methode zur Modelloptimierung. Das von LoRA generierte Modell ist klein und schnell zu trainieren. Für die Inferenz werden das LoRA-Modell und das Basismodell benötigt. Das LoRA-Modell ersetzt die spezifische Netzwerkschicht des Basismodells, sodass seine Wirkung vom Basismodell abhängt.Das Trainingsprinzip von Hypernetworks ähnelt dem von LoRA. Derzeit gibt es keine offizielle Dokumentation dazu. Im Gegensatz zu LoRA ist Hypernetwork ein separates neuronales Netzwerkmodell, das zur Ausgabe der Zwischenschicht verwendet wird, die in das ursprüngliche Diffusionsmodell eingefügt werden kann. Durch Training erhalten wir daher ein neues neuronales Netzwerkmodell, das die entsprechende Zwischenschicht und die entsprechenden Parameter in das ursprüngliche Diffusionsmodell einfügen kann, sodass das Ausgabebild mit der Eingabeanweisung verknüpft ist. Notiz: Das Bild stammt aus dem InternetStabile Diffusionsmodelle ermöglichen die Realisierung umfangreicher Bildgenerierungsszenarien für text- und bildgenerierte Bilder. Erscheint jedoch ein reales, spezifisches Objekt in einem Bild, fällt es den fortschrittlichsten textgenerierten Bildmodellen schwer, dessen wesentliche visuelle Merkmale beizubehalten. Ihnen fehlt die Fähigkeit, das Erscheinungsbild des Objekts in einem gegebenen Referenzsatz zu imitieren oder zu reproduzieren. Die Ausdruckskraft des Ausgabebereichs solcher Modelle ist eingeschränkt. Selbst bei Feinabstimmung der Textinversion zur Bereitstellung einer präzisen Textbeschreibung des Objekts oder bei Verwendung eines Hypernetzwerks zur Stilerhaltung können Instanzen mit unterschiedlichem Erscheinungsbild entstehen.Der DreamBooth-Algorithmus optimiert das Imagen-Modell, um reale Objekte in Bildern originalgetreu wiederherzustellen. Durch die Feinabstimmung einer kleinen Anzahl von Bildern physischer Objekte kann das ursprüngliche SD-Modell die Bildgetreue bewahren und die Hauptmerkmale und sogar den thematischen Stil des Objekts im Originalbild im Text erkennen. Es handelt sich um ein neues, „personalisiertes“ (an benutzerspezifische Bilderzeugungsanforderungen anpassbares) Text-zu-Bild-Diffusionsmodell.
Probleme und Herausforderungen bei der Feinabstimmung von DreamboothDas Prinzip der Feinabstimmung von Dreambooth besteht darin, eine kleine Anzahl von Eingabebildern zu verwenden, den Entitätskörper (z. B. Spielzeugkatze/Rommel) und die Instanzbilder durch instance_prompt zu definieren und eine Klassenvorschau-Eingabeaufforderung und Klassenbildbilder bereitzustellen, die das Szenen- oder Themenschema (z. B. Cartoon, Ölgemäldestil) definieren, die UNet- und VAE-Netzwerke in der ursprünglichen SD zu extrahieren und die Instanz-Eingabeaufforderung und die Klassenerhaltungs-Eingabeaufforderung daran zu binden, sodass in den anschließend generierten Bildern, solange in der Instanz-Eingabeaufforderung ein Schlüsselwort-Token vorhanden ist, die Hauptentität im Eingabeinstanzbild beibehalten wird und der durch die Klassenerhaltungsgrafik definierte Themenstil beibehalten wird.Derzeit gibt es zwei Hauptmethoden zur Feinabstimmung von DreamBooth:
Erstens in stabiler Diffusion WebUI Für die Modellauswahl, das Hochladen von Trainingsbildern und das lokalisierte Training wird eine visuelle Schnittstelle verwendet.Die zweite Möglichkeit besteht darin, das Training in einem interaktiven Skript-Entwicklungsmodus auf einer IDE-Plattform eines Drittanbieters wie beispielsweise einem Colab-Notebook durchzuführen.Die erste Methode kann nur auf einem einzigen Server oder Host trainiert werden, auf dem die Stable Diffusion WebUI-Anwendung bereitgestellt wird, und lässt sich nicht in die Back-End-Plattform und das Geschäft von Unternehmen und Kunden integrieren. Bei der zweiten Methode liegt der Schwerpunkt darauf, dass einzelne Algorithmus-Ingenieure während der Entwicklungs- und Testphase Modellexperimente und -erkundungen durchführen, und eine produktionsbasierte technische Bereitstellung ist nicht möglich. Darüber hinaus erfordern die beiden oben genannten Dreambooth-Trainingsmethoden auch die Beachtung der Kosten für Hochleistungsrechnerressourcen (insbesondere für Szenarien mit hohen Anforderungen an Modelleffekte, die mehr als 50 Klassenbilder erfordern und zu OOM im Videospeicher neigen), der Speicherung und Verwaltung von Basismodellen und Modellen nach der Feinabstimmung, der Verwaltung von Trainings-Hyperparametern, der einheitlichen Protokollüberwachung, der Trainingsbeschleunigung und der Abhängigkeit von der Bibliothekskompilierung und -verpackung usw., was auf der spezifischen Implementierungsebene eine Reihe von Schwierigkeiten und Herausforderungen mit sich bringt.Verwenden des SageMaker-Trainingsjobs zur Feinabstimmung von DreamboothAmazonas SageMaker ist eine zentrale, integrierte Entwicklungsplattform für maschinelles Lernen. Sie bietet eine breite Palette an Funktionen, mit denen Anwender Machine-Learning-Modelle einfach erstellen, trainieren und bereitstellen können. Auf der Trainingsebene kann SageMaker verschiedene Typen von V100, A100, T4 usw. abrufen. Grafikkarte Optimierte Rechenressourcen, wie BYOC (Bring Your Own Container), BYOS (Bring Your Own Script) usw., ermöglichen es Benutzern, eigene Trainingsskripte oder benutzerdefinierte Container-Images zu verwenden, den Trainingsprozess flexibel zu steuern und eigene Methoden zur Datenvorverarbeitung und Modellbewertung einzusetzen. Darüber hinaus können Benutzer mithilfe erweiterter Funktionen wie automatischer Hyperparameteroptimierung und verteiltem Training spezifische Frameworks und Bibliotheken in SageMaker nutzen, um das Dreambooth-Modell flexibel und individuell zu optimieren, Einschränkungen der WebUI und der lokalen Notebook-Umgebung zu beseitigen und die Integration in Produktionsgeschäftssysteme für die technische Bereitstellung zu ermöglichen.Im Folgenden wird detailliert beschrieben, wie Sie mithilfe eines BYOC-Trainingsjobs die Feinabstimmung von Dreambooth auf Amazon SageMaker durchführen und den Speicheraufwand, die Modellverwaltung und die Hyperparameter des Dreambooth-Trainingsprozesses optimieren, sodass Benutzer die Entwicklung auf ihren eigenen ML-Plattformen oder Geschäftssystemen implementieren und die Gesamtbetriebskosten des Trainings senken können.
Dreambooth-Feintuning der technischen SageMaker-LösungWir erläutern die technische Implementierung der Dreambooth-Feinoptimierung auf SageMaker aus den Blickwinkeln Modellziehen, Trainingsbildeingabe, Modellausgabe und Trainingsaufgabentyp:Amazon pflegt eine strategische Partnerschaft mit HuggingFace. Daher können wir im SageMaker-Trainingsjob eine Diffusor-Pipeline-API und die Hyperparametervariable „pretrained_model_name_or_path“ verwenden, um eine Modell-ID im Standard-URL-Format des HuggingFace-Modells (z. B. runwayml/stable-diffusion-v1-5) oder ein Modelldateiverzeichnis (z. B. /opt/ml/model/stable-diffusion-v1.5/) zu übergeben. SageMaker lädt das Modell automatisch auf HuggingFace, ohne dass ein Konto registriert oder ein Token zur Authentifizierung übergeben werden muss. Das Codebeispiel lautet wie folgt:model_dir='/opt/ml/input/fineturned_model/' model = StableDiffusionPipeline.from_pretrained( model_dir, scheduler = DPMSolverMultistepScheduler.from_pretrained(model_dir, subfolder="scheduler"), torch_dtype=torch.float16, )
Für Eingabebilder zur Feinabstimmung bietet der SageMaker-Trainingsjob eine praktische Methode zur Eingabe von Trainingsdaten. Über den Parameter „inputs“ können Sie den Namen des Eingabebildkanals (z. B. „images“) im Wörterbuchformat und den Speicherpfad des Eingabebilds in S3 als Wert festlegen. Wenn SageMaker die Trainingsaufgabe ausführt, lädt es das Bild von S3 herunter und legt es im Verzeichnis /opt/ml/input/data/{channel} des Computers ab. Das Codebeispiel lautet wie folgt: images_s3uri = 's3://{0}/drebooth/images/'.format(bucket) inputs = { 'images': images_s3uri } estimator = Estimator( role = Rolle, instance_count=1, instance_type = Instanztyp, image_uri = image_uri, hyperparameters = Hyperparameter, environment = Umgebung ) estimator.fit(inputs)
Nach dem Training verpackt SageMaker die Modelldatei standardmäßig als model.tar.gz und lädt sie in ein Unterverzeichnis namens „training job“ auf S3 hoch. Das Produktionssystem des Kunden kann den Pfad direkt über die API abrufen, was die Modellverwaltung und die anschließende Implementierung erleichtert, wie unten dargestellt:Amazon SageMaker unterstützt BYOS- und BYOC-Modi für das Modelltraining. Für das Dreambooth-Modelltraining sind zahlreiche Abhängigkeiten wie Diffusor, Huggingface, Accelerate und Xformers zu installieren und bereitzustellen. Open-Source-Bibliotheken wie Xformers und Accelerate weisen zudem Kompatibilitätsunterschiede mit verschiedenen GPU-Modellen sowie verschiedenen CUDA- und CUDNN-Versionen auf. Eine direkte Installation per Pip auf dem Computer ist daher schwierig. Daher verwendet diese Lösung die BYOC-Methode. Sie basiert auf offiziell voreingestellten Basisimages wie Pytorch, CUDA und Torchversion. Anschließend werden die benötigten Bibliotheken wie Xformers durch Kompilierung und Paketierung des Quellcodes installiert und zu dem vom Kunden erstellten Dreambooth-Trainingscontainer-Image erweitert.Beachten Sie, dass für die Kompilierung und Installation von xformers auf Amazon G4dn und G5 cuda 11.7, torch 1.13 oder höher erforderlich ist und der Rechenleistungsparameter CUDA_ARCH_LIST auf 8.0 oder höher eingestellt werden muss, da sonst bei der Kompilierung gemeldet wird, dass die Rechenleistung dieses GPU-Typs nicht unterstützt wird.
Kompilieren und verpacken Docker Das Aktenzeichen lautet:
VON pytorch/pytorch:1.13.0-cuda11.6-cudnn8-runtime ENV PATH="/opt/ml/code:${PATH}" ENV DEBIAN_FRONTEND nicht interaktiv AUSFÜHREN apt-get update AUSFÜHREN apt-get install --assume-yes apt-utils -y AUSFÜHREN apt update AUSFÜHREN echo "Y"|apt install vim AUSFÜHREN apt install wget git -y AUSFÜHREN apt install libgl1-mesa-glx -y AUSFÜHREN pip install opencv-python-headless AUSFÜHREN mkdir -p /opt/ml/code AUSFÜHREN pip3 install sagemaker-training KOPIEREN train.py /opt/ml/code/ KOPIEREN ./sd_code/ /opt/ml/code/ AUSFÜHREN pip install -r /opt/ml/code/extensions/sd_dreambooth_extension/requirements.txt ENV SAGEMAKER_PROGRAM train.py RUN export TORCH_CUDA_ARCH_LIST="7.5 8.0 8.6" && export FORCE_CUDA="1" && pip install ninja triton==2.0.0.dev20221120 && git clone https://github.com/xieyongliang/xformers.git /opt/ml/code/repositories/xformers && cd /opt/ml/code/repositories/xformers && git submodule update --init --recursive && pip install -r requirements.txt && pip install -e . EINSTIEGSPUNKT []
Das Skript zum Übertragen des gepackten Images in das Amazon ECR-Image-Repository lautet wie folgt:algorithm_name=dreambooth-finetuning-v3 account=$(aws sts get-caller-identity --query Account --output text) # Ruft die in der aktuellen Konfiguration definierte Region ab (Standard ist us-west-2, wenn keine definiert ist) region=$(aws configure get region) fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # Wenn das Repository in ECR nicht vorhanden ist, erstellen Sie es. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] dann aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null fi # Bei Docker anmelden pwd=$(aws ecr get-login-password --region ${region}) docker login --username AWS -p ${pwd} ${account}.dkr.ecr.${region}.amazonaws.com # Erstellen Sie das Docker-Image lokal mit dem Image-Namen und übertragen Sie es dann mit dem vollständigen Namen in ECR #. mkdir -p ./sd_code/extensions cd ./sd_code/extensions/ && git clone https://github.com/qingyuan18/sd_dreambooth_extension.git cd ../../ docker build -t ${algorithm_name} ./ -f ./dockerfile_v3 > ./docker_build.log docker tag ${algorithm_name} ${vollständiger Name} docker push ${vollständiger Name} rm -rf ./sd_code
Dreambooth auf SageMaker – FeinabstimmungsoptimierungVom WebUI-Plugin entfernenDreamBooth wurde zuerst erstellt von Google Literatur, Open Source zum Beispielcode des Colab-Notebooks von HuggingFace, siehe github Ähnliche InformationenViele Entwickler erweitern und aktualisieren diese Version. Die umfassendste Version ist das Open-Source-Skript des stabilen Diffusion-WebUI-Plugins. Dieses Plugin enthält mehr Hyperparameter und Optimierungsmethoden zur Trainingsmanipulation, kann LORA-Gewichte integrieren und unterstützt das von der WebUI benötigte Checkpoint-Format. Weitere Informationen finden Sie unter Code für sd_extentions auf GitHub.Weiterführende Informationen zu GitHub:
https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/sd_dreambooth_training.ipynb#scrollTo=rscg285SBh4M
Code für sd_extentions auf GitHub:
https://github.com/d8ahazard/sd_dreambooth_extension
Wie oben erwähnt, kann SD WebUI nicht in das Back-End-Geschäftssystem integriert werden. Daher müssen wir es vom WebUI-Plug-In-Modus trennen und in ein separates Modelltrainingsprogramm kapseln, das auf Standardeingaben wie dem Basismodell, dem Eingabebild, der Instanzaufforderung, der Klassenaufforderung und der fein abgestimmten Modellausgabe basiert.
Zur Trennung vom WebUI-Plug-In müssen folgende Aspekte berücksichtigt werden:Der Plug-in-Code ist mit den Operationen und Dateninteraktionen verknüpft, die an verschiedene WebUI-Frontend-Schnittstellenkomponenten gebunden sind. Beispielsweise speichert der gemeinsam genutzte Teil des Originalcodes verschiedene Trainingsparameter, die von der Webseite eingegeben werden.wenn shared.force_cpu: importiere modules.shared no_safe = modules.shared.cmd_opts.disable_safe_unpickle modules.shared.cmd_opts.disable_safe_unpickle = True
Die Klasse mytqdm zeigt Statusinformationen zum Fortschrittsbalken für Webseiten an:von helpers.mytqdm importiere mytqdm
Diese Art von Code ist im technischen Hintergrundtrainingsjob unnötig. Wir organisieren die von der Front-End-Seite übergebenen Parameter in Hyperparametern, damit sie im Hauptteil verwendet werden können. Python parse_args-Bibliothek zum Analysieren, Abrufen und Entfernen des Codes, der sich auf die Seitenanzeigeinformationen bezieht.Den bereinigten sd_extensions-Code finden Sie unter https://github.com/qingyuan18/sd_dreambooth_extension.git. Sie können sehen, dass nur das Kernmodul „train“ beibehalten wurde und die mit der Front-End-Kopplung verbundenen Codes wie webui.py, Helper und Shard bereinigt wurden.
Übergabe der TrainingsaufgabenparameterDer SageMaker-Trainingsjob unterstützt die Übergabe und Analyse von Modell-Hyperparametern. In der API werden Parameter wie model_path, model_name, instance_prompt, class_prompt usw. im oben genannten ursprünglichen Plug-in-Code in ein Schlüssel-Wert-Paar im JSON-String-Format gekapselt und anschließend über die Estimator-API an den Trainingsjob übergeben. Im SageMaker-Trainingsrechner werden sie in den Standard-Argument-Parameterübergabemodus (-key value) umgewandelt, sodass sie im Trainingscode über die Python-Bibliothek parse_args analysiert und verarbeitet werden können. Siehe folgendes Codebeispiel:Hyperparameter = { 'Modellname': 'aws-trained-dreambooth-model', 'gemischte Präzision': 'fp16', 'vortrainierter Modellname oder -pfad': Modellname, 'Instanzdatenverzeichnis': Instanzverzeichnis, 'Klassendatenverzeichnis': Klassenverzeichnis, 'mit vorheriger Erhaltung': True, 'Modellpfad': '/opt/ml/model/', 'manul_upload_modellpfad': s3_model_output_location, 'Instanzaufforderung': Instanzaufforderung, ……} Schätzer = Schätzer (Rolle = Rolle, Instanzanzahl = 1, Instanztyp = Instanztyp, Bild-URI = Bild-URI, Hyperparameter = Hyperparameter)
Das Format ist ckpt (die neueste WebUI ist das Safetensor-Format), und die während des Diffusortrainings von from_pretrained geladene Modellpipeline ist der Modellpfad oder das lokale Pfadformat von Stable Diffusion (der Standard ist der Verzeichnispfad, unter dem sich Untermodellverzeichnisse wie vae, unet, tokenizationer usw. befinden, und jedes Untermodellverzeichnis ist eine unabhängige Datei im Torch-PT-Format (Suffix .bin)).Wenn die Produktionsumgebung des Kunden eine einzelne Modelldatei im ckpt-Format enthält (z. B. das von civit.ai heruntergeladene Modell), können wir das von Diffusor bereitgestellte Konvertierungsskript verwenden, um diese vom ckpt-Format in das Diffusor-Verzeichnisformat zu konvertieren, sodass derselbe Code in die Produktionsumgebung geladen werden kann. Das Beispiel für die Skriptverwendung lautet wie folgt:
python convert_original_stable_diffusion_to_diffusers.py – Prüfpunktpfad ./models_ckpt/768-v-ema.ckpt – Dumppfad ./models_diffuser
Wie oben gezeigt, ist die Ausgabe von dump_path ein Verzeichnis im Diffusorformat. Erweitern Sie dieses Verzeichnis, um die Untermodellverzeichnisdateien von vae, unet und text_encoder anzuzeigen.Die Verzeichnisstruktur des Modelltrainingscomputers von SageMaker ist wie folgt:Das trainierte Modell wird standardmäßig im Verzeichnis /opt/ml/model/ ausgegeben. Nach Abschluss des SageMaker-Trainingsauftrags werden die Modelldateien in diesem Verzeichnis in eine tar.gz-Datei gepackt und in den S3-Pfad der Trainingsaufgabe hochgeladen. Für ein zusammengesetztes Modell wie Stable Diffusion gibt es mehrere Unterverzeichnisse. Die Modelldateien in jedem Unterverzeichnis liegen in einem unabhängigen Bin-Format vor. Jede h-Modelldatei ist größer als 4 oder 5 GB. SageMaker verpackt und hochladen Es würde zu lange dauern, bis S3 erreicht ist.Daher fügen wir den Parameter manul_upload_model_path hinzu, um den S3-Pfad anzugeben, in den die trainierte Modelldatei manuell hochgeladen wird. Nach Abschluss des Trainings wird das gesamte Modellverzeichnis über das S3 SDK rekursiv in den angegebenen S3 hochgeladen, sodass SageMaker model.tar.gz nicht mehr verpackt.
Das Referenzcodebeispiel lautet wie folgt:
def upload_directory_to_s3(local_directory, dest_s3_path): bucket,s3_prefix=get_bucket_and_key(dest_s3_path) für Root, Verzeichnisse, Dateien in os.walk(local_directory): für Dateinamen in Dateien: local_path = os.path.join(root, Dateiname) relative_path = os.path.relpath(local_path, local_directory) s3_path = os.path.join(s3_prefix, relative_path).replace("\\", "/") s3_client.upload_file(local_path, bucket, s3_path) print(f'Datei {local_path} hochgeladen nach s3://{bucket}/{s3_path}') für Unterverzeichnis in Verzeichnissen: upload_directory_to_s3(local_directory+"/"+subdir,dest_s3_path+"/"+subdir) s_pipeline.save_pretrained(args.models_path) ### Manuelles Hochladen trainierter DB-Modellverzeichnisse in den S3-Pfad##### #### um den Sagemaker-Tar-Prozess zu eliminieren##### drucken(f"manul_upload_model_path ist {args.manul_upload_model_path}") upload_directory_to_s3(args.models_path,args.manul_upload_model_path)
Durch diese Optimierung wird das Dreambooth-Training auf SageMaker mit 800 Schritten von 1 Stunde auf etwa 30 Minuten reduziert.Bei der Feinabstimmung des Trainings großer Modelle wie Dreambooth sind die Kosten ein wichtiger Faktor. Amazon bietet Rechenressourcen verschiedener GPU-Modelle an, von denen das G4dn-Modell die höchste Kosteneffizienz aufweist und über Ressourcen in fast allen Amazon-Regionen verfügt.Das g4dn-Modell verfügt jedoch nur über eine NVIDIA T4-Grafikkarte mit 16 GB Videospeicher. Dreambooth muss die Unet- und Vae-Netzwerke neu trainieren, um die vorherigen Verlustgewichte beizubehalten. Wenn eine Feinabstimmung von Dreambooth mit höherer Wiedergabetreue erforderlich ist, umfassen die Eingabedaten Dutzende von Bildern, und der Trainingsprozess umfasst 1000 Schritte. Das gesamte Netzwerk, insbesondere die Grafik- und Unet-Rauschunterdrückung, kann leicht zu einem OOM des Videospeichers und damit zu einem Fehler bei der Trainingsaufgabe führen.
Um sicherzustellen, dass Kunden Dreambooth-Modelle auf kostengünstigen Maschinen mit 16 GB Videospeicher trainieren können, haben wir verschiedene Optimierungen vorgenommen. Dadurch wird für die Feinabstimmung von Dreambooth auf SageMaker nur eine G4dn.xlarge-Maschine benötigt, und das Training kann in Hunderten bis 3.000 Trainingsschritten abgeschlossen werden, was die Kosten für das Dreambooth-Training für Kunden erheblich reduziert.
Passen Sie die Feinabstimmungskomponente anIm Stable Difussion-Modell ist der Textencoder der Textencoder des CLIP-Submodells. Handelt es sich bei der Instanz-/Klassenaufforderung nicht um einen langen Text, muss Dreambooth den Textencoder nicht neu trainieren, da wir einige Regeln angepasst haben. Bei einem Videospeicher von weniger als 16 GB wird das Neutraining des Textencoders deaktiviert. Bei einem geringeren Videospeicher werden der 8-Bit-Adam-Optimierer und das halbpräzise Gradientendatenformat fp16 automatisch aktiviert. Bei kleinerem Videospeicher kann der Speicher sogar direkt für das Training auf die CPU ausgelagert werden.Das Codebeispiel lautet wie folgt:
drucken(f"Gesamt-VRAM: {gb}") wenn 24 > gb >= 16: Achtung = "xformers" not_cache_latents = False train_text_encoder = True use_ema = True wenn 16 > gb >= 10: train_text_encoder = False use_ema = False wenn gb < 10: use_cpu = True use_8bit_adam = False mixed_precision = 'nein'
Formers ist ein Open-Source-Framework zur Beschleunigung des Trainings. Durch die Speicherung von Parametern verschiedener Schichten, das dynamische Laden des Videospeichers für jede Unterschicht und die Optimierung des Self-Attention-Mechanismus sowie der schichtübergreifenden Informationsübertragung kann der Videospeicher erheblich reduziert werden, ohne die Trainingsgeschwindigkeit zu beeinträchtigen.Während des Dreambooth-Trainings wird die Aufmerksamkeit vom Standard-Flash auf Xformers verlagert. Ein Vergleich des GPU-Speichers vor und nach dem Einschalten von Xformers zeigt, dass diese Methode die Nutzung des Videospeichers deutlich reduziert.
Vor dem Einschalten von Xformers:
***** Training läuft ***** Momentane Batchgröße pro Gerät = 1 Gesamte Trainings-Batchgröße (mit parallel, verteilt und akkumulierend) = 1 Schritte zur Gradientenakkumulation = 1 Gesamte Optimierungsschritte = 1000 Trainingseinstellungen: CPU: Falsch Adam: Wahr, Prec: fp16, Grad: Wahr, TextTr: Falsch EM: Wahr, LR: 2e-06 LORA: Falsch Zugewiesen: 10,5 GB Reserviert: 11,7 GB
Nach dem Öffnen von Xformers:***** Training läuft ***** Momentane Batchgröße pro Gerät = 1 Gesamte Trainings-Batchgröße (mit parallel, verteilt und akkumulierend) = 1 Schritte zur Gradientenakkumulation = 1 Gesamte Optimierungsschritte = 1000 Trainingseinstellungen: CPU: Falsch Adam: Wahr, Prec: fp16, Grad: Wahr, TextTr: Falsch EM: Wahr, LR: 2e-06 LORA: Falsch Zugewiesen: 5,5 GB Reserviert: 5,6 GB
Andere Optimierungsparameter- „PYTORCH_CUDA_ALLOC_CONF“: „max_split_size_mb:32“ Für CUDA OOM, das durch die Fragmentierung des Videospeichers verursacht wird, können Sie „max_split_size_mb“ von PYTORCH_CUDA_ALLOC_CONF auf einen kleineren Wert setzen.
- train_batch_size':1 Die Anzahl der jeweils verarbeiteten Bilder. Wenn nicht viele Instanz- oder Klassenbilder vorhanden sind (weniger als 10), können Sie diesen Wert auf 1 setzen, um die Anzahl der in einem Stapel verarbeiteten Bilder zu reduzieren und die Nutzung des Videospeichers bis zu einem gewissen Grad zu verringern.
- „sample_batch_size“: 1 entspricht „train_batch_size“, dem Batch-Durchsatz von Sampling, Rauschunterdrückung und Rauschunterdrückung gleichzeitig. Eine Verringerung dieses Werts reduziert auch die Videospeichernutzung.
- not_cache_latents: Das Training der stabilen Diffusion basiert auf latenten Diffusionsmodellen. Das ursprüngliche Modell speichert die latente Diffusion, wir trainieren die Regularisierung jedoch hauptsächlich unter Instanz- und Klassen-Prompt. Daher können wir bei knappem GPU-Videospeicher auf die latente Zwischenspeicherung verzichten, um die Videospeichernutzung zu minimieren.
- „gradient_accumulation_steps“: Der Batch der Gradientenaktualisierungen. Bei großen Trainingsschritten, z. B. 1000, können Sie die Anzahl der Schritte der Gradientenaktualisierungen erhöhen und alle auf einmal aktualisieren, nachdem Sie sie zu einem bestimmten Batch akkumuliert haben. Je höher der Wert, desto höher die Videospeichernutzung. Wenn Sie den Videospeicher reduzieren möchten, können Sie diesen Wert auf Kosten der Trainingszeit reduzieren. Beachten Sie: Wenn Sie den Textencoder text_encode neu trainieren, wird die Gradientenakkumulation nicht unterstützt und beschleunigtes verteiltes Training mit mehreren Karten auf einem Computer mit mehreren Grafikprozessoren aktiviert ist, kann die Batch-Gradientenaktualisierung „gradient_accumulation_steps“ nur auf 1 gesetzt werden, andernfalls wird das Neutraining des Textencoders deaktiviert.
In der Demonstration haben wir 4 Bilder eines Katzenspielzeugs verwendet und sie mit dem Tool auf eine einheitliche Größe von 512×512 zugeschnitten.Geben Sie dann das zuvor erstellte SageMaker-Notizbuch ein, klonen Sie das Quick Kit-Repository, git clone https://github.com/aws-samples/sagemaker-stablediffusion-quick-kit, öffnen Sie fine-tuning/dreambooth/stablediffusion_dreambooth_finetuning.zh.ipynb und folgen Sie Schritt für Schritt den Anweisungen des Notizbuchs.# verwendet zwx als Triggerwort. Nachdem das Modell trainiert ist, verwenden wir dieses Wort, um den Graphen zu generieren. instance_prompt="Foto\ von\ zwx\ Spielzeug" class_prompt="Foto\ von\ einem\ Katzenspielzeug" #Notebook Trainingscode Beschreibung#Set Hyperparametersenvironment = { 'PYTORCH_CUDA_ALLOC_CONF':'max_split_size_mb:32', 'LD_LIBRARY_PATH':"${LD_LIBRARY_PATH}:/opt/conda/lib/" } Hyperparameters = { 'Modellname':'aws-trained-dreambooth-model', 'mixed_precision':'fp16', 'pretrained_model_name_or_path': Modellname, 'Instanzdatenverzeichnis':Instanzverzeichnis, 'Klassendatenverzeichnis':Klassenverzeichnis, 'mit_vorheriger_Vorbereitung':True, 'models_path': '/opt/ml/model/', 'instance_prompt': instance_prompt, 'class_prompt':class_prompt, 'resolution':512, 'train_batch_size':1, 'sample_batch_size':1, 'gradient_accumulation_steps':1, 'learning_rate':2e-06, 'lr_scheduler':'constant', 'lr_warmup_steps':0, 'num_class_images':50, 'max_train_steps':300, 'save_steps':100, 'attention':'xformers', 'prior_loss_weight':0.5, 'use_ema':True, 'train_text_encoder':False, 'not_cache_latents':True, 'gradient_checkpointing':True, 'save_use_epochs': False, 'use_8bit_adam': False } Hyperparameter = json_encode_hyperparameters(Hyperparameter) # startet Sagemaker-Trainingsjob von sagemaker.estimator import Estimator-Eingaben = { 'Bilder': f"s3://{bucket}/dreambooth/images/" } Estimator = Estimator(Rolle = Rolle, Instanzanzahl=1, Instanztyp = Instanztyp, Bild-URI = Bild-URI, Hyperparameter = Hyperparameter, Umgebung = Umgebung) Estimator.fit(Eingaben)
Startprotokoll der Trainingsaufgabe:Die Trainingszeit beträgt ca. 40 Minuten. Sie können das CloudWatch-Protokoll auch über die SageMaker-Trainingsjob-Konsole einsehen. Nach Abschluss des Trainings wird das Modell automatisch auf S3 hochgeladen.Nach Abschluss des Trainings können Sie das trainierte Modell mithilfe des Quick Kit-Inferenz-Notebooks zur Inferenz in SageMaker laden. Der Test des trainierten Modells läuft wie folgt ab:Zusammenfassend stellt dieser Artikel die Geschäftsanforderungen und technischen Prinzipien von Dreambooth vor und implementiert die Feinabstimmung des Produktionsbetriebs von Dreambooth mithilfe der BYOC-Trainingsjob-Lösung auf Amazon SageMaker sowie Optimierungspraktiken wie Grafikspeicher, Modellverwaltung und Hyperparameter. Der Skriptcode und die Notebook-Trainingsbeispiele in diesem Artikel können als Grundlage für die Entwicklung der AIGC-ML-Plattform auf Basis von Stable Diffusion dienen.
Glarity AI Schreibassistent-Browser-Plugin, praktisches KI-Tool