mediapipe
mediapipe copied to clipboard
GPU builds fail
With the newest release (v0.8.11) i can't build any solutions for gpu anymore. The problem does not occur with release v0.8.10.2.
System information (Please provide as much relevant information as possible)
- OS Platform and Distribution (e.g. Linux Ubuntu 16.04, Android 11, iOS 14.4): Ubuntu 18.04.6 LTS
- Compiler version (e.g. gcc/g++ 8 /Apple clang version 12.0.0): gcc/g++ 8.4.0
- Installed using virtualenv? pip? Conda? (if python): no
- MediaPipe version: 0.8.11
- Bazel version: 5.2.0 and also 5.3.0
- OpenCV version (if running on desktop):
3.2.0 (output of
dpkg -l | grep libopencv)
Build command / log
bazel build --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 mediapipe/examples/desktop/face_mesh:face_mesh_gpu
Starting local Bazel server and connecting to it...
DEBUG: Rule 'rules_foreign_cc' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = "c2cdcf55ffaf49366725639e45dedd449b8c3fe22b54e31625eb80ce3a240f1e"
DEBUG: Repository rules_foreign_cc instantiated at:
/home/mldev1/Documents/Misc/mediapipe-official/WORKSPACE:49:13: in <toplevel>
Repository rule http_archive defined at:
/home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/bazel_tools/tools/build_defs/repo/http.bzl:353:31: in <toplevel>
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_google_absl' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_google_benchmark' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'flatbuffers' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'pybind11_bazel' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_googlesource_code_re2' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_google_protobuf' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_google_googletest' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_github_gflags_gflags' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'zlib' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'build_bazel_rules_apple' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'build_bazel_rules_swift' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'build_bazel_apple_support' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'xctestrunner' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'pybind11' because it already exists.
DEBUG: Rule 'rules_cc' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = "691a29db9c336349e48e04c5c2f4873f2890af5cbfa6e51f4de87fefe6169294"
DEBUG: Repository rules_cc instantiated at:
/home/mldev1/Documents/Misc/mediapipe-official/WORKSPACE:42:13: in <toplevel>
Repository rule http_archive defined at:
/home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/bazel_tools/tools/build_defs/repo/http.bzl:353:31: in <toplevel>
WARNING: /home/mldev1/Documents/Misc/mediapipe-official/mediapipe/framework/tool/BUILD:185:24: in cc_library rule //mediapipe/framework/tool:field_data_cc_proto: target '//mediapipe/framework/tool:field_data_cc_proto' depends on deprecated target '@com_google_protobuf//:cc_wkt_protos': Only for backward compatibility. Do not use.
WARNING: /home/mldev1/Documents/Misc/mediapipe-official/mediapipe/framework/BUILD:54:24: in cc_library rule //mediapipe/framework:calculator_cc_proto: target '//mediapipe/framework:calculator_cc_proto' depends on deprecated target '@com_google_protobuf//:cc_wkt_protos': Only for backward compatibility. Do not use.
INFO: Analyzed target //mediapipe/examples/desktop/face_mesh:face_mesh_gpu (150 packages loaded, 6167 targets configured).
INFO: Found 1 target...
INFO: From Compiling mediapipe/framework/tool/message_type_util.cc [for host]:
mediapipe/framework/tool/message_type_util.cc: In static member function 'static int mediapipe::DescriptorReader::MatchingPrefixLength(const string&, const string&)':
mediapipe/framework/tool/message_type_util.cc:66:14: warning: comparison of integer expressions of different signedness: 'int' and 'const long unsigned int' [-Wsign-compare]
while (i < std::min(s.size(), t.size()) && s[i] == t[i]) {
~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
INFO: From Compiling tensorflow/lite/delegates/gpu/api.cc:
In file included from external/opencl_headers/CL/cl.h:20,
from external/org_tensorflow/tensorflow/lite/delegates/gpu/api.h:43,
from external/org_tensorflow/tensorflow/lite/delegates/gpu/api.cc:16:
external/opencl_headers/CL/cl_version.h:22:104: note: #pragma message: cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 300 (OpenCL 3.0)
#pragma message("cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 300 (OpenCL 3.0)")
^
INFO: From Compiling tensorflow/lite/delegates/gpu/gl/api2.cc:
In file included from external/opencl_headers/CL/cl.h:20,
from external/org_tensorflow/tensorflow/lite/delegates/gpu/api.h:43,
from external/org_tensorflow/tensorflow/lite/delegates/gpu/gl/api2.h:23,
from external/org_tensorflow/tensorflow/lite/delegates/gpu/gl/api2.cc:16:
external/opencl_headers/CL/cl_version.h:22:104: note: #pragma message: cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 300 (OpenCL 3.0)
#pragma message("cl_version.h: CL_TARGET_OPENCL_VERSION is not defined. Defaulting to 300 (OpenCL 3.0)")
^
ERROR: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/tensorflow/lite/kernels/BUILD:718:11: Compiling tensorflow/lite/kernels/batch_matmul.cc failed: (Exit 1): gcc failed: error executing command /usr/bin/gcc -U_FORTIFY_SOURCE -fstack-protector -Wall -Wunused-but-set-parameter -Wno-free-nonheap-object -fno-omit-frame-pointer '-std=c++0x' -MD -MF ... (remaining 93 arguments skipped)
Use --sandbox_debug to see verbose messages from the sandbox and retain the sandbox build root for debugging
In file included from /usr/lib/gcc/x86_64-linux-gnu/8/include/pmmintrin.h:31,
from /usr/lib/gcc/x86_64-linux-gnu/8/include/tmmintrin.h:31,
from /usr/lib/gcc/x86_64-linux-gnu/8/include/smmintrin.h:32,
from external/gemmlowp/fixedpoint/./fixedpoint_sse.h:21,
from external/gemmlowp/fixedpoint/fixedpoint.h:907,
from external/org_tensorflow/tensorflow/lite/kernels/internal/common.h:27,
from external/org_tensorflow/tensorflow/lite/kernels/internal/reference/batch_matmul.h:21,
from external/org_tensorflow/tensorflow/lite/kernels/batch_matmul.cc:16:
external/arm_neon_2_x86_sse/NEON_2_SSE.h: In static member function 'static void tflite::cpu_backend_gemm::detail::CustomGemvImpl<LhsScalar, RhsScalar, int, DstScalar, quantization_flavor>::Run(const tflite::cpu_backend_gemm::MatrixParams<LhsScalar>&, const LhsScalar*, const tflite::cpu_backend_gemm::MatrixParams<RhsScalar>&, const RhsScalar*, const tflite::cpu_backend_gemm::MatrixParams<DstScalar>&, DstScalar*, const tflite::cpu_backend_gemm::GemmParams<int, DstScalar, quantization_flavor>&, int, int) [with LhsScalar = signed char; RhsScalar = signed char; DstScalar = signed char; tflite::cpu_backend_gemm::QuantizationFlavor quantization_flavor = (tflite::cpu_backend_gemm::QuantizationFlavor)1]':
external/arm_neon_2_x86_sse/NEON_2_SSE.h:2290:30: error: selector must be an integer constant in the range 0..7
#define _MM_INSERT_EPI16 _mm_insert_epi16
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:9363:40: note: in expansion of macro '_MM_INSERT_EPI16'
#define vld1q_lane_s16(ptr, vec, lane) _MM_INSERT_EPI16(vec, *(ptr), lane)
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:12084:12: note: in expansion of macro 'vld1q_lane_s16'
return vld1q_lane_s16(&val, vec, lane);
^~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:2290:30: error: selector must be an integer constant in the range 0..7
#define _MM_INSERT_EPI16 _mm_insert_epi16
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:9363:40: note: in expansion of macro '_MM_INSERT_EPI16'
#define vld1q_lane_s16(ptr, vec, lane) _MM_INSERT_EPI16(vec, *(ptr), lane)
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:12084:12: note: in expansion of macro 'vld1q_lane_s16'
return vld1q_lane_s16(&val, vec, lane);
^~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:2290:30: error: selector must be an integer constant in the range 0..7
#define _MM_INSERT_EPI16 _mm_insert_epi16
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:9363:40: note: in expansion of macro '_MM_INSERT_EPI16'
#define vld1q_lane_s16(ptr, vec, lane) _MM_INSERT_EPI16(vec, *(ptr), lane)
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:12084:12: note: in expansion of macro 'vld1q_lane_s16'
return vld1q_lane_s16(&val, vec, lane);
^~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:2290:30: error: selector must be an integer constant in the range 0..7
#define _MM_INSERT_EPI16 _mm_insert_epi16
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:9363:40: note: in expansion of macro '_MM_INSERT_EPI16'
#define vld1q_lane_s16(ptr, vec, lane) _MM_INSERT_EPI16(vec, *(ptr), lane)
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:12084:12: note: in expansion of macro 'vld1q_lane_s16'
return vld1q_lane_s16(&val, vec, lane);
^~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:2290:30: error: selector must be an integer constant in the range 0..7
#define _MM_INSERT_EPI16 _mm_insert_epi16
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:9363:40: note: in expansion of macro '_MM_INSERT_EPI16'
#define vld1q_lane_s16(ptr, vec, lane) _MM_INSERT_EPI16(vec, *(ptr), lane)
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:12084:12: note: in expansion of macro 'vld1q_lane_s16'
return vld1q_lane_s16(&val, vec, lane);
^~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:2290:30: error: selector must be an integer constant in the range 0..7
#define _MM_INSERT_EPI16 _mm_insert_epi16
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:9363:40: note: in expansion of macro '_MM_INSERT_EPI16'
#define vld1q_lane_s16(ptr, vec, lane) _MM_INSERT_EPI16(vec, *(ptr), lane)
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:12084:12: note: in expansion of macro 'vld1q_lane_s16'
return vld1q_lane_s16(&val, vec, lane);
^~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:2290:30: error: selector must be an integer constant in the range 0..7
#define _MM_INSERT_EPI16 _mm_insert_epi16
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:9363:40: note: in expansion of macro '_MM_INSERT_EPI16'
#define vld1q_lane_s16(ptr, vec, lane) _MM_INSERT_EPI16(vec, *(ptr), lane)
^~~~~~~~~~~~~~~~
external/arm_neon_2_x86_sse/NEON_2_SSE.h:12084:12: note: in expansion of macro 'vld1q_lane_s16'
return vld1q_lane_s16(&val, vec, lane);
^~~~~~~~~~~~~~
Target //mediapipe/examples/desktop/face_mesh:face_mesh_gpu failed to build
Use --verbose_failures to see the command lines of failed build steps.
INFO: Elapsed time: 439.866s, Critical Path: 223.17s
INFO: 1534 processes: 385 internal, 1149 linux-sandbox.
FAILED: Build did NOT complete successfully
Hi @vertify-mldev1,
Due to the latest release 8.11, *tflite model and other large binaries are moved to Google Cloud Storage as mentioned in the release note. Please update your Python binaries if they are fetching models from GitHub (see download_utils.py) and let us know if this resolves the issue.
Thank you!
Hi @vertify-mldev1, Could you confirm that as per above comment you are able to build the facemeshgpuin the latest release 0.8.11 or still issue exists. Thank you!
Model download works without problems:
>>> download_utils.download_oss_model('mediapipe/modules/face_landmark/face_landmark.tflite')
Downloading model to /home/mldev1/Documents/mediapipe/mediapipe/modules/face_landmark/face_landmark.tflite
My problem is unrelated to that. During the build this python script won't be run anyway right?
Hi @vertify-mldev1, Models file are important while building the MediaPipe but due to latest release it might have impacted. Could you try once to build it with updated download_utils.py and please let us know if you are encountering the same error.Thank you!
Yes, I aleady had the latest version of download_utils.py when i opened the issue
Hi @vertify-mldev1, Could you please provide complete steps to reproduce the issue and System information as mentioned in the template. Thank you!
Sure, I now updated the problem description above
Hi @vertify-mldev1, Could you please confirm that you are able to install Hello world example of MediaPipe as mentioned here to build Face Mesh in the ubuntu. Thank you!
Yes, the hello world example works:
bazel run --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 mediapipe/examples/desktop/hello_world:hello_world
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_google_absl' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_google_benchmark' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'flatbuffers' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'pybind11_bazel' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_googlesource_code_re2' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_google_protobuf' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_google_googletest' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'com_github_gflags_gflags' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'zlib' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'build_bazel_rules_apple' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'build_bazel_rules_swift' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'build_bazel_apple_support' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'xctestrunner' because it already exists.
DEBUG: /home/mldev1/.cache/bazel/_bazel_mldev1/824bf6172127d18cb1057a50b98d1e6a/external/org_tensorflow/third_party/repo.bzl:132:14:
Warning: skipping import of repository 'pybind11' because it already exists.
WARNING: /home/mldev1/Documents/Misc/mediapipe-official/mediapipe/framework/BUILD:54:24: in cc_library rule //mediapipe/framework:calculator_cc_proto: target '//mediapipe/framework:calculator_cc_proto' depends on deprecated target '@com_google_protobuf//:cc_wkt_protos': Only for backward compatibility. Do not use.
WARNING: /home/mldev1/Documents/Misc/mediapipe-official/mediapipe/framework/tool/BUILD:185:24: in cc_library rule //mediapipe/framework/tool:field_data_cc_proto: target '//mediapipe/framework/tool:field_data_cc_proto' depends on deprecated target '@com_google_protobuf//:cc_wkt_protos': Only for backward compatibility. Do not use.
INFO: Analyzed target //mediapipe/examples/desktop/hello_world:hello_world (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //mediapipe/examples/desktop/hello_world:hello_world up-to-date:
bazel-bin/mediapipe/examples/desktop/hello_world/hello_world
INFO: Elapsed time: 0.203s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
I20220921 13:45:00.808912 21287 hello_world.cc:57] Hello World!
I20220921 13:45:00.809016 21287 hello_world.cc:57] Hello World!
I20220921 13:45:00.809036 21287 hello_world.cc:57] Hello World!
I20220921 13:45:00.809052 21287 hello_world.cc:57] Hello World!
I20220921 13:45:00.809069 21287 hello_world.cc:57] Hello World!
I20220921 13:45:00.809090 21287 hello_world.cc:57] Hello World!
I20220921 13:45:00.809166 21287 hello_world.cc:57] Hello World!
I20220921 13:45:00.809224 21287 hello_world.cc:57] Hello World!
I20220921 13:45:00.809288 21287 hello_world.cc:57] Hello World!
I20220921 13:45:00.809346 21287 hello_world.cc:57] Hello World!
Could resolve the issue. I updated gcc/g++ to 9.4.0 and encountered some other build issues.
After cleaning the bazel cache (by running bazel clean --expunge) everything works.
Retried it with a clean bazel cache and gcc/g++ 8.4.0 and i got the same error as in the issue description.
Hi @vertify-mldev1, Good to hear that the issue has been fixed as per above command mentioned. Could we move this issue to close status as it has been fixed. Thank you!
failed to build a debug type of examples with the same error, but successfully build opt type -c opt.
bazel build -c dbg --copt -DMEDIAPIPE_OMIT_EGL_WINDOW_BIT --copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11 mediapipe/examples/desktop/selfie_segmentation:selfie_segmentation_gpu
mediapipe: v0.8.11 bazel 5.3.2 mediapipe redhat 8.4 gcc (GCC) 8.4.1 20200928 (Red Hat 8.4.1-1)