I dette indlæg demonstrerer vi, hvordan man effektivt finjusterer en state-of-the-art proteinsprogmodel (pLM) for at forudsige protein subcellulær lokalisering ved hjælp af Amazon SageMaker.
Proteiner er kroppens molekylære maskiner, ansvarlige for alt fra at bevæge dine muskler til at reagere på infektioner. På trods af denne variation er alle proteiner lavet af gentagne kæder af molekyler kaldet aminosyrer. Det menneskelige genom koder for 20 standardaminosyrer, hver med en lidt forskellig kemisk struktur. Disse kan repræsenteres af bogstaver i alfabetet, som så giver os mulighed for at analysere og udforske proteiner som en tekststreng. Det enorme mulige antal proteinsekvenser og -strukturer er det, der giver proteiner deres mange forskellige anvendelser.
Proteiner spiller også en nøglerolle i udviklingen af lægemidler, som potentielle mål, men også som terapeutiske midler. Som vist i nedenstående tabel var mange af de bedst sælgende lægemidler i 2022 enten proteiner (især antistoffer) eller andre molekyler som mRNA oversat til proteiner i kroppen. På grund af dette skal mange life science-forskere besvare spørgsmål om proteiner hurtigere, billigere og mere præcist.
Navn | Fabrikant | Globalt salg i 2022 (milliarder USD) | Indikationer |
Komirnati | Pfizer / BioNTech | $40.8 | Covid-19 |
Spikevax | moderne | $21.8 | Covid-19 |
Humira | Abbvie | $21.6 | Gigt, Crohns sygdom og andre |
keytruda | Merck | $21.0 | Forskellige kræftformer |
Datakilde: Urquhart, L. Topvirksomheder og lægemidler efter salg i 2022. Nature Reviews Drug Discovery 22, 260-260 (2023).
Fordi vi kan repræsentere proteiner som sekvenser af tegn, kan vi analysere dem ved hjælp af teknikker, der oprindeligt er udviklet til skriftsprog. Dette inkluderer store sprogmodeller (LLM'er), der er fortrænet på enorme datasæt, som derefter kan tilpasses til specifikke opgaver, såsom tekstresumé eller chatbots. På samme måde er pLM'er fortrænet på store proteinsekvensdatabaser ved hjælp af umærket, selvovervåget læring. Vi kan tilpasse dem til at forudsige ting som 3D-strukturen af et protein, eller hvordan det kan interagere med andre molekyler. Forskere har endda brugt pLM'er til at designe nye proteiner fra bunden. Disse værktøjer erstatter ikke menneskelig videnskabelig ekspertise, men de har potentialet til at fremskynde præ-klinisk udvikling og forsøgsdesign.
En udfordring med disse modeller er deres størrelse. Både LLM'er og pLM'er er vokset i størrelsesordener i de seneste par år, som illustreret i følgende figur. Det betyder, at det kan tage lang tid at træne dem til tilstrækkelig nøjagtighed. Det betyder også, at du skal bruge hardware, især GPU'er, med store mængder hukommelse til at gemme modelparametrene.
Lang træningstid plus store instanser er lig med høje omkostninger, hvilket kan sætte dette arbejde uden for rækkevidde for mange forskere. For eksempel, i 2023, en Forskerholdet beskrev træning af en 100 milliarder-parameter pLM på 768 A100 GPU'er i 164 dage! Heldigvis kan vi i mange tilfælde spare tid og ressourcer ved at tilpasse en eksisterende pLM til vores specifikke opgave. Denne teknik kaldes finjustering, og giver os også mulighed for at låne avancerede værktøjer fra andre typer sprogmodellering.
Løsningsoversigt
Det specifikke problem vi behandler i dette indlæg er subcellulær lokalisering: Givet en proteinsekvens, kan vi bygge en model, der kan forudsige, om den lever på ydersiden (cellemembranen) eller inde i en celle? Dette er et vigtigt stykke information, som kan hjælpe os med at forstå funktionen, og om det ville være et godt lægemiddelmål.
Vi starter med at downloade et offentligt datasæt vha Amazon SageMaker Studio. Derefter bruger vi SageMaker til at finjustere ESM-2 proteinsprogmodellen ved hjælp af en effektiv træningsmetode. Endelig implementerer vi modellen som et slutpunkt i realtid og bruger det til at teste nogle kendte proteiner. Følgende diagram illustrerer denne arbejdsgang.
I de følgende afsnit gennemgår vi trinene for at forberede dine træningsdata, oprette et træningsscript og køre et SageMaker træningsjob. Al koden i dette indlæg er tilgængelig på GitHub.
Forbered træningsdataene
Vi bruger en del af DeepLoc-2 datasæt, som indeholder flere tusinde SwissProt-proteiner med eksperimentelt bestemte placeringer. Vi filtrerer efter sekvenser af høj kvalitet mellem 100-512 aminosyrer:
df = pd.read_csv(
"https://services.healthtech.dtu.dk/services/DeepLoc-2.0/data/Swissprot_Train_Validation_dataset.csv"
).drop(["Unnamed: 0", "Partition"], axis=1)
df["Membrane"] = df["Membrane"].astype("int32")
# filter for sequences between 100 and 512 amino acides
df = df[df["Sequence"].apply(lambda x: len(x)).between(100, 512)]
# Remove unnecessary features
df = df[["Sequence", "Kingdom", "Membrane"]]
Dernæst tokeniserer vi sekvenserne og deler dem op i trænings- og evalueringssæt:
dataset = Dataset.from_pandas(df).train_test_split(test_size=0.2, shuffle=True)
tokenizer = AutoTokenizer.from_pretrained("facebook/esm2_t33_650M_UR50D")
def preprocess_data(examples, max_length=512):
text = examples["Sequence"]
encoding = tokenizer(text, truncation=True, max_length=max_length)
encoding["labels"] = examples["Membrane"]
return encoding
encoded_dataset = dataset.map(
preprocess_data,
batched=True,
num_proc=os.cpu_count(),
remove_columns=dataset["train"].column_names,
)
encoded_dataset.set_format("torch")
Til sidst uploader vi de behandlede trænings- og evalueringsdata til Amazon Simple Storage Service (Amazon S3):
train_s3_uri = S3_PATH + "/data/train"
test_s3_uri = S3_PATH + "/data/test"
encoded_dataset["train"].save_to_disk(train_s3_uri)
encoded_dataset["test"].save_to_disk(test_s3_uri)
Opret et træningsscript
SageMaker script-tilstand giver dig mulighed for at køre din tilpassede træningskode i optimeret maskinlæring (ML) rammebeholdere, der administreres af AWS. Til dette eksempel tilpasser vi en eksisterende script til tekstklassificering fra Hugging Face. Dette giver os mulighed for at prøve flere metoder til at forbedre effektiviteten af vores træningsjob.
Metode 1: Vægtet træningstime
Som mange biologiske datasæt er DeepLoc-dataene ujævnt fordelt, hvilket betyder, at der ikke er lige mange membran- og ikke-membranproteiner. Vi kunne gensample vores data og kassere optegnelser fra majoritetsklassen. Dette ville dog reducere de samlede træningsdata og potentielt skade vores nøjagtighed. I stedet beregner vi klassens vægte under træningsjobbet og bruger dem til at justere tabet.
I vores træningsscript underklasser vi Trainer
klasse fra transformers
med en WeightedTrainer
klasse, der tager højde for klassevægte ved beregning af krydsentropitab. Dette hjælper med at forhindre skævhed i vores model:
class WeightedTrainer(Trainer):
def __init__(self, class_weights, *args, **kwargs):
self.class_weights = class_weights
super().__init__(*args, **kwargs)
def compute_loss(self, model, inputs, return_outputs=False):
labels = inputs.pop("labels")
outputs = model(**inputs)
logits = outputs.get("logits")
loss_fct = torch.nn.CrossEntropyLoss(
weight=torch.tensor(self.class_weights, device=model.device)
)
loss = loss_fct(logits.view(-1, self.model.config.num_labels), labels.view(-1))
return (loss, outputs) if return_outputs else loss
Metode 2: Gradientakkumulering
Gradientakkumulering er en træningsteknik, der gør det muligt for modeller at simulere træning på større batchstørrelser. Typisk er batchstørrelsen (antallet af prøver, der bruges til at beregne gradienten i ét træningstrin) begrænset af GPU-hukommelseskapaciteten. Med gradientakkumulering beregner modellen først gradienter på mindre batches. Så, i stedet for at opdatere modelvægtene med det samme, bliver gradienterne akkumuleret over flere små batches. Når de akkumulerede gradienter er lig med målets større batchstørrelse, udføres optimeringstrinnet for at opdatere modellen. Dette lader modeller træne med effektivt større batches uden at overskride GPU-hukommelsesgrænsen.
Der er dog behov for ekstra beregning for de mindre partier frem og tilbage. Øgede batchstørrelser via gradientakkumulering kan bremse træningen, især hvis der bruges for mange akkumuleringstrin. Målet er at maksimere GPU-brugen, men undgå overdrevne opbremsninger fra for mange ekstra gradientberegningstrin.
Metode 3: Gradient checkpointing
Gradient checkpointing er en teknik, der reducerer den nødvendige hukommelse under træning og samtidig holder beregningstiden rimelig. Store neurale netværk optager meget hukommelse, fordi de skal gemme alle mellemværdierne fra den fremadgående passage for at kunne beregne gradienterne under den tilbagegående passage. Dette kan forårsage hukommelsesproblemer. En løsning er ikke at gemme disse mellemværdier, men så skal de genberegnes under tilbageløbet, hvilket tager meget tid.
Gradient checkpointing giver en afbalanceret tilgang. Det gemmer kun nogle af de mellemliggende værdier, kaldet checkpoints, og genberegner de andre efter behov. Derfor bruger den mindre hukommelse end at gemme alt, men også mindre beregning end at genberegne alt. Ved strategisk at vælge, hvilke aktiveringer der skal kontrolleres, gør gradientkontrolpunkter det muligt at træne store neurale netværk med overskuelig hukommelsesbrug og beregningstid. Denne vigtige teknik gør det muligt at træne meget store modeller, som ellers ville støde på hukommelsesbegrænsninger.
I vores træningsscript slår vi gradientaktivering og checkpointing til ved at tilføje de nødvendige parametre til TrainingArguments
objekt:
from transformers import TrainingArguments
training_args = TrainingArguments(
gradient_accumulation_steps=4,
gradient_checkpointing=True
)
Metode 4: Lavrangstilpasning af LLM'er
Store sprogmodeller som ESM-2 kan indeholde milliarder af parametre, som er dyre at træne og køre. Forskere udviklet en træningsmetode kaldet Low-Rank Adaptation (LoRA) for at gøre finjusteringen af disse enorme modeller mere effektiv.
Nøgletanken bag LoRA er, at når du finjusterer en model til en specifik opgave, behøver du ikke at opdatere alle de originale parametre. I stedet tilføjer LoRA nye mindre matricer til modellen, der transformerer input og output. Kun disse mindre matricer opdateres under finjustering, som er meget hurtigere og bruger mindre hukommelse. De originale modelparametre forbliver fastfrosset.
Efter finjustering med LoRA kan du flette de små tilpassede matricer tilbage til den originale model. Eller du kan holde dem adskilt, hvis du hurtigt vil finjustere modellen til andre opgaver uden at glemme tidligere. Samlet set gør LoRA det muligt for LLM'er at blive effektivt tilpasset nye opgaver til en brøkdel af de sædvanlige omkostninger.
I vores træningsscript konfigurerer vi LoRA ved hjælp af PEFT
bibliotek fra Hugging Face:
from peft import get_peft_model, LoraConfig, TaskType
import torch
from transformers import EsmForSequenceClassification
model = EsmForSequenceClassification.from_pretrained(
“facebook/esm2_t33_650M_UR50D”,
Torch_dtype=torch.bfloat16,
Num_labels=2,
)
peft_config = LoraConfig(
task_type=TaskType.SEQ_CLS,
inference_mode=False,
bias="none",
r=8,
lora_alpha=16,
lora_dropout=0.05,
target_modules=[
"query",
"key",
"value",
"EsmSelfOutput.dense",
"EsmIntermediate.dense",
"EsmOutput.dense",
"EsmContactPredictionHead.regression",
"EsmClassificationHead.dense",
"EsmClassificationHead.out_proj",
]
)
model = get_peft_model(model, peft_config)
Indsend et SageMaker-uddannelsesjob
Når du har defineret dit træningsscript, kan du konfigurere og indsende et SageMaker træningsjob. Angiv først hyperparametrene:
hyperparameters = {
"model_id": "facebook/esm2_t33_650M_UR50D",
"epochs": 1,
"per_device_train_batch_size": 8,
"gradient_accumulation_steps": 4,
"use_gradient_checkpointing": True,
"lora": True,
}
Dernæst skal du definere, hvilke målinger der skal fanges fra træningsloggene:
metric_definitions = [
{"Name": "epoch", "Regex": "'epoch': ([0-9.]*)"},
{
"Name": "max_gpu_mem",
"Regex": "Max GPU memory use during training: ([0-9.e-]*) MB",
},
{"Name": "train_loss", "Regex": "'loss': ([0-9.e-]*)"},
{
"Name": "train_samples_per_second",
"Regex": "'train_samples_per_second': ([0-9.e-]*)",
},
{"Name": "eval_loss", "Regex": "'eval_loss': ([0-9.e-]*)"},
{"Name": "eval_accuracy", "Regex": "'eval_accuracy': ([0-9.e-]*)"},
]
Til sidst skal du definere en Hugging Face-estimator og sende den til træning på en ml.g5.2xlarge instanstype. Dette er en omkostningseffektiv instanstype, der er bredt tilgængelig i mange AWS-regioner:
from sagemaker.experiments.run import Run
from sagemaker.huggingface import HuggingFace
from sagemaker.inputs import TrainingInput
hf_estimator = HuggingFace(
base_job_name="esm-2-membrane-ft",
entry_point="lora-train.py",
source_dir="scripts",
instance_type="ml.g5.2xlarge",
instance_count=1,
transformers_version="4.28",
pytorch_version="2.0",
py_version="py310",
output_path=f"{S3_PATH}/output",
role=sagemaker_execution_role,
hyperparameters=hyperparameters,
metric_definitions=metric_definitions,
checkpoint_local_path="/opt/ml/checkpoints",
sagemaker_session=sagemaker_session,
keep_alive_period_in_seconds=3600,
tags=[{"Key": "project", "Value": "esm-fine-tuning"}],
)
with Run(
experiment_name=EXPERIMENT_NAME,
sagemaker_session=sagemaker_session,
) as run:
hf_estimator.fit(
{
"train": TrainingInput(s3_data=train_s3_uri),
"test": TrainingInput(s3_data=test_s3_uri),
}
)
Følgende tabel sammenligner de forskellige træningsmetoder, vi diskuterede, og deres effekt på vores jobs køretid, nøjagtighed og GPU-hukommelseskrav.
Konfiguration | Fakturerbar tid (min) | Evalueringsnøjagtighed | Maks. GPU-hukommelsesforbrug (GB) |
Base Model | 28 | 0.91 | 22.6 |
Base + GA | 21 | 0.90 | 17.8 |
Base + GC | 29 | 0.91 | 10.2 |
Base + LoRA | 23 | 0.90 | 18.6 |
Alle metoderne producerede modeller med høj evalueringsnøjagtighed. Brug af LoRA og gradientaktivering reducerede køretiden (og omkostningerne) med henholdsvis 18 % og 25 %. Brug af gradient checkpointing reducerede det maksimale GPU-hukommelsesforbrug med 55 %. Afhængigt af dine begrænsninger (omkostninger, tid, hardware), kan en af disse tilgange give mere mening end en anden.
Hver af disse metoder fungerer godt i sig selv, men hvad sker der, når vi bruger dem i kombination? Følgende tabel opsummerer resultaterne.
Konfiguration | Fakturerbar tid (min) | Evalueringsnøjagtighed | Maks. GPU-hukommelsesforbrug (GB) |
Alle metoder | 12 | 0.80 | 3.3 |
I dette tilfælde ser vi en reduktion på 12 % i nøjagtigheden. Vi har dog reduceret køretiden med 57 % og GPU-hukommelsesbrugen med 85 %! Dette er et massivt fald, der giver os mulighed for at træne på en lang række omkostningseffektive instanstyper.
Ryd op
Hvis du følger med på din egen AWS-konto, skal du slette eventuelle realtidsslutningsendepunkter og data, du har oprettet, for at undgå yderligere gebyrer.
predictor.delete_endpoint()
bucket = boto_session.resource("s3").Bucket(S3_BUCKET)
bucket.objects.filter(Prefix=S3_PREFIX).delete()
Konklusion
I dette indlæg demonstrerede vi, hvordan man effektivt finjusterer proteinsprogmodeller som ESM-2 til en videnskabeligt relevant opgave. For mere information om brug af Transformers og PEFT bibliotekerne til at træne pLMS, tjek indlæggene Dyb læring med proteiner , ESMBind (ESMB): Lav rangstilpasning af ESM-2 til forudsigelse af proteinbindingssted på Hugging Face-bloggen. Du kan også finde flere eksempler på brug af maskinlæring til at forudsige proteinegenskaber i Fantastisk proteinanalyse på AWS GitHub -depot.
Om forfatteren
Brian Loyal er senior AI/ML Solutions Architect i Global Healthcare and Life Sciences-teamet hos Amazon Web Services. Han har mere end 17 års erfaring inden for bioteknologi og maskinlæring og brænder for at hjælpe kunder med at løse genomiske og proteomiske udfordringer. I sin fritid nyder han at lave mad og spise sammen med sine venner og familie.
- SEO Powered Content & PR Distribution. Bliv forstærket i dag.
- PlatoData.Network Vertical Generative Ai. Styrk dig selv. Adgang her.
- PlatoAiStream. Web3 intelligens. Viden forstærket. Adgang her.
- PlatoESG. Kulstof, CleanTech, Energi, Miljø, Solenergi, Affaldshåndtering. Adgang her.
- PlatoHealth. Bioteknologiske og kliniske forsøgs intelligens. Adgang her.
- Kilde: https://aws.amazon.com/blogs/machine-learning/efficiently-fine-tune-the-esm-2-protein-language-model-with-amazon-sagemaker/
- :har
- :er
- :ikke
- $OP
- 07
- 1
- 100
- 17
- 20
- 2022
- 2023
- 22
- 28
- 3d
- 425
- 600
- 7
- 750
- 8
- a
- Om
- Konto
- Akkumuleret
- akkumulering
- nøjagtighed
- præcist
- Aktivering
- aktiveringer
- tilpasse
- tilpasning
- tilpasse
- tilføje
- adresse
- Tilføjer
- fremskreden
- AI / ML
- sigte
- Alle
- tillader
- sammen
- Alfabet
- også
- Amazon
- Amazon SageMaker
- Amazon Web Services
- beløb
- an
- analyse
- analysere
- ,
- En anden
- besvare
- enhver
- tilgang
- tilgange
- arkitektur
- ER
- AS
- At
- til rådighed
- undgå
- væk
- AWS
- tilbage
- afbalanceret
- BE
- fordi
- bag
- mellem
- skævhed
- større
- milliarder
- binding
- bioteknologi
- Blog
- krop
- låne
- både
- Brian
- bygge
- men
- by
- beregne
- beregner
- beregning
- kaldet
- CAN
- Kapacitet
- fange
- tilfælde
- tilfælde
- Årsag
- celle
- kæde
- kæder
- udfordre
- udfordringer
- tegn
- afgifter
- chatbots
- billigere
- kontrollere
- kemikalie
- klasse
- kode
- kombination
- Virksomheder
- beregning
- beregningsmæssige
- begrænsninger
- indeholder
- Beholdere
- indeholder
- Koste
- omkostningseffektiv
- kunne
- skabe
- oprettet
- skik
- Kunder
- data
- databaser
- datasæt
- falde
- er faldet
- definere
- definerede
- demonstrere
- demonstreret
- Afhængigt
- indsætte
- beskrevet
- Design
- Trods
- bestemmes
- udviklet
- Udvikling
- enhed
- diagram
- forskellige
- opdagelse
- drøftet
- Sygdom
- distribueret
- Dont
- ned
- downloading
- medicin
- Narkotika
- i løbet af
- hver
- effekt
- effektivt
- effektivitet
- effektiv
- effektivt
- enten
- andet
- muliggør
- kodning
- Endpoint
- enorm
- epoke
- epoker
- lige
- Lig
- især
- evaluering
- Endog
- at alt
- eksempel
- eksempler
- overstiger
- overdreven
- eksisterende
- dyrt
- erfaring
- eksperimenter
- ekspertise
- udforske
- ekstra
- Ansigtet
- familie
- hurtigere
- gennemførlig
- featured
- Funktionalitet
- få
- Figur
- filtrere
- Endelig
- Finde
- ende
- Fornavn
- efter
- Til
- Heldigvis
- Videresend
- fraktion
- Framework
- venner
- fra
- frosset
- funktion
- yderligere
- få
- GitHub
- given
- giver
- Global
- Go
- godt
- GPU
- GPU'er
- gradienter
- voksen
- sker
- Hardware
- Have
- he
- sundhedspleje
- Health Tech
- hjælpe
- hjælpe
- hjælper
- Høj
- høj kvalitet
- hans
- Hvordan
- How To
- Men
- HTML
- http
- HTTPS
- kæmpe
- KrammerFace
- menneskelig
- Hurt
- idé
- if
- illustrerer
- importere
- vigtigt
- forbedring
- in
- omfatter
- øget
- infektioner
- oplysninger
- indgange
- indvendig
- instans
- i stedet
- interagere
- ind
- spørgsmål
- IT
- Job
- Holde
- holde
- Nøgle
- Kingdom
- kendt
- Etiketter
- Sprog
- stor
- større
- læring
- mindre
- Lets
- biblioteker
- Bibliotek
- Livet
- Life Science
- Life Sciences
- ligesom
- GRÆNSE
- begrænsninger
- Limited
- Lives
- Lokalisering
- placeringer
- Lang
- lang tid
- off
- Lot
- Lav
- loyal
- maskine
- machine learning
- Maskiner
- lavet
- Flertal
- lave
- maerker
- håndterbar
- lykkedes
- mange
- massive
- max
- Maksimer
- maksimal
- Kan..
- betyder
- midler
- Hukommelse
- Flet
- metode
- metoder
- Metrics
- minut
- ML
- model
- modellering
- modeller
- molekylær
- mere
- mere effektiv
- flytning
- mRNA
- meget
- flere
- navn
- Natur
- nødvendig
- Behov
- behov
- net
- neurale
- neurale netværk
- Ny
- Ingen
- roman
- nummer
- objekt
- objekter
- of
- on
- ONE
- dem
- kun
- optimering
- optimeret
- or
- ordrer
- ordrer
- original
- oprindeligt
- Andet
- Andre
- Ellers
- vores
- ud
- udgange
- uden for
- i løbet af
- samlet
- egen
- parametre
- del
- passerer
- gennemløb
- lidenskabelige
- forbi
- Udfør
- udføres
- stykke
- plato
- Platon Data Intelligence
- PlatoData
- Leg
- plus
- mulig
- Indlæg
- Indlæg
- potentiale
- potentielt
- forudsige
- Forbered
- forhindre
- tidligere
- Problem
- Behandlet
- produceret
- projekt
- egenskaber
- Protein
- Proteiner
- giver
- offentlige
- sætte
- query
- Spørgsmål
- hurtigt
- rækkevidde
- rangerer
- nå
- realtid
- rimelige
- optegnelser
- reducere
- Reduceret
- reducerer
- reduktion
- regulært udtryk
- regioner
- relevant
- Fjern
- erstatte
- Repository
- repræsentere
- repræsenteret
- Krav
- forskere
- Ressourcer
- henholdsvis
- reagere
- ansvarlige
- Resultater
- afkast
- Anmeldelser
- højre
- roller
- Kør
- runtime
- sagemaker
- salg
- Gem
- Videnskab
- VIDENSKABER
- videnskabelig
- ridse
- script
- scripts
- sektioner
- se
- udvælgelse
- SELV
- senior
- forstand
- adskille
- Sequence
- Tjenester
- sæt
- flere
- vist
- Tilsvarende
- Simpelt
- simulere
- websted
- Størrelse
- størrelser
- lidt anderledes
- langsom
- opbremsninger
- lille
- mindre
- løsninger
- Løsninger
- SOLVE
- nogle
- Kilde
- specifikke
- hastighed
- delt
- standard
- starte
- state-of-the-art
- forblive
- støt
- Trin
- Steps
- opbevaring
- butik
- lagring
- Strategisk
- String
- struktur
- strukturer
- indsende
- tilstrækkeligt
- bord
- Tag
- tager
- mål
- mål
- Opgaver
- opgaver
- hold
- teknik
- teknikker
- prøve
- tekst
- end
- at
- deres
- Them
- selv
- derefter
- terapi
- Der.
- derfor
- Disse
- de
- ting
- denne
- tusinde
- Gennem
- tid
- gange
- til
- tokenisere
- også
- værktøjer
- fakkel
- I alt
- Tog
- uddannet
- Kurser
- Transform
- transformers
- retssag
- sand
- prøv
- tuning
- TUR
- typen
- typer
- typisk
- forstå
- UNAVNT
- unødvendig
- Opdatering
- opdateret
- opdatering
- us
- Brug
- USD
- brug
- anvendte
- bruger
- ved brug af
- sædvanlig
- værdi
- Værdier
- række
- meget
- via
- ønsker
- we
- web
- webservices
- GODT
- var
- Hvad
- hvornår
- hvorvidt
- som
- mens
- bred
- Bred rækkevidde
- bredt
- med
- uden
- Arbejde
- træning
- workflow
- ville
- skriftlig
- X
- år
- Du
- Din
- zephyrnet