Blame view

reranker/README.md 8.96 KB
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
  ```