Finjuster tekst-til-bilde stabile diffusjonsmodeller med Amazon SageMaker JumpStart

Finjuster tekst-til-bilde stabile diffusjonsmodeller med Amazon SageMaker JumpStart

Kilde node: 1968900

I november 2022 har vi annonsert som AWS-kunder kan generere bilder fra tekst med Stabil diffusjon modeller i Amazon SageMaker JumpStart. Stable Diffusion er en dyp læringsmodell som lar deg generere realistiske bilder av høy kvalitet og fantastisk kunst på bare noen få sekunder. Selv om å lage imponerende bilder kan finne bruk i bransjer som spenner fra kunst til NFT-er og utover, forventer vi i dag også at AI kan tilpasses. I dag kunngjør vi at du kan tilpasse bildegenereringsmodellen til ditt bruksområde ved å finjustere den på ditt tilpassede datasett i Amazon SageMaker JumpStart. Dette kan være nyttig når du lager kunst, logoer, tilpassede design, NFT-er og så videre, eller morsomme ting som å generere tilpassede AI-bilder av kjæledyrene dine eller avatarer av deg selv.

I dette innlegget gir vi en oversikt over hvordan du finjusterer den stabile diffusjonsmodellen på to måter: programmatisk gjennom JumpStart APIer tilgjengelig i SageMaker Python SDK, og JumpStarts brukergrensesnitt (UI) i Amazon SageMaker Studio. Vi diskuterer også hvordan du foretar designvalg, inkludert datasettkvalitet, størrelse på treningsdatasett, valg av hyperparameterverdier og anvendelighet for flere datasett. Til slutt diskuterer vi de over 80 offentlig tilgjengelige finjusterte modellene med forskjellige inndataspråk og stiler som nylig er lagt til i JumpStart.

Stabil spredning og overføringslæring

Stable Diffusion er en tekst-til-bilde-modell som lar deg lage fotorealistiske bilder fra bare en tekstmelding. En diffusjonsmodell trener ved å lære å fjerne støy som ble lagt til et ekte bilde. Denne prosessen med å fjerne støy genererer et realistisk bilde. Disse modellene kan også generere bilder fra tekst alene ved å betinge generasjonsprosessen på teksten. For eksempel er Stable Diffusion en latent diffusjon der modellen lærer å gjenkjenne former i et rent støybilde og gradvis bringer disse formene i fokus hvis formene samsvarer med ordene i inndatateksten. Teksten må først bygges inn i et latent rom ved hjelp av en språkmodell. Deretter utføres en serie støytilleggs- og støyfjerningsoperasjoner i det latente rommet med en U-Net-arkitektur. Til slutt blir den støyfrie utgangen dekodet inn i pikselrommet.

I maskinlæring (ML) kalles evnen til å overføre kunnskapen lært i ett domene til et annet overføre læring. Du kan bruke overføringslæring til å produsere nøyaktige modeller på de mindre datasettene dine, med mye lavere opplæringskostnader enn de som er involvert i opplæringen av den originale modellen. Med transfer learning kan du finjustere den stabile diffusjonsmodellen på ditt eget datasett med så lite som fem bilder. Til venstre er for eksempel treningsbilder av en hund ved navn Doppler som brukes til å finjustere modellen, i midten og til høyre er bilder generert av den finjusterte modellen når de blir bedt om å forutsi bildet til Doppler på stranden og en blyantskisse.

Til venstre er bilder av en hvit stol som brukes til å finjustere modellen og et bilde av stolen i rødt generert av den finjusterte modellen. Til høyre er bilder av en ottoman som brukes til å finjustere modellen og et bilde av en katt som sitter på en ottoman.

Finjustering av store modeller som Stable Diffusion krever vanligvis at du gir opplæringsskript. Det er en rekke problemer, inkludert problemer med tom minne, problemer med nyttelaststørrelse og mer. Videre må du kjøre ende-til-ende-tester for å sikre at skriptet, modellen og ønsket instans fungerer sammen på en effektiv måte. JumpStart forenkler denne prosessen ved å tilby ferdige skript som har blitt grundig testet. JumpStart-finjusteringsskriptet for stabile diffusjonsmodeller bygger på finjusteringsskriptet fra drømmebod. Du kan få tilgang til disse skriptene med et enkelt klikk gjennom Studio UI eller med svært få linjer med kode gjennom JumpStart APIer.

Merk at ved å bruke den stabile diffusjonsmodellen godtar du CreativeML Open RAIL++-M-lisens.

Bruk JumpStart programmatisk med SageMaker SDK

Denne delen beskriver hvordan du trener og distribuerer modellen med SageMaker Python SDK. Vi velger en passende forhåndsopplært modell i JumpStart, trener denne modellen med en SageMaker-treningsjobb og distribuerer den trente modellen til et SageMaker-endepunkt. Videre kjører vi inferens på det distribuerte endepunktet, alt ved å bruke SageMaker Python SDK. Følgende eksempler inneholder kodebiter. For den fullstendige koden med alle trinnene i denne demoen, se Introduksjon til JumpStart – Tekst til bilde eksempel notatbok.

Tren og finjuster Stable Diffusion-modellen

Hver modell er identifisert med en unik model_id. Følgende kode viser hvordan du finjusterer en Stable Diffusion 2.1-basismodell identifisert av model_id model-txt2img-stabilityai-stable-diffusion-v2-1-base på et tilpasset opplæringsdatasett. For en fullstendig liste over model_id verdier og hvilke modeller som er finjusterbare, se Innebygde algoritmer med forhåndstrent modellbord. For hver model_id, for å lansere en SageMaker-treningsjobb gjennom Estimator klasse av SageMaker Python SDK, må du hente Docker-bilde-URI, treningsskript-URI og forhåndstrent modell-URI gjennom verktøyfunksjonene i SageMaker. Treningsskriptets URI inneholder all nødvendig kode for databehandling, lasting av den forhåndstrente modellen, modelltrening og lagring av den trente modellen for slutning. Den forhåndstrente modellen URI inneholder den forhåndstrente modellarkitekturdefinisjonen og modellparametrene. Den forhåndstrente modellen URI er spesifikk for den aktuelle modellen. De forhåndstrente modell-tarballene er forhåndslastet ned fra Hugging Face og lagret med passende modellsignatur i Amazon enkel lagringstjeneste (Amazon S3) bøtter, slik at treningsjobben kjører i nettverksisolasjon. Se følgende kode:

from sagemaker import image_uris, model_uris, script_uris # Currently, not all the stable diffusion models in jumpstart support finetuning. Thus, we manually select a model
# which supports finetuning.
train_model_id, train_model_version, train_scope = ( "model-txt2img-stabilityai-stable-diffusion-v2-1-base", "*", "training",
) # Tested with ml.g4dn.2xlarge (16GB GPU memory) and ml.g5.2xlarge (24GB GPU memory) instances. Other instances may work as well.
# If ml.g5.2xlarge instance type is available, please change the following instance type to speed up training.
training_instance_type = "ml.g4dn.2xlarge" # Retrieve the docker image
train_image_uri = image_uris.retrieve(
region=None,
framework=None, # automatically inferred from model_id
model_id=train_model_id,
model_version=train_model_version,
image_scope=train_scope,
instance_type=training_instance_type,
) # Retrieve the training script. This contains all the necessary files including data processing, model training etc.
train_source_uri = script_uris.retrieve(
model_id=train_model_id, model_version=train_model_version, script_scope=train_scope
) # Retrieve the pre-trained model tarball to further fine-tune
train_model_uri = model_uris.retrieve(
model_id=train_model_id, model_version=train_model_version, model_scope=train_scope
)

Med disse modellspesifikke treningsartefaktene kan du konstruere et objekt av Estimator klasse:

# Create SageMaker Estimator instance
sd_estimator = Estimator( role=aws_role, image_uri=train_image_uri, source_dir=train_source_uri, model_uri=train_model_uri, entry_point="transfer_learning.py", # Entry-point file in source_dir and present in train_source_uri. instance_count=1, instance_type=training_instance_type, max_run=360000, hyperparameters=hyperparameters, output_path=s3_output_location, base_job_name=training_job_name,
) # Launch a SageMaker Training job by passing s3 path of the training data
sd_estimator.fit({"training": training_dataset_s3_path}, logs=True)

Opplæringsdatasett

Følgende er instruksjonene for hvordan treningsdataene skal formateres:

  • Input – En katalog som inneholder forekomstbildene, dataset_info.json, med følgende konfigurasjon:
    • Bilder kan ha .png-, .jpg- eller .jpeg-format
    • De dataset_info.json filen må ha formatet {'instance_prompt':<<instance_prompt>>}
  • Produksjon – En trent modell som kan brukes for slutninger

S3-banen skal se ut s3://bucket_name/input_directory/. Legg merke til etterfølgende / er nødvendig.

Følgende er et eksempelformat på treningsdataene:

input_directory |---instance_image_1.png |---instance_image_2.png |---instance_image_3.png |---instance_image_4.png |---instance_image_5.png |---dataset_info.json

For instruksjoner om hvordan du formaterer dataene mens du bruker tidligere bevaring, se avsnittet Forutgående bevaring i dette innlegget.

Vi tilbyr et standard datasett med kattebilder. Den består av åtte bilder (forekomstbilder som tilsvarer forekomstprompten) av en enkelt katt uten klassebilder. Den kan lastes ned fra GitHub. Hvis du bruker standard datasett, prøv ledeteksten "et bilde av en riobugger cat" mens du gjør slutninger i demo-notatboken.

Tillatelse: MIT.

Hyperparametere

Deretter, for å overføre læring på det egendefinerte datasettet, må du kanskje endre standardverdiene for treningshyperparametrene. Du kan hente en Python-ordbok med disse hyperparametrene med standardverdiene ved å ringe hyperparameters.retrieve_default, oppdater dem etter behov, og send dem deretter til Estimator-klassen. Se følgende kode:

from sagemaker import hyperparameters
# Retrieve the default hyper-parameters for fine-tuning the model
hyperparameters = hyperparameters.retrieve_default(
model_id=train_model_id, model_version=train_model_version
) # [Optional] Override default hyperparameters with custom values
hyperparameters["max_steps"] = "400"

Følgende hyperparametre støttes av finjusteringsalgoritmen:

  • med_forut_konservering – Flagg for å legge til tidligere tap av bevaring. Forhåndskonservering er en regularizer som unngår overmontering. (Valg: [“True”,“False”], standard: “False”.)
  • antall_klasse_bilder – Minimumsklassebilder for tap av tidligere bevaring. Hvis with_prior_preservation = True og det er ikke nok bilder allerede i class_data_dir, vil flere bilder bli samplet med class_prompt. (Verdier: positivt heltall, standard: 100.)
  • Epoker – Antall passeringer som finjusteringsalgoritmen tar gjennom treningsdatasettet. (Verdier: positivt heltall, standard: 20.)
  • Maks_trinn – Totalt antall treningstrinn som skal utføres. Hvis ikke None, overstyrer epoker. (Verdier: “None” eller en streng med heltall, standard: “None”.)
  • Partistørrelse, Gruppestørrelse –: Antall treningseksempler som gjennomarbeides før modellvektene oppdateres. Samme som batchstørrelsen under generering av klassebilder hvis with_prior_preservation = True. (Verdier: positivt heltall, standard: 1.)
  • learning_rate – Hastigheten som modellvektene oppdateres med etter å ha jobbet gjennom hver gruppe med treningseksempler. (Verdier: positiv flytende, standard: 2e-06.)
  • tidligere_tap_vekt – Vekten av tidligere konserveringstap. (Verdier: positiv flytende, standard: 1.0.)
  • center_crop – Om du skal beskjære bildene før du endrer størrelsen til ønsket oppløsning. (Valg: [“True”/“False”], standard: “False”.)
  • lr_planlegger – Typen læringshastighetsplanlegger. (Valg: ["linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup"], standard: "constant".) For mer informasjon, se Læringshastighetsplanleggere.
  • adam_weight_decay – Vektnedgangen som skal påføres (hvis ikke null) på alle lag unntatt alle skjevheter og LayerNorm vekter inn AdamW optimizer. (Verdi: flytende, standard: 1e-2.)
  • adam_beta1 – Beta1-hyperparameteren (eksponentiell henfallshastighet for estimater for første øyeblikk) for AdamW optimizer. (Verdi: flytende, standard: 0.9.)
  • adam_beta2 – Beta2-hyperparameteren (eksponentiell henfallshastighet for estimater for første øyeblikk) for AdamW optimizer. (Verdi: flytende, standard: 0.999.)
  • adam_epsilon - Det epsilon hyperparameter for AdamW optimizer. Den er vanligvis satt til en liten verdi for å unngå divisjon med 0. (Verdi: flytende, standard: 1e-8.)
  • gradient_akkumuleringstrinn – Antall oppdateringstrinn som skal samles før du utfører en bakover-/oppdateringspassering. (Verdi: heltall, standard: 1.)
  • max_grad_norm – Maksimal gradientnorm (for gradientklipping). (Verdi: flytende, standard: 1.0.)
  • seed – Fiks den tilfeldige tilstanden for å oppnå reproduserbare resultater i trening. (Verdi: heltall, standard: 0.)

Implementer den fintrente modellen

Etter at modellopplæringen er fullført, kan du distribuere modellen direkte til et vedvarende endepunkt i sanntid. Vi henter de nødvendige Docker Image URIene og skript-URIene og distribuerer modellen. Se følgende kode:

inference_instance_type = "ml.g4dn.2xlarge" # Retrieve the inference docker container uri
deploy_image_uri = image_uris.retrieve( region=None, framework=None, # automatically inferred from model_id image_scope="inference", model_id=train_model_id, model_version=train_model_version, instance_type=inference_instance_type,
) # Retrieve the inference script uri. This includes scripts for model loading, inference handling etc.
deploy_source_uri = script_uris.retrieve( model_id=train_model_id, model_version=train_model_version, script_scope="inference"
) # Use the estimator from the previous step to deploy to a SageMaker endpoint
finetuned_predictor = sd_estimator.deploy( initial_instance_count=1, instance_type=inference_instance_type, entry_point="inference.py", # entry point file in source_dir and present in deploy_source_uri image_uri=deploy_image_uri, source_dir=deploy_source_uri, endpoint_name=endpoint_name,
)

Til venstre er treningsbildene av en katt ved navn riobugger som brukes til å finjustere modellen (standardparametere unntatt max_steps = 400). I midten og til høyre er bildene generert av den finjusterte modellen når de blir bedt om å forutsi riobuggers bilde på stranden og en blyantskisse.

For mer informasjon om inferens, inkludert støttede parametere, svarformat og så videre, se Generer bilder fra tekst med den stabile diffusjonsmodellen på Amazon SageMaker JumpStart.

Få tilgang til JumpStart gjennom Studio UI

I denne delen viser vi hvordan du trener og distribuerer JumpStart-modeller gjennom Studio UI. Følgende video viser hvordan du finner den forhåndstrente stabile diffusjonsmodellen på JumpStart, trener den og deretter distribuerer den. Modellsiden inneholder verdifull informasjon om modellen og hvordan du bruker den. Etter å ha konfigurert SageMaker-treningsforekomsten, velg Tog. Etter at modellen er opplært, kan du distribuere den trente modellen ved å velge Distribuer. Etter at endepunktet er i «i drift»-stadiet, er det klart til å svare på slutningsforespørsler.

For å akselerere tiden til inferens gir JumpStart en eksempelnotisbok som viser hvordan du kjører inferens på det nyopprettede endepunktet. For å få tilgang til notatblokken i Studio, velg Åpne Notebook i Bruk endepunkt fra Studio delen av modellens endepunktside.

JumpStart gir også en enkel notisbok som du kan bruke til å finjustere den stabile diffusjonsmodellen og distribuere den resulterende finjusterte modellen. Du kan bruke den til å lage morsomme bilder av hunden din. For å få tilgang til notatboken, søk etter «Generer morsomme bilder av hunden din» i JumpStart-søkefeltet. For å kjøre notatboken kan du bruke så lite som fem treningsbilder og laste opp til den lokale studiomappen. Hvis du har mer enn fem bilder, kan du laste dem opp også. Notebook laster opp treningsbildene til S3, trener modellen på datasettet og distribuerer den resulterende modellen. Treningen kan ta 20 minutter å fullføre. Du kan endre antall trinn for å få fart på treningen. Notebook gir noen eksempler på instruksjoner for å prøve med den distribuerte modellen, men du kan prøve hvilken som helst ledetekst du vil. Du kan også tilpasse notatboken for å lage avatarer av deg selv eller kjæledyrene dine. For eksempel, i stedet for hunden din, kan du laste opp bilder av katten din i det første trinnet og deretter endre ledetekstene fra hunder til katter, og modellen vil generere bilder av katten din.

Finjusteringshensyn

Treningsstabile diffusjonsmodeller har en tendens til å overfitte raskt. For å få bilder av god kvalitet må vi finne en god balanse mellom de tilgjengelige treningshyperparametrene som antall treningstrinn og læringsraten. I denne delen viser vi noen eksperimentelle resultater og gir veiledning om hvordan du angir disse parameterne.

Anbefalinger

Vurder følgende anbefalinger:

  • Start med god kvalitet på treningsbildene (4–20). Hvis du trener på menneskelige ansikter, kan det hende du trenger flere bilder.
  • Tren i 200–400 skritt når du trener på hunder eller katter og andre ikke-menneskelige emner. Hvis du trener på menneskelige ansikter, kan det hende du trenger flere trinn. Hvis overmontering skjer, reduser antall trinn. Hvis undertilpasning skjer (den finjusterte modellen kan ikke generere målmotivets bilde), øk antall trinn.
  • Hvis du trener på ikke-menneskelige ansikter, kan du sette with_prior_preservation = False fordi det ikke påvirker ytelsen nevneverdig. På menneskelige ansikter må du kanskje sette with_prior_preservation=True.
  • Hvis innstilling with_prior_preservation=True, bruk forekomsttypen ml.g5.2xlarge.
  • Når du trener på flere emner sekvensielt, hvis emnene er veldig like (for eksempel alle hunder), beholder modellen det siste emnet og glemmer de forrige emnene. Hvis emnene er forskjellige (for eksempel først en katt og deretter en hund), beholder modellen begge emnene.
  • Vi anbefaler å bruke en lav læringsrate og øke antall trinn gradvis til resultatene er tilfredsstillende.

Opplæringsdatasett

Kvaliteten på den finjusterte modellen påvirkes direkte av kvaliteten på treningsbildene. Derfor må du samle bilder av høy kvalitet for å få gode resultater. Uskarpe bilder eller bilder med lav oppløsning vil påvirke kvaliteten på den finjusterte modellen. Husk følgende tilleggsparametre:

  • Antall treningsbilder – Du kan finjustere modellen på så lite som fire treningsbilder. Vi eksperimenterte med treningsdatasett med størrelse så lite som 4 bilder og så mange som 16 bilder. I begge tilfeller var finjusteringen i stand til å tilpasse modellen til emnet.
  • Datasettformater – Vi testet finjusteringsalgoritmen på bilder i formatene .png, .jpg og .jpeg. Andre formater kan også fungere.
  • Bildeoppløsning – Treningsbilder kan ha hvilken som helst oppløsning. Finjusteringsalgoritmen vil endre størrelsen på alle treningsbilder før du starter finjusteringen. Når det er sagt, hvis du ønsker å ha mer kontroll over beskjæringen og størrelsen på treningsbildene, anbefaler vi å endre størrelsen på bildene selv til modellens grunnoppløsning (i dette eksempelet 512×512 piksler).

Eksperimentinnstillinger

I eksperimentet i dette innlegget, mens vi finjusterer, bruker vi standardverdiene til hyperparametrene med mindre det er spesifisert. Videre bruker vi ett av de fire datasettene:

  • Hund 1-8 – Hund 1 med 8 bilder
  • Hund 1-16 – Hund 1 med 16 bilder
  • Hund 2-4 – Hund 2 med fire bilder
  • Katt-8 – Katt med 8 bilder

For å redusere rot, viser vi bare ett representativt bilde av datasettet i hver seksjon sammen med datasettnavnet. Du finner hele treningssettet i seksjonen Eksperimentdatasett i dette innlegget.

overfitting

Stabile diffusjonsmodeller har en tendens til å overfitte når du finjusterer noen få bilder. Derfor må du velge parametere som f.eks epochs, max_epochs, og læringsrate nøye. I denne delen brukte vi Dog1-16 datasettet.

For å evaluere modellens ytelse, evaluerer vi den finjusterte modellen for fire oppgaver:

  • Kan den finjusterte modellen generere bilder av motivet (dopplerhund) i samme setting som den ble trent på?
    • Observasjon - Ja det kan det. Det er verdt å merke seg at modellens ytelse øker med antall treningstrinn.
  • Kan den finjusterte modellen generere bilder av motivet i en annen setting enn den ble trent på? Kan den for eksempel generere bilder av Doppler på en strand?
    • Observasjon - Ja det kan det. Det er verdt å merke seg at modellens ytelse øker med antall treningstrinn opp til et visst punkt. Hvis modellen trenes for lenge, forringes imidlertid modellens ytelse ettersom modellen har en tendens til å overfitte.
  • Kan den finjusterte modellen generere bilder av en klasse som opplæringsfaget tilhører? Kan den for eksempel generere et bilde av en generisk hund?
    • Observasjon – Etter hvert som vi øker antall treningstrinn, begynner modellen å overfitte. Som et resultat glemmer den den generiske klassen til en hund og vil bare produsere bilder relatert til motivet.
  • Kan den finjusterte modellen generere bilder av en klasse eller et emne som ikke er i opplæringsdatasettet? Kan den for eksempel generere et bilde av en katt?
    • Observasjon – Etter hvert som vi øker antall treningstrinn, begynner modellen å overfitte. Som et resultat vil det kun produsere bilder relatert til emnet, uavhengig av hvilken klasse som er spesifisert.

Vi finjusterer modellen for et annet antall trinn (ved å stille inn max_steps hyperparametere), og for hver finjusterte modell genererer vi bilder på hver av de følgende fire ledetekstene (vist i følgende eksempler fra venstre til høyre:

  • “Et bilde av en dopplerhund”
  • “Et bilde av en dopplerhund på en strand”
  • “Et bilde av en hund”
  • “Et bilde av en katt”

Følgende bilder er fra modellen trent med 50 trinn.

Følgende modell ble trent med 100 trinn.

Vi trente følgende modell med 200 trinn.

Følgende bilder er fra en modell trent med 400 trinn.

Til slutt, de følgende bildene er resultatet av 800 trinn.

Tren på flere datasett

Mens du finjusterer, kan det være lurt å finjustere på flere motiver og få den finjusterte modellen til å kunne generere bilder av alle motivene. Dessverre er JumpStart for øyeblikket begrenset til trening på ett enkelt emne. Du kan ikke finjustere modellen på flere motiver samtidig. Videre vil finjustering av modellen for ulike fag sekvensielt resultere i at modellen glemmer det første faget dersom fagene er like.

Vi vurderer følgende eksperimenter i denne delen:

  1. Finjuster modellen for emne A.
  2. Finjuster den resulterende modellen fra trinn 1 for emne B.
  3. Generer bilder av emne A og emne B ved å bruke utdatamodellen fra trinn 2.

I følgende eksperimenter observerer vi at:

  • Hvis A er hund 1 og B er hund 2, ligner alle bildene generert i trinn 3 hund 2
  • Hvis A er hund 2 og B er hund 1, ligner alle bildene generert i trinn 3 hund 1
  • Hvis A er hund 1 og B er katt, ligner bilder generert med hundemeldinger hund 1 og bilder generert med kattemeldinger ligner katt

Tren på hund 1 og deretter hund 2

I trinn 1 finjusterer vi modellen for 200 trinn på åtte bilder av hund 1. I trinn 2 finjusterer vi modellen ytterligere i 200 trinn på fire bilder av hund 2.

Følgende er bildene generert av den finjusterte modellen på slutten av trinn 2 for forskjellige spørsmål.

Tren på hund 2 og deretter hund 1

I trinn 1 finjusterer vi modellen for 200 trinn på fire bilder av hund 2. I trinn 2 finjusterer vi modellen ytterligere i 200 trinn på åtte bilder av hund 1.

Følgende er bildene generert av den finjusterte modellen på slutten av trinn 2 med forskjellige spørsmål.

Tren på hunder og katter

I trinn 1 finjusterer vi modellen for 200 trinn på åtte bilder av en katt. Deretter finjusterer vi modellen videre i 200 trinn på åtte bilder av hund 1.

Følgende er bildene generert av den finjusterte modellen på slutten av trinn 2. Bilder med katterelaterte meldinger ser ut som katten i trinn 1 av finjusteringen, og bilder med hunderelaterte meldinger ser ut som hunden i Trinn 2 av finjusteringen.

Forhåndskonservering

Forhåndskonservering er en teknikk som bruker flere bilder av samme klasse som vi prøver å trene på. For eksempel, hvis treningsdataene består av bilder av en bestemt hund, med forhåndsbevaring, inkluderer vi klassebilder av generiske hunder. Den prøver å unngå overfitting ved å vise bilder av forskjellige hunder mens de trener for en bestemt hund. En merkelapp som angir den spesifikke hunden som er tilstede i forekomstmeldingen, mangler i klassemeldingen. Forekomstmeldingen kan for eksempel være «et bilde av en riobugger-katt» og klassemeldingen kan være «et bilde av en katt». Du kan aktivere forutgående bevaring ved å angi hyperparameteren with_prior_preservation = True. Hvis innstilling with_prior_preservation = True, må du inkludere class_prompt in dataset_info.json og kan inkludere alle klassebilder som er tilgjengelige for deg. Følgende er treningsdatasettets format ved innstilling with_prior_preservation = True:

  • Input – En katalog som inneholder forekomstbildene, dataset_info.json og (valgfritt) katalog class_data_dir. Legg merke til følgende:
    • Bilder kan ha .png, .jpg, .jpeg-format.
    • De dataset_info.json filen må ha formatet {'instance_prompt':<<instance_prompt>>,'class_prompt':<<class_prompt>>}.
    • De class_data_dir katalogen må ha klassebilder. Hvis class_data_dir er ikke til stede, eller det er ikke nok bilder allerede i class_data_dir, vil flere bilder bli samplet med class_prompt.

For datasett som katter og hunder påvirker ikke tidligere bevaring ytelsen til den finjusterte modellen nevneverdig og kan derfor unngås. Men når du trener på ansikter, er dette nødvendig. For mer informasjon, se Trening av stabil diffusjon med Dreambooth ved hjelp av diffusorer.

Forekomststyper

Finjustering av stabile diffusjonsmodeller krever akselerert beregning levert av GPU-støttede forekomster. Vi eksperimenterer med finjusteringen med ml.g4dn.2xlarge (16 GB CUDA-minne, 1 GPU) og ml.g5.2xlarge (24 GB CUDA-minne, 1 GPU). Minnekravet er høyere når du genererer klassebilder. Derfor, hvis innstilling with_prior_preservation=True, bruk forekomsttypen ml.g5.2xlarge, fordi trening kjører inn i problemet med CUDA tom minne på ml.g4dn.2xlarge-forekomsten. JumpStart-finjusteringsskriptet bruker for øyeblikket enkelt GPU, og derfor vil finjustering på multi-GPU-forekomster ikke gi ytelsesøkning. For mer informasjon om ulike forekomsttyper, se Forekomststyper for Amazon EC2.

Begrensninger og skjevhet

Selv om Stable Diffusion har en imponerende ytelse når det gjelder å generere bilder, lider den av flere begrensninger og skjevheter. Disse inkluderer, men er ikke begrenset til:

  • Modellen genererer kanskje ikke nøyaktige ansikter eller lemmer fordi treningsdataene ikke inneholder tilstrekkelige bilder med disse funksjonene
  • Modellen ble trent på LAION-5B datasett, som har vokseninnhold og kanskje ikke er egnet for produktbruk uten ytterligere vurderinger
  • Modellen fungerer kanskje ikke bra med ikke-engelske språk fordi modellen ble trent på engelskspråklig tekst
  • Modellen kan ikke generere god tekst i bilder

For mer informasjon om begrensninger og skjevheter, se Stabil diffusjon v2-1-basert modellkort. Disse begrensningene for den forhåndstrente modellen kan også overføres til de finjusterte modellene.

Rydd opp

Når du er ferdig med å kjøre notisboken, sørg for å slette alle ressurser som er opprettet i prosessen for å sikre at faktureringen stoppes. Kode for å rydde opp i endepunktet er gitt i den tilknyttede Introduksjon til JumpStart – Tekst til bilde eksempel notatbok.

Offentlig tilgjengelige finjusterte modeller i JumpStart

Selv om Stable Diffusion-modeller utgitt av StabilitetAI har imponerende ytelse, de har begrensninger når det gjelder språket eller domenet det ble trent på. For eksempel ble Stable Diffusion-modeller trent på engelsk tekst, men du må kanskje generere bilder fra ikke-engelsk tekst. Alternativt ble Stable Diffusion-modeller opplært til å generere fotorealistiske bilder, men du må kanskje generere animerte eller kunstneriske bilder.

JumpStart tilbyr over 80 offentlig tilgjengelige modeller med forskjellige språk og temaer. Disse modellene er ofte finjusterte versjoner fra Stable Diffusion-modeller utgitt av StabilityAI. Hvis brukstilfellet ditt samsvarer med en av de finjusterte modellene, trenger du ikke å samle inn ditt eget datasett og finjustere det. Du kan ganske enkelt distribuere en av disse modellene gjennom Studio UI eller bruke brukervennlige JumpStart APIer. For å distribuere en forhåndsopplært stabil diffusjonsmodell i JumpStart, se Generer bilder fra tekst med den stabile diffusjonsmodellen på Amazon SageMaker JumpStart.

Følgende er noen av eksemplene på bilder generert av de forskjellige modellene som er tilgjengelige i JumpStart.

Merk at disse modellene ikke finjusteres ved hjelp av JumpStart-skript eller DreamBooth-skript. Du kan laste ned hele listen over offentlig tilgjengelige finjusterte modeller med eksempler fra her..

For flere eksempelgenererte bilder fra disse modellene, se avsnittet Åpen kildekode Finjusterte modeller i vedlegget.

konklusjonen

I dette innlegget viste vi hvordan du finjusterer den stabile diffusjonsmodellen for tekst-til-bilde og deretter distribuerer den ved hjelp av JumpStart. Videre diskuterte vi noen av vurderingene du bør gjøre mens du finjusterer modellen og hvordan det kan påvirke ytelsen til den finjusterte modellen. Vi diskuterte også de over 80 ferdige finjusterte modellene som er tilgjengelige i JumpStart. Vi viste kodebiter i dette innlegget – for hele koden med alle trinnene i denne demoen, se Introduksjon til JumpStart – Tekst til bilde eksempel notatbok. Prøv løsningen på egen hånd og send oss ​​dine kommentarer.

For å lære mer om modellen og DreamBooth-finjusteringen, se følgende ressurser:

For å lære mer om JumpStart, sjekk ut følgende blogginnlegg:


Om forfatterne

Dr. Vivek Madan er en Applied Scientist med Amazon SageMaker JumpStart-teamet. Han fikk sin doktorgrad fra University of Illinois i Urbana-Champaign og var postdoktor ved Georgia Tech. Han er en aktiv forsker innen maskinlæring og algoritmedesign og har publisert artikler på EMNLP-, ICLR-, COLT-, FOCS- og SODA-konferanser.

Heiko Hotz er en senior løsningsarkitekt for AI og maskinlæring med spesielt fokus på naturlig språkbehandling (NLP), store språkmodeller (LLM) og generativ AI. Før denne rollen var han sjef for datavitenskap for Amazons EU-kundeservice. Heiko hjelper kundene våre med å lykkes i deres AI/ML-reise på AWS og har jobbet med organisasjoner i mange bransjer, inkludert forsikring, finansielle tjenester, media og underholdning, helsetjenester, verktøy og produksjon. På fritiden reiser Heiko så mye som mulig.


Vedlegg: Eksperimentdatasett

Denne delen inneholder datasettene som ble brukt i eksperimentene i dette innlegget.

Hund 1-8

Hund 1-16

Hund 2-4

Hund 3-8

Vedlegg: Åpen kildekode Finjusterte modeller

Følgende er noen av eksemplene på bilder generert av de forskjellige modellene som er tilgjengelige i JumpStart. Hvert bilde er merket med en model_id starter med et prefiks huggingface-txt2img- etterfulgt av ledeteksten som brukes til å generere bildet i neste linje.

Tidstempel:

Mer fra AWS maskinlæring