Une application Web de chatbot + des points de terminaison HTTP et WebSocket pour l'inférence LLM avec le client Petals
Vous pouvez l'essayer sur https://chat.petals.dev ou exécuter le backend sur votre serveur à l'aide de ces commandes :
git clone https://github.com/petals-infra/chat.petals.dev.git
cd chat.petals.dev
pip install -r requirements.txt
flask run --host=0.0.0.0 --port=5000
? Vous voulez servir Llama 2 ? Demandez l'accès à ses poids sur le site ♾️ Meta AI et ? Model Hub, puis exécutez huggingface-cli login
dans le terminal avant de démarrer l'application Web. Si vous ne voulez pas de Llama 2, supprimez simplement les modèles meta-llama
de config.py.
? Déploiement avec Gunicorn. En production, nous vous recommandons d'utiliser gunicorn au lieu du serveur de développement Flask :
gunicorn app:app --bind 0.0.0.0:5000 --worker-class gthread --threads 100 --timeout 1000
Le chat utilise l'API WebSocket sous le capot.
Le backend fournit deux points de terminaison d'API :
/api/v2/generate
, recommandé)/api/v1/...
)Veuillez utiliser l'API WebSocket lorsque cela est possible : elle est beaucoup plus rapide, plus puissante et consomme moins de ressources.
Si vous développez votre propre application Web, vous pouvez utiliser notre point de terminaison sur https://chat.petals.dev/api/...
pour la recherche et le développement, puis configurer votre propre backend pour la production à l'aide des commandes ci-dessus.
Remarque : Nous vous déconseillons d'utiliser le point de terminaison sur
https://chat.petals.dev/api/...
en production. Son débit est limité et nous pouvons le suspendre ou l'arrêter à tout moment.
Si vous utilisez un serveur uniquement CPU, vous avez besoin de suffisamment de RAM pour accueillir les intégrations de tous les modèles (voir le tableau ci-dessous).
Si votre CPU supporte AVX512, les embeddings seront chargés en 16 bits, sinon ils seront chargés en 32 bits (= 2x plus de mémoire). En effet, la multiplication de poids de 16 bits sans AVX512 est lente et peut introduire un ralentissement de 1 à 2 secondes/jeton. La prise en charge AVX512 est disponible sur les derniers processeurs Intel Xeon (par exemple, sur les droplets DigitalOcean avec un processeur dédié).
Si vous utilisez un serveur GPU, vous avez besoin de suffisamment de mémoire GPU pour s'adapter aux intégrations de tous les modèles. Les intégrations seront chargées en 16 bits.
Vous n'êtes pas obligé de servir tous les modèles. Si vous ne disposez pas de suffisamment de mémoire, supprimez certains modèles dans config.py.
Famille modèle | Incorporé en 16 bits | Incorporé en 32 bits |
---|---|---|
Lama 2 (70B, 70B-Chat), Lama-65B, Guanaco-65B | 1,05 Go | 2,1 Go |
BLOOM-176B, BLOOMZ-176B | 7,19 Go | 14,38 Go |
/api/v2/generate
)Cette API implique que vous ouvriez une connexion WebSocket et échangeiez des requêtes et des réponses codées en JSON. Cela peut être fait à partir de n’importe quel langage de programmation.
Ce code ouvre une session d'inférence avec le modèle stabilitéai/StableBeluga2, envoie l'invite « Un chat assis dessus » et échantillonne de nouveaux jetons jusqu'à ce que la longueur totale atteigne 30 jetons. L'échantillonnage se fait avec température = 0,6 et top_p = 0,9.
const ws = new WebSocket ( `wss://chat.petals.dev/api/v2/generate` ) ;
ws . onopen = ( ) => {
const prompt = "A cat sat on" ;
const maxLength = 30 ;
ws . send ( JSON . stringify ( {
type : "open_inference_session" , model : "stabilityai/StableBeluga2" , max_length : maxLength
} ) ) ;
ws . send ( JSON . stringify ( {
type : "generate" , inputs : prompt , max_length : maxLength , do_sample : 1 , temperature : 0.6 , top_p : 0.9
} ) ) ;
ws . onmessage = event => {
const response = JSON . parse ( event . data ) ;
if ( response . ok ) {
if ( response . outputs === undefined ) {
console . log ( "Session opened, generating..." ) ;
} else {
console . log ( "Generated: " + prompt + response . outputs ) ;
ws . close ( ) ;
}
} else {
console . log ( "Error: " + response . traceback ) ;
ws . close ( ) ;
}
} ;
} ;
? Vous utilisez Python sous Linux/macOS ? Veuillez plutôt envisager d'exécuter le client Petals natif. De cette façon, vous pouvez vous connecter directement à l’essaim (sans ce point de terminaison d’API) et même effectuer des réglages précis.
Les demandes doivent suivre ce protocole :
La première requête doit être de type open_inference_session et inclure ces paramètres :
Remarques :
Demande:
{ type : "open_inference_session" , max_length : 1024 }
Réponse:
{ ok : true } // If successful
{ ok : false , traceback : "..." } // If failed
Les requêtes suivantes doivent être de type generate et inclure les mêmes paramètres que dans l'API HTTP /api/v1/generate. Contrairement à l'API HTTP, vous pouvez utiliser cette API en mode streaming, en générant une réponse jeton par jeton et en acceptant les invites intermédiaires d'un utilisateur (par exemple, pour créer un chatbot).
Une nouvelle fonctionnalité de l'API WebSocket est le paramètre stop_sequence
(str, facultatif). Si vous le définissez, le serveur continuera la génération avec les mêmes paramètres à moins qu'il ne génère le stop_sequence
, vous pourrez donc obtenir plusieurs réponses sans avoir à renvoyer la requête et attendre la latence de l'aller-retour.
Les réponses intermédiaires contiennent le champ stop: false
et la dernière réponse contient stop: true
. Par exemple, vous pouvez définir max_new_tokens: 1
et recevoir les jetons un par un, dès qu'ils sont générés. Consultez le code frontal du chat pour un exemple détaillé de la façon de procéder.
Demande:
{ type : "generate" , "inputs" : "A cat in French is "" , "max_new_tokens" : 3 }
Réponse (une ou plusieurs) :
{ ok : true , outputs : "chat"." , stop : true } // If successful
{ ok : false , traceback : "..." } // If failed
/api/v1/...
)Paramètres :
Paramètres de génération (compatibles avec .generate() de ? Transformers) :
0
(par défaut), exécute une génération gourmande. Si 1
, effectue un échantillonnage avec les paramètres ci-dessous.Remarques :
max_length
ou max_new_tokens
.do_sample=0
(par défaut).do_sample=1, temperature=0.6, top_p=0.9
.Renvoie (JSON) :
ok == False
Exemple (boucle) :
$ curl -X POST " https://chat.petals.dev/api/v1/generate " -d " model=meta-llama/Llama-2-70b-chat-hf " -d " inputs=Once upon a time, " -d " max_new_tokens=20 "
{ " ok " :true, " outputs " : " there was a young woman named Sophia who lived in a small village nestled in the rolling hills " }