Au lieu d'utiliser des services tels que ChatGPT, Amazon Bedrock, Google Bard - il existe plusieurs modèles de langage large open source qui peuvent être utilisés pour exécuter un chatbot localement, GPT4ALL est l'une de ces options.
Cela m'a amené à me demander s'il était possible d'exécuter un LLM dans la fonction AWS Lambda. Il s’agit généralement de fonctions petites, rapides à exécuter et pilotées par des événements. Ils ne sont pas destinés à être utilisés pour des tâches de traitement complexes, mais ils sont évolutifs et vous ne payez que pour ce que vous utilisez. Avoir un LLM dans une fonction Lambda semble une expérience amusante et un moyen d'avoir un modèle hébergé qui ne nécessite pas un processus de longue durée.
Ce référentiel contient du code permettant de créer une fonction d'exécution AWS Lambda personnalisée à l'aide d'une image de conteneur. Il peut également être exécuté localement dans Docker à des fins de test. La fonction contient le modèle LLM complet et le code pour utiliser le modèle, permettant la génération de texte de base à partir d'un appel HTTP.
Cela utilise :
Téléchargez un modèle GPT4ALL. Pour cela j'ai utilisé gpt4all-falcon-newbpe-q4_0.gguf car c'est un petit modèle (4Go...) qui a de bonnes réponses. D'autres modèles devraient fonctionner, mais ils doivent être suffisamment petits pour respecter les limites de mémoire Lambda.
Placez le fichier bin
dans le dossier function
, à côté du fichier lambda_function.py.
Construisez l'image avec docker : docker build --platform linux/amd64 -t makgpt:test1
.
Une fois construit, vous pouvez l'exécuter localement : docker run -p 9000:8080 makgpt:test1
Une fois exécuté, vous pouvez exécuter des invocations dans une autre fenêtre de terminal, telle que curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"body":"{"action":"Set fire to a tree"}"}'
Poussez l'image vers ECR dans votre compte AWS. Pour cela, vous pouvez suivre le guide AWS sous Deploying the image
dans le Guide du développeur. Les étapes simples sont les suivantes :
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
Créez une fonction Lambda à partir de cette image, en veillant à lui donner suffisamment de mémoire (10 Go recommandés) et un délai d'attente d'au moins 5 minutes.
Pour plus de simplicité, attribuez à la fonction Lambda une URL de fonction et vous pourrez ensuite l'accéder via HTTP.
Vous pouvez ensuite l'essayer avec l'URL telle que : curl "https://INSERTHERE.lambda-url.us-east-1.on.aws/" -d '{"body":"{"action":"Set fire to a tree"}"}'
Cette fonction est conçue comme un jeu d'aventure textuel de base avec l'invite :
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."
Temps pris : 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?"
Temps pris : 1m 1s