Anstatt Dienste wie ChatGPT, Amazon Bedrock, Google Bard zu nutzen – es gibt mehrere große Open-Source-Sprachmodelle, mit denen ein Chatbot lokal ausgeführt werden kann, ist GPT4ALL eine solche Option.
Dies veranlasste mich zu der Frage, ob es möglich sei, ein LLM innerhalb der AWS Lambda-Funktion auszuführen. Dabei handelt es sich in der Regel um kleine, schnell auszuführende, ereignisgesteuerte Funktionen. Sie sind nicht für komplexe Verarbeitungsaufgaben gedacht, aber sie lassen sich auf Null skalieren und Sie zahlen nur für das, was Sie nutzen. Ein LLM in einer Lambda-Funktion zu haben, scheint ein unterhaltsames Experiment und eine Möglichkeit zu sein, ein gehostetes Modell zu haben, das keinen langwierigen Prozess erfordert.
Dieses Repository enthält Code zum Erstellen einer benutzerdefinierten AWS Lambda-Laufzeitfunktion mithilfe eines Container-Images. Es kann zum Testen auch lokal in Docker ausgeführt werden. Die Funktion enthält das vollständige LLM-Modell und den Code zur Verwendung des Modells und ermöglicht die einfache Textgenerierung aus einem HTTP-Aufruf hinein.
Dies verwendet:
Laden Sie ein GPT4ALL-Modell herunter. Hierfür habe ich gpt4all-falcon-newbpe-q4_0.gguf verwendet, da es sich um ein kleines Modell (4 GB...) handelt, das gute Antworten hat. Andere Modelle sollten funktionieren, sie müssen jedoch klein genug sein, um in die Lambda-Speichergrenzen zu passen.
Platzieren Sie die bin
Datei im function
neben der Datei lambda_function.py.
Erstellen Sie das Image mit Docker: docker build --platform linux/amd64 -t makgpt:test1
.
Sobald es erstellt ist, können Sie es lokal ausführen: docker run -p 9000:8080 makgpt:test1
Sobald es ausgeführt wird, können Sie Aufrufe dafür in einem anderen Terminalfenster ausführen, z. B. curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"body":"{"action":"Set fire to a tree"}"}'
Übertragen Sie das Bild per Push an ECR in Ihrem AWS-Konto. Hierzu können Sie dem AWS-Leitfaden unter Deploying the image
im Entwicklerhandbuch folgen. Die einfachen Schritte sind:
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
aws ecr create-repository --repository-name hello-world --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
docker tag docker-image:test :latest
docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
Erstellen Sie aus diesem Image eine Lambda-Funktion und stellen Sie sicher, dass genügend Speicher (10 GB empfohlen) und ein Timeout von mindestens 5 Minuten vorhanden ist.
Geben Sie der Lambda-Funktion der Einfachheit halber eine Funktions-URL und Sie können sie dann über HTTP aufrufen.
Sie können es dann mit der URL versuchen curl "https://INSERTHERE.lambda-url.us-east-1.on.aws/" -d '{"body":"{"action":"Set fire to a tree"}"}'
z. B.: curl "https://INSERTHERE.lambda-url.us-east-1.on.aws/" -d '{"body":"{"action":"Set fire to a tree"}"}'
Diese Funktion ist als einfaches Text-Adventure-Spiel mit der Eingabeaufforderung vorbereitet:
You are a Text-Based Fantasy RPG. The player is exploring the dark forest and you are the dungeon master. The player performs the action: {action} What happens next? You are talking to the player.
{
"action": "Throw your sword at the angry orc"
}
"nAs the player throws their sword at the angry orc, it strikes true and lands squarely in its chest. The orc roars in pain and anger, charging towards the player with a fierce look in its eyes.nnThe player quickly dodges out of the way, but not before noticing something strange about the orc's eyes. They seem to be glowing with an otherworldly light, as if they are possessed by some dark force.nnWith the orc now dangerously close, the player decides to take a risk and try to reason with it. "Stop! I mean you no harm," they say, holding out their hands in a gesture of peace.nnTo their surprise, the orc seems to understand them and hesitates for a moment before continuing its attack. The player quickly grabs their sword and prepares to defend themselves if necessary.nnAs the fight continues, it becomes clear that this orc is not like any other they have faced before. Its movements are unnaturally quick and its strength is unmatched. But with each blow of the sword, the player gains a little more confidence in their abilities.nnFinally, after what seems like an eternity, the orc falls to the ground, defeated."
Zeitaufwand: 1m 33s
{
"action": "A wizard casts a spell on the player and turns them into a pencil"
}
"nAs the wizard finishes casting his spell, the player suddenly finds themselves transformed into a pencil. They look down at their new form in confusion before noticing that they are no longer holding the wand they were using to cast spells.nnThe player tries to move around, but find that they are unable to do so without making a noise. They try to speak, but find that they cannot make any sounds with their new pencil body.nnSuddenly, they hear a voice from behind them. "Well, well, well. Look who we have here." The player turns around to see the wizard who cast the spell on them.nnThe wizard chuckles at the player's transformation and begins to speak in a mocking tone. "I bet you didn't expect this when you decided to mess with magic, did you?"nnThe player tries to respond, but finds that they are unable to do so without making any noise. They feel helpless and frustrated as they try to come up with a plan to escape their new form.nnWhat will the player do next?"
Zeitaufwand: 1m 1s