Petals Chat
一个用于 LLM 推理的聊天机器人web 应用 + HTTP 和 WebSocket 端点,使用 Petals 客户端
互动聊天
你可以在 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。
APIs
后端提供两个 API 端点:
- WebSocket API (
/api/v2/generate
, 推荐) - HTTP API (
/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 上可用 (例如,DigitalOcean 的专用 CPU 云主机)。
-
如果你使用 GPU 服务器,你需要足够的 GPU 内存来适应所有模型的嵌入。 嵌入将以 16 位加载。
-
你不必服务所有模型。如果你没有足够的内存,请从 config.py 中移除一些模型。
模型家族 | 16 位嵌入 | 32 位嵌入 |
---|---|---|
Llama 2 (70B, 70B-Chat), Llama-65B, Guanaco-65B | 1.05 GB | 2.1 GB |
BLOOM-176B, BLOOMZ-176B | 7.19 GB | 14.38 GB |
WebSocket API (/api/v2/generate
)
这个 API 需要你打开一个 WebSocket 连接并交换 JSON 编码的请求和响应。 可以使用任何编程语言进行。
示例代码(Javascript)
这段代码使用 stabilityai/StableBeluga2 模型打开一个推理会话,发送提示 "A cat sat on",并采样新标记直到总长度达到 30 个标记。采样使用 temperature = 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? 请考虑运行 native Petals client。 这样,你可以直接连接到群集(无需此 API 端点),甚至进行微调。
请求必须遵循此协议:
open_inference_session
第一个请求必须是类型 open_inference_session 并包含以下参数:
- model (str) - config.py 中定义的模型库中的一个模型。 如果你加载一个带适配器的模型,请在此处使用适配器库。
- max_length (int) - 生成文本的最大长度(包括前缀和中间输入)以标记为单位。
注意事项:
- 此请求创建的推理会话是此 WebSocket 连接唯一的,不能在其他连接中重用。
- 连接关闭(无论是优雅关闭还是突然关闭)时,会话会自动关闭。
- 由于其 license 限制,我们不提供 Falcon-180B 的 API。
请求:
{type: "open_inference_session", max_length: 1024}
响应:
{ok: true} // 成功时
{ok: false, traceback: "..."} // 失败时
generate
接下来的请求必须是类型 generate 并包含与 /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} // 成功时
{ok: false, traceback: "..."} // 失败时
HTTP API (/api/v1/...
)
POST /api/v1/generate
参数:
- model (str) - config.py 中定义的模型库中的一个模型。 如果你加载一个带适配器的模型,请在此处使用适配器库。
- inputs (str, 可选) - 新的用户输入。如果你在推理会话中继续生成,可以省略(见下文)。
- max_length (int) - 生成文本的最大长度(包括前缀)以标记为单位。
- max_new_tokens (int) - 新生成标记的最大数量(不包括前缀)。
生成参数(兼容于 🤗 Transformers 的 .generate()):
- do_sample (bool, 可选) - 如果为
0
(默认),运行 贪心生成。 如果为1
,使用以下参数执行 采样。 - temperature (float, 可选) - 采样温度。
- top_k (int, 可选) - Top-k 采样。
- top_p (float, 可选) - Top-p(核)采样。
- repetition_penalty (float, 可选) - 重复惩罚,见 论文。
注意事项:
- 你需要指定
max_length
或max_new_tokens
其中之一。 - 如果你想在零样本模式下解决下游任务,请从
do_sample=0
(默认)开始。 - 如果你想制作一个聊天机器人或编写长文本,请从
do_sample=1, temperature=0.6, top_p=0.9
开始。 - 由于其 license 限制,我们不提供 Falcon-180B 的 API。
返回(JSON):
- ok (bool)
- outputs (str)
- traceback (str) - 如果
ok == False
,则返回 Python 追溯信息
示例(curl):
$ 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"}