Fine-tuning: OpenAI-modellen + uw Confluence-data

Gebouwd voor snelheid: ~10ms latentie, zelfs onder belasting
De razendsnelle manier om je modellen te bouwen, volgen en implementeren!
- Verwerkt 350+ RPS op slechts 1 vCPU — geen tuning nodig
- Productieklaar met volledige enterprise-ondersteuning
Als ChatGPT de iPhone is, dan moet de AppStore nog gebouwd worden – en dat wordt een suite van verticale applicaties die er bovenop worden gebouwd. Elke sector, elk bedrijf en elk individu gaat deze applicaties op kleine en grote schaal bouwen. Van het bouwen van een gezondheidszorg- of fabricagespecifieke ChatGPT, tot het schrijven van domeinspecifieke e-mails voor marketing, tot het beantwoorden van bedrijfsspecifieke vragen uit de interne kennisbank, tot zelfs het bouwen van persoonlijke zoekmachines om vragen te beantwoorden zoals: wat is het adres van John of wanneer is mijn schoonmoeder jarig? We hebben een reeks voorbeelden beschreven in onze vorige blogpost.
Waarom is ChatGPT op zichzelf niet genoeg voor deze verticale applicaties?
Om dit te begrijpen, is het belangrijk om het verschil te begrijpen tussen het clear web en het deep web:
- Clear Web: openbaar toegankelijke webpagina's die zijn geïndexeerd door zoekmachines, bijv. Wikipedia, boeken, berichten op sociale media, enz.
- Deep Web: het deel van het internet dat zich achter een authenticatiesysteem bevindt, bijv. uw e-mail of SaaS-platformen. Dit beslaat 96% van het web.
Modellen zoals ChatGPT zijn getraind op een enorme dataset, maar al die data is beschikbaar op het clear web. U kunt het dus geen vraag stellen waarvan het antwoord afhangt van iets op het deep web, zoals uw e-mail of private documenten. Tijdens het proces van leren van de enorme dataset van het clear web bouwen modellen zoals ChatGPT echter zoveel intelligentie op over taal en semantiek dat het voor het model veel gemakkelijker is om nieuwe informatie te leren uit kleine hoeveelheden data voor een specifieke taak.
Maak kennis met fine-tuning
Fine-tuning is een krachtige techniek waarmee we de kennis en het geleerde van een vooraf getraind model zoals ChatGPT kunnen benutten om de prestaties van het model op een nieuwe taak te verbeteren door het te trainen op een kleinere, taakspecifieke dataset. Stel bijvoorbeeld dat u een vraag-antwoordsysteem wilt bouwen voor uw interne bedrijfsdocumenten die in Confluence zijn opgeslagen. U kunt alle tekstinhoud van uw Confluence doorgeven en een GPT-model daarmee fine-tunen.
Klinkt eenvoudig. Waarom doet niet iedereen het?
Hoewel OpenAI veel wrijving heeft weggenomen via de fine-tuning API's, vereist het nog steeds de nodige overweging, planning en inspanning op verschillende vlakken:
Datapreparatie
De data die u nodig hebt om de modellen te fine-tunen, moet de specifieke indeling van prompt-completion-paren hebben.
{“prompt”: <prompt-text>, “completion”: <ideal generated text>}
Een paar aandachtspunten:
- Het is niet triviaal om willekeurige documenten zoals bedrijfsdocumenten uit Confluence te nemen en ze om te zetten in hoogwaardige voorbeelden in de bovenstaande indeling.
- U hebt minimaal een paar honderd prompts nodig, wat menselijke inspanning en vakexpertise vereist.
- Zorgvuldige scheidingstekens die het begin en het einde van de prompt en completions markeren en die niet in de tekst voorkomen. U moet er ook voor zorgen dat de invoerprompts later dezelfde scheidingstekens gebruiken.
- Het verhogen van het aantal voorbeelden verbetert de prestaties van het model.
- Zelfs iets eenvoudigs als het toevoegen van een spatie voordat de completion begint, kan de prestaties al verbeteren.
Modelselectie
OpenAI heeft meerdere modellen die gefine-tuned kunnen worden en elk daarvan heeft afwegingen waarmee rekening moet worden gehouden:
- Ada: Kleinere, snellere modellen die gemakkelijk te fine-tunen zijn en goed werken voor een aantal taken zoals classificatie, tekstgeneratie en vraag-beantwoording. Omdat het minder parameters heeft, presteert het ook minder goed dan andere en kan het de precisie aantasten.
- Curie: Groter en krachtiger dan Ada en eveneens algemeen toepasbaar. Het wordt moeilijker te fine-tunen op kleinere datasets vanwege het grote aantal parameters.
- Babbage: Ontworpen voor NLP-taken die gespecialiseerde kennis vereisen, zoals recht of geneeskunde, en kan zeer goed worden gefine-tuned. Het is minder algemeen toepasbaar en niet geschikt voor fine-tuning op grotere datasets of complexere taken.
- Davinci: Het grootste en krachtigste algemeen toepasbare model. Zeer moeilijk te trainen op minder krachtige hardware en moet worden gebruikt voor complexe NLP-taken.
Opmerking: U kunt ook incrementeel een eerder gefine-tuned model verder fine-tunen. Er is een beperking in het tijdsbestek vanwege veranderende API's: de modellen moeten zijn gefine-tuned na 21 april 2022.
Selectie van hypermeters
We hebben geprobeerd de fine-tuning API's van OpenAI met standaardparameters te gebruiken en ze werkten heel goed voor sommige taken, maar we konden verbeteringen tot wel 40% behalen door de hypermeters aan te passen.
- Learning Rate Multiplier: staat standaard op 0.05, 0.1 of 0.2, afhankelijk van de uiteindelijke batch_size. De fine-tuning leersnelheid is de oorspronkelijke leersnelheid die is gebruikt voor pretraining vermenigvuldigd met deze vermenigvuldigingsfactor. De leersnelheid bepaalt hoe snel het model zijn gewichten aanpast tijdens de training. Een te hoge leersnelheid kan ertoe leiden dat het model convergeert naar een suboptimale oplossing, terwijl een te lage leersnelheid ervoor kan zorgen dat het model te langzaam convergeert of vastloopt in een lokaal minimum. OpenAI raadt aan om grotere leersnelheden te gebruiken voor grotere batch sizes, maar doorgaans tussen 0.02 en 0.2 te opereren.
- Batch Size: staat standaard op ~0.2% van het aantal voorbeelden in de trainingsset, met een maximum van 256. De batch size bepaalt hoeveel voorbeelden in elke trainingsiteratie worden verwerkt. Een grotere batch size kan leiden tot snellere trainingstijden, maar kan er ook voor zorgen dat het model gaat overfitten of dat het geheugengebruik hoger wordt. Het wordt algemeen aanbevolen om een batch size te gebruiken die zo groot mogelijk is zonder overmatig geheugengebruik te veroorzaken.
- Aantal Epochs: staat standaard op 4. Het aantal epochs bepaalt hoe vaak het model op de gehele dataset wordt getraind. Te weinig epochs kan leiden tot underfitting, terwijl te veel epochs kan leiden tot overfitting. Het wordt algemeen aanbevolen om de prestaties van het model op een validatieset te monitoren en de training te stoppen wanneer de prestaties niet meer verbeteren.
- Prompt Loss Weight: staat standaard op 0.01. Het gewicht dat wordt gebruikt voor de loss op de prompt-tokens. Dit bepaalt hoeveel het model probeert te leren om de prompt te genereren (vergeleken met de completion die altijd een gewicht van 1.0 heeft), en kan een stabiliserend effect toevoegen aan de training wanneer completions kort zijn. Voor korte prompts raadt OpenAI aan dit getal te verhogen, en voor lange prompts werkt een klein gewicht het beste.
- Model: staat standaard op curie. De hierboven beschreven modelselectietabel is ook een hypermeter, maar we vonden dat deze een speciale vermelding verdiende gezien het belang ervan als uitgangspunt in dit proces.
Kostenoverweging
De fine-tuningkosten variëren sterk afhankelijk van welke parameters u kiest, dus het is erg belangrijk om hier een goed inzicht in te hebben.
📌
Voor 1M tokens:
- Ada: $0.4
- Babbage: $0.6
- Curie: $3
- Davinci: $30.
- 1 token is ongeveer 4 tekens of 0,75 woorden.
- Davinci is bijna 100x duurder dan Ada.
- Curie is 10x duurder dan Ada en is het standaardmodel.
- Om het in perspectief te plaatsen: Wikipedia heeft ongeveer 5B tokens, dus het fine-tunen van een Curie zou maar liefst $15.000 kosten. Dit is slechts een theoretische stelling, aangezien deze modellen al vooraf zijn getraind op Wikipedia. Bespaar uzelf a.u.b. het geld.
- Het aantal trainingstokens hangt ook af van uw trainingsepochs. In feite geldt: totale trainingstokens = tokens in uw bestand * aantal epochs.
📌
Het gebruik van gefine-tunede modellen is aanzienlijk duurder (~5x) dan de vooraf getrainde tegenhangers.
Voor 1M tokens:
- Ada: $1.6 vs $0.4
- Babbage: $2.4 vs $0.5
- Curie: $12 vs $2
- DaVinci: $120 vs $20
Wanneer u het model gebruikt, beïnvloeden parameters zoals best_of en n ook uw kosten, omdat u uiteindelijk meerdere completions genereert voor één enkele prompt. Overweeg max_response_length te gebruiken om kosten te besparen of verminder het gebruik van de parameters best_of en n.
Casestudy: Fine-tuning met Confluence-documenten
Het bouwen van een gefine-tuned model voor onze eigen Confluence-dataset was niet eenvoudig. Het omvatte het volgende proces van 4 stappen.

Ophalen van data
Het kostte me de nodige moeite om het uitlezen van alle data uit Confluence via de API's uit te vogelen, omdat Confluence rijke data bevat met tabellen, koppen en subkoppen en ik dat moest omzetten in eenvoudige tekst voor gebruiksgemak. Ook het beheren van machtigingen en het juiste toegangsniveau was niet triviaal. Uiteindelijk zijn we erin geslaagd een heel eenvoudig formulier te maken waarin u de URL, gebruikersnaam en API-sleutel opgeeft, waarna wij de data kunnen ophalen.
Data-voorverwerking
Dit was het moeilijkste onderdeel. Hier hebben we meerdere benaderingen geprobeerd:
- Willekeurig splitsen van zinnen: gebaseerd op het aantal woorden in prompts en completions
- Regex: zinnen scheiden op basis van woorden zoals: en, maar, echter enz.
- ChatGPT: context geven aan ChatGPT en vragen om vragen te genereren.

We hebben uiteindelijk de meeste paren gekozen uit #3, maar hebben er ook een willekeurige steekproef uit #1 en #2 aan toegevoegd. Voor onze dataset hebben we meer dan 50.000 paren van prompts en completions gegenereerd met een gemiddelde lengte van 17 woorden voor de prompt en 133 woorden voor de respons, wat neerkomt op een totaal van 150 woorden per paar. Idealiter zou deze stap veel meer experimenten vereisen.

Model-fine-tuning
We hebben geëxperimenteerd met verschillende modellen en hypermeters en merkten dat Curie de neiging heeft beter te presteren dan Ada of Babbage, maar we vonden Ada acceptabel gezien de kostenafweging. We hebben Davinci niet geprobeerd. We moesten de leersnelheid aanpassen en kwamen uit op 0.05, terwijl we het model gedurende 6 epochs hebben laten draaien. De kosten voor het trainen van 1 run van Curie bedroegen ongeveer $30 en Ada ongeveer $4. In totaal heeft het ons via een reeks experimenten wellicht $400 aan OpenAI-credits gekost voor fine-tuning – we hadden ook een paar slechte runs.

Testen
We merkten dat het gefine-tunede model strikt beter presteerde dan het oorspronkelijke model op vragen die gerelateerd waren aan onze interne dataset. We hebben ons team ongeveer 100 verschillende prompts laten uitproberen en deze handmatig beoordeeld. Dit is niet wetenschappelijk, maar werkte voor deze eenvoudige use case. Interessant genoeg merkten we dat het gefine-tunede model in sommige gevallen slechter presteerde dan het oorspronkelijke model bij algemene zoekopdrachten. We moeten nog onderzoeken wat hier precies gebeurt.

Dit was een leuke oefening en we gaan verder werken aan het experimenteren met fine-tuning op andere datasets.
📌
Als u specifieke datasets wilt, of wilt dat ik deze app openstel voor gebruik met uw eigen Confluence, neem dan contact met mij op via nikunj@truefoundry.com
TrueFoundry is een ML Deployment PaaS over Kubernetes om ontwikkelaarsworkflows te versnellen, terwijl ze volledige flexibiliteit behouden bij het testen en implementeren van modellen en het Infra-team volledige beveiliging en controle gegarandeerd wordt. Via ons platform stellen we Machine Learning-teams in staat om binnen 15 minuten modellen te implementeren en te monitoren met 100% betrouwbaarheid, schaalbaarheid en de mogelijkheid om binnen enkele seconden een rollback uit te voeren – waardoor ze kosten besparen en modellen sneller naar productie kunnen brengen, wat leidt tot echte zakelijke waarderealisatie.
TrueFoundry AI Gateway levert een latentie van ~3–4 ms, verwerkt 350+ RPS op 1 vCPU, schaalt moeiteloos horizontaal en is klaar voor productie, terwijl LiteLLM last heeft van hoge latentie, moeite heeft boven een gemiddeld aantal RPS, geen ingebouwde schaling heeft en het meest geschikt is voor lichte workloads of prototypes.



















.png)

.webp)



.webp)







.webp)





