| # Copyright 2020 The ChromiumOS Authors |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| EAPI=7 |
| |
| CROS_WORKON_COMMIT=("8b6e11a069e490c761cdab7ab3ff59434806cd9c" "70f29ed06f63e9711e07708d8713281e6b332504" "84c38b6e3978ab7391ab1a2a696bfd4627401097") |
| CROS_WORKON_TREE=("41d899585b7a07ea908a0cca2944a7b8a4d13655" "f91b6afd5f2ae04ee9a2c19109a3a4a36f7659e6" "7d8a35364d50ee1a9de8310de0cf331759e94e73" "0a19f3a7d964bb9c758c96e942eddf3ec8c127fa") |
| inherit cros-constants |
| |
| CROS_WORKON_PROJECT=( |
| "chromiumos/platform2" |
| "aosp/platform/frameworks/ml" |
| "aosp/platform/hardware/interfaces/neuralnetworks" |
| ) |
| CROS_WORKON_REPO=( |
| "${CROS_GIT_HOST_URL}" |
| "${CROS_GIT_HOST_URL}" |
| "${CROS_GIT_HOST_URL}" |
| ) |
| CROS_WORKON_EGIT_BRANCH=( |
| "main" |
| "main" |
| "master" |
| ) |
| CROS_WORKON_LOCALNAME=( |
| "platform2" |
| "aosp/frameworks/ml" |
| "aosp/hardware/interfaces/neuralnetworks" |
| ) |
| CROS_WORKON_DESTDIR=( |
| "${S}/platform2" |
| "${S}/platform2/aosp/frameworks/ml" |
| "${S}/platform2/aosp/hardware/interfaces/neuralnetworks" |
| ) |
| CROS_WORKON_SUBTREE=( |
| "common-mk .gn" |
| "" |
| "" |
| ) |
| CROS_WORKON_INCREMENTAL_BUILD=1 |
| |
| PLATFORM_SUBDIR="aosp/frameworks/ml" |
| # Do not run test parallelly until unit tests are fixed. |
| # shellcheck disable=SC2034 |
| PLATFORM_PARALLEL_GTEST_TEST="no" |
| |
| inherit cros-workon platform flag-o-matic |
| |
| DESCRIPTION="Chrome OS port of the Android Neural Network API" |
| HOMEPAGE="https://developer.android.com/ndk/guides/neuralnetworks" |
| |
| LICENSE="BSD-Google Apache-2.0" |
| KEYWORDS="*" |
| IUSE="cpu_flags_x86_avx2 vendor-nnhal minimal-driver xnnpack fuzzer strace_ipc_driver" |
| |
| RDEPEND=" |
| chromeos-base/chromeos-config-tools:= |
| chromeos-base/chromeos-login:= |
| chromeos-base/nnapi:= |
| chromeos-base/session_manager-client:= |
| dev-cpp/abseil-cpp:= |
| dev-libs/openssl:= |
| dev-libs/re2:= |
| net-dns/c-ares:= |
| net-libs/grpc:= |
| sci-libs/tensorflow[xnnpack?] |
| sys-libs/zlib:= |
| " |
| |
| DEPEND=" |
| ${RDEPEND} |
| dev-libs/libtextclassifier |
| >=dev-cpp/eigen-3 |
| fuzzer? ( dev-libs/libprotobuf-mutator:= ) |
| " |
| |
| BDEPEND=" |
| chromeos-base/minijail |
| " |
| |
| src_configure() { |
| # This warning is triggered in tensorflow. |
| append-flags "-Wno-unused-but-set-variable" |
| if use xnnpack; then |
| append-cppflags "-DNNAPI_USE_XNNPACK_DRIVER" |
| fi |
| if use minimal-driver; then |
| append-cppflags "-DNNAPI_USE_MINIMAL_DRIVER" |
| fi |
| if use strace_ipc_driver; then |
| append-cppflags "-DSTRACE_NNAPI_HAL_IPC_DRIVER" |
| fi |
| platform_src_configure |
| } |
| |
| platform_pkg_test() { |
| local tests=( |
| chromeos common runtime runtime_generated |
| ) |
| local gtest_excl_filter="-" |
| local qemu_gtest_excl_filter="-" |
| |
| # These tests fail with Tensorflow 2.5.0. Don't want to block |
| # the uprev on that, since nothing in production is using this |
| # package yet. Tracking this test failure in following bug. |
| # TODO: b/189803299 |
| gtest_excl_filter+="TestGenerated/*.Test/svdf_bias_present*:" |
| qemu_gtest_excl_filter+="TestGenerated/*.Test/svdf_bias_present*:" |
| |
| # When running in qemu, these tests freeze the emulator when hitting |
| # EventFlag::wake from libfmq. The error printed is: |
| # Error in event flag wake attempt: Function not implemented |
| # This is a known issue, see: |
| # https://chromium.googlesource.com/chromiumos/docs/+/master/testing/running_unit_tests.md#caveats |
| # TODO(http://crbug.com/1117470): tracking bug for qemu fix |
| qemu_gtest_excl_filter+="Flavor/ExecutionTest10.Wait*:" |
| qemu_gtest_excl_filter+="Flavor/ExecutionTest11.Wait*:" |
| qemu_gtest_excl_filter+="Flavor/ExecutionTest12.Wait*:" |
| qemu_gtest_excl_filter+="Flavor/ExecutionTest13.Wait*:" |
| qemu_gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait*:" |
| qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/12:" |
| qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/15:" |
| qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/18:" |
| qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/21:" |
| qemu_gtest_excl_filter+="Unfenced/TimingTest.Test/24:" |
| qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeBadCompilation:" |
| qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeConcurrent:" |
| qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeDifferentCompilations:" |
| qemu_gtest_excl_filter+="ValidationTestBurst.BurstComputeNull:" |
| qemu_gtest_excl_filter+="ValidationTestBurst.FreeBurstBeforeMemory:" |
| qemu_gtest_excl_filter+="ValidationTestBurst.FreeMemoryBeforeBurst:" |
| qemu_gtest_excl_filter+="ValidationTestCompilation.ExecutionUsability:" |
| qemu_gtest_excl_filter+="ValidationTestCompilation.ReusableExecutionConcurrent:" |
| qemu_gtest_excl_filter+="ValidationTestCompilation.NonReusableExecutionConcurrent:" |
| qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionTiming:" |
| qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionSetTimeout:" |
| qemu_gtest_excl_filter+="ValidationTestCompilationForDevices_1.ExecutionSetTimeoutMaximum:" |
| |
| # TODO(b/244629422): Following tests are failing after _Float16 support |
| # changes in Clang (655ba9c8a1d). The tests likely need to be regolded. |
| gtest_excl_filter+="*f16*:" |
| gtest_excl_filter+="*fp16*:" |
| gtest_excl_filter+="*float16*:" |
| gtest_excl_filter+="*Float16*:" |
| gtest_excl_filter+="TestGenerated/*v1*_2*:" |
| gtest_excl_filter+="TestGenerated/*dequantize*_2*:" |
| gtest_excl_filter+="TestGenerated/*quantize*_5*:" |
| gtest_excl_filter+="TestGenerated/*quantize*_6*:" |
| gtest_excl_filter+="TestGenerated/*quantize*_7*:" |
| gtest_excl_filter+="TestGenerated/*quantize*_8*:" |
| |
| if use asan; then |
| # Some tests do not correctly clean up the Execution object and it is |
| # left 'in-flight', which gets ignored by ANeuralNetworksExecution_free. |
| # See b/161844605. |
| # Look for 'passed an in-flight ANeuralNetworksExecution' in log output |
| gtest_excl_filter+="Fenced/TimingTest.Test/2:" |
| gtest_excl_filter+="Fenced/TimingTest.Test/19:" |
| gtest_excl_filter+="Flavor/ExecutionTest10.Wait/1:" |
| gtest_excl_filter+="Flavor/ExecutionTest10.Wait/2:" |
| gtest_excl_filter+="Flavor/ExecutionTest10.Wait/4:" |
| gtest_excl_filter+="Flavor/ExecutionTest11.Wait/1:" |
| gtest_excl_filter+="Flavor/ExecutionTest11.Wait/2:" |
| gtest_excl_filter+="Flavor/ExecutionTest11.Wait/4:" |
| gtest_excl_filter+="Flavor/ExecutionTest12.Wait/1:" |
| gtest_excl_filter+="Flavor/ExecutionTest12.Wait/2:" |
| gtest_excl_filter+="Flavor/ExecutionTest12.Wait/4:" |
| gtest_excl_filter+="Flavor/ExecutionTest13.Wait/1:" |
| gtest_excl_filter+="Flavor/ExecutionTest13.Wait/2:" |
| gtest_excl_filter+="Flavor/ExecutionTest13.Wait/4:" |
| gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/1:" |
| gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/2:" |
| gtest_excl_filter+="IntrospectionFlavor/ExecutionTest13.Wait/4:" |
| |
| # This is due to a leak caused when copying the memory pools |
| # into the request object in this test. lsan_suppressions doesn't |
| # work due to the lack of /usr/bin/llvm-symbolizer, so just exclude. |
| gtest_excl_filter+="ComplianceTest.DeviceMemory:" |
| gtest_excl_filter+="ValidateRequestTest.ScalarOutput:" |
| gtest_excl_filter+="ValidateRequestTest.UnknownOutputRank:" |
| |
| # Buffer overflow here, but seems to be expected? |
| gtest_excl_filter+="OperandExtraParamsTest.TestChannelQuantValuesBadScalesCount:" |
| |
| # Leaks in CPUExecutor |
| gtest_excl_filter+="*RandomPartitioningTest*:" |
| |
| # Disable asan container overflow checks that are coming from gtest, |
| # not our code. Strangely this only started happening once we made |
| # common a shared library. |
| # See: https://crbug.com/1067977, https://crbug.com/1069722 |
| # https://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow#false-positives |
| export ASAN_OPTIONS+=":detect_container_overflow=0:detect_odr_violation=0:" |
| fi |
| if use xnnpack; then |
| # These tests don't currently work with the XNNPACK driver |
| gtest_excl_filter+="ValidationTestExecutionDeviceMemory.SetInputFromMemory*:" |
| gtest_excl_filter+="ValidationTestExecutionDeviceMemory.SetOutputFromMemory*:" |
| gtest_excl_filter+="TestGenerated/*.Test/maximum_broadcast*:" |
| gtest_excl_filter+="TestGenerated/*.Test/maximum_simple*:" |
| gtest_excl_filter+="TestGenerated/*.Test/minimum_broadcast*:" |
| gtest_excl_filter+="TestGenerated/*.Test/minimum_simple*:" |
| gtest_excl_filter+="TestGenerated/*.Test/pad*:" |
| gtest_excl_filter+="TestGenerated/*.Test/prelu*:" |
| gtest_excl_filter+="TestGenerated/*.Test/resize_bilinear_v1_3_align_corners*:" |
| gtest_excl_filter+="TestGenerated/*.Test/depthwise_conv2d_invalid_filter_dims_nhwc*:" |
| gtest_excl_filter+="TestGenerated/DeviceMemoryTest.Test/*:" |
| fi |
| local test_target |
| for test_target in "${tests[@]}"; do |
| platform_test "run" "${OUT}/${test_target}_testrunner" "0" "${gtest_excl_filter}" "${qemu_gtest_excl_filter}" |
| done |
| |
| if use xnnpack; then |
| platform_test "run" "${OUT}/runtime_xnn_testrunner" |
| fi |
| } |
| |
| src_compile() { |
| platform_src_compile |
| if use xnnpack; then |
| platform "compile" "xnn-driver" |
| if use test; then |
| platform "compile" "runtime_xnn_testrunner" |
| fi |
| fi |
| } |
| |
| src_install() { |
| platform_src_install |
| |
| einfo "Installing runtime & common Headers." |
| insinto /usr/include/aosp/frameworks/ml/nn/common |
| doins -r "${S}"/common/include |
| insinto /usr/include/aosp/frameworks/ml/nn/common |
| doins -r "${S}"/common/types |
| insinto /usr/include/aosp/frameworks/ml/nn/runtime |
| doins -r "${S}"/runtime/include |
| insinto /usr/include/aosp/frameworks/ml/nn/driver/cache |
| doins "${S}"/driver/cache/nnCache/nnCache.h |
| doins "${S}"/driver/cache/BlobCache/BlobCache.h |
| insinto /usr/include/aosp/hardware/interfaces |
| doins -r "${S}"/../../hardware/interfaces/neuralnetworks |
| |
| einfo "Installing libs." |
| dolib.so "${OUT}/lib/libneuralnetworks.so" |
| dolib.so "${OUT}/lib/libnn-common.so" |
| |
| einfo "Installing default driver" |
| dolib.so "${OUT}/lib/libfull-driver.so" |
| |
| if ! use vendor-nnhal ; then |
| einfo "Installing reference vendor hal." |
| dolib.so "${OUT}/lib/libvendor-nn-hal.so" |
| fi |
| if use minimal-driver; then |
| einfo "Installing minimal drivers" |
| dolib.so "${OUT}/lib/libminimal-driver.so" |
| fi |
| if use xnnpack; then |
| einfo "Installing xnnpack drivers" |
| dolib.so "${OUT}/lib/libxnn-driver.so" |
| fi |
| |
| einfo "Installing seccomp policy files for ${ARCH}." |
| insinto /usr/share/policy |
| newins "seccomp/nnapi-hal-driver-seccomp-${ARCH}.policy" nnapi-hal-driver-seccomp.policy |
| |
| einfo "Installing IPC HAL driver & worker" |
| dolib.so "${OUT}/lib/libipc-nn-hal.so" |
| dolib.so "${OUT}/lib/libmojo-driver-canonical.so" |
| dobin "${OUT}/nnapi_worker_canonical" |
| |
| # Install fuzz targets. |
| local fuzzer |
| for fuzzer in "${OUT}"/*_fuzzer; do |
| # ChromeOS - Platform - Technologies - Machine Learning |
| local fuzzer_component_id="831886" |
| platform_fuzzer_install "${S}"/OWNERS "${fuzzer}" \ |
| --comp "${fuzzer_component_id}" |
| done |
| } |