README.md 9.3 KB
Newer Older
zk's avatar
zk committed
1
# GroundingDINO Inference & Deployment
zk's avatar
zk committed
2

zk's avatar
zk committed
3
本项目主要包含 GroundingDINO 的原生 PyTorch 推理以及基于 ONNX Runtime (ORT) 的推理部署流程,并针对 `ms_deform_attn` 算子提供了自定义的加速与量化方案。
zk's avatar
zk committed
4

zk's avatar
zk committed
5
## 1\. 环境准备
zk's avatar
zk committed
6

zk's avatar
zk committed
7
8
9
10
11
12
13
14
15
16
17
18
19
本环境配置参考 [官方 GroundingDINO 仓库](https://github.com/IDEA-Research/GroundingDINO),并针对海光 DCU 硬件环境进行了底层适配。

### 1.1 拉取 DCU 基础计算镜像

为确保底层 DTK 算子库与 PyTorch 版本完美匹配,推荐下面的容器内进行后续的代码编译与推理测试:

```bash
docker pull image.sourcefind.cn:5000/dcu/admin/base/pytorch:2.5.1-ubuntu22.04-dtk25.04.2-py3.10
```

*(注:请基于该镜像启动开发容器后,再执行后续操作。)*

### 1.2 基础环境变量设置
zk's avatar
zk committed
20
21

在进行编译和运行前,请先激活相关的计算栈环境并配置 HuggingFace 镜像:
zk's avatar
zk committed
22

zk's avatar
zk committed
23
```bash
zk's avatar
zk committed
24
25
26
source /opt/dtk/cuda/cuda-12/env.sh
cp -r /opt/dtk/cuda/cuda-12/include /opt/dtk/cuda/cuda-12/include-bak
rm -rf /opt/dtk/cuda/cuda-12/include
zk's avatar
zk committed
27
28
29
export HF_ENDPOINT=https://hf-mirror.com
```

zk's avatar
zk committed
30
31
### 1.3 编译 GroundingDINO 库

zk's avatar
zk committed
32
进入项目目录并执行编译安装:
zk's avatar
zk committed
33

zk's avatar
zk committed
34
```bash
zk's avatar
zk committed
35
36
cd GroundingDINO/
pip3 install -e . --no-build-isolation
zk's avatar
zk committed
37
38
```

zk's avatar
zk committed
39
40
> **💡 注意:Numpy 版本兼容性问题**
> 如果在运行过程中遇到因 `numpy` 版本过高导致的报错,请强制重装指定版本:
zk's avatar
zk committed
41
>
zk's avatar
zk committed
42
43
44
> ```bash
> python3 -m pip install numpy==1.26.4 --force-reinstall
> ```
zk's avatar
zk committed
45

zk's avatar
zk committed
46
47
48
49
### 1.4 模型下载

新建 weights 文件夹并下载模型权重:

zk's avatar
zk committed
50
51
52
```bash
mkdir weights
cd weights
zk's avatar
zk committed
53
wget -q https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha2/groundingdino_swinb_cogcoor.pth
zk's avatar
zk committed
54
55
```

zk's avatar
zk committed
56
-----
zk's avatar
zk committed
57

zk's avatar
zk committed
58
## 2\. 推理模式前置配置
zk's avatar
zk committed
59
60
61
62
63

由于导出 ONNX 模型会改变模型的输入结构,在进行具体的推理操作前,**必须手动替换底层文件**以适配不同的推理后端。

目标文件路径:`groundingdino/models/GroundingDINO/groundingdino.py`

zk's avatar
zk committed
64
  * **当使用 PyTorch 推理时**
zk's avatar
zk committed
65
`groundingdino_torch.py` 的内容复制并覆盖到上述目标文件中。
zk's avatar
zk committed
66
  * **当使用 ONNX Runtime 导出与推理时**
zk's avatar
zk committed
67
68
`groundingdino_onnx.py` 的内容复制并覆盖到上述目标文件中。

zk's avatar
zk committed
69
-----
zk's avatar
zk committed
70

zk's avatar
zk committed
71
## 3\. PyTorch 原生推理
zk's avatar
zk committed
72
73

确保已按上述说明将代码切换为 Torch 模式后,直接运行测试脚本:
zk's avatar
zk committed
74

zk's avatar
zk committed
75
```bash
zk's avatar
zk committed
76
bash infer_test.sh
zk's avatar
zk committed
77
```
zk's avatar
zk committed
78

zk's avatar
zk committed
79
-----
zk's avatar
zk committed
80

zk's avatar
zk committed
81
## 4\. 标准 ONNX Runtime 推理
zk's avatar
zk committed
82
83
84
85

请先确保代码已切换为 ONNX 模式。本测试包含 5 轮预热(Warmup)和 10 轮正式测试。

**Step 1: 导出 ONNX 模型**
zk's avatar
zk committed
86

zk's avatar
zk committed
87
```bash
zk's avatar
zk committed
88
python export_onnx.py
zk's avatar
zk committed
89
90
```

zk's avatar
zk committed
91
**Step 2: 执行 ORT 推理**
zk's avatar
zk committed
92

zk's avatar
zk committed
93
```bash
zk's avatar
zk committed
94
python onnx_inference1.py
zk's avatar
zk committed
95
```
zk's avatar
zk committed
96

zk's avatar
zk committed
97
98
> **📝 参数说明**:
> 运行前请在 `onnx_inference1.py` 中填入对应的 `.onnx` 模型路径和图像路径。图片外的其他 Text/Mask 输入已自动生成并填入(可通过 `get_caption_mask.py` 生成)。
zk's avatar
zk committed
99

zk's avatar
zk committed
100
-----
zk's avatar
zk committed
101

zk's avatar
zk committed
102
## 5\. 进阶:带自定义算子 (ms\_deform\_attn) 的 ORT 推理
zk's avatar
zk committed
103

zk's avatar
update  
zk committed
104
为了进一步优化性能,实现了 `ms_deform_attn` 的自定义算子,并提供了多种优化方案(含 FP16)。
zk's avatar
zk committed
105

zk's avatar
zk committed
106
### 5.1 编译自定义算子
zk's avatar
zk committed
107
108

根据需求选择对应的算子实现目录(支持的方案包括:`ort_plugin`, `ort_plugin_fp16`, `ort_plugin_fp16_B`, `ort_plugin_fp16_C`),推荐使用 `ort_plugin`(fp32 算子实现)和 `ort_plugin_fp16_C`(fp16 算子实现)。
zk's avatar
zk committed
109

zk's avatar
zk committed
110
`ort_plugin` 为例进行编译:
zk's avatar
zk committed
111

zk's avatar
zk committed
112
113
114
115
116
```bash
cd ort_plugin
mkdir build && cd build
cmake ..
make
zk's avatar
zk committed
117
```
zk's avatar
zk committed
118
119

编译成功后,将在该目录下生成动态链接库 `libms_deform_attn_ort.so`,后续只需要在推理脚本中更改 so 文件位置。
zk's avatar
zk committed
120

zk's avatar
zk committed
121
### 5.2 导出与优化模型
zk's avatar
zk committed
122

zk's avatar
zk committed
123
进入 deform 推理工作区:
zk's avatar
zk committed
124

zk's avatar
zk committed
125
126
127
```bash
cd deform_ort
```
zk's avatar
zk committed
128

zk's avatar
zk committed
129
**1. 导出带自定义算子的 ONNX:**
zk's avatar
zk committed
130

zk's avatar
zk committed
131
132
133
```bash
python export_onnx_deform.py
```
zk's avatar
zk committed
134

zk's avatar
zk committed
135
**2. 模型简化与量化:**
zk's avatar
zk committed
136

zk's avatar
zk committed
137
138
139
```bash
python onnx_optimize.py
```
zk's avatar
zk committed
140

zk's avatar
zk committed
141
> 该脚本会输出两种量化后的 ONNX 模型:
zk's avatar
zk committed
142
143
144
145
>
>   - 一种**跳过了**自定义算子。
>   - 另一种**保留了**自定义算子(需搭配不带 FP16 的 `.so` 库使用)。

zk's avatar
zk committed
146

zk's avatar
zk committed
147
### 5.3 运行自定义算子推理
zk's avatar
zk committed
148

zk's avatar
zk committed
149
最后,执行优化后的推理脚本(包含 5 轮预热,10 轮测试):
zk's avatar
zk committed
150

zk's avatar
zk committed
151
```bash
zk's avatar
zk committed
152
python onnx_inference_deform_optim.py
zk's avatar
zk committed
153
```
zk's avatar
zk committed
154

zk's avatar
zk committed
155
156
157
> **📝 参数说明**:
> 运行前,请务必在代码中正确填入**ONNX 模型位置**以及**步骤 5.1 生成的自定义算子 `.so` 库位置**。

zk's avatar
zk committed
158
159
160
161
## 6\. 低分辨率输入版本ORT推理(400x800)

如需使用更低分辨率的图像输入(如 400x800)以进一步加速推理,可按以下步骤操作:

zk's avatar
zk committed
162
1. 修改导出脚本
zk's avatar
zk committed
163
164
165
166
167
168
169
170
171
172
173

编辑 `deform_ort/export_onnx_deform.py`,修改图像尺寸与导出路径:

```python
# img = torch.randn(1, 3, 800, 1200).to(device)
img = torch.randn(1, 3, 400, 800).to(device)

# onnx_output_path = "../weights/ground_deform.onnx"
onnx_output_path = "../weights_400x800/ground_deform.onnx"
```

zk's avatar
zk committed
174
2. 正常导出并量化
zk's avatar
zk committed
175
176
177
178
179
180
181

```bash
cd deform_ort
python export_onnx_deform.py
python onnx_optimize.py
```

zk's avatar
zk committed
182
3. 修改推理预处理分辨率
zk's avatar
zk committed
183
184
185
186
187
188
189
190

编辑 `groundingdino/util/inference.py` 中的 `load_image` 函数,将 `RandomResize` 的参数从 800 改为 400:

```python
# T.RandomResize([800], max_size=1333),
T.RandomResize([400], max_size=1333),
```

zk's avatar
zk committed
191
4. 执行 ORT 推理
zk's avatar
zk committed
192
193
194
195
196
197
198
199
200
201
202

运行推理脚本,并确保代码中的 ONNX 模型路径指向 `weights_400x800/` 下对应的模型文件:

```bash
python onnx_inference_deform_optim.py
```

> **💡 提示**:低分辨率输入会显著减少推理耗时,但可能对检测精度(尤其小目标)产生影响,请根据实际场景权衡速度与精度。

-----

zk's avatar
zk committed
203
204
205
206
207
208
209
210
## 7\. migraphx推理

1. 进入migraphx_infer文件夹
```bash
cd migraphx_infer
```

2. 运行转换onnx脚本
zk's avatar
zk committed
211
将简化后的onnx转换为要用migraphx推理的onnx(ground_sim.onnx->ground_opt.onnx)
zk's avatar
zk committed
212
213
214
215
216
217
218
219
220
```bash
bash migraphx_export.bash
```

3. 如果已经得到了mxr文件,直接测试
```bash
bash migraphx_perf.bash
```

zk's avatar
zk committed
221
222
223
224
225
226
227
228
229
230
4. 使用python脚本测试
```bash
python migraphx_infer.py  
# offload=False推理,提前开辟gpu空间,数据放在device推理

python migraphx_infer1.py 
# offload=True推理,会慢一些
```


zk's avatar
zk committed
231
232
-----
## 8\. 测试结果对比
zk's avatar
zk committed
233
234
235
236
237
238
239
240
241

*以下测试均包含 5 轮预热(Warmup)和 10 轮正式测试。*

> **📌 路径简写说明:**
> 为保证表格排版简洁,下方表格中的路径已作简写:
>
>   * **模型文件**:默认存放于 `../weights/` 目录下。
>   * **自定义算子目录**:对应的完整动态库路径均为 `../[目录名]/build/libms_deform_attn_ort.so`。

zk's avatar
zk committed
242
### 8.1 ORT BW150 测试结果
zk's avatar
zk committed
243
244
245
246
247
248
249
250
251
252
253
254

单张 BW150 卡,图像输入 800x1200,Batch Size = 1

| 推理模型 | 优化方案 / 精度 | 模型文件 | 自定义算子目录 | 推理时间 (ms) | FPS |
| :--- | :--- | :--- | :--- | :---: | :---: |
| **PyTorch** | FP32 (Base) 原生推理 | - | - | 144.25 | 6.93 |
| **ORT** | 标准 ONNX 推理 (原始模型) | `ground.onnx` | - | 173.66 | 5.76 |
| **ORT + Plugin** | +自定义算子<br>+前后处理、模型简化 | `ground_deform.onnx` | `ort_plugin` | 121.67 | 8.22 |
| **ORT + Plugin** | +自定义算子<br>+FP16 混合精度量化 | `ground_deform_fp16.onnx` | `ort_plugin` | 95.17 | 10.50 |
| **ORT + Plugin** | +自定义算子<br>+FP16 纯量化方案 B | `ground_deform_fp16_all.onnx` | `ort_plugin_fp16_B` | 87.34 | 11.44 |
| **ORT + Plugin** | +自定义算子<br>+FP16 极致优化方案 C | `ground_deform_fp16_all.onnx` | `ort_plugin_fp16_C` | 84.52 | 11.82 |

zk's avatar
zk committed
255
### 8.2 ORT BW100 测试结果
zk's avatar
zk committed
256
257

单张 BW100 卡,图像输入 800x1200,Batch Size = 1
zk's avatar
zk committed
258

zk's avatar
zk committed
259
260
261
262
263
264
265
| 推理模型 | 优化方案 / 精度 | 模型文件 | 自定义算子目录 | 推理时间 (ms) | FPS |
| :--- | :--- | :--- | :--- | :---: | :---: |
| **ORT** | 标准 ONNX 推理 (原始模型) | `ground.onnx` | - | 204.49 | 4.89 |
| **ORT + Plugin** | +自定义算子<br>+前后处理、模型简化 | `ground_deform.onnx` | `ort_plugin` | 136.25 | 7.34 |
| **ORT + Plugin** | +自定义算子<br>+FP16 混合精度量化 | `ground_deform_fp16.onnx` | `ort_plugin` | 105.46 | 9.48 |
| **ORT + Plugin** | +自定义算子<br>+FP16 纯量化方案 B | `ground_deform_fp16_all.onnx` | `ort_plugin_fp16_B` | 105.35 | 9.49 |
| **ORT + Plugin** | +自定义算子<br>+FP16 极致优化方案 C | `ground_deform_fp16_all.onnx` | `ort_plugin_fp16_C` | 100.91 | 9.90 |
zk's avatar
zk committed
266

zk's avatar
zk committed
267
268
### 8.3 migraphx BW150和BW100 测试结果
BW100示例结果:
zk's avatar
zk committed
269
270
271
272
273
274
275
276
277
278
```
Batch size: 1
Rate: 6.05197 inferences/sec
Total time: 165.235ms (Min: 165.115ms, Max: 165.535ms, 
Mean: 165.258ms, Median: 165.225ms)
Percentiles (90%, 95%, 99%): (165.358ms, 165.358ms, 165.358ms)
Total instructions time: 205.275ms
Overhead time: 2.32812ms, -40.0399ms
Overhead: 1%, -24%
```
zk's avatar
zk committed
279
280
281
282
283
284
285
286
287
汇总结果
| 设备 | 推理方式 | FPS | 平均推理时间 (ms) |
| :--- | :--- | :--- | :--- |
| BW150 | migraphx-driver | 14.93 | 66.97 |
| BW150 | Python + MIGraphX(device) | 13.65 | 73.20(包含前后处理) |
| BW100 | migraphx-driver | 13.54 | 73.87 |
| BW100 | Python + MIGraphX(device) | 12.12 | 82.44(包含前后处理) |


zk's avatar
zk committed
288
-----
zk's avatar
update  
zk committed
289
290
291

## 参考项目

zk's avatar
zk committed
292
本项目在开发过程中参考了以下开源项目:
zk's avatar
update  
zk committed
293

zk's avatar
zk committed
294
295
  - [**GroundingDINO**](https://github.com/IDEA-Research/GroundingDINO) - GroundingDINO 官方仓库,提供基础模型与算法实现。
  - [**GroundingDINO-TensorRT-and-ONNX-Inference**](https://github.com/wingdzero/GroundingDINO-TensorRT-and-ONNX-Inference) - 提供了 GroundingDINO 的 TensorRT 及 ONNX 推理部署参考实现。