Skip to content

Commit 21d2587

Browse files
vawalealexreinking
andauthored
Add CMake for onnx app (#8707)
* Use py::array::request().itemsize instead of py::array::itemsize() `py::array::itemsize()` returns 0 for tests in `model_test.py`. I could not really figure out why from pybind11 docs. Using `request().itemsize` on the other hand always returns the correct item size. * Add CMake build for onnx app Adds CMakeLists.txt file for cmake build of onnx app. The build logic is kept same as the one from corresponding Makefile. * Fix unused struct member issue * Pass Adams2019 via MODEL_AUTOSCHEDULER env-var * Add pytest to dependencies, which was missing from one * Add DEPENDS argument to add_halide_library * Lock ONNX to 1.18.0 & update dependency specs * Update exclude patterns for halide_as_onnx_backend_test.py Fixes #8737 --------- Co-authored-by: Alex Reinking <[email protected]>
1 parent 214388e commit 21d2587

11 files changed

+1403
-70
lines changed

apps/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ add_app(local_laplacian)
5757
add_app(max_filter)
5858
add_app(nl_means)
5959
# add_app(nn_ops) # TODO(#5374): missing CMake build
60-
# add_app(onnx) # TODO(#5374): missing CMake build
60+
add_app(onnx)
6161
add_app(resize)
6262
# add_app(resnet_50) # TODO(#5374): missing CMake build
6363
# add_app(simd_op_check) # TODO(#5374): missing CMake build

apps/onnx/CMakeLists.txt

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
cmake_minimum_required(VERSION 3.28)
2+
project(onnx_app)
3+
4+
enable_testing()
5+
6+
# Set up language settings
7+
set(CMAKE_CXX_STANDARD 17)
8+
set(CMAKE_CXX_STANDARD_REQUIRED YES)
9+
set(CMAKE_CXX_EXTENSIONS NO)
10+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
11+
12+
find_package(Protobuf)
13+
if (NOT Protobuf_FOUND)
14+
message(WARNING "Could NOT find Protobuf")
15+
return()
16+
endif ()
17+
18+
find_package(Halide REQUIRED)
19+
20+
# Download onnx.proto
21+
include(FetchContent)
22+
FetchContent_Declare(
23+
onnx
24+
GIT_REPOSITORY https://github.com/onnx/onnx.git
25+
GIT_TAG e709452ef2bbc1d113faf678c24e6d3467696e83 # v1.18.0
26+
SOURCE_SUBDIR do-not-load/
27+
)
28+
FetchContent_MakeAvailable(onnx)
29+
30+
# Add library that converts ONNX models to Halide operators
31+
add_library(oclib STATIC)
32+
add_library(onnx_app::oclib ALIAS oclib)
33+
34+
target_sources(oclib PRIVATE onnx_converter.cc "${onnx_SOURCE_DIR}/onnx/onnx.proto")
35+
protobuf_generate(
36+
TARGET oclib
37+
LANGUAGE cpp
38+
PROTOC_OUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/_protoc_out
39+
IMPORT_DIRS ${onnx_SOURCE_DIR}
40+
)
41+
target_include_directories(oclib PUBLIC "${CMAKE_CURRENT_BINARY_DIR}/_protoc_out")
42+
target_link_libraries(oclib PUBLIC Halide::Halide protobuf::libprotobuf-lite)
43+
target_compile_definitions(oclib PUBLIC GOOGLE_PROTOBUF_NO_RTTI)
44+
45+
# Add test for the onnx converter library (oclib)
46+
add_executable(onnx_converter_test onnx_converter_test.cc)
47+
target_link_libraries(onnx_converter_test PRIVATE onnx_app::oclib)
48+
49+
add_test(NAME onnx_converter_test
50+
COMMAND onnx_converter_test)
51+
set_tests_properties(
52+
onnx_converter_test PROPERTIES
53+
LABELS onnx
54+
PASS_REGULAR_EXPRESSION "Success!"
55+
SKIP_REGULAR_EXPRESSION "\\[SKIP\\]"
56+
)
57+
58+
# Generator
59+
add_halide_generator(
60+
onnx_converter.generator
61+
SOURCES onnx_converter_generator.cc
62+
LINK_LIBRARIES onnx_app::oclib
63+
)
64+
65+
# Generate test onnx model
66+
add_custom_command(
67+
OUTPUT test_model.onnx
68+
COMMAND
69+
protobuf::protoc
70+
--encode=onnx.ModelProto
71+
"--proto_path=${onnx_SOURCE_DIR}"
72+
"$<SHELL_PATH:${onnx_SOURCE_DIR}/onnx/onnx.proto>"
73+
< "$<SHELL_PATH:${CMAKE_CURRENT_SOURCE_DIR}/test_model_proto.txt>"
74+
> test_model.onnx
75+
DEPENDS protobuf::protoc ${onnx_SOURCE_DIR}/onnx/onnx.proto
76+
COMMENT "Generating test ONNX model from proto content"
77+
MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/test_model_proto.txt
78+
VERBATIM
79+
)
80+
81+
# Generate static library using halide generator for test onnx model
82+
add_halide_library(
83+
test_model FROM onnx_converter.generator
84+
GENERATOR onnx_model_generator
85+
PARAMS model_file_path=${CMAKE_CURRENT_BINARY_DIR}/test_model.onnx
86+
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/test_model.onnx
87+
AUTOSCHEDULER Halide::Adams2019
88+
)
89+
90+
# Test the generated static library
91+
add_executable(onnx_converter_generator_test onnx_converter_generator_test.cc)
92+
target_link_libraries(onnx_converter_generator_test PRIVATE Halide::Runtime test_model)
93+
94+
add_test(NAME onnx_converter_generator_test
95+
COMMAND onnx_converter_generator_test)
96+
set_tests_properties(
97+
onnx_converter_generator_test
98+
PROPERTIES
99+
LABELS onnx
100+
PASS_REGULAR_EXPRESSION "Success!"
101+
SKIP_REGULAR_EXPRESSION "\\[SKIP\\]"
102+
)
103+
104+
# Python bindings to convert onnx models to Halide model
105+
find_package(Python 3 COMPONENTS Interpreter Development)
106+
if (NOT Python_FOUND)
107+
message(WARNING "Could NOT find Python")
108+
return()
109+
endif ()
110+
111+
find_package(pybind11 HINTS "${Python_SITEARCH}")
112+
if (NOT pybind11_FOUND)
113+
message(WARNING "Could NOT find pybind11")
114+
return()
115+
endif ()
116+
117+
pybind11_add_module(
118+
model_cpp model.cpp benchmarking_utils.h common_types.h denormal_disabler.h
119+
)
120+
target_link_libraries(model_cpp PRIVATE Halide::Halide onnx_app::oclib)
121+
122+
add_test(
123+
NAME model_test
124+
COMMAND ${Python_EXECUTABLE} -m unittest ${CMAKE_CURRENT_SOURCE_DIR}/model_test.py -v
125+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
126+
)
127+
add_test(
128+
NAME halide_as_onnx_backend_test
129+
COMMAND ${Python_EXECUTABLE} -m unittest ${CMAKE_CURRENT_SOURCE_DIR}/halide_as_onnx_backend_test.py -v
130+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
131+
)
132+
set_tests_properties(
133+
halide_as_onnx_backend_test
134+
model_test
135+
PROPERTIES
136+
LABELS onnx
137+
PASS_REGULAR_EXPRESSION "OK"
138+
SKIP_REGULAR_EXPRESSION "\\[SKIP\\]"
139+
ENVIRONMENT "PYTHONPATH=$<TARGET_FILE_DIR:model_cpp>;MODEL_AUTOSCHEDULER=$<TARGET_FILE:Halide::Adams2019>"
140+
TIMEOUT 120
141+
)

apps/onnx/denormal_disabler.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ class DenormalDisabler {
3535
}
3636

3737
private:
38+
#ifdef __SSE__
3839
unsigned int csr_ = 0;
3940
bool need_restore_ = false;
41+
#endif
4042
// Interpret denormal as zero (DAZ) bit
4143
static constexpr unsigned int DAZ = 0x0040;
4244
// Flush denormal to zero (FTZ) bit

0 commit comments

Comments
 (0)