Eine Chatbot-Web-App + HTTP- und WebSocket-Endpunkte für LLM-Inferenz mit dem Petals-Client
Sie können es unter https://chat.petals.dev ausprobieren oder das Backend mit diesen Befehlen auf Ihrem Server ausführen:
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
? Möchten Sie Lama 2 servieren? Fordern Sie Zugriff auf seine Gewichte auf der ♾️ Meta AI-Website an und ? Model Hub, und führen Sie dann huggingface-cli login
im Terminal aus, bevor Sie die Web-App starten. Wenn Sie Llama 2 nicht möchten, entfernen Sie einfach die meta-llama
-Modelle aus config.py.
? Bereitstellung mit Gunicorn. In der Produktion empfehlen wir die Verwendung von gunicorn anstelle des Flask-Entwicklungsservers:
gunicorn app:app --bind 0.0.0.0:5000 --worker-class gthread --threads 100 --timeout 1000
Der Chat nutzt die WebSocket-API unter der Haube.
Das Backend stellt zwei API-Endpunkte bereit:
/api/v2/generate
, empfohlen)/api/v1/...
)Bitte verwenden Sie nach Möglichkeit die WebSocket-API – sie ist viel schneller, leistungsfähiger und verbraucht weniger Ressourcen.
Wenn Sie Ihre eigene Web-App entwickeln, können Sie unseren Endpunkt unter https://chat.petals.dev/api/...
für Forschung und Entwicklung nutzen und dann mit den oben genannten Befehlen Ihr eigenes Backend für die Produktion einrichten.
Hinweis: Wir empfehlen nicht, den Endpunkt unter
https://chat.petals.dev/api/...
in der Produktion zu verwenden. Der Durchsatz ist begrenzt und wir können ihn jederzeit pausieren oder stoppen.
Wenn Sie einen reinen CPU-Server verwenden, benötigen Sie genügend RAM, um Einbettungen für alle Modelle zu ermöglichen (siehe Tabelle unten).
Wenn Ihre CPU AVX512 unterstützt, werden die Einbettungen in 16-Bit geladen, andernfalls werden sie in 32-Bit geladen (= 2x mehr Speicher). Dies liegt daran, dass die Multiplikation von 16-Bit-Gewichten ohne AVX512 langsam ist und zu einer Verlangsamung von 1–2 Sekunden/Token führen kann. AVX512-Unterstützung ist auf neueren Intel Xeon-CPUs verfügbar (z. B. auf DigitalOcean-Droplets mit einer dedizierten CPU).
Wenn Sie einen GPU-Server verwenden, benötigen Sie genügend GPU-Speicher, um die Einbettungen für alle Modelle aufzunehmen. Die Einbettungen werden in 16-Bit geladen.
Sie müssen nicht alle Modelle bedienen. Wenn Sie nicht über genügend Speicher verfügen, entfernen Sie einige Modelle in config.py.
Modellfamilie | Einbettung in 16-Bit | Einbettung in 32-Bit |
---|---|---|
Lama 2 (70B, 70B-Chat), Lama-65B, Guanaco-65B | 1,05 GB | 2,1 GB |
BLOOM-176B, BLOOMZ-176B | 7,19 GB | 14,38 GB |
/api/v2/generate
)Diese API impliziert, dass Sie eine WebSocket-Verbindung öffnen und JSON-codierte Anfragen und Antworten austauschen. Dies kann aus jeder Programmiersprache erfolgen.
Dieser Code öffnet eine Inferenzsitzung mit dem Stabilityai/StableBeluga2-Modell, sendet die Eingabeaufforderung „A cat sit on“ und tastet neue Token ab, bis die Gesamtlänge 30 Token erreicht. Die Probenahme erfolgt mit Temperatur = 0,6 und 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 ( ) ;
}
} ;
} ;
? Verwenden Sie Python unter Linux/macOS? Bitte erwägen Sie stattdessen die Ausführung des nativen Petals-Clients. Auf diese Weise können Sie sich direkt (ohne diesen API-Endpunkt) mit dem Schwarm verbinden und sogar Feinabstimmungen durchführen.
Die Anfragen müssen diesem Protokoll folgen:
Die erste Anfrage muss vom Typ open_inference_session sein und die folgenden Parameter enthalten:
Hinweise:
Anfrage:
{ type : "open_inference_session" , max_length : 1024 }
Antwort:
{ ok : true } // If successful
{ ok : false , traceback : "..." } // If failed
Die nächsten Anforderungen müssen vom Typ „Generieren “ sein und dieselben Parameter wie in der HTTP-API /api/v1/generate enthalten. Im Gegensatz zur HTTP-API können Sie diese API im Streaming-Modus verwenden, indem Sie Token für Token eine Antwort generieren und Zwischenaufforderungen eines Benutzers akzeptieren (z. B. um einen Chatbot zu erstellen).
Eine neue Funktion der WebSocket-API ist der stop_sequence
Parameter (str, optional). Wenn Sie es festlegen, setzt der Server die Generierung mit denselben Parametern fort, es sei denn, er generiert stop_sequence
, sodass Sie möglicherweise mehrere Antworten erhalten, ohne die Anfrage erneut senden und auf die Latenz des Roundtrips warten zu müssen.
Zwischenantworten enthalten das Feld stop: false
und die letzte Antwort enthält stop: true
. Sie können beispielsweise max_new_tokens: 1
festlegen und Token einzeln erhalten, sobald sie generiert werden. Schauen Sie sich den Frontend-Code des Chats an, um ein detailliertes Beispiel dafür zu erhalten.
Anfrage:
{ type : "generate" , "inputs" : "A cat in French is "" , "max_new_tokens" : 3 }
Antwort (eine oder mehrere):
{ ok : true , outputs : "chat"." , stop : true } // If successful
{ ok : false , traceback : "..." } // If failed
/api/v1/...
)Parameter:
Generierungsparameter (kompatibel mit .generate() von ? Transformers):
0
(Standard), führt die gierige Generierung aus. Wenn 1
, wird die Probenahme mit den folgenden Parametern durchgeführt.Hinweise:
max_length
oder max_new_tokens
angeben.do_sample=0
(Standard).do_sample=1, temperature=0.6, top_p=0.9
.Rückgaben (JSON):
ok == False
Beispiel (Locke):
$ 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 " }