Petals 클라이언트와의 LLM 추론을 위한 챗봇 웹 앱 + HTTP 및 WebSocket 엔드포인트
https://chat.petals.dev 에서 사용해 보거나 다음 명령을 사용하여 서버에서 백엔드를 실행할 수 있습니다.
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
? Llama 2를 섬기고 싶으신가요? ♾️ Meta AI 웹사이트에서 가중치에 대한 액세스를 요청하고 ? Model Hub를 사용하고 웹 앱을 시작하기 전에 터미널에서 huggingface-cli login
실행하세요. Llama 2를 원하지 않는다면 config.py에서 meta-llama
모델을 제거하세요.
? Gunicorn을 사용하여 배포합니다. 프로덕션에서는 Flask 개발 서버 대신 gunicorn을 사용하는 것이 좋습니다.
gunicorn app:app --bind 0.0.0.0:5000 --worker-class gthread --threads 100 --timeout 1000
채팅은 내부적으로 WebSocket API를 사용합니다.
백엔드는 두 가지 API 엔드포인트를 제공합니다.
/api/v2/generate
, 권장)/api/v1/...
)가능하면 WebSocket API를 사용하십시오. 훨씬 빠르고 강력하며 리소스를 덜 소모합니다.
자체 웹 앱을 개발하는 경우 연구 및 개발을 위해 https://chat.petals.dev/api/...
에서 엔드포인트를 사용한 다음 위 명령을 사용하여 프로덕션용 백엔드를 설정할 수 있습니다.
참고: 프로덕션에서는
https://chat.petals.dev/api/...
의 엔드포인트를 사용하지 않는 것이 좋습니다. 처리량이 제한되어 있으므로 언제든지 일시중지하거나 중지할 수 있습니다.
CPU 전용 서버를 사용하는 경우 모든 모델의 임베딩에 맞는 충분한 RAM이 필요합니다(아래 표 참조).
CPU가 AVX512를 지원하는 경우 임베딩은 16비트로 로드되고, 그렇지 않으면 32비트(= 2배 더 많은 메모리)로 로드됩니다. 이는 AVX512 없이 16비트 가중치를 곱하는 것이 느리고 토큰당 1~2초의 속도 저하가 발생할 수 있기 때문입니다. AVX512 지원은 최신 Intel Xeon CPU(예: 전용 CPU가 있는 DigitalOcean 드롭릿)에서 사용할 수 있습니다.
GPU 서버를 사용하는 경우 모든 모델의 임베딩에 맞는 충분한 GPU 메모리가 필요합니다. 임베딩은 16비트로 로드됩니다.
모든 모델을 제공할 필요는 없습니다. 메모리가 부족하면 config.py에서 일부 모델을 제거하세요.
모델 패밀리 | 16비트에 포함 | 32비트에 포함 |
---|---|---|
라마 2(70B, 70B-채팅), Llama-65B, Guanaco-65B | 1.05GB | 2.1GB |
블룸-176B, 블룸Z-176B | 7.19GB | 14.38GB |
/api/v2/generate
)이 API는 WebSocket 연결을 열고 JSON으로 인코딩된 요청과 응답을 교환한다는 것을 의미합니다. 이는 모든 프로그래밍 언어에서 수행될 수 있습니다.
이 코드는 Stableai/StableBeluga2 모델을 사용하여 추론 세션을 열고 "A cat sat on"이라는 프롬프트를 보내고 총 길이가 30개 토큰에 도달할 때까지 새 토큰을 샘플링합니다. 샘플링은 온도 = 0.6 및 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 ( ) ;
}
} ;
} ;
? Linux/macOS에서 Python을 사용하시나요? 대신 기본 Petals 클라이언트 실행을 고려해 보세요. 이렇게 하면 이 API 엔드포인트 없이 직접 Swarm에 연결하고 미세 조정을 실행할 수도 있습니다.
요청은 다음 프로토콜을 따라야 합니다.
첫 번째 요청은 open_inference_session 유형이어야 하며 다음 매개변수를 포함해야 합니다.
참고:
요구:
{ type : "open_inference_session" , max_length : 1024 }
응답:
{ ok : true } // If successful
{ ok : false , traceback : "..." } // If failed
다음 요청은 생성 유형이어야 하며 /api/v1/generate HTTP API에서와 동일한 매개변수를 포함해야 합니다. HTTP API와 달리 이 API를 스트리밍 방식으로 사용하여 토큰별로 응답을 생성하고 사용자의 중간 프롬프트를 수락할 수 있습니다(예: 챗봇 만들기).
WebSocket API의 새로운 기능은 stop_sequence
매개변수(str, 선택 사항)입니다. 이를 설정하면 서버는 stop_sequence
를 생성하지 않는 한 동일한 매개변수를 사용하여 생성을 계속하므로 요청을 다시 보내고 왕복 대기 시간을 기다리지 않고도 여러 응답을 받을 수 있습니다.
중간 응답에는 stop: false
필드가 포함되고 마지막 응답에는 stop: true
포함됩니다. 예를 들어, max_new_tokens: 1
설정하고 토큰이 생성되자마자 토큰을 하나씩 받을 수 있습니다. 이를 수행하는 방법에 대한 자세한 예는 채팅의 프런트엔드 코드를 확인하세요.
요구:
{ type : "generate" , "inputs" : "A cat in French is "" , "max_new_tokens" : 3 }
응답(하나 또는 여러 개):
{ ok : true , outputs : "chat"." , stop : true } // If successful
{ ok : false , traceback : "..." } // If failed
/api/v1/...
)매개변수:
생성 매개변수(? Transformers의 .generate()와 호환 가능):
0
(기본값)인 경우 그리디 생성을 실행합니다. 1
인 경우 아래 매개변수를 사용하여 샘플링을 수행합니다.참고:
max_length
또는 max_new_tokens
를 지정해야 합니다.do_sample=0
(기본값)으로 시작하세요.do_sample=1, temperature=0.6, top_p=0.9
로 시작하세요.반환(JSON):
ok == False
인 경우 Python 역추적예(컬):
$ 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 " }