Una aplicación web de chatbot + puntos finales HTTP y WebSocket para inferencia LLM con el cliente Petals
Puedes probarlo en https://chat.petals.dev o ejecutar el backend en tu servidor usando estos comandos:
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
? ¿Quieres servir Llama 2? Solicite acceso a sus pesos en el ♾️ sitio web de Meta AI y ? Model Hub, luego ejecute huggingface-cli login
en la terminal antes de iniciar la aplicación web. Si no quieres Llama 2, simplemente elimina los modelos de meta-llama
de config.py.
? Implementando con Gunicorn. En producción, recomendamos usar gunicorn en lugar del servidor de desarrollo Flask:
gunicorn app:app --bind 0.0.0.0:5000 --worker-class gthread --threads 100 --timeout 1000
El chat utiliza la API WebSocket internamente.
El backend proporciona dos puntos finales de API:
/api/v2/generate
, recomendado)/api/v1/...
)Utilice la API WebSocket cuando sea posible: es mucho más rápida, más potente y consume menos recursos.
Si desarrolla su propia aplicación web, puede usar nuestro punto final en https://chat.petals.dev/api/...
para investigación y desarrollo, luego configurar su propio backend para producción usando los comandos anteriores.
Nota: No recomendamos utilizar el punto final en
https://chat.petals.dev/api/...
en producción. Tiene un rendimiento limitado y podemos pausarlo o detenerlo en cualquier momento.
Si utiliza un servidor que solo utiliza CPU, necesitará suficiente RAM para incorporar incrustaciones en todos los modelos (consulte la tabla a continuación).
Si su CPU admite AVX512, las incrustaciones se cargarán en 16 bits; de lo contrario, se cargarán en 32 bits (= 2 veces más memoria). Esto se debe a que multiplicar pesos de 16 bits sin AVX512 es lento y puede introducir una desaceleración de 1 a 2 segundos por token. La compatibilidad con AVX512 está disponible en las últimas CPU Intel Xeon (por ejemplo, en droplets DigitalOcean con una CPU dedicada).
Si utiliza un servidor GPU, necesitará suficiente memoria GPU para adaptarse a las incrustaciones de todos los modelos. Las incrustaciones se cargarán en 16 bits.
No es necesario servir a todos los modelos. Si no tiene suficiente memoria, elimine algunos modelos en config.py.
Familia modelo | Incrustado en 16 bits | Incrustado en 32 bits |
---|---|---|
Llama 2 (70B, 70B-Chat), Llama-65B, Guanaco-65B | 1,05GB | 2,1GB |
FLOR-176B, FLORZ-176B | 7,19GB | 14,38GB |
/api/v2/generate
)Esta API implica que abra una conexión WebSocket e intercambie solicitudes y respuestas codificadas en JSON. Esto se puede hacer desde cualquier lenguaje de programación.
Este código abre una sesión de inferencia con el modelo stableai/StableBeluga2, envía el mensaje "Un gato se sentó" y toma muestras de nuevos tokens hasta que la longitud total alcanza los 30 tokens. El muestreo se realiza con temperatura = 0,6 y 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 ( ) ;
}
} ;
} ;
? ¿Usando Python en Linux/macOS? Considere ejecutar el cliente nativo de Petals en su lugar. De esta manera, puede conectarse al enjambre directamente (sin este punto final API) e incluso ejecutar ajustes.
Las solicitudes deberán seguir este protocolo:
La primera solicitud debe ser de tipo open_inference_session e incluir estos parámetros:
Notas:
Pedido:
{ type : "open_inference_session" , max_length : 1024 }
Respuesta:
{ ok : true } // If successful
{ ok : false , traceback : "..." } // If failed
Las siguientes solicitudes deben ser de tipo generar e incluir los mismos parámetros que en la API HTTP /api/v1/generate. A diferencia de la API HTTP, puede utilizar esta API en forma de transmisión, generando una respuesta token por token y aceptando indicaciones intermedias de un usuario (por ejemplo, para crear un chatbot).
Una nueva característica de la API WebSocket es el parámetro stop_sequence
(cadena, opcional). Si lo configura, el servidor continuará la generación con los mismos parámetros a menos que genere stop_sequence
, por lo que puede obtener múltiples respuestas sin tener que enviar la solicitud nuevamente y esperar la latencia del viaje de ida y vuelta.
Las respuestas intermedias contienen el campo stop: false
y la última respuesta contiene stop: true
. Por ejemplo, puede configurar max_new_tokens: 1
y recibir tokens uno por uno, tan pronto como se generen. Consulte el código de interfaz del chat para ver un ejemplo detallado de cómo hacerlo.
Pedido:
{ type : "generate" , "inputs" : "A cat in French is "" , "max_new_tokens" : 3 }
Respuesta (una o varias):
{ ok : true , outputs : "chat"." , stop : true } // If successful
{ ok : false , traceback : "..." } // If failed
/api/v1/...
)Parámetros:
Parámetros de generación (compatibles con .generate() de ? Transformers):
0
(predeterminado), ejecuta la generación codiciosa. Si es 1
, realiza el muestreo con los parámetros siguientes.Notas:
max_length
o max_new_tokens
.do_sample=0
(predeterminado).do_sample=1, temperature=0.6, top_p=0.9
.Devoluciones (JSON):
ok == False
Ejemplo (rizo):
$ 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 " }