Petals クライアントによる LLM 推論のためのチャットボット Web アプリ + 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
?ラマ 2 に仕えてみませんか? ♾️ Meta AI Web サイトで重みへのアクセスをリクエストします。 Model Hub を起動し、Web アプリを開始する前にターミナルでhuggingface-cli login
実行します。 Llama 2 が不要な場合は、config.py からmeta-llama
モデルを削除してください。
?ガニコーンで展開。運用環境では、Flask 開発サーバーの代わりに gunicorn を使用することをお勧めします。
gunicorn app:app --bind 0.0.0.0:5000 --worker-class gthread --threads 100 --timeout 1000
チャットは内部で WebSocket API を使用します。
バックエンドは 2 つの API エンドポイントを提供します。
/api/v2/generate
、推奨)/api/v1/...
)可能な場合は WebSocket API を使用してください。WebSocket API の方がはるかに高速で強力で、消費するリソースが少なくなります。
独自の Web アプリを開発する場合は、研究と開発に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-チャット)、ラマ-65B、グアナコ-65B | 1.05GB | 2.1GB |
BLOOM-176B、BLOOMZ-176B | 7.19GB | 14.38GB |
/api/v2/generate
)この API は、WebSocket 接続を開いて、JSON エンコードされたリクエストとレスポンスを交換することを意味します。これは任意のプログラミング言語から実行できます。
このコードは、stableai/StableBeluga2 モデルとの推論セッションを開き、プロンプト「A cat sit 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
次のリクエストは、 generateタイプである必要があり、/api/v1/generate HTTP API と同じパラメータが含まれている必要があります。 HTTP API とは対照的に、この API をストリーミング形式で使用し、トークンごとに応答を生成し、ユーザーからの中間プロンプトを受け入れることができます (チャットボットを作成するためなど)。
WebSocket API の新機能はstop_sequence
パラメーター (str、オプション) です。これを設定すると、サーバーはstop_sequence
生成しない限り同じパラメーターで生成を続行するため、リクエストを再送信してラウンドトリップの待ち時間を待つことなく、複数のレスポンスを取得できる可能性があります。
中間応答にはフィールドstop: false
が含まれ、最後の応答にはstop: true
が含まれます。たとえば、 max_new_tokens: 1
に設定すると、トークンが生成されたらすぐに 1 つずつ受け取ることができます。その方法の詳細な例については、チャットのフロントエンド コードを確認してください。
リクエスト:
{ type : "generate" , "inputs" : "A cat in French is "" , "max_new_tokens" : 3 }
応答 (1 つまたは複数):
{ 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 " }