README.md 10.6 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
## 7\. migraphx推理

zk's avatar
zk committed
205
1. [环境准备](http://42.228.13.241:10068/wangwf/groundingdino)
zk's avatar
zk committed
206

zk's avatar
zk committed
207
* 下载 [DTK-26.04-txpl-temp-0312-ubuntu20.04-x86_64](http://112.11.77.146:65182/jenkins/rocm/26.04/intel/ubuntu20.04/DTK-26.04-txpl-temp-0312-ubuntu20.04-x86_64.tar.gz) ,解压后替换掉原 /opt/dtk 目录。
zk's avatar
zk committed
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
```bash
tar -zxvf DTK-26.04-txpl-temp-0312-ubuntu20.04-x86_64.tar.gz -C /opt/
rm /opt/dtk # 删除原来的软链接
ln -s /opt/dtk-26.04-txpl-temp-0312 /opt/dtk # 创建新的软链接
```

* 替换hipdnn:
```bash
tar -zxvf package_resize.tar.gz
cd package_resize
cp -r install/lib/hipdnn_plugins /opt/dtk/lib/
cp -r install/lib/libhipdnn_backend.so /opt/dtk/lib/
rm -rf /opt/dtk/include/hipdnn
cp -r install/include/hipdnn /opt/dtk/include/hipdnn
rm -rf /opt/dtk/lib/cmake/hipdnn*
cp -r install/lib/cmake/* /opt/dtk/lib/cmake/
rm -f /opt/dtk/lib/hipdnn_plugins/engines/libmiopen_legacy_plugin.so
```

* 激活dtk
```bash
source /opt/dtk/env.sh
export LD_LIBRARY_PATH=/usr/local/lib/python3.10/dist-packages/torch/lib:${LD_LIBRARY_PATH}
```


* 安装migraphx
zk's avatar
zk committed
235
```bash
zk's avatar
zk committed
236
237
238
239
240
241
242
243
244
245
chmod +x ./migraphx-5.1.2+das.opt1.ab9210b.dtk2604-cp310-cp310-manylinux_2_35_x86_64.run
./migraphx-5.1.2+das.opt1.ab9210b.dtk2604-cp310-cp310-manylinux_2_35_x86_64.run
```


* 模型优化

```bash
cd weights
onnxsim ground.onnx ground_sim.onnx
zk's avatar
zk committed
246
cd migraphx_infer
zk's avatar
zk committed
247
python modify_onnx_0601.py ../weights/ground_sim.onnx ../weights/ground_opt.onnx
zk's avatar
zk committed
248
249
```

zk's avatar
zk committed
250
251
252


2. 性能测试(编译加运行)
zk's avatar
zk committed
253
```bash
zk's avatar
zk committed
254
255
256
257
258
259
260
261
export MIGRAPHX_ENABLE_GRAPHAPI_REDUCTION=1
export MIGRAPHX_ENABLE_LAYERNORM_FUSION=1
migraphx-driver perf --onnx ground_opt.onnx --fp16 --output ground_opt.mxr
```

或者进入migraphx_infer文件夹,运行
```bash
cd migraphx_infer
zk's avatar
zk committed
262
263
264
bash migraphx_export.bash
```

zk's avatar
zk committed
265
3. 如果已经得到了mxr文件,也可以直接测试
zk's avatar
zk committed
266
267
268
269
```bash
bash migraphx_perf.bash
```

zk's avatar
zk committed
270
4. 使用python脚本测试
zk's avatar
zk committed
271
272
273
274
275
276

需要提前配置环境变量
```bash
export PYTHONPATH=/opt/dtk/lib:$PYTHONPATH
```
运行脚本
zk's avatar
zk committed
277
278
279
280
281
282
283
284
285
```bash
python migraphx_infer.py  
# offload=False推理,提前开辟gpu空间,数据放在device推理

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


zk's avatar
zk committed
286
287
-----
## 8\. 测试结果对比
zk's avatar
zk committed
288
289
290
291
292
293
294
295
296

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

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

zk's avatar
zk committed
297
### 8.1 ORT BW150 测试结果
zk's avatar
zk committed
298
299
300
301
302
303
304
305
306
307
308
309

单张 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
310
### 8.2 ORT BW100 测试结果
zk's avatar
zk committed
311
312

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

zk's avatar
zk committed
314
315
316
317
318
319
320
| 推理模型 | 优化方案 / 精度 | 模型文件 | 自定义算子目录 | 推理时间 (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
321

zk's avatar
zk committed
322
323
324
### 8.3 migraphx BW150、BW100、K100_AI 测试结果


zk's avatar
zk committed
325
汇总结果
zk's avatar
zk committed
326
327
| 设备 | 推理方式 | FPS | 
| :--- | :--- | :--- | 
zk's avatar
zk committed
328
329
330
331
332
333
| BW150 | migraphx-driver | 26.51 | 
| BW150 | Python + MIGraphX(device) | 23.02 | 
| BW100 | migraphx-driver | 22.93 | 
| BW100 | Python + MIGraphX(device) | 19.39 | 
| K100_AI | migraphx-driver | 19.26 | 
| K100_AI | Python + MIGraphX(device) | 15.90 | 
zk's avatar
zk committed
334
335


zk's avatar
zk committed
336
-----
zk's avatar
update  
zk committed
337
338
339

## 参考项目

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

zk's avatar
zk committed
342
343
  - [**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 推理部署参考实现。