Distribuering av GPT-NeoX 20B i produktion och fokus på Deepspeed

Att distribuera GPT-NeoX 20B i produktion är en utmaning och vi lärde oss det på det hårda sättet på NLP Cloud... I den här artikeln berättar vi mer om flera knep som rör användningen av GPT-NeoX 20B, och särskilt hur man hanterar DeepSpeed i produktionen.

GPT-NeoX

GPT-NeoX 20B

GPT-NeoX 20B är den största öppen källkodsmodellen för behandling av naturliga språk i skrivande stund.

Den släpptes av EleutherAI för två veckor sedan. Den har tränats på 20 miljarder parametrar efter ett års hårt arbete med många utmaningar. En av deras största svårigheter verkade vara förmågan att sätta upp en ordentlig parallell arkitektur så att modellen kan tränas effektivt på flera GPU:er.

Deras tidigare modell, GPT-J, tränades på Googles TPU:er och utformades för att användas på TPU:er. GPT-NeoX 20B:s inre arkitektur är radikalt annorlunda och är gjord för att användas på GPU:er. Tanken är att den ska vara den första i en serie ännu större modeller (målet här är att komma ikapp GPT-3).

GPT-NeoX 20 är en modell för textgenerering, vilket innebär att den kan skriva text åt dig och faktiskt uppnå nästan alla användningsområden för Natural Language Processing med stor noggrannhet: generering av blogginlägg, chatbots, textklassificering, sentimentanalys, utvinning av nyckelord, kodgenerering, utvinning av entiteter, klassificering av intentioner, frågesvar och mycket mer...

Många forskare och företag kommer utan tvekan att utnyttja denna nya modell och få fantastiska resultat. Men det finns en utmaning: hur ska GPT-NeoX 20B användas?

Maskinvarukrav

Den första utmaningen när man försöker använda GPT-NeoX 20B i produktionen är den avancerade maskinvara som krävs.

Det var fortfarande möjligt att använda GPT-J på konsumentmaskinvara, även om det var mycket dyrt. Du kan till exempel använda den på en mycket bra CPU (även om resultatet är smärtsamt långsamt) eller på en avancerad spel-GPU som NVIDIA RTX 3090. Men GPT-NeoX 20B är så stor att det inte längre är möjligt.

I princip kräver GPT-NeoX minst 42 GB VRAM och 40 GB diskutrymme (och ja, vi talar om den smala fp16-versionen här). Få GPU:er uppfyller dessa krav. De viktigaste är NVIDIA A100, A40 och RTX A6000.

Dessa GPU:er är inte bara mycket dyra, utan det är också svårt att få tag på en av dem i dag på grund av den globala bristen på halvledare.

Den bästa lösningen här är att välja en arkitektur med flera grafikprocessorer.

Multi-GPU med Deepspeed

Om du inte kan få plats med din modell på en enda GPU kan du försöka dela upp den på flera GPU:er.

Det är ett intressant alternativ av två skäl. För det första är det ofta billigare att skala en infrastruktur horisontellt än vertikalt. Det gäller för servrar och det gäller även för GPU:er. För det andra är det lättare att få tag på flera små GPU:er som NVIDIA Tesla T4 än större GPU:er som NVIDIA A40.

Tyvärr är det en teknisk utmaning att dela upp en maskininlärningsmodell på flera GPU:er. Hugging Face har gjort en bra artikel om modellparallellism och de val du har. Läs den här. Men som tur är har EleutherAI konstruerat GPT-NeoX 20B så att den enkelt kan parallelliseras på flera GPU:er, oavsett om det gäller träning eller inferens.

GPT-NeoX-arkitekturen är baserad på Deepspeed. Deepspeed är ett ramverk från Microsoft som ursprungligen utformades för att parallellisera träningar mellan flera GPU:er, men det används mer och mer även för inferenser. EleutherAI gjorde allt det hårda arbetet, så parallellisering av GPT-NeoX är lika enkelt som att ändra ett nummer i en konfigurationsfil.

GPT-NeoX-parallellism
Extract from the GPT-NeoX docs about parallelism

Det är dock svårt att distribuera Deepspeed i produktion för online-inferens via ett API... Deepspeed har inte utformats för att lätt integreras i webbservrar. På NLP Cloud fick vi lära oss det på det hårda sättet, men efter hårt arbete lyckades vi till slut hitta ett effektivt sätt att få Deepspeed och GPT-NeoX att fungera bakom vårt API.

Tricks för användning

Låt oss anta att du lyckades tillhandahålla rätt maskinvara och korrekt distribuera GPT-NeoX 20B med Deepspeed. Det finns nu ett par förbehåll som du bör vara medveten om.

För det första har parametrarna (top k, top p och temperatur) inte samma effekter på modellen som i GPT-J. Så om du har lyckats hitta en bra konfiguration för GPT-J ska du inte ta det för givet: du måste göra nya tester med GPT-NeoX.

Sist men inte minst kommer det att krävas mer minne än de 42 GB som nämns ovan, även om ingångsstorleken kan ökas till 2048 tokens...

Batch-inferens?

GPT-modeller är ganska långsamma, och GPT-NeoX 20B är inget undantag. Så för att förbättra genomströmningen i din applikation kanske du vill arbeta med en lösning för batchinferens.

För tillfället har vi på NLP Cloud inte hittat någon bra lösning för detta.

GPT-NeoX-koden är utformad så att man kan utföra flera slutsatser samtidigt i en enda begäran. Men i våra tester ökade svarstiden linjärt med antalet inferenser, vilket på sätt och vis motverkar syftet med batch-inferenser...

Slutsats

GPT-NeoX 20B är definitivt svårt att använda i produktionen. Kvaliteten på textgenereringen är fantastisk, men få kommer att ha kapacitet att faktiskt installera denna modell.

Det verkar som om lösningen mer än någonsin kommer att vara att förlita sig på en molntjänst som NLP Cloud för att kunna använda denna modell.

Om du har synpunkter på den här artikeln, tveka inte att kontakta oss, det skulle vara roligt att höra din åsikt om detta!

Julien Salinas
CTO på NLP Cloud