Um aplicativo web chatbot + endpoints HTTP e WebSocket para inferência LLM com o cliente Petals
Você pode experimentar em https://chat.petals.dev ou executar o backend em seu servidor usando estes 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
? Quer servir o Lhama 2? Solicite acesso aos seus pesos no site ♾️ Meta AI e ? Model Hub e execute huggingface-cli login
no terminal antes de iniciar o aplicativo da web. Se você não quiser o Llama 2, basta remover os modelos meta-llama
do config.py.
? Implantando com Gunicorn. Na produção, recomendamos usar gunicorn em vez do servidor de desenvolvimento Flask:
gunicorn app:app --bind 0.0.0.0:5000 --worker-class gthread --threads 100 --timeout 1000
O bate-papo usa a API WebSocket nos bastidores.
O back-end fornece dois endpoints de APIs:
/api/v2/generate
, recomendado)/api/v1/...
)Use a API WebSocket sempre que possível - ela é muito mais rápida, mais poderosa e consome menos recursos.
Se você desenvolver seu próprio aplicativo web, poderá usar nosso endpoint em https://chat.petals.dev/api/...
para pesquisa e desenvolvimento e, em seguida, configurar seu próprio back-end para produção usando os comandos acima.
Observação: não recomendamos usar o endpoint em
https://chat.petals.dev/api/...
na produção. Tem um rendimento limitado e podemos pausá-lo ou interrompê-lo a qualquer momento.
Se você usar um servidor somente CPU, precisará de RAM suficiente para acomodar os embeddings de todos os modelos (veja a tabela abaixo).
Se sua CPU suportar AVX512, os embeddings serão carregados em 16 bits, caso contrário serão carregados em 32 bits (= 2x mais memória). Isso ocorre porque a multiplicação de pesos de 16 bits sem AVX512 é lenta e pode introduzir uma desaceleração de 1-2 segundos/token. O suporte AVX512 está disponível em CPUs Intel Xeon mais recentes (por exemplo, em droplets DigitalOcean com CPU dedicada).
Se você usar um servidor GPU, precisará de memória GPU suficiente para acomodar os embeddings de todos os modelos. Os embeddings serão carregados em 16 bits.
Você não precisa atender todos os modelos. Se você não tiver memória suficiente, remova alguns modelos em config.py.
Família modelo | Incorpora em 16 bits | Incorpora em 32 bits |
---|---|---|
Lhama 2 (70B, 70B-Chat), Lhama-65B, Guanaco-65B | 1,05GB | 2,1GB |
FLOR-176B, FLORZ-176B | 7,19GB | 14,38 GB |
/api/v2/generate
)Esta API implica que você abra uma conexão WebSocket e troque solicitações e respostas codificadas em JSON. Isso pode ser feito em qualquer linguagem de programação.
Este código abre uma sessão de inferência com o modelo stableai/StableBeluga2, envia o prompt "A cat sat on" e faz amostras de novos tokens até que o comprimento total atinja 30 tokens. A amostragem é feita com temperatura = 0,6 e 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 no Linux/macOS? Considere executar o cliente Petals nativo. Dessa forma, você pode se conectar diretamente ao enxame (sem esse endpoint da API) e até mesmo executar o ajuste fino.
As solicitações deverão seguir este protocolo:
A primeira solicitação deve ser do tipo open_inference_session e incluir estes parâmetros:
Notas:
Solicitar:
{ type : "open_inference_session" , max_length : 1024 }
Resposta:
{ ok : true } // If successful
{ ok : false , traceback : "..." } // If failed
As próximas solicitações devem ser do tipo generate e incluir os mesmos parâmetros da API HTTP /api/v1/generate. Em contraste com a API HTTP, você pode usar esta API no modo streaming, gerando uma resposta token por token e aceitando prompts intermediários de um usuário (por exemplo, para criar um chatbot).
Um novo recurso da API WebSocket é o parâmetro stop_sequence
(str, opcional). Se você configurá-lo, o servidor continuará a geração com os mesmos parâmetros, a menos que gere o stop_sequence
, então você poderá obter múltiplas respostas sem ter que enviar a solicitação novamente e aguardar a latência da viagem de ida e volta.
As respostas intermediárias contêm o campo stop: false
e a última resposta contém stop: true
. Por exemplo, você pode definir max_new_tokens: 1
e receber tokens um por um, assim que forem gerados. Confira o código frontend do chat para um exemplo detalhado de como fazer isso.
Solicitar:
{ type : "generate" , "inputs" : "A cat in French is "" , "max_new_tokens" : 3 }
Resposta (uma ou múltiplas):
{ ok : true , outputs : "chat"." , stop : true } // If successful
{ ok : false , traceback : "..." } // If failed
/api/v1/...
)Parâmetros:
Parâmetros de geração (compatíveis com .generate() de ? Transformers):
0
(padrão), executa a geração gananciosa. Se 1
, realiza amostragem com os parâmetros abaixo.Notas:
max_length
ou max_new_tokens
.do_sample=0
(padrão).do_sample=1, temperature=0.6, top_p=0.9
.Retorna (JSON):
ok == False
Exemplo (ondulação):
$ 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 " }