[test] unittest for weight decay
[platform/core/ml/nntrainer.git] / packaging / nntrainer.spec
1 # Execute gbs with --define "testcoverage 1" in case that you must get unittest coverage statistics
2 %define         use_cblas 1
3 %define         nnstreamer_filter 1
4 %define         nnstreamer_subplugin_path /usr/lib/nnstreamer
5 %define         use_gym 0
6 %define         support_ccapi 1
7 %define         support_nnstreamer_backbone 1
8 %define         support_tflite_backbone 1
9 %define         support_tflite_interpreter 1
10 %define         nntrainerapplicationdir %{_libdir}/nntrainer/bin
11 %define         gen_input $(pwd)/test/input_gen/genInput.py
12 %define         support_data_augmentation_opencv 1
13 %define         configure_subplugin_install_path -Dnnstreamer-subplugin-install-path=%{nnstreamer_subplugin_path}
14
15 %bcond_with tizen
16
17 # dependency resolution
18 %if 0%{tizen_version_major}%{tizen_version_minor} >= 65
19 # (rpm -qi nnstreamer --queryformat '%%{VERSION}' | sed -e 's/\.//g') >= 171
20
21 %define         capi_machine_learning_common       capi-machine-learning-common
22 %define         capi_machine_learning_inference  capi-machine-learning-inference
23
24 %define         capi_ml_common_pkg_name          capi-ml-common
25 %define         capi_ml_inference_pkg_name       capi-ml-inference
26
27 %else
28
29 %if 0%{tizen_version_major}%{tizen_version_minor} >= 60
30 # (rpm -qi nnstreamer --queryformat '%%{VERSION}' | sed -e 's/\.//g') >= 160
31 %define         capi_machine_learning_common     capi-ml-common
32 %define         capi_machine_learning_inference  capi-nnstreamer
33
34 %define         capi_ml_common_pkg_name          capi-nnstreamer
35 %define         capi_ml_inference_pkg_name       capi-nnstreamer
36 %else
37 %{error: nnst_version < 6.0 is not supported}
38 # shouldn't reach here. Below is for the reference.
39 # If you prepare ml-common-api.h, below can work though.
40 %define         capi_machine_learning_inference  capi-nnstreamer
41 %define         capi_machine_learning_common       capi-nnstreamer
42
43 %define         capi_ml_common_pkg_name          capi-nnstreamer
44 %define         capi_ml_inference_pkg_name       capi-nnstreamer
45 %endif # 0%{tizen_version_major}%{tizen_version_minor} >= 60
46
47 %endif # 0%{tizen_version_major}%{tizen_version_minor} >= 65
48
49 Name:           nntrainer
50 Summary:        Software framework for training neural networks
51 Version:        0.3.0
52 Release:        0
53 Packager:       Jijoong Moon <jijoong.moon@samsung.com>
54 License:        Apache-2.0
55 Source0:        nntrainer-%{version}.tar.gz
56 Source1001:     nntrainer.manifest
57 %if %{with tizen}
58 Source1002:     capi-machine-learning-training.manifest
59 %endif
60 Source2001:     trainset.tar.gz
61 Source2002:     valset.tar.gz
62 Source2003:     testset.tar.gz
63 Source2004:     label.dat
64 Source2005:     unittest_layers.tar.gz
65
66 BuildRequires:  meson >= 0.50.0
67 BuildRequires:  openblas-devel
68 BuildRequires:  iniparser-devel >= 4.1
69 BuildRequires:  gtest-devel
70 BuildRequires:  python3
71 BuildRequires:  python3-numpy
72
73 BuildRequires:  %{capi_machine_learning_common}-devel
74 BuildRequires:  %{capi_machine_learning_inference}-devel
75
76 %if 0%{?unit_test}
77 BuildRequires:  ssat >= 1.1.0
78 %endif
79
80 # OpenAI interface
81 %define enable_gym -Duse_gym=false
82 %if 0%{?use_gym}
83 BuildRequires:  gym-http-api-devel
84 %define enable_gym -Duse_gym=true
85 %endif
86
87 %if 0%{?testcoverage}
88 # to be compatible with gcc-9, lcov should have a higher version than 1.14.1
89 BuildRequires: lcov
90 # BuildRequires:        taos-ci-unittest-coverage-assessment
91 %endif
92
93 %if 0%{?support_data_augmentation_opencv}
94 BuildRequires: opencv-devel
95 %endif
96
97 %if %{with tizen}
98 BuildRequires:  pkgconfig(capi-system-info)
99 BuildRequires:  pkgconfig(capi-base-common)
100 BuildRequires:  pkgconfig(dlog)
101
102 %if 0%{?support_nnstreamer_backbone}
103 BuildRequires: nnstreamer-tensorflow2-lite
104
105 Requires:       nnstreamer-tensorflow2-lite
106 %endif # support_nnstreamer_backbone
107
108 %if 0%{?support_tflite_backbone}
109 BuildRequires: tensorflow2-lite-devel
110 %endif # support_tflite_backbone
111
112 %if 0%{?support_tflite_interpreter}
113 BuildRequires: tensorflow2-lite-devel
114 %endif # support_tflite_interpreter
115
116 %define enable_nnstreamer_tensor_filter -Denable-nnstreamer-tensor-filter=false
117
118 %if  0%{?nnstreamer_filter}
119 BuildRequires:  nnstreamer-devel
120 %define enable_nnstreamer_tensor_filter -Denable-nnstreamer-tensor-filter=true
121
122 %if 0%{?unit_test}
123 BuildRequires:  nnstreamer-test-devel
124 BuildRequires:  gst-plugins-good-extra
125 BuildRequires:  python
126 %endif #unit_test
127 %endif #nnstreamer_filter
128 %endif  # tizen
129
130 Requires:       nntrainer-core = %{version}-%{release}
131
132 %if 0%{?nnstreamer_filter}
133 Requires:       nnstreamer-nntrainer = %{version}-%{release}
134 %endif #nnstreamer_filter
135 %if %{with tizen}
136 Requires:       capi-machine-learning-training = %{version}-%{release}
137 %endif #tizen
138
139 %description
140 NNtrainer Meta package for tizen
141
142 %package core
143 Summary:        Software framework for training neural networks
144 Requires:       iniparser >= 4.1
145 Requires:       libopenblas_pthreads0
146
147 %description core
148 NNtrainer is Software Framework for Training Neural Network Models on Devices.
149
150 %package devel
151 Summary:        Development package for custom nntrainer developers
152 Requires:       nntrainer = %{version}-%{release}
153 Requires:       openblas-devel
154 Requires:       %{capi_machine_learning_common}-devel
155
156 %description devel
157 Development package for custom nntrainer developers.
158 This contains corresponding header files and .pc pkgconfig file.
159
160 %package devel-static
161 Summary:        Static library for nntrainer-devel package
162 Requires:       nntrainer-devel = %{version}-%{release}
163 %description devel-static
164 Static library package of nntrainer-devel
165
166 %package applications
167 Summary:        NNTrainer Examples
168 Requires:       nntrainer = %{version}-%{release}
169 Requires:       %{capi_machine_learning_inference}
170 Requires:       nnstreamer-tensorflow2-lite
171 BuildRequires:  nnstreamer-test-devel
172 BuildRequires:  nnstreamer-tensorflow2-lite
173 BuildRequires:  tensorflow2-lite-devel
174 BuildRequires:  pkgconfig(jsoncpp)
175 BuildRequires:  pkgconfig(libcurl)
176 BuildRequires:  pkgconfig(dlog)
177 BuildRequires:  %{capi_machine_learning_inference}-devel
178 BuildRequires:  glib2-devel
179 BuildRequires:  gstreamer-devel
180
181 %description applications
182 NNTrainer Examples for test purpose.
183
184 %if 0%{?testcoverage}
185 %package unittest-coverage
186 Summary:        NNTrainer UnitTest Coverage Analysis Result
187
188 %description unittest-coverage
189 HTML pages of lcov results of NNTrainer generated during rpmbuild
190 %endif
191
192 %if %{with tizen}
193 %package -n capi-machine-learning-training
194 Summary:         Tizen Native API for NNTrainer
195 Group:           Machine Learning/ML Framework
196 Requires:        %{name} = %{version}-%{release}
197 %description -n capi-machine-learning-training
198 Tizen Native API wrapper for NNTrainer.
199 You can train neural networks efficiently.
200
201 %post -n capi-machine-learning-training -p /sbin/ldconfig
202 %postun -n capi-machine-learning-training -p /sbin/ldconfig
203
204 %package -n capi-machine-learning-training-devel
205 Summary:         Tizen Native API Devel Kit for NNTrainer
206 Group:           Machine Learning/ML Framework
207 Requires:        capi-machine-learning-training = %{version}-%{release}
208 Requires:        %{capi_machine_learning_common}-devel
209 %description -n capi-machine-learning-training-devel
210 Developmental kit for Tizen Native NNTrainer API.
211
212 %package -n capi-machine-learning-training-devel-static
213 Summary:         Static library for Tizen Native API
214 Group:           Machine Learning/ML Framework
215 Requires:        capi-machine-learning-training-devel = %{version}-%{release}
216 %description -n capi-machine-learning-training-devel-static
217 Static library of capi-machine-learning-training-devel package.
218
219 %package tizen-internal-devel
220 Summary:        Tizen internal headers for Tizen Machine Learning Training API
221 Group:          Machine Learning/ML Framework
222 Requires:       capi-machine-learning-training-devel = %{version}-%{release}
223 %description tizen-internal-devel
224 Tizen internal headers for Tizen Machine Learning Training API.
225
226 %if 0%{?support_ccapi}
227 %package -n ccapi-machine-learning-training
228 Summary:         Tizen Native API for NNTrainer
229 Group:           Machine Learning/ML Framework
230 Requires:        %{name} = %{version}-%{release}
231 %description -n ccapi-machine-learning-training
232 Tizen Native API wrapper for NNTrainer.
233 You can train neural networks efficiently.
234
235 %post -n ccapi-machine-learning-training -p /sbin/ldconfig
236 %postun -n ccapi-machine-learning-training -p /sbin/ldconfig
237
238 %package -n ccapi-machine-learning-training-devel
239 Summary:         Tizen Native API Devel Kit for NNTrainer
240 Group:           Machine Learning/ML Framework
241 Requires:        ccapi-machine-learning-training = %{version}-%{release}
242 %description -n ccapi-machine-learning-training-devel
243 Developmental kit for Tizen Native NNTrainer API.
244
245 %package -n ccapi-machine-learning-training-devel-static
246 Summary:         Static library for Tizen c++ API
247 Group:           Machine Learning/ML Framework
248 Requires:        ccapi-machine-learning-training-devel = %{version}-%{release}
249 %description -n ccapi-machine-learning-training-devel-static
250 Static library of ccapi-machine-learning-training-devel package.
251 %endif
252
253 %if 0%{?nnstreamer_filter}
254 %package -n nnstreamer-nntrainer
255 Summary: NNStreamer NNTrainer support
256 Requires: %{name} = %{version}-%{release}
257 Requires:       nnstreamer
258 %description -n nnstreamer-nntrainer
259 NNSteamer tensor filter for nntrainer to support inference.
260
261 %package -n nnstreamer-nntrainer-devel-static
262 Summary: NNStreamer NNTrainer support
263 Requires: nntrainer-devel-static = %{version}-%{release}
264 Requires:       nnstreamer-nntrainer = %{version}-%{release}
265 %description -n nnstreamer-nntrainer-devel-static
266 NNSteamer tensor filter static package for nntrainer to support inference.
267 %endif #nnstreamer_filter
268
269 %endif #tizen
270
271 ## Define build options
272 %define platform -Dplatform=tizen
273 %define enable_tizen_feature_check -Denable-tizen-feature-check=true -Dtizen-version-major=0%{?tizen_version_major} -Dtizen-version-minor=0%{?tizen_version_minor}
274 %define install_app -Dinstall-app=true
275 %define enable_ccapi -Denable-ccapi=false
276 %define enable_nnstreamer_backbone -Denable-nnstreamer-backbone=false
277 %define enable_tflite_backbone -Denable-tflite-backbone=false
278 %define enable_tflite_interpreter -Denable-tflite-interpreter=false
279 %define enable_profile -Denable-profile=false
280 %define capi_ml_pkg_dep_resolution -Dcapi-ml-inference-actual=%{?capi_ml_inference_pkg_name} -Dcapi-ml-common-actual=%{?capi_ml_common_pkg_name}
281 %define enable_reduce_tolerance -Dreduce-tolerance=true
282 %define enable_debug -Denable-debug=false
283
284 # enable full tolerance on the CI
285 %if 0%{?unit_test}
286 %define enable_reduce_tolerance -Dreduce-tolerance=false
287 %endif
288
289 # enable debug on the CI for build
290 %if 0%{?unit_test}
291 %define enable_debug -Denable-debug=true
292 %endif
293
294 %if %{with tizen}
295 %define platform -Dplatform=tizen
296
297 %if 0%{?support_ccapi}
298 %define enable_ccapi -Denable-ccapi=true
299 %endif # support_ccapi
300 %endif # tizen
301
302 # Using cblas for Matrix calculation
303 %if 0%{?use_cblas}
304 %define enable_cblas -Denable-blas=true
305 %endif
306
307 %if 0%{?support_nnstreamer_backbone}
308 %define enable_nnstreamer_backbone -Denable-nnstreamer-backbone=true
309 %endif
310
311 %if 0%{?support_tflite_backbone}
312 %define enable_tflite_backbone -Denable-tflite-backbone=true
313 %endif
314
315 %if 0%{?unit_test}
316 %define enable_profile -Denable-profile=true
317 %endif
318
319 %if 0%{?support_tflite_interpreter}
320 %define enable_tflite_interpreter -Denable-tflite-interpreter=true
321 %endif
322
323 %prep
324 %setup -q
325 cp %{SOURCE1001} .
326 cp %{SOURCE2001} .
327 cp %{SOURCE2002} .
328 cp %{SOURCE2003} .
329 cp %{SOURCE2004} .
330 cp %{SOURCE2005} .
331
332 %if %{with tizen}
333 cp %{SOURCE1002} .
334 %endif
335
336 %build
337 CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-std=gnu++11||"`
338
339 %if 0%{?testcoverage}
340 CXXFLAGS="${CXXFLAGS} -fprofile-arcs -ftest-coverage"
341 CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage"
342 %endif
343
344 # Add backward competibility for tizen < 6
345 %if 0%{tizen_version_major} < 6
346 ln -sf %{_includedir}/nnstreamer/nnstreamer.h %{_includedir}/nnstreamer/ml-api-common.h
347 ln -sf %{_libdir}/pkgconfig/capi-nnstreamer.pc %{_libdir}/pkgconfig/capi-ml-common.pc
348 %endif
349
350 mkdir -p build
351 meson --buildtype=plain --prefix=%{_prefix} --sysconfdir=%{_sysconfdir} \
352       --libdir=%{_libdir} --bindir=%{nntrainerapplicationdir} \
353       --includedir=%{_includedir} %{install_app} %{platform} \
354       %{enable_tizen_feature_check} %{enable_cblas} %{enable_ccapi} \
355       %{enable_gym} %{enable_nnstreamer_tensor_filter} %{enable_profile} \
356       %{enable_nnstreamer_backbone} %{enable_tflite_backbone} \
357       %{enable_tflite_interpreter} %{capi_ml_pkg_dep_resolution} \
358       %{enable_reduce_tolerance} %{configure_subplugin_install_path} %{enable_debug}  build
359
360 ninja -C build %{?_smp_mflags}
361
362 %if 0%{?unit_test}
363 export NNSTREAMER_CONF=$(pwd)/test/nnstreamer/nnstreamer-test.ini
364 export NNSTREAMER_FILTERS=$(pwd)/build/nnstreamer/tensor_filter
365 meson test -C build -t 2.0 --print-errorlogs
366
367 # unittest for nntrainer plugin for nnstreamer
368 # todo: migrate this to meson test soon
369 %if 0%{?nnstreamer_filter}
370 pushd test/nnstreamer
371 ssat
372 popd
373 %endif #nnstreamer_filter
374 %endif #unit_test
375
376 %install
377 DESTDIR=%{buildroot} ninja -C build %{?_smp_mflags} install
378
379 %if 0%{?testcoverage}
380 ##
381 # The included directories are:
382 #
383 # api: nnstreamer api
384 # gst: the nnstreamer elements
385 # nnstreamer_example: custom plugin examples
386 # common: common libraries for gst (elements)
387 # include: common library headers and headers for external code (packaged as "devel")
388 #
389 # Intentionally excluded directories are:
390 #
391 # tests: We are not going to show testcoverage of the test code itself or example applications
392
393 %if %{with tizen}
394 %define testtarget $(pwd)/api/capi
395 %else
396 %define testtarget
397 %endif
398
399 # 'lcov' generates the date format with UTC time zone by default. Let's replace UTC with KST.
400 # If you ccan get a root privilege, run ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
401 TZ='Asia/Seoul'; export TZ
402 $(pwd)/test/unittestcoverage.py module $(pwd)/nntrainer %testtarget
403
404 # Get commit info
405 VCS=`cat ${RPM_SOURCE_DIR}/nntrainer.spec | grep "^VCS:" | sed "s|VCS:\\W*\\(.*\\)|\\1|"`
406
407 # Create human readable unit test coverage report web page.
408 # Create null gcda files if gcov didn't create it because there is completely no unit test for them.
409 find . -name "*.gcno" -exec sh -c 'touch -a "${1%.gcno}.gcda"' _ {} \;
410 # Remove gcda for meaningless file (CMake's autogenerated)
411 find . -name "CMakeCCompilerId*.gcda" -delete
412 find . -name "CMakeCXXCompilerId*.gcda" -delete
413 #find . -path "/build/*.j
414
415 # Generate report
416 lcov -t 'NNTrainer Unit Test Coverage' -o unittest.info -c -d . -b %{_builddir}/%{name}-%{version}/build \
417     --include "*/nntrainer/*" \
418     --include "*/api/*" \
419     --exclude "*/tensorflow*" \
420     --exclude "*/Applications/*" \
421     --exclude "*/test/*" \
422     --exclude "*/meson*/*" \
423     --exclude "*/nntrainer_logger.cpp" \
424     --exclude "*/tf_schema_generated.h" \
425     --exclude "*/nnstreamer_layer.*"
426 # nnstreamer layer is untestable here
427
428 # Visualize the report
429 genhtml -o result unittest.info -t "nntrainer %{version}-%{release} ${VCS}" --ignore-errors source -p ${RPM_BUILD_DIR}
430
431 mkdir -p %{buildroot}%{_datadir}/nntrainer/unittest/
432 cp -r result %{buildroot}%{_datadir}/nntrainer/unittest/
433 %endif  # test coverage
434
435 %post -p /sbin/ldconfig
436 %postun -p /sbin/ldconfig
437
438 %files
439
440 %files core
441 %manifest nntrainer.manifest
442 %defattr(-,root,root,-)
443 %license LICENSE
444 %{_libdir}/libnntrainer.so
445 %config %{_sysconfdir}/nntrainer.ini
446
447 %files devel
448 # node exporter and its dependencies
449 %{_includedir}/nntrainer/nntrainer_error.h
450 %{_includedir}/nntrainer/connection.h
451 %{_includedir}/nntrainer/common_properties.h
452 %{_includedir}/nntrainer/base_properties.h
453 %{_includedir}/nntrainer/node_exporter.h
454 # tensor headers
455 %{_includedir}/nntrainer/tensor.h
456 %{_includedir}/nntrainer/tensor_wrap_specs.h
457 # @todo: update dataset headers
458 %{_includedir}/nntrainer/databuffer.h
459 %{_includedir}/nntrainer/databuffer_factory.h
460 # layer headers
461 %{_includedir}/nntrainer/layer_context.h
462 %{_includedir}/nntrainer/layer_devel.h
463 %{_includedir}/nntrainer/layer_impl.h
464 # custom layer kits
465 %{_includedir}/nntrainer/app_context.h
466 # optimizer headers
467 %{_includedir}/nntrainer/optimizer_context.h
468 %{_includedir}/nntrainer/optimizer_devel.h
469 %{_includedir}/nntrainer/optimizer_impl.h
470 %{_libdir}/pkgconfig/nntrainer.pc
471 # update this to enable external applications
472 # @todo filter out headers that should be hidden, and classifiy in the appropriate place if not
473 %{_includedir}/nntrainer/util_func.h
474
475 %files devel-static
476 %{_libdir}/libnntrainer*.a
477 %exclude %{_libdir}/libcapi*.a
478
479 %if %{with tizen}
480 %files -n capi-machine-learning-training
481 %manifest capi-machine-learning-training.manifest
482 %license LICENSE
483 %{_libdir}/libcapi-nntrainer.so
484
485 %files -n capi-machine-learning-training-devel
486 %{_includedir}/nntrainer/nntrainer.h
487 %{_includedir}/nntrainer/nntrainer-api-common.h
488 %{_libdir}/pkgconfig/capi-ml-training.pc
489
490 %files -n capi-machine-learning-training-devel-static
491 %{_libdir}/libcapi-nntrainer.a
492
493 %files tizen-internal-devel
494 %{_includedir}/nntrainer/nntrainer-tizen-internal.h
495
496 %if 0%{?support_ccapi}
497 %files -n ccapi-machine-learning-training
498 %manifest capi-machine-learning-training.manifest
499 %license LICENSE
500 %{_libdir}/libccapi-nntrainer.so
501
502 %files -n ccapi-machine-learning-training-devel
503 %{_includedir}/nntrainer/model.h
504 %{_includedir}/nntrainer/layer.h
505 %{_includedir}/nntrainer/optimizer.h
506 %{_includedir}/nntrainer/dataset.h
507 %{_includedir}/nntrainer/tensor_dim.h
508 %{_libdir}/pkgconfig/ccapi-ml-training.pc
509
510 %files -n ccapi-machine-learning-training-devel-static
511 %{_libdir}/libccapi-nntrainer.a
512 %endif # support_ccapi
513
514 %if 0%{?nnstreamer_filter}
515 %files -n nnstreamer-nntrainer
516 %manifest nntrainer.manifest
517 %defattr(-,root,root,-)
518 %license LICENSE
519 %{nnstreamer_subplugin_path}/filters/libnnstreamer_filter_nntrainer.so
520
521 %files -n nnstreamer-nntrainer-devel-static
522 %manifest nntrainer.manifest
523 %defattr(-,root,root,-)
524 %license LICENSE
525 %{_libdir}/libnnstreamer_filter_nntrainer.a
526
527 %endif #nnstreamer_filter
528 %endif #tizen
529
530 %files applications
531 %manifest nntrainer.manifest
532 %defattr(-,root,root,-)
533 %license LICENSE
534 %{_libdir}/nntrainer/bin/applications/*
535
536 %if 0%{?testcoverage}
537 %files unittest-coverage
538 %{_datadir}/nntrainer/unittest/*
539 %endif
540
541 %changelog
542 * Fri Sep 24 2021 Jijoong Moon <jijoong.moon@samsung.com>
543 - Release of 0.3.0
544 * Wed Jun 02 2021 Jijoong Moon <jijoong.moon@samsung.com>
545 - Release of 0.2.0
546 * Wed Sep 23 2020 Jijoong Moon <jijoong.moon@samsung.com>
547 - Release of 0.1.1
548 * Mon Aug 10 2020 Jijoong Moon <jijoong.moon@samsung.com>
549 - Release of 0.1.0.rc1
550 * Wed Mar 18 2020 Jijoong Moon <jijoong.moon@samsung.com>
551 - packaged nntrainer