Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 31 additions & 10 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,21 @@ set(LIBTORCH_LIBS_LINKER_ARGS
)
cmake_print_variables(LIBTORCH_LIBS_LINKER_ARGS)

set(CHAI_LINKER_ARGS
-M ${PROJECT_ROOT_DIR}/lib
${BRIDGE_DIR}/include/bridge.h
${BRIDGE_OBJECT_FILES}
-L ${LIBTORCH_DIR}/lib
${LIBTORCH_LIBS_LINKER_ARGS}
--ccflags "-I${BRIDGE_DIR}/include -L${PROJECT_ROOT_DIR}/build"
--ldflags "-L${PROJECT_ROOT_DIR}/build -Wl,-rpath,${LIBTORCH_DIR}/lib"
)


add_executable(TorchBridge ${BRIDGE_DIR}/lib/Bridge.chpl)
add_dependencies(TorchBridge bridge)
add_dependencies(TorchBridge ChAI)
add_dependencies(TorchBridge bridge_objs)
target_link_options(TorchBridge
PRIVATE
${BRIDGE_DIR}/include/bridge.h
Expand All @@ -228,9 +239,27 @@ add_dependencies(TinyLayerTest ChAI)
target_link_options(TinyLayerTest
PRIVATE
--main-module layer_test.chpl
# -M ${PROJECT_ROOT_DIR}/lib
-M ${PROJECT_ROOT_DIR}/lib
${CHAI_LINKER_ARGS}
)


add_executable(TinyBridgeSystemTest
${PROJECT_ROOT_DIR}/test/tiny/bridge_system_test.chpl
${CHAI_LIB_FILES}
)
add_dependencies(TinyBridgeSystemTest bridge)
add_dependencies(TinyBridgeSystemTest ChAI)
add_dependencies(TinyBridgeSystemTest bridge_objs)
add_dependencies(TinyBridgeSystemTest TorchBridge)
target_link_options(TinyBridgeSystemTest
PRIVATE
--main-module bridge_system_test.chpl
-M ${PROJECT_ROOT_DIR}/lib
${CHAI_LINKER_ARGS}
)


# 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"

# 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"
Expand All @@ -241,15 +270,7 @@ target_link_options(TinyLayerTest



set(CHAI_LINKER_ARGS
-M ${PROJECT_ROOT_DIR}/lib
${BRIDGE_DIR}/include/bridge.h
${BRIDGE_OBJECT_FILES}
-L ${LIBTORCH_DIR}/lib
${LIBTORCH_LIBS_LINKER_ARGS}
--ccflags "-I${BRIDGE_DIR}/include -L${PROJECT_ROOT_DIR}/build"
--ldflags "-L${PROJECT_ROOT_DIR}/build -Wl,-rpath,${LIBTORCH_DIR}/lib"
)




Expand Down
8 changes: 5 additions & 3 deletions bridge/include/bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@ typedef unsigned long long uint64_t;
void debug_cpu_only_mode(bool_t mode);

typedef struct bridge_tensor_t {
float* data;
int* sizes;
int dim;
float32_t* data;
uint32_t* sizes;
uint32_t dim;
bool_t created_by_c;
bool_t was_freed;
} bridge_tensor_t;

void free_bridge_tensor(bridge_tensor_t bt);

typedef struct bridge_pt_model_t {
void* pt_module;
Expand Down
72 changes: 38 additions & 34 deletions bridge/lib/bridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@
#include <sstream>
#include <cstdlib>
#include <vector>
#include <cstdint>
#include <chrono>
#include <thread>
#include <cstdio>
#include <cstdint>
#include <cstdlib>



Expand Down Expand Up @@ -65,6 +67,8 @@ extern "C" void debug_cpu_only_mode(bool_t mode) {
} else {
best_device = get_best_device();
}
std::cout << "Debug CPU only mode: " << (debug_cpu_only ? "ON" : "OFF") << std::endl;
std::cout.flush();
}

extern "C" bool_t accelerator_available() {
Expand All @@ -81,38 +85,51 @@ torch::ScalarType get_best_dtype() {
}
}

int bridge_tensor_elements(bridge_tensor_t &bt) {
int size = 1;
for (int i = 0; i < bt.dim; ++i) {
size *= bt.sizes[i];
}
return size;
}

size_t bridge_tensor_size(bridge_tensor_t &bt) {
return sizeof(float32_t) * bridge_tensor_elements(bt);
}

void store_tensor(at::Tensor &input, float32_t* dest) {
float32_t * data = input.data_ptr<float32_t>();
size_t bytes_size = sizeof(float32_t) * input.numel();
const float32_t * data = input.const_data_ptr<float32_t>();
std::size_t bytes_size = sizeof(float32_t) * input.numel();
// std::memmove(dest,data,bytes_size);
std::memcpy(dest,data,bytes_size);
}

bridge_tensor_t torch_to_bridge(at::Tensor &tensor) {
bridge_tensor_t result;
result.created_by_c = true;
result.was_freed = false;

result.dim = tensor.dim();
result.sizes = new int32_t[result.dim];
for (int i = 0; i < result.dim; ++i) {
result.sizes[i] = tensor.size(i);

std::size_t sizes_bytes = sizeof(uint32_t) * result.dim;
result.sizes = static_cast<uint32_t*>(malloc(sizes_bytes));
for (uint32_t i = 0; i < result.dim; ++i) {
result.sizes[i] = static_cast<uint32_t>(tensor.size(i));
}
result.data = new float32_t[bridge_tensor_elements(result)];

std::size_t data_bytes = sizeof(float32_t) * tensor.numel();
result.data = static_cast<float32_t*>(malloc(data_bytes));
store_tensor(tensor, result.data);
return result;
}

extern "C" void free_bridge_tensor(bridge_tensor_t bt) {
if (bt.created_by_c && !bt.was_freed) {
free(bt.sizes);
free(bt.data);
return;
} else if (!bt.created_by_c) {
std::cerr << "Warning: Attempting to free a tensor not created by C code." << std::endl;
std::cerr.flush();
} else if (bt.was_freed) {
std::cerr << "Warning: Attempting to free a tensor that has already been freed." << std::endl;
std::cerr.flush();
} else {
std::cerr << "Warning: Attempting to free a tensor with an unknown state." << std::endl;
std::cerr.flush();
}
}


at::Tensor bridge_to_torch(bridge_tensor_t &bt) {
std::vector<int64_t> sizes_vec(bt.sizes, bt.sizes + bt.dim);
auto shape = torch::IntArrayRef(sizes_vec);
Expand All @@ -129,7 +146,6 @@ at::Tensor bridge_to_torch(bridge_tensor_t &bt,torch::Device device, bool copy,t
return t.to(device, dtype, /*non_blocking=*/false, /*copy=*/true);
else
return t.to(device, dtype, /*non_blocking=*/false, /*copy=*/false);

}

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



bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input, bool is_vgg_based_model) {
auto tn_mps = bridge_to_torch(input,best_device,true,best_dtype);
extern "C" bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input) {
auto tn_mps = bridge_to_torch(input,best_device,false,best_dtype);
// tn_mps = tn_mps.permute({2, 0, 1}).contiguous();
// tn_mps.unsqueeze_(0);//.contiguous();
auto tn = tn_mps.permute({2, 0, 1}).unsqueeze(0).contiguous();
Expand All @@ -243,24 +259,12 @@ bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input, bo
// auto tn_out = o.squeeze(0).permute({1, 2, 0}).contiguous();
auto tn_out = o.squeeze(0).contiguous().permute({1, 2, 0}).contiguous();

if (is_vgg_based_model) {
tn_out.div_(255.0);
}

auto tn_out_cpu = tn_out.to(torch::kCPU,torch::kFloat32,false,true);
auto tn_out_cpu = tn_out.to(torch::kCPU,torch::kFloat32,false,false);

return torch_to_bridge(tn_out_cpu);

}

extern "C" bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input) {
return model_forward(model, input, false);
}

extern "C" bridge_tensor_t model_forward_style_transfer(bridge_pt_model_t model, bridge_tensor_t input) {
return model_forward(model, input, true);
}

// std::tuple<uint64_t, uint64_t> get_cpu_frame_size(uint64_t width, uint64_t height, float32_t scale_factor) {
// // if (best_device == torch::kMPS || best_device == torch::kCUDA)
// if (accelerator_available())
Expand Down
3 changes: 2 additions & 1 deletion demos/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ add_subdirectory(video)
# add_subdirectory(webcam_filter)

# add_subdirectory(torchtest)
add_subdirectory(torchtest_bridge)
add_subdirectory(torchtest_bridge)

4 changes: 3 additions & 1 deletion demos/video/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,6 @@ add_custom_command(
"${CMAKE_CURRENT_SOURCE_DIR}/style-transfer/models"
"$<TARGET_FILE_DIR:StyleTransfer>/style-transfer/models"
COMMENT "NOT! Copying ${PROJECT_ROOT_DIR}/examples/vgg/images to $<TARGET_FILE_DIR:vgg>/images"
)
)

add_subdirectory(cpp-model-construction)
Binary file not shown.
3 changes: 0 additions & 3 deletions demos/video/chapel-webcam/lib/smol.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,8 @@ void chpl__init_ndarrayRandom(int64_t _ln,
int32_t _fn);
void chpl__init_smol(int64_t _ln,
int32_t _fn);
chpl_bool acceleratorAvailable(void);
int64_t getScaledFrameWidth(int64_t width);
int64_t getScaledFrameHeight(int64_t height);
int64_t square(int64_t x);
void printArray(chpl_external_array * a);
void globalLoadModel(void);
chpl_external_array getNewFrame(chpl_external_array * frame,
int64_t height,
Expand Down
Loading
Loading