Skip to content

Commit d174053

Browse files
authored
Improving bridge interface and cleaning demos up. (#76)
2 parents 26bf18a + c7d0730 commit d174053

40 files changed

Lines changed: 4774 additions & 289 deletions

CMakeLists.txt

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -199,10 +199,21 @@ set(LIBTORCH_LIBS_LINKER_ARGS
199199
)
200200
cmake_print_variables(LIBTORCH_LIBS_LINKER_ARGS)
201201

202+
set(CHAI_LINKER_ARGS
203+
-M ${PROJECT_ROOT_DIR}/lib
204+
${BRIDGE_DIR}/include/bridge.h
205+
${BRIDGE_OBJECT_FILES}
206+
-L ${LIBTORCH_DIR}/lib
207+
${LIBTORCH_LIBS_LINKER_ARGS}
208+
--ccflags "-I${BRIDGE_DIR}/include -L${PROJECT_ROOT_DIR}/build"
209+
--ldflags "-L${PROJECT_ROOT_DIR}/build -Wl,-rpath,${LIBTORCH_DIR}/lib"
210+
)
211+
202212

203213
add_executable(TorchBridge ${BRIDGE_DIR}/lib/Bridge.chpl)
204214
add_dependencies(TorchBridge bridge)
205215
add_dependencies(TorchBridge ChAI)
216+
add_dependencies(TorchBridge bridge_objs)
206217
target_link_options(TorchBridge
207218
PRIVATE
208219
${BRIDGE_DIR}/include/bridge.h
@@ -228,9 +239,27 @@ add_dependencies(TinyLayerTest ChAI)
228239
target_link_options(TinyLayerTest
229240
PRIVATE
230241
--main-module layer_test.chpl
231-
# -M ${PROJECT_ROOT_DIR}/lib
242+
-M ${PROJECT_ROOT_DIR}/lib
232243
${CHAI_LINKER_ARGS}
233244
)
245+
246+
247+
add_executable(TinyBridgeSystemTest
248+
${PROJECT_ROOT_DIR}/test/tiny/bridge_system_test.chpl
249+
${CHAI_LIB_FILES}
250+
)
251+
add_dependencies(TinyBridgeSystemTest bridge)
252+
add_dependencies(TinyBridgeSystemTest ChAI)
253+
add_dependencies(TinyBridgeSystemTest bridge_objs)
254+
add_dependencies(TinyBridgeSystemTest TorchBridge)
255+
target_link_options(TinyBridgeSystemTest
256+
PRIVATE
257+
--main-module bridge_system_test.chpl
258+
-M ${PROJECT_ROOT_DIR}/lib
259+
${CHAI_LINKER_ARGS}
260+
)
261+
262+
234263
# chpl test/tiny/layer_test.chpl -M lib bridge/include/bridge.h build/CMakeFiles/bridge.dir/bridge/lib/bridge.cpp.o -L libtorch/lib -ltorch -ltorch_cpu -lc10 -ltorch_global_deps --ldflags "-Wl,-rpath,libtorch/lib"
235264

236265
# chpl --fast -o vgg test.chpl -M ../../lib /Users/iainmoncrief/Documents/Github/ChAI/bridge/include/bridge.h /Users/iainmoncrief/Documents/Github/ChAI/build/CMakeFiles/bridge.dir/bridge/lib/bridge.cpp.o -L /Users/iainmoncrief/Documents/Github/ChAI/libtorch/lib -ltorch -ltorch_cpu -lc10 -ltorch_global_deps --ldflags "-Wl,-rpath,/Users/iainmoncrief/Documents/Github/ChAI/libtorch/lib"
@@ -241,15 +270,7 @@ target_link_options(TinyLayerTest
241270

242271

243272

244-
set(CHAI_LINKER_ARGS
245-
-M ${PROJECT_ROOT_DIR}/lib
246-
${BRIDGE_DIR}/include/bridge.h
247-
${BRIDGE_OBJECT_FILES}
248-
-L ${LIBTORCH_DIR}/lib
249-
${LIBTORCH_LIBS_LINKER_ARGS}
250-
--ccflags "-I${BRIDGE_DIR}/include -L${PROJECT_ROOT_DIR}/build"
251-
--ldflags "-L${PROJECT_ROOT_DIR}/build -Wl,-rpath,${LIBTORCH_DIR}/lib"
252-
)
273+
253274

254275

255276

bridge/include/bridge.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ typedef unsigned long long uint64_t;
2020
void debug_cpu_only_mode(bool_t mode);
2121

2222
typedef struct bridge_tensor_t {
23-
float* data;
24-
int* sizes;
25-
int dim;
23+
float32_t* data;
24+
uint32_t* sizes;
25+
uint32_t dim;
2626
bool_t created_by_c;
27+
bool_t was_freed;
2728
} bridge_tensor_t;
2829

30+
void free_bridge_tensor(bridge_tensor_t bt);
2931

3032
typedef struct bridge_pt_model_t {
3133
void* pt_module;

bridge/lib/bridge.cpp

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
#include <sstream>
1515
#include <cstdlib>
1616
#include <vector>
17-
#include <cstdint>
1817
#include <chrono>
1918
#include <thread>
19+
#include <cstdio>
20+
#include <cstdint>
21+
#include <cstdlib>
2022

2123

2224

@@ -65,6 +67,8 @@ extern "C" void debug_cpu_only_mode(bool_t mode) {
6567
} else {
6668
best_device = get_best_device();
6769
}
70+
std::cout << "Debug CPU only mode: " << (debug_cpu_only ? "ON" : "OFF") << std::endl;
71+
std::cout.flush();
6872
}
6973

7074
extern "C" bool_t accelerator_available() {
@@ -81,38 +85,51 @@ torch::ScalarType get_best_dtype() {
8185
}
8286
}
8387

84-
int bridge_tensor_elements(bridge_tensor_t &bt) {
85-
int size = 1;
86-
for (int i = 0; i < bt.dim; ++i) {
87-
size *= bt.sizes[i];
88-
}
89-
return size;
90-
}
91-
92-
size_t bridge_tensor_size(bridge_tensor_t &bt) {
93-
return sizeof(float32_t) * bridge_tensor_elements(bt);
94-
}
9588

9689
void store_tensor(at::Tensor &input, float32_t* dest) {
97-
float32_t * data = input.data_ptr<float32_t>();
98-
size_t bytes_size = sizeof(float32_t) * input.numel();
90+
const float32_t * data = input.const_data_ptr<float32_t>();
91+
std::size_t bytes_size = sizeof(float32_t) * input.numel();
9992
// std::memmove(dest,data,bytes_size);
10093
std::memcpy(dest,data,bytes_size);
10194
}
10295

10396
bridge_tensor_t torch_to_bridge(at::Tensor &tensor) {
10497
bridge_tensor_t result;
10598
result.created_by_c = true;
99+
result.was_freed = false;
100+
106101
result.dim = tensor.dim();
107-
result.sizes = new int32_t[result.dim];
108-
for (int i = 0; i < result.dim; ++i) {
109-
result.sizes[i] = tensor.size(i);
102+
103+
std::size_t sizes_bytes = sizeof(uint32_t) * result.dim;
104+
result.sizes = static_cast<uint32_t*>(malloc(sizes_bytes));
105+
for (uint32_t i = 0; i < result.dim; ++i) {
106+
result.sizes[i] = static_cast<uint32_t>(tensor.size(i));
110107
}
111-
result.data = new float32_t[bridge_tensor_elements(result)];
108+
109+
std::size_t data_bytes = sizeof(float32_t) * tensor.numel();
110+
result.data = static_cast<float32_t*>(malloc(data_bytes));
112111
store_tensor(tensor, result.data);
113112
return result;
114113
}
115114

115+
extern "C" void free_bridge_tensor(bridge_tensor_t bt) {
116+
if (bt.created_by_c && !bt.was_freed) {
117+
free(bt.sizes);
118+
free(bt.data);
119+
return;
120+
} else if (!bt.created_by_c) {
121+
std::cerr << "Warning: Attempting to free a tensor not created by C code." << std::endl;
122+
std::cerr.flush();
123+
} else if (bt.was_freed) {
124+
std::cerr << "Warning: Attempting to free a tensor that has already been freed." << std::endl;
125+
std::cerr.flush();
126+
} else {
127+
std::cerr << "Warning: Attempting to free a tensor with an unknown state." << std::endl;
128+
std::cerr.flush();
129+
}
130+
}
131+
132+
116133
at::Tensor bridge_to_torch(bridge_tensor_t &bt) {
117134
std::vector<int64_t> sizes_vec(bt.sizes, bt.sizes + bt.dim);
118135
auto shape = torch::IntArrayRef(sizes_vec);
@@ -129,7 +146,6 @@ at::Tensor bridge_to_torch(bridge_tensor_t &bt,torch::Device device, bool copy,t
129146
return t.to(device, dtype, /*non_blocking=*/false, /*copy=*/true);
130147
else
131148
return t.to(device, dtype, /*non_blocking=*/false, /*copy=*/false);
132-
133149
}
134150

135151
extern "C" float32_t* unsafe(const float32_t* arr) {
@@ -229,8 +245,8 @@ extern "C" bridge_pt_model_t load_model(const uint8_t* model_path) {
229245

230246

231247

232-
bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input, bool is_vgg_based_model) {
233-
auto tn_mps = bridge_to_torch(input,best_device,true,best_dtype);
248+
extern "C" bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input) {
249+
auto tn_mps = bridge_to_torch(input,best_device,false,best_dtype);
234250
// tn_mps = tn_mps.permute({2, 0, 1}).contiguous();
235251
// tn_mps.unsqueeze_(0);//.contiguous();
236252
auto tn = tn_mps.permute({2, 0, 1}).unsqueeze(0).contiguous();
@@ -243,24 +259,12 @@ bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input, bo
243259
// auto tn_out = o.squeeze(0).permute({1, 2, 0}).contiguous();
244260
auto tn_out = o.squeeze(0).contiguous().permute({1, 2, 0}).contiguous();
245261

246-
if (is_vgg_based_model) {
247-
tn_out.div_(255.0);
248-
}
249-
250-
auto tn_out_cpu = tn_out.to(torch::kCPU,torch::kFloat32,false,true);
262+
auto tn_out_cpu = tn_out.to(torch::kCPU,torch::kFloat32,false,false);
251263

252264
return torch_to_bridge(tn_out_cpu);
253265

254266
}
255267

256-
extern "C" bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input) {
257-
return model_forward(model, input, false);
258-
}
259-
260-
extern "C" bridge_tensor_t model_forward_style_transfer(bridge_pt_model_t model, bridge_tensor_t input) {
261-
return model_forward(model, input, true);
262-
}
263-
264268
// std::tuple<uint64_t, uint64_t> get_cpu_frame_size(uint64_t width, uint64_t height, float32_t scale_factor) {
265269
// // if (best_device == torch::kMPS || best_device == torch::kCUDA)
266270
// if (accelerator_available())

demos/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ add_subdirectory(video)
33
# add_subdirectory(webcam_filter)
44

55
# add_subdirectory(torchtest)
6-
add_subdirectory(torchtest_bridge)
6+
add_subdirectory(torchtest_bridge)
7+

demos/video/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,6 @@ add_custom_command(
9999
"${CMAKE_CURRENT_SOURCE_DIR}/style-transfer/models"
100100
"$<TARGET_FILE_DIR:StyleTransfer>/style-transfer/models"
101101
COMMENT "NOT! Copying ${PROJECT_ROOT_DIR}/examples/vgg/images to $<TARGET_FILE_DIR:vgg>/images"
102-
)
102+
)
103+
104+
add_subdirectory(cpp-model-construction)
6.43 MB
Binary file not shown.

demos/video/chapel-webcam/lib/smol.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,8 @@ void chpl__init_ndarrayRandom(int64_t _ln,
3131
int32_t _fn);
3232
void chpl__init_smol(int64_t _ln,
3333
int32_t _fn);
34-
chpl_bool acceleratorAvailable(void);
3534
int64_t getScaledFrameWidth(int64_t width);
3635
int64_t getScaledFrameHeight(int64_t height);
37-
int64_t square(int64_t x);
38-
void printArray(chpl_external_array * a);
3936
void globalLoadModel(void);
4037
chpl_external_array getNewFrame(chpl_external_array * frame,
4138
int64_t height,

0 commit comments

Comments
 (0)