42e3aea6
tangwang
tidy
|
1
2
|
# Reranker 模块
|
5c21a485
tangwang
qwen3-reranker-0....
|
3
|
**请求示例**见 `docs/QUICKSTART.md` §3.5。扩展规范见 `docs/DEVELOPER_GUIDE.md` §7。部署与调优实战见 `reranker/DEPLOYMENT_AND_TUNING.md`。`ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF` 的专项接入与调优结论见 `reranker/GGUF_0_6B_INSTALL_AND_TUNING.md`。
|
42e3aea6
tangwang
tidy
|
4
5
|
---
|
d90e7428
tangwang
补充重排
|
6
|
|
3d508beb
tangwang
reranker-4b-gguf
|
7
|
Reranker 服务提供统一的 `/rerank` API,支持可插拔后端(BGE、Qwen3-vLLM、Qwen3-Transformers、Qwen3-GGUF、DashScope 云重排)。调用方通过 HTTP 访问,不关心具体后端。
|
701ae503
tangwang
docs
|
8
|
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
9
10
11
12
13
14
15
16
17
18
19
20
21
|
## 当前结论
在当前项目的线上形态里,**首选后端是 `qwen3_vllm_score`**,**次选后端是 `qwen3_vllm`**。
原因不是“`LLM.score()` 理论上更高级”,而是这轮优化后,`qwen3_vllm_score` 在当前硬件和依赖栈上形成了一套更干净、更稳定、也更快的组合:
- 模型:`Qwen/Qwen3-Reranker-0.6B`
- GPU:Tesla T4 16GB
- CUDA:12.8
- PyTorch:`2.10.0+cu128`
- vLLM-score 环境:`vllm==0.18.0`
- attention:**由 vLLM 运行时自动选择**后端实现;在已验证的 T4 栈上日志可见 **`FLASHINFER`**
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
22
23
24
25
26
27
28
29
30
31
32
|
## 后端总览
| 后端 | 当前定位 | 结论 |
|------|----------|------|
| `qwen3_vllm_score` | 主推荐 | 走 vLLM **`LLM.score()`** 的 **pooling / classify** 路径:对每条 (query, doc) **直接产出相关分**,不经 causal LM 的整步 **generate**。相对 **`qwen3_vllm`**(`generate(max_tokens=1)` + **yes/no** 的 logprob 推导),**省去**每对样本上**大词表 softmax / 采样约束**那一层的常规开销,语义与 cross-encoder 式 rerank 更一致;在当前栈与 T4 上延迟表现最好 |
| `qwen3_vllm` | 次推荐 | 稳定、成熟、好排障,是很好的 fallback 和对照组 |
| `qwen3_transformers` | 兼容方案 | |
| `qwen3_transformers_packed` | 特定场景方案 | T可能实现还有问题,没调好 |
| `qwen3_gguf` / `qwen3_gguf_06b` | 低显存 / 功能兜底 | 更适合资源受限场景,不适合作为当前主在线方案 |
| `dashscope_rerank` | 云服务方案 | 运维简单,但依赖外部服务和网络 |
|
701ae503
tangwang
docs
|
33
34
|
## 目录与入口
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
35
|
|
701ae503
tangwang
docs
|
36
37
38
|
- `reranker/server.py`:FastAPI 服务,启动时按配置加载一个后端
- `reranker/backends/`:后端实现与工厂
- `backends/__init__.py`:`get_rerank_backend(name, config)`
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
- `backends/qwen3_vllm_score.py`:当前最优的本地 GPU reranker
- `backends/qwen3_vllm.py`:次优的本地 GPU reranker
- `backends/qwen3_transformers.py`:Transformers 基线实现
- `backends/qwen3_transformers_packed.py`:packed 推理实现
- `backends/qwen3_gguf.py`:GGUF + llama.cpp 后端
- `backends/dashscope_rerank.py`:DashScope 云端重排后端
- `scripts/setup_reranker_venv.sh`:按后端创建独立 venv
- `scripts/start_reranker.sh`:启动 reranker 服务
- `scripts/smoke_qwen3_vllm_score_backend.py`:`qwen3_vllm_score` 本地 smoke
- `scripts/benchmark_reranker_random_titles.py`:随机标题压测脚本
- `scripts/run_reranker_vllm_instruction_benchmark.sh`:历史矩阵脚本
## 环境基线
当前验证环境:
- GPU:`Tesla T4 16GB`
- Driver / CUDA:`570.158.01 / 12.8`
- Python:`3.12.3`
- `torch`:`2.10.0+cu128`
- `transformers`:`4.51+`
- `qwen3_vllm_score` 环境:`vllm==0.18.0`
- `qwen3_vllm` 环境:`vllm>=0.8.5`
独立 venv 约定:
- `qwen3_vllm` -> `.venv-reranker`
- `qwen3_vllm_score` -> `.venv-reranker-score`
- `qwen3_transformers` -> `.venv-reranker-transformers`
- `qwen3_transformers_packed` -> `.venv-reranker-transformers-packed`
- `qwen3_gguf` -> `.venv-reranker-gguf`
- `qwen3_gguf_06b` -> `.venv-reranker-gguf-06b`
- `bge` -> `.venv-reranker-bge`
- `dashscope_rerank` -> `.venv-reranker-dashscope`
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
- 不同后端的 CUDA / vLLM / llama.cpp 依赖耦合很深,混装后更难定位性能和兼容性问题
- qwen3_vllm_score 和 qwen3_vllm 分了两个环境,是因为qwen3_vllm_score使用了vllm 0.18,但是后面经过测试两者性能相同。所以其实可以共用一个环境。不过没有动力合并回去。
## 安装与部署
### 1. 创建后端环境
`qwen3_vllm_score`:
```bash
./scripts/setup_reranker_venv.sh qwen3_vllm_score
```
`qwen3_vllm`:
```bash
./scripts/setup_reranker_venv.sh qwen3_vllm
```
### 2. 基础检查
```bash
nvidia-smi
./.venv-reranker-score/bin/python -c "import torch, vllm; print(torch.cuda.is_available(), torch.cuda.get_device_name(0), vllm.__version__)"
./.venv-reranker/bin/python -c "import torch, vllm; print(torch.cuda.is_available(), torch.cuda.get_device_name(0), vllm.__version__)"
```
### 3. 启动服务
```bash
./scripts/start_reranker.sh
```
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
108
109
110
111
112
113
114
|
### 4. Smoke
```bash
PYTHONPATH=. ./.venv-reranker-score/bin/python scripts/smoke_qwen3_vllm_score_backend.py --gpu-memory-utilization 0.2
```
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
115
116
|
## 当前最优方案:`qwen3_vllm_score`
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
117
118
119
120
121
122
123
124
125
126
127
|
### 关键实现点
`qwen3_vllm_score.py` 里值得关注的地方:
- `runner` / `convert` 保持 **auto**:走 **pooling / classify** 与 **`LLM.score()`** 的推荐接法(vLLM 0.17+)
- `hf_overrides`:把原始 Qwen3 reranker 权重按官方要求映射到 `Qwen3ForSequenceClassification`
- `LLM(...)` 仅使用本后端所需的模型与并行等参数;**attention 后端由 vLLM 内部按运行环境选用**
- `deduplicate_with_positions(...)`:先去重,再回填原始顺序
- `sort_by_doc_length`:减少 padding 浪费
- `infer_batch_size`:控制服务层分批
|
f86c5fee
tangwang
reranker性能参数脚本放在:...
|
128
|
- `enable_prefix_caching`:(作用每检验过)
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
129
130
131
132
133
134
|
- `self._infer_lock`:避免当前进程模型下并发调用破坏 vLLM engine 稳定性
### Attention 与算力路径(现状)
- **vLLM** 根据 **GPU 算力架构**与**当前 wheel 中的实现**(如随发行版提供的 **flashinfer** 等)自动选用 attention 路径。
- 在 **Tesla T4(`sm_75`)** + **vLLM 0.18.x** 的已验证环境中,服务日志中可见选用 **`FLASHINFER`**。
|
f86c5fee
tangwang
reranker性能参数脚本放在:...
|
135
136
137
138
139
140
141
142
143
144
145
|
#### attention后端对比
| 后端 | 计算能力要求 | 特点 | 适用场景 |
| ----------------------------- | --------------- | ---------------- | ----------------------- |
| **FLASH\_ATTN (FA2/FA3/FA4)** | ≥ 8.0 (Ampere+) | 最高性能,手写 CUDA 内核 | A100/H100 等高端卡 |
| **FLASHINFER** | 7.x-9.x (JIT) | 灵活定制,支持多种变体 | 需要特殊 attention mask |
| **TRITON\_ATTN** | 任意 | 纯 Triton,跨平台,零依赖 | 旧 GPU / AMD / fallback |
| **XFORMERS** | 任意 | 替代方案,灵活性高 | 兼容性优先 |
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
146
147
148
149
|
### 推荐配置
当前项目统一使用 `standard`,README 也按这个基线描述:
|
701ae503
tangwang
docs
|
150
151
152
153
|
```yaml
services:
rerank:
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
154
|
backend: "qwen3_vllm_score"
|
701ae503
tangwang
docs
|
155
|
backends:
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
156
|
qwen3_vllm_score:
|
701ae503
tangwang
docs
|
157
|
model_name: "Qwen/Qwen3-Reranker-0.6B"
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
158
159
|
use_original_qwen3_hf_overrides: true
engine: "vllm"
|
9f5994b4
tangwang
reranker
|
160
|
max_model_len: 256
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
161
162
163
|
tensor_parallel_size: 1
gpu_memory_utilization: 0.20
dtype: "float16"
|
9f5994b4
tangwang
reranker
|
164
165
|
enable_prefix_caching: true
enforce_eager: false
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
166
|
infer_batch_size: 100
|
4823f463
tangwang
qwen3_vllm_score ...
|
167
|
sort_by_doc_length: true
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
168
|
instruction_format: standard
|
3d508beb
tangwang
reranker-4b-gguf
|
169
|
instruction: "Rank products by query with category & style match prioritized"
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
170
171
|
```
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
|
### 关键实现点
- `AutoTokenizer.apply_chat_template(...)`
- `SamplingParams(max_tokens=1, allowed_token_ids=[yes, no])`
- `generate(...)` 后从最后一步 logprobs 计算 yes/no 概率
- 同样具备去重、按长度排序、分批推理、前缀缓存、单进程锁等优化
### 推荐配置
```yaml
services:
rerank:
backends:
qwen3_vllm:
model_name: "Qwen/Qwen3-Reranker-0.6B"
engine: "vllm"
max_model_len: 256
tensor_parallel_size: 1
gpu_memory_utilization: 0.20
dtype: "float16"
enable_prefix_caching: true
enforce_eager: false
infer_batch_size: 100
|
3d508beb
tangwang
reranker-4b-gguf
|
195
|
sort_by_doc_length: true
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
196
|
instruction_format: standard
|
5c21a485
tangwang
qwen3-reranker-0....
|
197
|
instruction: "Rank products by query with category & style match prioritized"
|
701ae503
tangwang
docs
|
198
199
|
```
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
200
201
202
203
204
205
206
207
208
209
210
211
|
## benchmark 建议流程
推荐流程:
1. 确认目标 backend 已切换到正确配置
2. `./scripts/start_reranker.sh`
3. `curl http://127.0.0.1:6007/health`
4. 跑 benchmark 脚本
5. 保存 JSON 和 Markdown 结果
6. 记录当时的 GPU 占用情况和 `nvidia-smi`
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
212
213
214
215
216
|
## 常见问题
### 1. 为什么第一次启动很慢
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
217
218
219
220
221
|
- 模型加载
- torch.compile
- CUDA graph capture
- flashinfer / triton JIT
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
222
223
224
225
226
227
228
|
### 3. `qwen3_vllm_score` 的 attention 要在哪里调
**由 vLLM 在运行时按 GPU 与版本自动选择**;与延迟和稳定性更直接相关、且建议在仓库里动的,是 **`max_model_len`**、**`infer_batch_size`**、**`gpu_memory_utilization`**、去重、排序分批、prefix cache 等。
## 代码阅读建议
|
b0972ff9
tangwang
qwen3_vllm_score ...
|
229
230
231
232
233
234
|
1. `reranker/backends/qwen3_vllm_score.py`
2. `reranker/backends/qwen3_vllm.py`
3. `scripts/start_reranker.sh`
4. `scripts/setup_reranker_venv.sh`
5. `config/config.yaml` 里的 `services.rerank.backends.*`
|
f86c5fee
tangwang
reranker性能参数脚本放在:...
|
235
236
237
238
239
240
241
|
## 性能测试、对比
```bash
ll tests/reranker_performance/
curl1.sh
curl1_simple.sh
rerank_performance_compare.sh
```
|