rwkv_lightning 批量推理教程
rwkv_lightning 是基于 Albatross、PyTorch 和 FastAPI 的 RWKV 批量推理后端。它原生支持 NVIDIA CUDA 与 AMD ROCm,并提供批量补全、OpenAI 风格聊天、State Cache、FIM 等 HTTP API。
实测在单张 RTX 5090 上进行 960 路并发推理时,吞吐量可以达到 10000+ token/s。
- 项目地址:RWKV-Vibe/rwkv_lightning
- 上游 API 文档:rwkv_lightning_api_doc.md
安装依赖
先克隆仓库并进入项目目录,再按显卡平台安装 PyTorch 和服务依赖。
git clone https://github.com/RWKV-Vibe/rwkv_lightning.git
cd rwkv_lightningpip install torch torchvision --index-url https://download.pytorch.org/whl/cu132
pip install fastapi pydantic ninja numpypip install torch torchvision --index-url https://download.pytorch.org/whl/rocm7.2
pip install fastapi pydantic ninja numpy启动服务
先选择与模型文件相匹配的推理引擎。普通 .pth 模型使用 FP16;GemLite 与 CUTLASS 需要先按上游仓库中的量化说明转换模型,二者的模型文件不能混用。
python app.py \
--model-path /path/to/model \
--inference-engine fp16 \
--port 8000 \
--password rwkv7_7.2bpython app.py \
--model-path /path/to/model-gemlite-int8 \
--inference-engine gemlite \
--port 8000 \
--password rwkv7_7.2bpython app.py \
--model-path /path/to/model-w8a16 \
--inference-engine cutlass \
--port 8000 \
--password rwkv7_7.2b| 参数 | 是否必需 | 默认值 | 说明 |
|---|---|---|---|
--model-path | 是 | 无 | 模型路径,可以带或不带 .pth 后缀 |
--inference-engine / --backend | 否 | fp16 | 可选 fp16、gemlite 或 cutlass |
--port | 否 | 8000 | HTTP 服务端口 |
--password | 否 | 不启用 | API 密码;省略后不校验密码 |
服务固定监听 0.0.0.0。终端出现 Uvicorn 启动信息后,可以运行仓库自带的测试脚本:
bash ./test/test_curl.sh如果服务需要暴露到公网,请启用密码并在反向代理或防火墙中限制访问。/v1/models 与 /translate/v1/batch-translate 当前不校验服务密码,不能只依赖应用层鉴权保护这两个端点。
API 文档
默认地址为 http://127.0.0.1:8000。所有 POST 请求都需要发送 Content-Type: application/json。普通端点通过请求主体中的 password 鉴权;/openai/v1/* 还支持 Authorization: Bearer <password>。
端点速览
| 方法 | 路径 | 用途 | 流式响应 |
|---|---|---|---|
GET | /v1/models | 查询当前加载的模型 | 否 |
POST | /v1/chat/completions | 原生多 prompt 批量补全 | 可选 |
POST | /v2/chat/completions | 使用 V2 采样器批量补全 | 可选 |
POST | /translate/v1/batch-translate | 批量翻译 | 否 |
POST | /FIM/v1/batch-FIM | FIM 批量补全 | 可选 |
POST | /big_batch/completions | 超大 batch 补全 | 始终流式 |
POST | /state/chat/completions | 单分支 State 会话补全 | 可选 |
POST | /multi_state/chat/completions | 可分叉的 State 会话补全 | 可选 |
POST | /state/status | 查询三级 State Cache | 否 |
POST | /state/delete | 删除 State Cache | 否 |
GET | /openai/v1/models | OpenAI 风格模型列表 | 否 |
POST | /openai/v1/chat/completions | OpenAI 风格单路聊天补全 | 可选 |
原生生成参数
下表适用于原生补全、State、FIM 等端点;专用端点只会读取与自身有关的字段。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
model | string | rwkv7 | 仅作为响应标签,不会切换已经加载的模型 |
contents | string[] | [] | prompt 数组 |
max_tokens | integer | 8192 | 每条结果最多生成的 token 数 |
stop_tokens | string[] | ["\nUser:"] | 文本停止序列;不是整数 token ID |
temperature | number | 1.0 | 采样温度 |
top_k | integer | 50 | Top-K |
top_p | number | 0.6 | Top-P |
alpha_presence | number | 2.0 | Presence repetition penalty |
alpha_frequency | number | 0.2 | Frequency repetition penalty |
alpha_decay | number | 0.996 | 重复惩罚衰减 |
stream | boolean | false | 是否返回 SSE |
chunk_size | integer | 4 | 流式输出累计多少 token 后刷新一次 |
password | string | null | null | 普通端点的 JSON 鉴权凭据 |
查询模型
/v1/models成功响应200application/json
objectstring始终返回dataarray<Model>始终返回收起子字段
idstring始终返回objectstring始终返回owned_bystring始终返回原生 V1 批量补全
/v1/chat/completions请求主体application/json
contentsarray<string>必填modelstring可选rwkv7max_tokensinteger可选8192stop_tokensarray<string>可选["\nUser:"]temperaturenumber可选1.0top_kinteger可选50top_pnumber可选0.6alpha_presencenumber可选2.0alpha_frequencynumber可选0.2alpha_decaynumber可选0.996streamboolean可选falsechunk_sizeinteger可选4passwordstring | null可选null成功响应200application/json非流式结构;流式请求返回 SSE。
idstring始终返回objectstring始终返回modelstring始终返回choicesarray<Choice>始终返回收起子字段
indexinteger始终返回messageobject始终返回收起子字段
rolestring始终返回contentstring始终返回finish_reasonstring始终返回原生 V2 批量补全
/v2/chat/completions请求主体application/json
contentsarray<string>必填modelstring可选rwkv7max_tokensinteger可选8192stop_tokensarray<string>可选["\nUser:"]temperaturenumber可选1.0top_kinteger可选500top_pnumber可选0.5alpha_presencenumber可选1.0alpha_frequencynumber可选0.1alpha_decaynumber可选0.99streamboolean可选falsechunk_sizeinteger可选4passwordstring | null可选null成功响应200application/json结构与 V1 相同,非流式 id 为 rwkv7-batch-v2。
idstring始终返回objectstring始终返回modelstring始终返回choicesarray<Choice>始终返回批量翻译
/translate/v1/batch-translate请求主体application/json
source_langstring可选autotarget_langstring必填text_listarray<string>必填placeholdersarray<string> | null可选null成功响应200application/json
translationsarray<Translation>始终返回收起子字段
detected_source_langstring始终返回textstring始终返回FIM 批量补全
/FIM/v1/batch-FIM请求主体application/json
prefixarray<string>必填suffixarray<string>必填modelstring可选rwkv7max_tokensinteger可选8192temperaturenumber可选1.0top_kinteger可选50top_pnumber可选0.6alpha_presence / alpha_frequency / alpha_decaynumber可选streamboolean可选falsechunk_sizeinteger可选4passwordstring | null可选null成功响应200application/json流式请求使用通用 batch SSE 格式。
idstring始终返回objectstring始终返回modelstring始终返回choicesarray<Choice>始终返回prefix 与 suffix 当前通过 zip 配对,长度不一致时多出的元素会被忽略。FIM 路由固定使用空停止序列,因此请求中的 stop_tokens 不生效。
超大 batch 补全
/big_batch/completions请求主体application/json
contentsarray<string>必填max_tokensinteger可选8192stop_tokensarray<string>可选["\nUser:"]temperaturenumber可选1.0chunk_sizeinteger可选4passwordstring | null可选null成功响应200text/event-stream即使 stream=false,此端点也始终返回 SSE。
choices[].indexinteger始终返回choices[].delta.contentstring始终返回[DONE]sentinel始终返回单分支 State 会话
/state/chat/completions请求主体application/json
session_idstring必填contentsarray<string>必填modelstring可选rwkv7max_tokensinteger可选8192stop_tokensarray<string>可选["\nUser:"]temperature / top_k / top_pnumber可选alpha_presence / alpha_frequency / alpha_decaynumber可选streamboolean可选falsechunk_sizeinteger可选4passwordstring | null可选null成功响应200application/json非流式结构与 V1 相同;流式请求使用通用 batch SSE。
idstring始终返回objectstring始终返回modelstring始终返回choicesarray<Choice>始终返回不要并发写入同一个 session_id。首次请求会创建零 State,后续请求会读取并更新同一 State;复用已有 State 时,服务会在没有前导空行的 prompt 前自动补上两个换行。
可分叉的 State 会话
/multi_state/chat/completions请求主体application/json
session_idstring必填dialogue_idxinteger必填0contentsarray<string>必填modelstring可选rwkv7max_tokensinteger可选8192stop_tokensarray<string>可选["\nUser:"]temperature / top_k / top_pnumber可选alpha_presence / alpha_frequency / alpha_decaynumber可选streamboolean可选falsechunk_sizeinteger可选4passwordstring | null可选null成功响应200application/json非流式响应直接返回新节点;流式响应会在 [DONE] 前发送新节点元数据。
idstring始终返回objectstring始终返回modelstring始终返回choicesarray<Choice>始终返回dialogue_idxinteger始终返回非零 dialogue_idx 必须已经存在,否则返回 404。若要从旧节点分叉,继续传入该旧节点的编号;服务会为新回复分配另一个编号,并将 State 保存为 <session_id>:<new_dialogue_idx>。
查询 State Cache
/state/status请求主体application/json
passwordstring | null可选null成功响应200application/json
statusstring始终返回total_sessionsinteger始终返回l1_cache_countinteger始终返回l2_cache_countinteger始终返回database_countinteger始终返回sessionsarray<Session>始终返回收起子字段
session_idstring始终返回cache_levelstring始终返回last_updatedstring始终返回timestampnumber始终返回删除 State Cache
/state/delete请求主体application/json
session_idstring必填delete_prefixboolean可选falsepasswordstring | null可选null成功响应200application/json
statusstring始终返回messagestring始终返回未找到404application/json未找到精确会话且 delete_prefix=false 时返回。
statusstring始终返回messagestring始终返回OpenAI 风格模型列表
/openai/v1/models请求头
AuthorizationstringHEADER可能返回成功响应200application/json
objectstring始终返回dataarray<Model>始终返回收起子字段
idstring始终返回objectstring始终返回owned_bystring始终返回OpenAI 风格聊天补全
/openai/v1/chat/completions请求头
AuthorizationstringHEADER可能返回请求主体application/jsonmessages、system 或 contents 至少需要提供一段有效文本。
messagesarray<Message>可选收起子字段
rolesystem | developer | user | assistant必填contentstring | array<TextPart>必填systemstring | null可选nullcontentsarray<string>可选[]modelstring可选rwkv7max_tokensinteger可选4096stop_tokensarray<string>可选["\nUser:"]temperaturenumber可选1.0top_kinteger可选20top_pnumber可选0.6alpha_presencenumber可选1.0alpha_frequencynumber可选0.1alpha_decaynumber可选0.996enable_thinkboolean可选falseuse_prefix_cacheboolean可选truestreamboolean可选falsechunk_sizeinteger | null可选nullpasswordstring | null可选null成功响应200application/json非流式响应;流式请求返回 chat.completion.chunk。
idstring始终返回objectstring始终返回createdinteger始终返回modelstring始终返回choicesarray<Choice>始终返回收起子字段
indexinteger始终返回messageobject始终返回收起子字段
rolestring始终返回contentstring始终返回finish_reasonstring始终返回usageobject始终返回收起子字段
prompt_tokensinteger始终返回completion_tokensinteger始终返回total_tokensinteger始终返回当前 OpenAI 风格端点只处理文本形式的 system、developer、user 与 assistant 消息,不支持图片、音频、工具调用或结构化输出。use_prefix_cache 是自动复用匹配的 prompt 前缀,与显式 session_id 的 State 会话不同。
流式响应与常见错误
原生 V1、V2、State、FIM 和 big-batch 使用项目自有的轻量 SSE 格式;只有 /openai/v1/chat/completions 返回 OpenAI 风格的 ID、role chunk 和结束原因。两种流式响应都以 data: [DONE] 结束。
| HTTP 状态码 | 常见原因 |
|---|---|
400 | 请求 batch 超过 prefill 上限、缺少 session_id / dialogue_idx,或 JSON 无效 |
401 | 服务启用了密码,但凭据缺失或错误 |
404 | State 或对话分支不存在 |
422 | FastAPI / Pydantic 字段校验失败 |
499 | 非流式请求完成前客户端已经断开连接 |
500 | 推理或服务内部错误 |
客户端断开连接后,服务会取消排队或正在运行的生成。流式请求在 prefill 队列阶段超出 batch 上限时,错误也可能以 SSE data: 事件返回。
鸣谢
感谢 Triang-jyed-driung 提供的 Rapid-Sampling 内核,它还包含兼容 ROCm 的原生 HIP 内核。