test.sh 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756
  1. # test script for MNN-Release
  2. #
  3. # 0. arg = local: [ test for your local build ]
  4. # 1. unit-test;
  5. # 2. model-test;
  6. # 3. onnx convert test
  7. # 4. tf convert test
  8. # 5. tflite convert test
  9. # 6. torch convert test
  10. # 7. ptq test
  11. # 8. pymnn test
  12. #
  13. # 1. arg = linux: [ all test on linux with coverage ]
  14. # 0. static check (if source change)
  15. # 1. pyc check (if *.py change)
  16. # 2. build for linux;
  17. # 3. unit-test;
  18. # 4. model-test;
  19. # 5. onnx convert test
  20. # 6. tf convert test
  21. # 7. tflite convert test
  22. # 8. torch convert test
  23. # 9. ptq test
  24. # 10. pymnn test (if pymnn change)
  25. # 11. opencv test (if opencv change)
  26. # 12. convert-report;
  27. #
  28. # 2. arg = android: [ simple test on android ]
  29. # 1. build Android with static_stl
  30. # 2. build Android arm64
  31. # 3. unit-test for Android arm64
  32. # 4. build Android arm32
  33. # 5. unit-test for Android arm32
  34. # 0. build for android
  35. USER_NAME=`whoami`
  36. USER_HOME="$(echo -n $(bash -c "cd ~${USER_NAME} && pwd"))"
  37. # detect change
  38. SOURCE_CHANGE=$(git show --name-only | grep -E "^source/(internal|backend|core|common|cv|geometry|math|plugin|shape|utils)/.*\.(cpp|cc|c|hpp)$" | \
  39. grep -Ev "aliyun-log-c-sdk|hiai|tensorrt|Backend|FunctionDispatcher|ThreadPool")
  40. PYMNN_CHANGE=$(git show --name-only | grep -E "^pymnn/.*\.(cpp|cc|c|h|hpp|py)$")
  41. PY_CHANGE=$(git show --name-only | grep -E "^pymnn/pip_package/MNN/.*\.(py)$")
  42. OPENCV_CHANGE=$(git show --name-only | grep -E "^tools/cv/.*\.(cpp|cc|c|h|hpp)$")
  43. # OPENCL_CHANGE=$(git show --name-only | grep -E "^source/backend/opencl/.*\.(cpp|cc|c|h|hpp)$")
  44. OPENCL_CHANGE=true
  45. failed() {
  46. printf "TEST_NAME_EXCEPTION: Exception\nTEST_CASE_AMOUNT_EXCEPTION: {\"blocked\":0,\"failed\":1,\"passed\":0,\"skipped\":0}\n"
  47. exit 1
  48. }
  49. #############################################################################################
  50. # #
  51. # Linux Test Functions #
  52. # #
  53. #############################################################################################
  54. doc_check() {
  55. echo 'doc_check'
  56. # 1. CHECK CMakeLists.txt:
  57. cmake_files=$(find tools source demo test benchmark -name "CMakeLists.txt")
  58. cmake_files="$cmake_files CMakeLists.txt"
  59. macros=''
  60. executables=''
  61. for cmake_file in $cmake_files
  62. do
  63. executables="$executables $(cat $cmake_file | grep -oE "add_executable\((.+) " | awk '{print $1}' | awk -F "(" '{print $2}')"
  64. macros="$macros $(cat $cmake_file | grep -oE "option\((.+) " | awk '{print $1}' | awk -F "(" '{print $2}')"
  65. done
  66. # 1.1 check all macro
  67. for macro in $macros
  68. do
  69. if [ $(grep -c $macro ./docs/compile/cmake.md) -le 0 ]; then
  70. echo 'DOC CHECK FAILED:' $macro 'not in ./docs/compile/cmake.md'
  71. failed
  72. fi
  73. done
  74. # 1.2 check executable
  75. for executable in $executables
  76. do
  77. if [ $(grep -c $executable ./docs/compile/other.md) -le 0 ]; then
  78. echo 'DOC CHECK FAILED:' $executable 'not in ./docs/compile/other.md'
  79. failed
  80. fi
  81. done
  82. # 2. CHECK Pymnn API:
  83. # 2.1 check cv api
  84. cv_apis=$(cat pymnn/src/cv.h | grep -oE " .+, \".+\"" | awk '{ print $1 }' | awk -F ',' '{ print $1 }')
  85. cv_apis="$cv_apis $(cat pymnn/pip_package/MNN/cv/__init__.py | grep -oE "def .+\(" | awk '{ print $2 }' | awk -F '(' '{print $1}' | grep -v "__")"
  86. for cv_api in $cv_apis
  87. do
  88. if [ $(grep -c $cv_api ./docs/pymnn/cv.md) -le 0 ]; then
  89. echo 'DOC CHECK FAILED:' $cv_api 'not in ./docs/pymnn/cv.md'
  90. failed
  91. fi
  92. done
  93. # 2.2 check numpy api
  94. # np_apis=$(cat pymnn/pip_package/MNN/numpy/__init__.py | grep -oE "def .+\(" | grep -v "__" | awk '{ print $2 }' | awk -F '(' '{print $1}')
  95. # for np_api in $np_apis
  96. # do
  97. # if [ $(grep -c $np_api ./docs/pymnn/numpy.md) -le 0 ]; then
  98. # echo 'DOC CHECK FAILED:' $np_api 'not in ./docs/pymnn/numpy.md'
  99. # # failed
  100. # fi
  101. # done
  102. # 2.3 check expr api
  103. expr_apis=$(cat pymnn/src/expr.h | grep -oE " [a-z_]+, \"" | awk '{ print $1 }' | awk -F ',' '{ print $1 }')
  104. for expr_api in $expr_apis
  105. do
  106. if [ $(grep -c $expr_api ./docs/pymnn/expr.md) -le 0 ]; then
  107. echo 'DOC CHECK FAILED:' $expr_api 'not in ./docs/pymnn/expr.md'
  108. # failed
  109. fi
  110. done
  111. # 3. CHECK C++ API:
  112. # 3.1 check Interpreter
  113. # 3.2 check Tensor
  114. }
  115. py_check() {
  116. echo 'py_check'
  117. if [ -z "$PY_CHANGE" ]; then
  118. return
  119. fi
  120. pushd pymnn
  121. ./update_mnn_wrapper_assets.sh -c
  122. pyc_check_wrong=$[$? > 0]
  123. printf "TEST_NAME_PYC_CHECK: pyc资源文件校验\nTEST_CASE_AMOUNT_PYC_CHECK: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" \
  124. $pyc_check_wrong $[1 - $pyc_check_wrong]
  125. if [ $pyc_check_wrong -ne 0 ]; then
  126. echo '### pyc资源文件校验失败,测试终止!'
  127. failed
  128. fi
  129. popd
  130. }
  131. static_check() {
  132. echo 'static_check'
  133. if [ -z "$SOURCE_CHANGE" ]; then
  134. return
  135. fi
  136. cppcheck --error-exitcode=1 --language=c++ --std=c++14 --addon=tools/script/mnn_rules.py $SOURCE_CHANGE 1> /dev/null
  137. static_check_wrong=$[$? > 0]
  138. printf "TEST_NAME_STATIC_CHECK: cppcheck静态分析\nTEST_CASE_AMOUNT_STATIC_CHECK: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" \
  139. $static_check_wrong $[1 - $static_check_wrong]
  140. if [ $static_check_wrong -ne 0 ]; then
  141. echo '### cppcheck静态分析失败,测试终止!'
  142. failed
  143. fi
  144. }
  145. android_static_build() {
  146. BASH_FILE="$USER_HOME/.zshrc"
  147. if [ -f "$BASH_FILE" ]; then
  148. source $BASH_FILE
  149. fi
  150. if [ ! $ANDROID_NDK ] || [ ! -d $ANDROID_NDK ]; then
  151. export ANDROID_NDK="$USER_HOME/android-ndk-r21"
  152. fi
  153. mkdir android_build
  154. pushd android_build
  155. cmake .. \
  156. -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
  157. -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
  158. -DCMAKE_BUILD_TYPE=Release \
  159. -DANDROID_ABI="arm64-v8a" \
  160. -DANDROID_STL=c++_static \
  161. -DMNN_INTERNAL=ON \
  162. -DMNN_USE_LOGCAT=false \
  163. -DMNN_BUILD_BENCHMARK=ON \
  164. -DANDROID_NATIVE_API_LEVEL=android-26 \
  165. -DMNN_BUILD_FOR_ANDROID_COMMAND=true \
  166. -DMNN_OPENGL=true \
  167. -DMNN_BUILD_TRAIN=true \
  168. -DMNN_VULKAN=true \
  169. -DMNN_OPENCL=true \
  170. -DMNN_SUPPORT_BF16=true \
  171. -DMNN_OPENCL=true -DMNN_ARM82=true \
  172. -DMNN_SUPPORT_TRANSFORMER_FUSE=ON \
  173. -DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=. $1 $2 $3
  174. make -j16
  175. android_build_wrong=$[$? > 0]
  176. printf "TEST_NAME_ANDROID_STATIC: AndroidStatic编译测试\nTEST_CASE_AMOUNT_ANDROID_STATIC: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" \
  177. $android_build_wrong $[1 - $android_build_wrong]
  178. if [ $android_build_wrong -ne 0 ]; then
  179. echo '### AndroidStatic编译失败,测试终止!'
  180. failed
  181. fi
  182. popd
  183. mkdir android_build_32
  184. pushd android_build_32
  185. cmake .. \
  186. -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
  187. -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
  188. -DCMAKE_BUILD_TYPE=Release \
  189. -DANDROID_ABI="armeabi-v7a" \
  190. -DANDROID_STL=c++_shared \
  191. -DMNN_USE_LOGCAT=false \
  192. -DMNN_BUILD_BENCHMARK=ON \
  193. -DMNN_INTERNAL=ON \
  194. -DANDROID_NATIVE_API_LEVEL=android-26 \
  195. -DMNN_BUILD_FOR_ANDROID_COMMAND=true \
  196. -DMNN_OPENGL=true \
  197. -DMNN_BUILD_TRAIN=true \
  198. -DMNN_VULKAN=true \
  199. -DMNN_OPENCL=true \
  200. -DMNN_BUILD_MINI=true \
  201. -DMNN_SUPPORT_BF16=true \
  202. -DMNN_ARM82=false \
  203. -DMNN_OPENCL=true \
  204. -DMNN_SUPPORT_TRANSFORMER_FUSE=ON \
  205. -DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=.
  206. make -j16
  207. android_build_wrong=$[$? > 0]
  208. printf "TEST_NAME_ANDROID_32: Android 32-Mini 编译测试\nTEST_CASE_AMOUNT_ANDROID_32: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" $android_build_wrong $[1 - $android_build_wrong]
  209. if [ $android_build_wrong -ne 0 ]; then
  210. echo '### Android编译失败,测试终止!'
  211. failed
  212. fi
  213. popd
  214. }
  215. linux_build() {
  216. if [ $# -gt 0 ]; then
  217. COVERAGE=ON
  218. else
  219. COVERAGE=OFF
  220. fi
  221. mkdir build_non_sse
  222. pushd build_non_sse
  223. cmake .. -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DMNN_USE_SSE=OFF && make -j16
  224. linux_build_wrong=$[$? > 0]
  225. popd
  226. mkdir build
  227. pushd build
  228. # copy libtorch avoid wget, speed up ci build
  229. cp ~/libtorch-cxx11-abi-shared-with-deps-1.9.0+cpu.zip .
  230. cmake .. \
  231. -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
  232. -DCMAKE_BUILD_TYPE=Release \
  233. -DMNN_BUILD_TEST=ON \
  234. -DMNN_CUDA=ON \
  235. -DMNN_OPENCL=ON \
  236. -DMNN_BUILD_QUANTOOLS=ON \
  237. -DMNN_BUILD_DEMO=ON \
  238. -DMNN_BUILD_TRAIN=ON \
  239. -DMNN_BUILD_CONVERTER=ON \
  240. -DMNN_BUILD_TORCH=ON \
  241. -DMNN_BUILD_OPENCV=ON \
  242. -DMNN_LOW_MEMORY=ON \
  243. -DMNN_IMGCODECS=ON \
  244. -DMNN_SUPPORT_TRANSFORMER_FUSE=ON \
  245. -DMNN_ENABLE_COVERAGE=$COVERAGE
  246. make -j16
  247. linux_build_wrong+=$[$? > 0]
  248. printf "TEST_NAME_LINUX: Linux编译测试\nTEST_CASE_AMOUNT_LINUX: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" $linux_build_wrong $[2 - $linux_build_wrong]
  249. if [ $linux_build_wrong -ne 0 ]; then
  250. echo '### Linux编译失败,测试终止!'
  251. failed
  252. fi
  253. # Don't remove this! It turn off MNN_CUDA and MNN_TENSORRT in build, workaround some bug in PTQTest
  254. cmake .. -DMNN_CUDA=OFF -DMNN_TENSORRT=OFF && make -j16
  255. }
  256. unit_test() {
  257. ./run_test.out
  258. if [ $? -ne 0 ]; then
  259. echo '### 单元测试失败,测试终止!'
  260. failed
  261. fi
  262. ./run_test.out op 0 0 4
  263. if [ $? -ne 0 ]; then
  264. echo '### 多线程单元测试失败,测试终止!'
  265. failed
  266. fi
  267. if [ "$OPENCL_CHANGE" ]; then
  268. ./run_test.out op 3 1 4
  269. if [ $? -ne 0 ]; then
  270. echo '### OpenCL单元测试失败,测试终止!'
  271. failed
  272. fi
  273. fi
  274. }
  275. model_test() {
  276. ../tools/script/modelTest.py ~/AliNNModel 0 0.002
  277. if [ $? -ne 0 ]; then
  278. echo '### 模型测试失败,测试终止!'
  279. failed
  280. fi
  281. ../tools/script/modelTest.py ~/AliNNModel 0 0.002 0 1
  282. if [ $? -ne 0 ]; then
  283. echo '### 静态模型测试失败,测试终止!'
  284. failed
  285. fi
  286. if [ "$OPENCL_CHANGE" ]; then
  287. ../tools/script/modelTest.py ~/AliNNModel 3 0.002 1
  288. if [ $? -ne 0 ]; then
  289. echo '### OpenCL模型测试失败,测试终止!'
  290. failed
  291. fi
  292. fi
  293. }
  294. onnx_convert_test() {
  295. ../tools/script/convertOnnxTest.py ~/AliNNModel
  296. if [ $? -ne 0 ]; then
  297. echo '### ONNXConvert测试失败,测试终止!'
  298. failed
  299. fi
  300. }
  301. tf_convert_test() {
  302. ../tools/script/convertTfTest.py ~/AliNNModel
  303. if [ $? -ne 0 ]; then
  304. echo '### TFConvert测试失败,测试终止!'
  305. failed
  306. fi
  307. }
  308. tflite_convert_test() {
  309. ../tools/script/convertTfliteTest.py ~/AliNNModel
  310. if [ $? -ne 0 ]; then
  311. echo '### TFLITEConvert测试失败,测试终止!'
  312. failed
  313. fi
  314. }
  315. torch_convert_test() {
  316. ../tools/script/convertTorchTest.py ~/AliNNModel
  317. if [ $? -ne 0 ]; then
  318. echo '### TORCHConvert测试失败,测试终止!'
  319. failed
  320. fi
  321. }
  322. ptq_test() {
  323. ../tools/script/testPTQ.py ~/AliNNModel
  324. if [ $? -ne 0 ]; then
  325. echo '### PTQ测试失败,测试终止!'
  326. failed
  327. fi
  328. }
  329. pymnn_test() {
  330. if [ -z "$PYMNN_CHANGE" ]; then
  331. return
  332. fi
  333. popd
  334. pushd pymnn
  335. # 1. build pymnn
  336. pushd pip_package
  337. python3 build_deps.py
  338. # uninstall original MNN
  339. pip uninstall --yes MNN MNN-Internal
  340. python3 setup.py install --version 1.0 --install-lib=/usr/lib/python3/dist-packages
  341. pymnn_build_wrong=$[$? > 0]
  342. printf "TEST_NAME_PYMNN_BUILD: PYMNN编译测试\nTEST_CASE_AMOUNT_PYMNN_BUILD: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" \
  343. $pymnn_build_wrong $[1 - $pymnn_build_wrong]
  344. if [ $pymnn_build_wrong -ne 0 ]; then
  345. echo '### PYMNN编译失败,测试终止!'
  346. failed
  347. fi
  348. popd
  349. # 2. unit test
  350. pushd test
  351. python3 unit_test.py
  352. if [ $? -ne 0 ]; then
  353. echo '### PYMNN单元测试失败,测试终止!'
  354. failed
  355. fi
  356. # 3. model test
  357. python3 model_test.py ~/AliNNModel
  358. if [ $? -ne 0 ]; then
  359. echo '### PYMNN模型测试失败,测试终止!'
  360. failed
  361. fi
  362. # 4. train test
  363. ./train_test.sh
  364. # 5. uninstall pymnn
  365. pip uninstall --yes MNN-Internal
  366. popd
  367. popd
  368. pushd build
  369. }
  370. opencv_test() {
  371. if [ -z "$OPENCV_CHANGE" ]; then
  372. return
  373. fi
  374. # 1. build opencv-test
  375. cmake -DMNN_OPENCV_TEST=ON ..
  376. make -j8
  377. opencv_build_wrong=$[$? > 0]
  378. printf "TEST_NAME_OPENCV_BUILD: OPENCV编译测试\nTEST_CASE_AMOUNT_OPENCV_BUILD: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" \
  379. $opencv_build_wrong $[1 - $opencv_build_wrong]
  380. if [ $opencv_build_wrong -ne 0 ]; then
  381. echo '### OPENCV编译失败,测试终止!'
  382. failed
  383. fi
  384. # 2. run opencv unit test
  385. ./opencv_test
  386. if [ $? -gt 0 ]; then
  387. echo '### OPENCV单元测试失败,测试终止!'
  388. failed
  389. fi
  390. }
  391. llm_test() {
  392. # 1. build llm with low memory
  393. cmake -DMNN_LOW_MEMORY=ON -DMNN_BUILD_LLM=ON -DMNN_SUPPORT_TRANSFORMER_FUSE=ON ..
  394. make -j8
  395. llm_build_wrong=$[$? > 0]
  396. printf "TEST_NAME_LLM_BUILD: LLM编译测试\nTEST_CASE_AMOUNT_LLM_BUILD: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" \
  397. $llm_build_wrong $[1 - $llm_build_wrong]
  398. if [ $llm_build_wrong -ne 0 ]; then
  399. echo '### LLM编译失败,测试终止!'
  400. failed
  401. fi
  402. # 2. run llm model test
  403. ./llm_demo ~/AliNNModel/qwen1.5-0.5b-int4/config.json ~/AliNNModel/qwen1.5-0.5b-int4/prompt.txt
  404. if [ $? -gt 0 ]; then
  405. echo '### LLM模型测试失败,测试终止!'
  406. failed
  407. fi
  408. }
  409. coverage_init() {
  410. popd
  411. lcov -c -i -d ./ -o init.info
  412. pushd build
  413. }
  414. coverage_report() {
  415. popd
  416. cover_report_dir="../../../../CoverageReport"
  417. lcov -c -d ./ -o cover.info
  418. lcov -a init.info -a cover.info -o total.info
  419. lcov --remove total.info \
  420. '*/usr/include/*' '*/usr/lib/*' '*/usr/lib64/*' '*/usr/local/*' \
  421. '*/3rd_party/*' '*/build/*' '*/schema/*' '*/test/*' '/tmp/*' \
  422. '*/demo/*' '*/tools/cpp/*' '*/tools/train/*' '*/source/backend/cuda/*' \
  423. -o final.info
  424. commitId=$(git log | head -n1 | awk '{print $2}')
  425. genhtml -o cover_report --legend --title "MNN Coverage Report [commit SHA1:${commitId}]" --prefix=`pwd` final.info
  426. coverage_wrong=$[$? > 0]
  427. printf "TEST_NAME_COVERAGE: 代码覆盖率(点击\"通过\"查看报告)\nTEST_CASE_AMOUNT_COVERAGE: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" $coverage_wrong $[1 - $coverage_wrong]
  428. if [ $coverage_wrong -ne 0 ]; then
  429. echo '### 代码覆盖率生成失败,测试终止!'
  430. failed
  431. else
  432. hostIp=$(cat .aoneci.yml | grep host -m 1 | awk '{print $2}')
  433. testId=$(pwd | awk -F "/" '{print $(NF-1)}')
  434. mv cover_report $cover_report_dir/$testId
  435. echo "TEST_REPORT_COVERAGE: http://$hostIp/$testId"
  436. fi
  437. # clean test dir
  438. cd ../.. && rm -rf $testId
  439. }
  440. #############################################################################################
  441. # #
  442. # Android Test Functions #
  443. # #
  444. #############################################################################################
  445. android_unit_test() {
  446. memory_mode=$2
  447. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out all 0 0 1 $1 $memory_mode"
  448. if [ $? -ne 0 ]; then
  449. echo '### Android单元测试失败,测试终止!'
  450. failed
  451. fi
  452. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op 0 0 4 multi$1 $memory_mode"
  453. if [ $? -ne 0 ]; then
  454. echo '### Android单元测试多线程失败,测试终止!'
  455. failed
  456. fi
  457. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/convolution 0 2 4 fp16multi$1 $memory_mode"
  458. if [ $? -ne 0 ]; then
  459. echo '### Android单元测试卷积FP16多线程失败,测试终止!'
  460. failed
  461. fi
  462. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/col2im 0 2 4 fp16col2im$1 $memory_mode"
  463. if [ $? -ne 0 ]; then
  464. echo '### Android单元测试FP16-col2im多线程失败,测试终止!'
  465. failed
  466. fi
  467. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/R 0 2 4 fp16roipooling$1 $memory_mode"
  468. if [ $? -ne 0 ]; then
  469. echo '### Android单元测试FP16-roipooling多线程失败,测试终止!'
  470. failed
  471. fi
  472. if [ "$OPENCL_CHANGE" ]; then
  473. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op 3 1 4 $1 $memory_mode"
  474. if [ $? -ne 0 ]; then
  475. echo '### Android单元测试OpenCL失败,测试终止!'
  476. failed
  477. fi
  478. fi
  479. }
  480. android_model_test() {
  481. fail_num=0
  482. pass_num=0
  483. fail_cl_num=0
  484. pass_cl_num=0
  485. models=`adb shell ls /data/local/tmp/AliNNModel/OpTestResource/`
  486. for model in $models
  487. do
  488. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModel.out ../AliNNModel/OpTestResource/$model/temp.bin ../AliNNModel/OpTestResource/$model/input_0.txt ../AliNNModel/OpTestResource/$model/output_0.txt 0 0.002"
  489. if [ $? -ne 0 ]; then
  490. fail_num=$[$fail_num+1]
  491. else
  492. pass_num=$[$pass_num+1]
  493. fi
  494. if [ "$OPENCL_CHANGE" ]; then
  495. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModel.out ../AliNNModel/OpTestResource/$model/temp.bin ../AliNNModel/OpTestResource/$model/input_0.txt ../AliNNModel/OpTestResource/$model/output_0.txt 3 0.002 1"
  496. if [ $? -ne 0 ]; then
  497. fail_cl_num=$[$fail_cl_num+1]
  498. else
  499. pass_cl_num=$[$pass_cl_num+1]
  500. fi
  501. fi
  502. done
  503. models=`adb shell ls /data/local/tmp/AliNNModel/TestResource/`
  504. for model in $models
  505. do
  506. if [ $model == 'mobilenetv1quan' ]; then
  507. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModel.out ../AliNNModel/TestResource/$model/temp.bin ../AliNNModel/TestResource/$model/input_0.txt ../AliNNModel/TestResource/$model/output.txt 0 0.1"
  508. else
  509. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModel.out ../AliNNModel/TestResource/$model/temp.bin ../AliNNModel/TestResource/$model/input_0.txt ../AliNNModel/TestResource/$model/output.txt 0 0.002"
  510. fi
  511. if [ $? -ne 0 ]; then
  512. fail_num=$[$fail_num+1]
  513. else
  514. pass_num=$[$pass_num+1]
  515. fi
  516. if [ "$OPENCL_CHANGE" ]; then
  517. if [ $model == 'mobilenetv1quan' ]; then
  518. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModel.out ../AliNNModel/TestResource/$model/temp.bin ../AliNNModel/TestResource/$model/input_0.txt ../AliNNModel/TestResource/$model/output.txt 3 0.1 1"
  519. else
  520. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModel.out ../AliNNModel/TestResource/$model/temp.bin ../AliNNModel/TestResource/$model/input_0.txt ../AliNNModel/TestResource/$model/output.txt 3 0.002 1"
  521. fi
  522. if [ $? -ne 0 ]; then
  523. fail_cl_num=$[$fail_cl_num+1]
  524. else
  525. pass_cl_num=$[$pass_cl_num+1]
  526. fi
  527. fi
  528. done
  529. models=`adb shell ls /data/local/tmp/AliNNModel/TestWithDescribe/`
  530. for model in $models
  531. do
  532. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModelWithDescribe.out ../AliNNModel/TestWithDescribe/$model/temp.bin ../AliNNModel/TestWithDescribe/$model/config.txt 0 0.002"
  533. if [ $? -ne 0 ]; then
  534. fail_num=$[$fail_num+1]
  535. else
  536. pass_num=$[$pass_num+1]
  537. fi
  538. if [ "$OPENCL_CHANGE" ]; then
  539. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./testModelWithDescribe.out ../AliNNModel/TestWithDescribe/$model/temp.bin ../AliNNModel/TestWithDescribe/$model/config.txt 3 0.002 1"
  540. if [ $? -ne 0 ]; then
  541. fail_cl_num=$[$fail_cl_num+1]
  542. else
  543. pass_cl_num=$[$pass_cl_num+1]
  544. fi
  545. fi
  546. done
  547. printf "TEST_NAME_ANDROID_MODEL_TEST_$1: Android_$1模型测试\nTEST_CASE_AMOUNT_ANDROID_MODEL_TEST_$1: {\"blocked\":0,\"failed\":$fail_num,\"passed\":$pass_num,\"skipped\":0}\n"
  548. if [ $fail_num -ne 0 ]; then
  549. echo '### Android模型测试失败,测试终止!'
  550. failed
  551. fi
  552. if [ "$OPENCL_CHANGE" ]; then
  553. printf "TEST_NAME_ANDROID_MODEL_OPENCL_TEST_$1: Android_$1模型测试\nTEST_CASE_AMOUNT_ANDROID_MODEL_TEST_$1: {\"blocked\":0,\"failed\":$fail_cl_num,\"passed\":$pass_cl_num,\"skipped\":0}\n"
  554. if [ $fail_cl_num -ne 0 ]; then
  555. echo '### Android OpenCL后端模型测试失败,测试终止!'
  556. failed
  557. fi
  558. fi
  559. }
  560. android_unit_test_low_memory_armv8() {
  561. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 1 1 $1 2"
  562. if [ $? -ne 0 ]; then
  563. echo '### Android 64位Low Memory,动态量化, precision=1, thread=1 单元测试失败,测试终止!'
  564. failed
  565. fi
  566. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 2 1 $1 2"
  567. if [ $? -ne 0 ]; then
  568. echo '### Android 64位Low Memory,动态量化, precision=2, thread=1 单元测试失败,测试终止!'
  569. failed
  570. fi
  571. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 1 4 $1 2"
  572. if [ $? -ne 0 ]; then
  573. echo '### Android 64位Low Memory,动态量化, precision=1, thread=4 单元测试失败,测试终止!'
  574. failed
  575. fi
  576. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 2 4 $1 2"
  577. if [ $? -ne 0 ]; then
  578. echo '### Android 64位Low Memory,动态量化, precision=2, thread=4 单元测试失败,测试终止!'
  579. failed
  580. fi
  581. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 1 1 $1"
  582. if [ $? -ne 0 ]; then
  583. echo '### Android 64位Low Memory 权重反量化, precision=1 单元测试失败,测试终止!'
  584. failed
  585. fi
  586. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 2 1 $1"
  587. if [ $? -ne 0 ]; then
  588. echo '### Android 64位Low Memory 权重反量化, precision=2 单元测试失败,测试终止!'
  589. failed
  590. fi
  591. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/convolution/weighti8i4conv2d 0 2 4 $1 2 1"
  592. if [ $? -ne 0 ]; then
  593. echo '### Android 64位Low Memory 设置dynamicOption=1, precision=2 4线程测试失败,测试终止!'
  594. failed
  595. fi
  596. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/convolution/weighti8i4conv2d 0 1 4 $1 2 1"
  597. if [ $? -ne 0 ]; then
  598. echo '### Android 64位Low Memory 设置dynamicOption=1, precision=1 4线程测试失败,测试终止!'
  599. failed
  600. fi
  601. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/convolution/weighti8i4conv2d 0 2 4 $1 2 2"
  602. if [ $? -ne 0 ]; then
  603. echo '### Android 64位Low Memory 设置dynamicOption=2, precision=2 4线程测试失败,测试终止!'
  604. failed
  605. fi
  606. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/convolution/weighti8i4conv2d 0 1 4 $1 2 2"
  607. if [ $? -ne 0 ]; then
  608. echo '### Android 64位Low Memory 设置dynamicOption=2, precision=1 4线程测试失败,测试终止!'
  609. failed
  610. fi
  611. }
  612. android_unit_test_low_memory_armv7() {
  613. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 1 1 $1 2"
  614. if [ $? -ne 0 ]; then
  615. echo '### Android 32位Low Memory,动态量化, precision=1, thread=1 单元测试失败,测试终止!'
  616. failed
  617. fi
  618. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 2 1 $1 2"
  619. if [ $? -ne 0 ]; then
  620. echo '### Android 32位Low Memory,动态量化, precision=2, thread=1 单元测试失败,测试终止!'
  621. failed
  622. fi
  623. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 1 4 $1 2"
  624. if [ $? -ne 0 ]; then
  625. echo '### Android 32位Low Memory,动态量化, precision=1, thread=4 单元测试失败,测试终止!'
  626. failed
  627. fi
  628. adb shell "cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.&&./run_test.out op/lowMemory 0 2 4 $1 2"
  629. if [ $? -ne 0 ]; then
  630. echo '### Android 32位Low Memory,动态量化, precision=2, thread=4 单元测试失败,测试终止!'
  631. failed
  632. fi
  633. }
  634. android_test() {
  635. pushd project/android
  636. # 1. build Android32
  637. mkdir build_32
  638. pushd build_32
  639. ../build_32.sh -DMNN_BUILD_TRAIN=OFF -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DMNN_OPENCL=true -DMNN_LOW_MEMORY=ON -DMNN_SUPPORT_TRANSFORMER_FUSE=ON -DMNN_ARM82=OFF
  640. android32_build_wrong=$[$? > 0]
  641. mnn32_size=$(ls -lh libMNN.so | awk '{print $5}')
  642. expr32_size=$(ls -lh libMNN_Express.so | awk '{print $5}')
  643. printf "TEST_NAME_ANDROID_32: Android32编译测试(libMNN.so - %s, libMNN_Express.so - %s)\nTEST_CASE_AMOUNT_ANDROID_32: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" \
  644. $mnn32_size $expr32_size $android32_build_wrong $[1 - $android32_build_wrong]
  645. if [ $android32_build_wrong -ne 0 ]; then
  646. echo '### Android32编译失败,测试终止!'
  647. failed
  648. fi
  649. ../updateTest.sh
  650. android_unit_test 32bit 1
  651. android_unit_test_low_memory_armv7 32bit
  652. android_model_test 32
  653. popd
  654. # 3. build Android64
  655. mkdir build_64
  656. pushd build_64
  657. ../build_64.sh -DMNN_BUILD_TRAIN=OFF -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DMNN_ARM82=true -DMNN_OPENCL=true -DMNN_LOW_MEMORY=true -DMNN_SUPPORT_TRANSFORMER_FUSE=ON
  658. android64_build_wrong=$[$? > 0]
  659. mnn64_size=$(ls -lh libMNN.so | awk '{print $5}')
  660. expr64_size=$(ls -lh libMNN_Express.so | awk '{print $5}')
  661. printf "TEST_NAME_ANDROID_64: Android64编译测试(libMNN.so - %s, libMNN_Express.so - %s)\nTEST_CASE_AMOUNT_ANDROID_64: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n" \
  662. $mnn64_size $expr64_size $android64_build_wrong $[1 - $android64_build_wrong]
  663. if [ $android64_build_wrong -ne 0 ]; then
  664. echo '### Android64编译失败,测试终止!'
  665. failed
  666. fi
  667. # 4. test Android64
  668. ../updateTest.sh
  669. android_unit_test 64 0
  670. android_unit_test_low_memory_armv8 64
  671. android_model_test 64
  672. popd
  673. popd
  674. }
  675. case "$1" in
  676. local)
  677. pushd build
  678. unit_test
  679. model_test
  680. onnx_convert_test
  681. tf_convert_test
  682. tflite_convert_test
  683. torch_convert_test
  684. ptq_test
  685. pymnn_test
  686. ;;
  687. linux)
  688. doc_check
  689. static_check
  690. py_check
  691. linux_build 1
  692. coverage_init
  693. unit_test
  694. model_test
  695. onnx_convert_test
  696. tf_convert_test
  697. tflite_convert_test
  698. torch_convert_test
  699. ptq_test
  700. pymnn_test
  701. opencv_test
  702. llm_test
  703. coverage_report
  704. ;;
  705. android)
  706. android_static_build
  707. android_test
  708. ;;
  709. static)
  710. doc_check
  711. static_check
  712. py_check
  713. ;;
  714. *)
  715. $1
  716. echo $"Usage: $0 {local|linux|android|func}"
  717. exit 2
  718. esac
  719. exit $?