-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmmmmmmmmmmmmmm.txt
204 lines (117 loc) · 5.53 KB
/
mmmmmmmmmmmmmm.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
安装依赖:
sudo apt install build-essential
sudo apt install git
sudo apt install cmake
sudo apt install libprotobuf-dev
sudo apt install protobuf-compiler
sudo apt install libvulkan-dev
sudo apt install vulkan-utils
sudo apt install libopencv-dev
安装libopencv-dev可能报错
E: 无法下载...
请看教程:
https://blog.csdn.net/weixin_42238876/article/details/106220957
软件和更新->Ubuntu软件->下载自:选择阿里云。
sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils libopencv-dev
vulkan:
wget https://sdk.lunarg.com/sdk/download/1.2.189.0/linux/vulkansdk-linux-x86_64-1.2.189.0.tar.gz?Human=true -O vulkansdk-linux-x86_64-1.2.189.0.tar.gz
tar -xf vulkansdk-linux-x86_64-1.2.189.0.tar.gz
sudo gedit ~/.bashrc
export PYTHON_HOME=~/anaconda3
export CUDA_HOME=/usr/local/cuda-10.2
export PATH=${PYTHON_HOME}/bin:${CUDA_HOME}/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64
export TENSORRT_HOME=~/TensorRT-8.0.1.6
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${TENSORRT_HOME}/lib
export PYTHON_EXECUTABLE=~/anaconda3/bin
export VULKAN_SDK=~/1.2.189.0/x86_64
export PATH=${VULKAN_SDK}/bin:$PATH
source ~/.bashrc
输入命令
vulkaninfo
或者
vulkaninfo | grep deviceType
打印出信息,表示安装成功。
ncnn安装教程
https://blog.csdn.net/weixin_43541325/article/details/117412417
(6.5)
https://zhuanlan.zhihu.com/p/431833958
编译pnnx
cd ..
cd tools/pnnx
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DTorch_INSTALL_DIR="~/libtorch" ..
cmake --build . -j 2
cmake --build . --target install
cp -r ~/libtorch/lib/*.so ~/GitHub/ncnn2/tools/pnnx/build/install/bin
cp -r ~/libtorch/lib/*.so.1 ~/GitHub/ncnn2/tools/pnnx/build/install/bin
跑示例:
cd ncnn
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_SYSTEM_GLSLANG=ON -DNCNN_BUILD_EXAMPLES=ON ..
make -j$(nproc)
cd ../examples
../build/examples/squeezenet ../images/256-ncnn.png
cd examples
../build/examples/squeezenet ../images/000000000019.jpg
../build/examples/squeezenet ../images/dog.jpg
Linux中查看16进制权重文件
cd my_tests
hexdump -C 01.bin | more
cd my_tests
hexdump -C 01.ncnn.bin | more
cd my_tests
hexdump -C 01_pncnn.bin | more
bin文件前32bit是标志位;卷积层的权重可以是float32(32bit)或float16(16bit),但是卷积层的偏置只能是float32(32bit)
pnnx导出的模型,卷积层的权重默认是float16(16bit),前32bit默认是0x01306B47
看modelbin.cpp
调试每层的方法:开头加入头文件
#include <iostream>
层的forward()里加入
printf("-------------- Convolution_x86 --------------\n");
std::cout << this->name << std::endl;
printf("elempack=%d\n", elempack);
printf("-------------- __SSE2__ --------------\n");
if (oc==0 && aaaa==1)
{
printf("h_im=%f\n", h_im);
printf("w_im=%f\n", w_im);
printf("\n");
}
这些代码。
ubuntu, amd + 3060(6GB), 这台机支持__SSE2__、__AVX__,不支持__AVX512F__
__SSE2__ 支持 pack=4,1
__AVX__ 支持 pack=8,4,1
__AVX512F__ 支持 pack=16,8,4,1
------------------------------ ubuntu, amd + 3060(6GB), 不使用vulkan, 默认12线程 ------------------------------
ppyoloe_crn_l_300e_coco, use_packing_layout=1, use_sgemm_convolution=1, 推理时间 avg = 340.15
ppyoloe_crn_l_300e_coco, use_packing_layout=1, use_sgemm_convolution=0, 推理时间 avg = 363.04
ppyoloe_crn_l_300e_coco, use_packing_layout=0, use_sgemm_convolution=1, 推理时间 avg = 313.78
ppyoloe_crn_l_300e_coco, use_packing_layout=0, use_sgemm_convolution=0, 推理时间 avg = 972.89
(实验1) ppyolov2_r50vd_365e, use_packing_layout=1, use_sgemm_convolution=1, 推理时间 avg = 398.29
(实验2) ppyolov2_r50vd_365e, use_packing_layout=1, use_sgemm_convolution=0, 推理时间 avg = 523.38
(实验3) ppyolov2_r50vd_365e, use_packing_layout=0, use_sgemm_convolution=1, 推理时间 avg = 413.42
(实验4) ppyolov2_r50vd_365e, use_packing_layout=0, use_sgemm_convolution=0, 推理时间 avg = 2831.22
(可变形卷积换成普通卷积推理时间)
(实验5) ppyolov2_r50vd_365e, use_packing_layout=1, use_sgemm_convolution=1, 推理时间 avg = 397.74
(实验6) ppyolov2_r50vd_365e, use_packing_layout=1, use_sgemm_convolution=0, 推理时间 avg = 407.44
(实验7) ppyolov2_r50vd_365e, use_packing_layout=0, use_sgemm_convolution=1, 推理时间 avg = 391.33
(实验8) ppyolov2_r50vd_365e, use_packing_layout=0, use_sgemm_convolution=0, 推理时间 avg = 832.75
对比实验5和实验6,推理时间几乎不变,再看实验1和实验2,DCN非常依赖im2col+MatMul,直接计算DCN会很慢;
对比实验4和实验8,naive DCN(既不使用pack也不使用im2col+MatMul)是非常慢的;
------------------------------------------------------------
win10, i7-9700K + 2070(8GB), 这台机支持__SSE2__、__AVX__,不支持__AVX512F__
__SSE2__ 支持 pack=4,1
__AVX__ 支持 pack=8,4,1
__AVX512F__ 支持 pack=16,8,4,1
不使用vulkan, 使用opts[3], 8线程
ppyoloe_crn_l_300e_coco 推理时间 357.05
ppyolov2_r50vd_365e 推理时间 384.82
ppyolov2_r50vd_365e 可变形卷积换成普通卷积推理时间 373.23
(可变形卷积的实现)
当是2x2卷积时,offset和mask是pack的形式,导致过不了测试用例。
offset shape dims=3, C=1, D=1, H=1, W=1, elemsize=32, elempack=8, cstep=1
mask shape dims=3, C=1, D=1, H=1, W=1, elemsize=16, elempack=4, cstep=1
不要尝试把offset和mask还原成没有pack的形式,浪费时间。而是直接取出正确的offset和mask。