聊天机器人 Web 应用程序 + HTTP 和 WebSocket 端点,用于通过 Petals 客户端进行 LLM 推理
您可以在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,然后在启动 Web 应用程序之前在终端中运行huggingface-cli login
。如果您不需要 Llama 2,只需从 config.py 中删除meta-llama
模型即可。
?使用 Gunicorn 进行部署。在生产中,我们建议使用gunicorn而不是Flask开发服务器:
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 - 它更快、更强大并且消耗更少的资源。
如果您开发自己的 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 Droplet 上)。
如果您使用 GPU 服务器,则需要足够的 GPU 内存来适应所有模型的嵌入。嵌入将以 16 位加载。
您不必为所有模型提供服务。如果你没有足够的内存,请删除config.py中的一些模型。
模范家庭 | 嵌入 16 位 | 嵌入 32 位 |
---|---|---|
Llama 2(70B、70B-聊天)、Llama-65B、Guanaco-65B | 1.05GB | 2.1GB |
BLOOM-176B、BLOOMZ-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 客户端。这样,您可以直接连接到 swarm(无需此 API 端点),甚至可以运行微调。
请求必须遵循以下协议:
第一个请求必须是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
示例(卷曲):
$ 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 " }