From b3c2ffae11ddeff7016ece6cad09952ab66a7571 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 11 Nov 2024 15:04:19 -0800 Subject: [PATCH 001/136] Impelements AMS-tensor interface --- src/AMSlib/util/{ArrayRef.h => ArrayRef.hpp} | 2 +- src/AMSlib/util/SmallVector.cpp | 2 +- .../util/{SmallVector.h => SmallVector.hpp} | 0 src/AMSlib/util/tensor.hpp | 404 ++++++++++++++++++ src/AMSlib/wf/resource_manager.cpp | 14 +- src/AMSlib/wf/resource_manager.hpp | 8 +- src/AMSlib/wf/utils.hpp | 15 + src/AMSlib/wf/workflow.hpp | 4 +- tests/AMSlib/CMakeLists.txt | 31 +- tests/AMSlib/ams_tensor_test.cpp | 199 +++++++++ 10 files changed, 663 insertions(+), 16 deletions(-) rename src/AMSlib/util/{ArrayRef.h => ArrayRef.hpp} (99%) rename src/AMSlib/util/{SmallVector.h => SmallVector.hpp} (100%) create mode 100644 src/AMSlib/util/tensor.hpp create mode 100644 tests/AMSlib/ams_tensor_test.cpp diff --git a/src/AMSlib/util/ArrayRef.h b/src/AMSlib/util/ArrayRef.hpp similarity index 99% rename from src/AMSlib/util/ArrayRef.h rename to src/AMSlib/util/ArrayRef.hpp index b9c6eef7..503da8d3 100644 --- a/src/AMSlib/util/ArrayRef.h +++ b/src/AMSlib/util/ArrayRef.hpp @@ -19,7 +19,7 @@ #include #include -#include "SmallVector.h" +#include "SmallVector.hpp" namespace ams { diff --git a/src/AMSlib/util/SmallVector.cpp b/src/AMSlib/util/SmallVector.cpp index 4276dd0b..6959b86a 100644 --- a/src/AMSlib/util/SmallVector.cpp +++ b/src/AMSlib/util/SmallVector.cpp @@ -22,7 +22,7 @@ #include #include -#include "SmallVector.h" +#include "SmallVector.hpp" using namespace ams; // Check that no bytes are wasted and everything is well-aligned. diff --git a/src/AMSlib/util/SmallVector.h b/src/AMSlib/util/SmallVector.hpp similarity index 100% rename from src/AMSlib/util/SmallVector.h rename to src/AMSlib/util/SmallVector.hpp diff --git a/src/AMSlib/util/tensor.hpp b/src/AMSlib/util/tensor.hpp new file mode 100644 index 00000000..b466c5a0 --- /dev/null +++ b/src/AMSlib/util/tensor.hpp @@ -0,0 +1,404 @@ +#include +#include +#include + +#include "AMS.h" +#include "ArrayRef.hpp" +#include "SmallVector.h" +#include "wf/data_handler.hpp" +#include "wf/resource_manager.hpp" +#include "wf/utils.hpp" + +class AMSTensor +{ + uint8_t* _data; + size_t _elements; + size_t _element_size; + ams::SmallVector _shape; + ams::SmallVector _strides; + AMSDType _dType; // AMS_SINGLE/AMS_DOUBLE + AMSResourceType _location; // CPU/GPU/Pinned + bool _owned; + + +private: + /** + * @brief Creates a new tensor by casting all elements to the specified target type. + * @tparam TargetType The data type to cast each element to. + * @param[in] targetType The target AMSDType representing the target data type (e.g., AMS_SINGLE or AMS_DOUBLE). + * @return A new AMSTensor with the elements cast to the specified type. + */ + template + AMSTensor castTensor(AMSDType targetType) const + { + // Create new tensor with same shape and strides, but different data type + AMSTensor newTensor(_shape, _strides, targetType, _location); + auto& rm = ams::ResourceManager::getInstance(); + + if (_dType == targetType) { + rm.copy( + _data, _location, newTensor.data(), _location, _elements); + return newTensor; + } + + // Perform element-wise conversion + assert(_location == AMS_HOST && "Unsupported GPU implementation"); + if (_dType == AMS_SINGLE) { + ams::DataHandler::cast_from_typevalue(_elements, + newTensor.data(), + data()); + } else if (_dType == AMS_DOUBLE) { + ams::DataHandler::cast_from_typevalue( + _elements, newTensor.data(), data()); + } else { + throw std::runtime_error("Unsupported source data type in castTensor."); + } + + return newTensor; + } + + /** + * @brief Constructs a new AMSTensor with the specified shape, strides, data type, and location. + * This constructor is private and intended for internal use, such as creating views. + * @param[in] shapes The shape of the tensor. + * @param[in] strides The strides of the tensor. + * @param[in] dType The data type of the tensor elements. + * @param[in] location The memory location (e.g., CPU, GPU). + * @param[in] view Set to true if this tensor is a view of another tensor (non-owning). + */ + explicit AMSTensor(ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSDType dType, + AMSResourceType location, + bool view = false) + : _elements(computeNumElements(shapes)), + _element_size(dtype_to_size(dType)), + _shape(shapes), + _strides(strides), + _dType(dType), + _location(location), + _owned(view) + { + auto& rm = ams::ResourceManager::getInstance(); + if (!view) { + _data = rm.allocate(_elements * _element_size, + _location, + _element_size); + if (!_data) { + throw std::runtime_error("Failed to allocate memory for AMSTensor."); + } + } + } + + +public: + /** + * @brief Creates a new AMSTensor and allocates the tensor memory. + * @param[in] shapes The shape of the tensor. + * @param[in] strides The strides of the tensor. + * @param[in] dType The data type of the tensor elements. + * @param[in] location The memory location (e.g., CPU, GPU). + * @return A new AMSTensor with allocated memory. + */ + static AMSTensor create(ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSDType dType, + AMSResourceType location) + { + return AMSTensor(shapes, strides, dType, location); + } + + /** + * @brief Creates a view on an existing memory buffer. + * @param[in] data Pointer to the existing data to be viewed. + * @param[in] shapes The shape of the view tensor. + * @param[in] strides The strides of the view tensor. + * @param[in] dType The data type of the tensor elements. + * @param[in] location The memory location (e.g., CPU, GPU). + * @return A new AMSTensor that acts as a view of the existing data. + */ + static AMSTensor view(uint8_t* data, + ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSDType dType, + AMSResourceType location) + { + auto tensor = AMSTensor(shapes, strides, dType, location, true); + tensor._data = data; + return tensor; + } + + /** + * @brief Destructor for AMSTensor, deallocates memory if this tensor owns it. + */ + ~AMSTensor() + { + // Only release whenwe own the pointer + if (_owned && _data) { + auto& rm = ams::ResourceManager::getInstance(); + rm.deallocate(_data, _location); + } + } + + /** + * @brief Deleted copy assignment operator to prevent copying of tensors. + */ + AMSTensor(const AMSTensor&) = delete; + + /** + * @brief Move constructor for AMSTensor, transfers ownership of data. + * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. + */ + AMSTensor& operator=(const AMSTensor&) = delete; + + /** + * @brief Move assignment operator for AMSTensor, transfers ownership of data. + * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. + * @return A reference to the updated tensor after move assignment. + */ + AMSTensor(AMSTensor&& other) noexcept + : _data(other._data), + _elements(other._elements), + _element_size(other._element_size), + _shape(std::move(other._shape)), + _strides(std::move(other._strides)), + _dType(other._dType), + _location(other._location), + _owned(other._owned) + { + other._data = nullptr; + other._owned = false; + } + + // Define move assignment operator + AMSTensor& operator=(AMSTensor&& other) noexcept + { + if (this != &other) { + // Free existing resources + + // Steal resources from `other` + _data = other._data; + _elements = other._elements; + _element_size = other._element_size; + _shape = std::move(other._shape); + _strides = std::move(other._strides); + _dType = other._dType; + _location = other._location; + _owned = other._owned; + + other._data = nullptr; + other._owned = false; + } + return *this; + } + + + /** + * @brief Retrieves a typed pointer to the underlying data. + * @tparam T The data type to retrieve. + * @return A typed pointer to the tensor's data. + */ + template + T* data() const + { + return reinterpret_cast(_data); + } + + + /** + * @brief Retrieves a specific element by index with bounds checking. + * @tparam T The data type of the element to retrieve. + * @param[in] index The index of the element to access. + * @return A reference to the specified element. + * @throw std::out_of_range if index is out of bounds. + */ + template + T& at(std::size_t index) const + { + if (index >= _elements) { + throw std::out_of_range("Index out of bounds in AMSTensor."); + } + return data()[index]; + } + + /** + * @brief Creates a copy of the tensor with elements converted to float (32-bit) representation. + * @return A new AMSTensor with float (32-bit) elements. + */ + AMSTensor fp32() const { return castTensor(AMS_SINGLE); } + + /** + * @brief Creates a copy of the tensor with elements converted to double (64-bit) representation. + * @return A new AMSTensor with double (64-bit) elements. + */ + AMSTensor fp64() const { return castTensor(AMS_DOUBLE); } + + + /** + * @brief Creates a transposed view of the tensor by swapping two specified axes. + * @param[in] axis1 The first axis to swap in the transposition. + * @param[in] axis2 The second axis to swap in the transposition. + * @return A new AMSTensor that is a transposed view of the original tensor. + * @throw std::out_of_range if any axis is out of bounds. + */ + AMSTensor transpose(size_t axis1 = 0, size_t axis2 = 1) const + { + // Ensure the axes are within bounds + if (axis1 >= _shape.size() || axis2 >= _shape.size()) { + throw std::out_of_range("Transpose axes are out of bounds"); + } + + // Create new shape and strides for the transposed tensor + auto newShape = _shape; + auto newStrides = _strides; + + // Swap the specified axes in both shape and strides + std::swap(newShape[axis1], newShape[axis2]); + std::swap(newStrides[axis1], newStrides[axis2]); + + // Create a new tensor with the same data, new shape, and strides + AMSTensor transposedTensor = + view(_data, newShape, newStrides, _dType, _location); + + return transposedTensor; + } + + + /** + * @brief Concatenates multiple tensors along a specified axis, with broadcasting for singleton dimensions. + * @param[in] tensors Array of tensors to concatenate. + * @param[in] axis The axis along which to concatenate. + * @return A new AMSTensor representing the concatenated result. + * @throw std::invalid_argument if tensor shapes are incompatible or axis is out of bounds. + */ + static AMSTensor concatenate(const ams::ArrayRef tensors, + size_t axis) + { + if (tensors.empty()) { + throw std::invalid_argument("No tensors provided for concatenation."); + } + + // Check compatibility of shapes, data types, and locations + const AMSDType dType = tensors[0]._dType; + const AMSResourceType location = tensors[0]._location; + ams::SmallVector newShape = tensors[0]._shape; + + for (const auto& tensor : tensors) { + if (tensor._dType != dType || tensor._location != location) { + throw std::invalid_argument( + "All tensors must have the same data type and location."); + } + if (tensor._shape.size() != newShape.size()) { + throw std::invalid_argument( + "All tensors must have the same number of dimensions."); + } + + // Ensure dimensions match, except along the concatenation axis, allowing for broadcasting + for (size_t i = 0; i < tensor._shape.size(); ++i) { + if (i == axis) { + newShape[axis] += + tensor._shape + [axis]; // Accumulate size along the concatenation axis + } else if (tensor._shape[i] != newShape[i] && tensor._shape[i] != 1 && + newShape[i] != 1) { + throw std::invalid_argument( + "All tensors must have compatible shapes for concatenation."); + } else { + // If one of the dimensions is 1, set newShape[i] to the max of both dimensions (broadcasting) + newShape[i] = std::max(newShape[i], tensor._shape[i]); + } + } + } + + // Calculate new strides for a contiguous layout in the new tensor + ams::SmallVector newStrides(newShape.size()); + size_t elementSize = dtype_to_size(dType); + newStrides.back() = elementSize; + for (int i = newStrides.size() - 2; i >= 0; --i) { + newStrides[i] = newShape[i + 1] * newStrides[i + 1]; + } + + // Create the new tensor with the calculated shape and strides + AMSTensor result = AMSTensor::create(newShape, newStrides, dType, location); + + // Copy data from each tensor to the correct position in `result` + size_t offset = 0; + for (const auto& tensor : tensors) { + size_t copySize = tensor._elements * elementSize; + + // Calculate starting offset for this tensor in the concatenated result + uint8_t* destPtr = result._data + offset; + + // Handle broadcasting along singleton dimensions + if (tensor._shape[axis] == 1) { + // Broadcast the data along the concatenation axis + for (size_t i = 0; i < newShape[axis] / tensor._shape[axis]; ++i) { + std::memcpy(destPtr + i * newStrides[axis], tensor._data, copySize); + } + } else { + // Regular copy without broadcasting + std::memcpy(destPtr, tensor._data, copySize); + } + + // Advance the offset along the concatenation axis + offset += tensor._shape[axis] * newStrides[axis]; + } + + return result; + } + + /** + * @brief Accesses an element of the tensor at the specified multi-dimensional index. + * + * This function uses the tensor's strides and shape to calculate the correct + * memory offset based on the provided indices, allowing access to an element + * regardless of the tensor's layout or any transpositions. + * + * @tparam T The data type of the element to retrieve. + * @param[in] indices A vector of indices specifying the location of the element + * in each dimension. The number of indices must match the + * tensor's number of dimensions. + * @return A reference to the element at the specified location. + * @throw std::out_of_range if the number of indices does not match the tensor's + * dimensions or if any index is out of bounds. + */ + template + T& elementAt(const ams::ArrayRef indices) const + { + if (indices.size() != _shape.size()) { + throw std::out_of_range( + "Number of indices does not match tensor dimensions."); + } + + size_t offset = 0; + for (size_t i = 0; i < indices.size(); ++i) { + if (indices[i] >= _shape[i]) { + throw std::out_of_range("Index out of bounds in elementAt."); + } + offset += indices[i] * _strides[i]; + } + + return *reinterpret_cast(_data + offset); + } + + /** + * @brief Computes the number of elements in the tensor given its shape. + * @param[in] shapes The shape of the tensor as an array reference. + * @return The total number of elements in the tensor. + */ + static size_t computeNumElements(ams::ArrayRef shapes) + { + return std::accumulate(shapes.begin(), + shapes.end(), + 1, + std::multiplies()); + } + + + size_t elements() const { return _elements; } + size_t element_size() const { return _element_size; } + AMSDType dtype() const { return _dType; } + AMSResourceType location() const { return _location; } + ams::ArrayRef strides() const { return _strides; } + ams::ArrayRef shape() const { return _shape; } +}; diff --git a/src/AMSlib/wf/resource_manager.cpp b/src/AMSlib/wf/resource_manager.cpp index 1deeaf0a..e4226477 100644 --- a/src/AMSlib/wf/resource_manager.cpp +++ b/src/AMSlib/wf/resource_manager.cpp @@ -31,7 +31,10 @@ struct AMSDefaultDeviceAllocator final : AMSAllocator { DBG(AMSDefaultDeviceAllocator, "Destroying default device allocator"); }; - void *allocate(size_t num_bytes) { return DeviceAllocate(num_bytes); } + void *allocate(size_t num_bytes, size_t alignment) + { + return DeviceAllocate(num_bytes); + } void deallocate(void *ptr) { return DeviceFree(ptr); } }; @@ -43,9 +46,9 @@ struct AMSDefaultHostAllocator final : AMSAllocator { DBG(AMSDefaultDeviceAllocator, "Destroying default host allocator"); } - void *allocate(size_t num_bytes) + void *allocate(size_t num_bytes, size_t alignment) { - return aligned_alloc(8, roundUp(num_bytes, 8)); + return aligned_alloc(alignment, roundUp(num_bytes, alignment)); } void deallocate(void *ptr) { free(ptr); } @@ -55,7 +58,10 @@ struct AMSDefaultPinnedAllocator final : AMSAllocator { AMSDefaultPinnedAllocator(std::string name) : AMSAllocator(name) {} ~AMSDefaultPinnedAllocator() = default; - void *allocate(size_t num_bytes) { return DevicePinnedAlloc(num_bytes); } + void *allocate(size_t num_bytes, size_t alignment) + { + return DevicePinnedAlloc(num_bytes); + } void deallocate(void *ptr) { DeviceFreePinned(ptr); } }; diff --git a/src/AMSlib/wf/resource_manager.hpp b/src/AMSlib/wf/resource_manager.hpp index 813c8d56..7f1825c6 100644 --- a/src/AMSlib/wf/resource_manager.hpp +++ b/src/AMSlib/wf/resource_manager.hpp @@ -44,7 +44,7 @@ struct AMSAllocator { AMSAllocator(std::string& alloc_name) : name(alloc_name) {} virtual ~AMSAllocator() = default; - virtual void* allocate(size_t num_bytes) = 0; + virtual void* allocate(size_t num_bytes, size_t alignment) = 0; virtual void deallocate(void* ptr) = 0; const std::string getName() const; @@ -91,10 +91,12 @@ class ResourceManager */ template PERFFASPECT() - TypeInValue* allocate(size_t nvalues, AMSResourceType dev) + TypeInValue* allocate(size_t nvalues, + AMSResourceType dev, + size_t alignment = sizeof(TypeInValue)) { return static_cast( - RMAllocators[dev]->allocate(nvalues * sizeof(TypeInValue))); + RMAllocators[dev]->allocate(nvalues * sizeof(TypeInValue), alignment)); } /** @brief deallocates pointer from the specified device. diff --git a/src/AMSlib/wf/utils.hpp b/src/AMSlib/wf/utils.hpp index 06ea0527..f1f044ba 100644 --- a/src/AMSlib/wf/utils.hpp +++ b/src/AMSlib/wf/utils.hpp @@ -14,6 +14,8 @@ #include #include +#include "AMS.h" + // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- @@ -55,5 +57,18 @@ inline bool is_real_equal(T l, T r) return r == std::nextafter(l, r); } + +static inline size_t dtype_to_size(AMSDType dType) +{ + switch (dType) { + case AMSDType::AMS_DOUBLE: + return sizeof(double); + case AMSDType::AMS_SINGLE: + return sizeof(float); + default: + throw std::runtime_error("Requesting the size of unknown object"); + } +} + // ----------------------------------------------------------------------------- #endif diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index 543ecb80..1cc95018 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -13,16 +13,16 @@ #include #endif -#include #include #include #include -#include #include #include "AMS.h" #include "ml/uq.hpp" #include "resource_manager.hpp" +#include "util/ArrayRef.h" +#include "util/SmallVector.h" #include "wf/basedb.hpp" #ifdef __ENABLE_MPI__ diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index 1b50c711..9fbfb72d 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -198,11 +198,32 @@ endfunction() BUILD_TEST(ams_packing_test cpu_packing_test.cpp AMSPack) ADDTEST(ams_packing_test AMSPack) -# AMS Database benchmark (RMQ and/or HDF5 + MPI / No ML models used) -BUILD_TEST(ams_benchmark_db ams_bench_db.cpp) -# The AMS DB Benchmark requires mfem -# TODO: Remove mfem requirement from the benchmark -target_link_libraries(ams_benchmark_db PRIVATE AMS ${AMS_EXAMPLE_LIBRARIES}) +#Tensor tests +BUILD_TEST(ams_tensor_test ams_tensor_test.cpp) + +add_test(NAME ams_tensor_num_elements COMMAND ams_tensor_test "num_elements") +set_tests_properties(ams_tensor_num_elements PROPERTIES LABELS "AMSTensor") + +add_test(NAME ams_tensor_cast COMMAND ams_tensor_test "cast") +set_tests_properties(ams_tensor_cast PROPERTIES LABELS "AMSTensor") + +add_test(NAME ams_tensor_create COMMAND ams_tensor_test "create") +set_tests_properties(ams_tensor_create PROPERTIES LABELS "AMSTensor") + +add_test(NAME ams_tensor_view COMMAND ams_tensor_test "view") +set_tests_properties(ams_tensor_view PROPERTIES LABELS "AMSTensor") + +add_test(NAME ams_tensor_move COMMAND ams_tensor_test "move") +set_tests_properties(ams_tensor_move PROPERTIES LABELS "AMSTensor") + +add_test(NAME ams_tensor_access COMMAND ams_tensor_test "access") +set_tests_properties(ams_tensor_access PROPERTIES LABELS "AMSTensor") + +add_test(NAME ams_tensor_conversion COMMAND ams_tensor_test "conversion") +set_tests_properties(ams_tensor_conversion PROPERTIES LABELS "AMSTensor") + +add_test(NAME ams_tensor_transpose COMMAND ams_tensor_test "transpose") +set_tests_properties(ams_tensor_transpose PROPERTIES LABELS "AMSTensor") if(WITH_TORCH) BUILD_TEST(ams_inference_test torch_model.cpp) diff --git a/tests/AMSlib/ams_tensor_test.cpp b/tests/AMSlib/ams_tensor_test.cpp new file mode 100644 index 00000000..3e610df6 --- /dev/null +++ b/tests/AMSlib/ams_tensor_test.cpp @@ -0,0 +1,199 @@ +#include +#include + +#include "util/tensor.hpp" + +void testCastTensor() +{ + ams::SmallVector shape = {2, 3}; + ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); + + for (size_t i = 0; i < tensor.elements(); ++i) { + tensor.at(i) = static_cast(i + 1); + } + + // Cast tensor to double + AMSTensor doubleTensor = tensor.fp64(); + + // Check that data was cast correctly + for (size_t i = 0; i < doubleTensor.elements(); ++i) { + assert(doubleTensor.at(i) == static_cast(i + 1) && + "castTensor failed."); + } +} + +void testComputeNumElements() +{ + ams::SmallVector shape = {4, 5, 6}; + size_t expected_elements = 4 * 5 * 6; + size_t elements = AMSTensor::computeNumElements(shape); + assert(elements == expected_elements && "computeNumElements failed."); +} + +void testCreate() +{ + ams::SmallVector shape = {4, 4}; + ams::SmallVector strides = {4 * sizeof(float), sizeof(float)}; + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); + + assert(shape == tensor.shape() && "Shape mismatch in create."); + assert(strides == tensor.strides() && "Stride mismatch in create."); + assert(tensor.dtype() == AMS_SINGLE && "Data type mismatch in create."); +} + + +void testView() +{ + ams::SmallVector shape = {2, 2}; + ams::SmallVector strides = {2 * sizeof(float), sizeof(float)}; + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); + + for (size_t i = 0; i < tensor.elements(); ++i) { + tensor.at(i) = static_cast(i); + } + + // Create a view of the original tensor + AMSTensor viewTensor = AMSTensor::view( + tensor.data(), shape, strides, AMS_SINGLE, AMS_HOST); + assert(shape == viewTensor.shape() && "Shape mismatch in view."); + assert(strides == viewTensor.strides() && "Stride mismatch in view."); + + for (size_t i = 0; i < viewTensor.elements(); ++i) { + assert(viewTensor.at(i) == tensor.at(i) && + "View data mismatch."); + } +} + + +void testMove() +{ + ams::SmallVector shape = {3, 3}; + ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); + tensor.at(0) = 1.0f; + + // Move constructor + AMSTensor movedTensor(std::move(tensor)); + assert(shape == movedTensor.shape() && "Shape mismatch in move constructor."); + assert(movedTensor.at(0) == 1.0f && + "Data mismatch in move constructor."); + + // Move assignment + AMSTensor anotherTensor = std::move(movedTensor); + assert(anotherTensor.at(0) == 1.0f && + "Data mismatch in move assignment."); +} + +void testDataAccess() +{ + ams::SmallVector shape = {3, 3}; + ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); + + tensor.at(0) = 10.0f; + assert(tensor.data()[0] == 10.0f && "Data access mismatch."); +} + + +void testConversion() +{ + ams::SmallVector shape = {3, 3}; + ams::SmallVector strides = {3 * sizeof(double), sizeof(double)}; + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_DOUBLE, AMS_HOST); + assert(tensor.element_size() == sizeof(double)); + + tensor.at(0) = 5.0; + AMSTensor floatTensor = tensor.fp32(); + assert(floatTensor.element_size() == sizeof(float)); + assert(floatTensor.at(0) == 5.0f && "fp32 conversion failed."); +} + + +void testTranspose() +{ + // Define shape and strides for a 2x3 tensor + ams::SmallVector shape = {2, 3}; + ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); + + // Populate tensor with values for easy checking after transpose + tensor.at(0) = 1.0f; // (0,0) + tensor.at(1) = 2.0f; // (0,1) + tensor.at(2) = 3.0f; // (0,2) + tensor.at(3) = 4.0f; // (1,0) + tensor.at(4) = 5.0f; // (1,1) + tensor.at(5) = 6.0f; // (1,2) + + // Transpose the tensor (swap axes 0 and 1) + AMSTensor transposed = tensor.transpose(0, 1); + + for (int i = 0; i < tensor.elements(); i++) { + std::cout << "Value at " << i << " is : " << tensor.at(i) + << " Transposed is " << transposed.at(i) << "\n"; + } + + // Check that the transposed tensor has the correct shape + assert(transposed.shape()[0] == 3 && transposed.shape()[1] == 2 && + "Shape mismatch in transpose."); + + // Verify that the transposed data matches expected positions + assert(transposed.at(0) == 1.0f && + "mismatch at continuous view at " + "(0,0)"); + assert(transposed.at(1) == 2.0f && + "mismatch at continuous view at " + "(0,1)"); + assert(transposed.at(2) == 3.0f && + "mismatch at continuous view at " + "(1,0)"); + assert(transposed.at(3) == 4.0f && + "mismatch at continuous view at " + "(1,1)"); + assert(transposed.at(4) == 5.0f && + "mismatch at continuous view at " + "(2,0)"); + assert(transposed.at(5) == 6.0f && + "mismatch at continuous view at " + "(2,1)"); + + assert(transposed.elementAt({0, 0}) == 1.0f && + "Transpose value mismatch at (0,0)"); + assert(transposed.elementAt({0, 1}) == 4.0f && + "Transpose value mismatch at (0,1)"); + assert(transposed.elementAt({1, 0}) == 2.0f && + "Transpose value mismatch at (1,0)"); + assert(transposed.elementAt({1, 1}) == 5.0f && + "Transpose value mismatch at (1,1)"); + assert(transposed.elementAt({2, 0}) == 3.0f && + "Transpose value mismatch at (2,0)"); + assert(transposed.elementAt({2, 1}) == 6.0f && + "Transpose value mismatch at (2,1)"); +} + +int main(int argc, char *argv[]) +{ + auto &rm = ams::ResourceManager::getInstance(); + rm.init(); + std::string func = std::string(argv[1]); + if (func.compare("cast") == 0) + testCastTensor(); + else if (func.compare("num_elements") == 0) + testComputeNumElements(); + else if (func.compare("create") == 0) + testCreate(); + else if (func.compare("view") == 0) + testView(); + else if (func.compare("move") == 0) + testMove(); + else if (func.compare("access") == 0) + testDataAccess(); + else if (func.compare("conversion") == 0) + testConversion(); + else if (func.compare("transpose") == 0) + testTranspose(); + else { + throw std::runtime_error("Unknown test option :'" + func + "'"); + } + return 0; +} From 95849b53b411edded895f11b19688c2f5044b134 Mon Sep 17 00:00:00 2001 From: koparasy Date: Tue, 12 Nov 2024 09:58:49 -0800 Subject: [PATCH 002/136] Fix compilation issues --- src/AMSlib/util/tensor.hpp | 2 +- src/AMSlib/wf/workflow.hpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/AMSlib/util/tensor.hpp b/src/AMSlib/util/tensor.hpp index b466c5a0..6bf29cce 100644 --- a/src/AMSlib/util/tensor.hpp +++ b/src/AMSlib/util/tensor.hpp @@ -4,7 +4,7 @@ #include "AMS.h" #include "ArrayRef.hpp" -#include "SmallVector.h" +#include "SmallVector.hpp" #include "wf/data_handler.hpp" #include "wf/resource_manager.hpp" #include "wf/utils.hpp" diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index 1cc95018..f45c048a 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -21,8 +21,8 @@ #include "AMS.h" #include "ml/uq.hpp" #include "resource_manager.hpp" -#include "util/ArrayRef.h" -#include "util/SmallVector.h" +#include "util/ArrayRef.hpp" +#include "util/SmallVector.hpp" #include "wf/basedb.hpp" #ifdef __ENABLE_MPI__ From 3a6aa3c1aa9cd52e8626f19c62b7a7c81d5eb31b Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 14 Nov 2024 14:42:56 -0800 Subject: [PATCH 003/136] Concat test case 1, works --- src/AMSlib/include/AMS.h | 11 + src/AMSlib/util/tensor.hpp | 505 ++++++++++++++++++++++++------- tests/AMSlib/CMakeLists.txt | 11 + tests/AMSlib/ams_tensor_test.cpp | 217 ++++++++++++- 4 files changed, 627 insertions(+), 117 deletions(-) diff --git a/src/AMSlib/include/AMS.h b/src/AMSlib/include/AMS.h index 671ea4cb..ab7bd8a1 100644 --- a/src/AMSlib/include/AMS.h +++ b/src/AMSlib/include/AMS.h @@ -73,6 +73,17 @@ enum struct AMSUQPolicy { void AMSInit(); void AMSFinalize(); +typedef struct { + uint8_t *dPtr; + size_t *shape; + size_t *strides; + int dims; + AMSDType dType; // AMS_SINGLE/AMS_DOUBLE + AMSResourceType location; // CPU/GPU/Pinned +} AMSCTensor; + +>>>>>>> c52415d (Concat test case 1, works) + AMSExecutor AMSCreateExecutor(AMSCAbstrModel model, AMSDType data_type, AMSResourceType resource_type, diff --git a/src/AMSlib/util/tensor.hpp b/src/AMSlib/util/tensor.hpp index 6bf29cce..58fbacc2 100644 --- a/src/AMSlib/util/tensor.hpp +++ b/src/AMSlib/util/tensor.hpp @@ -1,3 +1,5 @@ +#include + #include #include #include @@ -14,20 +16,45 @@ class AMSTensor uint8_t* _data; size_t _elements; size_t _element_size; - ams::SmallVector _shape; - ams::SmallVector _strides; + size_t _batch_axis; + ams::SmallVector _shape; + ams::SmallVector _strides; AMSDType _dType; // AMS_SINGLE/AMS_DOUBLE AMSResourceType _location; // CPU/GPU/Pinned bool _owned; + bool _contiguous; private: + // Helper function to check broadcasting compatibility for two dimensions + static inline bool isBroadcastCompatible(size_t dim1, size_t dim2) + { + return (dim1 == dim2) || (dim1 == 1) || (dim2 == 1); + } + + // Helper function to determine the broadcasted dimension size + static inline size_t getBroadcastSize(size_t dim1, size_t dim2) + { + return std::max(dim1, dim2); + } + + + // Helper function to check if the tensor is contiguous in memory + bool isContiguous(size_t expected_stride) const + { + for (int i = _shape.size() - 1; i >= 0; --i) { + if (_strides[i] != expected_stride) return false; + expected_stride *= _shape[i]; + } + return true; + } + /** - * @brief Creates a new tensor by casting all elements to the specified target type. - * @tparam TargetType The data type to cast each element to. - * @param[in] targetType The target AMSDType representing the target data type (e.g., AMS_SINGLE or AMS_DOUBLE). - * @return A new AMSTensor with the elements cast to the specified type. - */ + * @brief Creates a new tensor by casting all elements to the specified target type. + * @tparam TargetType The data type to cast each element to. + * @param[in] targetType The target AMSDType representing the target data type (e.g., AMS_SINGLE or AMS_DOUBLE). + * @return A new AMSTensor with the elements cast to the specified type. + */ template AMSTensor castTensor(AMSDType targetType) const { @@ -58,28 +85,35 @@ class AMSTensor } /** - * @brief Constructs a new AMSTensor with the specified shape, strides, data type, and location. - * This constructor is private and intended for internal use, such as creating views. - * @param[in] shapes The shape of the tensor. - * @param[in] strides The strides of the tensor. - * @param[in] dType The data type of the tensor elements. - * @param[in] location The memory location (e.g., CPU, GPU). - * @param[in] view Set to true if this tensor is a view of another tensor (non-owning). - */ + * @brief Constructs a new AMSTensor with the specified shape, strides, data type, and location. + * This constructor is private and intended for internal use, such as creating views. + * @param[in] shapes The shape of the tensor. + * @param[in] strides The strides of the tensor. + * @param[in] dType The data type of the tensor elements. + * @param[in] location The memory location (e.g., CPU, GPU). + * @param[in] _batch_dim The axis holding the samples. + * @param[in] view Set to true if this tensor is a view of another tensor (non-owning). + */ explicit AMSTensor(ams::ArrayRef shapes, ams::ArrayRef strides, AMSDType dType, AMSResourceType location, + size_t batch_axis = 0, bool view = false) : _elements(computeNumElements(shapes)), _element_size(dtype_to_size(dType)), + _batch_axis(batch_axis), _shape(shapes), _strides(strides), _dType(dType), _location(location), - _owned(view) + _owned(!view) { + _contiguous = isContiguous(_element_size); auto& rm = ams::ResourceManager::getInstance(); + if (_batch_axis >= _shape.size()) + throw std::invalid_argument( + "Batch axis is larger than the shape of the tensor"); if (!view) { _data = rm.allocate(_elements * _element_size, _location, @@ -93,73 +127,95 @@ class AMSTensor public: /** - * @brief Creates a new AMSTensor and allocates the tensor memory. - * @param[in] shapes The shape of the tensor. - * @param[in] strides The strides of the tensor. - * @param[in] dType The data type of the tensor elements. - * @param[in] location The memory location (e.g., CPU, GPU). - * @return A new AMSTensor with allocated memory. - */ + * @brief Creates a new AMSTensor and allocates the tensor memory. + * @param[in] shapes The shape of the tensor. + * @param[in] strides The strides of the tensor. + * @param[in] dType The data type of the tensor elements. + * @param[in] location The memory location (e.g., CPU, GPU). + * @param[in] batch_axis The axis that contains the batch data. + * @return A new AMSTensor with allocated memory. + */ static AMSTensor create(ams::ArrayRef shapes, ams::ArrayRef strides, AMSDType dType, - AMSResourceType location) + AMSResourceType location, + size_t batch_axis = 0) { - return AMSTensor(shapes, strides, dType, location); + return AMSTensor(shapes, strides, dType, location, batch_axis); } /** - * @brief Creates a view on an existing memory buffer. - * @param[in] data Pointer to the existing data to be viewed. - * @param[in] shapes The shape of the view tensor. - * @param[in] strides The strides of the view tensor. - * @param[in] dType The data type of the tensor elements. - * @param[in] location The memory location (e.g., CPU, GPU). - * @return A new AMSTensor that acts as a view of the existing data. - */ + * @brief Creates a view on an existing memory buffer. + * @param[in] data Pointer to the existing data to be viewed. + * @param[in] shapes The shape of the view tensor. + * @param[in] strides The strides of the view tensor. + * @param[in] dType The data type of the tensor elements. + * @param[in] location The memory location (e.g., CPU, GPU). + * @param[in] batch_axis The axis represeing the samples. + * @return A new AMSTensor that acts as a view of the existing data. + */ static AMSTensor view(uint8_t* data, ams::ArrayRef shapes, ams::ArrayRef strides, AMSDType dType, - AMSResourceType location) + AMSResourceType location, + size_t batch_axis = 0) { - auto tensor = AMSTensor(shapes, strides, dType, location, true); + auto tensor = AMSTensor(shapes, strides, dType, location, batch_axis, true); tensor._data = data; return tensor; } + // Helper function to compute if a reshape is feasible without copying + bool canReshapeWithStrides(const ams::ArrayRef new_shape) + { + // Check if total number of elements is the same + if (computeNumElements(new_shape) != computeNumElements(_shape)) { + return false; + } + + // Check if the original data layout is contiguous + return isContiguous(_element_size); + + // If we reach here, data is contiguous and can be reshaped to any compatible shape + return true; + } + /** - * @brief Destructor for AMSTensor, deallocates memory if this tensor owns it. - */ + * @brief Destructor for AMSTensor, deallocates memory if this tensor owns it. + */ ~AMSTensor() { // Only release whenwe own the pointer if (_owned && _data) { auto& rm = ams::ResourceManager::getInstance(); rm.deallocate(_data, _location); + _data = nullptr; + _owned = false; } } /** - * @brief Deleted copy assignment operator to prevent copying of tensors. - */ + * @brief Deleted copy assignment operator to prevent copying of tensors. + */ AMSTensor(const AMSTensor&) = delete; /** - * @brief Move constructor for AMSTensor, transfers ownership of data. - * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. - */ + * @brief Move constructor for AMSTensor, transfers ownership of data. + * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. + */ AMSTensor& operator=(const AMSTensor&) = delete; /** - * @brief Move assignment operator for AMSTensor, transfers ownership of data. - * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. - * @return A reference to the updated tensor after move assignment. - */ + * @brief Move assignment operator for AMSTensor, transfers ownership of data. + * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. + * @return A reference to the updated tensor after move assignment. + */ AMSTensor(AMSTensor&& other) noexcept : _data(other._data), _elements(other._elements), _element_size(other._element_size), + _batch_axis(other._batch_axis), _shape(std::move(other._shape)), _strides(std::move(other._strides)), _dType(other._dType), @@ -180,6 +236,7 @@ class AMSTensor _data = other._data; _elements = other._elements; _element_size = other._element_size; + _batch_axis = other._batch_axis; _shape = std::move(other._shape); _strides = std::move(other._strides); _dType = other._dType; @@ -194,10 +251,10 @@ class AMSTensor /** - * @brief Retrieves a typed pointer to the underlying data. - * @tparam T The data type to retrieve. - * @return A typed pointer to the tensor's data. - */ + * @brief Retrieves a typed pointer to the underlying data. + * @tparam T The data type to retrieve. + * @return A typed pointer to the tensor's data. + */ template T* data() const { @@ -206,12 +263,12 @@ class AMSTensor /** - * @brief Retrieves a specific element by index with bounds checking. - * @tparam T The data type of the element to retrieve. - * @param[in] index The index of the element to access. - * @return A reference to the specified element. - * @throw std::out_of_range if index is out of bounds. - */ + * @brief Retrieves a specific element by index with bounds checking. + * @tparam T The data type of the element to retrieve. + * @param[in] index The index of the element to access. + * @return A reference to the specified element. + * @throw std::out_of_range if index is out of bounds. + */ template T& at(std::size_t index) const { @@ -222,25 +279,25 @@ class AMSTensor } /** - * @brief Creates a copy of the tensor with elements converted to float (32-bit) representation. - * @return A new AMSTensor with float (32-bit) elements. - */ + * @brief Creates a copy of the tensor with elements converted to float (32-bit) representation. + * @return A new AMSTensor with float (32-bit) elements. + */ AMSTensor fp32() const { return castTensor(AMS_SINGLE); } /** - * @brief Creates a copy of the tensor with elements converted to double (64-bit) representation. - * @return A new AMSTensor with double (64-bit) elements. - */ + * @brief Creates a copy of the tensor with elements converted to double (64-bit) representation. + * @return A new AMSTensor with double (64-bit) elements. + */ AMSTensor fp64() const { return castTensor(AMS_DOUBLE); } /** - * @brief Creates a transposed view of the tensor by swapping two specified axes. - * @param[in] axis1 The first axis to swap in the transposition. - * @param[in] axis2 The second axis to swap in the transposition. - * @return A new AMSTensor that is a transposed view of the original tensor. - * @throw std::out_of_range if any axis is out of bounds. - */ + * @brief Creates a transposed view of the tensor by swapping two specified axes. + * @param[in] axis1 The first axis to swap in the transposition. + * @param[in] axis2 The second axis to swap in the transposition. + * @return A new AMSTensor that is a transposed view of the original tensor. + * @throw std::out_of_range if any axis is out of bounds. + */ AMSTensor transpose(size_t axis1 = 0, size_t axis2 = 1) const { // Ensure the axes are within bounds @@ -251,6 +308,11 @@ class AMSTensor // Create new shape and strides for the transposed tensor auto newShape = _shape; auto newStrides = _strides; + auto _new_batch_axis = _batch_axis; + if (_new_batch_axis == axis1) + _new_batch_axis = axis2; + else if (_new_batch_axis == axis2) + _new_batch_axis = axis1; // Swap the specified axes in both shape and strides std::swap(newShape[axis1], newShape[axis2]); @@ -258,19 +320,19 @@ class AMSTensor // Create a new tensor with the same data, new shape, and strides AMSTensor transposedTensor = - view(_data, newShape, newStrides, _dType, _location); + view(_data, newShape, newStrides, _dType, _location, _new_batch_axis); return transposedTensor; } /** - * @brief Concatenates multiple tensors along a specified axis, with broadcasting for singleton dimensions. - * @param[in] tensors Array of tensors to concatenate. - * @param[in] axis The axis along which to concatenate. - * @return A new AMSTensor representing the concatenated result. - * @throw std::invalid_argument if tensor shapes are incompatible or axis is out of bounds. - */ + * @brief Concatenates multiple tensors along a specified axis, with broadcasting for singleton dimensions. + * @param[in] tensors Array of tensors to concatenate. + * @param[in] axis The axis along which to concatenate. + * @return A new AMSTensor representing the concatenated result. + * @throw std::invalid_argument if tensor shapes are incompatible or axis is out of bounds. + */ static AMSTensor concatenate(const ams::ArrayRef tensors, size_t axis) { @@ -281,7 +343,8 @@ class AMSTensor // Check compatibility of shapes, data types, and locations const AMSDType dType = tensors[0]._dType; const AMSResourceType location = tensors[0]._location; - ams::SmallVector newShape = tensors[0]._shape; + ams::SmallVector newShape = tensors[0]._shape; + newShape[axis] = 0; for (const auto& tensor : tensors) { if (tensor._dType != dType || tensor._location != location) { @@ -317,51 +380,103 @@ class AMSTensor for (int i = newStrides.size() - 2; i >= 0; --i) { newStrides[i] = newShape[i + 1] * newStrides[i + 1]; } + std::cout << "Strides are : "; + for (int i = 0; i < newStrides.size(); i++) { + std::cout << newStrides[i] << " "; + } + std::cout << "\n"; + std::cout << "Shapes are : "; + for (int i = 0; i < newShape.size(); i++) { + std::cout << newShape[i] << " "; + } + std::cout << "\n"; + // Create the new tensor with the calculated shape and strides AMSTensor result = AMSTensor::create(newShape, newStrides, dType, location); // Copy data from each tensor to the correct position in `result` size_t offset = 0; - for (const auto& tensor : tensors) { - size_t copySize = tensor._elements * elementSize; - - // Calculate starting offset for this tensor in the concatenated result - uint8_t* destPtr = result._data + offset; - - // Handle broadcasting along singleton dimensions - if (tensor._shape[axis] == 1) { - // Broadcast the data along the concatenation axis - for (size_t i = 0; i < newShape[axis] / tensor._shape[axis]; ++i) { - std::memcpy(destPtr + i * newStrides[axis], tensor._data, copySize); + // compute num elements left from concatenation-axis + size_t num_elements_left = std::accumulate(result._shape.begin(), + &result._shape[axis], + 1, + std::multiplies()); + int tid = 0; + int index = 0; + for (auto& tensor : tensors) { + std::cout << "Tid is " << tid << "\n"; + int src_index = 0; + // Determine the copy size for a single slice along the concatenation axis + size_t copy_size_per_slice = tensor._strides[axis]; + // tensors differ only on the axis dimension + size_t num_elements_right = std::accumulate(&tensor._shape[axis], + tensor._shape.end(), + 1, + std::multiplies()); + std::cout << "Tensor Shape " << tensor.shape()[0] << "," + << tensor.shape()[1] << "\n"; + std::cout << "num_elements_left " << num_elements_left << "\n"; + std::cout << "num_elements_right " << num_elements_right << "\n"; + for (size_t left = 0; left < num_elements_left; left++) { + uint8_t* dst_start_ptr = + &result._data[left * result._strides[axis - 1]] + + tid * result._strides[axis]; + uint8_t* src_start_ptr = + &tensor._data[left * tensor._strides[axis - 1]]; + std::cout << "Next left\n"; + std::cout << "result._strides " << result._strides[axis - 1] << "\n"; + std::cout << "tensor._strides " << tensor._strides[axis - 1] << "\n"; + for (int right = 0; right < num_elements_right; right++) { + index = ((uintptr_t)dst_start_ptr - (uintptr_t)result._data) / + result._element_size; + src_index = ((uintptr_t)src_start_ptr - (uintptr_t)tensor._data) / + tensor._element_size; + std::cout << "Dest index: " << index << "\n"; + std::cout << "Src index: " << src_index << "\n"; + if (tensor._dType == AMS_SINGLE) { + float tmp = *reinterpret_cast(src_start_ptr); + std::cout << "Assigning float " << tmp << "\n"; + for (int i = 0; i < sizeof(float); i++) { + dst_start_ptr[i] = src_start_ptr[i]; + } + tmp = *reinterpret_cast(dst_start_ptr); + std::cout << "Dest value " << tmp << "\n"; + + dst_start_ptr += sizeof(float); + src_start_ptr += sizeof(float); + } else if (tensor._dType == AMS_DOUBLE) { + for (int i = 0; i < sizeof(double); i++) { + dst_start_ptr[i] = src_start_ptr[i]; + } + dst_start_ptr += sizeof(double); + src_start_ptr += sizeof(double); + } + index++; + src_index++; } - } else { - // Regular copy without broadcasting - std::memcpy(destPtr, tensor._data, copySize); } - - // Advance the offset along the concatenation axis - offset += tensor._shape[axis] * newStrides[axis]; + // Here we move the pointer of the 'tid' index. + tid += tensor._shape[axis]; } - return result; } /** - * @brief Accesses an element of the tensor at the specified multi-dimensional index. - * - * This function uses the tensor's strides and shape to calculate the correct - * memory offset based on the provided indices, allowing access to an element - * regardless of the tensor's layout or any transpositions. - * - * @tparam T The data type of the element to retrieve. - * @param[in] indices A vector of indices specifying the location of the element - * in each dimension. The number of indices must match the - * tensor's number of dimensions. - * @return A reference to the element at the specified location. - * @throw std::out_of_range if the number of indices does not match the tensor's - * dimensions or if any index is out of bounds. - */ + * @brief Accesses an element of the tensor at the specified multi-dimensional index. + * + * This function uses the tensor's strides and shape to calculate the correct + * memory offset based on the provided indices, allowing access to an element + * regardless of the tensor's layout or any transpositions. + * + * @tparam T The data type of the element to retrieve. + * @param[in] indices A vector of indices specifying the location of the element + * in each dimension. The number of indices must match the + * tensor's number of dimensions. + * @return A reference to the element at the specified location. + * @throw std::out_of_range if the number of indices does not match the tensor's + * dimensions or if any index is out of bounds. + */ template T& elementAt(const ams::ArrayRef indices) const { @@ -370,6 +485,11 @@ class AMSTensor "Number of indices does not match tensor dimensions."); } + if (sizeof(T) != _element_size) + throw std::invalid_argument( + "Accessing element at tensor-position with incompatible " + "data-type-size"); + size_t offset = 0; for (size_t i = 0; i < indices.size(); ++i) { if (indices[i] >= _shape[i]) { @@ -382,10 +502,10 @@ class AMSTensor } /** - * @brief Computes the number of elements in the tensor given its shape. - * @param[in] shapes The shape of the tensor as an array reference. - * @return The total number of elements in the tensor. - */ + * @brief Computes the number of elements in the tensor given its shape. + * @param[in] shapes The shape of the tensor as an array reference. + * @return The total number of elements in the tensor. + */ static size_t computeNumElements(ams::ArrayRef shapes) { return std::accumulate(shapes.begin(), @@ -394,11 +514,170 @@ class AMSTensor std::multiplies()); } + // Helper function to compute contiguous strides for a given shape + static ams::SmallVector computeStrides( + const ams::ArrayRef& shape, + const size_t element_size) + { + ams::SmallVector strides(shape.size()); + size_t stride = element_size; + for (int i = shape.size() - 1; i >= 0; --i) { + strides[i] = stride; + stride *= shape[i]; + } + return strides; + } + + // Reshape function with attempt to adjust strides + AMSTensor reshape(const ams::ArrayRef& new_shape) + { + size_t new_elements = computeNumElements(new_shape); + if (new_elements != _elements) { + throw std::invalid_argument( + "New shape must have the same total number of elements as the " + "original tensor."); + } + + if (canReshapeWithStrides(new_shape)) { + // Data is contiguous and can be reshaped without copying + auto new_strides = computeStrides(new_shape, _element_size); + return AMSTensor::view(_data, new_shape, new_strides, _dType, _location); + } else { + // Data is non-contiguous or not compatible with new strides, create a contiguous copy + AMSTensor contiguous_tensor = + AMSTensor::create(new_shape, + computeStrides(new_shape, _element_size), + _dType, + _location); + + // Copy data from the original tensor to the contiguous tensor + auto& rm = ams::ResourceManager::getInstance(); + rm.copy(_data, + _location, + contiguous_tensor.data(), + _location, + _elements * _element_size); + + return contiguous_tensor; + } + } + + // Function to align and expand a tensor for batch alignment + // Helper function to align and expand a tensor's shape for batch alignment + static AMSTensor alignAndExpand(AMSTensor& tensor, + int target_batch_size, + int max_rank) + { + auto shape = tensor.shape(); + auto batch_axis = tensor.batch_axis(); + + ams::SmallVector new_shape(max_rank, 1); + new_shape[batch_axis] = target_batch_size; // Set the target batch size + std::cout << "Batch Axis is " << batch_axis << "\n"; + std::cout << "New shape size is " << new_shape.size() << "\n"; + + // Move tensor's dimensions to the appropriate location in `new_shape` + for (size_t i = 0, j = 0; i < shape.size(); ++i, ++j) { + if (i == batch_axis) { + new_shape[batch_axis] = shape[batch_axis]; + } else { + new_shape[j] = shape[i]; + } + } + std::cout << "Before reshape \n"; + tensor.dump(); + return tensor.reshape(new_shape); // Reshape without copying if possible + } + + void dump_vector(const std::string name, ams::ArrayRef Vec) + { + std::cout << name << " ["; + for (auto I : Vec) { + std::cout << I << ", "; + } + std::cout << "]\n"; + } + + void dump() + { + dump_vector("Stride", _strides); + dump_vector("Shape", _shape); + } + + // Main concatenation function with broadcasting checks + static AMSTensor concatenateTensors(ams::MutableArrayRef tensors) + { + if (tensors.empty()) { + throw std::invalid_argument("No tensors provided for concatenation."); + } + + // Determine the batch axis and target batch size based on the first tensor + + int batch_axis = tensors[0].batch_axis(); + int target_batch_size = tensors[0].shape()[batch_axis]; + + // Find the maximum rank among all tensors to align shapes + int max_rank = 0; + for (const auto& tensor : tensors) { + max_rank = std::max(max_rank, static_cast(tensor.shape().size())); + } + + // Prepare final shape based on broadcasting rules and target batch size + ams::SmallVector final_shape(max_rank, 1); + final_shape[batch_axis] = + target_batch_size; // Set batch size in final shape + + std::vector aligned_tensors; + std::cout << "Max Rank is " << max_rank << "\n"; + + // Align all tensors to the same rank and check for broadcasting compatibility + for (AMSTensor& tensor : tensors) { + // Align and expand each tensor to have the same rank as `max_rank` + std::cout << "Original Tensor is \n"; + tensor.dump(); + AMSTensor aligned_tensor = + alignAndExpand(tensor, target_batch_size, max_rank); + std::cout << "Aligned Tensor is \n"; + aligned_tensor.dump(); + + // Update final shape based on broadcasting compatibility + const auto& aligned_shape = aligned_tensor.shape(); + for (size_t i = 0; i < max_rank; ++i) { + std::cout << "final_shape rank: " << final_shape.size() + << ", aligned_shape rank: " << aligned_shape.size() + << std::endl; + assert(final_shape.size() == aligned_shape.size() && + "Shapes must have the same rank for broadcasting"); + if (!isBroadcastCompatible(final_shape[i], aligned_shape[i])) { + throw std::invalid_argument( + "Tensors have incompatible shapes for concatenation."); + } + final_shape[i] = getBroadcastSize(final_shape[i], aligned_shape[i]); + } + aligned_tensors.push_back(std::move(aligned_tensor)); + } + + // Concatenate tensors along the last dimension or specified axis + for (auto& V : aligned_tensors) { + std::cout << "Shape "; + for (auto s : V.shape()) { + std::cout << " " << s << " "; + } + std::cout << "\n"; + } + + std::cout << "Max Ranking is " << max_rank << "\n"; + + + return AMSTensor::concatenate(aligned_tensors, max_rank - 1); + } size_t elements() const { return _elements; } size_t element_size() const { return _element_size; } - AMSDType dtype() const { return _dType; } + size_t batch_axis() const { return _batch_axis; } + AMSDType dType() const { return _dType; } AMSResourceType location() const { return _location; } ams::ArrayRef strides() const { return _strides; } ams::ArrayRef shape() const { return _shape; } + bool contiguous() const { return _contiguous; } }; diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index 9fbfb72d..e9c70bf0 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -225,6 +225,16 @@ set_tests_properties(ams_tensor_conversion PROPERTIES LABELS "AMSTensor") add_test(NAME ams_tensor_transpose COMMAND ams_tensor_test "transpose") set_tests_properties(ams_tensor_transpose PROPERTIES LABELS "AMSTensor") +add_test(NAME ams_tensor_valid_reshapes COMMAND ams_tensor_test "test-reshape") +set_tests_properties(ams_tensor_valid_reshapes PROPERTIES LABELS "AMSTensor") + +add_test(NAME ams_tensor_reshape COMMAND ams_tensor_test "reshape") +set_tests_properties(ams_tensor_reshape PROPERTIES LABELS "AMSTensor") + +add_test(NAME ams_tensor_concat COMMAND ams_tensor_test "concat") +set_tests_properties(ams_tensor_concat PROPERTIES LABELS "AMSTensor") + + if(WITH_TORCH) BUILD_TEST(ams_inference_test torch_model.cpp) ADDTEST(ams_inference_test AMSInferDouble ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt "double") @@ -242,6 +252,7 @@ endif() INTEGRATION_TEST_ENV() BUILD_TEST(ams_rmq ams_rmq_env.cpp) INTEGRATION_TEST_RMQ() + BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) # UQ Tests diff --git a/tests/AMSlib/ams_tensor_test.cpp b/tests/AMSlib/ams_tensor_test.cpp index 3e610df6..67032575 100644 --- a/tests/AMSlib/ams_tensor_test.cpp +++ b/tests/AMSlib/ams_tensor_test.cpp @@ -1,8 +1,12 @@ #include +#include +#include +#include #include #include "util/tensor.hpp" + void testCastTensor() { ams::SmallVector shape = {2, 3}; @@ -39,7 +43,7 @@ void testCreate() assert(shape == tensor.shape() && "Shape mismatch in create."); assert(strides == tensor.strides() && "Stride mismatch in create."); - assert(tensor.dtype() == AMS_SINGLE && "Data type mismatch in create."); + assert(tensor.dType() == AMS_SINGLE && "Data type mismatch in create."); } @@ -171,9 +175,208 @@ void testTranspose() "Transpose value mismatch at (2,1)"); } -int main(int argc, char *argv[]) + +void test_canReshapeWithStrides() +{ + ams::SmallVector shape = {2, 3}; + ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); + + assert(tensor.canReshapeWithStrides({6}) && + "This should be a valid reshape {6} -> {2,3}"); + assert(tensor.canReshapeWithStrides({2, 3}) && + "This should be a valid reshape {2,3} -> {6}"); + assert((tensor.canReshapeWithStrides({3, 2})) && + "This should be an ivalid reshape (discontinuous shapes)"); + assert((!tensor.canReshapeWithStrides({8})) && + "This should be an ivalid reshape (differing number of elements)"); +} + +void test_reshape() +{ + { + // Test for reshape case with contiguous new shape + ams::SmallVector shape = {2, 3}; + ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); + + tensor.at(0) = 1.0f; // (0,0) + tensor.at(1) = 2.0f; // (0,1) + tensor.at(2) = 3.0f; // (0,2) + tensor.at(3) = 4.0f; // (1,0) + tensor.at(4) = 5.0f; // (1,1) + tensor.at(5) = 6.0f; // (1,2) + assert(tensor.canReshapeWithStrides({3, 2}) && + "This should be a valid reshape {2,3} -> {3,2}"); + auto reshaped = tensor.reshape({3, 2}); + + assert(reshaped.elements() == tensor.elements() && + "Both tensors hsould have the same number of elements"); + assert(reshaped.data() == tensor.data() && + "Both tensors are equivalent, and copy should not be there"); + for (int i = 0; i < reshaped.elements(); i++) { + assert(tensor.at(i) == reshaped.at(i) && + "Data should be identical"); + } + } + { + // Test for reshape case with contiguous new shape + ams::SmallVector shape = {2, 3}; + ams::SmallVector strides = {4 * sizeof(float), sizeof(float)}; + + AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); + tensor.at(0) = 1.0f; // (0,0) + tensor.at(1) = 2.0f; // (0,1) + tensor.at(2) = 3.0f; // (0,2) + tensor.at(3) = 4.0f; // (1,0) + tensor.at(4) = 5.0f; // (1,1) + tensor.at(5) = 6.0f; // (1,2) + + auto reshaped = tensor.reshape({3, 2}); + + assert(reshaped.elements() == tensor.elements() && + "Both tensors hsould have the same number of elements"); + assert(reshaped.data() != tensor.data() && + "Tensor should not be equivalent, and copy should not be there"); + for (int i = 0; i < reshaped.elements(); i++) { + assert(tensor.at(i) == reshaped.at(i) && + "Data should be identical"); + } + } +} + +void testConcatenateTensors() +{ + // Test Case 1: Basic Concatenation with Compatible Shapes + { + AMSTensor tensor1 = + AMSTensor::create({2, 3}, + {3 * sizeof(float), 1 * sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 3] + AMSTensor tensor2 = + AMSTensor::create({2, 3}, + {3 * sizeof(float), 1 * sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 3] + + tensor1.at(0) = 1.0f; + tensor1.at(1) = 2.0f; + tensor1.at(2) = 3.0f; + tensor1.at(3) = 4.0f; + tensor1.at(4) = 5.0f; + tensor1.at(5) = 6.0f; + + tensor2.at(0) = 7.0f; + tensor2.at(1) = 8.0f; + tensor2.at(2) = 9.0f; + tensor2.at(3) = 10.0f; + tensor2.at(4) = 11.0f; + tensor2.at(5) = 12.0f; + + ams::SmallVector iTensors; + float* ptr1 = tensor1.data(); + float* ptr2 = tensor2.data(); + iTensors.push_back(std::move(tensor1)); + iTensors.push_back(std::move(tensor2)); + AMSTensor result = AMSTensor::concatenateTensors(iTensors); + + ams::SmallVector expected_shape({2, 6}); + + assert(expected_shape == result.shape() && "Expecting shape to be {2,6}"); + int elements = std::accumulate(result.shape().begin(), + result.shape().end(), + 1, + std::multiplies()); + + for (size_t i = 0; i < 2; i++) { + for (size_t j = 0; j < 6; j++) { + std::cout << result.elementAt({i, j}) << " " + << iTensors[j / 3].elementAt({i, j % 3}) << "\n"; + assert(result.elementAt({i, j}) == + iTensors[j / 3].elementAt({i, j % 3}) && + "Values do not match"); + } + } + + std::cout << "Test Case 1 Passed!" << std::endl; + } + + // Test Case 2: Concatenation with Broadcasting + { + AMSTensor tensor1 = AMSTensor::create({2, 1}, + {1, 1}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 1] + AMSTensor tensor2 = AMSTensor::create({2, 3}, + {3, 1}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 3] + + tensor1.at(0) = 1.0f; + tensor1.at(1) = 2.0f; + tensor2.at(0) = 3.0f; + tensor2.at(1) = 4.0f; + tensor2.at(2) = 5.0f; + tensor2.at(3) = 6.0f; + tensor2.at(4) = 7.0f; + tensor2.at(5) = 8.0f; + + AMSTensor result = concatenateTensors({tensor1, tensor2}); + + // Expected Shape: [2, 4] after broadcasting tensor1 to [2, 3] + assert(result.shape() == ams::SmallVector{2, 4}); + assert(result.at(0) == 1.0f && result.at(1) == 1.0f); + assert(result.at(4) == 3.0f && result.at(7) == 5.0f); + + std::cout << "Test Case 2 Passed!" << std::endl; + } + // + // // Test Case 3: Concatenating a Single Tensor + // { + // AMSTensor tensor = AMSTensor::create({3, 2}, + // {2, 1}, + // AMS_SINGLE, + // AMS_HOST); // Shape: [3, 2] + // tensor.at(0) = 1.0f; + // tensor.at(1) = 2.0f; + // tensor.at(2) = 3.0f; + // tensor.at(3) = 4.0f; + // tensor.at(4) = 5.0f; + // tensor.at(5) = 6.0f; + // + // AMSTensor result = concatenateTensors({tensor}); + // + // // Expected Shape: [3, 2] - should match original tensor + // assert(result.shape() == tensor.shape()); + // assert(result.at(0) == 1.0f && result.at(5) == 6.0f); + // + // std::cout << "Test Case 3 Passed!" << std::endl; + // } + // + // // Test Case 4: Incompatible Shapes (Expect Exception) + // try { + // AMSTensor tensor1 = AMSTensor::create({2, 2}, + // {2, 1}, + // AMS_SINGLE, + // AMS_HOST); // Shape: [2, 2] + // AMSTensor tensor2 = AMSTensor::create({3, 2}, + // {2, 1}, + // AMS_SINGLE, + // AMS_HOST); // Shape: [3, 2] + // + // concatenateTensors({tensor1, tensor2}); + // std::cerr << "Test Case 4 Failed: Expected exception was not thrown." + // << std::endl; + // } catch (const std::invalid_argument &e) { + // std::cout << "Test Case 4 Passed!" << std::endl; + // } +} + + +int main(int argc, char* argv[]) { - auto &rm = ams::ResourceManager::getInstance(); + auto& rm = ams::ResourceManager::getInstance(); rm.init(); std::string func = std::string(argv[1]); if (func.compare("cast") == 0) @@ -192,7 +395,13 @@ int main(int argc, char *argv[]) testConversion(); else if (func.compare("transpose") == 0) testTranspose(); - else { + else if (func.compare("test-reshape") == 0) + test_canReshapeWithStrides(); + else if (func.compare("reshape") == 0) + test_reshape(); + else if (func.compare("concat") == 0) { + testConcatenateTensors(); + } else { throw std::runtime_error("Unknown test option :'" + func + "'"); } return 0; From 794c37847a81cbc1df1d18d5787f77191e637332 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 14 Nov 2024 17:36:41 -0800 Subject: [PATCH 004/136] Expand is working --- src/AMSlib/util/tensor.hpp | 31 +++ tests/AMSlib/CMakeLists.txt | 3 + tests/AMSlib/ams_tensor_test.cpp | 334 +++++++++++++++++++++---------- 3 files changed, 267 insertions(+), 101 deletions(-) diff --git a/src/AMSlib/util/tensor.hpp b/src/AMSlib/util/tensor.hpp index 58fbacc2..5f7dc4cb 100644 --- a/src/AMSlib/util/tensor.hpp +++ b/src/AMSlib/util/tensor.hpp @@ -562,6 +562,37 @@ class AMSTensor } } + AMSTensor expand(const ams::ArrayRef new_shape) const + { + // Check if the new shape is compatible for expansion + if (new_shape.size() < _shape.size()) { + throw std::invalid_argument( + "New shape must have equal or greater rank than the original shape."); + } + + // Initialize new strides for the expanded tensor + ams::SmallVector new_strides(new_shape.size(), 0); + + // Map the original shape dimensions onto the new shape, from the last dimension backward + size_t shape_offset = new_shape.size() - _shape.size(); + for (size_t i = 0; i < _shape.size(); ++i) { + size_t new_dim = shape_offset + i; + + if (_shape[i] == 1 && new_shape[new_dim] > 1) { + // Set stride to 0 for expanded singleton dimensions + new_strides[new_dim] = 0; + } else if (_shape[i] == new_shape[new_dim]) { + // Retain the original stride if dimension size matches + new_strides[new_dim] = _strides[i]; + } else { + throw std::invalid_argument( + "Cannot expand non-singleton dimension to a different size."); + } + } + + // Create and return a new tensor view with the expanded shape and updated strides + return AMSTensor::view(_data, new_shape, new_strides, _dType, _location); + } // Function to align and expand a tensor for batch alignment // Helper function to align and expand a tensor's shape for batch alignment static AMSTensor alignAndExpand(AMSTensor& tensor, diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index e9c70bf0..147a83aa 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -234,6 +234,9 @@ set_tests_properties(ams_tensor_reshape PROPERTIES LABELS "AMSTensor") add_test(NAME ams_tensor_concat COMMAND ams_tensor_test "concat") set_tests_properties(ams_tensor_concat PROPERTIES LABELS "AMSTensor") +add_test(NAME ams_tensor_expand COMMAND ams_tensor_test "expand") +set_tests_properties(ams_tensor_expand PROPERTIES LABELS "AMSTensor") + if(WITH_TORCH) BUILD_TEST(ams_inference_test torch_model.cpp) diff --git a/tests/AMSlib/ams_tensor_test.cpp b/tests/AMSlib/ams_tensor_test.cpp index 67032575..10c85610 100644 --- a/tests/AMSlib/ams_tensor_test.cpp +++ b/tests/AMSlib/ams_tensor_test.cpp @@ -248,17 +248,122 @@ void test_reshape() void testConcatenateTensors() { // Test Case 1: Basic Concatenation with Compatible Shapes + //{ + // AMSTensor tensor1 = + // AMSTensor::create({2, 3}, + // {3 * sizeof(float), 1 * sizeof(float)}, + // AMS_SINGLE, + // AMS_HOST); // Shape: [2, 3] + // AMSTensor tensor2 = + // AMSTensor::create({2, 3}, + // {3 * sizeof(float), 1 * sizeof(float)}, + // AMS_SINGLE, + // AMS_HOST); // Shape: [2, 3] + + // tensor1.at(0) = 1.0f; + // tensor1.at(1) = 2.0f; + // tensor1.at(2) = 3.0f; + // tensor1.at(3) = 4.0f; + // tensor1.at(4) = 5.0f; + // tensor1.at(5) = 6.0f; + + // tensor2.at(0) = 7.0f; + // tensor2.at(1) = 8.0f; + // tensor2.at(2) = 9.0f; + // tensor2.at(3) = 10.0f; + // tensor2.at(4) = 11.0f; + // tensor2.at(5) = 12.0f; + + // ams::SmallVector iTensors; + // float* ptr1 = tensor1.data(); + // float* ptr2 = tensor2.data(); + // iTensors.push_back(std::move(tensor1)); + // iTensors.push_back(std::move(tensor2)); + // AMSTensor result = AMSTensor::concatenateTensors(iTensors); + + // ams::SmallVector expected_shape({2, 6}); + + // assert(expected_shape == result.shape() && "Expecting shape to be {2,6}"); + // int elements = std::accumulate(result.shape().begin(), + // result.shape().end(), + // 1, + // std::multiplies()); + + // for (size_t i = 0; i < 2; i++) { + // for (size_t j = 0; j < 6; j++) { + // std::cout << result.elementAt({i, j}) << " " + // << iTensors[j / 3].elementAt({i, j % 3}) << "\n"; + // assert(result.elementAt({i, j}) == + // iTensors[j / 3].elementAt({i, j % 3}) && + // "Values do not match"); + // } + // } + + // std::cout << "Test Case 1 Passed!" << std::endl; + //} + + //// Test Case 2: Concatenation with Broadcasting + //{ + // AMSTensor tensor1 = + // AMSTensor::create({2, 1}, + // {1 * sizeof(float), 1 * sizeof(float)}, + // AMS_SINGLE, + // AMS_HOST); // Shape: [2, 1] + // AMSTensor tensor2 = + // AMSTensor::create({2, 3}, + // {3 * sizeof(float), 1 * sizeof(float)}, + // AMS_SINGLE, + // AMS_HOST); // Shape: [2, 3] + + // tensor1.at(0) = 1.0f; + // tensor1.at(1) = 2.0f; + + // tensor2.at(0) = 3.0f; + // tensor2.at(1) = 4.0f; + // tensor2.at(2) = 5.0f; + // tensor2.at(3) = 6.0f; + // tensor2.at(4) = 7.0f; + // tensor2.at(5) = 8.0f; + + // ams::SmallVector iTensors; + // float* ptr1 = tensor1.data(); + // float* ptr2 = tensor2.data(); + // iTensors.push_back(std::move(tensor1)); + // iTensors.push_back(std::move(tensor2)); + // AMSTensor result = AMSTensor::concatenateTensors(iTensors); + // for (auto& T : iTensors) { + // std::cout << "Tensor\n"; + // for (size_t i = 0; i < T.shape()[0]; i++) { + // for (size_t j = 0; j < T.shape()[1]; j++) { + // std::cout << "[" << i << ", " << j + // << "]:" << T.elementAt({i, j}) << "\n"; + // } + // } + // } + + // for (size_t i = 0; i < 2; i++) { + // for (size_t j = 0; j < 4; j++) { + // assert(result.elementAt({i, j}) == + // iTensors[j > 0].elementAt({i, j != 0 ? j - 1 : 0}) && + // "Values do not match"); + // } + // } + + // std::cout << "Test Case 2 Passed!" << std::endl; + //} + // + // // Test Case 3: Concatenating tensors over different batch axises { - AMSTensor tensor1 = - AMSTensor::create({2, 3}, - {3 * sizeof(float), 1 * sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 3] - AMSTensor tensor2 = - AMSTensor::create({2, 3}, - {3 * sizeof(float), 1 * sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 3] + AMSTensor tensor1 = AMSTensor::create({3, 2}, + {2 * sizeof(float), sizeof(float)}, + AMS_SINGLE, + AMS_HOST, + 0); // Shape: [3, 2] + AMSTensor tensor2 = AMSTensor::create({2, 3}, + {2 * sizeof(float), sizeof(float)}, + AMS_SINGLE, + AMS_HOST, + 1); // Shape: [3, 2] tensor1.at(0) = 1.0f; tensor1.at(1) = 2.0f; @@ -267,110 +372,135 @@ void testConcatenateTensors() tensor1.at(4) = 5.0f; tensor1.at(5) = 6.0f; - tensor2.at(0) = 7.0f; - tensor2.at(1) = 8.0f; - tensor2.at(2) = 9.0f; - tensor2.at(3) = 10.0f; - tensor2.at(4) = 11.0f; - tensor2.at(5) = 12.0f; + tensor2.at(0) = 11.0f; + tensor2.at(1) = 12.0f; + tensor2.at(2) = 13.0f; + tensor2.at(3) = 14.0f; + tensor2.at(4) = 15.0f; + tensor2.at(5) = 16.0f; ams::SmallVector iTensors; - float* ptr1 = tensor1.data(); - float* ptr2 = tensor2.data(); iTensors.push_back(std::move(tensor1)); iTensors.push_back(std::move(tensor2)); + AMSTensor result = AMSTensor::concatenateTensors(iTensors); - ams::SmallVector expected_shape({2, 6}); - - assert(expected_shape == result.shape() && "Expecting shape to be {2,6}"); - int elements = std::accumulate(result.shape().begin(), - result.shape().end(), - 1, - std::multiplies()); - - for (size_t i = 0; i < 2; i++) { - for (size_t j = 0; j < 6; j++) { - std::cout << result.elementAt({i, j}) << " " - << iTensors[j / 3].elementAt({i, j % 3}) << "\n"; - assert(result.elementAt({i, j}) == - iTensors[j / 3].elementAt({i, j % 3}) && - "Values do not match"); + std::cout << "Test Case 3 Passed!" << std::endl; + } + + // Test Case 4: Incompatible Shapes (Expect Exception) + //try { + // AMSTensor tensor1 = + // AMSTensor::create({2, 2}, + // {2 * sizeof(float), 1 * sizeof(float)}, + // AMS_SINGLE, + // AMS_HOST); // Shape: [2, 2] + // AMSTensor tensor2 = + // AMSTensor::create({3, 2}, + // {2 * sizeof(float), 1 * sizeof(float)}, + // AMS_SINGLE, + // AMS_HOST); // Shape: [3, 2] + // ams::SmallVector iTensors; + // iTensors.push_back(std::move(tensor1)); + // iTensors.push_back(std::move(tensor2)); + // std::cerr << "Test Case 4 Failed: Expected exception was not thrown." + // << std::endl; + //} catch (const std::invalid_argument& e) { + // std::cout << "Test Case 4 Passed!" << std::endl; + //} +} + +void test_expand() +{ + // 1. Expand a scalar tensor (shape: {1}) to (4, 3) + { + ams::SmallVector scalar_shape = {1}; + ams::SmallVector scalar_strides = {sizeof(double)}; + AMSTensor scalar_tensor = + AMSTensor::create(scalar_shape, scalar_strides, AMS_DOUBLE, AMS_HOST); + scalar_tensor.at(0) = 42.0; + + // Expand the scalar tensor to shape (4, 3) + ams::SmallVector expanded_shape1 = {4, 3}; + AMSTensor expanded_tensor1 = scalar_tensor.expand(expanded_shape1); + + // Check expanded tensor properties + assert(expanded_shape1 == expanded_tensor1.shape()); + for (size_t i = 0; i < 4; ++i) { + for (size_t j = 0; j < 3; ++j) { + std::cout << "Tensor value " + << expanded_tensor1.elementAt({i, j}) << "\n"; + assert(expanded_tensor1.elementAt({i, j}) == 42.0); } } - - std::cout << "Test Case 1 Passed!" << std::endl; + std::cout << "Test 1: Scalar tensor expanded to (4, 3) - Passed\n"; } - // Test Case 2: Concatenation with Broadcasting + // 2. Expand a 1D tensor (shape: {3}) to (3, 3) { - AMSTensor tensor1 = AMSTensor::create({2, 1}, - {1, 1}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 1] - AMSTensor tensor2 = AMSTensor::create({2, 3}, - {3, 1}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 3] - - tensor1.at(0) = 1.0f; - tensor1.at(1) = 2.0f; - tensor2.at(0) = 3.0f; - tensor2.at(1) = 4.0f; - tensor2.at(2) = 5.0f; - tensor2.at(3) = 6.0f; - tensor2.at(4) = 7.0f; - tensor2.at(5) = 8.0f; - - AMSTensor result = concatenateTensors({tensor1, tensor2}); - - // Expected Shape: [2, 4] after broadcasting tensor1 to [2, 3] - assert(result.shape() == ams::SmallVector{2, 4}); - assert(result.at(0) == 1.0f && result.at(1) == 1.0f); - assert(result.at(4) == 3.0f && result.at(7) == 5.0f); + ams::SmallVector vector_shape = {3}; + ams::SmallVector vector_strides = {sizeof(double)}; + AMSTensor vector_tensor = + AMSTensor::create(vector_shape, vector_strides, AMS_DOUBLE, AMS_HOST); + + // Fill tensor with values + vector_tensor.at(0) = 1.0; + vector_tensor.at(1) = 2.0; + vector_tensor.at(2) = 3.0; + + // Expand the vector tensor to shape (3, 3) + ams::SmallVector expanded_shape2 = {3, 3}; + AMSTensor expanded_tensor2 = vector_tensor.expand(expanded_shape2); + + // Check expanded tensor properties + assert(expanded_shape2 == expanded_tensor2.shape()); + for (size_t i = 0; i < 3; ++i) { + for (size_t j = 0; j < 3; ++j) { + std::cout << "Tensor value " + << expanded_tensor2.elementAt({i, j}) << " original" + << vector_tensor.at(j) << "\n"; + assert(expanded_tensor2.elementAt({i, j}) == + vector_tensor.elementAt({j})); + } + } + std::cout << "Test 2: 1D tensor expanded to (3, 3) - Passed\n"; + } - std::cout << "Test Case 2 Passed!" << std::endl; + // 3. Expand a 2D tensor (shape: {2, 1}) to (2, 3) + { + ams::SmallVector matrix_shape = {2, 1}; + ams::SmallVector matrix_strides = {sizeof(double), sizeof(double)}; + AMSTensor matrix_tensor = + AMSTensor::create(matrix_shape, matrix_strides, AMS_DOUBLE, AMS_HOST); + + // Fill tensor with values + matrix_tensor.at(0) = 10.0; + matrix_tensor.at(1) = 20.0; + + // Expand the matrix tensor to shape (2, 3) + ams::SmallVector expanded_shape3 = {2, 3}; + AMSTensor expanded_tensor3 = matrix_tensor.expand(expanded_shape3); + + // Check expanded tensor properties + assert(expanded_shape3 == expanded_tensor3.shape()); + std::cout << "Matrix Tensor dimensions: " << matrix_tensor.shape().size() + << "\n"; + matrix_tensor.dump(); + std::cout << "Expanded " + << "\n"; + expanded_tensor3.dump(); + + expanded_tensor3.dump(); + for (size_t i = 0; i < 2; ++i) { + for (size_t j = 0; j < 3; ++j) { + assert(expanded_tensor3.elementAt({i, j}) == + matrix_tensor.elementAt({i, 0})); + } + } + std::cout << "Test 3: 2D tensor expanded to (2, 3) - Passed\n"; } - // - // // Test Case 3: Concatenating a Single Tensor - // { - // AMSTensor tensor = AMSTensor::create({3, 2}, - // {2, 1}, - // AMS_SINGLE, - // AMS_HOST); // Shape: [3, 2] - // tensor.at(0) = 1.0f; - // tensor.at(1) = 2.0f; - // tensor.at(2) = 3.0f; - // tensor.at(3) = 4.0f; - // tensor.at(4) = 5.0f; - // tensor.at(5) = 6.0f; - // - // AMSTensor result = concatenateTensors({tensor}); - // - // // Expected Shape: [3, 2] - should match original tensor - // assert(result.shape() == tensor.shape()); - // assert(result.at(0) == 1.0f && result.at(5) == 6.0f); - // - // std::cout << "Test Case 3 Passed!" << std::endl; - // } - // - // // Test Case 4: Incompatible Shapes (Expect Exception) - // try { - // AMSTensor tensor1 = AMSTensor::create({2, 2}, - // {2, 1}, - // AMS_SINGLE, - // AMS_HOST); // Shape: [2, 2] - // AMSTensor tensor2 = AMSTensor::create({3, 2}, - // {2, 1}, - // AMS_SINGLE, - // AMS_HOST); // Shape: [3, 2] - // - // concatenateTensors({tensor1, tensor2}); - // std::cerr << "Test Case 4 Failed: Expected exception was not thrown." - // << std::endl; - // } catch (const std::invalid_argument &e) { - // std::cout << "Test Case 4 Passed!" << std::endl; - // } + + std::cout << "All expand tests passed successfully!\n"; } @@ -399,6 +529,8 @@ int main(int argc, char* argv[]) test_canReshapeWithStrides(); else if (func.compare("reshape") == 0) test_reshape(); + else if (func.compare("expand") == 0) + test_expand(); else if (func.compare("concat") == 0) { testConcatenateTensors(); } else { From 7a8bacab54049b1b1b49a0bffb9c6752db068c2d Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 22 Nov 2024 09:32:57 -0800 Subject: [PATCH 005/136] Remove C++14 for cuda --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb52c561..010019a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -77,7 +77,7 @@ if (WITH_CUDA) # we need to enable nvcc enable_language(CUDA) - set(CMAKE_CUDA_STANDARD 14) + # set(CMAKE_CUDA_STANDARD 14) # Turn off message of mfem set(ENABLE_CUDA True) list(APPEND AMS_APP_LIBRARIES ${CUDA_LIBRARIES} cuda) From 80ae4be90630b7c5d1282ea6c239e9099d6472eb Mon Sep 17 00:00:00 2001 From: koparasy Date: Tue, 3 Dec 2024 14:47:52 -0800 Subject: [PATCH 006/136] Fix tensor concat --- src/AMSlib/util/tensor.hpp | 225 ++++++++++++--------- tests/AMSlib/ams_tensor_test.cpp | 326 +++++++++++++++++++------------ 2 files changed, 333 insertions(+), 218 deletions(-) diff --git a/src/AMSlib/util/tensor.hpp b/src/AMSlib/util/tensor.hpp index 5f7dc4cb..e5dc0e07 100644 --- a/src/AMSlib/util/tensor.hpp +++ b/src/AMSlib/util/tensor.hpp @@ -1,5 +1,6 @@ #include +#include #include #include #include @@ -23,6 +24,7 @@ class AMSTensor AMSResourceType _location; // CPU/GPU/Pinned bool _owned; bool _contiguous; + bool _bytes; private: @@ -118,6 +120,7 @@ class AMSTensor _data = rm.allocate(_elements * _element_size, _location, _element_size); + _bytes = _elements * _element_size; if (!_data) { throw std::runtime_error("Failed to allocate memory for AMSTensor."); } @@ -166,6 +169,16 @@ class AMSTensor return tensor; } + static AMSTensor view(AMSTensor& tensor) + { + return AMSTensor::view(tensor._data, + tensor._shape, + tensor._strides, + tensor._dType, + tensor._location, + tensor._batch_axis); + } + // Helper function to compute if a reshape is feasible without copying bool canReshapeWithStrides(const ams::ArrayRef new_shape) { @@ -374,7 +387,7 @@ class AMSTensor } // Calculate new strides for a contiguous layout in the new tensor - ams::SmallVector newStrides(newShape.size()); + ams::SmallVector newStrides(newShape.size()); size_t elementSize = dtype_to_size(dType); newStrides.back() = elementSize; for (int i = newStrides.size() - 2; i >= 0; --i) { @@ -394,6 +407,7 @@ class AMSTensor // Create the new tensor with the calculated shape and strides AMSTensor result = AMSTensor::create(newShape, newStrides, dType, location); + std::memset(result._data, 0, result._element_size * result._elements); // Copy data from each tensor to the correct position in `result` size_t offset = 0; @@ -404,56 +418,95 @@ class AMSTensor std::multiplies()); int tid = 0; int index = 0; + std::cout << "Num ELements on the left are " << num_elements_left << "\n"; for (auto& tensor : tensors) { std::cout << "Tid is " << tid << "\n"; int src_index = 0; - // Determine the copy size for a single slice along the concatenation axis - size_t copy_size_per_slice = tensor._strides[axis]; // tensors differ only on the axis dimension size_t num_elements_right = std::accumulate(&tensor._shape[axis], tensor._shape.end(), 1, std::multiplies()); - std::cout << "Tensor Shape " << tensor.shape()[0] << "," - << tensor.shape()[1] << "\n"; - std::cout << "num_elements_left " << num_elements_left << "\n"; - std::cout << "num_elements_right " << num_elements_right << "\n"; - for (size_t left = 0; left < num_elements_left; left++) { + if (tensor.isContiguous(tensor._element_size)) { + for (size_t left = 0; left < num_elements_left; left++) { + // FIXME: This will break if axis = 0; +#warning Will break when axis is 0 + uint8_t* dst_start_ptr = + &result._data[left * result._strides[axis - 1]] + + tid * result._strides[axis]; + uint8_t* src_start_ptr = + &tensor._data[left * tensor._strides[axis - 1]]; + std::cout << "Next left\n"; + std::cout << "result._strides " << result._strides[axis - 1] << "\n"; + std::cout << "tensor._strides " << tensor._strides[axis - 1] << "\n"; + for (int right = 0; right < num_elements_right; right++) { + index = ((uintptr_t)dst_start_ptr - (uintptr_t)result._data) / + result._element_size; + src_index = ((uintptr_t)src_start_ptr - (uintptr_t)tensor._data) / + tensor._element_size; + std::cout << "Dest index: " << index << "\n"; + std::cout << "Src index: " << src_index << "\n"; + if (tensor._dType == AMS_SINGLE) { + float tmp = *reinterpret_cast(src_start_ptr); + for (int i = 0; i < sizeof(float); i++) { + dst_start_ptr[i] = src_start_ptr[i]; + } + dst_start_ptr += sizeof(float); + src_start_ptr += sizeof(float); + } else if (tensor._dType == AMS_DOUBLE) { + for (int i = 0; i < sizeof(double); i++) { + dst_start_ptr[i] = src_start_ptr[i]; + } + dst_start_ptr += sizeof(double); + src_start_ptr += sizeof(double); + } + index++; + src_index++; + } + } + } else { + uint64_t dst_elements = 0; + uint64_t dst_offset = 0; uint8_t* dst_start_ptr = - &result._data[left * result._strides[axis - 1]] + + &result._data[dst_offset * result._strides[axis - 1]] + tid * result._strides[axis]; - uint8_t* src_start_ptr = - &tensor._data[left * tensor._strides[axis - 1]]; - std::cout << "Next left\n"; - std::cout << "result._strides " << result._strides[axis - 1] << "\n"; - std::cout << "tensor._strides " << tensor._strides[axis - 1] << "\n"; - for (int right = 0; right < num_elements_right; right++) { - index = ((uintptr_t)dst_start_ptr - (uintptr_t)result._data) / - result._element_size; - src_index = ((uintptr_t)src_start_ptr - (uintptr_t)tensor._data) / - tensor._element_size; - std::cout << "Dest index: " << index << "\n"; - std::cout << "Src index: " << src_index << "\n"; + std::cout << "Tid is " << tid << " and result stride is " + << result._strides[axis] << "\n"; + tensor.dump_vector("Shape", tensor.shape()); + for (size_t i = 0; i < tensor.elements(); i++) { + ams::SmallVector index(tensor.shape().size(), 0); + int rem = i; + for (long j = index.size() - 1; j >= 0; j--) { + index[j] = rem % tensor.shape()[j]; + rem = rem / tensor.shape()[j]; + } + tensor.dump_vector("Index is", index); + tensor.dump(); if (tensor._dType == AMS_SINGLE) { - float tmp = *reinterpret_cast(src_start_ptr); - std::cout << "Assigning float " << tmp << "\n"; - for (int i = 0; i < sizeof(float); i++) { - dst_start_ptr[i] = src_start_ptr[i]; - } - tmp = *reinterpret_cast(dst_start_ptr); - std::cout << "Dest value " << tmp << "\n"; - - dst_start_ptr += sizeof(float); - src_start_ptr += sizeof(float); + float tmp = tensor.elementAt(index); + float* dst = (float*)dst_start_ptr; + dst[dst_elements] = tmp; + std::cout << "Assigning element " << tmp << "\n"; } else if (tensor._dType == AMS_DOUBLE) { - for (int i = 0; i < sizeof(double); i++) { - dst_start_ptr[i] = src_start_ptr[i]; + double tmp = tensor.elementAt(index); + double* dst = (double*)dst_start_ptr; + dst[dst_elements] = tmp; + } + dst_elements++; + std::cout << "Num Elements right are " << num_elements_right << "\n"; + if (dst_elements == num_elements_right) { + dst_offset += 1; + dst_start_ptr = + &result._data[dst_offset * result._strides[axis - 1]] + + tid * result._strides[axis]; + + dst_elements = 0; + std::cout << "Increasing pointer by " << result._strides[axis - 1] + << "\n"; + for (int i = 0; i < tensor.shape()[axis]; i++) { + std::cout << ((float*)(dst_start_ptr))[i] << "\n"; } - dst_start_ptr += sizeof(double); - src_start_ptr += sizeof(double); } - index++; - src_index++; } } // Here we move the pointer of the 'tid' index. @@ -551,6 +604,7 @@ class AMSTensor _location); // Copy data from the original tensor to the contiguous tensor +#warning this is wrong. auto& rm = ams::ResourceManager::getInstance(); rm.copy(_data, _location, @@ -571,7 +625,7 @@ class AMSTensor } // Initialize new strides for the expanded tensor - ams::SmallVector new_strides(new_shape.size(), 0); + ams::SmallVector new_strides(new_shape.size(), 0); // Map the original shape dimensions onto the new shape, from the last dimension backward size_t shape_offset = new_shape.size() - _shape.size(); @@ -600,27 +654,18 @@ class AMSTensor int max_rank) { auto shape = tensor.shape(); - auto batch_axis = tensor.batch_axis(); ams::SmallVector new_shape(max_rank, 1); - new_shape[batch_axis] = target_batch_size; // Set the target batch size - std::cout << "Batch Axis is " << batch_axis << "\n"; - std::cout << "New shape size is " << new_shape.size() << "\n"; - // Move tensor's dimensions to the appropriate location in `new_shape` for (size_t i = 0, j = 0; i < shape.size(); ++i, ++j) { - if (i == batch_axis) { - new_shape[batch_axis] = shape[batch_axis]; - } else { - new_shape[j] = shape[i]; - } + new_shape[j] = shape[i]; } std::cout << "Before reshape \n"; tensor.dump(); return tensor.reshape(new_shape); // Reshape without copying if possible } - void dump_vector(const std::string name, ams::ArrayRef Vec) + void dump_vector(const std::string name, ams::ArrayRef Vec) const { std::cout << name << " ["; for (auto I : Vec) { @@ -629,13 +674,13 @@ class AMSTensor std::cout << "]\n"; } - void dump() + void dump() const { dump_vector("Stride", _strides); dump_vector("Shape", _shape); + std::cout << "Elements " << _elements << "\n"; } - // Main concatenation function with broadcasting checks static AMSTensor concatenateTensors(ams::MutableArrayRef tensors) { if (tensors.empty()) { @@ -645,62 +690,62 @@ class AMSTensor // Determine the batch axis and target batch size based on the first tensor int batch_axis = tensors[0].batch_axis(); - int target_batch_size = tensors[0].shape()[batch_axis]; + + // For all tensors, AMS assumes that batch_axis points to the dimension holding the samples. That one needs to be equal across all tensors. + size_t batch_dim_size = tensors[0]._shape[tensors[0]._batch_axis]; + std::vector aligned_tensors; + + for (auto& T : tensors) { + if (batch_dim_size != T._shape[T._batch_axis]) + throw std::invalid_argument( + "Tensors should have equal shape on batch-axis"); + if (T._batch_axis != 0) { + aligned_tensors.push_back(T.transpose(T._batch_axis, 0)); + } else { + aligned_tensors.push_back(AMSTensor::view(T)); + } + } // Find the maximum rank among all tensors to align shapes - int max_rank = 0; + size_t max_rank = 0; for (const auto& tensor : tensors) { - max_rank = std::max(max_rank, static_cast(tensor.shape().size())); + max_rank = std::max(max_rank, tensor.shape().size()); } - // Prepare final shape based on broadcasting rules and target batch size - ams::SmallVector final_shape(max_rank, 1); - final_shape[batch_axis] = - target_batch_size; // Set batch size in final shape - - std::vector aligned_tensors; - std::cout << "Max Rank is " << max_rank << "\n"; - + // FIXME: TILL THIS POINT THIS is "correct" + ams::SmallVector expanded_tensors; // Align all tensors to the same rank and check for broadcasting compatibility - for (AMSTensor& tensor : tensors) { + for (AMSTensor& tensor : aligned_tensors) { // Align and expand each tensor to have the same rank as `max_rank` std::cout << "Original Tensor is \n"; - tensor.dump(); - AMSTensor aligned_tensor = - alignAndExpand(tensor, target_batch_size, max_rank); - std::cout << "Aligned Tensor is \n"; - aligned_tensor.dump(); - - // Update final shape based on broadcasting compatibility - const auto& aligned_shape = aligned_tensor.shape(); - for (size_t i = 0; i < max_rank; ++i) { - std::cout << "final_shape rank: " << final_shape.size() - << ", aligned_shape rank: " << aligned_shape.size() - << std::endl; - assert(final_shape.size() == aligned_shape.size() && - "Shapes must have the same rank for broadcasting"); - if (!isBroadcastCompatible(final_shape[i], aligned_shape[i])) { - throw std::invalid_argument( - "Tensors have incompatible shapes for concatenation."); - } - final_shape[i] = getBroadcastSize(final_shape[i], aligned_shape[i]); + ams::SmallVector new_shape(tensor.shape()); + for (int i = tensor._shape.size(); i < max_rank; i++) { + new_shape.push_back(1); + // TODO we likely need also to generate the strides correctly. Need to test this. +#warning Test for strides. } - aligned_tensors.push_back(std::move(aligned_tensor)); + tensor._shape = new_shape; + expanded_tensors.push_back(view(tensor)); } // Concatenate tensors along the last dimension or specified axis - for (auto& V : aligned_tensors) { - std::cout << "Shape "; - for (auto s : V.shape()) { - std::cout << " " << s << " "; + std::cout << "========= Debug =======\n"; + for (auto& V : expanded_tensors) { + std::cout << "expanded_tensors \n"; + V.dump(); + for (size_t i = 0; i < V.shape()[0]; i++) { + for (size_t j = 0; j < V.shape()[1]; j++) { + std::cout << "ELements at {" << i << ", " << j << "} " + << V.elementAt({i, j}) << "\n"; + } } - std::cout << "\n"; } + std::cout << "========= Debug =======\n"; std::cout << "Max Ranking is " << max_rank << "\n"; - - return AMSTensor::concatenate(aligned_tensors, max_rank - 1); + // Always concat on outer dimension + return AMSTensor::concatenate(expanded_tensors, max_rank - 1); } size_t elements() const { return _elements; } diff --git a/tests/AMSlib/ams_tensor_test.cpp b/tests/AMSlib/ams_tensor_test.cpp index 10c85610..d7945798 100644 --- a/tests/AMSlib/ams_tensor_test.cpp +++ b/tests/AMSlib/ams_tensor_test.cpp @@ -247,112 +247,112 @@ void test_reshape() void testConcatenateTensors() { - // Test Case 1: Basic Concatenation with Compatible Shapes - //{ - // AMSTensor tensor1 = - // AMSTensor::create({2, 3}, - // {3 * sizeof(float), 1 * sizeof(float)}, - // AMS_SINGLE, - // AMS_HOST); // Shape: [2, 3] - // AMSTensor tensor2 = - // AMSTensor::create({2, 3}, - // {3 * sizeof(float), 1 * sizeof(float)}, - // AMS_SINGLE, - // AMS_HOST); // Shape: [2, 3] - - // tensor1.at(0) = 1.0f; - // tensor1.at(1) = 2.0f; - // tensor1.at(2) = 3.0f; - // tensor1.at(3) = 4.0f; - // tensor1.at(4) = 5.0f; - // tensor1.at(5) = 6.0f; - - // tensor2.at(0) = 7.0f; - // tensor2.at(1) = 8.0f; - // tensor2.at(2) = 9.0f; - // tensor2.at(3) = 10.0f; - // tensor2.at(4) = 11.0f; - // tensor2.at(5) = 12.0f; - - // ams::SmallVector iTensors; - // float* ptr1 = tensor1.data(); - // float* ptr2 = tensor2.data(); - // iTensors.push_back(std::move(tensor1)); - // iTensors.push_back(std::move(tensor2)); - // AMSTensor result = AMSTensor::concatenateTensors(iTensors); - - // ams::SmallVector expected_shape({2, 6}); - - // assert(expected_shape == result.shape() && "Expecting shape to be {2,6}"); - // int elements = std::accumulate(result.shape().begin(), - // result.shape().end(), - // 1, - // std::multiplies()); - - // for (size_t i = 0; i < 2; i++) { - // for (size_t j = 0; j < 6; j++) { - // std::cout << result.elementAt({i, j}) << " " - // << iTensors[j / 3].elementAt({i, j % 3}) << "\n"; - // assert(result.elementAt({i, j}) == - // iTensors[j / 3].elementAt({i, j % 3}) && - // "Values do not match"); - // } - // } - - // std::cout << "Test Case 1 Passed!" << std::endl; - //} - - //// Test Case 2: Concatenation with Broadcasting - //{ - // AMSTensor tensor1 = - // AMSTensor::create({2, 1}, - // {1 * sizeof(float), 1 * sizeof(float)}, - // AMS_SINGLE, - // AMS_HOST); // Shape: [2, 1] - // AMSTensor tensor2 = - // AMSTensor::create({2, 3}, - // {3 * sizeof(float), 1 * sizeof(float)}, - // AMS_SINGLE, - // AMS_HOST); // Shape: [2, 3] - - // tensor1.at(0) = 1.0f; - // tensor1.at(1) = 2.0f; - - // tensor2.at(0) = 3.0f; - // tensor2.at(1) = 4.0f; - // tensor2.at(2) = 5.0f; - // tensor2.at(3) = 6.0f; - // tensor2.at(4) = 7.0f; - // tensor2.at(5) = 8.0f; - - // ams::SmallVector iTensors; - // float* ptr1 = tensor1.data(); - // float* ptr2 = tensor2.data(); - // iTensors.push_back(std::move(tensor1)); - // iTensors.push_back(std::move(tensor2)); - // AMSTensor result = AMSTensor::concatenateTensors(iTensors); - // for (auto& T : iTensors) { - // std::cout << "Tensor\n"; - // for (size_t i = 0; i < T.shape()[0]; i++) { - // for (size_t j = 0; j < T.shape()[1]; j++) { - // std::cout << "[" << i << ", " << j - // << "]:" << T.elementAt({i, j}) << "\n"; - // } - // } - // } - - // for (size_t i = 0; i < 2; i++) { - // for (size_t j = 0; j < 4; j++) { - // assert(result.elementAt({i, j}) == - // iTensors[j > 0].elementAt({i, j != 0 ? j - 1 : 0}) && - // "Values do not match"); - // } - // } - - // std::cout << "Test Case 2 Passed!" << std::endl; - //} - // - // // Test Case 3: Concatenating tensors over different batch axises + // Test Case 1 : Basic Concatenation with Compatible Shapes + { + AMSTensor tensor1 = + AMSTensor::create({2, 3}, + {3 * sizeof(float), 1 * sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 3] + AMSTensor tensor2 = + AMSTensor::create({2, 3}, + {3 * sizeof(float), 1 * sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 3] + + tensor1.at(0) = 1.0f; + tensor1.at(1) = 2.0f; + tensor1.at(2) = 3.0f; + tensor1.at(3) = 4.0f; + tensor1.at(4) = 5.0f; + tensor1.at(5) = 6.0f; + + tensor2.at(0) = 7.0f; + tensor2.at(1) = 8.0f; + tensor2.at(2) = 9.0f; + tensor2.at(3) = 10.0f; + tensor2.at(4) = 11.0f; + tensor2.at(5) = 12.0f; + + ams::SmallVector iTensors; + float* ptr1 = tensor1.data(); + float* ptr2 = tensor2.data(); + iTensors.push_back(std::move(tensor1)); + iTensors.push_back(std::move(tensor2)); + AMSTensor result = AMSTensor::concatenateTensors(iTensors); + + ams::SmallVector expected_shape({2, 6}); + + assert(expected_shape == result.shape() && "Expecting shape to be {2,6}"); + int elements = std::accumulate(result.shape().begin(), + result.shape().end(), + 1, + std::multiplies()); + + for (size_t i = 0; i < 2; i++) { + for (size_t j = 0; j < 6; j++) { + std::cout << result.elementAt({i, j}) << " " + << iTensors[j / 3].elementAt({i, j % 3}) << "\n"; + assert(result.elementAt({i, j}) == + iTensors[j / 3].elementAt({i, j % 3}) && + "Values do not match"); + } + } + + std::cout << "Test Case 1 Passed!" << std::endl; + } + + // Test Case 2: Concatenation with Broadcasting + { + AMSTensor tensor1 = + AMSTensor::create({2, 1}, + {1 * sizeof(float), 1 * sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 1] + AMSTensor tensor2 = + AMSTensor::create({2, 3}, + {3 * sizeof(float), 1 * sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 3] + + tensor1.at(0) = 1.0f; + tensor1.at(1) = 2.0f; + + tensor2.at(0) = 3.0f; + tensor2.at(1) = 4.0f; + tensor2.at(2) = 5.0f; + tensor2.at(3) = 6.0f; + tensor2.at(4) = 7.0f; + tensor2.at(5) = 8.0f; + + ams::SmallVector iTensors; + float* ptr1 = tensor1.data(); + float* ptr2 = tensor2.data(); + iTensors.push_back(std::move(tensor1)); + iTensors.push_back(std::move(tensor2)); + AMSTensor result = AMSTensor::concatenateTensors(iTensors); + for (auto& T : iTensors) { + std::cout << "Tensor\n"; + for (size_t i = 0; i < T.shape()[0]; i++) { + for (size_t j = 0; j < T.shape()[1]; j++) { + std::cout << "[" << i << ", " << j + << "]:" << T.elementAt({i, j}) << "\n"; + } + } + } + + for (size_t i = 0; i < 2; i++) { + for (size_t j = 0; j < 4; j++) { + assert(result.elementAt({i, j}) == + iTensors[j > 0].elementAt({i, j != 0 ? j - 1 : 0}) && + "Values do not match"); + } + } + + std::cout << "Test Case 2 Passed!" << std::endl; + } + + // Test Case 3: Concatenating tensors over different batch axises { AMSTensor tensor1 = AMSTensor::create({3, 2}, {2 * sizeof(float), sizeof(float)}, @@ -360,10 +360,10 @@ void testConcatenateTensors() AMS_HOST, 0); // Shape: [3, 2] AMSTensor tensor2 = AMSTensor::create({2, 3}, - {2 * sizeof(float), sizeof(float)}, + {3 * sizeof(float), sizeof(float)}, AMS_SINGLE, AMS_HOST, - 1); // Shape: [3, 2] + 1); // Shape: [2, 3] tensor1.at(0) = 1.0f; tensor1.at(1) = 2.0f; @@ -384,30 +384,98 @@ void testConcatenateTensors() iTensors.push_back(std::move(tensor2)); AMSTensor result = AMSTensor::concatenateTensors(iTensors); + std::cout << "Result\n"; + result.dump(); + for (size_t i = 0; i < 3; i++) { + for (size_t j = 0; j < 2; j++) { + std::cout << "ELements at {" << i << ", " << j << "} " + << result.elementAt({i, j}) << "\n"; + assert(result.elementAt({i, j}) == + iTensors[0].elementAt({i, j}) && + "Values do not match"); + } + } + + for (size_t i = 0; i < 3; i++) { + for (size_t j = 0; j < 2; j++) { + std::cout << "ELements at {" << i << ", " << j + 2 << "} " + << result.elementAt({i, 2 + j}) << "\n"; + assert(result.elementAt({i, j + 2}) == + iTensors[1].elementAt({j, i}) && + "Values do not match"); + } + } std::cout << "Test Case 3 Passed!" << std::endl; } - // Test Case 4: Incompatible Shapes (Expect Exception) - //try { - // AMSTensor tensor1 = - // AMSTensor::create({2, 2}, - // {2 * sizeof(float), 1 * sizeof(float)}, - // AMS_SINGLE, - // AMS_HOST); // Shape: [2, 2] - // AMSTensor tensor2 = - // AMSTensor::create({3, 2}, - // {2 * sizeof(float), 1 * sizeof(float)}, - // AMS_SINGLE, - // AMS_HOST); // Shape: [3, 2] - // ams::SmallVector iTensors; - // iTensors.push_back(std::move(tensor1)); - // iTensors.push_back(std::move(tensor2)); - // std::cerr << "Test Case 4 Failed: Expected exception was not thrown." - // << std::endl; - //} catch (const std::invalid_argument& e) { - // std::cout << "Test Case 4 Passed!" << std::endl; - //} + // Test Case 5 : Incompatible Shapes(Expect Exception) + try { + AMSTensor tensor1 = + AMSTensor::create({2, 2}, + {2 * sizeof(float), 1 * sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 2] + AMSTensor tensor2 = + AMSTensor::create({3, 2}, + {2 * sizeof(float), 1 * sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [3, 2] + ams::SmallVector iTensors; + iTensors.push_back(std::move(tensor1)); + iTensors.push_back(std::move(tensor2)); + AMSTensor result = AMSTensor::concatenateTensors(iTensors); + std::cerr << "Test Case 4 Failed: Expected exception was not thrown." + << std::endl; + } catch (const std::invalid_argument& e) { + std::cout << "Test Case 4 Passed!" << std::endl; + } + + // Test Case 6: Concatenate with broadcast + { + float scalar = 128; + AMSTensor tensor1 = AMSTensor::view((uint8_t*)&scalar, + {2, 1}, + {0, sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 1] + AMSTensor tensor2 = + AMSTensor::create({2, 3}, + {3 * sizeof(float), 1 * sizeof(float)}, + AMS_SINGLE, + AMS_HOST); // Shape: [2, 3] + + tensor2.at(0) = 1.0f; + tensor2.at(1) = 2.0f; + tensor2.at(2) = 3.0f; + tensor2.at(3) = 4.0f; + tensor2.at(4) = 5.0f; + tensor2.at(5) = 6.0f; + + ams::SmallVector iTensors; + float* ptr1 = tensor1.data(); + float* ptr2 = tensor2.data(); + iTensors.push_back(std::move(tensor1)); + iTensors.push_back(std::move(tensor2)); + AMSTensor result = AMSTensor::concatenateTensors(iTensors); + std::cout << "Tensor\n"; + for (size_t i = 0; i < result.shape()[0]; i++) { + for (size_t j = 0; j < result.shape()[1]; j++) { + std::cout << "[" << i << ", " << j + << "]:" << result.elementAt({i, j}) << "\n"; + } + } + + for (size_t i = 0; i < 2; i++) { + for (size_t j = 0; j < 4; j++) { + assert(result.elementAt({i, j}) == + iTensors[j > 0].elementAt({i, j != 0 ? j - 1 : 0}) && + "Values do not match"); + } + } + + std::cout << "Test Case 5 Passed!" << std::endl; + } } void test_expand() @@ -424,6 +492,8 @@ void test_expand() ams::SmallVector expanded_shape1 = {4, 3}; AMSTensor expanded_tensor1 = scalar_tensor.expand(expanded_shape1); + expanded_tensor1.dump(); + // Check expanded tensor properties assert(expanded_shape1 == expanded_tensor1.shape()); for (size_t i = 0; i < 4; ++i) { From 867d200f4fa279a64d49a9c58b1f58a0a9ebe309 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 9 Dec 2024 14:38:35 -0800 Subject: [PATCH 007/136] Simplified surrogate interfaces by assuming pytorch support, improves testing --- src/AMSlib/ml/surrogate.cpp | 308 ++++++++++++ src/AMSlib/ml/surrogate.hpp | 468 +++--------------- tests/AMSlib/torch/CMakeLists.txt | 168 +++++++ tests/AMSlib/torch/evaluate_model.cpp | 98 ++++ .../torch/evalute_model_conversions.cpp | 228 +++++++++ tests/AMSlib/torch/generate.py | 127 +++++ tests/AMSlib/torch/generate.sh | 24 + tests/AMSlib/torch/verify_device.cpp | 33 ++ tests/AMSlib/torch/verify_dtype.cpp | 26 + 9 files changed, 1074 insertions(+), 406 deletions(-) create mode 100644 src/AMSlib/ml/surrogate.cpp create mode 100644 tests/AMSlib/torch/CMakeLists.txt create mode 100644 tests/AMSlib/torch/evaluate_model.cpp create mode 100644 tests/AMSlib/torch/evalute_model_conversions.cpp create mode 100644 tests/AMSlib/torch/generate.py create mode 100755 tests/AMSlib/torch/generate.sh create mode 100644 tests/AMSlib/torch/verify_device.cpp create mode 100644 tests/AMSlib/torch/verify_dtype.cpp diff --git a/src/AMSlib/ml/surrogate.cpp b/src/AMSlib/ml/surrogate.cpp new file mode 100644 index 00000000..ebb15429 --- /dev/null +++ b/src/AMSlib/ml/surrogate.cpp @@ -0,0 +1,308 @@ + +#include +#include + +#include +#include +#include +#include +#include + +#include "AMS.h" +#include "surrogate.hpp" +#include "wf/debug.h" + +static std::string getDTypeAsString(torch::Dtype dtype) +{ + if (dtype == torch::kFloat32) return "float32"; + if (dtype == torch::kFloat64) return "float64"; + if (dtype == torch::kInt32) return "int32"; + if (dtype == torch::kInt64) return "int64"; + if (dtype == torch::kBool) return "bool"; + if (dtype == torch::kUInt8) return "uint8"; + if (dtype == torch::kInt8) return "int8"; + + // Add other types as needed + return "unknown"; +} + +static std::string getAMSDTypeAsString(AMSDType dType) +{ + if (dType == AMS_SINGLE) + return "float32"; + else if (dType == AMS_DOUBLE) + return "float64"; + return "unknown"; +} + + +SurrogateModel::SurrogateModel(std::string& model_path, bool isDeltaUQ) + : _model_path(model_path), _is_DeltaUQ(isDeltaUQ) +{ + + std::experimental::filesystem::path Path(model_path); + std::error_code ec; + + if (!std::experimental::filesystem::exists(Path, ec)) { + std::abort(); + FATAL(Surrogate, + "Path to Surrogate Model (%s) Does not exist", + model_path.c_str()) + } + + try { + module = torch::jit::load(model_path); + } catch (const c10::Error& e) { + printf("Error opening %s\n", model_path.c_str()); + } + std::tie(model_device, torch_device) = getModelResourceType(); + std::tie(model_dtype, torch_dtype) = getModelDataType(); +} + +std::tuple SurrogateModel:: + getModelResourceType() +{ + // Iterate through the parameters to determine the device + for (const auto& parameter : module.parameters()) { + // Return the device of the first parameter found + switch (parameter.device().type()) { + case c10::DeviceType::CUDA: + case c10::DeviceType::HIP: + return std::make_tuple(AMS_DEVICE, parameter.device().type()); + case c10::DeviceType::CPU: + return std::make_tuple(AMS_HOST, parameter.device().type()); + default: + continue; + } + } + + // If no parameters are found, check the buffers + for (const auto& buffer : module.buffers()) { + switch (buffer.device().type()) { + case c10::DeviceType::CUDA: + case c10::DeviceType::HIP: + return std::make_tuple(AMS_DEVICE, buffer.device().type()); + case c10::DeviceType::CPU: + return std::make_tuple(AMS_HOST, buffer.device().type()); + default: + continue; + } + } + + // If no parameters or buffers are found, default to unknown + return std::make_tuple(AMS_UNKNOWN, + c10::DeviceType::COMPILE_TIME_MAX_DEVICE_TYPES); +} + +std::tuple SurrogateModel::getModelDataType() +{ + AMSDType dParamType = AMSDType::AMS_DOUBLE; + torch::Dtype torchType; + for (const auto& parameter : module.parameters()) { + // Return the device of the first parameter found + if (parameter.dtype() == at::kFloat) { + dParamType = AMS_SINGLE; + torchType = at::kFloat; + } else if (parameter.dtype() == at::kDouble) { + dParamType = AMS_DOUBLE; + torchType = at::kDouble; + } else { + throw std::runtime_error(std::string("Invalid datatype ") + + std::string(parameter.dtype().name())); + } + } + // Verify + for (const auto& parameter : module.parameters()) { + if (parameter.dtype() != torchType) + throw std::runtime_error("Provided model has mixed data types"); + } + + AMSDType dBufferType = dParamType; + for (const auto& buffer : module.buffers()) { + // Return the device of the first parameter found + if (buffer.dtype() == at::kFloat) { + dBufferType = AMS_SINGLE; + torchType = at::kFloat; + } else if (buffer.dtype() == at::kDouble) { + dBufferType = AMS_DOUBLE; + torchType = at::kDouble; + } else { + throw std::runtime_error(std::string("Invalid datatype ") + + std::string(buffer.dtype().name())); + } + } + // Verify + for (const auto& buffer : module.buffers()) { + if (buffer.dtype() != torchType) + throw std::runtime_error("Provided model has mixed data types"); + } + + if (dParamType != dBufferType) + throw std::runtime_error( + "Provided model has mixed data types between parameters and buffers"); + + return std::make_tuple(dParamType, torchType); +} + + +std::tuple SurrogateModel::_computeDetlaUQ( + c10::IValue& deltaUQTuple, + AMSUQPolicy policy, + float threshold) +{ + at::Tensor output_mean_tensor = deltaUQTuple.toTuple() + ->elements()[0] + .toTensor() + .set_requires_grad(false) + .detach(); + at::Tensor output_stdev_tensor = deltaUQTuple.toTuple() + ->elements()[1] + .toTensor() + .set_requires_grad(false) + .detach(); + auto outer_dim = output_stdev_tensor.sizes().size() - 1; + if (policy != AMSUQPolicy::AMS_DELTAUQ_MAX && + policy != AMSUQPolicy::AMS_DELTAUQ_MEAN) + throw std::runtime_error("Invalid DELTA_UQ policy"); + + if (policy == AMSUQPolicy::AMS_DELTAUQ_MEAN) { + auto mean = output_stdev_tensor.mean(outer_dim); + auto predicate = mean < threshold; + return std::make_tuple(std::move(output_mean_tensor), std::move(predicate)); + } else if (policy == AMSUQPolicy::AMS_DELTAUQ_MAX) { + auto tmp = output_stdev_tensor.max(outer_dim); + torch::Tensor max = std::get<0>(tmp); + auto predicate = max < threshold; + return std::make_tuple(std::move(output_mean_tensor), std::move(predicate)); + } + throw std::runtime_error("Invalid DELTA_UQ policy"); +} + + +std::tuple SurrogateModel::_evaluate( + torch::Tensor& inputs, + AMSUQPolicy policy, + float threshold) +{ + if (inputs.dtype() != torch_dtype) { + throw std::runtime_error( + "Received inputs of wrong dType. Model is expecting " + + getDTypeAsString(torch::typeMetaToScalarType(inputs.dtype())) + + " and model is " + getDTypeAsString(torch_dtype)); + } + c10::InferenceMode guard(true); + auto out = module.forward({inputs}); + if (_is_DeltaUQ) { + return _computeDetlaUQ(out, policy, threshold); + } + + at::Tensor output_tensor = out.toTensor().set_requires_grad(false).detach(); + // Randomly select indices to set to True + torch::Tensor predicate = + torch::zeros({output_tensor.sizes()[0], 1}, torch::kBool); + auto indices = torch::randperm(output_tensor.sizes()[0]) + .slice(0, 0, threshold * output_tensor.sizes()[0]); + + // Set selected indices to True + predicate.index_put_({indices, 0}, true); + return std::make_tuple(std::move(output_tensor), std::move(predicate)); +} + + +std::tuple SurrogateModel::evaluate( + ams::MutableArrayRef Inputs, + AMSUQPolicy policy, + float threshold) +{ + if (Inputs.size() == 0) { + throw std::invalid_argument( + "Input Vector should always contain at least one tensor"); + } + torch::DeviceType InputDevice = Inputs[0].device().type(); + torch::Dtype InputDType = torch::typeMetaToScalarType(Inputs[0].dtype()); + auto CAxis = Inputs[0].sizes().size() - 1; + + // Verify input/device matching + for (auto& In : Inputs) { + if (InputDevice != In.device().type()) { + throw std::invalid_argument( + "Unsupported feature, application domain tensors are on different " + "devices\n"); + } + if (InputDType != torch::typeMetaToScalarType(In.dtype())) { + throw std::invalid_argument( + "Unsupported feature, application domain tensors have different data " + "types\n"); + } + } + + c10::SmallVector ConvertedInputs(Inputs.begin(), Inputs.end()); + // If either the model's execution device or the data type differ + // in respect to the inputs we need to handle this separately. + if (InputDevice != torch_device || InputDType != torch_dtype) { + for (int i = 0; i < ConvertedInputs.size(); i++) { + ConvertedInputs[i] = ConvertedInputs[i].to(torch_device, torch_dtype); + } + } + + auto ITensor = torch::cat(ConvertedInputs, CAxis); + auto [OTensor, Predicate] = _evaluate(ITensor, policy, threshold); + if (InputDevice != torch_device) { + OTensor = OTensor.to(InputDevice); + Predicate = Predicate.to(InputDevice); + } + return std::make_tuple(std::move(OTensor), std::move(Predicate)); +} + + +std::unordered_map> + SurrogateModel::instances; + +#if 0 +//#include + +//#include +//#include +//#include +//#include +//#include // One-stop header. +// #include + + +//struct C10_API AMSCPUAllocator final : at::Allocator { +// AMSCPUAllocator() = default; +// at::DataPtr allocate(size_t nbytes) const override +// { +// auto& rm = ams::ResourceManager::getInstance(); +// uint8_t* data = rm.allocate(nbytes, AMSResourceType::AMS_HOST); +// +// return {(void*)data, +// (void*)data, +// &ReportAndDelete, +// at::Device(at::DeviceType::CPU)}; +// } +// +// static void ReportAndDelete(void* ptr) +// { +// if (!ptr) { +// return; +// } +// auto& rm = ams::ResourceManager::getInstance(); +// rm.deallocate(ptr, AMSResourceType::AMS_HOST); +// } +// +// at::DeleterFnPtr raw_deleter() const override { return &ReportAndDelete; } +//}; +// +// +//AMSCPUAllocator ams_torch; +// +// +//void set_cpu_torch_allocator() +//{ +// SetAllocator(c10::DeviceType::CPU, &ams_torch, (uint8_t)(2 ^ 8 - 1)); +// SetCPUAllocator(&ams_torch, (uint8_t)(2 ^ 8 - 1)); +//} +// +// +#endif diff --git a/src/AMSlib/ml/surrogate.hpp b/src/AMSlib/ml/surrogate.hpp index 95c84c7a..dce56a9e 100644 --- a/src/AMSlib/ml/surrogate.hpp +++ b/src/AMSlib/ml/surrogate.hpp @@ -12,17 +12,17 @@ #include #include #include +#include #include #include "AMS.h" -#include "wf/device.hpp" +#include "util/ArrayRef.hpp" +//#include "wf/device.hpp" -#ifdef __ENABLE_TORCH__ #include #include #include #include // One-stop header. -#endif #include "wf/data_handler.hpp" #include "wf/debug.h" @@ -30,344 +30,40 @@ //! ---------------------------------------------------------------------------- //! An implementation for a surrogate model //! ---------------------------------------------------------------------------- -template class SurrogateModel { - static_assert(std::is_floating_point::value, - "SurrogateModel supports floating-point values (floats, " - "doubles, or long doubles) only!"); - - using data_handler = - ams::DataHandler; // utils to handle float data - private: - const std::string model_path; - AMSResourceType model_resource; + const std::string _model_path; + AMSResourceType model_device; + torch::DeviceType torch_device; + AMSDType model_dtype; + torch::Dtype torch_dtype; const bool _is_DeltaUQ; -#ifdef __ENABLE_TORCH__ // ------------------------------------------------------------------------- // variables to store the torch model // ------------------------------------------------------------------------- torch::jit::script::Module module; - c10::TensorOptions tensorOptions; - - - // ------------------------------------------------------------------------- - // conversion to and from torch - // ------------------------------------------------------------------------- - PERFFASPECT() - inline at::Tensor arrayToTensor(long numRows, - long numCols, - TypeInValue** array) - { - c10::SmallVector Tensors; - for (int i = 0; i < numCols; i++) { - Tensors.push_back(torch::from_blob((TypeInValue*)array[i], - {numRows, 1}, - tensorOptions)); - } - at::Tensor tensor = at::reshape(at::cat(Tensors, 1), {numRows, numCols}); - return tensor; - } - - PERFFASPECT() - inline at::Tensor arrayToTensor(long numRows, - long numCols, - const TypeInValue** array) - { - c10::SmallVector Tensors; - CALIPER(CALI_MARK_BEGIN("ARRAY_BLOB");) - for (int i = 0; i < numCols; i++) { - Tensors.push_back(torch::from_blob((TypeInValue*)array[i], - {numRows, 1}, - tensorOptions)); - } - CALIPER(CALI_MARK_END("ARRAY_BLOB");) - - CALIPER(CALI_MARK_BEGIN("ARRAY_RESHAPE");) - at::Tensor tensor = at::reshape(at::cat(Tensors, 1), {numRows, numCols}); - CALIPER(CALI_MARK_END("ARRAY_RESHAPE");) - return tensor; - } - - PERFFASPECT() - inline void tensorToArray(at::Tensor tensor, - long numRows, - long numCols, - TypeInValue** array) - { - // Transpose to get continuous memory and - // perform single memcpy. - auto& rm = ams::ResourceManager::getInstance(); - tensor = tensor.transpose(1, 0); - for (long j = 0; j < numCols; j++) { - auto tmp = tensor[j].contiguous(); - TypeInValue* ptr = tmp.data_ptr(); - rm.copy(ptr, model_resource, array[j], model_resource, numRows); - } - } - - // ------------------------------------------------------------------------- - // loading a surrogate model! - // ------------------------------------------------------------------------- - PERFFASPECT() - void _load_torch(const std::string& model_path, - c10::Device&& device, - at::ScalarType dType) - { - try { - module = torch::jit::load(model_path); - module.to(device); - module.to(dType); - tensorOptions = - torch::TensorOptions().dtype(dType).device(device).requires_grad( - false); - } catch (const c10::Error& e) { - FATAL("Error loding torch model:%s", model_path.c_str()) - } - } - - template ::value>* = nullptr> - PERFFASPECT() - inline void _load(const std::string& model_path, - const std::string& device_name) - { - DBG(Surrogate, "Using model at double precision: %s", model_path.c_str()); - _load_torch(model_path, torch::Device(device_name), torch::kFloat64); - } - - template ::value>* = nullptr> - PERFFASPECT() - inline void _load(const std::string& model_path, - const std::string& device_name) - { - DBG(Surrogate, "Using model at single precision: %s", model_path.c_str()); - _load_torch(model_path, torch::Device(device_name), torch::kFloat32); - } - - // ------------------------------------------------------------------------- - // compute delta uq predicates - // ------------------------------------------------------------------------- - void computeDeltaUQPredicates(AMSUQPolicy uq_policy, - const TypeInValue* __restrict__ outputs_stdev, - bool* __restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold) - { - auto computeDeltaUQMeanPredicatesHost = [&]() { - for (size_t i = 0; i < nrows; ++i) { - double mean = 0.0; - for (size_t j = 0; j < ncols; ++j) - mean += outputs_stdev[j + i * ncols]; - mean /= ncols; - - predicates[i] = (mean < threshold); - } - }; - - auto computeDeltaUQMaxPredicatesHost = [&]() { - for (size_t i = 0; i < nrows; ++i) { - predicates[i] = true; - for (size_t j = 0; j < ncols; ++j) - if (outputs_stdev[j + i * ncols] >= threshold) { - predicates[i] = false; - break; - } - } - }; - - if (uq_policy == AMSUQPolicy::AMS_DELTAUQ_MEAN) { - if (model_resource == AMSResourceType::AMS_DEVICE) { -#ifdef __ENABLE_CUDA__ - DBG(Surrogate, "Compute mean delta uq predicates on device\n"); - // TODO: use combined routine when it lands. - ams::Device::computeDeltaUQMeanPredicatesDevice( - outputs_stdev, predicates, nrows, ncols, threshold); -#else - THROW(std::runtime_error, - "Expected CUDA is enabled when model data are on DEVICE"); -#endif - } else { - DBG(Surrogate, "Compute mean delta uq predicates on host\n"); - computeDeltaUQMeanPredicatesHost(); - } - } else if (uq_policy == AMSUQPolicy::AMS_DELTAUQ_MAX) { - if (model_resource == AMSResourceType::AMS_DEVICE) { -#ifdef __ENABLE_CUDA__ - DBG(Surrogate, "Compute max delta uq predicates on device\n"); - // TODO: use combined routine when it lands. - ams::Device::computeDeltaUQMaxPredicatesDevice( - outputs_stdev, predicates, nrows, ncols, threshold); -#else - THROW(std::runtime_error, - "Expected CUDA is enabled when model data are on DEVICE"); -#endif - } else { - DBG(Surrogate, "Compute max delta uq predicates on host\n"); - computeDeltaUQMaxPredicatesHost(); - } - } else - THROW(std::runtime_error, - "Invalid uq_policy to compute delta uq predicates"); - } - - // ------------------------------------------------------------------------- - // evaluate a torch model - // ------------------------------------------------------------------------- - PERFFASPECT() - inline void _evaluate(long num_elements, - size_t num_in, - size_t num_out, - const TypeInValue** inputs, - TypeInValue** outputs, - AMSUQPolicy uq_policy, - bool* predicates, - double threshold) - { - //torch::NoGradGuard no_grad; - c10::InferenceMode guard(true); - CALIPER(CALI_MARK_BEGIN("ARRAY_TO_TENSOR");) - auto input = arrayToTensor(num_elements, num_in, inputs); - CALIPER(CALI_MARK_END("ARRAY_TO_TENSOR");) - - input.set_requires_grad(false); - if (_is_DeltaUQ) { - // The deltauq surrogate returns a tuple of (outputs, outputs_stdev) - CALIPER(CALI_MARK_BEGIN("SURROGATE-EVAL");) - auto output_tuple = module.forward({input}).toTuple(); - CALIPER(CALI_MARK_END("SURROGATE-EVAL");) - - at::Tensor output_mean_tensor = - output_tuple->elements()[0].toTensor().detach(); - at::Tensor output_stdev_tensor = - output_tuple->elements()[1].toTensor().detach().contiguous(); - CALIPER(CALI_MARK_BEGIN("TENSOR_TO_ARRAY");) - - computeDeltaUQPredicates(uq_policy, - output_stdev_tensor.data_ptr(), - predicates, - num_elements, - num_out, - threshold); - tensorToArray(output_mean_tensor, num_elements, num_out, outputs); - CALIPER(CALI_MARK_END("TENSOR_TO_ARRAY");) - } else { - CALIPER(CALI_MARK_BEGIN("SURROGATE-EVAL");) - at::Tensor output = module.forward({input}).toTensor().detach(); - CALIPER(CALI_MARK_END("SURROGATE-EVAL");) - - CALIPER(CALI_MARK_BEGIN("TENSOR_TO_ARRAY");) - tensorToArray(output, num_elements, num_out, outputs); - CALIPER(CALI_MARK_END("TENSOR_TO_ARRAY");) - } - - if (is_device()) { - ams::deviceCheckErrors(__FILE__, __LINE__); - } - - DBG(Surrogate, - "Evaluate surrogate model (%ld, %ld) -> (%ld, %ld)", - num_elements, - num_in, - num_elements, - num_out); - } - -#else - template - PERFFASPECT() - inline void _load(const std::string& model_path, - const std::string& device_name) - { - } - - PERFFASPECT() - inline void _evaluate(long num_elements, - long num_in, - size_t num_out, - const TypeInValue** inputs, - TypeInValue** outputs, - AMSUQPolicy uq_policy, - bool* predicates, - double threshold) - { - } - -#endif - - SurrogateModel(std::string& model_path, - AMSResourceType resource = AMSResourceType::AMS_HOST, - bool is_DeltaUQ = false) - : model_path(model_path), - model_resource(resource), - _is_DeltaUQ(is_DeltaUQ) - { - - std::experimental::filesystem::path Path(model_path); - std::error_code ec; - - if (!std::experimental::filesystem::exists(Path, ec)) { - FATAL(Surrogate, - "Path to Surrogate Model (%s) Does not exist", - model_path.c_str()) - } - - if (resource != AMSResourceType::AMS_DEVICE) - _load(model_path, "cpu"); - else - _load(model_path, "cuda"); - } protected: - template ::value>* = nullptr> - static bool same_type(bool is_double) - { - return !is_double; - } - - template ::value>* = nullptr> - static bool same_type(bool is_double) - { - return is_double; - } - - static std::unordered_map>> + static std::unordered_map> instances; + SurrogateModel(std::string& model_path, bool is_DeltaUQ = false); + public: // ------------------------------------------------------------------------- // public interface // ------------------------------------------------------------------------- - static std::shared_ptr> getInstance( - std::string& model_path, - AMSResourceType resource = AMSResourceType::AMS_HOST, - bool is_DeltaUQ = false) + static std::shared_ptr getInstance(std::string& model_path, + bool is_DeltaUQ = false) { - auto model = - SurrogateModel::instances.find(std::string(model_path)); + auto model = SurrogateModel::instances.find(std::string(model_path)); if (model != instances.end()) { // Model Found auto torch_model = model->second; - if (resource != torch_model->model_resource) - throw std::runtime_error( - "Currently we are not supporting loading the same model file on " - "different devices."); - - if (is_DeltaUQ != torch_model->is_DeltaUQ()) - THROW(std::runtime_error, "Loaded model instance is not DeltaUQ"); - - if (!same_type(torch_model->is_double())) - throw std::runtime_error( - "Requesting model loading of different data types."); DBG(Surrogate, "Returning existing model represented under (%s)", @@ -377,116 +73,76 @@ class SurrogateModel // Model does not exist. We need to create one DBG(Surrogate, "Generating new model under (%s)", model_path.c_str()); - std::shared_ptr> torch_model = - std::shared_ptr>( - new SurrogateModel(model_path, resource, is_DeltaUQ)); + std::shared_ptr torch_model = + std::shared_ptr( + new SurrogateModel(model_path, is_DeltaUQ)); instances.insert(std::make_pair(std::string(model_path), torch_model)); return torch_model; }; ~SurrogateModel() { - DBG(Surrogate, "Destroying surrogate model at %s", model_path.c_str()); + DBG(Surrogate, "Destroying surrogate model at %s", _model_path.c_str()); } + std::tuple _computeDetlaUQ( + c10::IValue& deltaUQTuple, + AMSUQPolicy policy, + float threshold); - PERFFASPECT() - inline void evaluate(long num_elements, - size_t num_in, - size_t num_out, - const TypeInValue** inputs, - TypeInValue** outputs, - AMSUQPolicy uq_policy = AMSUQPolicy::AMS_UQ_BEGIN, - bool* predicates = nullptr, - double threshold = 0.0) - { - _evaluate(num_elements, - num_in, - num_out, - inputs, - outputs, - uq_policy, - predicates, - threshold); - } + std::tuple _evaluate(torch::Tensor& inputs, + AMSUQPolicy policy, + float threshold); + + std::tuple evaluate( + ams::MutableArrayRef Inputs, + AMSUQPolicy policy, + float threshold); - PERFFASPECT() - inline void evaluate(long num_elements, - std::vector inputs, - std::vector outputs, - AMSUQPolicy uq_policy, - bool* predicates, - double threshold) - { - _evaluate(num_elements, - inputs.size(), - outputs.size(), - static_cast(inputs.data()), - static_cast(outputs.data()), - uq_policy, - predicates, - threshold); - } - PERFFASPECT() - inline void evaluate(long num_elements, - std::vector inputs, - std::vector outputs) + inline bool is_gpu() const { - _evaluate(num_elements, - inputs.size(), - outputs.size(), - static_cast(inputs.data()), - static_cast(outputs.data()), - AMSUQPolicy::AMS_UQ_BEGIN, - nullptr, - 0.0); + return model_device == AMSResourceType::AMS_DEVICE; } -#ifdef __ENABLE_TORCH__ - bool is_double() { return (tensorOptions.dtype() == torch::kFloat64); } -#else - bool is_double() + inline bool is_cpu() const { - if (typeid(TypeInValue) == typeid(double)) return true; - return false; + return model_device == AMSResourceType::AMS_HOST; } -#endif - - inline bool is_device() const + inline bool is_resource(AMSResourceType rType) const { -#ifdef __ENABLE_TORCH__ - return model_resource == AMSResourceType::AMS_DEVICE; -#else - return false; -#endif + return model_device == rType; } - bool is_DeltaUQ() { return _is_DeltaUQ; } + inline bool is_float() const { return model_dtype == AMS_SINGLE; } + inline bool is_double() const { return model_dtype == AMS_DOUBLE; } + inline bool is_type(AMSDType dType) const { return model_dtype == dType; } - void update(const std::string& new_path) - { - /* This function updates the underlying torch model, - * with a new one pointed at location modelPath. The previous - * one is destructed automatically. - * - * TODO: I decided to not update the model path on the ``instances'' - * map. As we currently expect this change will be agnostic to the application - * user. But, in any case we should keep track of which model has been used at which - * invocation. This is currently not done. - */ - if (model_resource != AMSResourceType::AMS_DEVICE) - _load(new_path, "cpu"); - else - _load(new_path, "cuda"); - } - AMSResourceType getModelResource() const { return model_resource; } + // + bool is_DeltaUQ() { return _is_DeltaUQ; } + // + // void update(const std::string& new_path) + // { + // /* This function updates the underlying torch model, + // * with a new one pointed at location modelPath. The previous + // * one is destructed automatically. + // * + // * TODO: I decided to not update the model path on the ``instances'' + // * map. As we currently expect this change will be agnostic to the application + // * user. But, in any case we should keep track of which model has been used at which + // * invocation. This is currently not done. + // */ + // //if (model_device != AMSResourceType::AMS_DEVICE) + // // _load(new_path, "cpu"); + // //else + // // _load(new_path, "cuda"); + // } + + // AMSResourceType getModelResource() const { return model_device; } + std::tuple getModelResourceType(); + std::tuple getModelDataType(); }; -template -std::unordered_map>> - SurrogateModel::instances; - #endif diff --git a/tests/AMSlib/torch/CMakeLists.txt b/tests/AMSlib/torch/CMakeLists.txt new file mode 100644 index 00000000..a37d58d3 --- /dev/null +++ b/tests/AMSlib/torch/CMakeLists.txt @@ -0,0 +1,168 @@ + +function(ADD_TORCH_UNIT_TEST name exec) + add_test(NAME ${name} COMMAND ${exec} ${ARGN}) + set_tests_properties(${name} PROPERTIES LABELS TORCH_UNIT_TEST) +endfunction() + + +function(BUILD_UNIT_TEST exe source) + add_executable(${exe} ${source}) + add_dependencies(${exe} generate_cpu_models) + + if (ENABLE_CUDA) + add_dependencies(${exe} generate_gpu_models) + endif() + + target_include_directories(${exe} PRIVATE ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) + target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) + target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) + target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) + target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs) + + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) + + if(WITH_CUDA) + set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") + set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) + set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) + + target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") + endif() +endfunction() + +# Output files for generated models (example: .pt files) +set(GENERATED_CPU_MODELS + ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt +) + +# Custom command to generate models +add_custom_command( + OUTPUT ${GENERATED_CPU_MODELS} + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate.sh ${CMAKE_CURRENT_BINARY_DIR}/models/ "cpu" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generate.sh;${CMAKE_CURRENT_SOURCE_DIR}/generate.py" + COMMENT "Generating PyTorch models..." +) + +# Define a target to generate models +add_custom_target(generate_cpu_models ALL + DEPENDS ${GENERATED_CPU_MODELS} + COMMENT "Generate cpu models before ctests..." +) + +if (ENABLE_CUDA) +set(GENERATED_GPU_MODELS + ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt +) + +# Custom command to generate models +add_custom_command( + OUTPUT ${GENERATED_GPU_MODELS} + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate.sh ${CMAKE_CURRENT_BINARY_DIR}/models/ "gpu" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generate.sh;${CMAKE_CURRENT_SOURCE_DIR}/generate.py" + COMMENT "Generating PyTorch models..." +) + +# Define a target to generate models +add_custom_target(generate_gpu_models ALL + DEPENDS ${GENERATED_GPU_MODELS} + COMMENT "Generate gpu models before ctests..." +) +endif() + + + + +BUILD_UNIT_TEST(ams_verify_dtype "verify_dtype.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/ml/surrogate.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/logger.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/debug.cpp") +BUILD_UNIT_TEST(ams_verify_device "verify_device.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/ml/surrogate.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/logger.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/debug.cpp") +BUILD_UNIT_TEST(ams_evaluate_model "evaluate_model.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/ml/surrogate.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/logger.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/debug.cpp") +BUILD_UNIT_TEST(ams_convert_and_evaluate_model "evalute_model_conversions.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/ml/surrogate.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/logger.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/debug.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/util/SmallVector.cpp;") + +#detect datatype +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Random ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Duq_mean ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Duq_max ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt) + +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Single::Random ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Single::Duq_mean ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Single::Duq_max ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt) + +#detect device +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Double::Random ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Double::Duq_mean ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Double::Duq_max ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt) + +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Single::Random ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Single::Duq_mean ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Single::Duq_max ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt) + + +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::Random::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::Random::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt "random") + +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMean::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMean::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt "duq_mean") + +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMax::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMax::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt "duq_max") + +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::Random::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::Random::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt "random") + +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMean::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMean::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt "duq_mean") + +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMax::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMax::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt "duq_max") + +if(ENABLE_CUDA) + +#detect datatype +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Random ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Duq_mean ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Duq_max ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt) + +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Single::Random ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Single::Duq_mean ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Single::Duq_max ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt) + +#detect device +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Double::Random ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Double::Duq_mean ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Double::Duq_max ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt) + +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Single::Random ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Single::Duq_mean ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Single::Duq_max ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt) + + +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::Random::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::Random::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt "random") + +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMean::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMean::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt "duq_mean") + +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMax::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMax::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt "duq_max") + +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::Random::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::Random::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt "random") + +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMean::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMean::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt "duq_mean") + +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMax::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMax::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt "duq_max") + +endif() + + diff --git a/tests/AMSlib/torch/evaluate_model.cpp b/tests/AMSlib/torch/evaluate_model.cpp new file mode 100644 index 00000000..716c7e11 --- /dev/null +++ b/tests/AMSlib/torch/evaluate_model.cpp @@ -0,0 +1,98 @@ +#include + +#include +#include +#include + +#include "ml/surrogate.hpp" + +std::vector getDims(const std::string input, char delimiter) +{ + std::vector tokens; + std::stringstream ss(input); + std::string token; + + while (std::getline(ss, token, delimiter)) { + tokens.push_back(std::stoi(token)); + } + + return tokens; +} + + +bool verify(torch::Tensor& input, + torch::Tensor& output, + torch::Tensor& predicate, + float threshold) +{ + if (!torch::equal(input, output)) + throw std::runtime_error("Tensors are not identical"); + + torch::Tensor float_tensor = predicate.to(torch::kDouble); + // Calculate the probability (mean of the tensor) + double probability = float_tensor.mean().item(); + std::cout << "probability is " << probability << "\n"; + if (probability != threshold) + throw std::runtime_error( + "Expecing a probability of 0.0 in the case of threshold <0>"); + return true; +} + +void test(SurrogateModel& model, + std::vector& iDims, + std::vector& oDims, + AMSUQPolicy policy) +{ + auto model_type = model.getModelDataType(); + auto model_device = model.getModelResourceType(); + torch::Tensor input = torch::rand(iDims, + torch::TensorOptions() + .dtype(std::get<1>(model_type)) + .device(std::get<1>(model_device))); + { + std::cout << "Staring Test-1 with random-uq and threshold of 0.0\n"; + auto [out, predicate] = model._evaluate(input, policy, 0.0); + verify(input, out, predicate, 0.0); + std::cout << "SUCCESS\n"; + } + { + std::cout << "Staring Test-2 with random-uq and threshold of 0.5\n"; + auto [out, predicate] = model._evaluate(input, policy, 0.5); + verify(input, out, predicate, 0.5); + std::cout << "SUCCESS\n"; + } + { + std::cout << "Staring Test-3 with random-uq and threshold of 1.0\n"; + auto [out, predicate] = model._evaluate(input, policy, 1.0); + verify(input, out, predicate, 1.0); + std::cout << "SUCCESS\n"; + } +} + +int main(int argc, char* argv[]) +{ + if (argc != 5) { + std::cerr << "Wrong command line, expecting , " + " (1024, 2, " + "6) \n"; + return -1; + } + + std::vector iShape(getDims(argv[1], ',')); + std::vector oShape(getDims(argv[2], ',')); + std::string model_path(argv[3]); + std::string uq(argv[4]); + bool isDeltaUQ = true; + if (uq.compare("random") == 0) isDeltaUQ = false; + auto model = SurrogateModel::getInstance(model_path, isDeltaUQ); + if (std::string(argv[4]).compare("duq_mean") == 0) { + test(*model, iShape, oShape, AMSUQPolicy::AMS_DELTAUQ_MEAN); + } else if (std::string(argv[4]).compare("duq_max") == 0) { + test(*model, iShape, oShape, AMSUQPolicy::AMS_DELTAUQ_MAX); + } else if (std::string(argv[4]).compare("random") == 0) { + test(*model, iShape, oShape, AMSUQPolicy::AMS_RANDOM); + } else { + std::cout << "Unknown dUQ \n"; + return 1; + } +} diff --git a/tests/AMSlib/torch/evalute_model_conversions.cpp b/tests/AMSlib/torch/evalute_model_conversions.cpp new file mode 100644 index 00000000..f76551ae --- /dev/null +++ b/tests/AMSlib/torch/evalute_model_conversions.cpp @@ -0,0 +1,228 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "ml/surrogate.hpp" + +void printTensorShape(const torch::Tensor& tensor) +{ + std::cout << "Tensor shape: ["; + for (size_t i = 0; i < tensor.sizes().size(); ++i) { + std::cout << tensor.size(i); + if (i != tensor.sizes().size() - 1) { + std::cout << ", "; + } + } + std::cout << "]" << std::endl; +} + +// Helper function to convert torch::Dtype to a string +std::string dtypeToString(torch::Dtype dtype) +{ + static const std::unordered_map dtypeMap = { + {torch::kFloat32, "float32"}, + {torch::kFloat, "float32"}, // Alias for float32 + {torch::kFloat64, "float64"}, + {torch::kDouble, "float64"}, // Alias for float64 + {torch::kInt32, "int32"}, + {torch::kInt64, "int64"}, + {torch::kBool, "bool"}, + {torch::kUInt8, "uint8"}, + {torch::kInt8, "int8"}, + {torch::kHalf, "float16"}, + {torch::kBFloat16, "bfloat16"}}; + return dtypeMap.count(dtype) ? dtypeMap.at(dtype) : "unknown dtype"; +} + +// Helper function to convert c10::DeviceType to a string +std::string deviceTypeToString(c10::DeviceType deviceType) +{ + static const std::unordered_map deviceMap = { + {c10::DeviceType::CPU, "CPU"}, + {c10::DeviceType::CUDA, "CUDA"}, + {c10::DeviceType::HIP, "HIP"}, + {c10::DeviceType::FPGA, "FPGA"}, + {c10::DeviceType::XLA, "XLA"}, + {c10::DeviceType::Meta, "Meta"}, + {c10::DeviceType::ORT, "ORT"}}; + return deviceMap.count(deviceType) ? deviceMap.at(deviceType) + : "unknown device"; +} + +std::vector getDims(const std::string input, char delimiter) +{ + std::vector tokens; + std::stringstream ss(input); + std::string token; + + while (std::getline(ss, token, delimiter)) { + tokens.push_back(std::stoi(token)); + } + + return tokens; +} + +std::vector generateRandomVector(int target_sum, int size) +{ + if (target_sum < size) { + throw std::invalid_argument( + "Target sum must be at least equal to the size of the vector."); + } + + std::vector result( + size, 1); // Start with each element as 1 (minimum positive integer). + target_sum -= + size; // Reduce the remaining sum by the size (since all elements are 1). + + std::random_device rd; + std::mt19937 gen(0); + std::uniform_int_distribution<> dis(0, target_sum); + + // Generate random values and distribute the remaining sum + for (int i = 0; i < target_sum; ++i) { + int index = dis(gen) % size; // Pick a random index + ++result[index]; // Increment the value at the chosen index + } + + // Shuffle the vector for more randomness + std::shuffle(result.begin(), result.end(), gen); + + return result; +} + + +bool verify(torch::Tensor& input, + torch::Tensor& output, + torch::Tensor& predicate, + float threshold, + torch::Dtype model_dtype) +{ + + // our current 'interface' always return the dtype of the model. + if (output.dtype() != model_dtype) { + throw ::std::runtime_error( + "Tensors should have the data type of the model"); + } + + if (input.dtype() != output.dtype()) { + output = output.to(input.dtype()); + } + + bool close = torch::allclose(input, output, 1e-5, 1e-8); + + if (!close) throw std::runtime_error("Tensors are not identical"); + + torch::Tensor float_tensor = predicate.to(torch::kDouble); + // Calculate the probability (mean of the tensor) + double probability = float_tensor.mean().item(); + std::cout << "probability is " << probability << "\n"; + if (probability != threshold) + throw std::runtime_error( + "Expecing a probability of 0.0 in the case of threshold <0>"); + return true; +} + +void test(SurrogateModel& model, + std::vector& iDims, + std::vector& oDims, + AMSUQPolicy policy) +{ + auto model_type = model.getModelDataType(); + auto model_device = model.getModelResourceType(); + std::vector SupportedDTypes = {torch::kFloat32, + torch::kFloat64}; + auto inputShapes = generateRandomVector(iDims[iDims.size() - 1], 3); + std::vector SupportedDevices = {c10::DeviceType::CPU}; + if (torch::cuda::is_available() && torch::cuda::device_count() > 0) { + SupportedDevices.push_back(c10::DeviceType::CUDA); + } + + for (auto type : SupportedDTypes) { + for (auto device : SupportedDevices) { + ams::SmallVector inputs; + for (auto outer : inputShapes) { + std::vector partialShape(iDims.begin(), iDims.end()); + partialShape[partialShape.size() - 1] = outer; + auto inp = + torch::rand(partialShape, + torch::TensorOptions().dtype(type).device(device)); + printTensorShape(inp); + inputs.push_back(inp); + } + + std::cout << "Testing with input tensor type: " << dtypeToString(type) + << " on device: " << deviceTypeToString(device) << "\n"; + + std::cout << "Testing with model parameter types : " + << dtypeToString(std::get<1>(model_type)) << " on device: " + << deviceTypeToString(std::get<1>(model_device)) << "\n"; + + + { + std::cout << "Staring Test-1 with random-uq and threshold of 0.0\n"; + auto [out, predicate] = model.evaluate(inputs, policy, 0.0); + c10::SmallVector data(inputs.begin(), inputs.end()); + auto input = torch::cat(data, iDims.size() - 1); + std::cout << "Output of model is of type " + << dtypeToString((torch::typeMetaToScalarType(out.dtype()))) + << "\n"; + std::cout << "Input of model is of type " + << dtypeToString( + (torch::typeMetaToScalarType(inputs[0].dtype()))) + << "\n"; + verify(input, out, predicate, 0.0, std::get<1>(model_type)); + std::cout << "SUCCESS\n"; + } + { + std::cout << "Staring Test-2 with random-uq and threshold of 0.5\n"; + auto [out, predicate] = model.evaluate(inputs, policy, 0.5); + c10::SmallVector data(inputs.begin(), inputs.end()); + auto input = torch::cat(data, iDims.size() - 1); + verify(input, out, predicate, 0.5, std::get<1>(model_type)); + std::cout << "SUCCESS\n"; + } + { + std::cout << "Staring Test-3 with random-uq and threshold of 1.0\n"; + auto [out, predicate] = model.evaluate(inputs, policy, 1.0); + c10::SmallVector data(inputs.begin(), inputs.end()); + auto input = torch::cat(data, iDims.size() - 1); + verify(input, out, predicate, 1.0, std::get<1>(model_type)); + std::cout << "SUCCESS\n"; + } + } + } +} + +int main(int argc, char* argv[]) +{ + if (argc != 5) { + std::cerr << "Wrong command line, expecting , " + " (1024, 2, " + "6) \n"; + return -1; + } + + std::vector iShape(getDims(argv[1], ',')); + std::vector oShape(getDims(argv[2], ',')); + std::string model_path(argv[3]); + std::string uq(argv[4]); + bool isDeltaUQ = true; + if (uq.compare("random") == 0) isDeltaUQ = false; + auto model = SurrogateModel::getInstance(model_path, isDeltaUQ); + if (std::string(argv[4]).compare("duq_mean") == 0) { + test(*model, iShape, oShape, AMSUQPolicy::AMS_DELTAUQ_MEAN); + } else if (std::string(argv[4]).compare("duq_max") == 0) { + test(*model, iShape, oShape, AMSUQPolicy::AMS_DELTAUQ_MAX); + } else if (std::string(argv[4]).compare("random") == 0) { + test(*model, iShape, oShape, AMSUQPolicy::AMS_RANDOM); + } else { + std::cout << "Unknown dUQ \n"; + return 1; + } +} diff --git a/tests/AMSlib/torch/generate.py b/tests/AMSlib/torch/generate.py new file mode 100644 index 00000000..58ea9c24 --- /dev/null +++ b/tests/AMSlib/torch/generate.py @@ -0,0 +1,127 @@ +import torch +import sys +import torch.nn as nn +import argparse +from torch import Tensor +from typing import Tuple + + +# Ugly code that expands the fake_uq to the shape we need as an output +def to_tupple(y: Tensor, fake_uq: Tensor) -> Tuple[Tensor, Tensor]: + outer_dim = y.shape[0] + fake_uq_dim = fake_uq.shape[0] + tmp = fake_uq.clone().detach() + additional_dims = torch.div(outer_dim, fake_uq_dim, rounding_mode="floor") + outer_dim % fake_uq_dim + final_shape = (additional_dims * fake_uq_dim, *fake_uq.shape[1:]) + tmp = tmp.unsqueeze(0) + my_list = [1] * len(fake_uq.shape) + new_dims = (additional_dims, *my_list) + tmp = tmp.repeat(new_dims) + tmp = tmp.reshape(final_shape) + std = tmp[: y.shape[0], ...] + return y, std + + +class TuppleModel(torch.nn.Module): + def __init__(self, inputSize, outputSize, fake_uq): + super(TuppleModel, self).__init__() + self.linear = torch.nn.Linear(inputSize, outputSize, False) + self.fake_uq = torch.nn.Parameter(fake_uq, requires_grad=False) + self.initialize_weights() + + def initialize_weights(self): + # Check if in_features == out_features for identity initialization + if self.linear.weight.shape[0] == self.linear.weight.shape[1]: + nn.init.eye_(self.linear.weight) # Initialize with identity matrix + else: + raise ValueError("Identity initialization requires in_features == out_features") + + def forward(self, x): + y = self.linear(x) + return to_tupple(y, self.fake_uq) + + +# Define a simple model +class SimpleModel(nn.Module): + def __init__(self, in_features, out_features): + super(SimpleModel, self).__init__() + self.fc = nn.Linear(in_features, out_features, False) + self.initialize_weights() + + def initialize_weights(self): + # Check if in_features == out_features for identity initialization + if self.fc.weight.shape[0] == self.fc.weight.shape[1]: + nn.init.eye_(self.fc.weight) # Initialize with identity matrix + else: + raise ValueError("Identity initialization requires in_features == out_features") + + def forward(self, x): + return self.fc(x) + + +def main(): + # Parse command-line arguments + parser = argparse.ArgumentParser(description="Generate and save a scripted model.") + parser.add_argument("precision", choices=["single", "double"], help="Model precision: 'single' or 'double'.") + parser.add_argument("device", choices=["cpu", "gpu"], help="Device: 'cpu' or 'gpu'.") + parser.add_argument("directory", type=str, help="Directory to save the model.") + parser.add_argument("uq", choices=["random", "duq_mean", "duq_max"], help="The UQ Type to use") + args = parser.parse_args() + + # Initialize model + if args.uq == "duq_mean": + fake_uq = torch.rand(2, 8) + # This sets odd uq to less than 0.5 + fake_uq[0, ...] *= 0.5 + # This sets even uq to larger than 0.5 + fake_uq[1, ...] = 0.5 + 0.5 * (fake_uq[1, ...]) + model = TuppleModel(8, 8, fake_uq) + elif args.uq == "duq_max": + fake_uq = torch.rand(2, 8) + max_val = torch.max(fake_uq, axis=1).values + scale = 0.49 / max_val + fake_uq *= scale.unsqueeze(0).T + fake_uq[0, 2] = 0.51 + model = TuppleModel(8, 8, fake_uq) + elif args.uq == "random": + model = SimpleModel(8, 8) + else: + sys.exit(-1) + print("I am missing valid uq method") + + # Set the precision based on command-line argument + if args.precision == "single": + model = model.float() # Set to single precision (float32) + prec = torch.float32 + elif args.precision == "double": + model = model.double() # Set to double precision (float64) + prec = torch.float64 + + # Set the device based on command-line argument + if args.device == "gpu" and torch.cuda.is_available(): + device = torch.device("cuda") + else: + device = torch.device("cpu") + + # Move model to the appropriate device + model.to(device) + + # Create example input tensor + example_input = torch.randn(2, 8, device=device, dtype=prec) + + # Trace the model + scripted_model = torch.jit.trace(model, example_input) + + # Generate the file name + file_name = f"{args.precision}_{args.device}_{args.uq}.pt" + file_path = f"{args.directory}/{file_name}" + + # Save the scripted model + scripted_model.save(file_path) + + print(f"Model saved to {file_path}") + + +if __name__ == "__main__": + main() + sys.exit(0) diff --git a/tests/AMSlib/torch/generate.sh b/tests/AMSlib/torch/generate.sh new file mode 100755 index 00000000..0d4b03d0 --- /dev/null +++ b/tests/AMSlib/torch/generate.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +if [[ $# -ne 2 ]]; then + echo "Expecting at least 2 CLI argument" + echo "$0 cpu|gpu" + exit +fi + +directory=$1 +device=$2 +root_dir=$(dirname $0) + +mkdir -p $directory +echo $device + +python ${root_dir}/generate.py single $device ${directory} duq_mean +python ${root_dir}/generate.py single $device ${directory} duq_max +python ${root_dir}/generate.py single $device ${directory} random + +python ${root_dir}/generate.py double $device ${directory} duq_mean +python ${root_dir}/generate.py double $device ${directory} duq_max +python ${root_dir}/generate.py double $device ${directory} random + + diff --git a/tests/AMSlib/torch/verify_device.cpp b/tests/AMSlib/torch/verify_device.cpp new file mode 100644 index 00000000..6e2e5f7c --- /dev/null +++ b/tests/AMSlib/torch/verify_device.cpp @@ -0,0 +1,33 @@ +#include +#include + +#include "ml/surrogate.hpp" + + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + std::cerr << "Wrong command line, expecting " + "\n"; + return -1; + } + std::string device(argv[1]); + std::string model_path(argv[2]); + std::cout << "Opening model under " << model_path; + std::cout << " on device " << device << "\n"; + + auto model = SurrogateModel::getInstance(model_path); + if (device.compare("gpu") == 0 && model->is_gpu()) { + std::cout << "SUCCESS: " << "Model will execute on device\n"; + return 0; + } + if (device.compare("cpu") == 0 && model->is_cpu()) { + std::cout << "SUCCESS: " << "Model will execute on host\n"; + return 0; + } + + if (device.compare("cpu") != 0 && device.compare("gpu") != 0) + std::cout << "AMS Surrogate does not support " << device + << " as a execution device\n"; + return 1; +} diff --git a/tests/AMSlib/torch/verify_dtype.cpp b/tests/AMSlib/torch/verify_dtype.cpp new file mode 100644 index 00000000..22062eb5 --- /dev/null +++ b/tests/AMSlib/torch/verify_dtype.cpp @@ -0,0 +1,26 @@ +#include +#include + +#include "ml/surrogate.hpp" + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + std::cerr << "Wrong command line, expecting \n"; + return -1; + } + std::string precision(argv[1]); + std::string model_path(argv[2]); + std::cout << "Opening model under " << model_path; + std::cout << " with precision " << precision << "\n"; + auto model = SurrogateModel::getInstance(model_path); + if (precision.compare("single") == 0 && model->is_float()) return 0; + if (precision.compare("double") == 0 && model->is_double()) return 0; + + if (precision.compare("single") != 0 && precision.compare("double") != 0) { + std::cout << "AMS Surrogate does not support " << precision + << " as a dataype\n"; + } + return 1; +} From 8452bcbe2d11fc9c82a372ed2d45fdf07a198778 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 12 Dec 2024 07:00:03 -0800 Subject: [PATCH 008/136] Updated basedb-hdf5 --- src/AMSlib/wf/basedb.hpp | 406 ++------------------ src/AMSlib/wf/hdf5db.cpp | 379 +++++++++++-------- tests/AMSlib/CMakeLists.txt | 601 +++++++++++++++--------------- tests/AMSlib/db/CMakeLists.txt | 32 ++ tests/AMSlib/db/hdf5_open.cpp | 124 ++++++ tests/AMSlib/db/hdf5_store.cpp | 223 +++++++++++ tests/AMSlib/torch/CMakeLists.txt | 10 +- 7 files changed, 943 insertions(+), 832 deletions(-) create mode 100644 tests/AMSlib/db/CMakeLists.txt create mode 100644 tests/AMSlib/db/hdf5_open.cpp create mode 100644 tests/AMSlib/db/hdf5_store.cpp diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index 5ad149ca..e93c3a69 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -8,6 +8,9 @@ #ifndef __AMS_BASE_DB__ #define __AMS_BASE_DB__ +#include +#include + #include #include #include @@ -22,19 +25,13 @@ #include "AMS.h" #include "debug.h" +#include "util/ArrayRef.hpp" #include "wf/debug.h" #include "wf/resource_manager.hpp" #include "wf/utils.hpp" namespace fs = std::experimental::filesystem; -#ifdef __ENABLE_REDIS__ -#include - -#include -#warning Redis is currently not supported/tested -#endif - #ifdef __ENABLE_HDF5__ #include #include @@ -114,8 +111,7 @@ class BaseDB virtual AMSDBType dbType() = 0; /** - * @brief Takes an input and an output vector each holding 1-D vectors data, and - * store. them in persistent data storage. + * @brief Takes an input and an output Tensor. * @param[in] num_elements Number of elements of each 1-D vector * @param[in] inputs Vector of 1-D vectors containing the inputs to be stored * @param[in] inputs Vector of 1-D vectors, each 1-D vectors contains @@ -124,16 +120,8 @@ class BaseDB * 'num_elements' values to be stored */ - virtual void store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate = nullptr) = 0; - + virtual void store(const at::Tensor& inputs, const at::Tensor& outputs) = 0; - virtual void store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate = nullptr) = 0; uint64_t getId() const { return id; } @@ -142,8 +130,6 @@ class BaseDB virtual bool updateModel() { return false; } virtual std::string getLatestModel() { return {}; } - - virtual bool storePredicate() const { return false; } }; /** @@ -210,134 +196,8 @@ class FileDB : public BaseDB this->fn = fs::absolute(Path).string(); DBG(DB, "File System DB writes to file %s", this->fn.c_str()) } -}; - - -class csvDB final : public FileDB -{ -private: - /** @brief file descriptor */ - bool writeHeader; - std::fstream fd; - - PERFFASPECT() - template - void _store(size_t num_elements, - std::vector& inputs, - std::vector& outputs) - { - DBG(DB, - "DB of type %s stores %ld elements of input/output dimensions (%lu, " - "%lu)", - type().c_str(), - num_elements, - inputs.size(), - outputs.size()) - - CALIPER(CALI_MARK_BEGIN("STORE_CSV");) - const size_t num_in = inputs.size(); - const size_t num_out = outputs.size(); - - if (writeHeader) { - for (size_t i = 0; i < num_in; i++) - fd << "input_" << i << ":"; - for (size_t i = 0; i < num_out - 1; i++) - fd << "output_" << i << ":"; - fd << "output_" << num_out - 1 << "\n"; - writeHeader = false; - } - - for (size_t i = 0; i < num_elements; i++) { - for (size_t j = 0; j < num_in; j++) { - fd << inputs[j][i] << ":"; - } - - for (size_t j = 0; j < num_out - 1; j++) { - fd << outputs[j][i] << ":"; - } - fd << outputs[num_out - 1][i] << "\n"; - } - CALIPER(CALI_MARK_END("STORE_CSV");) - } - - -public: - csvDB(const csvDB&) = delete; - csvDB& operator=(const csvDB&) = delete; - - /** - * @brief constructs the class and opens the file to write to - * @param[in] fn Name of the file to store data to - * @param[in] rId a unique Id for each process taking part in a distributed - * execution (rank-id) - */ - csvDB(std::string path, std::string fn, uint64_t rId) - : FileDB(path, fn, ".csv", rId) - { - writeHeader = !fs::exists(this->fn); - fd.open(this->fn, std::ios_base::app | std::ios_base::out); - if (!fd.is_open()) { - std::cerr << "Cannot open db file: " << this->fn << std::endl; - } - DBG(DB, "DB Type: %s", type().c_str()) - } - - /** - * @brief deconstructs the class and closes the file - */ - ~csvDB() - { - DBG(DB, "Closing File: %s %s", type().c_str(), this->fn.c_str()) - fd.close(); - } - - virtual void store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate = nullptr) override - { - CFATAL(CSV, - predicate != nullptr, - "CSV database does not support storing uq-predicates") - - _store(num_elements, inputs, outputs); - } - - virtual void store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate = nullptr) override - { - - CFATAL(CSV, - predicate != nullptr, - "CSV database does not support storing uq-predicates") - - _store(num_elements, inputs, outputs); - } - - - /** - * @brief Define the type of the DB (File, Redis etc) - */ - std::string type() override { return "csv"; } - - /** - * @brief Return the DB enumerationt type (File, Redis etc) - */ - AMSDBType dbType() override { return AMSDBType::AMS_CSV; }; - /** - * @brief Takes an input and an output vector each holding 1-D vectors data, and - * store them into a csv file delimited by ':'. This should never be used for - * large scale simulations as txt/csv format will be extremely slow. - * @param[in] num_elements Number of elements of each 1-D vector - * @param[in] inputs Vector of 1-D vectors containing the inputs to bestored - * @param[in] inputs Vector of 1-D vectors, each 1-D vectors contains - * 'num_elements' values to be stored - * @param[in] outputs Vector of 1-D vectors, each 1-D vectors contains - * 'num_elements' values to be stored - */ + std::string getFilename() const { return fn; } }; @@ -347,25 +207,18 @@ class hdf5DB final : public FileDB private: /** @brief file descriptor */ hid_t HFile; - /** @brief vector holding the hdf5 dataset descriptor. - * We currently store every input on a separate dataset + /** @brief The hdf5 dataset descriptor for input data. */ - std::vector HDIsets; + hid_t HDIset; - /** @brief vector holding the hdf5 dataset descriptor. - * We currently store every output on a separate dataset + /** @brief the hdf5 dataset descriptor for output data. */ - std::vector HDOsets; - - /** @brief Total number of elements we have in our file */ - hsize_t totalElements; + hid_t HDOset; hid_t HDType; - /** @brief the dataset descriptor of the predicates */ - hid_t pSet; - - const bool predicateStore; + ams::SmallVector currentInputShape; + ams::SmallVector currentOutputShape; /** @brief create or get existing hdf5 dataset with the provided name * storing data as Ckunked pieces. The Chunk value controls the chunking @@ -378,6 +231,8 @@ class hdf5DB final : public FileDB */ hid_t getDataSet(hid_t group, std::string dName, + ams::SmallVector& currentShape, + const at::IntArrayRef Shape, hid_t dataType, const size_t Chunk = 1024L); @@ -389,9 +244,8 @@ class hdf5DB final : public FileDB * @param[in] numIn number of input 1-D vectors * @param[in] numOut number of output 1-D vectors */ - void createDataSets(size_t numElements, - const size_t numIn, - const size_t numOut); + void createDataSets(const at::IntArrayRef InShapes, + const at::IntArrayRef OutShapes); /** * @brief Write all the data in the vectors in the respective datasets. @@ -401,25 +255,13 @@ class hdf5DB final : public FileDB * to be written in the db. * @param[in] numElements The number of elements each vector has */ - template - void writeDataToDataset(std::vector& dsets, - std::vector& data, - size_t numElements); - /** @brief Writes a single 1-D vector to the dataset - * @param[in] dSet the dataset to write the data to - * @param[in] data the data we need to write - * @param[in] elements the number of data elements we have - * @param[in] datatype of elements we will write - */ - void writeVecToDataset(hid_t dSet, void* data, size_t elements, hid_t DType); + void writeDataToDataset(ams::MutableArrayRef currentShape, + hid_t& dset, + const at::Tensor& tensor_data); PERFFASPECT() - template - void _store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate = nullptr); + void _store(const at::Tensor& inputs, const at::Tensor& outputs); public: // Delete copy constructors. We do not want to copy the DB around @@ -456,209 +298,19 @@ class hdf5DB final : public FileDB /** - * @brief Takes an input and an output vector each holding 1-D vectors data, - * and store them into a hdf5 file delimited by ':'. This should never be used - * for large scale simulations as txt/hdf5 format will be extremely slow. - * @param[in] num_elements Number of elements of each 1-D vector - * @param[in] inputs Vector of 1-D vectors containing the inputs to bestored - * @param[in] inputs Vector of 1-D vectors, each 1-D vectors contains - * 'num_elements' values to be stored - * @param[in] outputs Vector of 1-D vectors, each 1-D vectors contains - * 'num_elements' values to be stored - */ - void store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate = nullptr) override; - - - /** - * @brief Takes an input and an output vector each holding 1-D vectors data, - * and store them into a hdf5 file delimited by ':'. This should never be used - * for large scale simulations as txt/hdf5 format will be extremely slow. - * @param[in] num_elements Number of elements of each 1-D vector - * @param[in] inputs Vector of 1-D vectors containing the inputs to bestored - * @param[in] inputs Vector of 1-D vectors, each 1-D vectors contains - * 'num_elements' values to be stored - * @param[in] outputs Vector of 1-D vectors, each 1-D vectors contains - * 'num_elements' values to be stored - */ - void store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate = nullptr) override; - - /** - * @brief Returns whether the DB can also store predicate information for debug - * purposes + * @brief Takes an input and an output tensor each holding data, + * and stores them into a hdf5 file. + * @param[in] inputs Tensor containing the inputs to bestored + * @param[in] outputs Tensor containing the outputs to bestored */ - bool storePredicate() const override { return predicateStore; } + void store(const at::Tensor& inputs, const at::Tensor& outputs) override; }; -#endif - - -#ifdef __ENABLE_REDIS__ -template -class RedisDB : public BaseDB -{ - const std::string _fn; // path to the file storing the DB access config - uint64_t _dbid; - sw::redis::Redis* _redis; - uint64_t keyId; - -public: - RedisDB(const RedisDB&) = delete; - RedisDB& operator=(const RedisDB&) = delete; - - /** - * @brief constructs the class and opens the file to write to - * @param[in] fn Name of the file to store data to - * @param[in] rId a unique Id for each process taking part in a distributed - * execution (rank-id) - */ - RedisDB(std::string fn, uint64_t rId) - : BaseDB(rId), _fn(fn), _redis(nullptr), keyId(0) - { - _dbid = reinterpret_cast(this); - auto connection_info = read_json(fn); - - sw::redis::ConnectionOptions connection_options; - connection_options.type = sw::redis::ConnectionType::TCP; - connection_options.host = connection_info["host"]; - connection_options.port = std::stoi(connection_info["service-port"]); - connection_options.password = connection_info["database-password"]; - connection_options.db = 0; // Optionnal, 0 is the default - connection_options.tls.enabled = - true; // Required to connect to PDS within LC - connection_options.tls.cacert = connection_info["cert"]; - - sw::redis::ConnectionPoolOptions pool_options; - pool_options.size = 100; // Pool size, i.e. max number of connections. - - _redis = new sw::redis::Redis(connection_options, pool_options); - } - - ~RedisDB() - { - std::cerr << "Deleting RedisDB object\n"; - delete _redis; - } - - inline std::string type() override { return "RedisDB"; } - - /** - * @brief Return the DB enumerationt type (File, Redis etc) - */ - AMSDBType dbType() { return AMSDBType::REDIS; }; - - - inline std::string info() { return _redis->info(); } - - // Return the number of keys in the DB - inline long long dbsize() { return _redis->dbsize(); } - - /* ! - * ! WARNING: Flush the entire Redis, accross all DBs! - * ! - */ - inline void flushall() { _redis->flushall(); } - - /* - * ! WARNING: Flush the entire current DB! - * ! - */ - inline void flushdb() { _redis->flushdb(); } - - std::unordered_map read_json(std::string fn) - { - std::ifstream config; - std::unordered_map connection_info = { - {"database-password", ""}, - {"host", ""}, - {"service-port", ""}, - {"cert", ""}, - }; - - config.open(fn, std::ifstream::in); - if (config.is_open()) { - std::string line; - // Quite inefficient parsing (to say the least..) but the file to parse is - // small (4 lines) - // TODO: maybe use Boost or another JSON library - while (std::getline(config, line)) { - if (line.find("{") != std::string::npos || - line.find("}") != std::string::npos) { - continue; - } - line.erase(std::remove(line.begin(), line.end(), ' '), line.end()); - line.erase(std::remove(line.begin(), line.end(), ','), line.end()); - line.erase(std::remove(line.begin(), line.end(), '"'), line.end()); - - std::string key = line.substr(0, line.find(':')); - line.erase(0, line.find(":") + 1); - connection_info[key] = line; - // std::cerr << "key=" << key << " and value=" << line << std::endl; - } - config.close(); - } else { - std::cerr << "Config located at: " << fn << std::endl; - throw std::runtime_error("Could not open Redis config file"); - } - return connection_info; - } - void store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool predicate = nullptr) override - { - - CFATAL(REDIS, - predicate != nullptr, - "REDIS database does not support storing uq-predicates") - - const size_t num_in = inputs.size(); - const size_t num_out = outputs.size(); - - // TODO: - // Make insertion more efficient. - // Right now it's pretty naive and expensive - auto start = std::chrono::high_resolution_clock::now(); - - for (size_t i = 0; i < num_elements; i++) { - std::string key = std::to_string(_dbid) + ":" + std::to_string(keyId) + - ":" + - std::to_string(i); // In Redis a key must be a string - std::ostringstream fd; - for (size_t j = 0; j < num_in; j++) { - fd << inputs[j][i] << ":"; - } - for (size_t j = 0; j < num_out - 1; j++) { - fd << outputs[j][i] << ":"; - } - fd << outputs[num_out - 1][i]; - std::string val(fd.str()); - _redis->set(key, val); - } - - keyId += 1; - - auto stop = std::chrono::high_resolution_clock::now(); - auto duration = - std::chrono::duration_cast(stop - start); - auto nb_keys = this->dbsize(); - - std::cout << std::setprecision(2) << "Inserted " << num_elements - << " keys [Total keys = " << nb_keys << "] into RedisDB [Total " - << duration.count() << "ms, " - << static_cast(num_elements) / duration.count() - << " key/ms]" << std::endl; - } -}; +#endif -#endif // __ENABLE_REDIS__ #ifdef __ENABLE_RMQ__ +// TODO IMPLEMENT THIS AFTER everything else is working enum class ConnectionStatus { FAILED, CONNECTED, CLOSED, ERROR }; @@ -2148,8 +1800,6 @@ class DBManager } switch (dbType) { - case AMSDBType::AMS_CSV: - return std::make_shared(fs_interface.path(), dbLabel, rId); #ifdef __ENABLE_HDF5__ case AMSDBType::AMS_HDF5: return std::make_shared( diff --git a/src/AMSlib/wf/hdf5db.cpp b/src/AMSlib/wf/hdf5db.cpp index f59e78b7..bd79e9b7 100644 --- a/src/AMSlib/wf/hdf5db.cpp +++ b/src/AMSlib/wf/hdf5db.cpp @@ -5,17 +5,96 @@ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception */ +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "util/ArrayRef.hpp" +#include "utils.hpp" #include "wf/basedb.hpp" + using namespace ams::db; +static std::string SmallVectorToString(ams::MutableArrayRef shape) +{ + std::ostringstream oss; + oss << "["; + for (size_t i = 0; i < shape.size(); ++i) { + oss << shape[i]; + if (i < shape.size() - 1) { + oss << ", "; + } + } + oss << "]"; + return oss.str(); +} + +static std::string tensorSizeToString(const at::IntArrayRef shape) +{ + std::ostringstream oss; + oss << "["; + for (size_t i = 0; i < shape.size(); ++i) { + oss << shape[i]; + if (i < shape.size() - 1) { + oss << ", "; + } + } + oss << "]"; + return oss.str(); +} + +// Helper function to convert torch::Dtype to a string +static std::string dtypeToString(torch::Dtype dtype) +{ + static const std::unordered_map dtypeMap = { + {torch::kFloat32, "float32"}, + {torch::kFloat, "float32"}, // Alias for float32 + {torch::kFloat64, "float64"}, + {torch::kDouble, "float64"}, // Alias for float64 + {torch::kInt32, "int32"}, + {torch::kInt64, "int64"}, + {torch::kBool, "bool"}, + {torch::kUInt8, "uint8"}, + {torch::kInt8, "int8"}, + {torch::kHalf, "float16"}, + {torch::kBFloat16, "bfloat16"}}; + return dtypeMap.count(dtype) ? dtypeMap.at(dtype) : "unknown dtype"; +} +// Helper function to convert torch::Dtype to a string +static hid_t torchDTypeToHDF5Type(torch::Dtype dtype) +{ + static const std::unordered_map dtypeMap = { + {torch::kFloat32, H5T_NATIVE_FLOAT}, + {torch::kFloat, H5T_NATIVE_FLOAT}, // Alias for float32 + {torch::kFloat64, H5T_NATIVE_DOUBLE}, + {torch::kDouble, H5T_NATIVE_DOUBLE}, // Alias for float64 + {torch::kInt32, H5T_NATIVE_INT}, + {torch::kInt64, H5T_NATIVE_LONG}, + {torch::kBool, H5T_NO_CLASS}, + {torch::kUInt8, H5T_NO_CLASS}, + {torch::kInt8, H5T_NO_CLASS}, + {torch::kHalf, H5T_NO_CLASS}, + {torch::kBFloat16, H5T_NO_CLASS}}; + return dtypeMap.count(dtype) ? dtypeMap.at(dtype) : H5T_NO_CLASS; +} + hid_t hdf5DB::getDataSet(hid_t group, std::string dName, + ams::SmallVector& currentShape, + const at::IntArrayRef Shape, hid_t dataType, const size_t Chunk) { - // Our datasets a.t.m are 1-D vectors - const int nDims = 1; + const int nDims = Shape.size(); + currentShape.resize(nDims); + currentShape.assign(nDims, 0); // We always start from 0 hsize_t dims = 0; hid_t dset = -1; @@ -26,162 +105,163 @@ hid_t hdf5DB::getDataSet(hid_t group, dset = H5Dopen(group, dName.c_str(), H5P_DEFAULT); HDF5_ERROR(dset); // We are assuming symmetrical data sets a.t.m - if (totalElements == 0) { - hid_t dspace = H5Dget_space(dset); - const int ndims = H5Sget_simple_extent_ndims(dspace); - hsize_t dims[ndims]; - H5Sget_simple_extent_dims(dspace, dims, NULL); - totalElements = dims[0]; + hid_t dspace = H5Dget_space(dset); + const int file_ndims = H5Sget_simple_extent_ndims(dspace); + if (file_ndims != nDims) { + throw std::runtime_error( + "File system file with current tensor shape to not match"); } + hsize_t dims[nDims]; + H5Sget_simple_extent_dims(dspace, dims, NULL); + currentShape[0] = dims[0]; return dset; - } else { - // We will extend the data-set size, so we use unlimited option - hsize_t maxDims = H5S_UNLIMITED; - hid_t fileSpace = H5Screate_simple(nDims, &dims, &maxDims); - HDF5_ERROR(fileSpace); - - hid_t pList = H5Pcreate(H5P_DATASET_CREATE); - HDF5_ERROR(pList); - - herr_t ec = H5Pset_layout(pList, H5D_CHUNKED); - HDF5_ERROR(ec); - - // cDims impacts performance considerably. - // TODO: Align this with the caching mechanism for this option to work - // out. - hsize_t cDims = Chunk; - H5Pset_chunk(pList, nDims, &cDims); - dset = H5Dcreate(group, - dName.c_str(), - dataType, - fileSpace, - H5P_DEFAULT, - pList, - H5P_DEFAULT); - HDF5_ERROR(dset); - H5Sclose(fileSpace); - H5Pclose(pList); } + + // We will extend the data-set size, so we use unlimited option + hsize_t max_dims[Shape.size()]; + hsize_t initial_shape[Shape.size()]; + for (int i = 0; i < Shape.size(); i++) { + max_dims[i] = Shape[i]; + initial_shape[i] = 0; + } + max_dims[0] = H5S_UNLIMITED; + hid_t fileSpace = H5Screate_simple(nDims, initial_shape, max_dims); + HDF5_ERROR(fileSpace); + + hid_t pList = H5Pcreate(H5P_DATASET_CREATE); + HDF5_ERROR(pList); + + herr_t ec = H5Pset_layout(pList, H5D_CHUNKED); + HDF5_ERROR(ec); + + // cDims impacts performance considerably. + // TODO: Align this with the caching mechanism for this option to work + // out. + max_dims[0] = Chunk; + H5Pset_chunk(pList, nDims, max_dims); + dset = H5Dcreate(group, + dName.c_str(), + dataType, + fileSpace, + H5P_DEFAULT, + pList, + H5P_DEFAULT); + HDF5_ERROR(dset); + H5Sclose(fileSpace); + H5Pclose(pList); return dset; } -void hdf5DB::createDataSets(size_t numElements, - const size_t numIn, - const size_t numOut) +void hdf5DB::createDataSets(at::IntArrayRef InShapes, at::IntArrayRef OutShapes) { - for (int i = 0; i < numIn; i++) { - hid_t dSet = - getDataSet(HFile, std::string("input_") + std::to_string(i), HDType); - HDIsets.push_back(dSet); - } + HDIset = getDataSet(HFile, "input_data", currentInputShape, InShapes, HDType); + + HDOset = + getDataSet(HFile, "output_data", currentOutputShape, OutShapes, HDType); +} + +void hdf5DB::writeDataToDataset(ams::MutableArrayRef currentShape, + hid_t& dset, + const at::Tensor& tensor_data) +{ + herr_t status; + + // Ensure tensor is contiguous + torch::Tensor tensor_contiguous = tensor_data.contiguous(); + + // Get tensor dimensions + std::vector tensor_dims(tensor_contiguous.sizes().begin(), + tensor_contiguous.sizes().end()); + int rank = tensor_dims.size(); - for (int i = 0; i < numOut; i++) { - hid_t dSet = - getDataSet(HFile, std::string("output_") + std::to_string(i), HDType); - HDOsets.push_back(dSet); + // Initialize currentShape if it's empty (e.g., first write or reopening an existing file) + if (currentShape.empty()) { + hid_t fileSpace = H5Dget_space(dset); + if (fileSpace < 0) { + throw std::runtime_error("Failed to get dataspace from dataset."); + } + if (H5Sget_simple_extent_dims(fileSpace, currentShape.data(), NULL) < 0) { + H5Sclose(fileSpace); + throw std::runtime_error("Failed to retrieve dataset dimensions."); + } + H5Sclose(fileSpace); } - if (storePredicate()) { - pSet = getDataSet(HFile, "predicate", H5T_NATIVE_HBOOL); + // Create a memory representation for the data to be stored + hid_t memSpace = H5Screate_simple(rank, tensor_dims.data(), NULL); + if (memSpace < 0) { + throw std::runtime_error("Failed to create memory dataspace."); } -} -template -void hdf5DB::writeDataToDataset(std::vector& dsets, - std::vector& data, - size_t numElements) -{ - int index = 0; - for (auto* I : data) { - writeVecToDataset(dsets[index++], - static_cast(I), - numElements, - HDType); + // Prepare the dataset for new data + ams::SmallVector newShape(tensor_dims.begin(), tensor_dims.end()); + newShape[0] += currentShape[0]; // Update the first dimension + status = H5Dset_extent(dset, newShape.data()); + if (status < 0) { + throw std::runtime_error("Failed to extend dataset's dimensions."); } -} -void hdf5DB::writeVecToDataset(hid_t dSet, - void* data, - size_t elements, - hid_t DType) -{ - const int nDims = 1; - hsize_t dims = elements; - hsize_t start; - hsize_t count; - hid_t memSpace = H5Screate_simple(nDims, &dims, NULL); - HDF5_ERROR(memSpace); - dims = totalElements + elements; - H5Dset_extent(dSet, &dims); + // Refresh fileSpace after extending + hid_t fileSpace = H5Dget_space(dset); + if (fileSpace < 0) { + throw std::runtime_error( + "Failed to get refreshed dataspace after extending dataset."); + } - hid_t fileSpace = H5Dget_space(dSet); - HDF5_ERROR(fileSpace); + // Debugging: Check dimensions of fileSpace + std::vector file_dims(rank); + H5Sget_simple_extent_dims(fileSpace, file_dims.data(), NULL); - // Data set starts at offset totalElements - start = totalElements; - // And we append additional elements - count = elements; // Select hyperslab - herr_t err = H5Sselect_hyperslab( - fileSpace, H5S_SELECT_SET, &start, NULL, &count, NULL); - HDF5_ERROR(err); + herr_t err = H5Sselect_hyperslab(fileSpace, + H5S_SELECT_SET, + currentShape.data(), + NULL, + tensor_dims.data(), + NULL); + if (err < 0) { + H5Sclose(fileSpace); + H5Sclose(memSpace); + throw std::runtime_error("Failed to select hyperslab."); + } - H5Dwrite(dSet, DType, memSpace, fileSpace, H5P_DEFAULT, data); + // Write the tensor data to the dataset + status = H5Dwrite(dset, + HDType, + memSpace, + fileSpace, + H5P_DEFAULT, + tensor_contiguous.data_ptr()); + if (status < 0) { + throw std::runtime_error("Failed to write data to dataset."); + } + + // Update currentShape + currentShape[0] += newShape[0]; + + // Close HDF5 objects + H5Sclose(memSpace); H5Sclose(fileSpace); } -template -void hdf5DB::_store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate) +void hdf5DB::_store(const at::Tensor& inputs, const at::Tensor& outputs) { - CALIPER(CALI_MARK_BEGIN("STORE_HDF5");) - if (isDouble::default_value()) - HDType = H5T_NATIVE_DOUBLE; - else - HDType = H5T_NATIVE_FLOAT; - - - CFATAL(HDF5DB, - storePredicate() && predicate == nullptr, - "DB Configured to store predicates, predicate is not provided") - - DBG(DB, - "DB of type %s stores %ld elements of input/output dimensions (%lu, " - "%lu)", + "DB of type %s stores input/output tensors of shapes(%s, " + "%s)", type().c_str(), - num_elements, - inputs.size(), - outputs.size()) - const size_t num_in = inputs.size(); - const size_t num_out = outputs.size(); - - if (HDIsets.empty()) { - createDataSets(num_elements, num_in, num_out); - } + tensorSizeToString(inputs.sizes()).c_str(), + tensorSizeToString(outputs.sizes()).c_str()); - CFATAL(HDF5DB, - (HDIsets.size() != num_in || HDOsets.size() != num_out), - "The data dimensionality is different than the one in the " - "DB") - - writeDataToDataset(HDIsets, inputs, num_elements); - writeDataToDataset(HDOsets, outputs, num_elements); - - if (storePredicate() && predicate != nullptr) { - writeVecToDataset(pSet, - static_cast(predicate), - num_elements, - H5T_NATIVE_HBOOL); + if (HDIset == -1 || HDOset == -1) { + createDataSets(inputs.sizes(), outputs.sizes()); } - totalElements += num_elements; - CALIPER(CALI_MARK_END("STORE_HDF5");) + writeDataToDataset(currentInputShape, HDIset, inputs); + writeDataToDataset(currentOutputShape, HDOset, outputs); } @@ -190,8 +270,7 @@ hdf5DB::hdf5DB(std::string path, std::string fn, uint64_t rId, bool predicate) - : FileDB(path, fn, predicate ? ".debug.h5" : ".h5", rId), - predicateStore(predicate) + : FileDB(path, fn, ".h5", rId), HDOset(-1), HDIset(-1) { std::error_code ec; bool exists = fs::exists(this->fn); @@ -220,7 +299,6 @@ hdf5DB::hdf5DB(std::string path, H5Sclose(dataspace_id); } HDF5_ERROR(HFile); - totalElements = 0; HDType = -1; } @@ -233,32 +311,25 @@ hdf5DB::~hdf5DB() // HDF5_ERROR(err); } -void hdf5DB::store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate) +void hdf5DB::store(const at::Tensor& inputs, const at::Tensor& outputs) { - if (HDType == -1) { - HDType = H5T_NATIVE_FLOAT; + if (inputs.dtype() != outputs.dtype()) { + throw std::invalid_argument( + "Storing into HDF5 database requires all tensors to have the same " + "datatype. Now they have:" + + dtypeToString(torch::typeMetaToScalarType(inputs.dtype())) + " and " + + dtypeToString(torch::typeMetaToScalarType(outputs.dtype()))); } - CFATAL(HDF5DB, - HDType != H5T_NATIVE_FLOAT, - "Database %s initialized to work on 'float' received different " - "datatypes", - fn.c_str()); - - _store(num_elements, inputs, outputs, predicate); -} - - -void hdf5DB::store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate) -{ if (HDType == -1) { - HDType = H5T_NATIVE_DOUBLE; + HDType = torchDTypeToHDF5Type(torch::typeMetaToScalarType(inputs.dtype())); } - _store(num_elements, inputs, outputs, predicate); + + if (HDType == -1 || HDType == H5T_NO_CLASS) + throw std::invalid_argument( + "Data base can not deduce the data type of the tensors" + + dtypeToString(torch::typeMetaToScalarType(inputs.dtype())) + " and " + + dtypeToString(torch::typeMetaToScalarType(outputs.dtype()))); + + _store(inputs, outputs); } diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index 147a83aa..f2e7a685 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -3,300 +3,311 @@ # # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -function(JSON_TESTS db_type) - set(FS_PATH "${CMAKE_CURRENT_BINARY_DIR}") - set(AMS_DB_TEST_TYPE ${db_type}) - set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/${db_type}.json") - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/env_2_models_fs_rand_uq.json.in" "${JSON_FP}" @ONLY) - - # Tests Random models with different percentages both models store to file - add_test(NAME AMSEndToEndFromJSON::Random10::Random50::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_random_50") - - - # Tests delta-uq models with different aggregation both models store to file - add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean app_uq_max") - - - # Tests detla uq model with a random uq model both models store to files - add_test(NAME AMSEndToEndFromJSON::Random::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_uq_max") - - # Tests detla uq model with no model. uq model both store to files - add_test(NAME AMSEndToEndFromJSON::Random::NoModel::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_no_model;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_no_model") - - # Tests 2 delta uq models with no deb . uq model both store to files - add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_ndb app_uq_max_ndb;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_ndb app_uq_max_ndb") - - # Tests null models null dbs - add_test(NAME AMSEndToEndFromJSON::None::None::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_no_model_no_db app_no_model_no_db ;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_no_model_no_db app_no_model_no_db") - - unset(AMS_DB_TEST_TYPE) - unset(JSON_FP) -endfunction() - -function(CHECK_RMQ_CONFIG file) - # Read the JSON file. - file(READ ${file} MY_JSON_STRING) - message(STATUS "RabbitMQ config ${file}") - - string(JSON DB_CONF GET ${MY_JSON_STRING} db) - string(JSON DB_CONF GET ${DB_CONF} rmq_config) - string(JSON RMQ_HOST GET ${DB_CONF} "service-host") - string(JSON RMQ_PORT GET ${DB_CONF} "service-port") - - if(NOT "${RMQ_HOST}" STREQUAL "" AND NOT "${RMQ_PORT}" STREQUAL "0") - message(STATUS "RabbitMQ config ${file}: ${RMQ_HOST}:${RMQ_PORT}") - else() - message(WARNING "RabbitMQ config file ${file} looks empty! Make sure to fill these fields before running the tests") - endif() -endfunction() - -function(INTEGRATION_TEST_ENV) - JSON_TESTS("csv") - if (WITH_HDF5) - JSON_TESTS("hdf5") - set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/hdf5.json") - # Tests delta-uq models with different aggregation both models store to file with debug option set to on. - add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::hdf5-debug::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_debug app_uq_max_debug;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_debug app_uq_max_debug") - unset(JSON_FP) - endif() -endfunction() - -function(INTEGRATION_TEST_RMQ) - if (WITH_RMQ) - if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") - # If file exists we do not overwrite it - message(STATUS "Ctest will use ${CMAKE_CURRENT_BINARY_DIR}/rmq.json as RabbitMQ configuration for testing. Make sure RabbitMQ parameters are valid.") - else() - message(STATUS "Copying empty configuration to ${CMAKE_CURRENT_BINARY_DIR}/rmq.json") - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/rmq.json.in" "rmq.json" @ONLY) - endif() - set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") - CHECK_RMQ_CONFIG(${JSON_FP}) - add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 2 2 \"double\" 2 10; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 2 2 \"double\" 2 10") - endif() -endfunction() - -function (INTEGRATION_TEST) - ####################################################### - # TEST: output format - # UQ: Random - ####################################################### - - add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyPhysics::None::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"") - add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyModel::None::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"none\" \"./\"") - - - ####################################################### - # TEST: CSV output format - # UQ: Random - # 3 Thresholds: 0, 0.5, 1.0 - ####################################################### - - add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyPhysics::CSV::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"csv\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"csv\" \"./\"") - add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyModel::CSV::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"csv\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"csv\" \"./\"") - add_test(NAME AMSEndToEnd::Random::Double::DB::HALF::CSV::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"csv\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"csv\" \"./\"") - - - if (WITH_HDF5) - ####################################################### - # TEST: hdf5 output format - # UQ: Random - # 3 Thresholds: 0, 0.5, 1.0 - # precision: double - ####################################################### - - add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::Random::Double::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") - - ####################################################### - # TEST: hdf5 output format - # UQ: Random - # 3 Thresholds: 0, 0.5, 1.0 - # precision: single - ####################################################### - - - add_test(NAME AMSEndToEnd::Random::Single::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::Random::Single::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::Random::Single::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") - endif() - - - ####################################################### - # TEST: hdf5 output format - # UQ: deltauq-mean - # 3 Thresholds: 0, 0.5, 1.0 - # precision: double - ####################################################### - add_test(NAME AMSEndToEnd::DeltaUQMean::Double::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::DeltaUQMean::Double::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::DeltaUQMean::Double::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") - - ####################################################### - # TEST: hdf5 output format - # UQ: deltauq-mean - # 3 Thresholds: 0, 0.5, 1.0 - # precision: single - ####################################################### - add_test(NAME AMSEndToEnd::DeltaUQMean::Single::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::DeltaUQMean::Single::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::DeltaUQMean::Single::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") - - ####################################################### - # TEST: hdf5 output format - # UQ: deltauq-max - # 3 Thresholds: 0, 0.5, 1.0 - # precision: double - ####################################################### - add_test(NAME AMSEndToEnd::DeltaUQMax::Double::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::DeltaUQMax::Double::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::DeltaUQMax::Double::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") - - ####################################################### - # TEST: hdf5 output format - # UQ: deltauq-max - # 3 Thresholds: 0, 0.5, 1.0 - # precision: single - ####################################################### - add_test(NAME AMSEndToEnd::DeltaUQMax::Single::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::DeltaUQMax::Single::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") - add_test(NAME AMSEndToEnd::DeltaUQMax::Single::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") -endfunction() - - - -function(BUILD_TEST exe source) - add_executable(${exe} ${source}) - target_include_directories(${exe} PRIVATE "${PROJECT_SOURCE_DIR}/src/AMSlib/" umpire ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) - target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) - target_link_libraries(${exe} PRIVATE AMS ${AMS_APP_LIBRARIES}) - - target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) - - if(WITH_CUDA) - set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") - set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) - set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) - - target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") - endif() -endfunction() - -function(ADDTEST exe test_name) - add_test(NAME "${test_name}::HOST" COMMAND ${exe} 0 ${ARGN}) - - if(WITH_CUDA) - add_test(NAME "${test_name}::DEVICE" COMMAND ${exe} 1 ${ARGN}) - endif() -endfunction() - -# This test requires Allocate -# TODO: Include tests once we re-instate a pool -#BUILD_TEST(ams_allocator_test ams_allocate.cpp) -#ADDTEST(ams_allocator_test AMSAllocate) -BUILD_TEST(ams_packing_test cpu_packing_test.cpp AMSPack) -ADDTEST(ams_packing_test AMSPack) - -#Tensor tests -BUILD_TEST(ams_tensor_test ams_tensor_test.cpp) - -add_test(NAME ams_tensor_num_elements COMMAND ams_tensor_test "num_elements") -set_tests_properties(ams_tensor_num_elements PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_cast COMMAND ams_tensor_test "cast") -set_tests_properties(ams_tensor_cast PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_create COMMAND ams_tensor_test "create") -set_tests_properties(ams_tensor_create PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_view COMMAND ams_tensor_test "view") -set_tests_properties(ams_tensor_view PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_move COMMAND ams_tensor_test "move") -set_tests_properties(ams_tensor_move PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_access COMMAND ams_tensor_test "access") -set_tests_properties(ams_tensor_access PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_conversion COMMAND ams_tensor_test "conversion") -set_tests_properties(ams_tensor_conversion PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_transpose COMMAND ams_tensor_test "transpose") -set_tests_properties(ams_tensor_transpose PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_valid_reshapes COMMAND ams_tensor_test "test-reshape") -set_tests_properties(ams_tensor_valid_reshapes PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_reshape COMMAND ams_tensor_test "reshape") -set_tests_properties(ams_tensor_reshape PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_concat COMMAND ams_tensor_test "concat") -set_tests_properties(ams_tensor_concat PROPERTIES LABELS "AMSTensor") - -add_test(NAME ams_tensor_expand COMMAND ams_tensor_test "expand") -set_tests_properties(ams_tensor_expand PROPERTIES LABELS "AMSTensor") - - -if(WITH_TORCH) - BUILD_TEST(ams_inference_test torch_model.cpp) - ADDTEST(ams_inference_test AMSInferDouble ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt "double") - ADDTEST(ams_inference_test AMSInferSingle ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt "single") - if (WITH_EXAMPLES) - add_test(NAME AMSExampleSingleDeltaUQ::HOST COMMAND ams_example --precision single --uqtype deltauq-mean -db "./" -S ${CMAKE_CURRENT_SOURCE_DIR}/tuple-single.torchscript -e 100) - add_test(NAME AMSExampleSingleRandomUQ::HOST COMMAND ams_example --precision single --uqtype random -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -e 100) - add_test(NAME AMSExampleDoubleRandomUQ::HOST COMMAND ams_example --precision double --uqtype random -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -e 100) -endif() - -# These are integration tests. Try to use an end to end AMS run and realize issues between multiple pieces - BUILD_TEST(ams_end_to_end ams_ete.cpp) - INTEGRATION_TEST() - BUILD_TEST(ams_end_to_end_env ams_ete_env.cpp) - INTEGRATION_TEST_ENV() - BUILD_TEST(ams_rmq ams_rmq_env.cpp) - INTEGRATION_TEST_RMQ() - BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) - - - # UQ Tests - BUILD_TEST(ams_delta_uq_test ams_uq_model.cpp) - - if(WITH_TORCH) - add_test(NAME AMSDeltaUQDoubleMean::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 3 0.0) - add_test(NAME AMSDeltaUQDoubleMax::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 4 0.0) - add_test(NAME AMSDeltaUQDoubleMean_2::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq "double" 2 4 3 0.5) - add_test(NAME AMSDeltaUQDoubleMax_2::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq "double" 2 4 4 0.1) - - if(WITH_CUDA) - add_test(NAME AMSDeltaUQDoubleMean::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 3 0.0) - add_test(NAME AMSDeltaUQDoubleMax::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 4 0.0) - add_test(NAME AMSDeltaUQDoubleMean_2::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq.cuda "double" 2 4 3 0.5) - add_test(NAME AMSDeltaUQDoubleMax_2::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq.cuda "double" 2 4 4 0.1) - endif() - endif() - - # TODO Add tests with cpu model - BUILD_TEST(ams_update_model ams_update_model.cpp) - ADDTEST(ams_update_model AMSUpdateModelDouble "double" ${CMAKE_CURRENT_SOURCE_DIR}/ConstantZeroModel_cpu.pt ${CMAKE_CURRENT_SOURCE_DIR}/ConstantOneModel_cpu.pt) -endif() - -if(WITH_FAISS) - BUILD_TEST(ams_hdcache_test test_hdcache.cpp) - ADDTEST(ams_hdcache_test AMSHDCacheMeanPolicyDouble ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "double" 1 10 4.0 4 5) - - ADDTEST(ams_hdcache_test AMSHDCacheMeanPolicySingle ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "single" 1 10 4.0 4 5) +#function(JSON_TESTS db_type) +# set(FS_PATH "${CMAKE_CURRENT_BINARY_DIR}") +# set(AMS_DB_TEST_TYPE ${db_type}) +# set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/${db_type}.json") +# configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/env_2_models_fs_rand_uq.json.in" "${JSON_FP}" @ONLY) +# +# # Tests Random models with different percentages both models store to file +# add_test(NAME AMSEndToEndFromJSON::Random10::Random50::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_random_50") +# +# +# # Tests delta-uq models with different aggregation both models store to file +# add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean app_uq_max") +# +# +# # Tests detla uq model with a random uq model both models store to files +# add_test(NAME AMSEndToEndFromJSON::Random::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_uq_max") +# +# # Tests detla uq model with no model. uq model both store to files +# add_test(NAME AMSEndToEndFromJSON::Random::NoModel::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_no_model;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_no_model") +# +# # Tests 2 delta uq models with no deb . uq model both store to files +# add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_ndb app_uq_max_ndb;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_ndb app_uq_max_ndb") +# +# # Tests null models null dbs +# add_test(NAME AMSEndToEndFromJSON::None::None::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_no_model_no_db app_no_model_no_db ;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_no_model_no_db app_no_model_no_db") +# +# unset(AMS_DB_TEST_TYPE) +# unset(JSON_FP) +#endfunction() +# +#function(CHECK_RMQ_CONFIG file) +# # Read the JSON file. +# file(READ ${file} MY_JSON_STRING) +# message(STATUS "RabbitMQ config ${file}") +# +# string(JSON DB_CONF GET ${MY_JSON_STRING} db) +# string(JSON DB_CONF GET ${DB_CONF} rmq_config) +# string(JSON RMQ_HOST GET ${DB_CONF} "service-host") +# string(JSON RMQ_PORT GET ${DB_CONF} "service-port") +# +# if(NOT "${RMQ_HOST}" STREQUAL "" AND NOT "${RMQ_PORT}" STREQUAL "0") +# message(STATUS "RabbitMQ config ${file}: ${RMQ_HOST}:${RMQ_PORT}") +# else() +# message(WARNING "RabbitMQ config file ${file} looks empty! Make sure to fill these fields before running the tests") +# endif() +#endfunction() +# +#function(INTEGRATION_TEST_ENV) +# JSON_TESTS("csv") +# if (WITH_HDF5) +# JSON_TESTS("hdf5") +# set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/hdf5.json") +# # Tests delta-uq models with different aggregation both models store to file with debug option set to on. +# add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::hdf5-debug::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_debug app_uq_max_debug;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_debug app_uq_max_debug") +# unset(JSON_FP) +# endif() +#endfunction() +# +#function(INTEGRATION_TEST_RMQ) +# if (WITH_RMQ) +# if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") +# # If file exists we do not overwrite it +# message(STATUS "Ctest will use ${CMAKE_CURRENT_BINARY_DIR}/rmq.json as RabbitMQ configuration for testing. Make sure RabbitMQ parameters are valid.") +# else() +# message(STATUS "Copying empty configuration to ${CMAKE_CURRENT_BINARY_DIR}/rmq.json") +# configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/rmq.json.in" "rmq.json" @ONLY) +# endif() +# set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") +# CHECK_RMQ_CONFIG(${JSON_FP}) +# add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 8 9 \"double\" 2 1024; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 8 9 \"double\" 2 1024") +# endif() +#endfunction() +# +#function (INTEGRATION_TEST) +# ####################################################### +# # TEST: output format +# # UQ: Random +# ####################################################### +# +# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyPhysics::None::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"") +# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyModel::None::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"none\" \"./\"") +# +# +# ####################################################### +# # TEST: CSV output format +# # UQ: Random +# # 3 Thresholds: 0, 0.5, 1.0 +# ####################################################### +# +# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyPhysics::CSV::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"csv\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"csv\" \"./\"") +# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyModel::CSV::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"csv\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"csv\" \"./\"") +# add_test(NAME AMSEndToEnd::Random::Double::DB::HALF::CSV::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"csv\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"csv\" \"./\"") +# +# +# if (WITH_HDF5) +# ####################################################### +# # TEST: hdf5 output format +# # UQ: Random +# # 3 Thresholds: 0, 0.5, 1.0 +# # precision: double +# ####################################################### +# +# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::Random::Double::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") +# +# ####################################################### +# # TEST: hdf5 output format +# # UQ: Random +# # 3 Thresholds: 0, 0.5, 1.0 +# # precision: single +# ####################################################### +# +# +# add_test(NAME AMSEndToEnd::Random::Single::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::Random::Single::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::Random::Single::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") +# endif() +# +# +# ####################################################### +# # TEST: hdf5 output format +# # UQ: deltauq-mean +# # 3 Thresholds: 0, 0.5, 1.0 +# # precision: double +# ####################################################### +# add_test(NAME AMSEndToEnd::DeltaUQMean::Double::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::DeltaUQMean::Double::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::DeltaUQMean::Double::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") +# +# ####################################################### +# # TEST: hdf5 output format +# # UQ: deltauq-mean +# # 3 Thresholds: 0, 0.5, 1.0 +# # precision: single +# ####################################################### +# add_test(NAME AMSEndToEnd::DeltaUQMean::Single::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::DeltaUQMean::Single::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::DeltaUQMean::Single::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") +# +# ####################################################### +# # TEST: hdf5 output format +# # UQ: deltauq-max +# # 3 Thresholds: 0, 0.5, 1.0 +# # precision: double +# ####################################################### +# add_test(NAME AMSEndToEnd::DeltaUQMax::Double::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::DeltaUQMax::Double::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::DeltaUQMax::Double::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") +# +# ####################################################### +# # TEST: hdf5 output format +# # UQ: deltauq-max +# # 3 Thresholds: 0, 0.5, 1.0 +# # precision: single +# ####################################################### +# add_test(NAME AMSEndToEnd::DeltaUQMax::Single::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::DeltaUQMax::Single::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") +# add_test(NAME AMSEndToEnd::DeltaUQMax::Single::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") +#endfunction() +# +# +# +#function(BUILD_TEST exe source) +# add_executable(${exe} ${source}) +# target_include_directories(${exe} PRIVATE "${PROJECT_SOURCE_DIR}/src/AMSlib/" umpire ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) +# target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) +# target_link_libraries(${exe} PRIVATE AMS ${AMS_APP_LIBRARIES}) +# +# target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) +# +# if(WITH_CUDA) +# set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") +# set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) +# set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) +# +# target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") +# endif() +#endfunction() +# +#function(ADDTEST exe test_name) +# add_test(NAME "${test_name}::HOST" COMMAND ${exe} 0 ${ARGN}) +# +# if(WITH_CUDA) +# add_test(NAME "${test_name}::DEVICE" COMMAND ${exe} 1 ${ARGN}) +# endif() +#endfunction() +# +## This test requires Allocate +## TODO: Include tests once we re-instate a pool +##BUILD_TEST(ams_allocator_test ams_allocate.cpp) +##ADDTEST(ams_allocator_test AMSAllocate) +#BUILD_TEST(ams_packing_test cpu_packing_test.cpp AMSPack) +#ADDTEST(ams_packing_test AMSPack) +# +##Tensor tests +#BUILD_TEST(ams_tensor_test ams_tensor_test.cpp) +# +#add_test(NAME ams_tensor_num_elements COMMAND ams_tensor_test "num_elements") +#set_tests_properties(ams_tensor_num_elements PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_cast COMMAND ams_tensor_test "cast") +#set_tests_properties(ams_tensor_cast PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_create COMMAND ams_tensor_test "create") +#set_tests_properties(ams_tensor_create PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_view COMMAND ams_tensor_test "view") +#set_tests_properties(ams_tensor_view PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_move COMMAND ams_tensor_test "move") +#set_tests_properties(ams_tensor_move PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_access COMMAND ams_tensor_test "access") +#set_tests_properties(ams_tensor_access PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_conversion COMMAND ams_tensor_test "conversion") +#set_tests_properties(ams_tensor_conversion PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_transpose COMMAND ams_tensor_test "transpose") +#set_tests_properties(ams_tensor_transpose PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_valid_reshapes COMMAND ams_tensor_test "test-reshape") +#set_tests_properties(ams_tensor_valid_reshapes PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_reshape COMMAND ams_tensor_test "reshape") +#set_tests_properties(ams_tensor_reshape PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_concat COMMAND ams_tensor_test "concat") +#set_tests_properties(ams_tensor_concat PROPERTIES LABELS "AMSTensor") +# +#add_test(NAME ams_tensor_expand COMMAND ams_tensor_test "expand") +#set_tests_properties(ams_tensor_expand PROPERTIES LABELS "AMSTensor") +# +# +# +#if(WITH_TORCH) +# BUILD_TEST(ams_inference_test torch_model.cpp) +# ADDTEST(ams_inference_test AMSInferDouble ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt "double") +# ADDTEST(ams_inference_test AMSInferSingle ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt "single") +# if (WITH_EXAMPLES) +# add_test(NAME AMSExampleSingleDeltaUQ::HOST COMMAND ams_example --precision single --uqtype deltauq-mean -db "./" -S ${CMAKE_CURRENT_SOURCE_DIR}/tuple-single.torchscript -e 100) +# add_test(NAME AMSExampleSingleRandomUQ::HOST COMMAND ams_example --precision single --uqtype random -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -e 100) +# add_test(NAME AMSExampleDoubleRandomUQ::HOST COMMAND ams_example --precision double --uqtype random -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -e 100) +#endif() +# +## These are integration tests. Try to use an end to end AMS run and realize issues between multiple pieces +# BUILD_TEST(ams_end_to_end ams_ete.cpp) +# INTEGRATION_TEST() +# BUILD_TEST(ams_end_to_end_env ams_ete_env.cpp) +# INTEGRATION_TEST_ENV() +# BUILD_TEST(ams_rmq ams_rmq_env.cpp) +# INTEGRATION_TEST_RMQ() +# BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) +# +# +# # UQ Tests +# BUILD_TEST(ams_delta_uq_test ams_uq_model.cpp) +# +# if(WITH_TORCH) +# add_test(NAME AMSDeltaUQDoubleMean::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 3 0.0) +# add_test(NAME AMSDeltaUQDoubleMax::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 4 0.0) +# add_test(NAME AMSDeltaUQDoubleMean_2::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq "double" 2 4 3 0.5) +# add_test(NAME AMSDeltaUQDoubleMax_2::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq "double" 2 4 4 0.1) +# +# if(WITH_CUDA) +# add_test(NAME AMSDeltaUQDoubleMean::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 3 0.0) +# add_test(NAME AMSDeltaUQDoubleMax::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 4 0.0) +# add_test(NAME AMSDeltaUQDoubleMean_2::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq.cuda "double" 2 4 3 0.5) +# add_test(NAME AMSDeltaUQDoubleMax_2::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq.cuda "double" 2 4 4 0.1) +# endif() +# endif() +# +# # TODO Add tests with cpu model +# BUILD_TEST(ams_update_model ams_update_model.cpp) +# ADDTEST(ams_update_model AMSUpdateModelDouble "double" ${CMAKE_CURRENT_SOURCE_DIR}/ConstantZeroModel_cpu.pt ${CMAKE_CURRENT_SOURCE_DIR}/ConstantOneModel_cpu.pt) +#endif() +# +#if(WITH_FAISS) +# BUILD_TEST(ams_hdcache_test test_hdcache.cpp) +# ADDTEST(ams_hdcache_test AMSHDCacheMeanPolicyDouble ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "double" 1 10 4.0 4 5) +# +# ADDTEST(ams_hdcache_test AMSHDCacheMeanPolicySingle ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "single" 1 10 4.0 4 5) +# +# ADDTEST(ams_hdcache_test AMSHDCacheMaxPolicyDouble ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "double" 2 10 4.0 4 5) +# ADDTEST(ams_hdcache_test AMSHDCacheMaxPolicySingle ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "single" 2 10 4.0 4 5) +# # The max case fails on DEVICE. We should be aware about this when adding support for CI for GPUs +# if (WITH_CUDA) +# set_tests_properties(AMSHDCacheMaxPolicySingle::DEVICE AMSHDCacheMaxPolicyDouble::DEVICE PROPERTIES DISABLED TRUE) +# endif() +# +# if(WITH_TORCH) +# if (WITH_EXAMPLES) +# add_test(NAME AMSExampleFaissInferSingle::HOST COMMAND ams_example --precision single --uqtype faiss-mean -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -H ${CMAKE_CURRENT_SOURCE_DIR}/example_faiss.idx -e 100) +# add_test(NAME AMSExampleFaissInferDouble::HOST COMMAND ams_example --precision double --uqtype faiss-mean -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -H ${CMAKE_CURRENT_SOURCE_DIR}/example_faiss.idx -e 100) +# endif() +# endif() +#endif() +# +## Unit Test +# +## Test 'ml/Surrogate' class +>>>>>>> b6e616f (Updated basedb-hdf5) - ADDTEST(ams_hdcache_test AMSHDCacheMaxPolicyDouble ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "double" 2 10 4.0 4 5) - ADDTEST(ams_hdcache_test AMSHDCacheMaxPolicySingle ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "single" 2 10 4.0 4 5) - # The max case fails on DEVICE. We should be aware about this when adding support for CI for GPUs - if (WITH_CUDA) - set_tests_properties(AMSHDCacheMaxPolicySingle::DEVICE AMSHDCacheMaxPolicyDouble::DEVICE PROPERTIES DISABLED TRUE) - endif() - if(WITH_TORCH) - if (WITH_EXAMPLES) - add_test(NAME AMSExampleFaissInferSingle::HOST COMMAND ams_example --precision single --uqtype faiss-mean -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -H ${CMAKE_CURRENT_SOURCE_DIR}/example_faiss.idx -e 100) - add_test(NAME AMSExampleFaissInferDouble::HOST COMMAND ams_example --precision double --uqtype faiss-mean -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -H ${CMAKE_CURRENT_SOURCE_DIR}/example_faiss.idx -e 100) - endif() - endif() -endif() +add_subdirectory(torch) +add_subdirectory(db) +# add_test(NAME AMSEndToEndFromJSON::Random10::Random50::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_random_50") diff --git a/tests/AMSlib/db/CMakeLists.txt b/tests/AMSlib/db/CMakeLists.txt new file mode 100644 index 00000000..c9f09ab1 --- /dev/null +++ b/tests/AMSlib/db/CMakeLists.txt @@ -0,0 +1,32 @@ +function(BUILD_UNIT_TEST exe source) + add_executable(${exe} ${source}) + + target_include_directories(${exe} PRIVATE ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) + target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) + target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) + target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) + target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS) + + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) + + if(WITH_CUDA) + set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") + set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) + set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) + + target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") + endif() +endfunction() + +function(ADD_HDF5_UNIT_TEST name exec) + add_test(NAME ${name} COMMAND ${exec} ${ARGN}) + set_tests_properties(${name} PROPERTIES LABELS HDF5_UNIT_TEST) +endfunction() + +if (WITH_HDF5) +BUILD_UNIT_TEST(hdf5_create hdf5_open.cpp) +BUILD_UNIT_TEST(hdf5_store hdf5_store.cpp) +ADD_HDF5_UNIT_TEST(DB::HDF5::CREATE COMMAND bash -c "rm -f ${CMAKE_CURRENT_BINARY_DIR}/create_test*.h5\;${CMAKE_CURRENT_BINARY_DIR}/hdf5_create ${CMAKE_CURRENT_BINARY_DIR} test create_test") +ADD_HDF5_UNIT_TEST(DB::HDF5::STORE COMMAND bash -c "rm -f ${CMAKE_CURRENT_BINARY_DIR}/store_test*.h5\;${CMAKE_CURRENT_BINARY_DIR}/hdf5_store ${CMAKE_CURRENT_BINARY_DIR} test store_test") +endif() + diff --git a/tests/AMSlib/db/hdf5_open.cpp b/tests/AMSlib/db/hdf5_open.cpp new file mode 100644 index 00000000..c453b975 --- /dev/null +++ b/tests/AMSlib/db/hdf5_open.cpp @@ -0,0 +1,124 @@ +#include +#include + +#include +#include +#include +#include + +#include "wf/basedb.hpp" + +template +int testReadHDF5Dataset(const std::string& filePath, + const std::string& datasetName, + hid_t DataType, + std::vector correct_contents) +{ + // Open the HDF5 file + hid_t file_id = H5Fopen(filePath.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); + if (file_id < 0) { + std::cerr << "Failed to open HDF5 file: " << filePath << std::endl; + return -1; + } + + // Open the dataset + hid_t dataset_id = H5Dopen(file_id, datasetName.c_str(), H5P_DEFAULT); + if (dataset_id < 0) { + std::cerr << "Failed to open dataset: " << datasetName << std::endl; + H5Fclose(file_id); + return -1; + } + + // Get the dataspace of the dataset + hid_t dataspace_id = H5Dget_space(dataset_id); + if (dataspace_id < 0) { + std::cerr << "Failed to get dataspace for dataset: " << datasetName + << std::endl; + H5Dclose(dataset_id); + H5Fclose(file_id); + return -1; + } + + // Get the number of dimensions and size of each dimension + int ndims = H5Sget_simple_extent_ndims(dataspace_id); + std::vector dims(ndims); + H5Sget_simple_extent_dims(dataspace_id, dims.data(), nullptr); + + // Print dimensions + for (size_t i = 0; i < dims.size(); ++i) { + std::cout << dims[i] << (i < dims.size() - 1 ? " x " : "\n"); + } + + // Determine the datatype of the dataset + hid_t datatype_id = H5Dget_type(dataset_id); + // Get the size of the datatype + size_t datatype_size = H5Tget_size(datatype_id); + + + // Only handle floating-point data for this example + std::vector data; + if (datatype_size == sizeof(T)) { + // Allocate memory for the dataset + size_t total_elements = 1; + for (auto dim : dims) { + total_elements *= dim; + } + data.resize(total_elements); + // Read the dataset + if (H5Dread( + dataset_id, DataType, H5S_ALL, H5S_ALL, H5P_DEFAULT, data.data()) < + 0) + std::cerr << "Failed to read dataset: " << datasetName << std::endl; + } else { + std::cerr << "Unsupported data type for dataset: " << datasetName + << std::endl; + return -1; + } + + // Close HDF5 objects + H5Tclose(datatype_id); + H5Sclose(dataspace_id); + H5Dclose(dataset_id); + H5Fclose(file_id); + std::cout << "Read: " << std::string(data.begin(), data.end()); + return (data == correct_contents) ? 0 : -1; +} + + +int main(int argc, char* argv[]) +{ + if (argc != 4) { + std::cerr << "Wrong command line, correct one should be:\n"; + std::cerr << argv[0] + << " "; + } + std::string directory(argv[1]); + std::string domain_name(argv[2]); + std::string file_prefix(argv[3]); + std::string filename; + { + // Open non existing file + auto db = ams::db::hdf5DB(directory, domain_name, file_prefix, 0); + filename = db.getFilename(); + } + + std::cout << "Filename is:" << filename << "\n"; + // Check if file exists + if (!std::filesystem::exists(filename)) { + std::cout << "File does not exist." << std::endl; + return -1; + } + + // Open existing file + { + auto db = ams::db::hdf5DB(directory, domain_name, file_prefix, 0); + filename = db.getFilename(); + } + if (!std::filesystem::exists(filename)) { + std::cout << "File does not exist." << std::endl; + return -1; + } + std::string dn("domain_name"); + std::vector _dn(domain_name.begin(), domain_name.end()); + return testReadHDF5Dataset(filename, dn, H5T_NATIVE_CHAR, _dn); +} diff --git a/tests/AMSlib/db/hdf5_store.cpp b/tests/AMSlib/db/hdf5_store.cpp new file mode 100644 index 00000000..7b18d050 --- /dev/null +++ b/tests/AMSlib/db/hdf5_store.cpp @@ -0,0 +1,223 @@ +#include +#include +#include + +#include +#include +#include +#include + +#include "wf/basedb.hpp" + +template +int testReadHDF5Dataset(const std::string& filePath, + const std::string& datasetName, + hid_t DataType, + std::vector correct_contents) +{ + // Open the HDF5 file + hid_t file_id = H5Fopen(filePath.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); + if (file_id < 0) { + std::cerr << "Failed to open HDF5 file: " << filePath << std::endl; + return -1; + } + + // Open the dataset + hid_t dataset_id = H5Dopen(file_id, datasetName.c_str(), H5P_DEFAULT); + if (dataset_id < 0) { + std::cerr << "Failed to open dataset: " << datasetName << std::endl; + H5Fclose(file_id); + return -1; + } + + // Get the dataspace of the dataset + hid_t dataspace_id = H5Dget_space(dataset_id); + if (dataspace_id < 0) { + std::cerr << "Failed to get dataspace for dataset: " << datasetName + << std::endl; + H5Dclose(dataset_id); + H5Fclose(file_id); + return -1; + } + + // Get the number of dimensions and size of each dimension + int ndims = H5Sget_simple_extent_ndims(dataspace_id); + std::vector dims(ndims); + H5Sget_simple_extent_dims(dataspace_id, dims.data(), nullptr); + + // Print dimensions + for (size_t i = 0; i < dims.size(); ++i) { + std::cout << dims[i] << (i < dims.size() - 1 ? " x " : "\n"); + } + + // Determine the datatype of the dataset + hid_t datatype_id = H5Dget_type(dataset_id); + // Get the size of the datatype + size_t datatype_size = H5Tget_size(datatype_id); + + + // Only handle floating-point data for this example + std::vector data; + if (datatype_size == sizeof(T)) { + // Allocate memory for the dataset + size_t total_elements = 1; + for (auto dim : dims) { + total_elements *= dim; + } + data.resize(total_elements); + // Read the dataset + if (H5Dread( + dataset_id, DataType, H5S_ALL, H5S_ALL, H5P_DEFAULT, data.data()) < + 0) + std::cerr << "Failed to read dataset: " << datasetName << std::endl; + } else { + std::cerr << "Unsupported data type for dataset: " << datasetName + << std::endl; + return -1; + } + + // Close HDF5 objects + H5Tclose(datatype_id); + H5Sclose(dataspace_id); + H5Dclose(dataset_id); + H5Fclose(file_id); + std::cout << "Read: " << std::string(data.begin(), data.end()); + return (data == correct_contents) ? 0 : -1; +} + + +#include +#include + +#include +#include +#include + +// Function to read a dataset and compare it with the expected tensor +bool verifyDatasetContents(const std::string& fileName, + const std::string& datasetName, + const std::vector& expectedTensors) +{ + // Open the HDF5 file + hid_t file_id = H5Fopen(fileName.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); + if (file_id < 0) { + throw std::runtime_error("Failed to open HDF5 file."); + } + + // Open the dataset + hid_t dset_id = H5Dopen2(file_id, datasetName.c_str(), H5P_DEFAULT); + if (dset_id < 0) { + H5Fclose(file_id); + throw std::runtime_error("Failed to open dataset."); + } + + // Get the dataspace + hid_t space_id = H5Dget_space(dset_id); + if (space_id < 0) { + H5Dclose(dset_id); + H5Fclose(file_id); + throw std::runtime_error("Failed to get dataspace."); + } + + // Get the dataset dimensions + int ndims = H5Sget_simple_extent_ndims(space_id); + if (ndims < 0) { + H5Sclose(space_id); + H5Dclose(dset_id); + H5Fclose(file_id); + throw std::runtime_error("Failed to get number of dimensions."); + } + + std::vector dims(ndims); + if (H5Sget_simple_extent_dims(space_id, dims.data(), NULL) < 0) { + H5Sclose(space_id); + H5Dclose(dset_id); + H5Fclose(file_id); + throw std::runtime_error("Failed to get dataset dimensions."); + } + + // Close dataspace + H5Sclose(space_id); + + // Flatten the dataset dimensions into a total size + size_t totalSize = 1; + for (const auto& dim : dims) { + totalSize *= dim; + } + + // Allocate a tensor to read the dataset + auto readTensor = + torch::empty({static_cast(totalSize)}, torch::kFloat); + + // Read the dataset into the tensor + herr_t status = H5Dread(dset_id, + H5T_NATIVE_FLOAT, + H5S_ALL, + H5S_ALL, + H5P_DEFAULT, + readTensor.data_ptr()); + if (status < 0) { + H5Dclose(dset_id); + H5Fclose(file_id); + throw std::runtime_error("Failed to read dataset."); + } + + // Close dataset and file + H5Dclose(dset_id); + H5Fclose(file_id); + + // Concatenate all expected tensors into one + auto expectedTensor = torch::cat(expectedTensors).flatten(); + + // Compare the tensors + if (!torch::allclose(readTensor, expectedTensor)) { + throw std::runtime_error( + "Dataset contents do not match the expected tensors."); + } + + std::cout << "Dataset contents match the expected tensors!" << std::endl; + return true; +} + + +int main(int argc, char* argv[]) +{ + if (argc != 4) { + std::cerr << "Wrong command line, correct one should be:\n"; + std::cerr << argv[0] + << " "; + } + std::string directory(argv[1]); + std::string domain_name(argv[2]); + std::string file_prefix(argv[3]); + std::string filename; + + std::vector inputTensors, outputTensors; + for (int i = 0; i < 2; i++) { + { + // Scope it to automatically close C++ deconstructor and close file + auto db = ams::db::hdf5DB(directory, domain_name, file_prefix, 0); + torch::Tensor IData = + torch::rand({21, 4}, torch::TensorOptions().dtype(torch::kFloat)); + torch::Tensor OData = + torch::rand({21, 4}, torch::TensorOptions().dtype(torch::kFloat)); + + // Test 1. Open file and write data to it. + filename = db.getFilename(); + db.store(IData, OData); + inputTensors.emplace_back(std::move(IData)); + outputTensors.emplace_back(std::move(OData)); + } + if (!verifyDatasetContents(filename, "input_data", inputTensors) || + !verifyDatasetContents(filename, "output_data", outputTensors)) + return -1; + std::cout << ((i == 0) ? "Creating empty file and checking contents is " + "correct\n" + : "Opening existing file and checking contents is " + "correct\n"); + } + + std::string dn("domain_name"); + std::vector _dn(domain_name.begin(), domain_name.end()); + return testReadHDF5Dataset(filename, dn, H5T_NATIVE_CHAR, _dn); +} diff --git a/tests/AMSlib/torch/CMakeLists.txt b/tests/AMSlib/torch/CMakeLists.txt index a37d58d3..8c8c7d71 100644 --- a/tests/AMSlib/torch/CMakeLists.txt +++ b/tests/AMSlib/torch/CMakeLists.txt @@ -17,7 +17,7 @@ function(BUILD_UNIT_TEST exe source) target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) - target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs) + target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS) target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) @@ -82,10 +82,10 @@ endif() -BUILD_UNIT_TEST(ams_verify_dtype "verify_dtype.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/ml/surrogate.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/logger.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/debug.cpp") -BUILD_UNIT_TEST(ams_verify_device "verify_device.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/ml/surrogate.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/logger.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/debug.cpp") -BUILD_UNIT_TEST(ams_evaluate_model "evaluate_model.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/ml/surrogate.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/logger.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/debug.cpp") -BUILD_UNIT_TEST(ams_convert_and_evaluate_model "evalute_model_conversions.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/ml/surrogate.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/logger.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/wf/debug.cpp;${CMAKE_SOURCE_DIR}/src/AMSlib/util/SmallVector.cpp;") +BUILD_UNIT_TEST(ams_verify_dtype verify_dtype.cpp) +BUILD_UNIT_TEST(ams_verify_device verify_device.cpp) +BUILD_UNIT_TEST(ams_evaluate_model evaluate_model.cpp) +BUILD_UNIT_TEST(ams_convert_and_evaluate_model evalute_model_conversions.cpp) #detect datatype ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Random ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt) From 79c48dc947c099c952f5c8cafdc87ded5b52a667 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 12 Dec 2024 07:35:03 -0800 Subject: [PATCH 009/136] Simple test for db manager --- tests/AMSlib/db/CMakeLists.txt | 2 ++ tests/AMSlib/db/db_manager_hdf5.cpp | 47 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 tests/AMSlib/db/db_manager_hdf5.cpp diff --git a/tests/AMSlib/db/CMakeLists.txt b/tests/AMSlib/db/CMakeLists.txt index c9f09ab1..c107b40b 100644 --- a/tests/AMSlib/db/CMakeLists.txt +++ b/tests/AMSlib/db/CMakeLists.txt @@ -26,7 +26,9 @@ endfunction() if (WITH_HDF5) BUILD_UNIT_TEST(hdf5_create hdf5_open.cpp) BUILD_UNIT_TEST(hdf5_store hdf5_store.cpp) +BUILD_UNIT_TEST(db_manager_hdf5 db_manager_hdf5.cpp) ADD_HDF5_UNIT_TEST(DB::HDF5::CREATE COMMAND bash -c "rm -f ${CMAKE_CURRENT_BINARY_DIR}/create_test*.h5\;${CMAKE_CURRENT_BINARY_DIR}/hdf5_create ${CMAKE_CURRENT_BINARY_DIR} test create_test") ADD_HDF5_UNIT_TEST(DB::HDF5::STORE COMMAND bash -c "rm -f ${CMAKE_CURRENT_BINARY_DIR}/store_test*.h5\;${CMAKE_CURRENT_BINARY_DIR}/hdf5_store ${CMAKE_CURRENT_BINARY_DIR} test store_test") +ADD_HDF5_UNIT_TEST(DB::HDF5::DBManager COMMAND bash -c "rm -f ${CMAKE_CURRENT_BINARY_DIR}/domain_*.h5\;${CMAKE_CURRENT_BINARY_DIR}/db_manager_hdf5 ${CMAKE_CURRENT_BINARY_DIR}/") endif() diff --git a/tests/AMSlib/db/db_manager_hdf5.cpp b/tests/AMSlib/db/db_manager_hdf5.cpp new file mode 100644 index 00000000..511d5bd5 --- /dev/null +++ b/tests/AMSlib/db/db_manager_hdf5.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +#include "wf/basedb.hpp" + +int main(int argc, char* argv[]) +{ + if (argc != 2) { + std::cout << "Wrong command line argument :\n"; + std::cout << argv[0] << " \n"; + return -1; + } + std::string db_path(argv[1]); + auto& db_instance = ams::db::DBManager::getInstance(); + db_instance.instantiate_fs_db(AMSDBType::AMS_HDF5, db_path); + for (auto dn : {std::string("domain_1"), + std::string("domain_2"), + std::string("domain_1"), + std::string("domain_2")}) { + auto file_db = db_instance.getDB(dn, dn); + } + + if (db_instance.getNumInstances() != 2) { + std::cout << "Wrong number of instances\n"; + return -1; + } + + // This is done to internally call the de-constructors of the respective DB. + db_instance.clean(); + if (db_instance.getNumInstances() != 0) { + std::cout << "DB Instances did not reset \n"; + return -1; + } + + for (auto dn : {std::string("domain_1"), std::string("domain_2")}) { + auto fn = db_path + dn + "_0.h5"; + + if (!std::filesystem::exists(fn)) { + std::cout << "File " << fn << "does not exists.\n"; + return -1; + } + } + + return 0; +} From ad6dfeb8994442293cddcb741c6eb3011022db95 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 12 Dec 2024 17:20:17 -0800 Subject: [PATCH 010/136] Added tensor aware workflow --- src/AMSlib/ml/surrogate.hpp | 4 +- src/AMSlib/wf/workflow.hpp | 472 +++++++++------------- tests/AMSlib/CMakeLists.txt | 1 + tests/AMSlib/wf/CMakeLists.txt | 52 +++ tests/AMSlib/wf/domain_to_application.cpp | 97 +++++ tests/AMSlib/wf/subselect_tensors.cpp | 58 +++ 6 files changed, 410 insertions(+), 274 deletions(-) create mode 100644 tests/AMSlib/wf/CMakeLists.txt create mode 100644 tests/AMSlib/wf/domain_to_application.cpp create mode 100644 tests/AMSlib/wf/subselect_tensors.cpp diff --git a/src/AMSlib/ml/surrogate.hpp b/src/AMSlib/ml/surrogate.hpp index dce56a9e..50f17c24 100644 --- a/src/AMSlib/ml/surrogate.hpp +++ b/src/AMSlib/ml/surrogate.hpp @@ -92,12 +92,12 @@ class SurrogateModel std::tuple _evaluate(torch::Tensor& inputs, AMSUQPolicy policy, - float threshold); + const float threshold); std::tuple evaluate( ams::MutableArrayRef Inputs, AMSUQPolicy policy, - float threshold); + const float threshold); inline bool is_gpu() const diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index f45c048a..311d4ff4 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -8,18 +8,20 @@ #ifndef __AMS_WORKFLOW_HPP__ #define __AMS_WORKFLOW_HPP__ +#include + +#include +#include + #include "debug.h" #ifdef __AMS_ENABLE_CALIPER__ #include #endif -#include -#include -#include -#include +#include #include "AMS.h" -#include "ml/uq.hpp" +#include "ml/surrogate.hpp" #include "resource_manager.hpp" #include "util/ArrayRef.hpp" #include "util/SmallVector.hpp" @@ -41,18 +43,11 @@ //! ---------------------------------------------------------------------------- namespace ams { -template class AMSWorkflow { - static_assert(std::is_floating_point::value, - "HDCache supports floating-point values (floats, doubles, and " - "long doubles) only!"); - - using data_handler = ams::DataHandler; - /** @brief The application call back to perform the original SPMD physics - * execution */ + * execution */ AMSPhysicFn AppCall; /** @brief A string identifier describing the domain-model being solved. */ @@ -62,20 +57,20 @@ class AMSWorkflow std::string dbLabel; /** @brief The module that performs uncertainty quantification (UQ) */ - std::unique_ptr> UQModel; + std::shared_ptr MLModel; /** The metric/type of UQ we will use to select between physics and ml computations **/ const AMSUQPolicy uqPolicy = AMSUQPolicy::AMS_UQ_END; /** @brief The database to store data for which we cannot apply the current - * model */ + * model */ std::shared_ptr DB; /** @brief The process id. For MPI runs this is the rank */ const int rId; /** @brief The total number of processes participating in the simulation - * (world_size for MPI) */ + * (world_size for MPI) */ int wSize; /** @brief Location of the original application data (CPU or GPU) */ @@ -84,6 +79,10 @@ class AMSWorkflow /** @brief execution policy of the distributed system. Load balance or not. */ AMSExecPolicy ePolicy; + + /** @brief The maximum distance of the predicate for a sample prediction to be considered as valid **/ + const float threshold; + #ifdef __ENABLE_MPI__ /** @brief MPI Communicator for all ranks that call collectively the evaluate function **/ MPI_Comm comm; @@ -93,85 +92,43 @@ class AMSWorkflow bool isDistributed; /** \brief Store the data in the database and copies - * data from the GPU to the CPU and then to the database. - * To store GPU resident data we use a 1MB of "pinned" - * memory as a buffer - * @param[in] num_elements Number of elements of each 1-D vector - * @param[in] inputs vector to 1-D vectors storing num_elements - * items to be stored in the database - * @param[in] outputs vector to 1-D vectors storing num_elements - * items to be stored in the database - */ - void store(size_t num_elements, - std::vector &inputs, - std::vector &outputs, - bool *predicate = nullptr) + * data from the GPU to the CPU and then to the database. + * To store GPU resident data we use a 1MB of "pinned" + * memory as a buffer + * @param[in] num_elements Number of elements of each 1-D vector + * @param[in] inputs vector to 1-D vectors storing num_elements + * items to be stored in the database + * @param[in] outputs vector to 1-D vectors storing num_elements + * items to be stored in the database + */ + void store(ArrayRef Inputs, ArrayRef Outputs) { - // 1 MB of buffer size; - // TODO: Fix magic number - // TODO: This is likely not efficient for RabbitMQ backend at scale - // We could just linearize the whole input+output and do one send (or two) per cycle - static const long bSize = 1 * 1024 * 1024; - const int numIn = inputs.size(); - const int numOut = outputs.size(); - auto &rm = ams::ResourceManager::getInstance(); - - // No database, so just de-allocate and return if (!DB) return; - std::vector hInputs, hOutputs; - bool *hPredicate = nullptr; - + c10::SmallVector ConvertedInputs(Inputs.begin(), + Inputs.end()); + c10::SmallVector ConvertedOutputs(Outputs.begin(), + Outputs.end()); + auto Input = torch::cat(ConvertedInputs, Inputs[0].sizes().size() - 1); + auto Output = torch::cat(ConvertedOutputs, Outputs[0].sizes().size() - 1); + // No database, so just de-allocate and return if (appDataLoc == AMSResourceType::AMS_HOST) { - return DB->store(num_elements, inputs, outputs, predicate); - } - - for (int i = 0; i < inputs.size(); i++) { - FPTypeValue *pPtr = - rm.allocate(num_elements, AMSResourceType::AMS_HOST); - rm.copy(inputs[i], AMS_DEVICE, pPtr, AMS_HOST, num_elements); - hInputs.push_back(pPtr); - } - - for (int i = 0; i < outputs.size(); i++) { - FPTypeValue *pPtr = - rm.allocate(num_elements, AMSResourceType::AMS_HOST); - rm.copy(outputs[i], AMS_DEVICE, pPtr, AMS_HOST, num_elements); - hOutputs.push_back(pPtr); - } - - if (predicate) { - hPredicate = rm.allocate(num_elements, AMSResourceType::AMS_HOST); - rm.copy(predicate, AMS_DEVICE, hPredicate, AMS_HOST, num_elements); + return DB->store(Input, Output); } + if (Input.device() == c10::DeviceType::CUDA) Input = Input.cpu(); + if (Output.device() == c10::DeviceType::CUDA) Output = Output.cpu(); // Store to database - DB->store(num_elements, hInputs, hOutputs, hPredicate); - rm.deallocate(hInputs, AMSResourceType::AMS_HOST); - rm.deallocate(hOutputs, AMSResourceType::AMS_HOST); - if (predicate) rm.deallocate(hPredicate, AMSResourceType::AMS_HOST); + DB->store(Input, Output); return; } - void store(size_t num_elements, - std::vector &inputs, - std::vector &outputs, - bool *predicate = nullptr) - { - std::vector mInputs; - for (auto I : inputs) { - mInputs.push_back(const_cast(I)); - } - - store(num_elements, mInputs, outputs, predicate); - } - /** \brief Check if we can perform a surrogate model update. - * AMS can update surrogate model only when all MPI ranks have received - * the latest model from RabbitMQ. - * @return True if surrogate model can be updated - */ + * AMS can update surrogate model only when all MPI ranks have received + * the latest model from RabbitMQ. + * @return True if surrogate model can be updated + */ bool updateModel() { if (!DB || !DB->allowModelUpdate()) return false; @@ -186,27 +143,14 @@ class AMSWorkflow } public: - AMSWorkflow() - : AppCall(nullptr), - DB(nullptr), - appDataLoc(AMSResourceType::AMS_HOST), -#ifdef __ENABLE_MPI__ - comm(MPI_COMM_NULL), -#endif - ePolicy(AMSExecPolicy::AMS_UBALANCED) - { - } - AMSWorkflow(AMSPhysicFn _AppCall, - std::string &uq_path, std::string &surrogate_path, std::string &domain_name, std::string &db_label, bool isDebugDB, AMSResourceType app_data_loc, - FPTypeValue threshold, + float threshold, const AMSUQPolicy uq_policy, - const int nClusters, int _pId = 0, int _wSize = 1) : AppCall(_AppCall), @@ -219,14 +163,16 @@ class AMSWorkflow #ifdef __ENABLE_MPI__ comm(MPI_COMM_NULL), #endif + threshold(threshold), ePolicy(AMSExecPolicy::AMS_UBALANCED) { DB = nullptr; auto &dbm = ams::db::DBManager::getInstance(); - DB = dbm.getDB(domainName, dbLabel, rId, isDebugDB); - UQModel = std::make_unique>( - appDataLoc, uqPolicy, uq_path, nClusters, surrogate_path, threshold); + DB = dbm.getDB(domainName, dbLabel, rId); + MLModel = nullptr; + if (!surrogate_path.empty()) + MLModel = SurrogateModel::getInstance(surrogate_path); } void set_physics(AMSPhysicFn _AppCall) { AppCall = _AppCall; } @@ -246,96 +192,120 @@ class AMSWorkflow #endif } + + static SmallVector subSelectTensors(ArrayRef Tensors, + at::Tensor &Mask) + { + SmallVector NewVector; + for (auto O : Tensors) { + NewVector.push_back(O.index({Mask})); + } + return NewVector; + } + + static void ScatterPhysicOutputsToOrigDomain( + ArrayRef ComputedTensors, + torch::Tensor &Predicate, + ArrayRef AppTensors) + { + if (ComputedTensors.size() != AppTensors.size()) { + throw std::runtime_error( + "Expecting equal sized tensors when composing Original and domain " + "memories\n"); + } + for (int i = 0; i < ComputedTensors.size(); i++) { + AppTensors[i].masked_scatter_(Predicate, ComputedTensors[i]); + } + } + + + static int MLDomainToApplication(at::Tensor Src, + MutableArrayRef Dest, + at::Tensor Predicate, + int offset) + { + int outerDim = Src.dim() - 1; + for (auto &dst : Dest) { + int ConcatAxisSize = dst.sizes()[dst.dim() - 1]; + at::Tensor Slice = + Src.narrow(outerDim, offset, ConcatAxisSize).to(dst.options()); + dst.index_put_({Predicate}, Slice.index({Predicate})); + offset += ConcatAxisSize; + } + return offset; + } + + ~AMSWorkflow() { DBG(Workflow, "Destroying Workflow Handler"); } /** @brief This is the main entry point of AMSLib and replaces the original - * execution path of the application. - * @param[in] probDescr an opaque type that will be forwarded to the - * application upcall - * @param[in] totalElements the total number of elements to apply the SPMD - * function on - * @param[in] inputs the inputs of the computation. - * @param[out] outputs the computed outputs. - * @param[in] Comm The MPI Communicatotor for all ranks participating in the - * SPMD execution. - * - * @details The function corresponds to the main driver of the AMSLib. - * Assuming an original 'foo' function void foo ( void *cls, int numElements, - * void **inputs, void **outputs){ parallel_for(I : numElements){ - * cls->physics(inputs[0][I], outputs[0][I]); - * } - * } - * - * The AMS transformation would functionaly look like this: - * void AMSfoo ( void *cls, int numElements, void **inputs, void **outputs){ - * parallel_for(I : numElements){ - * if ( UQ (I) ){ - * Surrogate(inputs[0][I], outputs[0][I]) - * } - * else{ - * cls->physics(inputs[0][I], outputs[0][I]); - * DB->Store(inputs[0][I], outputs[0][I]); - * } - * } - * } - * - * Yet, AMS assumes a SPMD physics function (in the example cls->physics). - * Therefore, the AMS transformation is taking place at the level of the SPMD - * execution. The following transformation is equivalent void AMSfoo( void - * *cls, int numElements, void **inputs, void **outputs){ predicates = - * UQ(inputs, numElements); modelInputs, physicsInputs = partition(predicates, - * inputs); modelOuputs, physicsOutputs = partition(predicates, output); - * foo(cls, physicsInputs.size(), physicsInputs, physicsOutputs); - * surrogate(modelInputs, modelOuputs, modelOuputs.size()); - * DB->Store(physicsInputs, physicsOutputs); - * concatenate(outptuts, modelOuputs, predicate); - * } - * - * This transformation can exploit the parallel nature of all the required - * steps. - */ + * execution path of the application. + * @param[in] probDescr an opaque type that will be forwarded to the + * application upcall + * @param[in] totalElements the total number of elements to apply the SPMD + * function on + * @param[in] inputs the inputs of the computation. + * @param[out] outputs the computed outputs. + * @param[in] Comm The MPI Communicatotor for all ranks participating in the + * SPMD execution. + * + * @details The function corresponds to the main driver of the AMSLib. + * Assuming an original 'foo' function void foo ( void *cls, int numElements, + * void **inputs, void **outputs){ parallel_for(I : numElements){ + * cls->physics(inputs[0][I], outputs[0][I]); + * } + * } + * + * The AMS transformation would functionaly look like this: + * void AMSfoo ( void *cls, int numElements, void **inputs, void **outputs){ + * parallel_for(I : numElements){ + * if ( UQ (I) ){ + * Surrogate(inputs[0][I], outputs[0][I]) + * } + * else{ + * cls->physics(inputs[0][I], outputs[0][I]); + * DB->Store(inputs[0][I], outputs[0][I]); + * } + * } + * } + * + * Yet, AMS assumes a SPMD physics function (in the example cls->physics). + * Therefore, the AMS transformation is taking place at the level of the SPMD + * execution. The following transformation is equivalent void AMSfoo( void + * *cls, int numElements, void **inputs, void **outputs){ predicates = + * UQ(inputs, numElements); modelInputs, physicsInputs = partition(predicates, + * inputs); modelOuputs, physicsOutputs = partition(predicates, output); + * foo(cls, physicsInputs.size(), physicsInputs, physicsOutputs); + * surrogate(modelInputs, modelOuputs, modelOuputs.size()); + * DB->Store(physicsInputs, physicsOutputs); + * concatenate(outptuts, modelOuputs, predicate); + * } + * + * This transformation can exploit the parallel nature of all the required + * steps. + */ void evaluate(void *probDescr, - const int totalElements, - const FPTypeValue **inputs, - FPTypeValue **outputs, - int inputDim, - int outputDim) + ams::MutableArrayRef Ins, + ams::MutableArrayRef InOuts, + ams::MutableArrayRef Outs) { CALIPER(CALI_MARK_BEGIN("AMSEvaluate");) - CDEBUG(Workflow, - rId == 0, - "Entering Evaluate " - "with problem dimensions [(%d, %d, %d, %d)]", - totalElements, - inputDim, - totalElements, - outputDim); - // To move around the inputs, outputs we bundle them as std::vectors - std::vector origInputs(inputs, inputs + inputDim); - std::vector origOutputs(outputs, outputs + outputDim); - auto &rm = ams::ResourceManager::getInstance(); + SmallVector InputTensors(Ins.begin(), Ins.end()); + SmallVector OutputTensors(Ins.begin(), Ins.end()); + for (auto Tensor : InOuts) { + InputTensors.push_back(Tensor); + OutputTensors.push_back(Tensor); + } + + // Here we create a copy of the inputs/outputs. This is "necessary". To correctly handle + // input-output cases and to also to set them to right precision. REPORT_MEM_USAGE(Workflow, "Start") - if (!UQModel->hasSurrogate()) { - FPTypeValue **tmpInputs = const_cast(inputs); - - std::vector tmpIn(tmpInputs, tmpInputs + inputDim); - DBG(Workflow, "No-Model, I am calling Physics code (for all data)"); - CALIPER(CALI_MARK_BEGIN("PHYSICS MODULE");) - AppCall(probDescr, - totalElements, - reinterpret_cast(origInputs.data()), - reinterpret_cast(origOutputs.data())); - CALIPER(CALI_MARK_END("PHYSICS MODULE");) - if (DB) { - CALIPER(CALI_MARK_BEGIN("DBSTORE");) - store(totalElements, tmpIn, origOutputs); - CALIPER(CALI_MARK_END("DBSTORE");) - } - CALIPER(CALI_MARK_END("AMSEvaluate");) - return; + if (!MLModel) { + // FIXME This needs to be updated accordingly and call the new interface. + throw std::runtime_error("Pending implementation\n"); } CALIPER(CALI_MARK_BEGIN("UPDATEMODEL");) @@ -345,133 +315,91 @@ class AMSWorkflow rId == 0, "Updating surrogate model with %s", model.c_str()) - UQModel->updateModel(model); + // UQModel->updateModel(model); } CALIPER(CALI_MARK_END("UPDATEMODEL");) - // The predicate with which we will split the data on a later step - bool *predicate = rm.allocate(totalElements, appDataLoc); - // ------------------------------------------------------------- - // STEP 1: call the UQ module to look at input uncertainties - // to decide if making a ML inference makes sense + // STEP 1: call the ML Model to get both the prediction and the predicates. // ------------------------------------------------------------- - CALIPER(CALI_MARK_BEGIN("UQ_MODULE");) - UQModel->evaluate(totalElements, origInputs, origOutputs, predicate); - CALIPER(CALI_MARK_END("UQ_MODULE");) + CALIPER(CALI_MARK_BEGIN("SURROGATE");) + // The predicate with which we will split the data on a lateMLInputsr step + auto [MLOutputs, Predicate] = + MLModel->evaluate(InputTensors, uqPolicy, threshold); - DBG(Workflow, "Computed Predicates") + CALIPER(CALI_MARK_END("SURROGATE");) - // Pointer values which store input data values - // to be computed using the eos function. - std::vector packedInputs; + //Copy out the results of the ML Model to the correct indices, this needs to happen + CALIPER(CALI_MARK_BEGIN("MLDomainToApplication");) + int offset = MLDomainToApplication(MLOutputs, Outs, Predicate, 0); + MLDomainToApplication(MLOutputs, InOuts, Predicate, offset); + CALIPER(CALI_MARK_END("MLDomainToApplication");) - for (int i = 0; i < inputDim; i++) { - packedInputs.emplace_back( - rm.allocate(totalElements, appDataLoc)); - } - DBG(Workflow, "Allocated input resources") + if (Predicate.sum().item() == 0) return; + // Revert pedicates and use it to pick the Physic points outputs. + auto WrongMLIndices = torch::logical_not(Predicate); - // ----------------------------------------------------------------- - // STEP 3: call physics module only where predicate = false - // ----------------------------------------------------------------- - // ---- 3a: we need to pack the sparse data based on the uq flag + // Physis* tensors have the points which the model could not accurately predict CALIPER(CALI_MARK_BEGIN("PACK");) - const long packedElements = data_handler::pack( - appDataLoc, predicate, totalElements, origInputs, packedInputs); + SmallVector PhysicIns(subSelectTensors(Ins, WrongMLIndices)); + SmallVector PhysicInOuts( + subSelectTensors(InOuts, WrongMLIndices)); + // TODO: Outs does not need sub select, we will write all of these from scratch + SmallVector PhysicOuts(subSelectTensors(Outs, WrongMLIndices)); CALIPER(CALI_MARK_END("PACK");) - // Pointer values which store output data values - // to be computed using the eos function. - std::vector packedOutputs; - for (int i = 0; i < outputDim; i++) { - packedOutputs.emplace_back( - rm.allocate(packedElements, appDataLoc)); - } - - { - void **iPtr = reinterpret_cast(packedInputs.data()); - void **oPtr = reinterpret_cast(packedOutputs.data()); - long lbElements = packedElements; + // Copy and clone. This important to take place before AppCall is executed. To keep a copy of the input values + // that will be overwritten. + SmallVector PhysicInOutsBefore; + for (auto S : PhysicInOuts) + PhysicInOutsBefore.push_back(S.clone()); - // FIXME: I don't like the way we separate code here. - // Simple modification can make it easier to read. - // if (should_load_balance) -> Code for load balancing - // else -> current code -#ifdef __ENABLE_MPI__ - CALIPER(CALI_MARK_BEGIN("LOAD BALANCE MODULE");) - AMSLoadBalancer lBalancer(rId, wSize, packedElements, comm); - if (should_load_balance()) { - lBalancer.init(inputDim, outputDim, appDataLoc); - lBalancer.scatterInputs(packedInputs, appDataLoc); - iPtr = reinterpret_cast(lBalancer.inputs()); - oPtr = reinterpret_cast(lBalancer.outputs()); - lbElements = lBalancer.getBalancedSize(); - } - CALIPER(CALI_MARK_END("LOAD BALANCE MODULE");) -#endif + // We call the application here + CALIPER(CALI_MARK_BEGIN("PHYSICS MODULE");) + //AppCall(probDescr, PhysicIns, PhysicInOuts, PhysicOuts); +#warning put back in when interface is clean. + CALIPER(CALI_MARK_END("PHYSICS MODULE");) - // ---- 3b: call the physics module and store in the data base - if (packedElements > 0) { - CALIPER(CALI_MARK_BEGIN("PHYSICS MODULE");) - AppCall(probDescr, lbElements, iPtr, oPtr); - CALIPER(CALI_MARK_END("PHYSICS MODULE");) - } -#ifdef __ENABLE_MPI__ - CALIPER(CALI_MARK_BEGIN("LOAD BALANCE MODULE");) - if (should_load_balance()) { - lBalancer.gatherOutputs(packedOutputs, appDataLoc); - } - CALIPER(CALI_MARK_END("LOAD BALANCE MODULE");) -#endif - } - - // ---- 3c: unpack the data CALIPER(CALI_MARK_BEGIN("UNPACK");) - data_handler::unpack( - appDataLoc, predicate, totalElements, packedOutputs, origOutputs); + // Copy out the computation results to the original tensors/buffers + ScatterPhysicOutputsToOrigDomain(PhysicOuts, WrongMLIndices, Outs); + ScatterPhysicOutputsToOrigDomain(PhysicInOuts, WrongMLIndices, InOuts); CALIPER(CALI_MARK_END("UNPACK");) + DBG(Workflow, "Finished physics evaluation") if (DB) { CALIPER(CALI_MARK_BEGIN("DBSTORE");) - if (!DB->storePredicate()) { - DBG(Workflow, - "Storing data (#elements = %d) to database", - packedElements); - store(packedElements, packedInputs, packedOutputs); - } else { - DBG(Workflow, - "Storing data (#elements = %d) to database including predicates", - totalElements); - store(totalElements, origInputs, origOutputs, predicate); + SmallVector StoreInputTensors(PhysicIns.begin(), + PhysicIns.end()); + SmallVector StoreOutputTensors(PhysicOuts.begin(), + PhysicOuts.end()); + for (auto Tensor : PhysicInOutsBefore) + StoreInputTensors.push_back(Tensor); + for (auto Tensor : PhysicInOuts) { + StoreOutputTensors.push_back(Tensor); } + DBG(Workflow, + "Storing data (#elements = %ld) to database", + StoreInputTensors[0].sizes()[0]); + store(StoreInputTensors, StoreOutputTensors); CALIPER(CALI_MARK_END("DBSTORE");) } - // ----------------------------------------------------------------- - // Deallocate temporal data - // ----------------------------------------------------------------- - for (int i = 0; i < inputDim; i++) - rm.deallocate(packedInputs[i], appDataLoc); - for (int i = 0; i < outputDim; i++) - rm.deallocate(packedOutputs[i], appDataLoc); - - rm.deallocate(predicate, appDataLoc); DBG(Workflow, "Finished AMSExecution") CINFO(Workflow, rId == 0, "Computed %ld " "using physics out of the %ld items (%.2f)", - packedElements, - totalElements, - (float)(packedElements) / float(totalElements)) + PhysicIns[0].sizes()[0], + InputTensors[0].sizes()[0], + (float)(PhysicIns[0].sizes()[0]) / float(InputTensors[0].sizes()[0])); REPORT_MEM_USAGE(Workflow, "End") CALIPER(CALI_MARK_END("AMSEvaluate");) diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index f2e7a685..b4e3d3e3 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -310,4 +310,5 @@ add_subdirectory(torch) add_subdirectory(db) +add_subdirectory(wf) # add_test(NAME AMSEndToEndFromJSON::Random10::Random50::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_random_50") diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt new file mode 100644 index 00000000..810ef162 --- /dev/null +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -0,0 +1,52 @@ +function(ADD_WORKFLOW_UNIT_TEST name exec) + add_test(NAME ${name} COMMAND ${exec} ${ARGN}) + set_tests_properties(${name} PROPERTIES LABELS WORKFLOW_UNIT_TEST) +endfunction() + +function(BUILD_UNIT_TEST exe source) + add_executable(${exe} ${source}) + + target_include_directories(${exe} PRIVATE ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) + target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) + target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) + target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) + target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS) + + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) + + if(WITH_CUDA) + set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") + set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) + set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) + + target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") + endif() +endfunction() + +function(ADD_HDF5_UNIT_TEST name exec) + add_test(NAME ${name} COMMAND ${exec} ${ARGN}) + set_tests_properties(${name} PROPERTIES LABELS WORKFLOW_UNIT_TEST) +endfunction() + +BUILD_UNIT_TEST(domain_to_application domain_to_application.cpp) +BUILD_UNIT_TEST(subselect_tensors subselect_tensors.cpp) + +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::FLOAT::FLOAT domain_to_application float float cpu) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::DOUBLE::FLOAT domain_to_application double float cpu) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::FLOAT::DOUBLE domain_to_application float double cpu) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::DOUBLE::DOUBLE domain_to_application double double cpu) + + +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Double subselect_tensors double cpu) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Float subselect_tensors float cpu) + +if (ENABLE_CUDA) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::FLOAT::FLOAT domain_to_application float float cuda) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::DOUBLE::FLOAT domain_to_application double float cuda) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::FLOAT::DOUBLE domain_to_application float double cuda) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::DOUBLE::DOUBLE domain_to_application double double cuda) + +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Double subselect_tensors double cuda) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Float subselect_tensors float cuda) +endif() + diff --git a/tests/AMSlib/wf/domain_to_application.cpp b/tests/AMSlib/wf/domain_to_application.cpp new file mode 100644 index 00000000..105d5981 --- /dev/null +++ b/tests/AMSlib/wf/domain_to_application.cpp @@ -0,0 +1,97 @@ +#include +#include +#include +#include + +#include +#include +#include + +#include "wf/workflow.hpp" + +std::vector generateRandomVector(int target_sum, int size) +{ + if (target_sum < size) { + throw std::invalid_argument( + "Target sum must be at least equal to the size of the vector."); + } + + std::vector result( + size, 1); // Start with each element as 1 (minimum positive integer). + target_sum -= + size; // Reduce the remaining sum by the size (since all elements are 1). + + std::random_device rd; + std::mt19937 gen(0); + std::uniform_int_distribution<> dis(0, target_sum); + + // Generate random values and distribute the remaining sum + for (int i = 0; i < target_sum; ++i) { + int index = dis(gen) % size; // Pick a random index + ++result[index]; // Increment the value at the chosen index + } + + // Shuffle the vector for more randomness + std::shuffle(result.begin(), result.end(), gen); + + return result; +} + + +int main(int argc, char *argv[]) +{ + + if (argc != 4) { + std::cout << "Wrong command line\n"; + std::cout << argv[0] + << " \n"; + return -1; + } + torch::Dtype mlDType = torch::kFloat32; + torch::Dtype phDType = torch::kFloat32; + torch::DeviceType dev = c10::DeviceType::CPU; + + std::string mlType(argv[1]); + std::string phType(argv[2]); + std::string device(argv[3]); + + + if (mlType.compare("double") == 0) { + mlDType = torch::kFloat64; + } + + if (phType.compare("double") == 0) phDType = torch::kFloat64; + + if (device.compare("cuda") == 0) dev = c10::DeviceType::CUDA; + + torch::Tensor Src = + torch::rand({32, 11}, torch::TensorOptions().dtype(mlDType).device(dev)); + auto shapes = generateRandomVector(11, 8); + ams::SmallVector Dest; + auto tmp = torch::arange(0, 32, torch::kInt64) % 2; + auto Predicate = tmp.to(torch::kBool) != 0; + + + for (auto V : shapes) { + Dest.push_back( + torch::zeros({32, V}, + torch::TensorOptions().dtype(phDType).device(dev))); + } + ams::SmallVector subset(Dest.begin(), Dest.end() - 1); + int offset = + ams::AMSWorkflow::MLDomainToApplication(Src, subset, Predicate, 0); + ams::AMSWorkflow::MLDomainToApplication(Src, + {Dest[Dest.size() - 1]}, + Predicate, + offset); + + auto Input = torch::cat(Dest, Dest[0].sizes().size() - 1); + + auto result = torch::cat(Dest, 1).to(at::TensorOptions().dtype(mlDType)); + auto inverted = ~Predicate; + Src.index_put_({inverted}, torch::zeros({1, Src.size(1)}, Src.options())); + + bool close = torch::allclose(Src, result, 1e-5, 1e-8); + if (close) return 0; + return 1; +} diff --git a/tests/AMSlib/wf/subselect_tensors.cpp b/tests/AMSlib/wf/subselect_tensors.cpp new file mode 100644 index 00000000..a9b427f2 --- /dev/null +++ b/tests/AMSlib/wf/subselect_tensors.cpp @@ -0,0 +1,58 @@ + +#include +#include +#include +#include + +#include +#include +#include + +#include "wf/workflow.hpp" + + +int main(int argc, char *argv[]) +{ + + if (argc != 3) { + std::cout << "Wrong command line\n"; + std::cout << argv[0] << " \n"; + return -1; + } + torch::Dtype DType = torch::kFloat32; + torch::DeviceType dev = c10::DeviceType::CPU; + + std::string Type(argv[1]); + std::string device(argv[2]); + + + if (Type.compare("double") == 0) { + DType = torch::kFloat64; + } + + if (Type.compare("double") == 0) DType = torch::kFloat64; + + if (device.compare("cuda") == 0) dev = c10::DeviceType::CUDA; + + ams::SmallVector vectors; + for (int i = 0; i < 4; i++) + vectors.push_back( + torch::rand({32, 11}, torch::TensorOptions().dtype(DType).device(dev))); + + auto tmp = torch::arange(0, 32, torch::kInt64) % 2; + auto Predicate = tmp.to(torch::kBool) != 0; + + auto subselectedTensors = + ams::AMSWorkflow::subSelectTensors(vectors, Predicate); + + for (int i = 0; i < vectors.size(); i++) { + auto sb = subselectedTensors[i]; + auto orig = vectors[i]; + orig = orig.index({Predicate}); + bool close = torch::allclose(orig, sb, 1e-5, 1e-8); + + if (!close) return 1; + } + + return 0; +} From aa19836cd5e5f6990a8d79b01fd5432eb2305359 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 12 Dec 2024 21:31:59 -0800 Subject: [PATCH 011/136] Tests scatter --- tests/AMSlib/wf/CMakeLists.txt | 12 +++++- tests/AMSlib/wf/scatter_physics.cpp | 61 +++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 tests/AMSlib/wf/scatter_physics.cpp diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt index 810ef162..8394fef0 100644 --- a/tests/AMSlib/wf/CMakeLists.txt +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -30,6 +30,7 @@ endfunction() BUILD_UNIT_TEST(domain_to_application domain_to_application.cpp) BUILD_UNIT_TEST(subselect_tensors subselect_tensors.cpp) +BUILD_UNIT_TEST(scatter_physics scatter_physics.cpp) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::FLOAT::FLOAT domain_to_application float float cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::DOUBLE::FLOAT domain_to_application double float cpu) @@ -40,13 +41,20 @@ ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::DOUBLE::DOUBLE domai ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Double subselect_tensors double cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Float subselect_tensors float cpu) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::ScatterPhysics::Double scatter_physics double cpu) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::ScatterPhysics::Float scatter_physics float cpu) + + if (ENABLE_CUDA) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::FLOAT::FLOAT domain_to_application float float cuda) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::DOUBLE::FLOAT domain_to_application double float cuda) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::FLOAT::DOUBLE domain_to_application float double cuda) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::DOUBLE::DOUBLE domain_to_application double double cuda) -ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Double subselect_tensors double cuda) -ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Float subselect_tensors float cuda) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::SubSelect::Double subselect_tensors double cuda) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::SubSelect::Float subselect_tensors float cuda) + +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::ScatterPhysics::Double scatter_physics double cuda) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::ScatterPhysics::Float scatter_physics float cuda) endif() diff --git a/tests/AMSlib/wf/scatter_physics.cpp b/tests/AMSlib/wf/scatter_physics.cpp new file mode 100644 index 00000000..545b3929 --- /dev/null +++ b/tests/AMSlib/wf/scatter_physics.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include + +#include +#include +#include + +#include "wf/workflow.hpp" + + +int main(int argc, char *argv[]) +{ + + if (argc != 3) { + std::cout << "Wrong command line\n"; + std::cout << argv[0] << " \n"; + return -1; + } + torch::Dtype DType = torch::kFloat32; + torch::DeviceType dev = c10::DeviceType::CPU; + + std::string Type(argv[1]); + std::string device(argv[2]); + + + if (Type.compare("double") == 0) { + DType = torch::kFloat64; + } + + if (device.compare("cuda") == 0) dev = c10::DeviceType::CUDA; + + ams::SmallVector entireDomain; + ams::SmallVector computedDomain; + for (int i = 0; i < 4; i++) { + entireDomain.push_back( + torch::zeros({128, 7}, + torch::TensorOptions().dtype(DType).device(dev))); + computedDomain.push_back( + torch::rand({64, 7}, torch::TensorOptions().dtype(DType).device(dev))); + } + + auto tmp = torch::arange(0, 128, torch::kInt64) % 2; + auto Predicate = tmp.to(torch::kBool) != 0; + + + ams::AMSWorkflow::ScatterPhysicOutputsToOrigDomain(computedDomain, + Predicate, + entireDomain); + + for (int i = 0; i < computedDomain.size(); i++) { + auto cd = computedDomain[i]; + auto ed = entireDomain[i].index({Predicate}); + bool close = torch::allclose(ed, cd, 1e-5, 1e-8); + + if (!close) return 1; + } + + return 0; +} From 36c023b0d3fcf868a7de4d0604e179f2548c8ed7 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 13 Dec 2024 12:55:32 -0800 Subject: [PATCH 012/136] Re structuring files --- src/AMSlib/{util => include}/ArrayRef.hpp | 0 src/AMSlib/{util => include}/SmallVector.hpp | 0 src/AMSlib/{util => wf}/SmallVector.cpp | 0 src/AMSlib/wf/ams_tensor.cpp | 155 +++++++++++++++++++ src/AMSlib/wf/ams_tensor.hpp | 155 +++++++++++++++++++ 5 files changed, 310 insertions(+) rename src/AMSlib/{util => include}/ArrayRef.hpp (100%) rename src/AMSlib/{util => include}/SmallVector.hpp (100%) rename src/AMSlib/{util => wf}/SmallVector.cpp (100%) create mode 100644 src/AMSlib/wf/ams_tensor.cpp create mode 100644 src/AMSlib/wf/ams_tensor.hpp diff --git a/src/AMSlib/util/ArrayRef.hpp b/src/AMSlib/include/ArrayRef.hpp similarity index 100% rename from src/AMSlib/util/ArrayRef.hpp rename to src/AMSlib/include/ArrayRef.hpp diff --git a/src/AMSlib/util/SmallVector.hpp b/src/AMSlib/include/SmallVector.hpp similarity index 100% rename from src/AMSlib/util/SmallVector.hpp rename to src/AMSlib/include/SmallVector.hpp diff --git a/src/AMSlib/util/SmallVector.cpp b/src/AMSlib/wf/SmallVector.cpp similarity index 100% rename from src/AMSlib/util/SmallVector.cpp rename to src/AMSlib/wf/SmallVector.cpp diff --git a/src/AMSlib/wf/ams_tensor.cpp b/src/AMSlib/wf/ams_tensor.cpp new file mode 100644 index 00000000..9f45203d --- /dev/null +++ b/src/AMSlib/wf/ams_tensor.cpp @@ -0,0 +1,155 @@ +#include "AMS.h" +#include "ArrayRef.hpp" +#include "SmallVector.hpp" +#include "ams_tensor.hpp" +#include "wf/data_handler.hpp" +#include "wf/resource_manager.hpp" +#include "wf/utils.hpp" + + +/** + * @brief Computes the number of elements in the tensor given its shape. + * @param[in] shapes The shape of the tensor as an array reference. + * @return The total number of elements in the tensor. + */ +template +static inline size_t computeNumElements(ams::ArrayRef shapes) +{ + return std::accumulate(shapes.begin(), + shapes.end(), + 1, + std::multiplies()); +} +// Helper function to check if the tensor is contiguous in memory +bool AMSTensor::isContiguous(size_t expected_stride) const +{ + for (int i = _shape.size() - 1; i >= 0; --i) { + if (_strides[i] != expected_stride) return false; + expected_stride *= _shape[i]; + } + return true; +} + + +AMSTensor::AMSTensor(ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSDType dType, + AMSResourceType location, + bool view) + : _elements(computeNumElements(shapes)), + _element_size(dtype_to_size(dType)), + _shape(shapes), + _strides(strides), + _dType(dType), + _location(location), + _owned(!view) +{ + _contiguous = isContiguous(_element_size); + auto& rm = ams::ResourceManager::getInstance(); + if (!view) { + _data = rm.allocate(_elements * _element_size, + _location, + _element_size); + _bytes = _elements * _element_size; + if (!_data) { + throw std::runtime_error("Failed to allocate memory for AMSTensor."); + } + } +} + + +AMSTensor AMSTensor::create(ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSDType dType, + AMSResourceType location) +{ + return AMSTensor(shapes, strides, dType, location); +} + +AMSTensor AMSTensor::view(uint8_t* data, + ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSDType dType, + AMSResourceType location) +{ + auto tensor = AMSTensor(shapes, strides, dType, location, true); + tensor._data = data; + return tensor; +} + +AMSTensor AMSTensor::view(AMSTensor& tensor) +{ + return AMSTensor::view(tensor._data, + tensor._shape, + tensor._strides, + tensor._dType, + tensor._location); +} + +AMSTensor::~AMSTensor() +{ + // Only release whenwe own the pointer + if (_owned && _data) { + auto& rm = ams::ResourceManager::getInstance(); + rm.deallocate(_data, _location); + _data = nullptr; + _owned = false; + } +} + +AMSTensor::AMSTensor(AMSTensor&& other) noexcept + : _data(other._data), + _elements(other._elements), + _element_size(other._element_size), + _shape(std::move(other._shape)), + _strides(std::move(other._strides)), + _dType(other._dType), + _location(other._location), + _owned(other._owned) +{ + other._data = nullptr; + other._owned = false; +} + +AMSTensor& AMSTensor::operator=(AMSTensor&& other) noexcept +{ + if (this != &other) { + // Free existing resources + + // Steal resources from `other` + _data = other._data; + _elements = other._elements; + _element_size = other._element_size; + _shape = std::move(other._shape); + _strides = std::move(other._strides); + _dType = other._dType; + _location = other._location; + _owned = other._owned; + + other._data = nullptr; + other._owned = false; + } + return *this; +} + +AMSTensor AMSTensor::transpose(size_t axis1, size_t axis2) const +{ + // Ensure the axes are within bounds + if (axis1 >= _shape.size() || axis2 >= _shape.size()) { + throw std::out_of_range("Transpose axes are out of bounds"); + } + + // Create new shape and strides for the transposed tensor + auto newShape = _shape; + auto newStrides = _strides; + + // Swap the specified axes in both shape and strides + std::swap(newShape[axis1], newShape[axis2]); + std::swap(newStrides[axis1], newStrides[axis2]); + + // Create a new tensor with the same data, new shape, and strides + AMSTensor transposedTensor = + view(_data, newShape, newStrides, _dType, _location); + + return transposedTensor; +} diff --git a/src/AMSlib/wf/ams_tensor.hpp b/src/AMSlib/wf/ams_tensor.hpp new file mode 100644 index 00000000..b110e5b7 --- /dev/null +++ b/src/AMSlib/wf/ams_tensor.hpp @@ -0,0 +1,155 @@ +#include +#include + +#include +#include + +#include "resource_manager.hpp" +#include "utils.hpp" + +// Utility function to calculate element size +static size_t elementSize(const AMSDType type) +{ + switch (type) { + case AMS_SINGLE: + return sizeof(float); + case AMS_DOUBLE: + return sizeof(double); + default: + throw std::invalid_argument("Unsupported data type"); + } +} + +struct HostMemoryDeleter { + void operator()(void* ptr) const + { + auto& rm = ams::ResourceManager::getInstance(); + rm.deallocate(ptr, AMSResourceType::AMS_HOST); + } +}; + + +struct DeviceMemoryDeleter { + void operator()(void* ptr) const + { + auto& rm = ams::ResourceManager::getInstance(); + rm.deallocate(ptr, AMSResourceType::AMS_DEVICE); + } +}; + + +// AMSTensor class definition +class AMSTensor +{ + +private: + ams::ResourceManager& rm; + std::vector shape_; + std::vector strides_; + AMSDType dtype_; + AMSResourceType location_; + size_t num_elements_; + std::shared_ptr data_; // Pointer to tensor data + size_t bytes_; + + size_t calculateNumElements(const std::vector& shape) const + { + return std::accumulate(shape.begin(), + shape.end(), + 1, + std::multiplies()); + } + + std::vector calculateStrides(const std::vector& shape) const + { + std::vector strides(shape.size()); + size_t stride = 1; + for (int i = shape.size() - 1; i >= 0; --i) { + strides[i] = stride; + stride *= shape[i]; + } + return strides; + } + +public: + // Constructor for AMSTensor + AMSTensor(const std::vector& shape, + AMSDType dtype, + AMSResourceType location = AMSResourceType::AMS_HOST) + : rm(ams::ResourceManager::getInstance()), + shape_(shape), + dtype_(dtype), + location_(location) + { + + // Calculate the total number of elements + num_elements_ = 1; + for (auto dim : shape) { + num_elements_ *= dim; + } + + // Allocate memory for the tensor based on datatype and shape + bytes_ = num_elements_ * elementSize(dtype); + if (location == AMSResourceType::AMS_HOST) + data_ = std::shared_ptr(rm.allocate(bytes_, location), + HostMemoryDeleter()); + else if (location == AMSResourceType::AMS_DEVICE) + data_ = std::shared_ptr(rm.allocate(bytes_, location), + DeviceMemoryDeleter()); + } + + // Destructor to free memory + ~AMSTensor() {} + + // Accessors + const std::vector& shape() const { return shape_; } + AMSDType dtype() const { return dtype_; } + AMSResourceType location() const { return location_; } + size_t numElements() const { return num_elements_; } + + // Data access methods + template + std::shared_ptr data() const + { + return (data_); + } + + // Reshape the tensor (in-place) + void reshape(const std::vector& new_shape) + { + size_t new_num_elements = calculateNumElements(new_shape); + if (new_num_elements != num_elements_) { + throw std::invalid_argument( + "Total number of elements must remain constant when reshaping"); + } + shape_ = new_shape; + strides_ = calculateStrides(new_shape); + } + + // Index calculation + size_t flattenIndex(const std::vector& indices) const + { + if (indices.size() != shape_.size()) { + throw std::invalid_argument("Incorrect number of indices"); + } + + size_t flat_index = 0; + for (size_t i = 0; i < indices.size(); ++i) { + flat_index += indices[i] * strides_[i]; + } + return flat_index; + } + + + template + static AMSTensor from(std::vector data, + size_t totalElements, + AMSDType dType, + AMSResourceType location) + { + // This allocates the memory we need and the shape we need. + AMSTensor ATensor({totalElements, data.size()}, dType, location); + if (getDType() == dType) { + } + } +}; From 68bf449ed746b45fa0c8704a94e450b5f1509d59 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 20 Dec 2024 12:54:20 -0800 Subject: [PATCH 013/136] Implement tensor aware workflow --- .../{wf/ams_tensor.cpp => AMSTensor.cpp} | 25 +- src/AMSlib/include/AMS.h | 30 +- src/AMSlib/ml/surrogate.cpp | 3 + src/AMSlib/ml/surrogate.hpp | 38 +- src/AMSlib/ml/uq.hpp | 213 ----- src/AMSlib/util/tensor.hpp | 759 ------------------ src/AMSlib/wf/ams_tensor.hpp | 155 ---- src/AMSlib/wf/basedb.hpp | 29 +- src/AMSlib/wf/device.hpp | 334 -------- src/AMSlib/wf/hdf5db.cpp | 5 +- src/AMSlib/wf/interface.cpp | 78 ++ src/AMSlib/wf/interface.hpp | 10 + src/AMSlib/wf/resource_manager.cpp | 47 +- src/AMSlib/wf/utils.cpp | 16 - src/AMSlib/wf/utils.hpp | 27 +- src/AMSlib/wf/workflow.hpp | 161 ++-- tests/AMSlib/CMakeLists.txt | 1 + tests/AMSlib/ams_tensor_test.cpp | 610 -------------- tests/AMSlib/models/CMakeLists.txt | 52 ++ tests/AMSlib/{torch => models}/generate.py | 2 +- tests/AMSlib/{torch => models}/generate.sh | 0 tests/AMSlib/torch/CMakeLists.txt | 150 ++-- .../torch/evalute_model_conversions.cpp | 3 +- tests/AMSlib/wf/CMakeLists.txt | 124 ++- tests/AMSlib/wf/evaluate_in_and_outs.cpp | 406 ++++++++++ 25 files changed, 929 insertions(+), 2349 deletions(-) rename src/AMSlib/{wf/ams_tensor.cpp => AMSTensor.cpp} (82%) delete mode 100644 src/AMSlib/ml/uq.hpp delete mode 100644 src/AMSlib/util/tensor.hpp delete mode 100644 src/AMSlib/wf/ams_tensor.hpp delete mode 100644 src/AMSlib/wf/device.hpp create mode 100644 src/AMSlib/wf/interface.cpp create mode 100644 src/AMSlib/wf/interface.hpp delete mode 100644 src/AMSlib/wf/utils.cpp delete mode 100644 tests/AMSlib/ams_tensor_test.cpp create mode 100644 tests/AMSlib/models/CMakeLists.txt rename tests/AMSlib/{torch => models}/generate.py (99%) rename tests/AMSlib/{torch => models}/generate.sh (100%) create mode 100644 tests/AMSlib/wf/evaluate_in_and_outs.cpp diff --git a/src/AMSlib/wf/ams_tensor.cpp b/src/AMSlib/AMSTensor.cpp similarity index 82% rename from src/AMSlib/wf/ams_tensor.cpp rename to src/AMSlib/AMSTensor.cpp index 9f45203d..4057e1bc 100644 --- a/src/AMSlib/wf/ams_tensor.cpp +++ b/src/AMSlib/AMSTensor.cpp @@ -1,11 +1,11 @@ #include "AMS.h" +#include "AMSTensor.hpp" #include "ArrayRef.hpp" #include "SmallVector.hpp" -#include "ams_tensor.hpp" -#include "wf/data_handler.hpp" #include "wf/resource_manager.hpp" #include "wf/utils.hpp" +using namespace ams; /** * @brief Computes the number of elements in the tensor given its shape. @@ -13,15 +13,15 @@ * @return The total number of elements in the tensor. */ template -static inline size_t computeNumElements(ams::ArrayRef shapes) +static inline AMSTensor::IntDimType computeNumElements(ams::ArrayRef shapes) { return std::accumulate(shapes.begin(), shapes.end(), 1, - std::multiplies()); + std::multiplies()); } // Helper function to check if the tensor is contiguous in memory -bool AMSTensor::isContiguous(size_t expected_stride) const +bool AMSTensor::isContiguous(AMSTensor::IntDimType expected_stride) const { for (int i = _shape.size() - 1; i >= 0; --i) { if (_strides[i] != expected_stride) return false; @@ -31,8 +31,8 @@ bool AMSTensor::isContiguous(size_t expected_stride) const } -AMSTensor::AMSTensor(ams::ArrayRef shapes, - ams::ArrayRef strides, +AMSTensor::AMSTensor(ams::ArrayRef shapes, + ams::ArrayRef strides, AMSDType dType, AMSResourceType location, bool view) @@ -58,8 +58,8 @@ AMSTensor::AMSTensor(ams::ArrayRef shapes, } -AMSTensor AMSTensor::create(ams::ArrayRef shapes, - ams::ArrayRef strides, +AMSTensor AMSTensor::create(ams::ArrayRef shapes, + ams::ArrayRef strides, AMSDType dType, AMSResourceType location) { @@ -67,8 +67,8 @@ AMSTensor AMSTensor::create(ams::ArrayRef shapes, } AMSTensor AMSTensor::view(uint8_t* data, - ams::ArrayRef shapes, - ams::ArrayRef strides, + ams::ArrayRef shapes, + ams::ArrayRef strides, AMSDType dType, AMSResourceType location) { @@ -132,7 +132,8 @@ AMSTensor& AMSTensor::operator=(AMSTensor&& other) noexcept return *this; } -AMSTensor AMSTensor::transpose(size_t axis1, size_t axis2) const +AMSTensor AMSTensor::transpose(AMSTensor::IntDimType axis1, + AMSTensor::IntDimType axis2) const { // Ensure the axes are within bounds if (axis1 >= _shape.size() || axis2 >= _shape.size()) { diff --git a/src/AMSlib/include/AMS.h b/src/AMSlib/include/AMS.h index ab7bd8a1..1091ff5c 100644 --- a/src/AMSlib/include/AMS.h +++ b/src/AMSlib/include/AMS.h @@ -11,6 +11,7 @@ #include #include "AMS-config.h" +#include "AMSTensor.hpp" #ifdef __AMS_ENABLE_CALIPER__ #include @@ -37,6 +38,11 @@ typedef void *MPI_Comm; #define PERFFASPECT() #endif +using EOSLambda = std::function &, + ams::SmallVector &, + ams::SmallVector &)>; + + #ifdef __cplusplus extern "C" { #endif @@ -46,16 +52,6 @@ typedef void (*AMSPhysicFn)(void *, long, const void *const *, void *const *); typedef int64_t AMSExecutor; typedef int AMSCAbstrModel; -typedef enum { AMS_SINGLE = 0, AMS_DOUBLE } AMSDType; - -typedef enum { - AMS_UNKNOWN = -1, - AMS_HOST = 0, - AMS_DEVICE = 1, - AMS_PINNED = 2, - AMS_RSEND -} AMSResourceType; - typedef enum { AMS_UBALANCED = 0, AMS_BALANCED } AMSExecPolicy; typedef enum { AMS_NONE = 0, AMS_CSV, AMS_REDIS, AMS_HDF5, AMS_RMQ } AMSDBType; @@ -78,22 +74,22 @@ typedef struct { size_t *shape; size_t *strides; int dims; - AMSDType dType; // AMS_SINGLE/AMS_DOUBLE - AMSResourceType location; // CPU/GPU/Pinned + ams::AMSDType dType; // AMS_SINGLE/AMS_DOUBLE + ams::AMSResourceType location; // CPU/GPU/Pinned } AMSCTensor; >>>>>>> c52415d (Concat test case 1, works) AMSExecutor AMSCreateExecutor(AMSCAbstrModel model, - AMSDType data_type, - AMSResourceType resource_type, + ams::AMSDType data_type, + ams::AMSResourceType resource_type, AMSPhysicFn call_back, int process_id, int world_size); #ifdef __AMS_ENABLE_MPI__ AMSExecutor AMSCreateDistributedExecutor(AMSCAbstrModel model, - AMSDType data_type, + ams::AMSDType data_type, AMSResourceType resource_type, AMSPhysicFn call_back, MPI_Comm comm, @@ -122,8 +118,8 @@ void AMSExecute(AMSExecutor executor, void AMSDestroyExecutor(AMSExecutor executor); -void AMSSetAllocator(AMSResourceType resource, const char *alloc_name); -const char *AMSGetAllocatorName(AMSResourceType device); +void AMSSetAllocator(ams::AMSResourceType resource, const char *alloc_name); +const char *AMSGetAllocatorName(ams::AMSResourceType device); void AMSConfigureFSDatabase(AMSDBType db_type, const char *db_path); #ifdef __cplusplus diff --git a/src/AMSlib/ml/surrogate.cpp b/src/AMSlib/ml/surrogate.cpp index ebb15429..3ea50795 100644 --- a/src/AMSlib/ml/surrogate.cpp +++ b/src/AMSlib/ml/surrogate.cpp @@ -12,6 +12,7 @@ #include "surrogate.hpp" #include "wf/debug.h" +using namespace ams; static std::string getDTypeAsString(torch::Dtype dtype) { if (dtype == torch::kFloat32) return "float32"; @@ -218,6 +219,7 @@ std::tuple SurrogateModel::evaluate( throw std::invalid_argument( "Input Vector should always contain at least one tensor"); } + torch::DeviceType InputDevice = Inputs[0].device().type(); torch::Dtype InputDType = torch::typeMetaToScalarType(Inputs[0].dtype()); auto CAxis = Inputs[0].sizes().size() - 1; @@ -246,6 +248,7 @@ std::tuple SurrogateModel::evaluate( } auto ITensor = torch::cat(ConvertedInputs, CAxis); + auto [OTensor, Predicate] = _evaluate(ITensor, policy, threshold); if (InputDevice != torch_device) { OTensor = OTensor.to(InputDevice); diff --git a/src/AMSlib/ml/surrogate.hpp b/src/AMSlib/ml/surrogate.hpp index 50f17c24..e6dde8c5 100644 --- a/src/AMSlib/ml/surrogate.hpp +++ b/src/AMSlib/ml/surrogate.hpp @@ -8,6 +8,11 @@ #ifndef __AMS_SURROGATE_HPP__ #define __AMS_SURROGATE_HPP__ +#include +#include +#include +#include // One-stop header. + #include #include #include @@ -16,15 +21,7 @@ #include #include "AMS.h" -#include "util/ArrayRef.hpp" -//#include "wf/device.hpp" - -#include -#include -#include -#include // One-stop header. - -#include "wf/data_handler.hpp" +#include "ArrayRef.hpp" #include "wf/debug.h" //! ---------------------------------------------------------------------------- @@ -35,9 +32,9 @@ class SurrogateModel private: const std::string _model_path; - AMSResourceType model_device; + ams::AMSResourceType model_device; torch::DeviceType torch_device; - AMSDType model_dtype; + ams::AMSDType model_dtype; torch::Dtype torch_dtype; const bool _is_DeltaUQ; @@ -102,22 +99,25 @@ class SurrogateModel inline bool is_gpu() const { - return model_device == AMSResourceType::AMS_DEVICE; + return model_device == ams::AMSResourceType::AMS_DEVICE; } inline bool is_cpu() const { - return model_device == AMSResourceType::AMS_HOST; + return model_device == ams::AMSResourceType::AMS_HOST; } - inline bool is_resource(AMSResourceType rType) const + inline bool is_resource(ams::AMSResourceType rType) const { return model_device == rType; } - inline bool is_float() const { return model_dtype == AMS_SINGLE; } - inline bool is_double() const { return model_dtype == AMS_DOUBLE; } - inline bool is_type(AMSDType dType) const { return model_dtype == dType; } + inline bool is_float() const { return model_dtype == ams::AMS_SINGLE; } + inline bool is_double() const { return model_dtype == ams::AMS_DOUBLE; } + inline bool is_type(ams::AMSDType dType) const + { + return model_dtype == dType; + } // @@ -141,8 +141,8 @@ class SurrogateModel // } // AMSResourceType getModelResource() const { return model_device; } - std::tuple getModelResourceType(); - std::tuple getModelDataType(); + std::tuple getModelResourceType(); + std::tuple getModelDataType(); }; #endif diff --git a/src/AMSlib/ml/uq.hpp b/src/AMSlib/ml/uq.hpp deleted file mode 100644 index ca73e64f..00000000 --- a/src/AMSlib/ml/uq.hpp +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef __AMS_UQ_HPP__ -#define __AMS_UQ_HPP__ - -#include -#include - -#include "AMS.h" -#include "ml/hdcache.hpp" -#include "ml/random_uq.hpp" -#include "ml/surrogate.hpp" -#include "wf/resource_manager.hpp" - -class BaseUQ -{ -public: - static inline bool isDeltaUQ(AMSUQPolicy policy) - { - if (policy >= AMSUQPolicy::AMS_DELTAUQ_MEAN && - policy <= AMSUQPolicy::AMS_DELTAUQ_MAX) { - return true; - } - return false; - } - - static inline bool isFaissUQ(AMSUQPolicy policy) - { - if (policy >= AMSUQPolicy::AMS_FAISS_MEAN && - policy <= AMSUQPolicy::AMS_FAISS_MAX) { - return true; - } - return false; - } - - static inline bool isRandomUQ(AMSUQPolicy policy) - { - return policy == AMSUQPolicy::AMS_RANDOM; - } - - - static inline bool isUQPolicy(AMSUQPolicy policy) - { - if (AMSUQPolicy::AMS_UQ_BEGIN < policy && policy < AMSUQPolicy::AMS_UQ_END) - return true; - return false; - } - - static std::string UQPolicyToStr(AMSUQPolicy policy) - { - if (policy == AMSUQPolicy::AMS_RANDOM) - return "random"; - else if (policy == AMSUQPolicy::AMS_FAISS_MAX) - return "faiss (max)"; - else if (policy == AMSUQPolicy::AMS_FAISS_MEAN) - return "faiss (mean)"; - else if (policy == AMSUQPolicy::AMS_DELTAUQ_MEAN) - return "deltaUQ (mean)"; - else if (policy == AMSUQPolicy::AMS_DELTAUQ_MAX) - return "deltaUQ (max)"; - return "Unknown"; - } - - static AMSUQPolicy UQPolicyFromStr(std::string &policy) - { - if (policy.compare("random") == 0) - return AMSUQPolicy::AMS_RANDOM; - else if (policy.compare("faiss (max)") == 0) - return AMSUQPolicy::AMS_FAISS_MAX; - else if (policy.compare("faiss (mean)") == 0) - return AMSUQPolicy::AMS_FAISS_MEAN; - else if (policy.compare("deltaUQ (mean)") == 0) - return AMSUQPolicy::AMS_DELTAUQ_MEAN; - else if (policy.compare("deltaUQ (max)") == 0) - return AMSUQPolicy::AMS_DELTAUQ_MAX; - return AMSUQPolicy::AMS_UQ_END; - } -}; - -template -class UQ : public BaseUQ -{ -public: - UQ(AMSResourceType resourceLocation, - const AMSUQPolicy uq_policy, - std::string &uqPath, - const int nClusters, - std::string &surrogatePath, - FPTypeValue threshold) - : uqPolicy(uq_policy), threshold(threshold) - { - if (surrogatePath.empty()) { - surrogate = nullptr; - hdcache = nullptr; - randomUQ = nullptr; - return; - } - - DBG(UQ, - "START: UQ Model is of type (%s, %d) with threshold %f", - BaseUQ::UQPolicyToStr(uqPolicy).c_str(), - uqPolicy, - threshold) - - if (!isUQPolicy(uq_policy)) - THROW(std::runtime_error, "Invalid UQ policy, value is out-of-bounds"); - - - bool is_DeltaUQ = isDeltaUQ(uqPolicy); - - surrogate = SurrogateModel::getInstance(surrogatePath, - resourceLocation, - is_DeltaUQ); - - if (isFaissUQ(uqPolicy)) { - if (uqPath.empty()) - THROW(std::runtime_error, "Missing file path to a FAISS UQ model"); - - hdcache = HDCache::getInstance( - uqPath, resourceLocation, uqPolicy, nClusters, threshold); - } - - if (isRandomUQ(uqPolicy)) - randomUQ = std::make_unique(resourceLocation, threshold); - - DBG(UQ, - "UQ Model is of type (%s, %d) with threshold %f", - BaseUQ::UQPolicyToStr(uqPolicy).c_str(), - uqPolicy, - threshold) - } - - PERFFASPECT() - void evaluate(const int totalElements, - std::vector &inputs, - std::vector &outputs, - bool *p_ml_acceptable) - { - - DBG(UQ, - "Calling %s surrogate [in:%ld %ld] -> (out:[%ld " - "%ld])", - BaseUQ::UQPolicyToStr(uqPolicy).c_str(), - totalElements, - inputs.size(), - totalElements, - outputs.size()); - - if ((uqPolicy == AMSUQPolicy::AMS_DELTAUQ_MEAN) || - (uqPolicy == AMSUQPolicy::AMS_DELTAUQ_MAX)) { - - auto &rm = ams::ResourceManager::getInstance(); - - CALIPER(CALI_MARK_BEGIN("DELTAUQ SURROGATE");) - surrogate->evaluate( - totalElements, inputs, outputs, uqPolicy, p_ml_acceptable, threshold); - CALIPER(CALI_MARK_END("DELTAUQ SURROGATE");) - } else if (uqPolicy == AMSUQPolicy::AMS_FAISS_MEAN || - uqPolicy == AMSUQPolicy::AMS_FAISS_MAX) { - CALIPER(CALI_MARK_BEGIN("HDCACHE");) - hdcache->evaluate(totalElements, inputs, p_ml_acceptable); - CALIPER(CALI_MARK_END("HDCACHE");) - - CALIPER(CALI_MARK_BEGIN("SURROGATE");) - surrogate->evaluate(totalElements, inputs, outputs); - CALIPER(CALI_MARK_END("SURROGATE");) - } else if (uqPolicy == AMSUQPolicy::AMS_RANDOM) { - CALIPER(CALI_MARK_BEGIN("RANDOM_UQ");) - DBG(Workflow, "Evaluating Random UQ"); - randomUQ->evaluate(totalElements, p_ml_acceptable); - CALIPER(CALI_MARK_END("RANDOM_UQ");) - - CALIPER(CALI_MARK_BEGIN("SURROGATE");) - surrogate->evaluate(totalElements, inputs, outputs); - CALIPER(CALI_MARK_END("SURROGATE");) - } else { - THROW(std::runtime_error, "Invalid UQ policy"); - } - } - - void updateModel(const std::string &model_path, - const std::string &uq_path = "") - { - if (uqPolicy == AMSUQPolicy::AMS_FAISS_MAX || - uqPolicy == AMSUQPolicy::AMS_FAISS_MEAN) { - THROW(std::runtime_error, "UQ model does not support update."); - } - - if (uqPolicy == AMSUQPolicy::AMS_RANDOM && uq_path != "") { - WARNING(Workflow, - "RandomUQ cannot update hdcache path, ignoring argument") - } - - surrogate->update(model_path); - return; - } - - bool hasSurrogate() { return (surrogate ? true : false); } - -private: - AMSUQPolicy uqPolicy; - FPTypeValue threshold; - std::unique_ptr randomUQ; - std::shared_ptr> hdcache; - std::shared_ptr> surrogate; -}; - -#endif diff --git a/src/AMSlib/util/tensor.hpp b/src/AMSlib/util/tensor.hpp deleted file mode 100644 index e5dc0e07..00000000 --- a/src/AMSlib/util/tensor.hpp +++ /dev/null @@ -1,759 +0,0 @@ -#include - -#include -#include -#include -#include - -#include "AMS.h" -#include "ArrayRef.hpp" -#include "SmallVector.hpp" -#include "wf/data_handler.hpp" -#include "wf/resource_manager.hpp" -#include "wf/utils.hpp" - -class AMSTensor -{ - uint8_t* _data; - size_t _elements; - size_t _element_size; - size_t _batch_axis; - ams::SmallVector _shape; - ams::SmallVector _strides; - AMSDType _dType; // AMS_SINGLE/AMS_DOUBLE - AMSResourceType _location; // CPU/GPU/Pinned - bool _owned; - bool _contiguous; - bool _bytes; - - -private: - // Helper function to check broadcasting compatibility for two dimensions - static inline bool isBroadcastCompatible(size_t dim1, size_t dim2) - { - return (dim1 == dim2) || (dim1 == 1) || (dim2 == 1); - } - - // Helper function to determine the broadcasted dimension size - static inline size_t getBroadcastSize(size_t dim1, size_t dim2) - { - return std::max(dim1, dim2); - } - - - // Helper function to check if the tensor is contiguous in memory - bool isContiguous(size_t expected_stride) const - { - for (int i = _shape.size() - 1; i >= 0; --i) { - if (_strides[i] != expected_stride) return false; - expected_stride *= _shape[i]; - } - return true; - } - - /** - * @brief Creates a new tensor by casting all elements to the specified target type. - * @tparam TargetType The data type to cast each element to. - * @param[in] targetType The target AMSDType representing the target data type (e.g., AMS_SINGLE or AMS_DOUBLE). - * @return A new AMSTensor with the elements cast to the specified type. - */ - template - AMSTensor castTensor(AMSDType targetType) const - { - // Create new tensor with same shape and strides, but different data type - AMSTensor newTensor(_shape, _strides, targetType, _location); - auto& rm = ams::ResourceManager::getInstance(); - - if (_dType == targetType) { - rm.copy( - _data, _location, newTensor.data(), _location, _elements); - return newTensor; - } - - // Perform element-wise conversion - assert(_location == AMS_HOST && "Unsupported GPU implementation"); - if (_dType == AMS_SINGLE) { - ams::DataHandler::cast_from_typevalue(_elements, - newTensor.data(), - data()); - } else if (_dType == AMS_DOUBLE) { - ams::DataHandler::cast_from_typevalue( - _elements, newTensor.data(), data()); - } else { - throw std::runtime_error("Unsupported source data type in castTensor."); - } - - return newTensor; - } - - /** - * @brief Constructs a new AMSTensor with the specified shape, strides, data type, and location. - * This constructor is private and intended for internal use, such as creating views. - * @param[in] shapes The shape of the tensor. - * @param[in] strides The strides of the tensor. - * @param[in] dType The data type of the tensor elements. - * @param[in] location The memory location (e.g., CPU, GPU). - * @param[in] _batch_dim The axis holding the samples. - * @param[in] view Set to true if this tensor is a view of another tensor (non-owning). - */ - explicit AMSTensor(ams::ArrayRef shapes, - ams::ArrayRef strides, - AMSDType dType, - AMSResourceType location, - size_t batch_axis = 0, - bool view = false) - : _elements(computeNumElements(shapes)), - _element_size(dtype_to_size(dType)), - _batch_axis(batch_axis), - _shape(shapes), - _strides(strides), - _dType(dType), - _location(location), - _owned(!view) - { - _contiguous = isContiguous(_element_size); - auto& rm = ams::ResourceManager::getInstance(); - if (_batch_axis >= _shape.size()) - throw std::invalid_argument( - "Batch axis is larger than the shape of the tensor"); - if (!view) { - _data = rm.allocate(_elements * _element_size, - _location, - _element_size); - _bytes = _elements * _element_size; - if (!_data) { - throw std::runtime_error("Failed to allocate memory for AMSTensor."); - } - } - } - - -public: - /** - * @brief Creates a new AMSTensor and allocates the tensor memory. - * @param[in] shapes The shape of the tensor. - * @param[in] strides The strides of the tensor. - * @param[in] dType The data type of the tensor elements. - * @param[in] location The memory location (e.g., CPU, GPU). - * @param[in] batch_axis The axis that contains the batch data. - * @return A new AMSTensor with allocated memory. - */ - static AMSTensor create(ams::ArrayRef shapes, - ams::ArrayRef strides, - AMSDType dType, - AMSResourceType location, - size_t batch_axis = 0) - { - return AMSTensor(shapes, strides, dType, location, batch_axis); - } - - /** - * @brief Creates a view on an existing memory buffer. - * @param[in] data Pointer to the existing data to be viewed. - * @param[in] shapes The shape of the view tensor. - * @param[in] strides The strides of the view tensor. - * @param[in] dType The data type of the tensor elements. - * @param[in] location The memory location (e.g., CPU, GPU). - * @param[in] batch_axis The axis represeing the samples. - * @return A new AMSTensor that acts as a view of the existing data. - */ - static AMSTensor view(uint8_t* data, - ams::ArrayRef shapes, - ams::ArrayRef strides, - AMSDType dType, - AMSResourceType location, - size_t batch_axis = 0) - { - auto tensor = AMSTensor(shapes, strides, dType, location, batch_axis, true); - tensor._data = data; - return tensor; - } - - static AMSTensor view(AMSTensor& tensor) - { - return AMSTensor::view(tensor._data, - tensor._shape, - tensor._strides, - tensor._dType, - tensor._location, - tensor._batch_axis); - } - - // Helper function to compute if a reshape is feasible without copying - bool canReshapeWithStrides(const ams::ArrayRef new_shape) - { - // Check if total number of elements is the same - if (computeNumElements(new_shape) != computeNumElements(_shape)) { - return false; - } - - // Check if the original data layout is contiguous - return isContiguous(_element_size); - - // If we reach here, data is contiguous and can be reshaped to any compatible shape - return true; - } - - /** - * @brief Destructor for AMSTensor, deallocates memory if this tensor owns it. - */ - ~AMSTensor() - { - // Only release whenwe own the pointer - if (_owned && _data) { - auto& rm = ams::ResourceManager::getInstance(); - rm.deallocate(_data, _location); - _data = nullptr; - _owned = false; - } - } - - /** - * @brief Deleted copy assignment operator to prevent copying of tensors. - */ - AMSTensor(const AMSTensor&) = delete; - - /** - * @brief Move constructor for AMSTensor, transfers ownership of data. - * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. - */ - AMSTensor& operator=(const AMSTensor&) = delete; - - /** - * @brief Move assignment operator for AMSTensor, transfers ownership of data. - * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. - * @return A reference to the updated tensor after move assignment. - */ - AMSTensor(AMSTensor&& other) noexcept - : _data(other._data), - _elements(other._elements), - _element_size(other._element_size), - _batch_axis(other._batch_axis), - _shape(std::move(other._shape)), - _strides(std::move(other._strides)), - _dType(other._dType), - _location(other._location), - _owned(other._owned) - { - other._data = nullptr; - other._owned = false; - } - - // Define move assignment operator - AMSTensor& operator=(AMSTensor&& other) noexcept - { - if (this != &other) { - // Free existing resources - - // Steal resources from `other` - _data = other._data; - _elements = other._elements; - _element_size = other._element_size; - _batch_axis = other._batch_axis; - _shape = std::move(other._shape); - _strides = std::move(other._strides); - _dType = other._dType; - _location = other._location; - _owned = other._owned; - - other._data = nullptr; - other._owned = false; - } - return *this; - } - - - /** - * @brief Retrieves a typed pointer to the underlying data. - * @tparam T The data type to retrieve. - * @return A typed pointer to the tensor's data. - */ - template - T* data() const - { - return reinterpret_cast(_data); - } - - - /** - * @brief Retrieves a specific element by index with bounds checking. - * @tparam T The data type of the element to retrieve. - * @param[in] index The index of the element to access. - * @return A reference to the specified element. - * @throw std::out_of_range if index is out of bounds. - */ - template - T& at(std::size_t index) const - { - if (index >= _elements) { - throw std::out_of_range("Index out of bounds in AMSTensor."); - } - return data()[index]; - } - - /** - * @brief Creates a copy of the tensor with elements converted to float (32-bit) representation. - * @return A new AMSTensor with float (32-bit) elements. - */ - AMSTensor fp32() const { return castTensor(AMS_SINGLE); } - - /** - * @brief Creates a copy of the tensor with elements converted to double (64-bit) representation. - * @return A new AMSTensor with double (64-bit) elements. - */ - AMSTensor fp64() const { return castTensor(AMS_DOUBLE); } - - - /** - * @brief Creates a transposed view of the tensor by swapping two specified axes. - * @param[in] axis1 The first axis to swap in the transposition. - * @param[in] axis2 The second axis to swap in the transposition. - * @return A new AMSTensor that is a transposed view of the original tensor. - * @throw std::out_of_range if any axis is out of bounds. - */ - AMSTensor transpose(size_t axis1 = 0, size_t axis2 = 1) const - { - // Ensure the axes are within bounds - if (axis1 >= _shape.size() || axis2 >= _shape.size()) { - throw std::out_of_range("Transpose axes are out of bounds"); - } - - // Create new shape and strides for the transposed tensor - auto newShape = _shape; - auto newStrides = _strides; - auto _new_batch_axis = _batch_axis; - if (_new_batch_axis == axis1) - _new_batch_axis = axis2; - else if (_new_batch_axis == axis2) - _new_batch_axis = axis1; - - // Swap the specified axes in both shape and strides - std::swap(newShape[axis1], newShape[axis2]); - std::swap(newStrides[axis1], newStrides[axis2]); - - // Create a new tensor with the same data, new shape, and strides - AMSTensor transposedTensor = - view(_data, newShape, newStrides, _dType, _location, _new_batch_axis); - - return transposedTensor; - } - - - /** - * @brief Concatenates multiple tensors along a specified axis, with broadcasting for singleton dimensions. - * @param[in] tensors Array of tensors to concatenate. - * @param[in] axis The axis along which to concatenate. - * @return A new AMSTensor representing the concatenated result. - * @throw std::invalid_argument if tensor shapes are incompatible or axis is out of bounds. - */ - static AMSTensor concatenate(const ams::ArrayRef tensors, - size_t axis) - { - if (tensors.empty()) { - throw std::invalid_argument("No tensors provided for concatenation."); - } - - // Check compatibility of shapes, data types, and locations - const AMSDType dType = tensors[0]._dType; - const AMSResourceType location = tensors[0]._location; - ams::SmallVector newShape = tensors[0]._shape; - newShape[axis] = 0; - - for (const auto& tensor : tensors) { - if (tensor._dType != dType || tensor._location != location) { - throw std::invalid_argument( - "All tensors must have the same data type and location."); - } - if (tensor._shape.size() != newShape.size()) { - throw std::invalid_argument( - "All tensors must have the same number of dimensions."); - } - - // Ensure dimensions match, except along the concatenation axis, allowing for broadcasting - for (size_t i = 0; i < tensor._shape.size(); ++i) { - if (i == axis) { - newShape[axis] += - tensor._shape - [axis]; // Accumulate size along the concatenation axis - } else if (tensor._shape[i] != newShape[i] && tensor._shape[i] != 1 && - newShape[i] != 1) { - throw std::invalid_argument( - "All tensors must have compatible shapes for concatenation."); - } else { - // If one of the dimensions is 1, set newShape[i] to the max of both dimensions (broadcasting) - newShape[i] = std::max(newShape[i], tensor._shape[i]); - } - } - } - - // Calculate new strides for a contiguous layout in the new tensor - ams::SmallVector newStrides(newShape.size()); - size_t elementSize = dtype_to_size(dType); - newStrides.back() = elementSize; - for (int i = newStrides.size() - 2; i >= 0; --i) { - newStrides[i] = newShape[i + 1] * newStrides[i + 1]; - } - std::cout << "Strides are : "; - for (int i = 0; i < newStrides.size(); i++) { - std::cout << newStrides[i] << " "; - } - std::cout << "\n"; - std::cout << "Shapes are : "; - for (int i = 0; i < newShape.size(); i++) { - std::cout << newShape[i] << " "; - } - std::cout << "\n"; - - - // Create the new tensor with the calculated shape and strides - AMSTensor result = AMSTensor::create(newShape, newStrides, dType, location); - std::memset(result._data, 0, result._element_size * result._elements); - - // Copy data from each tensor to the correct position in `result` - size_t offset = 0; - // compute num elements left from concatenation-axis - size_t num_elements_left = std::accumulate(result._shape.begin(), - &result._shape[axis], - 1, - std::multiplies()); - int tid = 0; - int index = 0; - std::cout << "Num ELements on the left are " << num_elements_left << "\n"; - for (auto& tensor : tensors) { - std::cout << "Tid is " << tid << "\n"; - int src_index = 0; - // tensors differ only on the axis dimension - size_t num_elements_right = std::accumulate(&tensor._shape[axis], - tensor._shape.end(), - 1, - std::multiplies()); - if (tensor.isContiguous(tensor._element_size)) { - for (size_t left = 0; left < num_elements_left; left++) { - // FIXME: This will break if axis = 0; -#warning Will break when axis is 0 - uint8_t* dst_start_ptr = - &result._data[left * result._strides[axis - 1]] + - tid * result._strides[axis]; - uint8_t* src_start_ptr = - &tensor._data[left * tensor._strides[axis - 1]]; - std::cout << "Next left\n"; - std::cout << "result._strides " << result._strides[axis - 1] << "\n"; - std::cout << "tensor._strides " << tensor._strides[axis - 1] << "\n"; - for (int right = 0; right < num_elements_right; right++) { - index = ((uintptr_t)dst_start_ptr - (uintptr_t)result._data) / - result._element_size; - src_index = ((uintptr_t)src_start_ptr - (uintptr_t)tensor._data) / - tensor._element_size; - std::cout << "Dest index: " << index << "\n"; - std::cout << "Src index: " << src_index << "\n"; - if (tensor._dType == AMS_SINGLE) { - float tmp = *reinterpret_cast(src_start_ptr); - for (int i = 0; i < sizeof(float); i++) { - dst_start_ptr[i] = src_start_ptr[i]; - } - dst_start_ptr += sizeof(float); - src_start_ptr += sizeof(float); - } else if (tensor._dType == AMS_DOUBLE) { - for (int i = 0; i < sizeof(double); i++) { - dst_start_ptr[i] = src_start_ptr[i]; - } - dst_start_ptr += sizeof(double); - src_start_ptr += sizeof(double); - } - index++; - src_index++; - } - } - } else { - uint64_t dst_elements = 0; - uint64_t dst_offset = 0; - uint8_t* dst_start_ptr = - &result._data[dst_offset * result._strides[axis - 1]] + - tid * result._strides[axis]; - std::cout << "Tid is " << tid << " and result stride is " - << result._strides[axis] << "\n"; - tensor.dump_vector("Shape", tensor.shape()); - for (size_t i = 0; i < tensor.elements(); i++) { - ams::SmallVector index(tensor.shape().size(), 0); - int rem = i; - for (long j = index.size() - 1; j >= 0; j--) { - index[j] = rem % tensor.shape()[j]; - rem = rem / tensor.shape()[j]; - } - tensor.dump_vector("Index is", index); - tensor.dump(); - if (tensor._dType == AMS_SINGLE) { - float tmp = tensor.elementAt(index); - float* dst = (float*)dst_start_ptr; - dst[dst_elements] = tmp; - std::cout << "Assigning element " << tmp << "\n"; - } else if (tensor._dType == AMS_DOUBLE) { - double tmp = tensor.elementAt(index); - double* dst = (double*)dst_start_ptr; - dst[dst_elements] = tmp; - } - dst_elements++; - std::cout << "Num Elements right are " << num_elements_right << "\n"; - if (dst_elements == num_elements_right) { - dst_offset += 1; - dst_start_ptr = - &result._data[dst_offset * result._strides[axis - 1]] + - tid * result._strides[axis]; - - dst_elements = 0; - std::cout << "Increasing pointer by " << result._strides[axis - 1] - << "\n"; - for (int i = 0; i < tensor.shape()[axis]; i++) { - std::cout << ((float*)(dst_start_ptr))[i] << "\n"; - } - } - } - } - // Here we move the pointer of the 'tid' index. - tid += tensor._shape[axis]; - } - return result; - } - - /** - * @brief Accesses an element of the tensor at the specified multi-dimensional index. - * - * This function uses the tensor's strides and shape to calculate the correct - * memory offset based on the provided indices, allowing access to an element - * regardless of the tensor's layout or any transpositions. - * - * @tparam T The data type of the element to retrieve. - * @param[in] indices A vector of indices specifying the location of the element - * in each dimension. The number of indices must match the - * tensor's number of dimensions. - * @return A reference to the element at the specified location. - * @throw std::out_of_range if the number of indices does not match the tensor's - * dimensions or if any index is out of bounds. - */ - template - T& elementAt(const ams::ArrayRef indices) const - { - if (indices.size() != _shape.size()) { - throw std::out_of_range( - "Number of indices does not match tensor dimensions."); - } - - if (sizeof(T) != _element_size) - throw std::invalid_argument( - "Accessing element at tensor-position with incompatible " - "data-type-size"); - - size_t offset = 0; - for (size_t i = 0; i < indices.size(); ++i) { - if (indices[i] >= _shape[i]) { - throw std::out_of_range("Index out of bounds in elementAt."); - } - offset += indices[i] * _strides[i]; - } - - return *reinterpret_cast(_data + offset); - } - - /** - * @brief Computes the number of elements in the tensor given its shape. - * @param[in] shapes The shape of the tensor as an array reference. - * @return The total number of elements in the tensor. - */ - static size_t computeNumElements(ams::ArrayRef shapes) - { - return std::accumulate(shapes.begin(), - shapes.end(), - 1, - std::multiplies()); - } - - // Helper function to compute contiguous strides for a given shape - static ams::SmallVector computeStrides( - const ams::ArrayRef& shape, - const size_t element_size) - { - ams::SmallVector strides(shape.size()); - size_t stride = element_size; - for (int i = shape.size() - 1; i >= 0; --i) { - strides[i] = stride; - stride *= shape[i]; - } - return strides; - } - - // Reshape function with attempt to adjust strides - AMSTensor reshape(const ams::ArrayRef& new_shape) - { - size_t new_elements = computeNumElements(new_shape); - if (new_elements != _elements) { - throw std::invalid_argument( - "New shape must have the same total number of elements as the " - "original tensor."); - } - - if (canReshapeWithStrides(new_shape)) { - // Data is contiguous and can be reshaped without copying - auto new_strides = computeStrides(new_shape, _element_size); - return AMSTensor::view(_data, new_shape, new_strides, _dType, _location); - } else { - // Data is non-contiguous or not compatible with new strides, create a contiguous copy - AMSTensor contiguous_tensor = - AMSTensor::create(new_shape, - computeStrides(new_shape, _element_size), - _dType, - _location); - - // Copy data from the original tensor to the contiguous tensor -#warning this is wrong. - auto& rm = ams::ResourceManager::getInstance(); - rm.copy(_data, - _location, - contiguous_tensor.data(), - _location, - _elements * _element_size); - - return contiguous_tensor; - } - } - - AMSTensor expand(const ams::ArrayRef new_shape) const - { - // Check if the new shape is compatible for expansion - if (new_shape.size() < _shape.size()) { - throw std::invalid_argument( - "New shape must have equal or greater rank than the original shape."); - } - - // Initialize new strides for the expanded tensor - ams::SmallVector new_strides(new_shape.size(), 0); - - // Map the original shape dimensions onto the new shape, from the last dimension backward - size_t shape_offset = new_shape.size() - _shape.size(); - for (size_t i = 0; i < _shape.size(); ++i) { - size_t new_dim = shape_offset + i; - - if (_shape[i] == 1 && new_shape[new_dim] > 1) { - // Set stride to 0 for expanded singleton dimensions - new_strides[new_dim] = 0; - } else if (_shape[i] == new_shape[new_dim]) { - // Retain the original stride if dimension size matches - new_strides[new_dim] = _strides[i]; - } else { - throw std::invalid_argument( - "Cannot expand non-singleton dimension to a different size."); - } - } - - // Create and return a new tensor view with the expanded shape and updated strides - return AMSTensor::view(_data, new_shape, new_strides, _dType, _location); - } - // Function to align and expand a tensor for batch alignment - // Helper function to align and expand a tensor's shape for batch alignment - static AMSTensor alignAndExpand(AMSTensor& tensor, - int target_batch_size, - int max_rank) - { - auto shape = tensor.shape(); - - ams::SmallVector new_shape(max_rank, 1); - // Move tensor's dimensions to the appropriate location in `new_shape` - for (size_t i = 0, j = 0; i < shape.size(); ++i, ++j) { - new_shape[j] = shape[i]; - } - std::cout << "Before reshape \n"; - tensor.dump(); - return tensor.reshape(new_shape); // Reshape without copying if possible - } - - void dump_vector(const std::string name, ams::ArrayRef Vec) const - { - std::cout << name << " ["; - for (auto I : Vec) { - std::cout << I << ", "; - } - std::cout << "]\n"; - } - - void dump() const - { - dump_vector("Stride", _strides); - dump_vector("Shape", _shape); - std::cout << "Elements " << _elements << "\n"; - } - - static AMSTensor concatenateTensors(ams::MutableArrayRef tensors) - { - if (tensors.empty()) { - throw std::invalid_argument("No tensors provided for concatenation."); - } - - // Determine the batch axis and target batch size based on the first tensor - - int batch_axis = tensors[0].batch_axis(); - - // For all tensors, AMS assumes that batch_axis points to the dimension holding the samples. That one needs to be equal across all tensors. - size_t batch_dim_size = tensors[0]._shape[tensors[0]._batch_axis]; - std::vector aligned_tensors; - - for (auto& T : tensors) { - if (batch_dim_size != T._shape[T._batch_axis]) - throw std::invalid_argument( - "Tensors should have equal shape on batch-axis"); - if (T._batch_axis != 0) { - aligned_tensors.push_back(T.transpose(T._batch_axis, 0)); - } else { - aligned_tensors.push_back(AMSTensor::view(T)); - } - } - - // Find the maximum rank among all tensors to align shapes - size_t max_rank = 0; - for (const auto& tensor : tensors) { - max_rank = std::max(max_rank, tensor.shape().size()); - } - - // FIXME: TILL THIS POINT THIS is "correct" - ams::SmallVector expanded_tensors; - // Align all tensors to the same rank and check for broadcasting compatibility - for (AMSTensor& tensor : aligned_tensors) { - // Align and expand each tensor to have the same rank as `max_rank` - std::cout << "Original Tensor is \n"; - ams::SmallVector new_shape(tensor.shape()); - for (int i = tensor._shape.size(); i < max_rank; i++) { - new_shape.push_back(1); - // TODO we likely need also to generate the strides correctly. Need to test this. -#warning Test for strides. - } - tensor._shape = new_shape; - expanded_tensors.push_back(view(tensor)); - } - - // Concatenate tensors along the last dimension or specified axis - std::cout << "========= Debug =======\n"; - for (auto& V : expanded_tensors) { - std::cout << "expanded_tensors \n"; - V.dump(); - for (size_t i = 0; i < V.shape()[0]; i++) { - for (size_t j = 0; j < V.shape()[1]; j++) { - std::cout << "ELements at {" << i << ", " << j << "} " - << V.elementAt({i, j}) << "\n"; - } - } - } - std::cout << "========= Debug =======\n"; - - std::cout << "Max Ranking is " << max_rank << "\n"; - - // Always concat on outer dimension - return AMSTensor::concatenate(expanded_tensors, max_rank - 1); - } - - size_t elements() const { return _elements; } - size_t element_size() const { return _element_size; } - size_t batch_axis() const { return _batch_axis; } - AMSDType dType() const { return _dType; } - AMSResourceType location() const { return _location; } - ams::ArrayRef strides() const { return _strides; } - ams::ArrayRef shape() const { return _shape; } - bool contiguous() const { return _contiguous; } -}; diff --git a/src/AMSlib/wf/ams_tensor.hpp b/src/AMSlib/wf/ams_tensor.hpp deleted file mode 100644 index b110e5b7..00000000 --- a/src/AMSlib/wf/ams_tensor.hpp +++ /dev/null @@ -1,155 +0,0 @@ -#include -#include - -#include -#include - -#include "resource_manager.hpp" -#include "utils.hpp" - -// Utility function to calculate element size -static size_t elementSize(const AMSDType type) -{ - switch (type) { - case AMS_SINGLE: - return sizeof(float); - case AMS_DOUBLE: - return sizeof(double); - default: - throw std::invalid_argument("Unsupported data type"); - } -} - -struct HostMemoryDeleter { - void operator()(void* ptr) const - { - auto& rm = ams::ResourceManager::getInstance(); - rm.deallocate(ptr, AMSResourceType::AMS_HOST); - } -}; - - -struct DeviceMemoryDeleter { - void operator()(void* ptr) const - { - auto& rm = ams::ResourceManager::getInstance(); - rm.deallocate(ptr, AMSResourceType::AMS_DEVICE); - } -}; - - -// AMSTensor class definition -class AMSTensor -{ - -private: - ams::ResourceManager& rm; - std::vector shape_; - std::vector strides_; - AMSDType dtype_; - AMSResourceType location_; - size_t num_elements_; - std::shared_ptr data_; // Pointer to tensor data - size_t bytes_; - - size_t calculateNumElements(const std::vector& shape) const - { - return std::accumulate(shape.begin(), - shape.end(), - 1, - std::multiplies()); - } - - std::vector calculateStrides(const std::vector& shape) const - { - std::vector strides(shape.size()); - size_t stride = 1; - for (int i = shape.size() - 1; i >= 0; --i) { - strides[i] = stride; - stride *= shape[i]; - } - return strides; - } - -public: - // Constructor for AMSTensor - AMSTensor(const std::vector& shape, - AMSDType dtype, - AMSResourceType location = AMSResourceType::AMS_HOST) - : rm(ams::ResourceManager::getInstance()), - shape_(shape), - dtype_(dtype), - location_(location) - { - - // Calculate the total number of elements - num_elements_ = 1; - for (auto dim : shape) { - num_elements_ *= dim; - } - - // Allocate memory for the tensor based on datatype and shape - bytes_ = num_elements_ * elementSize(dtype); - if (location == AMSResourceType::AMS_HOST) - data_ = std::shared_ptr(rm.allocate(bytes_, location), - HostMemoryDeleter()); - else if (location == AMSResourceType::AMS_DEVICE) - data_ = std::shared_ptr(rm.allocate(bytes_, location), - DeviceMemoryDeleter()); - } - - // Destructor to free memory - ~AMSTensor() {} - - // Accessors - const std::vector& shape() const { return shape_; } - AMSDType dtype() const { return dtype_; } - AMSResourceType location() const { return location_; } - size_t numElements() const { return num_elements_; } - - // Data access methods - template - std::shared_ptr data() const - { - return (data_); - } - - // Reshape the tensor (in-place) - void reshape(const std::vector& new_shape) - { - size_t new_num_elements = calculateNumElements(new_shape); - if (new_num_elements != num_elements_) { - throw std::invalid_argument( - "Total number of elements must remain constant when reshaping"); - } - shape_ = new_shape; - strides_ = calculateStrides(new_shape); - } - - // Index calculation - size_t flattenIndex(const std::vector& indices) const - { - if (indices.size() != shape_.size()) { - throw std::invalid_argument("Incorrect number of indices"); - } - - size_t flat_index = 0; - for (size_t i = 0; i < indices.size(); ++i) { - flat_index += indices[i] * strides_[i]; - } - return flat_index; - } - - - template - static AMSTensor from(std::vector data, - size_t totalElements, - AMSDType dType, - AMSResourceType location) - { - // This allocates the memory we need and the shape we need. - AMSTensor ATensor({totalElements, data.size()}, dType, location); - if (getDType() == dType) { - } - } -}; diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index e93c3a69..e09ae9a3 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -24,8 +24,8 @@ #include #include "AMS.h" +#include "ArrayRef.hpp" #include "debug.h" -#include "util/ArrayRef.hpp" #include "wf/debug.h" #include "wf/resource_manager.hpp" #include "wf/utils.hpp" @@ -130,6 +130,8 @@ class BaseDB virtual bool updateModel() { return false; } virtual std::string getLatestModel() { return {}; } + + virtual std::string getFilename() const { return ""; } }; /** @@ -278,8 +280,7 @@ class hdf5DB final : public FileDB hdf5DB(std::string path, std::string domain_name, std::string fn, - uint64_t rId, - bool predicate = false); + uint64_t rId); /** * @brief deconstructs the class and closes the file @@ -1781,13 +1782,9 @@ class DBManager std::shared_ptr createDB(std::string& domainName, std::string& dbLabel, AMSDBType dbType, - uint64_t rId = 0, - bool isDebug = false) + uint64_t rId = 0) { - CWARNING(DBManager, - (isDebug && dbType != AMSDBType::AMS_HDF5), - "Requesting debug database but %d db type does not support it", - dbType); + #ifdef __ENABLE_DB__ DBG(DBManager, "Instantiating data base"); @@ -1802,8 +1799,10 @@ class DBManager switch (dbType) { #ifdef __ENABLE_HDF5__ case AMSDBType::AMS_HDF5: - return std::make_shared( - fs_interface.path(), domainName, dbLabel, rId, isDebug); + return std::make_shared(fs_interface.path(), + domainName, + dbLabel, + rId); #endif #ifdef __ENABLE_RMQ__ case AMSDBType::AMS_RMQ: @@ -1830,8 +1829,7 @@ class DBManager */ std::shared_ptr getDB(std::string& domainName, std::string& dbLabel, - uint64_t rId = 0, - bool isDebug = false) + uint64_t rId = 0) { DBG(DBManager, "Requested DB for domain: '%s' Under Name: '%s' DB Configured to " @@ -1849,7 +1847,7 @@ class DBManager auto db_iter = db_instances.find(std::string(key)); if (db_iter == db_instances.end()) { - auto db = createDB(domainName, dbLabel, dbType, rId, isDebug); + auto db = createDB(domainName, dbLabel, dbType, rId); db_instances.insert(std::make_pair(std::string(domainName), db)); DBG(DBManager, "Creating new Database writting to file: %s", @@ -1937,6 +1935,9 @@ class DBManager "enabled") #endif } + + size_t getNumInstances() const { return db_instances.size(); } + void clean() { db_instances.clear(); } }; } // namespace db diff --git a/src/AMSlib/wf/device.hpp b/src/AMSlib/wf/device.hpp deleted file mode 100644 index d197bd21..00000000 --- a/src/AMSlib/wf/device.hpp +++ /dev/null @@ -1,334 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef __AMS_DEVICE_HPP__ -#define __AMS_DEVICE_HPP__ - -#include -#include -#include -#include - -#include "AMS.h" -#include "wf/debug.h" - -#define UNDEFINED_FUNC -1 - -#ifdef __ENABLE_CUDA__ -namespace ams -{ -void DtoDMemcpy(void *dest, void *src, size_t nBytes); - -void HtoHMemcpy(void *dest, void *src, size_t nBytes); - -void HtoDMemcpy(void *dest, void *src, size_t nBytes); - -void DtoHMemcpy(void *dest, void *src, size_t nBytes); - -void *DeviceAllocate(size_t nBytes); - -void DeviceFree(void *ptr); - -void *DevicePinnedAlloc(size_t nBytes); - -void DeviceFreePinned(void *ptr); - -void deviceCheckErrors(const char *file, int line); - -void device_random_uq(int seed, - bool *uq_flags, - int ndata, - double acceptable_error); - -namespace Device -{ - -template -void computeDeltaUQMeanPredicatesDevice( - const scalar_t *__restrict__ outputs_stdev, - bool *__restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold); - - -template -void computeDeltaUQMaxPredicatesDevice( - const scalar_t *__restrict__ outputs_stdev, - bool *__restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold); - -void device_compute_predicate(float *data, - bool *predicate, - size_t nData, - const size_t kneigh, - float threshold); - -template -PERFFASPECT() -void rand_init(bool *predicate, const size_t n, TypeValue threshold); - -template -void device_linearize(TypeOutValue *output, - const TypeInValue *const *inputs, - size_t dims, - size_t elements); - -template -int device_compact(bool cond, - const T **sparse, - T **dense, - const bool *dPredicate, - const size_t length, - int dims, - int blockSize, - bool isReverse = false); - -template -int device_compact(bool cond, - T **sparse, - T **dense, - int *indices, - const size_t length, - int dims, - int blockSize, - const bool *dPredicate, - bool isReverse = false); - - -PERFFASPECT() -inline void computePredicate(float *data, - bool *predicate, - size_t nData, - const size_t kneigh, - float threshold) -{ - return device_compute_predicate(data, predicate, nData, kneigh, threshold); -} - - -template -PERFFASPECT() -inline void linearize(TypeOutValue *output, - const TypeInValue *const *inputs, - size_t dims, - size_t elements) -{ - return device_linearize(output, inputs, dims, elements); -} - -template -PERFFASPECT() -inline int pack(bool cond, - const bool *predicate, - const size_t n, - const TypeValue **sparse, - TypeValue **dense, - int dims) -{ - return device_compact(cond, sparse, dense, predicate, n, dims, 1024); -} - -template -PERFFASPECT() -inline int pack(bool cond, - const bool *predicate, - const size_t n, - TypeValue **sparse, - TypeValue **dense, - int *sparse_indices, - int dims) -{ - return device_compact( - cond, sparse, dense, sparse_indices, n, dims, 1024, predicate); -} - -template -PERFFASPECT() -inline int unpack(bool cond, - const bool *predicate, - const size_t n, - TypeValue **sparse, - TypeValue **dense, - int dims) -{ - return device_compact(cond, - const_cast(sparse), - dense, - predicate, - n, - dims, - 1024, - true); -} - -template -PERFFASPECT() -inline int unpack(bool cond, - const size_t n, - TypeValue **sparse, - TypeValue **dense, - int *sparse_indices, - int dims) -{ - return device_compact( - cond, sparse, dense, sparse_indices, n, dims, 1024, NULL, true); -} - -} // namespace Device -} // namespace ams - -#else - -namespace ams -{ - - -PERFFASPECT() -inline void DtoDMemcpy(void *dest, void *src, size_t nBytes) -{ - FATAL(Device, "DtoD Memcpy Not Enabled"); -} - -PERFFASPECT() -inline void HtoHMemcpy(void *dest, void *src, size_t nBytes) -{ - std::memcpy(dest, src, nBytes); -} - -PERFFASPECT() -inline void HtoDMemcpy(void *dest, void *src, size_t nBytes) -{ - FATAL(Device, "HtoD Memcpy Not Enabled"); -} - -PERFFASPECT() -inline void DtoHMemcpy(void *dest, void *src, size_t nBytes) -{ - FATAL(Device, "DtoH Memcpy Not Enabled"); -} - - -inline void *DeviceAllocate(size_t nBytes) -{ - FATAL(Device, "DtoH Memcpy Not Enabled"); -} - - -PERFFASPECT() -inline void DeviceFree(void *ptr) { FATAL(Device, "DtoH Memcpy Not Enabled"); } - -PERFFASPECT() -inline void *DevicePinnedAlloc(size_t nBytes) -{ - FATAL(Device, "Pinned Alloc Not Enabled"); -} - -PERFFASPECT() -inline void DeviceFreePinned(void *ptr) -{ - FATAL(Device, "Pinned Free Pinned Not Enabled"); -} - -inline void device_random_uq(int seed, - bool *uq_flags, - int ndata, - double acceptable_error) -{ - FATAL(Device, "Called Device Runtime UQ without enabling Device compilation"); -} - - -inline void deviceCheckErrors(const char *file, int line) { return; } - -namespace Device -{ -PERFFASPECT() -inline void computePredicate(float *data, - bool *predicate, - size_t nData, - const size_t kneigh, - float threshold) -{ - FATAL(Device, "Called device code when CUDA disabled"); - return; -} - - -template -PERFFASPECT() -inline void linearize(TypeOutValue *output, - const TypeInValue *const *inputs, - size_t dims, - size_t elements) -{ - FATAL(Device, "Called device code when CUDA disabled"); - return; -} - -template -PERFFASPECT() -inline int pack(bool cond, - const bool *predicate, - const size_t n, - const TypeValue **sparse, - TypeValue **dense, - int dims) -{ - FATAL(Device, "Called device code when CUDA disabled"); - return UNDEFINED_FUNC; -} - -template -PERFFASPECT() -inline int pack(bool cond, - const bool *predicate, - const size_t n, - TypeValue **sparse, - TypeValue **dense, - int *sparse_indices, - int dims) -{ - FATAL(Device, "Called device code when CUDA disabled"); - return UNDEFINED_FUNC; -} - -template -PERFFASPECT() -inline int unpack(bool cond, - const bool *predicate, - const size_t n, - TypeValue **sparse, - TypeValue **dense, - int dims) -{ - FATAL(Device, "Called device code when CUDA disabled"); - return UNDEFINED_FUNC; -} - -template -PERFFASPECT() -inline int unpack(bool cond, - const size_t n, - TypeValue **sparse, - TypeValue **dense, - int *sparse_indices, - int dims) -{ - FATAL(Device, "Called device code when CUDA disabled"); - return UNDEFINED_FUNC; -} - -} // namespace Device -} // namespace ams - -#endif - - -#endif diff --git a/src/AMSlib/wf/hdf5db.cpp b/src/AMSlib/wf/hdf5db.cpp index bd79e9b7..3b431831 100644 --- a/src/AMSlib/wf/hdf5db.cpp +++ b/src/AMSlib/wf/hdf5db.cpp @@ -15,7 +15,7 @@ #include -#include "util/ArrayRef.hpp" +#include "ArrayRef.hpp" #include "utils.hpp" #include "wf/basedb.hpp" @@ -268,8 +268,7 @@ void hdf5DB::_store(const at::Tensor& inputs, const at::Tensor& outputs) hdf5DB::hdf5DB(std::string path, std::string domain_name, std::string fn, - uint64_t rId, - bool predicate) + uint64_t rId) : FileDB(path, fn, ".h5", rId), HDOset(-1), HDIset(-1) { std::error_code ec; diff --git a/src/AMSlib/wf/interface.cpp b/src/AMSlib/wf/interface.cpp new file mode 100644 index 00000000..a54baea6 --- /dev/null +++ b/src/AMSlib/wf/interface.cpp @@ -0,0 +1,78 @@ +#include +#include + +#include "AMS.h" +#include "AMSTensor.hpp" + +using namespace ams; + +static AMSResourceType torchDeviceToAMSDevice(c10::DeviceType dType) +{ + switch (dType) { + case c10::DeviceType::CUDA: + case c10::DeviceType::HIP: + return AMSResourceType::AMS_DEVICE; + case c10::DeviceType::CPU: + return AMSResourceType::AMS_HOST; + default: + return AMSResourceType::AMS_UNKNOWN; + } + return AMSResourceType::AMS_UNKNOWN; +} + +static AMSDType torchDTypeToAMSType(torch::Dtype dtype) +{ + static const std::unordered_map dtypeMap = { + {torch::kFloat32, AMSDType::AMS_SINGLE}, + {torch::kFloat, AMSDType::AMS_SINGLE}, // Alias for float32 + {torch::kFloat64, AMSDType::AMS_DOUBLE}, + {torch::kDouble, AMSDType::AMS_DOUBLE}, // Alias for float64 + {torch::kInt32, AMSDType::AMS_UNKNOWN_TYPE}, + {torch::kInt64, AMSDType::AMS_UNKNOWN_TYPE}, + {torch::kBool, AMSDType::AMS_UNKNOWN_TYPE}, + {torch::kUInt8, AMSDType::AMS_UNKNOWN_TYPE}, + {torch::kInt8, AMSDType::AMS_UNKNOWN_TYPE}, + {torch::kHalf, AMSDType::AMS_UNKNOWN_TYPE}, + {torch::kBFloat16, AMSDType::AMS_UNKNOWN_TYPE}}; + + return dtypeMap.count(dtype) ? dtypeMap.at(dtype) + : AMSDType::AMS_UNKNOWN_TYPE; +} +static ams::SmallVector torchToAMSTensors( + ams::MutableArrayRef tensorVector) +{ + ams::SmallVector ams_tensors; + for (auto tensor : tensorVector) { + // We should be able to completely remove these conversion by using some template "magic." + // I will leave these for later though + auto dType = torchDTypeToAMSType(tensor.scalar_type()); + auto rType = torchDeviceToAMSDevice(tensor.device().type()); + // In both cases, I am effectively only forwarding the pointer of begin/end to ams. + // this is a cheap operating. It should boil down to: shapes.start = tensor.sizes.start, shapes.end = tensor.sizes.end; + auto shapes = ArrayRef(tensor.sizes().begin(), tensor.strides().size()); + auto strides = ArrayRef(tensor.strides().begin(), tensor.strides().size()); + if (dType == AMSDType::AMS_SINGLE) + ams_tensors.push_back(AMSTensor::view( + (uint8_t*)(tensor.data_ptr()), shapes, strides, dType, rType)); + else if (dType == AMSDType::AMS_DOUBLE) + ams_tensors.push_back( + AMSTensor::view((uint8_t*)(tensor.data_ptr()), + shapes, + strides, + dType, + rType)); + } + return ams_tensors; +} + +void callApplication(EOSLambda CallBack, + ams::MutableArrayRef Ins, + ams::MutableArrayRef InOuts, + ams::MutableArrayRef Outs) +{ + auto AMSIns = torchToAMSTensors(Ins); + auto AMSInOuts = torchToAMSTensors(InOuts); + auto AMSOuts = torchToAMSTensors(Outs); + CallBack(AMSIns, AMSInOuts, AMSOuts); + return; +} diff --git a/src/AMSlib/wf/interface.hpp b/src/AMSlib/wf/interface.hpp new file mode 100644 index 00000000..7937212b --- /dev/null +++ b/src/AMSlib/wf/interface.hpp @@ -0,0 +1,10 @@ +#include +#include + +#include "AMS.h" + + +void callApplication(EOSLambda CallBack, + ams::MutableArrayRef Ins, + ams::MutableArrayRef InOuts, + ams::MutableArrayRef Outs); diff --git a/src/AMSlib/wf/resource_manager.cpp b/src/AMSlib/wf/resource_manager.cpp index e4226477..db25479a 100644 --- a/src/AMSlib/wf/resource_manager.cpp +++ b/src/AMSlib/wf/resource_manager.cpp @@ -8,8 +8,11 @@ #include #include +#ifdef __ENABLE_CUDA__ +#include +#endif + #include "debug.h" -#include "device.hpp" #include "resource_manager.hpp" namespace ams @@ -25,7 +28,7 @@ const std::string AMSAllocator::getName() const { return name; } struct AMSDefaultDeviceAllocator final : AMSAllocator { - AMSDefaultDeviceAllocator(std::string name) : AMSAllocator(name){}; + AMSDefaultDeviceAllocator(std::string name) : AMSAllocator(name) {}; ~AMSDefaultDeviceAllocator() { DBG(AMSDefaultDeviceAllocator, "Destroying default device allocator"); @@ -33,10 +36,21 @@ struct AMSDefaultDeviceAllocator final : AMSAllocator { void *allocate(size_t num_bytes, size_t alignment) { - return DeviceAllocate(num_bytes); +#ifdef __ENABLE_CUDA__ + void *devPtr; + cudaMalloc(&devPtr, num_bytes); + return devPtr; +#else + return nullptr; +#endif } - void deallocate(void *ptr) { return DeviceFree(ptr); } + void deallocate(void *ptr) + { +#ifdef __ENABLE_CUDA__ + cudaFree(ptr); +#endif + } }; struct AMSDefaultHostAllocator final : AMSAllocator { @@ -60,10 +74,21 @@ struct AMSDefaultPinnedAllocator final : AMSAllocator { void *allocate(size_t num_bytes, size_t alignment) { - return DevicePinnedAlloc(num_bytes); +#ifdef __ENABLE_CUDA__ + void *ptr; + cudaHostAlloc(&ptr, num_bytes, cudaHostAllocPortable); + return ptr; +#else + return nullptr; +#endif } - void deallocate(void *ptr) { DeviceFreePinned(ptr); } + void deallocate(void *ptr) + { +#ifdef __ENABLE_CUDA__ + cudaFreeHost(ptr); +#endif + } }; @@ -84,26 +109,30 @@ void _raw_copy(void *src, std::memcpy(dest, src, num_bytes); break; case AMSResourceType::AMS_DEVICE: - HtoDMemcpy(dest, src, num_bytes); +#ifdef __ENABLE_CUDA__ + cudaMemcpy(dest, src, num_bytes, cudaMemcpyHostToDevice); +#endif break; default: FATAL(ResourceManager, "Unknown device type to copy to from HOST"); break; } break; +#ifdef __ENABLE_CUDA__ case AMSResourceType::AMS_DEVICE: switch (dest_dev) { case AMSResourceType::AMS_DEVICE: - DtoDMemcpy(dest, src, num_bytes); + cudaMemcpy(dest, src, num_bytes, cudaMemcpyDeviceToDevice); break; case AMSResourceType::AMS_HOST: case AMSResourceType::AMS_PINNED: - DtoHMemcpy(dest, src, num_bytes); + cudaMemcpy(dest, src, num_bytes, cudaMemcpyDeviceToHost); break; default: FATAL(ResourceManager, "Unknown device type to copy to from DEVICE"); break; } +#endif break; default: FATAL(ResourceManager, "Unknown device type to copy from"); diff --git a/src/AMSlib/wf/utils.cpp b/src/AMSlib/wf/utils.cpp deleted file mode 100644 index 0dc8f8ad..00000000 --- a/src/AMSlib/wf/utils.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#include "wf/utils.hpp" - -void random_uq_host(bool *uq_flags, int ndata, double acceptable_error) -{ - - for (int i = 0; i < ndata; i++) { - uq_flags[i] = ((double)rand() / RAND_MAX) <= acceptable_error; - } -} diff --git a/src/AMSlib/wf/utils.hpp b/src/AMSlib/wf/utils.hpp index f1f044ba..a51e733f 100644 --- a/src/AMSlib/wf/utils.hpp +++ b/src/AMSlib/wf/utils.hpp @@ -8,6 +8,8 @@ #ifndef __AMS_UTILS_HPP__ #define __AMS_UTILS_HPP__ +#include + #include #include #include @@ -15,6 +17,7 @@ #include #include "AMS.h" +#include "SmallVector.hpp" // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- @@ -49,8 +52,6 @@ class isDouble // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- -void random_uq_host(bool *uq_flags, int ndata, double acceptable_error); - template inline bool is_real_equal(T l, T r) { @@ -58,17 +59,31 @@ inline bool is_real_equal(T l, T r) } -static inline size_t dtype_to_size(AMSDType dType) +static inline size_t dtype_to_size(ams::AMSDType dType) { switch (dType) { - case AMSDType::AMS_DOUBLE: + case ams::AMSDType::AMS_DOUBLE: return sizeof(double); - case AMSDType::AMS_SINGLE: + case ams::AMSDType::AMS_SINGLE: return sizeof(float); default: throw std::runtime_error("Requesting the size of unknown object"); } } -// ----------------------------------------------------------------------------- +static inline std::string shapeToString(const at::Tensor& tensor) +{ + std::ostringstream oss; + oss << tensor.sizes(); + return oss.str(); +} + +namespace ams +{ +namespace tensor +{ +SmallVector maskTensor(at::Tensor& Src, at::Tensor& Mask); +} // namespace tensor +} // namespace ams + #endif diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index 311d4ff4..17879c49 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -21,10 +21,11 @@ #include #include "AMS.h" +#include "ArrayRef.hpp" +#include "SmallVector.hpp" +#include "interface.hpp" #include "ml/surrogate.hpp" #include "resource_manager.hpp" -#include "util/ArrayRef.hpp" -#include "util/SmallVector.hpp" #include "wf/basedb.hpp" #ifdef __ENABLE_MPI__ @@ -46,10 +47,6 @@ namespace ams class AMSWorkflow { - /** @brief The application call back to perform the original SPMD physics - * execution */ - AMSPhysicFn AppCall; - /** @brief A string identifier describing the domain-model being solved. */ std::string domainName; @@ -73,9 +70,6 @@ class AMSWorkflow * (world_size for MPI) */ int wSize; - /** @brief Location of the original application data (CPU or GPU) */ - AMSResourceType appDataLoc; - /** @brief execution policy of the distributed system. Load balance or not. */ AMSExecPolicy ePolicy; @@ -91,6 +85,27 @@ class AMSWorkflow /** @brief Is the evaluate a distributed execution **/ bool isDistributed; + void storeComputedData(ArrayRef Ins, + ArrayRef InOutsBefore, + ArrayRef Outs, + ArrayRef InOutsAfter) + { + CALIPER(CALI_MARK_BEGIN("DBSTORE");) + SmallVector StoreInputTensors(Ins.begin(), Ins.end()); + SmallVector StoreOutputTensors(Outs.begin(), Outs.end()); + for (auto Tensor : InOutsBefore) + StoreInputTensors.push_back(Tensor); + for (auto Tensor : InOutsAfter) { + StoreOutputTensors.push_back(Tensor); + } + + DBG(Workflow, + "Storing data (#elements = %ld) to database", + StoreInputTensors[0].sizes()[0]); + store(StoreInputTensors, StoreOutputTensors); + CALIPER(CALI_MARK_END("DBSTORE");) + } + /** \brief Store the data in the database and copies * data from the GPU to the CPU and then to the database. * To store GPU resident data we use a 1MB of "pinned" @@ -105,19 +120,19 @@ class AMSWorkflow { if (!DB) return; + + auto tOptions = torch::TensorOptions() + .dtype(torch::kFloat32) + .device(c10::DeviceType::CPU); + c10::SmallVector ConvertedInputs(Inputs.begin(), Inputs.end()); c10::SmallVector ConvertedOutputs(Outputs.begin(), Outputs.end()); - auto Input = torch::cat(ConvertedInputs, Inputs[0].sizes().size() - 1); - auto Output = torch::cat(ConvertedOutputs, Outputs[0].sizes().size() - 1); - // No database, so just de-allocate and return - if (appDataLoc == AMSResourceType::AMS_HOST) { - return DB->store(Input, Output); - } - if (Input.device() == c10::DeviceType::CUDA) Input = Input.cpu(); - if (Output.device() == c10::DeviceType::CUDA) Output = Output.cpu(); - + auto Input = + torch::cat(ConvertedInputs, Inputs[0].sizes().size() - 1).to(tOptions); + auto Output = torch::cat(ConvertedOutputs, Outputs[0].sizes().size() - 1) + .to(tOptions); // Store to database DB->store(Input, Output); @@ -143,22 +158,17 @@ class AMSWorkflow } public: - AMSWorkflow(AMSPhysicFn _AppCall, - std::string &surrogate_path, + AMSWorkflow(std::string &surrogate_path, std::string &domain_name, std::string &db_label, - bool isDebugDB, - AMSResourceType app_data_loc, float threshold, const AMSUQPolicy uq_policy, int _pId = 0, int _wSize = 1) - : AppCall(_AppCall), - domainName(domain_name), + : domainName(domain_name), dbLabel(db_label), rId(_pId), wSize(_wSize), - appDataLoc(app_data_loc), uqPolicy(uq_policy), #ifdef __ENABLE_MPI__ comm(MPI_COMM_NULL), @@ -172,10 +182,18 @@ class AMSWorkflow DB = dbm.getDB(domainName, dbLabel, rId); MLModel = nullptr; if (!surrogate_path.empty()) - MLModel = SurrogateModel::getInstance(surrogate_path); + MLModel = SurrogateModel::getInstance( + surrogate_path, + uqPolicy == AMSUQPolicy::AMS_DELTAUQ_MAX || + uqPolicy == AMSUQPolicy::AMS_DELTAUQ_MEAN); + } + + std::string getDBFilename() const + { + if (!DB) return ""; + return DB->getFilename(); } - void set_physics(AMSPhysicFn _AppCall) { AppCall = _AppCall; } #ifdef __ENABLE_MPI__ void set_communicator(MPI_Comm communicator) { comm = communicator; } @@ -193,10 +211,11 @@ class AMSWorkflow } - static SmallVector subSelectTensors(ArrayRef Tensors, - at::Tensor &Mask) + static SmallVector subSelectTensors( + ArrayRef Tensors, + torch::Tensor &Mask) { - SmallVector NewVector; + SmallVector NewVector; for (auto O : Tensors) { NewVector.push_back(O.index({Mask})); } @@ -204,30 +223,30 @@ class AMSWorkflow } static void ScatterPhysicOutputsToOrigDomain( - ArrayRef ComputedTensors, + ArrayRef computedDomain, torch::Tensor &Predicate, - ArrayRef AppTensors) + MutableArrayRef entireDomain) { - if (ComputedTensors.size() != AppTensors.size()) { + if (computedDomain.size() != entireDomain.size()) { throw std::runtime_error( "Expecting equal sized tensors when composing Original and domain " "memories\n"); } - for (int i = 0; i < ComputedTensors.size(); i++) { - AppTensors[i].masked_scatter_(Predicate, ComputedTensors[i]); + for (int i = 0; i < computedDomain.size(); i++) { + entireDomain[i].index_put_({Predicate}, computedDomain[i]); } } - static int MLDomainToApplication(at::Tensor Src, - MutableArrayRef Dest, - at::Tensor Predicate, + static int MLDomainToApplication(torch::Tensor Src, + MutableArrayRef Dest, + torch::Tensor Predicate, int offset) { int outerDim = Src.dim() - 1; for (auto &dst : Dest) { int ConcatAxisSize = dst.sizes()[dst.dim() - 1]; - at::Tensor Slice = + torch::Tensor Slice = Src.narrow(outerDim, offset, ConcatAxisSize).to(dst.options()); dst.index_put_({Predicate}, Slice.index({Predicate})); offset += ConcatAxisSize; @@ -284,15 +303,15 @@ class AMSWorkflow * This transformation can exploit the parallel nature of all the required * steps. */ - void evaluate(void *probDescr, - ams::MutableArrayRef Ins, - ams::MutableArrayRef InOuts, - ams::MutableArrayRef Outs) + void evaluate(EOSLambda CallBack, + ams::MutableArrayRef Ins, + ams::MutableArrayRef InOuts, + ams::MutableArrayRef Outs) { CALIPER(CALI_MARK_BEGIN("AMSEvaluate");) - SmallVector InputTensors(Ins.begin(), Ins.end()); - SmallVector OutputTensors(Ins.begin(), Ins.end()); + SmallVector InputTensors(Ins.begin(), Ins.end()); + SmallVector OutputTensors(Ins.begin(), Ins.end()); for (auto Tensor : InOuts) { InputTensors.push_back(Tensor); OutputTensors.push_back(Tensor); @@ -304,8 +323,19 @@ class AMSWorkflow REPORT_MEM_USAGE(Workflow, "Start") if (!MLModel) { - // FIXME This needs to be updated accordingly and call the new interface. - throw std::runtime_error("Pending implementation\n"); + // We need to clone only inout data to guarantee + // we have a copy of them when writting the database + SmallVector PhysicInOutsBefore; + for (auto S : InOuts) + PhysicInOutsBefore.push_back(S.clone()); + + // We call the application here + CALIPER(CALI_MARK_BEGIN("PHYSICS MODULE");) + callApplication(CallBack, Ins, InOuts, Outs); + CALIPER(CALI_MARK_END("PHYSICS MODULE");) + + storeComputedData(Ins, PhysicInOutsBefore, Outs, InOuts); + return; } CALIPER(CALI_MARK_BEGIN("UPDATEMODEL");) @@ -335,31 +365,30 @@ class AMSWorkflow MLDomainToApplication(MLOutputs, InOuts, Predicate, offset); CALIPER(CALI_MARK_END("MLDomainToApplication");) - - if (Predicate.sum().item() == 0) return; - // Revert pedicates and use it to pick the Physic points outputs. auto WrongMLIndices = torch::logical_not(Predicate); + if (WrongMLIndices.sum().item() == 0) return; + // Physis* tensors have the points which the model could not accurately predict CALIPER(CALI_MARK_BEGIN("PACK");) - SmallVector PhysicIns(subSelectTensors(Ins, WrongMLIndices)); - SmallVector PhysicInOuts( + SmallVector PhysicIns(subSelectTensors(Ins, WrongMLIndices)); + SmallVector PhysicInOuts( subSelectTensors(InOuts, WrongMLIndices)); // TODO: Outs does not need sub select, we will write all of these from scratch - SmallVector PhysicOuts(subSelectTensors(Outs, WrongMLIndices)); + SmallVector PhysicOuts( + subSelectTensors(Outs, WrongMLIndices)); CALIPER(CALI_MARK_END("PACK");) // Copy and clone. This important to take place before AppCall is executed. To keep a copy of the input values // that will be overwritten. - SmallVector PhysicInOutsBefore; + SmallVector PhysicInOutsBefore; for (auto S : PhysicInOuts) PhysicInOutsBefore.push_back(S.clone()); // We call the application here CALIPER(CALI_MARK_BEGIN("PHYSICS MODULE");) - //AppCall(probDescr, PhysicIns, PhysicInOuts, PhysicOuts); -#warning put back in when interface is clean. + callApplication(CallBack, PhysicIns, PhysicInOuts, PhysicOuts); CALIPER(CALI_MARK_END("PHYSICS MODULE");) @@ -373,22 +402,10 @@ class AMSWorkflow DBG(Workflow, "Finished physics evaluation") if (DB) { - CALIPER(CALI_MARK_BEGIN("DBSTORE");) - SmallVector StoreInputTensors(PhysicIns.begin(), - PhysicIns.end()); - SmallVector StoreOutputTensors(PhysicOuts.begin(), - PhysicOuts.end()); - for (auto Tensor : PhysicInOutsBefore) - StoreInputTensors.push_back(Tensor); - for (auto Tensor : PhysicInOuts) { - StoreOutputTensors.push_back(Tensor); - } - - DBG(Workflow, - "Storing data (#elements = %ld) to database", - StoreInputTensors[0].sizes()[0]); - store(StoreInputTensors, StoreOutputTensors); - CALIPER(CALI_MARK_END("DBSTORE");) + storeComputedData(PhysicIns, + PhysicInOutsBefore, + PhysicOuts, + PhysicInOuts); } diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index b4e3d3e3..66c1544f 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -308,6 +308,7 @@ >>>>>>> b6e616f (Updated basedb-hdf5) +add_subdirectory(models) add_subdirectory(torch) add_subdirectory(db) add_subdirectory(wf) diff --git a/tests/AMSlib/ams_tensor_test.cpp b/tests/AMSlib/ams_tensor_test.cpp deleted file mode 100644 index d7945798..00000000 --- a/tests/AMSlib/ams_tensor_test.cpp +++ /dev/null @@ -1,610 +0,0 @@ -#include -#include -#include -#include -#include - -#include "util/tensor.hpp" - - -void testCastTensor() -{ - ams::SmallVector shape = {2, 3}; - ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); - - for (size_t i = 0; i < tensor.elements(); ++i) { - tensor.at(i) = static_cast(i + 1); - } - - // Cast tensor to double - AMSTensor doubleTensor = tensor.fp64(); - - // Check that data was cast correctly - for (size_t i = 0; i < doubleTensor.elements(); ++i) { - assert(doubleTensor.at(i) == static_cast(i + 1) && - "castTensor failed."); - } -} - -void testComputeNumElements() -{ - ams::SmallVector shape = {4, 5, 6}; - size_t expected_elements = 4 * 5 * 6; - size_t elements = AMSTensor::computeNumElements(shape); - assert(elements == expected_elements && "computeNumElements failed."); -} - -void testCreate() -{ - ams::SmallVector shape = {4, 4}; - ams::SmallVector strides = {4 * sizeof(float), sizeof(float)}; - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); - - assert(shape == tensor.shape() && "Shape mismatch in create."); - assert(strides == tensor.strides() && "Stride mismatch in create."); - assert(tensor.dType() == AMS_SINGLE && "Data type mismatch in create."); -} - - -void testView() -{ - ams::SmallVector shape = {2, 2}; - ams::SmallVector strides = {2 * sizeof(float), sizeof(float)}; - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); - - for (size_t i = 0; i < tensor.elements(); ++i) { - tensor.at(i) = static_cast(i); - } - - // Create a view of the original tensor - AMSTensor viewTensor = AMSTensor::view( - tensor.data(), shape, strides, AMS_SINGLE, AMS_HOST); - assert(shape == viewTensor.shape() && "Shape mismatch in view."); - assert(strides == viewTensor.strides() && "Stride mismatch in view."); - - for (size_t i = 0; i < viewTensor.elements(); ++i) { - assert(viewTensor.at(i) == tensor.at(i) && - "View data mismatch."); - } -} - - -void testMove() -{ - ams::SmallVector shape = {3, 3}; - ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); - tensor.at(0) = 1.0f; - - // Move constructor - AMSTensor movedTensor(std::move(tensor)); - assert(shape == movedTensor.shape() && "Shape mismatch in move constructor."); - assert(movedTensor.at(0) == 1.0f && - "Data mismatch in move constructor."); - - // Move assignment - AMSTensor anotherTensor = std::move(movedTensor); - assert(anotherTensor.at(0) == 1.0f && - "Data mismatch in move assignment."); -} - -void testDataAccess() -{ - ams::SmallVector shape = {3, 3}; - ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); - - tensor.at(0) = 10.0f; - assert(tensor.data()[0] == 10.0f && "Data access mismatch."); -} - - -void testConversion() -{ - ams::SmallVector shape = {3, 3}; - ams::SmallVector strides = {3 * sizeof(double), sizeof(double)}; - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_DOUBLE, AMS_HOST); - assert(tensor.element_size() == sizeof(double)); - - tensor.at(0) = 5.0; - AMSTensor floatTensor = tensor.fp32(); - assert(floatTensor.element_size() == sizeof(float)); - assert(floatTensor.at(0) == 5.0f && "fp32 conversion failed."); -} - - -void testTranspose() -{ - // Define shape and strides for a 2x3 tensor - ams::SmallVector shape = {2, 3}; - ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); - - // Populate tensor with values for easy checking after transpose - tensor.at(0) = 1.0f; // (0,0) - tensor.at(1) = 2.0f; // (0,1) - tensor.at(2) = 3.0f; // (0,2) - tensor.at(3) = 4.0f; // (1,0) - tensor.at(4) = 5.0f; // (1,1) - tensor.at(5) = 6.0f; // (1,2) - - // Transpose the tensor (swap axes 0 and 1) - AMSTensor transposed = tensor.transpose(0, 1); - - for (int i = 0; i < tensor.elements(); i++) { - std::cout << "Value at " << i << " is : " << tensor.at(i) - << " Transposed is " << transposed.at(i) << "\n"; - } - - // Check that the transposed tensor has the correct shape - assert(transposed.shape()[0] == 3 && transposed.shape()[1] == 2 && - "Shape mismatch in transpose."); - - // Verify that the transposed data matches expected positions - assert(transposed.at(0) == 1.0f && - "mismatch at continuous view at " - "(0,0)"); - assert(transposed.at(1) == 2.0f && - "mismatch at continuous view at " - "(0,1)"); - assert(transposed.at(2) == 3.0f && - "mismatch at continuous view at " - "(1,0)"); - assert(transposed.at(3) == 4.0f && - "mismatch at continuous view at " - "(1,1)"); - assert(transposed.at(4) == 5.0f && - "mismatch at continuous view at " - "(2,0)"); - assert(transposed.at(5) == 6.0f && - "mismatch at continuous view at " - "(2,1)"); - - assert(transposed.elementAt({0, 0}) == 1.0f && - "Transpose value mismatch at (0,0)"); - assert(transposed.elementAt({0, 1}) == 4.0f && - "Transpose value mismatch at (0,1)"); - assert(transposed.elementAt({1, 0}) == 2.0f && - "Transpose value mismatch at (1,0)"); - assert(transposed.elementAt({1, 1}) == 5.0f && - "Transpose value mismatch at (1,1)"); - assert(transposed.elementAt({2, 0}) == 3.0f && - "Transpose value mismatch at (2,0)"); - assert(transposed.elementAt({2, 1}) == 6.0f && - "Transpose value mismatch at (2,1)"); -} - - -void test_canReshapeWithStrides() -{ - ams::SmallVector shape = {2, 3}; - ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); - - assert(tensor.canReshapeWithStrides({6}) && - "This should be a valid reshape {6} -> {2,3}"); - assert(tensor.canReshapeWithStrides({2, 3}) && - "This should be a valid reshape {2,3} -> {6}"); - assert((tensor.canReshapeWithStrides({3, 2})) && - "This should be an ivalid reshape (discontinuous shapes)"); - assert((!tensor.canReshapeWithStrides({8})) && - "This should be an ivalid reshape (differing number of elements)"); -} - -void test_reshape() -{ - { - // Test for reshape case with contiguous new shape - ams::SmallVector shape = {2, 3}; - ams::SmallVector strides = {3 * sizeof(float), sizeof(float)}; - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); - - tensor.at(0) = 1.0f; // (0,0) - tensor.at(1) = 2.0f; // (0,1) - tensor.at(2) = 3.0f; // (0,2) - tensor.at(3) = 4.0f; // (1,0) - tensor.at(4) = 5.0f; // (1,1) - tensor.at(5) = 6.0f; // (1,2) - assert(tensor.canReshapeWithStrides({3, 2}) && - "This should be a valid reshape {2,3} -> {3,2}"); - auto reshaped = tensor.reshape({3, 2}); - - assert(reshaped.elements() == tensor.elements() && - "Both tensors hsould have the same number of elements"); - assert(reshaped.data() == tensor.data() && - "Both tensors are equivalent, and copy should not be there"); - for (int i = 0; i < reshaped.elements(); i++) { - assert(tensor.at(i) == reshaped.at(i) && - "Data should be identical"); - } - } - { - // Test for reshape case with contiguous new shape - ams::SmallVector shape = {2, 3}; - ams::SmallVector strides = {4 * sizeof(float), sizeof(float)}; - - AMSTensor tensor = AMSTensor::create(shape, strides, AMS_SINGLE, AMS_HOST); - tensor.at(0) = 1.0f; // (0,0) - tensor.at(1) = 2.0f; // (0,1) - tensor.at(2) = 3.0f; // (0,2) - tensor.at(3) = 4.0f; // (1,0) - tensor.at(4) = 5.0f; // (1,1) - tensor.at(5) = 6.0f; // (1,2) - - auto reshaped = tensor.reshape({3, 2}); - - assert(reshaped.elements() == tensor.elements() && - "Both tensors hsould have the same number of elements"); - assert(reshaped.data() != tensor.data() && - "Tensor should not be equivalent, and copy should not be there"); - for (int i = 0; i < reshaped.elements(); i++) { - assert(tensor.at(i) == reshaped.at(i) && - "Data should be identical"); - } - } -} - -void testConcatenateTensors() -{ - // Test Case 1 : Basic Concatenation with Compatible Shapes - { - AMSTensor tensor1 = - AMSTensor::create({2, 3}, - {3 * sizeof(float), 1 * sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 3] - AMSTensor tensor2 = - AMSTensor::create({2, 3}, - {3 * sizeof(float), 1 * sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 3] - - tensor1.at(0) = 1.0f; - tensor1.at(1) = 2.0f; - tensor1.at(2) = 3.0f; - tensor1.at(3) = 4.0f; - tensor1.at(4) = 5.0f; - tensor1.at(5) = 6.0f; - - tensor2.at(0) = 7.0f; - tensor2.at(1) = 8.0f; - tensor2.at(2) = 9.0f; - tensor2.at(3) = 10.0f; - tensor2.at(4) = 11.0f; - tensor2.at(5) = 12.0f; - - ams::SmallVector iTensors; - float* ptr1 = tensor1.data(); - float* ptr2 = tensor2.data(); - iTensors.push_back(std::move(tensor1)); - iTensors.push_back(std::move(tensor2)); - AMSTensor result = AMSTensor::concatenateTensors(iTensors); - - ams::SmallVector expected_shape({2, 6}); - - assert(expected_shape == result.shape() && "Expecting shape to be {2,6}"); - int elements = std::accumulate(result.shape().begin(), - result.shape().end(), - 1, - std::multiplies()); - - for (size_t i = 0; i < 2; i++) { - for (size_t j = 0; j < 6; j++) { - std::cout << result.elementAt({i, j}) << " " - << iTensors[j / 3].elementAt({i, j % 3}) << "\n"; - assert(result.elementAt({i, j}) == - iTensors[j / 3].elementAt({i, j % 3}) && - "Values do not match"); - } - } - - std::cout << "Test Case 1 Passed!" << std::endl; - } - - // Test Case 2: Concatenation with Broadcasting - { - AMSTensor tensor1 = - AMSTensor::create({2, 1}, - {1 * sizeof(float), 1 * sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 1] - AMSTensor tensor2 = - AMSTensor::create({2, 3}, - {3 * sizeof(float), 1 * sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 3] - - tensor1.at(0) = 1.0f; - tensor1.at(1) = 2.0f; - - tensor2.at(0) = 3.0f; - tensor2.at(1) = 4.0f; - tensor2.at(2) = 5.0f; - tensor2.at(3) = 6.0f; - tensor2.at(4) = 7.0f; - tensor2.at(5) = 8.0f; - - ams::SmallVector iTensors; - float* ptr1 = tensor1.data(); - float* ptr2 = tensor2.data(); - iTensors.push_back(std::move(tensor1)); - iTensors.push_back(std::move(tensor2)); - AMSTensor result = AMSTensor::concatenateTensors(iTensors); - for (auto& T : iTensors) { - std::cout << "Tensor\n"; - for (size_t i = 0; i < T.shape()[0]; i++) { - for (size_t j = 0; j < T.shape()[1]; j++) { - std::cout << "[" << i << ", " << j - << "]:" << T.elementAt({i, j}) << "\n"; - } - } - } - - for (size_t i = 0; i < 2; i++) { - for (size_t j = 0; j < 4; j++) { - assert(result.elementAt({i, j}) == - iTensors[j > 0].elementAt({i, j != 0 ? j - 1 : 0}) && - "Values do not match"); - } - } - - std::cout << "Test Case 2 Passed!" << std::endl; - } - - // Test Case 3: Concatenating tensors over different batch axises - { - AMSTensor tensor1 = AMSTensor::create({3, 2}, - {2 * sizeof(float), sizeof(float)}, - AMS_SINGLE, - AMS_HOST, - 0); // Shape: [3, 2] - AMSTensor tensor2 = AMSTensor::create({2, 3}, - {3 * sizeof(float), sizeof(float)}, - AMS_SINGLE, - AMS_HOST, - 1); // Shape: [2, 3] - - tensor1.at(0) = 1.0f; - tensor1.at(1) = 2.0f; - tensor1.at(2) = 3.0f; - tensor1.at(3) = 4.0f; - tensor1.at(4) = 5.0f; - tensor1.at(5) = 6.0f; - - tensor2.at(0) = 11.0f; - tensor2.at(1) = 12.0f; - tensor2.at(2) = 13.0f; - tensor2.at(3) = 14.0f; - tensor2.at(4) = 15.0f; - tensor2.at(5) = 16.0f; - - ams::SmallVector iTensors; - iTensors.push_back(std::move(tensor1)); - iTensors.push_back(std::move(tensor2)); - - AMSTensor result = AMSTensor::concatenateTensors(iTensors); - std::cout << "Result\n"; - result.dump(); - for (size_t i = 0; i < 3; i++) { - for (size_t j = 0; j < 2; j++) { - std::cout << "ELements at {" << i << ", " << j << "} " - << result.elementAt({i, j}) << "\n"; - assert(result.elementAt({i, j}) == - iTensors[0].elementAt({i, j}) && - "Values do not match"); - } - } - - for (size_t i = 0; i < 3; i++) { - for (size_t j = 0; j < 2; j++) { - std::cout << "ELements at {" << i << ", " << j + 2 << "} " - << result.elementAt({i, 2 + j}) << "\n"; - assert(result.elementAt({i, j + 2}) == - iTensors[1].elementAt({j, i}) && - "Values do not match"); - } - } - - std::cout << "Test Case 3 Passed!" << std::endl; - } - - // Test Case 5 : Incompatible Shapes(Expect Exception) - try { - AMSTensor tensor1 = - AMSTensor::create({2, 2}, - {2 * sizeof(float), 1 * sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 2] - AMSTensor tensor2 = - AMSTensor::create({3, 2}, - {2 * sizeof(float), 1 * sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [3, 2] - ams::SmallVector iTensors; - iTensors.push_back(std::move(tensor1)); - iTensors.push_back(std::move(tensor2)); - AMSTensor result = AMSTensor::concatenateTensors(iTensors); - std::cerr << "Test Case 4 Failed: Expected exception was not thrown." - << std::endl; - } catch (const std::invalid_argument& e) { - std::cout << "Test Case 4 Passed!" << std::endl; - } - - // Test Case 6: Concatenate with broadcast - { - float scalar = 128; - AMSTensor tensor1 = AMSTensor::view((uint8_t*)&scalar, - {2, 1}, - {0, sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 1] - AMSTensor tensor2 = - AMSTensor::create({2, 3}, - {3 * sizeof(float), 1 * sizeof(float)}, - AMS_SINGLE, - AMS_HOST); // Shape: [2, 3] - - tensor2.at(0) = 1.0f; - tensor2.at(1) = 2.0f; - tensor2.at(2) = 3.0f; - tensor2.at(3) = 4.0f; - tensor2.at(4) = 5.0f; - tensor2.at(5) = 6.0f; - - ams::SmallVector iTensors; - float* ptr1 = tensor1.data(); - float* ptr2 = tensor2.data(); - iTensors.push_back(std::move(tensor1)); - iTensors.push_back(std::move(tensor2)); - AMSTensor result = AMSTensor::concatenateTensors(iTensors); - std::cout << "Tensor\n"; - for (size_t i = 0; i < result.shape()[0]; i++) { - for (size_t j = 0; j < result.shape()[1]; j++) { - std::cout << "[" << i << ", " << j - << "]:" << result.elementAt({i, j}) << "\n"; - } - } - - for (size_t i = 0; i < 2; i++) { - for (size_t j = 0; j < 4; j++) { - assert(result.elementAt({i, j}) == - iTensors[j > 0].elementAt({i, j != 0 ? j - 1 : 0}) && - "Values do not match"); - } - } - - std::cout << "Test Case 5 Passed!" << std::endl; - } -} - -void test_expand() -{ - // 1. Expand a scalar tensor (shape: {1}) to (4, 3) - { - ams::SmallVector scalar_shape = {1}; - ams::SmallVector scalar_strides = {sizeof(double)}; - AMSTensor scalar_tensor = - AMSTensor::create(scalar_shape, scalar_strides, AMS_DOUBLE, AMS_HOST); - scalar_tensor.at(0) = 42.0; - - // Expand the scalar tensor to shape (4, 3) - ams::SmallVector expanded_shape1 = {4, 3}; - AMSTensor expanded_tensor1 = scalar_tensor.expand(expanded_shape1); - - expanded_tensor1.dump(); - - // Check expanded tensor properties - assert(expanded_shape1 == expanded_tensor1.shape()); - for (size_t i = 0; i < 4; ++i) { - for (size_t j = 0; j < 3; ++j) { - std::cout << "Tensor value " - << expanded_tensor1.elementAt({i, j}) << "\n"; - assert(expanded_tensor1.elementAt({i, j}) == 42.0); - } - } - std::cout << "Test 1: Scalar tensor expanded to (4, 3) - Passed\n"; - } - - // 2. Expand a 1D tensor (shape: {3}) to (3, 3) - { - ams::SmallVector vector_shape = {3}; - ams::SmallVector vector_strides = {sizeof(double)}; - AMSTensor vector_tensor = - AMSTensor::create(vector_shape, vector_strides, AMS_DOUBLE, AMS_HOST); - - // Fill tensor with values - vector_tensor.at(0) = 1.0; - vector_tensor.at(1) = 2.0; - vector_tensor.at(2) = 3.0; - - // Expand the vector tensor to shape (3, 3) - ams::SmallVector expanded_shape2 = {3, 3}; - AMSTensor expanded_tensor2 = vector_tensor.expand(expanded_shape2); - - // Check expanded tensor properties - assert(expanded_shape2 == expanded_tensor2.shape()); - for (size_t i = 0; i < 3; ++i) { - for (size_t j = 0; j < 3; ++j) { - std::cout << "Tensor value " - << expanded_tensor2.elementAt({i, j}) << " original" - << vector_tensor.at(j) << "\n"; - assert(expanded_tensor2.elementAt({i, j}) == - vector_tensor.elementAt({j})); - } - } - std::cout << "Test 2: 1D tensor expanded to (3, 3) - Passed\n"; - } - - // 3. Expand a 2D tensor (shape: {2, 1}) to (2, 3) - { - ams::SmallVector matrix_shape = {2, 1}; - ams::SmallVector matrix_strides = {sizeof(double), sizeof(double)}; - AMSTensor matrix_tensor = - AMSTensor::create(matrix_shape, matrix_strides, AMS_DOUBLE, AMS_HOST); - - // Fill tensor with values - matrix_tensor.at(0) = 10.0; - matrix_tensor.at(1) = 20.0; - - // Expand the matrix tensor to shape (2, 3) - ams::SmallVector expanded_shape3 = {2, 3}; - AMSTensor expanded_tensor3 = matrix_tensor.expand(expanded_shape3); - - // Check expanded tensor properties - assert(expanded_shape3 == expanded_tensor3.shape()); - std::cout << "Matrix Tensor dimensions: " << matrix_tensor.shape().size() - << "\n"; - matrix_tensor.dump(); - std::cout << "Expanded " - << "\n"; - expanded_tensor3.dump(); - - expanded_tensor3.dump(); - for (size_t i = 0; i < 2; ++i) { - for (size_t j = 0; j < 3; ++j) { - assert(expanded_tensor3.elementAt({i, j}) == - matrix_tensor.elementAt({i, 0})); - } - } - std::cout << "Test 3: 2D tensor expanded to (2, 3) - Passed\n"; - } - - std::cout << "All expand tests passed successfully!\n"; -} - - -int main(int argc, char* argv[]) -{ - auto& rm = ams::ResourceManager::getInstance(); - rm.init(); - std::string func = std::string(argv[1]); - if (func.compare("cast") == 0) - testCastTensor(); - else if (func.compare("num_elements") == 0) - testComputeNumElements(); - else if (func.compare("create") == 0) - testCreate(); - else if (func.compare("view") == 0) - testView(); - else if (func.compare("move") == 0) - testMove(); - else if (func.compare("access") == 0) - testDataAccess(); - else if (func.compare("conversion") == 0) - testConversion(); - else if (func.compare("transpose") == 0) - testTranspose(); - else if (func.compare("test-reshape") == 0) - test_canReshapeWithStrides(); - else if (func.compare("reshape") == 0) - test_reshape(); - else if (func.compare("expand") == 0) - test_expand(); - else if (func.compare("concat") == 0) { - testConcatenateTensors(); - } else { - throw std::runtime_error("Unknown test option :'" + func + "'"); - } - return 0; -} diff --git a/tests/AMSlib/models/CMakeLists.txt b/tests/AMSlib/models/CMakeLists.txt new file mode 100644 index 00000000..cc80e109 --- /dev/null +++ b/tests/AMSlib/models/CMakeLists.txt @@ -0,0 +1,52 @@ +# Output files for generated models (example: .pt files) + +set(TORCH_MODEL_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE STRING "Directory to store torch generated models") + +set(GENERATED_CPU_MODELS + ${CMAKE_CURRENT_BINARY_DIR}/double_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/double_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/double_cpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/single_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/single_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/single_cpu_random.pt +) + +# Custom command to generate models +add_custom_command( + OUTPUT ${GENERATED_CPU_MODELS} + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate.sh ${CMAKE_CURRENT_BINARY_DIR}/ "cpu" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generate.sh;${CMAKE_CURRENT_SOURCE_DIR}/generate.py" + COMMENT "Generating PyTorch models..." +) + +# Define a target to generate models +add_custom_target(generate_cpu_models ALL + DEPENDS ${GENERATED_CPU_MODELS} + COMMENT "Generate cpu models before ctests..." +) + +if (ENABLE_CUDA) +set(GENERATED_GPU_MODELS + ${CMAKE_CURRENT_BINARY_DIR}/double_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/double_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/double_gpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/single_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/single_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/single_gpu_random.pt +) + +# Custom command to generate models +add_custom_command( + OUTPUT ${GENERATED_GPU_MODELS} + COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate.sh ${CMAKE_CURRENT_BINARY_DIR}/ "gpu" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generate.sh;${CMAKE_CURRENT_SOURCE_DIR}/generate.py" + COMMENT "Generating PyTorch models..." +) + +# Define a target to generate models +add_custom_target(generate_gpu_models ALL + DEPENDS ${GENERATED_GPU_MODELS} + COMMENT "Generate gpu models before ctests..." +) +endif() + diff --git a/tests/AMSlib/torch/generate.py b/tests/AMSlib/models/generate.py similarity index 99% rename from tests/AMSlib/torch/generate.py rename to tests/AMSlib/models/generate.py index 58ea9c24..fd042416 100644 --- a/tests/AMSlib/torch/generate.py +++ b/tests/AMSlib/models/generate.py @@ -81,7 +81,7 @@ def main(): max_val = torch.max(fake_uq, axis=1).values scale = 0.49 / max_val fake_uq *= scale.unsqueeze(0).T - fake_uq[0, 2] = 0.51 + fake_uq[1, 2] = 0.51 model = TuppleModel(8, 8, fake_uq) elif args.uq == "random": model = SimpleModel(8, 8) diff --git a/tests/AMSlib/torch/generate.sh b/tests/AMSlib/models/generate.sh similarity index 100% rename from tests/AMSlib/torch/generate.sh rename to tests/AMSlib/models/generate.sh diff --git a/tests/AMSlib/torch/CMakeLists.txt b/tests/AMSlib/torch/CMakeLists.txt index 8c8c7d71..5e7776ed 100644 --- a/tests/AMSlib/torch/CMakeLists.txt +++ b/tests/AMSlib/torch/CMakeLists.txt @@ -23,64 +23,10 @@ function(BUILD_UNIT_TEST exe source) if(WITH_CUDA) set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") - set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) - set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) - target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") endif() endfunction() -# Output files for generated models (example: .pt files) -set(GENERATED_CPU_MODELS - ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt -) - -# Custom command to generate models -add_custom_command( - OUTPUT ${GENERATED_CPU_MODELS} - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate.sh ${CMAKE_CURRENT_BINARY_DIR}/models/ "cpu" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generate.sh;${CMAKE_CURRENT_SOURCE_DIR}/generate.py" - COMMENT "Generating PyTorch models..." -) - -# Define a target to generate models -add_custom_target(generate_cpu_models ALL - DEPENDS ${GENERATED_CPU_MODELS} - COMMENT "Generate cpu models before ctests..." -) - -if (ENABLE_CUDA) -set(GENERATED_GPU_MODELS - ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt - ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt -) - -# Custom command to generate models -add_custom_command( - OUTPUT ${GENERATED_GPU_MODELS} - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate.sh ${CMAKE_CURRENT_BINARY_DIR}/models/ "gpu" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generate.sh;${CMAKE_CURRENT_SOURCE_DIR}/generate.py" - COMMENT "Generating PyTorch models..." -) - -# Define a target to generate models -add_custom_target(generate_gpu_models ALL - DEPENDS ${GENERATED_GPU_MODELS} - COMMENT "Generate gpu models before ctests..." -) -endif() - - - BUILD_UNIT_TEST(ams_verify_dtype verify_dtype.cpp) BUILD_UNIT_TEST(ams_verify_device verify_device.cpp) @@ -88,80 +34,80 @@ BUILD_UNIT_TEST(ams_evaluate_model evaluate_model.cpp) BUILD_UNIT_TEST(ams_convert_and_evaluate_model evalute_model_conversions.cpp) #detect datatype -ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Random ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Duq_mean ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Duq_max ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Random ams_verify_dtype double ${TORCH_MODEL_DIR}/double_cpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Duq_mean ams_verify_dtype double ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Double::Duq_max ams_verify_dtype double ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Single::Random ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Single::Duq_mean ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Single::Duq_max ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Single::Random ams_verify_dtype single ${TORCH_MODEL_DIR}/single_cpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Single::Duq_mean ams_verify_dtype single ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::HOST::Single::Duq_max ams_verify_dtype single ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt) #detect device -ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Double::Random ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Double::Duq_mean ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Double::Duq_max ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Double::Random ams_verify_device cpu ${TORCH_MODEL_DIR}/double_cpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Double::Duq_mean ams_verify_device cpu ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Double::Duq_max ams_verify_device cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Single::Random ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Single::Duq_mean ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Single::Duq_max ams_verify_device cpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Single::Random ams_verify_device cpu ${TORCH_MODEL_DIR}/single_cpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Single::Duq_mean ams_verify_device cpu ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::HOST::Single::Duq_max ams_verify_device cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt) -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::Random::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt "random") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::Random::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::Random::Double ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_cpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::Random::Single ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_cpu_random.pt "random") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMean::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt "duq_mean") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMean::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMean::Double ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMean::Single ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt "duq_mean") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMax::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt "duq_max") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMax::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMax::Double ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::HOST::UQMax::Single ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::Random::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_random.pt "random") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::Random::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::Random::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_cpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::Random::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_cpu_random.pt "random") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMean::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_mean.pt "duq_mean") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMean::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMean::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMean::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt "duq_mean") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMax::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_cpu_duq_max.pt "duq_max") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMax::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_cpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMax::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMax::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max") if(ENABLE_CUDA) #detect datatype -ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Random ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Duq_mean ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Duq_max ams_verify_dtype double ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Random ams_verify_dtype double ${TORCH_MODEL_DIR}/double_gpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Duq_mean ams_verify_dtype double ${TORCH_MODEL_DIR}/double_gpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Duq_max ams_verify_dtype double ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Single::Random ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Single::Duq_mean ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Single::Duq_max ams_verify_dtype single ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Single::Random ams_verify_dtype single ${TORCH_MODEL_DIR}/single_gpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Single::Duq_mean ams_verify_dtype single ${TORCH_MODEL_DIR}/single_gpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Single::Duq_max ams_verify_dtype single ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt) #detect device -ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Double::Random ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Double::Duq_mean ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Double::Duq_max ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Double::Random ams_verify_device gpu ${TORCH_MODEL_DIR}/double_gpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Double::Duq_mean ams_verify_device gpu ${TORCH_MODEL_DIR}/double_gpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Double::Duq_max ams_verify_device gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Single::Random ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Single::Duq_mean ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt) -ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Single::Duq_max ams_verify_device gpu ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Single::Random ams_verify_device gpu ${TORCH_MODEL_DIR}/single_gpu_random.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Single::Duq_mean ams_verify_device gpu ${TORCH_MODEL_DIR}/single_gpu_duq_mean.pt) +ADD_TORCH_UNIT_TEST(Surrogate::DResource::DEVICE::Single::Duq_max ams_verify_device gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt) -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::Random::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt "random") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::Random::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::Random::Double ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_gpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::Random::Single ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_gpu_random.pt "random") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMean::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt "duq_mean") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMean::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMean::Double ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_gpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMean::Single ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_gpu_duq_mean.pt "duq_mean") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMax::Double ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt "duq_max") -ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMax::Single ams_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMax::Double ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::Evaluate::DEVICE::UQMax::Single ams_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::Random::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_random.pt "random") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::Random::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::Random::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_gpu_random.pt "random") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::Random::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_gpu_random.pt "random") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMean::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_mean.pt "duq_mean") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMean::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMean::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_gpu_duq_mean.pt "duq_mean") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMean::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_gpu_duq_mean.pt "duq_mean") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMax::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/double_gpu_duq_max.pt "duq_max") -ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMax::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${CMAKE_CURRENT_BINARY_DIR}/models/single_gpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMax::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max") +ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::DEVICE::UQMax::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max") endif() diff --git a/tests/AMSlib/torch/evalute_model_conversions.cpp b/tests/AMSlib/torch/evalute_model_conversions.cpp index f76551ae..6f7e772f 100644 --- a/tests/AMSlib/torch/evalute_model_conversions.cpp +++ b/tests/AMSlib/torch/evalute_model_conversions.cpp @@ -3,8 +3,9 @@ #include #include +#include // For std::shuffle #include -#include +#include // For std::mt19937 and std::uniform_int_distribution #include #include diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt index 8394fef0..7c73b90c 100644 --- a/tests/AMSlib/wf/CMakeLists.txt +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -1,5 +1,6 @@ function(ADD_WORKFLOW_UNIT_TEST name exec) - add_test(NAME ${name} COMMAND ${exec} ${ARGN}) + string(JOIN " " args ${ARGN}) + add_test(NAME ${name} COMMAND bash -c "rm -f ${CMAKE_CURRENT_BINARY_DIR}/db_label*.h5; ${exec} ${args}") set_tests_properties(${name} PROPERTIES LABELS WORKFLOW_UNIT_TEST) endfunction() @@ -15,10 +16,6 @@ function(BUILD_UNIT_TEST exe source) target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) if(WITH_CUDA) - set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") - set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) - set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) - target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") endif() endfunction() @@ -31,19 +28,57 @@ endfunction() BUILD_UNIT_TEST(domain_to_application domain_to_application.cpp) BUILD_UNIT_TEST(subselect_tensors subselect_tensors.cpp) BUILD_UNIT_TEST(scatter_physics scatter_physics.cpp) +BUILD_UNIT_TEST(evaluate_in_and_outs evaluate_in_and_outs.cpp) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::FLOAT::FLOAT domain_to_application float float cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::DOUBLE::FLOAT domain_to_application double float cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::FLOAT::DOUBLE domain_to_application float double cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::DOUBLE::DOUBLE domain_to_application double double cpu) - ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Double subselect_tensors double cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Float subselect_tensors float cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::ScatterPhysics::Double scatter_physics double cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::ScatterPhysics::Float scatter_physics float cpu) +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhFloat::MLDouble::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhFloat::MLDouble::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhFloat::MLDouble::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhDouble::MLDouble::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhDouble::MLDouble::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhDouble::MLDouble::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhDouble::MLFloat::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhDouble::MLFloat::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") + +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhFloat::MLFloat::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhFloat::MLFloat::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhFloat::MLDouble::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhFloat::MLDouble::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhFloat::MLDouble::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhDouble::MLDouble::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhDouble::MLDouble::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhDouble::MLDouble::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhDouble::MLFloat::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhDouble::MLFloat::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") + +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhFloat::MLFloat::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhFloat::MLFloat::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhFloat::MLDouble::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhFloat::MLDouble::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhFloat::MLDouble::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhDouble::MLDouble::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhDouble::MLDouble::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhDouble::MLDouble::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") if (ENABLE_CUDA) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::FLOAT::FLOAT domain_to_application float float cuda) @@ -56,5 +91,82 @@ ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::SubSelect::Float subselect_tensors floa ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::ScatterPhysics::Double scatter_physics double cuda) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::ScatterPhysics::Float scatter_physics float cuda) + + +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhFloat::MLDouble::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLDouble::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhFloat::MLDouble::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhDouble::MLDouble::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLDouble::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhDouble::MLDouble::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhDouble::MLFloat::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhDouble::MLFloat::AllPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhFloat::MLDouble::AllPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLDouble::AllPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhFloat::MLDouble::AllPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhDouble::MLDouble::AllPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLDouble::AllPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhDouble::MLDouble::AllPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhDouble::MLFloat::AllPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::AllPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhDouble::MLFloat::AllPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") + +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhFloat::MLFloat::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhFloat::MLFloat::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhFloat::MLDouble::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLDouble::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhFloat::MLDouble::BothModelPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhDouble::MLDouble::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLDouble::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhDouble::MLDouble::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhDouble::MLFloat::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhDouble::MLFloat::BothModelPhysics evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhFloat::MLFloat::BothModelPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::BothModelPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhFloat::MLFloat::BothModelPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhFloat::MLDouble::BothModelPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLDouble::BothModelPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhFloat::MLDouble::BothModelPhysics evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhDouble::MLDouble::BothModelPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLDouble::BothModelPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhDouble::MLDouble::BothModelPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhDouble::MLFloat::BothModelPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::BothModelPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhDouble::MLFloat::BothModelPhysics evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.5 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") + +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhFloat::MLFloat::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhFloat::MLFloat::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhFloat::MLDouble::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLDouble::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhFloat::MLDouble::AllModel evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhDouble::MLDouble::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLDouble::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhDouble::MLDouble::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhFloat::MLFloat::AllModel evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::AllModel evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhFloat::MLFloat::AllModel evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhFloat::MLDouble::AllModel evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLDouble::AllModel evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhFloat::MLDouble::AllModel evaluate_in_and_outs float gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhDouble::MLDouble::AllModel evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLDouble::AllModel evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhDouble::MLDouble::AllModel evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/double_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") +ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") + endif() diff --git a/tests/AMSlib/wf/evaluate_in_and_outs.cpp b/tests/AMSlib/wf/evaluate_in_and_outs.cpp new file mode 100644 index 00000000..4cb1c272 --- /dev/null +++ b/tests/AMSlib/wf/evaluate_in_and_outs.cpp @@ -0,0 +1,406 @@ +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "wf/workflow.hpp" + +#define SIZE 32 + + +std::vector getDims(const std::string input, char delimiter) +{ + std::vector tokens; + std::stringstream ss(input); + std::string token; + + while (std::getline(ss, token, delimiter)) { + tokens.push_back(std::stoi(token)); + } + + return tokens; +} + + +// Function to read a dataset and compare it with the expected tensor +bool verifyDatasetContents(const std::string& fileName, + const std::string& datasetName, + torch::Tensor& expectedTensor) +{ + // Open the HDF5 file + hid_t file_id = H5Fopen(fileName.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT); + if (file_id < 0) { + throw std::runtime_error("Failed to open HDF5 file."); + } + + // Open the dataset + hid_t dset_id = H5Dopen2(file_id, datasetName.c_str(), H5P_DEFAULT); + if (dset_id < 0) { + H5Fclose(file_id); + throw std::runtime_error("Failed to open dataset."); + } + + // Get the dataspace + hid_t space_id = H5Dget_space(dset_id); + if (space_id < 0) { + H5Dclose(dset_id); + H5Fclose(file_id); + throw std::runtime_error("Failed to get dataspace."); + } + + // Get the dataset dimensions + int ndims = H5Sget_simple_extent_ndims(space_id); + if (ndims < 0) { + H5Sclose(space_id); + H5Dclose(dset_id); + H5Fclose(file_id); + throw std::runtime_error("Failed to get number of dimensions."); + } + + std::vector dims(ndims); + if (H5Sget_simple_extent_dims(space_id, dims.data(), NULL) < 0) { + H5Sclose(space_id); + H5Dclose(dset_id); + H5Fclose(file_id); + throw std::runtime_error("Failed to get dataset dimensions."); + } + + // Close dataspace + H5Sclose(space_id); + + // Flatten the dataset dimensions into a total size + size_t totalSize = 1; + for (const auto& dim : dims) { + totalSize *= dim; + } + + // Allocate a tensor to read the dataset + auto readTensor = + torch::empty({static_cast(totalSize)}, torch::kFloat); + + // Read the dataset into the tensor + herr_t status = H5Dread(dset_id, + H5T_NATIVE_FLOAT, + H5S_ALL, + H5S_ALL, + H5P_DEFAULT, + readTensor.data_ptr()); + if (status < 0) { + H5Dclose(dset_id); + H5Fclose(file_id); + throw std::runtime_error("Failed to read dataset."); + } + + // Close dataset and file + H5Dclose(dset_id); + H5Fclose(file_id); + + // Concatenate all expected tensors into one + expectedTensor = expectedTensor.flatten(); + + // Compare the tensors + if (!torch::allclose(readTensor, expectedTensor)) { + throw std::runtime_error( + "Dataset contents do not match the expected tensors."); + } + + std::cout << "Dataset contents match the expected tensors!" << std::endl; + return true; +} + + +template +void compute(ams::AMSWorkflow& wf, + std::vector& orig_in, + std::vector& orig_inout, + std::vector& orig_out, + T& broadcastVal, + bool has_broadcast = false) +{ + + auto callBack = [&](const ams::SmallVector& pruned_ins, + ams::SmallVector& pruned_inouts, + ams::SmallVector& pruned_outs) { + int numIn = pruned_ins.size(); + int numInOut = pruned_inouts.size(); + int numOut = pruned_outs.size(); + int numElements = 0; + std::cout << "Num ins are " << numIn << "\n"; + std::cout << "Num inouts are " << numInOut << "\n"; + std::cout << "Num outs are " << numOut << "\n"; + if (pruned_ins.size() != 0) { + numElements = pruned_ins[0].shape()[0]; + } else if (pruned_inouts.size() != 0) { + numElements = pruned_inouts[0].shape()[0]; + } else { + throw std::runtime_error( + "call back should be called at least with some elements in batch " + "axis"); + } + + // I am converthing all ams - tensors to torch - tensors. This is a conveniency for testing, + // as I can execute arbitary GPU code. + std::vector in; + for (auto& V : pruned_ins) { + c10::IntArrayRef shape(V.shape().begin(), V.shape().size()); + in.push_back(torch::from_blob((void*)V.data(), + shape, + torch::TensorOptions().dtype(DType).device( + DeviceType))); + } + + std::vector inout; + for (auto& V : pruned_inouts) { + c10::IntArrayRef shape(V.shape().begin(), V.shape().size()); + inout.push_back(torch::from_blob( + (void*)V.data(), + shape, + torch::TensorOptions().dtype(DType).device(DeviceType))); + } + + std::vector out; + for (auto& V : pruned_outs) { + c10::IntArrayRef shape(V.shape().begin(), V.shape().size()); + out.push_back(torch::from_blob((void*)V.data(), + shape, + torch::TensorOptions().dtype(DType).device( + DeviceType))); + } + + + torch::Tensor identity_matrix = + torch::eye(out.size() + inout.size(), + torch::TensorOptions().dtype(DType).device(DeviceType)); + + // Iterate over all elements + for (int i = 0; i < numElements; i++) { + // Create a tensor to aggregate input values + torch::Tensor aggregate = + torch::zeros({1, numIn + numInOut}, + torch::TensorOptions().dtype(DType).device(DeviceType)); + + // Fill aggregate with cumulative sums from `in` tensors + for (int j = 0; j < numIn; j++) { + aggregate[0][j] = in[j][i][0]; + } + + + // Continue filling aggregate with cumulative sums from `inout` tensors + for (int j = 0; j < numInOut; j++) { + aggregate[0][numIn + j] = inout[j][i][0]; + } + + std::cout << "Aggr:" << aggregate << "\n"; + std::cout << "IDM" << identity_matrix << "\n"; + auto res = aggregate.matmul(identity_matrix) * 13.0; + std::cout << "Res " << res << "\n"; + + // Assign to `out` tensors using modulo indexing + for (int j = 0; j < numOut; j++) { + out[j][i][0] = res[0][j]; + } + + // Update `inout` tensors using modulo indexing + for (int j = 0; j < numInOut; j++) { + std::cout << "Setting in out for res" << res[0] << "\n"; + inout[j][i][0] = res[0][numOut + j]; + } + } + }; + wf.evaluate(callBack, orig_in, orig_inout, orig_out); +} + + +int main(int argc, char* argv[]) +{ + + if (argc != 10) { + std::cout << "Wrong command line\n"; + std::cout << argv[0] + << " " + " " + " iShape(getDims(argv[6], ',')); + std::vector oShape(getDims(argv[7], ',')); + std::string db_path(argv[8]); + int numInOuts = std::atoi(argv[9]); + auto& db_instance = ams::db::DBManager::getInstance(); + db_instance.instantiate_fs_db(AMSDBType::AMS_HDF5, db_path); + + + AMSUQPolicy duq; + + if (duq_type.compare("duq_mean") == 0) { + duq = AMSUQPolicy::AMS_DELTAUQ_MEAN; + } else if (duq_type.compare("duq_max") == 0) { + duq = AMSUQPolicy::AMS_DELTAUQ_MAX; + } else if (duq_type.compare("random") == 0) { + duq = AMSUQPolicy::AMS_RANDOM; + } else { + std::cout << "Unknown dUQ \n"; + return 1; + } + + + if (Type.compare("double") == 0) { + DType = torch::kFloat64; + } + + if (Type.compare("double") == 0) DType = torch::kFloat64; + + if (device.compare("cuda") == 0) dev = c10::DeviceType::CUDA; + std::string domain_name("test"); + std::string db_label("db_label"); + + + auto tOptions = torch::TensorOptions().dtype(DType).device(dev); + std::string filename; + + { + ams::AMSWorkflow wf = ams::AMSWorkflow( + model_path, domain_name, db_label, threshold, duq, 0, 1); + + + filename = wf.getDBFilename(); + + // How many numInOuts are we going to have in this test + std::vector in; + std::vector inout; + std::vector out; + // Get the number of inputs for this test + int numIn = iShape[iShape.size() - 1] - numInOuts; + for (auto i = 0; i < numIn; i++) { + in.push_back(torch::ones({SIZE, 1}, tOptions)); + } + for (auto i = 0l; i < numInOuts; i++) { + inout.push_back(torch::ones({SIZE, 1}, tOptions)); + } + + int numOut = oShape[oShape.size() - 1] - numInOuts; + for (auto i = 0; i < numOut; i++) { + out.push_back(torch::zeros({SIZE, 1}, tOptions)); + } + + // Call compute_torch + float fbroadcastVal = 0.0; + double dbroadcastVal = 0.0; + std::cout << "Creating workflow with:\n"; + std::cout << "NumIn " << numIn << " " << in.size() << "\n"; + std::cout << "NumOut " << numOut << " " << out.size() << "\n"; + std::cout << "NumInOut " << numInOuts << " " << inout.size() << "\n"; + if (DType == torch::kFloat64 && dev == c10::DeviceType::CUDA) + compute( + wf, in, inout, out, dbroadcastVal, false); + else if (DType == torch::kFloat32 && dev == c10::DeviceType::CUDA) + compute( + wf, in, inout, out, fbroadcastVal, false); + else if (DType == torch::kFloat64 && dev == c10::DeviceType::CPU) + compute( + wf, in, inout, out, dbroadcastVal, false); + else if (DType == torch::kFloat32 && dev == c10::DeviceType::CPU) + compute( + wf, in, inout, out, fbroadcastVal, false); + + // We do this, as AMS should ignore completely the threshold + // value when it doesn't have a model + if (model_path.empty()) threshold = 0.0; + + for (auto& V : {inout, out}) { + for (auto i = 0; i < V.size(); i++) { + auto data = V[i]; + if (threshold == 0.0) { + auto correct = torch::ones(data.sizes(), data.options()) * 13; + bool close = torch::allclose(correct, data, 1e-5, 1e-8); + if (!close) { + std::cout << "Values are not close\n"; + std::cout << data << "\n"; + std::cout << "Correct data are " + << "\n"; + std::cout << correct << "\n"; + return -1; + } + } else if (threshold == 0.5) { + auto correct = torch::ones(data.sizes(), data.options()); + // Create a tensor with values [0, 1, 2, ..., size-1] + auto indices = torch::arange(data.sizes()[0], data.options()); + + auto alternating_tensor = (indices % 2) * 12; + alternating_tensor = alternating_tensor.reshape({data.sizes()[0], 1}); + correct += alternating_tensor; + // Use modulo operation to create alternating 0s and 1s + bool close = torch::allclose(correct, data, 1e-5, 1e-8); + if (!close) { + std::cout << "Values are not close\n"; + std::cout << data << "\n"; + std::cout << "Correct data are " + << "\n"; + std::cout << correct << "\n"; + return -1; + } + } else if (threshold == 1.0) { + auto correct = torch::ones(data.sizes(), data.options()); + bool close = torch::allclose(correct, data, 1e-5, 1e-8); + if (!close) { + std::cout << "Values are not close\n"; + std::cout << data << "\n"; + std::cout << "Correct data are " + << "\n"; + std::cout << correct << "\n"; + return -1; + } + } else { + std::cout << "Unknown threshold value\n"; + } + } + } + in.clear(); + inout.clear(); + out.clear(); + } + + // Reverse to compute how many physics we want. + threshold = 1 - threshold; + + if (threshold > 0) { + int numIn = iShape[iShape.size() - 1]; + auto expectedInput = + torch::ones({(long)(SIZE * threshold), numIn}, + torch::TensorOptions().dtype(torch::kFloat32)); + + int numOut = iShape[oShape.size() - 1]; + auto expectedOutput = + torch::ones({(long)(SIZE * threshold), numOut}, + torch::TensorOptions().dtype(torch::kFloat32)) * + 13; + + std::cout << "Output size :\n" << expectedOutput.sizes() << "\n"; + std::cout << "Input size :\n" << expectedInput.sizes() << "\n"; + + auto& dbg_mg = ams::db::DBManager::getInstance(); + dbg_mg.clean(); + if (threshold != 1.0) + if (!verifyDatasetContents(filename, "input_data", expectedInput) || + !verifyDatasetContents(filename, "output_data", expectedOutput)) { + std::cout << "Could not verify outputs\n"; + return -1; + } + } + + return 0; +} From 671dea8cc4047c55718a48b5b9e97daae5f1e1c9 Mon Sep 17 00:00:00 2001 From: koparasy Date: Sun, 22 Dec 2024 13:51:23 -0800 Subject: [PATCH 014/136] Compiling new interface --- src/AMSlib/AMS.cpp | 321 +++++++++++-------------------- src/AMSlib/AMSTensor.cpp | 100 +++++++--- src/AMSlib/include/AMS.h | 88 +++------ src/AMSlib/include/AMSTensor.hpp | 152 +++++++++++++++ src/AMSlib/include/AMSTypes.hpp | 27 +++ src/AMSlib/ml/surrogate.hpp | 56 +++++- src/AMSlib/ml/uq.hpp | 212 ++++++++++++++++++++ src/AMSlib/wf/device.hpp | 49 +++++ src/AMSlib/wf/interface.cpp | 84 +++++++- src/AMSlib/wf/interface.hpp | 14 +- src/AMSlib/wf/rmq_reliable.hpp | 318 ++++++++++++++++++++++++++++++ src/AMSlib/wf/utils.cpp | 16 ++ 12 files changed, 1124 insertions(+), 313 deletions(-) create mode 100644 src/AMSlib/include/AMSTensor.hpp create mode 100644 src/AMSlib/include/AMSTypes.hpp create mode 100644 src/AMSlib/ml/uq.hpp create mode 100644 src/AMSlib/wf/device.hpp create mode 100644 src/AMSlib/wf/rmq_reliable.hpp create mode 100644 src/AMSlib/wf/utils.cpp diff --git a/src/AMSlib/AMS.cpp b/src/AMSlib/AMS.cpp index 3da6bc4e..e5dfa316 100644 --- a/src/AMSlib/AMS.cpp +++ b/src/AMSlib/AMS.cpp @@ -5,9 +5,8 @@ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception */ -#include "AMS.h" - #include + #ifdef __ENABLE_MPI__ #include #endif @@ -22,14 +21,15 @@ #include #include -#include "include/AMS.h" -#include "ml/uq.hpp" +#include "AMS.h" #include "wf/basedb.hpp" #include "wf/debug.h" #include "wf/logger.hpp" #include "wf/resource_manager.hpp" #include "wf/workflow.hpp" +using namespace ams; + static int get_rank_id() { if (const char *flux_id = std::getenv("FLUX_TASK_RANK")) { @@ -53,7 +53,6 @@ struct AMSAbstractModel { public: std::string SPath; - std::string UQPath; std::string DBLabel; bool DebugDB; double threshold; @@ -64,8 +63,6 @@ struct AMSAbstractModel { { if (type.compare("deltaUQ") == 0) { return AMSUQPolicy::AMS_DELTAUQ_MEAN; - } else if (type.compare("faiss") == 0) { - return AMSUQPolicy::AMS_FAISS_MEAN; } else if (type.compare("random") == 0) { return AMSUQPolicy::AMS_RANDOM; } else { @@ -102,33 +99,16 @@ struct AMSAbstractModel { } - void parseUQPaths(AMSUQPolicy policy, nlohmann::json &jRoot) + std::string parseSurrogatePaths(nlohmann::json &jRoot) { - /* - * Empty models can exist in cases were the user annotates - * the code without having data to train a model. In such a case, - * the user deploys without specifying the model and lib AMS will - * collect everything - */ - if (!jRoot.contains("model_path")) { - SPath = ""; - } else { - SPath = jRoot["model_path"].get(); - } - - DBG(AMS, "Model Is Random or DeltaUQ %s %u", SPath.c_str(), policy); - if (BaseUQ::isRandomUQ(policy) || BaseUQ::isDeltaUQ(policy)) { - UQPath = ""; - return; - } - - if (!jRoot.contains("faiss_path")) { - THROW(std::runtime_error, - "Model is of UQ type 'faiss' and thus expecting a path to FAISS"); + std::string path = ""; + if (jRoot.contains("model_path")) { + path = jRoot["model_path"].get(); + // Verify that path exists if it is different than "" +#warning fix comment } - - UQPath = jRoot["faiss_path"].get(); + return path; } @@ -150,7 +130,7 @@ struct AMSAbstractModel { THROW(std::runtime_error, "Model must specify the UQ type"); } - if (!BaseUQ::isUQPolicy(policy)) { + if (!UQ::isUQPolicy(policy)) { THROW(std::runtime_error, "UQ Policy is not supported"); } @@ -162,26 +142,18 @@ struct AMSAbstractModel { } - if ((BaseUQ::isDeltaUQ(policy) || BaseUQ::isFaissUQ(policy)) && - uqAggregate == UQAggrType::Unknown) { + if (UQ::isDeltaUQ(policy) && uqAggregate == UQAggrType::Unknown) { THROW(std::runtime_error, "UQ Type should be defined or set to undefined value"); } - if (uqAggregate == Max) { - if (BaseUQ::isDeltaUQ(policy)) { + if (UQ::isDeltaUQ(policy)) { + if (uqAggregate == Max) policy = AMSUQPolicy::AMS_DELTAUQ_MAX; - } else if (BaseUQ::isFaissUQ(policy)) { - policy = AMSUQPolicy::AMS_FAISS_MAX; - } - } else if (uqAggregate == Mean) { - if (BaseUQ::isDeltaUQ(policy)) { + else if (uqAggregate == Mean) policy = AMSUQPolicy::AMS_DELTAUQ_MEAN; - } else if (BaseUQ::isFaissUQ(policy)) { - policy = AMSUQPolicy::AMS_FAISS_MEAN; - } } - DBG(AMS, "UQ Policy is %s", BaseUQ::UQPolicyToStr(policy).c_str()) + DBG(AMS, "UQ Policy is %s", UQ::UQPolicyToStr(policy).c_str()) return policy; } @@ -192,10 +164,6 @@ struct AMSAbstractModel { uqPolicy = parseUQPolicy(value); - if (BaseUQ::isFaissUQ(uqPolicy)) { - nClusters = parseClusters(value); - } - if (!value.contains("threshold")) { THROW(std::runtime_error, "Model must define threshold value (threshold < 0 always " @@ -203,7 +171,7 @@ struct AMSAbstractModel { "model)"); } threshold = value["threshold"].get(); - parseUQPaths(uqPolicy, value); + SPath = parseSurrogatePaths(value); DBLabel = parseDBLabel(value); DebugDB = parseDebugDB(value); @@ -227,7 +195,7 @@ struct AMSAbstractModel { DBLabel = std::string(db_label); - if (!BaseUQ::isUQPolicy(uq_policy)) { + if (!UQ::isUQPolicy(uq_policy)) { FATAL(AMS, "Invalid UQ policy %d", uq_policy) } @@ -235,13 +203,11 @@ struct AMSAbstractModel { if (surrogate_path != nullptr) SPath = std::string(surrogate_path); - if (uq_path != nullptr) UQPath = std::string(uq_path); - this->threshold = threshold; nClusters = num_clusters; DBG(AMS, "Registered Model %s %g", - BaseUQ::UQPolicyToStr(uqPolicy).c_str(), + UQ::UQPolicyToStr(uqPolicy).c_str(), threshold); } @@ -249,7 +215,6 @@ struct AMSAbstractModel { void dump() { if (!SPath.empty()) DBG(AMS, "Surrogate Model Path: %s", SPath.c_str()); - if (!UQPath.empty()) DBG(AMS, "UQ-Model: %s", UQPath.c_str()); DBG(AMS, "db-Label: %s threshold %f UQ-Policy: %u nClusters: %d", DBLabel.c_str(), @@ -269,7 +234,7 @@ class AMSWrap using json = nlohmann::json; public: - std::vector> executors; + std::vector executors; std::vector> registered_models; std::unordered_map ams_candidate_models; AMSDBType dbType = AMSDBType::AMS_NONE; @@ -393,13 +358,16 @@ class AMSWrap rmq_cert = getEntry(rmq_entry, "rabbitmq-cert"); CFATAL(AMS, - (exchange == "" || routing_key == "") && update_surrogate, - "Found empty RMQ exchange / routing-key, model update is not possible. " - "Please provide a RMQ exchange or deactivate surrogate model " - "update.") - - if(exchange == "" || routing_key == "") { - WARNING(AMS, "Found empty RMQ exchange or routing-key, deactivating model update") + (exchange == "" || routing_key == "") && update_surrogate, + "Found empty RMQ exchange / routing-key, model update is not " + "possible. " + "Please provide a RMQ exchange or deactivate surrogate model " + "update.") + + if (exchange == "" || routing_key == "") { + WARNING(AMS, + "Found empty RMQ exchange or routing-key, deactivating model " + "update") update_surrogate = false; } @@ -431,7 +399,6 @@ class AMSWrap switch (dbType) { case AMSDBType::AMS_NONE: return; - case AMSDBType::AMS_CSV: case AMSDBType::AMS_HDF5: setupFSDB(entry, dbStrType); break; @@ -586,13 +553,7 @@ class AMSWrap ~AMSWrap() { for (auto E : executors) { - if (E.second != nullptr) { - if (E.first == AMSDType::AMS_DOUBLE) { - delete reinterpret_cast *>(E.second); - } else { - delete reinterpret_cast *>(E.second); - } - } + delete reinterpret_cast(E); } ams::util::close(); } @@ -602,166 +563,94 @@ static std::once_flag _amsInitFlag; static std::once_flag _amsFinalizeFlag; static std::unique_ptr _amsWrap; -void AMSInit() { +void AMSInit() +{ std::call_once(_amsInitFlag, [&]() { DBG(AMS, "Initialization of AMS") _amsWrap = std::make_unique(); }); } -void AMSFinalize() { +void AMSFinalize() +{ std::call_once(_amsFinalizeFlag, [&]() { DBG(AMS, "Finalization of AMS") _amsWrap.reset(); }); } -void _AMSExecute(AMSExecutor executor, - void *probDescr, - const int numElements, - const void **input_data, - void **output_data, - int inputDim, - int outputDim) -{ - CFATAL(AMS, _amsWrap == nullptr, "AMSInit has not been called.") - int64_t index = static_cast(executor); - if (index >= _amsWrap->executors.size()) - throw std::runtime_error("AMS Executor identifier does not exist\n"); - auto currExec = _amsWrap->executors[index]; - - if (currExec.first == AMSDType::AMS_DOUBLE) { - ams::AMSWorkflow *dWF = - reinterpret_cast *>(currExec.second); - dWF->evaluate(probDescr, - numElements, - reinterpret_cast(input_data), - reinterpret_cast(output_data), - inputDim, - outputDim); - } else if (currExec.first == AMSDType::AMS_SINGLE) { - ams::AMSWorkflow *sWF = - reinterpret_cast *>(currExec.second); - sWF->evaluate(probDescr, - numElements, - reinterpret_cast(input_data), - reinterpret_cast(output_data), - inputDim, - outputDim); - } else { - throw std::invalid_argument("Data type is not supported by AMSLib!"); - return; - } -} -template -ams::AMSWorkflow *_AMSCreateExecutor(AMSCAbstrModel model, - AMSDType data_type, - AMSResourceType resource_type, - AMSPhysicFn call_back, - int process_id, - int world_size) +ams::AMSWorkflow *_AMSCreateExecutor(AMSCAbstrModel model, + int process_id, + int world_size) { CFATAL(AMS, _amsWrap == nullptr, "AMSInit has not been called.") auto &model_descr = _amsWrap->get_model(model); - ams::AMSWorkflow *WF = - new ams::AMSWorkflow(call_back, - model_descr.second.UQPath, - model_descr.second.SPath, - model_descr.first, - model_descr.second.DBLabel, - model_descr.second.DebugDB, - resource_type, - model_descr.second.threshold, - model_descr.second.uqPolicy, - model_descr.second.nClusters, - process_id, - world_size); + ams::AMSWorkflow *WF = new ams::AMSWorkflow(model_descr.second.SPath, + model_descr.first, + model_descr.second.DBLabel, + model_descr.second.threshold, + model_descr.second.uqPolicy, + process_id, + world_size); return WF; } -template -AMSExecutor _AMSRegisterExecutor(AMSDType data_type, - ams::AMSWorkflow *workflow) +AMSExecutor _AMSRegisterExecutor(ams::AMSWorkflow *workflow) { CFATAL(AMS, _amsWrap == nullptr, "AMSInit has not been called.") - _amsWrap->executors.push_back( - std::make_pair(data_type, static_cast(workflow))); + _amsWrap->executors.push_back(static_cast(workflow)); return static_cast(_amsWrap->executors.size()) - 1L; } -#ifdef __cplusplus -extern "C" { -#endif - AMSExecutor AMSCreateExecutor(AMSCAbstrModel model, - AMSDType data_type, - AMSResourceType resource_type, - AMSPhysicFn call_back, int process_id, int world_size) { - if (data_type == AMSDType::AMS_DOUBLE) { - auto *dWF = _AMSCreateExecutor( - model, data_type, resource_type, call_back, process_id, world_size); - return _AMSRegisterExecutor(data_type, dWF); - - } else if (data_type == AMSDType::AMS_SINGLE) { - auto *sWF = _AMSCreateExecutor( - model, data_type, resource_type, call_back, process_id, world_size); - return _AMSRegisterExecutor(data_type, sWF); - } else { - throw std::invalid_argument("Data type is not supported by AMSLib!"); - return static_cast(-1); - } + auto *dWF = _AMSCreateExecutor(model, process_id, world_size); + return _AMSRegisterExecutor(dWF); } -#ifdef __ENABLE_MPI__ -AMSExecutor AMSCreateDistributedExecutor(AMSCAbstrModel model, - AMSDType data_type, - AMSResourceType resource_type, - AMSPhysicFn call_back, - MPI_Comm Comm, - int process_id, - int world_size) +namespace ams { - if (data_type == AMSDType::AMS_DOUBLE) { - auto *dWF = _AMSCreateExecutor( - model, data_type, resource_type, call_back, process_id, world_size); - dWF->set_communicator(Comm); - return _AMSRegisterExecutor(data_type, dWF); +void AMSExecute(AMSExecutor executor, + EOSLambda &OrigComputation, + const ams::SmallVector &ins, + ams::SmallVector &inouts, + ams::SmallVector &outs) +{ + int64_t index = static_cast(executor); + if (index >= _amsWrap->executors.size()) + throw std::runtime_error("AMS Executor identifier does not exist\n"); + auto currExec = _amsWrap->executors[index]; - } else if (data_type == AMSDType::AMS_SINGLE) { - auto *sWF = _AMSCreateExecutor( - model, data_type, resource_type, call_back, process_id, world_size); - sWF->set_communicator(Comm); - return _AMSRegisterExecutor(data_type, sWF); - } else { - throw std::invalid_argument("Data type is not supported by AMSLib!"); - return static_cast(-1); - } + ams::AMSWorkflow *workflow = reinterpret_cast(currExec); + + callAMS(workflow, OrigComputation, ins, inouts, outs); } -#endif -void AMSExecute(AMSExecutor executor, - void *probDescr, - const int numElements, - const void **input_data, - void **output_data, - int inputDim, - int outputDim) +void AMSCExecute(AMSExecutor executor, + EOSCFn OrigCComputation, + void *args, + const ams::SmallVector &ins, + ams::SmallVector &inouts, + ams::SmallVector &outs) { - _AMSExecute(executor, - probDescr, - numElements, - input_data, - output_data, - inputDim, - outputDim); + + // Define the lambda and let the compiler deduce the type conversion to std::function + EOSLambda OrigComputation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + OrigCComputation(args, ams_ins, ams_inouts, ams_outs); + }; + + AMSExecute(executor, OrigComputation, ins, inouts, outs); } + void AMSDestroyExecutor(AMSExecutor executor) { CFATAL(AMS, _amsWrap == nullptr, "AMSInit has not been called.") @@ -770,14 +659,7 @@ void AMSDestroyExecutor(AMSExecutor executor) throw std::runtime_error("AMS Executor identifier does not exist\n"); auto currExec = _amsWrap->executors[index]; - if (currExec.first == AMSDType::AMS_DOUBLE) { - delete reinterpret_cast *>(currExec.second); - } else if (currExec.first == AMSDType::AMS_SINGLE) { - delete reinterpret_cast *>(currExec.second); - } else { - throw std::invalid_argument("Data type is not supported by AMSLib!"); - return; - } + delete reinterpret_cast(currExec); } @@ -807,12 +689,12 @@ AMSCAbstrModel AMSRegisterAbstractModel(const char *domain_name, auto id = _amsWrap->get_model_index(domain_name); if (id == -1) { id = _amsWrap->register_model(domain_name, - uq_policy, - threshold, - surrogate_path, - uq_path, - db_label, - num_clusters); + uq_policy, + threshold, + surrogate_path, + uq_path, + db_label, + num_clusters); } return id; @@ -831,6 +713,31 @@ void AMSConfigureFSDatabase(AMSDBType db_type, const char *db_path) db_instance.instantiate_fs_db(db_type, std::string(db_path)); } -#ifdef __cplusplus + +#ifdef __ENABLE_MPI__ +AMSExecutor AMSCreateDistributedExecutor(AMSCAbstrModel model, + AMSDType data_type, + AMSResourceType resource_type, + AMSPhysicFn call_back, + MPI_Comm Comm, + int process_id, + int world_size) +{ + if (data_type == AMSDType::AMS_DOUBLE) { + auto *dWF = _AMSCreateExecutor( + model, data_type, resource_type, call_back, process_id, world_size); + dWF->set_communicator(Comm); + return _AMSRegisterExecutor(data_type, dWF); + + } else if (data_type == AMSDType::AMS_SINGLE) { + auto *sWF = _AMSCreateExecutor( + model, data_type, resource_type, call_back, process_id, world_size); + sWF->set_communicator(Comm); + return _AMSRegisterExecutor(data_type, sWF); + } else { + throw std::invalid_argument("Data type is not supported by AMSLib!"); + return static_cast(-1); + } } #endif +} // namespace ams diff --git a/src/AMSlib/AMSTensor.cpp b/src/AMSlib/AMSTensor.cpp index 4057e1bc..2c903035 100644 --- a/src/AMSlib/AMSTensor.cpp +++ b/src/AMSlib/AMSTensor.cpp @@ -1,7 +1,10 @@ +#include + #include "AMS.h" #include "AMSTensor.hpp" #include "ArrayRef.hpp" #include "SmallVector.hpp" +#include "include/AMSTensor.hpp" #include "wf/resource_manager.hpp" #include "wf/utils.hpp" @@ -30,13 +33,13 @@ bool AMSTensor::isContiguous(AMSTensor::IntDimType expected_stride) const return true; } - -AMSTensor::AMSTensor(ams::ArrayRef shapes, +AMSTensor::AMSTensor(uint8_t* data, + ams::ArrayRef shapes, ams::ArrayRef strides, AMSDType dType, AMSResourceType location, bool view) - : _elements(computeNumElements(shapes)), + : _data(data), _element_size(dtype_to_size(dType)), _shape(shapes), _strides(strides), @@ -44,46 +47,76 @@ AMSTensor::AMSTensor(ams::ArrayRef shapes, _location(location), _owned(!view) { - _contiguous = isContiguous(_element_size); - auto& rm = ams::ResourceManager::getInstance(); - if (!view) { - _data = rm.allocate(_elements * _element_size, - _location, - _element_size); - _bytes = _elements * _element_size; - if (!_data) { - throw std::runtime_error("Failed to allocate memory for AMSTensor."); - } +#warning add a check to verify that user provided data are contiguous + _bytes = _elements * _element_size; + _elements = computeNumElements(shapes); + if (!_data) { + throw std::runtime_error("Generating tensor with Null Pointer AMSTensor."); } + std::cout << "Pointer is " << _data << "\n"; } - +template >> AMSTensor AMSTensor::create(ams::ArrayRef shapes, ams::ArrayRef strides, - AMSDType dType, AMSResourceType location) { - return AMSTensor(shapes, strides, dType, location); + auto numElements = computeNumElements(shapes); + auto& rm = ams::ResourceManager::getInstance(); + if constexpr (std::is_same_v) { + float* _data = rm.allocate(numElements, location, sizeof(float)); + return AMSTensor((uint8_t*)_data, shapes, strides, AMS_SINGLE, location); + } else if constexpr (std::is_same_v) { + double* _data = rm.allocate(numElements, location, sizeof(double)); + return AMSTensor((uint8_t*)_data, shapes, strides, AMS_DOUBLE, location); + } else { + // This should never happen due to the type restriction + static_assert(std::is_same_v || + std::is_same_v, + "AMSTensor only supports float or double tensor creation"); + } } -AMSTensor AMSTensor::view(uint8_t* data, + +template >> +AMSTensor AMSTensor::view(FPType* data, ams::ArrayRef shapes, ams::ArrayRef strides, - AMSDType dType, AMSResourceType location) { - auto tensor = AMSTensor(shapes, strides, dType, location, true); - tensor._data = data; - return tensor; + if constexpr (std::is_same_v) { + std::cout << "Generating float view from pointer " << data << "\n"; + return AMSTensor( + (uint8_t*)data, shapes, strides, AMS_SINGLE, location, true); + } else if constexpr (std::is_same_v) { + std::cout << "Generating a double view from pointer " << data << "\n"; + return AMSTensor( + (uint8_t*)data, shapes, strides, AMS_DOUBLE, location, true); + } else { + static_assert(std::is_same_v || + std::is_same_v, + "AMSTensor only supports float or double tensor view"); + } + throw std::runtime_error("Should never get here\n"); } AMSTensor AMSTensor::view(AMSTensor& tensor) { - return AMSTensor::view(tensor._data, - tensor._shape, - tensor._strides, - tensor._dType, - tensor._location); + std::cout << "Creating a view here from AMS Tensor\n"; + if (tensor._dType == AMS_DOUBLE) + return AMSTensor::view((double*)tensor._data, + tensor._shape, + tensor._strides, + tensor._location); + else if (tensor._dType == AMS_SINGLE) + return AMSTensor::view((float*)tensor._data, + tensor._shape, + tensor._strides, + tensor._location); + throw std::runtime_error( + "Creating view through copying constructor has incorrect dtype"); } AMSTensor::~AMSTensor() @@ -149,8 +182,17 @@ AMSTensor AMSTensor::transpose(AMSTensor::IntDimType axis1, std::swap(newStrides[axis1], newStrides[axis2]); // Create a new tensor with the same data, new shape, and strides - AMSTensor transposedTensor = - view(_data, newShape, newStrides, _dType, _location); + if (dType() == AMSDType::AMS_DOUBLE) + return view((double*)_data, newShape, newStrides, _location); + else if (dType() == AMSDType::AMS_SINGLE) + return view((double*)_data, newShape, newStrides, _location); - return transposedTensor; + throw std::runtime_error("Unknow data type in transpose\n"); } + +template AMSTensor AMSTensor::create(ams::ArrayRef, + ams::ArrayRef, + AMSResourceType); +template AMSTensor AMSTensor::create(ams::ArrayRef, + ams::ArrayRef, + AMSResourceType); diff --git a/src/AMSlib/include/AMS.h b/src/AMSlib/include/AMS.h index 1091ff5c..3b5b1999 100644 --- a/src/AMSlib/include/AMS.h +++ b/src/AMSlib/include/AMS.h @@ -4,14 +4,13 @@ * * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception */ - -#ifndef __AMS__ -#define __AMS__ +#pragma once #include -#include "AMS-config.h" +//#include "AMS-config.h" #include "AMSTensor.hpp" +#include "AMSTypes.hpp" #ifdef __AMS_ENABLE_CALIPER__ #include @@ -38,83 +37,50 @@ typedef void *MPI_Comm; #define PERFFASPECT() #endif +namespace ams +{ + using EOSLambda = std::function &, ams::SmallVector &, ams::SmallVector &)>; -#ifdef __cplusplus -extern "C" { -#endif - -typedef void (*AMSPhysicFn)(void *, long, const void *const *, void *const *); - -typedef int64_t AMSExecutor; -typedef int AMSCAbstrModel; - -typedef enum { AMS_UBALANCED = 0, AMS_BALANCED } AMSExecPolicy; +using EOSCFn = void (*)(void *, + const ams::SmallVector &, + ams::SmallVector &, + ams::SmallVector &); -typedef enum { AMS_NONE = 0, AMS_CSV, AMS_REDIS, AMS_HDF5, AMS_RMQ } AMSDBType; - -enum struct AMSUQPolicy { - AMS_UQ_BEGIN = 0, - AMS_FAISS_MEAN, - AMS_FAISS_MAX, - AMS_DELTAUQ_MEAN, - AMS_DELTAUQ_MAX, - AMS_RANDOM, - AMS_UQ_END -}; +using AMSExecutor = int64_t; +using AMSCAbstrModel = int; void AMSInit(); void AMSFinalize(); -typedef struct { - uint8_t *dPtr; - size_t *shape; - size_t *strides; - int dims; - ams::AMSDType dType; // AMS_SINGLE/AMS_DOUBLE - ams::AMSResourceType location; // CPU/GPU/Pinned -} AMSCTensor; - ->>>>>>> c52415d (Concat test case 1, works) AMSExecutor AMSCreateExecutor(AMSCAbstrModel model, - ams::AMSDType data_type, - ams::AMSResourceType resource_type, - AMSPhysicFn call_back, int process_id, int world_size); -#ifdef __AMS_ENABLE_MPI__ -AMSExecutor AMSCreateDistributedExecutor(AMSCAbstrModel model, - ams::AMSDType data_type, - AMSResourceType resource_type, - AMSPhysicFn call_back, - MPI_Comm comm, - int process_id, - int world_size); -#endif - - AMSCAbstrModel AMSRegisterAbstractModel(const char *domain_name, AMSUQPolicy uq_policy, double threshold, const char *surrogate_path, - const char *uq_path, - const char *db_label, - int num_clusters); + const char *db_label); AMSCAbstrModel AMSQueryModel(const char *domain_model); void AMSExecute(AMSExecutor executor, - void *probDescr, - const int numElements, - const void **input_data, - void **output_data, - int inputDim, - int outputDim); + EOSLambda &OrigComputation, + const ams::SmallVector &ins, + ams::SmallVector &inouts, + ams::SmallVector &outs); + +void AMSCExecute(AMSExecutor executor, + EOSCFn OrigComputation, + void *args, + const ams::SmallVector &ins, + ams::SmallVector &inouts, + ams::SmallVector &outs); void AMSDestroyExecutor(AMSExecutor executor); @@ -122,8 +88,4 @@ void AMSSetAllocator(ams::AMSResourceType resource, const char *alloc_name); const char *AMSGetAllocatorName(ams::AMSResourceType device); void AMSConfigureFSDatabase(AMSDBType db_type, const char *db_path); -#ifdef __cplusplus -} -#endif - -#endif +}; // namespace ams diff --git a/src/AMSlib/include/AMSTensor.hpp b/src/AMSlib/include/AMSTensor.hpp new file mode 100644 index 00000000..0420eff7 --- /dev/null +++ b/src/AMSlib/include/AMSTensor.hpp @@ -0,0 +1,152 @@ +#pragma once +#include + +#include +#include + +#include "AMSTypes.hpp" +#include "ArrayRef.hpp" +#include "SmallVector.hpp" + +namespace ams +{ + +class AMSTensor +{ +public: + using IntDimType = long int; + IntDimType elements() const { return _elements; } + IntDimType element_size() const { return _element_size; } + AMSDType dType() const { return _dType; } + AMSResourceType location() const { return _location; } + ams::ArrayRef strides() const { return _strides; } + ams::ArrayRef shape() const { return _shape; } + bool contiguous() const { return _contiguous; } + + +private: + uint8_t* _data; + IntDimType _elements; + IntDimType _element_size; + ams::SmallVector _shape; + ams::SmallVector _strides; + AMSDType _dType; // AMS_SINGLE/AMS_DOUBLE + AMSResourceType _location; // CPU/GPU/Pinned + bool _owned; + bool _contiguous; + bool _bytes; + + // Helper function to check if the tensor is contiguous in memory + bool isContiguous(IntDimType expected_stride) const; + + /** + * @brief Constructs a new AMSTensor with the specified shape, strides, data type, and location. + * This constructor is private and intended for internal use, such as creating views. + * @param[in] shapes The shape of the tensor. + * @param[in] strides The strides of the tensor. + * @param[in] dType The data type of the tensor elements. + * @param[in] location The memory location (e.g., CPU, GPU). + * @param[in] view Set to true if this tensor is a view of another tensor (non-owning). + */ + explicit AMSTensor(uint8_t* data, + ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSDType dType, + AMSResourceType location, + bool view = false); + + +public: + /** + * @brief Creates a new AMSTensor and allocates the tensor memory. + * @param[in] shapes The shape of the tensor. + * @param[in] strides The strides of the tensor. + * @param[in] dType The data type of the tensor elements. + * @param[in] location The memory location (e.g., CPU, GPU). + * @return A new AMSTensor with allocated memory. + */ + template >> + static AMSTensor create(ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSResourceType location); + + /** + * @brief Creates a view on an existing memory buffer. + * @param[in] data Pointer to the existing data to be viewed. + * @param[in] shapes The shape of the view tensor. + * @param[in] strides The strides of the view tensor. + * @param[in] dType The data type of the tensor elements. + * @param[in] location The memory location (e.g., CPU, GPU). + * @return A new AMSTensor that acts as a view of the existing data. + */ + template >> + static AMSTensor view(FPType* data, + ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSResourceType location); + + + static AMSTensor view(AMSTensor& tensor); + + /** + * @brief Destructor for AMSTensor, deallocates memory if this tensor owns it. + */ + ~AMSTensor(); + + + /** + * @brief Deleted copy assignment operator to prevent copying of tensors. + */ + AMSTensor(const AMSTensor&) = delete; + + /** + * @brief Move constructor for AMSTensor, transfers ownership of data. + * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. + */ + AMSTensor& operator=(const AMSTensor&) = delete; + + /** + * @brief Move assignment operator for AMSTensor, transfers ownership of data. + * @param[in,out] other The tensor to move from. It will be left in a valid but unspecified state. + * @return A reference to the updated tensor after move assignment. + */ + AMSTensor(AMSTensor&& other) noexcept; + + // Define move assignment operator + AMSTensor& operator=(AMSTensor&& other) noexcept; + + /** + * @brief Retrieves a typed pointer to the underlying data. + * @tparam T The data type to retrieve. + * @return A typed pointer to the tensor's data. + */ + template + T* data() const + { + return reinterpret_cast(_data); + } + + void* raw_data() const { return reinterpret_cast(_data); } + + /** + * @brief Creates a transposed view of the tensor by swapping two specified axes. + * @param[in] axis1 The first axis to swap in the transposition. + * @param[in] axis2 The second axis to swap in the transposition. + * @return A new AMSTensor that is a transposed view of the original tensor. + * @throw std::out_of_range if any axis is out of bounds. + */ + AMSTensor transpose(IntDimType axis1 = 0, IntDimType axis2 = 1) const; +}; + +// Explicit instantiation declarations +extern template AMSTensor AMSTensor::create( + ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSResourceType location); +extern template AMSTensor AMSTensor::create( + ams::ArrayRef shapes, + ams::ArrayRef strides, + AMSResourceType location); +} // namespace ams diff --git a/src/AMSlib/include/AMSTypes.hpp b/src/AMSlib/include/AMSTypes.hpp new file mode 100644 index 00000000..37d57ec2 --- /dev/null +++ b/src/AMSlib/include/AMSTypes.hpp @@ -0,0 +1,27 @@ +#pragma once + +namespace ams +{ +typedef enum { AMS_SINGLE = 0, AMS_DOUBLE, AMS_UNKNOWN_TYPE } AMSDType; + +typedef enum { + AMS_UNKNOWN = -1, + AMS_HOST = 0, + AMS_DEVICE = 1, + AMS_PINNED = 2, + AMS_RSEND +} AMSResourceType; + +typedef enum { AMS_UBALANCED = 0, AMS_BALANCED } AMSExecPolicy; + +typedef enum { AMS_NONE = 0, AMS_CSV, AMS_REDIS, AMS_HDF5, AMS_RMQ } AMSDBType; + +enum struct AMSUQPolicy { + AMS_UQ_BEGIN = 0, + AMS_DELTAUQ_MEAN, + AMS_DELTAUQ_MAX, + AMS_RANDOM, + AMS_UQ_END +}; + +} // namespace ams diff --git a/src/AMSlib/ml/surrogate.hpp b/src/AMSlib/ml/surrogate.hpp index e6dde8c5..c1b18981 100644 --- a/src/AMSlib/ml/surrogate.hpp +++ b/src/AMSlib/ml/surrogate.hpp @@ -24,6 +24,56 @@ #include "ArrayRef.hpp" #include "wf/debug.h" + +namespace UQ +{ +static inline bool isDeltaUQ(ams::AMSUQPolicy policy) +{ + if (policy >= ams::AMSUQPolicy::AMS_DELTAUQ_MEAN && + policy <= ams::AMSUQPolicy::AMS_DELTAUQ_MAX) { + return true; + } + return false; +} + +static inline bool isRandomUQ(ams::AMSUQPolicy policy) +{ + return policy == ams::AMSUQPolicy::AMS_RANDOM; +} + + +static inline bool isUQPolicy(ams::AMSUQPolicy policy) +{ + if (ams::AMSUQPolicy::AMS_UQ_BEGIN < policy && + policy < ams::AMSUQPolicy::AMS_UQ_END) + return true; + return false; +} + +static std::string UQPolicyToStr(ams::AMSUQPolicy policy) +{ + if (policy == ams::AMSUQPolicy::AMS_RANDOM) + return "random"; + else if (policy == ams::AMSUQPolicy::AMS_DELTAUQ_MEAN) + return "deltaUQ (mean)"; + else if (policy == ams::AMSUQPolicy::AMS_DELTAUQ_MAX) + return "deltaUQ (max)"; + return "Unknown"; +} + +static ams::AMSUQPolicy UQPolicyFromStr(std::string& policy) +{ + if (policy.compare("random") == 0) + return ams::AMSUQPolicy::AMS_RANDOM; + + else if (policy.compare("deltaUQ (mean)") == 0) + return ams::AMSUQPolicy::AMS_DELTAUQ_MEAN; + else if (policy.compare("deltaUQ (max)") == 0) + return ams::AMSUQPolicy::AMS_DELTAUQ_MAX; + return ams::AMSUQPolicy::AMS_UQ_END; +} +}; // namespace UQ + //! ---------------------------------------------------------------------------- //! An implementation for a surrogate model //! ---------------------------------------------------------------------------- @@ -84,16 +134,16 @@ class SurrogateModel std::tuple _computeDetlaUQ( c10::IValue& deltaUQTuple, - AMSUQPolicy policy, + ams::AMSUQPolicy policy, float threshold); std::tuple _evaluate(torch::Tensor& inputs, - AMSUQPolicy policy, + ams::AMSUQPolicy policy, const float threshold); std::tuple evaluate( ams::MutableArrayRef Inputs, - AMSUQPolicy policy, + ams::AMSUQPolicy policy, const float threshold); diff --git a/src/AMSlib/ml/uq.hpp b/src/AMSlib/ml/uq.hpp new file mode 100644 index 00000000..0cd708e0 --- /dev/null +++ b/src/AMSlib/ml/uq.hpp @@ -0,0 +1,212 @@ +/* + * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other + * AMSLib Project Developers + * + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#ifndef __AMS_UQ_HPP__ +#define __AMS_UQ_HPP__ + +#include +#include + +#include "AMS.h" +#include "ml/hdcache.hpp" +#include "ml/random_uq.hpp" +#include "ml/surrogate.hpp" +#include "wf/resource_manager.hpp" + +class BaseUQ +{ +public: + static inline bool isDeltaUQ(AMSUQPolicy policy) + { + if (policy >= AMSUQPolicy::AMS_DELTAUQ_MEAN && + policy <= AMSUQPolicy::AMS_DELTAUQ_MAX) { + return true; + } + return false; + } + + static inline bool isFaissUQ(AMSUQPolicy policy) + { + if (policy >= AMSUQPolicy::AMS_FAISS_MEAN && + policy <= AMSUQPolicy::AMS_FAISS_MAX) { + return true; + } + return false; + } + + static inline bool isRandomUQ(AMSUQPolicy policy) + { + return policy == AMSUQPolicy::AMS_RANDOM; + } + + + static inline bool isUQPolicy(AMSUQPolicy policy) + { + if (AMSUQPolicy::AMS_UQ_BEGIN < policy && policy < AMSUQPolicy::AMS_UQ_END) + return true; + return false; + } + + static std::string UQPolicyToStr(AMSUQPolicy policy) + { + if (policy == AMSUQPolicy::AMS_RANDOM) + return "random"; + else if (policy == AMSUQPolicy::AMS_FAISS_MAX) + return "faiss (max)"; + else if (policy == AMSUQPolicy::AMS_FAISS_MEAN) + return "faiss (mean)"; + else if (policy == AMSUQPolicy::AMS_DELTAUQ_MEAN) + return "deltaUQ (mean)"; + else if (policy == AMSUQPolicy::AMS_DELTAUQ_MAX) + return "deltaUQ (max)"; + return "Unknown"; + } + + static AMSUQPolicy UQPolicyFromStr(std::string &policy) + { + if (policy.compare("random") == 0) + return AMSUQPolicy::AMS_RANDOM; + else if (policy.compare("faiss (max)") == 0) + return AMSUQPolicy::AMS_FAISS_MAX; + else if (policy.compare("faiss (mean)") == 0) + return AMSUQPolicy::AMS_FAISS_MEAN; + else if (policy.compare("deltaUQ (mean)") == 0) + return AMSUQPolicy::AMS_DELTAUQ_MEAN; + else if (policy.compare("deltaUQ (max)") == 0) + return AMSUQPolicy::AMS_DELTAUQ_MAX; + return AMSUQPolicy::AMS_UQ_END; + } +}; + +class UQ : public BaseUQ +{ +public: + UQ(AMSResourceType resourceLocation, + const AMSUQPolicy uq_policy, + std::string &uqPath, + const int nClusters, + std::string &surrogatePath, + float threshold) + : uqPolicy(uq_policy), threshold(threshold) + { + if (surrogatePath.empty()) { + surrogate = nullptr; + hdcache = nullptr; + randomUQ = nullptr; + return; + } + + DBG(UQ, + "START: UQ Model is of type (%s, %d) with threshold %f", + BaseUQ::UQPolicyToStr(uqPolicy).c_str(), + uqPolicy, + threshold) + + if (!isUQPolicy(uq_policy)) + THROW(std::runtime_error, "Invalid UQ policy, value is out-of-bounds"); + + + bool is_DeltaUQ = isDeltaUQ(uqPolicy); + + surrogate = SurrogateModel::getInstance(surrogatePath, + resourceLocation, + is_DeltaUQ); + + if (isFaissUQ(uqPolicy)) { + if (uqPath.empty()) + THROW(std::runtime_error, "Missing file path to a FAISS UQ model"); + + hdcache = HDCache::getInstance( + uqPath, resourceLocation, uqPolicy, nClusters, threshold); + } + + if (isRandomUQ(uqPolicy)) + randomUQ = std::make_unique(resourceLocation, threshold); + + DBG(UQ, + "UQ Model is of type (%s, %d) with threshold %f", + BaseUQ::UQPolicyToStr(uqPolicy).c_str(), + uqPolicy, + threshold) + } + + PERFFASPECT() + void evaluate(const int totalElements, + std::vector &inputs, + std::vector &outputs, + bool *p_ml_acceptable) + { + + DBG(UQ, + "Calling %s surrogate [in:%ld %ld] -> (out:[%ld " + "%ld])", + BaseUQ::UQPolicyToStr(uqPolicy).c_str(), + totalElements, + inputs.size(), + totalElements, + outputs.size()); + + if ((uqPolicy == AMSUQPolicy::AMS_DELTAUQ_MEAN) || + (uqPolicy == AMSUQPolicy::AMS_DELTAUQ_MAX)) { + + auto &rm = ams::ResourceManager::getInstance(); + + CALIPER(CALI_MARK_BEGIN("DELTAUQ SURROGATE");) + surrogate->evaluate( + totalElements, inputs, outputs, uqPolicy, p_ml_acceptable, threshold); + CALIPER(CALI_MARK_END("DELTAUQ SURROGATE");) + } else if (uqPolicy == AMSUQPolicy::AMS_FAISS_MEAN || + uqPolicy == AMSUQPolicy::AMS_FAISS_MAX) { + CALIPER(CALI_MARK_BEGIN("HDCACHE");) + hdcache->evaluate(totalElements, inputs, p_ml_acceptable); + CALIPER(CALI_MARK_END("HDCACHE");) + + CALIPER(CALI_MARK_BEGIN("SURROGATE");) + surrogate->evaluate(totalElements, inputs, outputs); + CALIPER(CALI_MARK_END("SURROGATE");) + } else if (uqPolicy == AMSUQPolicy::AMS_RANDOM) { + CALIPER(CALI_MARK_BEGIN("RANDOM_UQ");) + DBG(Workflow, "Evaluating Random UQ"); + randomUQ->evaluate(totalElements, p_ml_acceptable); + CALIPER(CALI_MARK_END("RANDOM_UQ");) + + CALIPER(CALI_MARK_BEGIN("SURROGATE");) + surrogate->evaluate(totalElements, inputs, outputs); + CALIPER(CALI_MARK_END("SURROGATE");) + } else { + THROW(std::runtime_error, "Invalid UQ policy"); + } + } + + void updateModel(const std::string &model_path, + const std::string &uq_path = "") + { + if (uqPolicy == AMSUQPolicy::AMS_FAISS_MAX || + uqPolicy == AMSUQPolicy::AMS_FAISS_MEAN) { + THROW(std::runtime_error, "UQ model does not support update."); + } + + if (uqPolicy == AMSUQPolicy::AMS_RANDOM && uq_path != "") { + WARNING(Workflow, + "RandomUQ cannot update hdcache path, ignoring argument") + } + + surrogate->update(model_path); + return; + } + + bool hasSurrogate() { return (surrogate ? true : false); } + +private: + AMSUQPolicy uqPolicy; + FPTypeValue threshold; + std::unique_ptr randomUQ; + std::shared_ptr> hdcache; + std::shared_ptr> surrogate; +}; + +#endif diff --git a/src/AMSlib/wf/device.hpp b/src/AMSlib/wf/device.hpp new file mode 100644 index 00000000..1ec6252e --- /dev/null +++ b/src/AMSlib/wf/device.hpp @@ -0,0 +1,49 @@ +/* + * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other + * AMSLib Project Developers + * + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#ifndef __AMS_DEVICE_HPP__ +#define __AMS_DEVICE_HPP__ + +#include +#include +#include +#include + +#include "AMS.h" +#include "wf/debug.h" + +#define UNDEFINED_FUNC -1 + +#ifdef __ENABLE_CUDA__ +namespace ams +{ +void DtoDMemcpy(void *dest, void *src, size_t nBytes); + +void HtoHMemcpy(void *dest, void *src, size_t nBytes); + +void HtoDMemcpy(void *dest, void *src, size_t nBytes); + +void DtoHMemcpy(void *dest, void *src, size_t nBytes); + +void *DeviceAllocate(size_t nBytes); + +void DeviceFree(void *ptr); + +void *DevicePinnedAlloc(size_t nBytes); + +void DeviceFreePinned(void *ptr); + +void deviceCheckErrors(const char *file, int line); + +void device_random_uq(int seed, + bool *uq_flags, + int ndata, + double acceptable_error); + +} // namespace ams + +#endif diff --git a/src/AMSlib/wf/interface.cpp b/src/AMSlib/wf/interface.cpp index a54baea6..a61a0de1 100644 --- a/src/AMSlib/wf/interface.cpp +++ b/src/AMSlib/wf/interface.cpp @@ -1,8 +1,13 @@ +#include #include +#include #include +#include + #include "AMS.h" #include "AMSTensor.hpp" +#include "wf/workflow.hpp" using namespace ams; @@ -38,6 +43,30 @@ static AMSDType torchDTypeToAMSType(torch::Dtype dtype) return dtypeMap.count(dtype) ? dtypeMap.at(dtype) : AMSDType::AMS_UNKNOWN_TYPE; } + +static c10::DeviceType amsToTorchDevice(const ams::AMSResourceType resource) +{ + if (resource == ams::AMSResourceType::AMS_HOST) + return c10::DeviceType::CPU; + else if (resource == ams::AMSResourceType::AMS_DEVICE) + return c10::DeviceType::CUDA; + + throw std::runtime_error("Unknown ams resource type"); + return c10::DeviceType::COMPILE_TIME_MAX_DEVICE_TYPES; +} + +static c10::ScalarType amsToTorchDType(const ams::AMSDType dType) +{ + if (dType == ams::AMSDType::AMS_SINGLE) + return torch::kFloat32; + else if (dType == ams::AMSDType::AMS_DOUBLE) + return torch::kFloat64; + + throw std::runtime_error("Unknown ams data type"); + return torch::kHalf; +} + + static ams::SmallVector torchToAMSTensors( ams::MutableArrayRef tensorVector) { @@ -51,21 +80,43 @@ static ams::SmallVector torchToAMSTensors( // this is a cheap operating. It should boil down to: shapes.start = tensor.sizes.start, shapes.end = tensor.sizes.end; auto shapes = ArrayRef(tensor.sizes().begin(), tensor.strides().size()); auto strides = ArrayRef(tensor.strides().begin(), tensor.strides().size()); - if (dType == AMSDType::AMS_SINGLE) - ams_tensors.push_back(AMSTensor::view( - (uint8_t*)(tensor.data_ptr()), shapes, strides, dType, rType)); - else if (dType == AMSDType::AMS_DOUBLE) + if (dType == AMSDType::AMS_SINGLE) { + std::cout << "Setting pointer " << tensor.data_ptr() << "\n"; + ams_tensors.push_back( + AMSTensor::view(tensor.data_ptr(), shapes, strides, rType)); + } else if (dType == AMSDType::AMS_DOUBLE) { + std::cout << "Setting pointer " << tensor.data_ptr() << "\n"; ams_tensors.push_back( - AMSTensor::view((uint8_t*)(tensor.data_ptr()), - shapes, - strides, - dType, - rType)); + AMSTensor::view(tensor.data_ptr(), shapes, strides, rType)); + } } return ams_tensors; } -void callApplication(EOSLambda CallBack, +static ams::SmallVector amsToTorchTensors( + ams::MutableArrayRef &amsTensorVector) +{ + ams::SmallVector ams_tensors; + for (auto &tensor : amsTensorVector) { + // We should be able to completely remove these conversion by using some template "magic." + // I will leave these for later though + auto dType = amsToTorchDType(tensor.dType()); + auto deviceType = amsToTorchDevice(tensor.location()); + // In both cases, I am effectively only forwarding the pointer of begin/end to ams. + // this is a cheap operating. It should boil down to: shapes.start = tensor.sizes.start, shapes.end = tensor.sizes.end; + c10::SmallVector shapes(tensor.shape().begin(), tensor.shape().end()); + c10::SmallVector strides(tensor.strides().begin(), + tensor.strides().end()); + ams_tensors.push_back(torch::from_blob( + tensor.raw_data(), + shapes, + strides, + torch::TensorOptions().dtype(dType).device(deviceType))); + } + return ams_tensors; +} + +void callApplication(ams::EOSLambda CallBack, ams::MutableArrayRef Ins, ams::MutableArrayRef InOuts, ams::MutableArrayRef Outs) @@ -76,3 +127,16 @@ void callApplication(EOSLambda CallBack, CallBack(AMSIns, AMSInOuts, AMSOuts); return; } + +void callAMS(ams::AMSWorkflow *executor, + EOSLambda Physics, + const ams::SmallVector &ins, + ams::SmallVector &inouts, + ams::SmallVector &outs) +{ + ams::MutableArrayRef tins; + ams::MutableArrayRef tinouts; + ams::MutableArrayRef touts; +#warning transform ams::AMSTensor to torch tensors. + executor->evaluate(Physics, tins, tinouts, touts); +} diff --git a/src/AMSlib/wf/interface.hpp b/src/AMSlib/wf/interface.hpp index 7937212b..c1e3ec7b 100644 --- a/src/AMSlib/wf/interface.hpp +++ b/src/AMSlib/wf/interface.hpp @@ -1,10 +1,22 @@ +#pragma once #include #include #include "AMS.h" +namespace ams +{ +class AMSWorkflow; +} -void callApplication(EOSLambda CallBack, +void callApplication(ams::EOSLambda CallBack, ams::MutableArrayRef Ins, ams::MutableArrayRef InOuts, ams::MutableArrayRef Outs); + + +void callAMS(ams::AMSWorkflow *executor, + ams::EOSLambda Physics, + const ams::SmallVector &ins, + ams::SmallVector &inouts, + ams::SmallVector &outs); diff --git a/src/AMSlib/wf/rmq_reliable.hpp b/src/AMSlib/wf/rmq_reliable.hpp new file mode 100644 index 00000000..21b89701 --- /dev/null +++ b/src/AMSlib/wf/rmq_reliable.hpp @@ -0,0 +1,318 @@ +/* + * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other + * AMSLib Project Developers + * + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + * A channel wrapper based on AMQP::Reliable that allows message callbacks to be installed + * on the publish-confirms, to be called when they a confirmation is received from RabbitMQ. + * + * You can also change the base class and use Reliable if you not only + * want to be notified about the publish-confirms, but want to use it for automatic + * throttling at the same time. + * + * @author Michael van der Werve + * @copyright 2020 - 2023 Copernica BV + */ + +/** + * Header guard + */ +#pragma once + +/** + * Includes + */ +#include +#include +#include + +#include +#include + +/** + * Begin of namespaces + */ +namespace AMQP +{ + +/** + * Class definition + */ +template +class AMSReliable : public BASE +{ +private: + // make sure it is a proper channel + static_assert(std::is_base_of::value, + "base should be derived from a confirmed channel."); + + /** + * Set of open deliverytags. We want a normal set (not unordered_set) because + * removal will be cheaper for whole ranges. + * @var size_t + */ + std::map> _handlers; + + /** + * Called when the deliverytag(s) are acked + * @param deliveryTag + * @param multiple + */ + void onAck(uint64_t deliveryTag, bool multiple) override + { + // monitor the object, watching for destruction since these ack/nack handlers + // could destruct the object + Monitor monitor(this); + + // single element is simple + if (!multiple) { + // find the element + auto iter = _handlers.find(deliveryTag); + + // we did not find it (this should not be possible, unless somebody explicitly called) + // the base-class publish methods for some reason. + if (iter == _handlers.end()) return BASE::onAck(deliveryTag, multiple); + + // get the handler (we store it first so that we can remove it) + auto handler = iter->second; + + // erase it from the map (we remove it before the call, because the callback might update + // the _handlers and invalidate the iterator) + _handlers.erase(iter); + + // call the ack handler + handler->reportAck(); + + } + + // do multiple at once + else { + // keep looping for as long as the object is in a valid state + while (monitor && !_handlers.empty()) { + // get the first handler + auto iter = _handlers.begin(); + + // make sure this is the right deliverytag, if we've passed it we leap out + if (iter->first > deliveryTag) break; + + // get the handler + auto handler = iter->second; + + // remove it from the map (before we make a call to userspace, so that user space + // can add even more handlers, without invalidating iterators) + _handlers.erase(iter); + + // call the ack handler + handler->reportAck(); + } + } + + // make sure the object is still valid + if (!monitor) return; + + // call base handler as well + BASE::onAck(deliveryTag, multiple); + } + + /** + * Called when the deliverytag(s) are nacked + * @param deliveryTag + * @param multiple + */ + void onNack(uint64_t deliveryTag, bool multiple) override + { + // monitor the object, watching for destruction since these ack/nack handlers + // could destruct the object + Monitor monitor(this); + + // single element is simple + if (!multiple) { + // find the element + auto iter = _handlers.find(deliveryTag); + + // we did not find it (this should not be possible, unless somebody explicitly called) + // the base-class publish methods for some reason. + if (iter == _handlers.end()) return BASE::onNack(deliveryTag, multiple); + + // get the handler (we store it first so that we can remove it) + auto handler = iter->second; + + // erase it from the map (we remove it before the call, because the callback might update + // the _handlers and invalidate the iterator) + _handlers.erase(iter); + + // call the ack handler + handler->reportNack(); + } + + // nack multiple elements + else { + // keep looping for as long as the object is in a valid state + while (monitor && !_handlers.empty()) { + // get the first handler + auto iter = _handlers.begin(); + + // make sure this is the right deliverytag, if we've passed it we leap out + if (iter->first > deliveryTag) break; + + // get the handler + auto handler = iter->second; + + // remove it from the map (before we make a call to userspace, so that user space + // can add even more handlers, without invalidating iterators) + _handlers.erase(iter); + + // call the ack handler + handler->reportNack(); + } + } + + // if the object is no longer valid, return + if (!monitor) return; + + // call the base handler + BASE::onNack(deliveryTag, multiple); + } + + /** + * Method that is called to report an error + * @param message + */ + void reportError(const char *message) override + { + // monitor the object, watching for destruction since these ack/nack handlers + // could destruct the object + Monitor monitor(this); + + // move the handlers out + auto handlers = std::move(_handlers); + + // iterate over all the messages + // call the handlers + for (const auto &iter : handlers) { + // call the handler + iter.second->reportError(message); + + // if we were destructed in the meantime, we leap out + if (!monitor) return; + } + + // if the monitor is no longer valid, leap out + if (!monitor) return; + + // call the base handler + BASE::reportError(message); + } + +public: + /** + * Constructor + * @param channel + * @param throttle + */ + template + Reliable(Args &&...args) : BASE(std::forward(args)...) + { + } + + /** + * Deleted copy constructor, deleted move constructor + * @param other + */ + Reliable(const Reliable &other) = delete; + Reliable(Reliable &&other) = delete; + + /** + * Deleted copy assignment, deleted move assignment + * @param other + */ + Reliable &operator=(const Reliable &other) = delete; + Reliable &operator=(Reliable &&other) = delete; + + /** + * Virtual destructor + */ + virtual ~Reliable() = default; + + /** + * Method to check how many messages are still unacked. + * @return size_t + */ + virtual size_t unacknowledged() const override { return _handlers.size(); } + + /** + * Publish a message to an exchange. See amqpcpp/channel.h for more details on the flags. + * Delays actual publishing depending on the publisher confirms sent by RabbitMQ. + * + * @param exchange the exchange to publish to + * @param routingkey the routing key + * @param envelope the full envelope to send + * @param message the message to send + * @param size size of the message + * @param flags optional flags + * @return bool + */ + DeferredPublish &publish(const std::string_view &exchange, + const std::string_view &routingKey, + const std::string_view &message, + int flags = 0) + { + return publish(exchange, + routingKey, + Envelope(message.data(), message.size()), + flags); + } + DeferredPublish &publish(const std::string_view &exchange, + const std::string_view &routingKey, + const char *message, + size_t size, + int flags = 0) + { + return publish(exchange, routingKey, Envelope(message, size), flags); + } + DeferredPublish &publish(const std::string_view &exchange, + const std::string_view &routingKey, + const char *message, + int flags = 0) + { + return publish(exchange, + routingKey, + Envelope(message, strlen(message)), + flags); + } + + /** + * Publish a message to an exchange. See amqpcpp/channel.h for more details on the flags. + * Delays actual publishing depending on the publisher confirms sent by RabbitMQ. + * + * @param exchange the exchange to publish to + * @param routingkey the routing key + * @param envelope the full envelope to send + * @param message the message to send + * @param size size of the message + * @param flags optional flags + */ + DeferredPublish &publish(const std::string_view &exchange, + const std::string_view &routingKey, + const Envelope &envelope, + int flags = 0) + { + // publish the entire thing, and remember if it failed at any point + uint64_t tag = BASE::publish(exchange, routingKey, envelope, flags); + + // create the publish deferred object, if we got no tag we failed + auto handler = std::make_shared(tag == 0); + + // add it to the open handlers + _handlers[tag] = handler; + + // return the dereferenced handler + return *handler; + } +}; + +/** + * End of namespaces + */ +} // namespace AMQP diff --git a/src/AMSlib/wf/utils.cpp b/src/AMSlib/wf/utils.cpp new file mode 100644 index 00000000..9b2884e2 --- /dev/null +++ b/src/AMSlib/wf/utils.cpp @@ -0,0 +1,16 @@ +/* + * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other + * AMSLib Project Developers + * + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + */ + +#include "wf/utils.hpp" + +void random_uq_host(bool* uq_flags, int ndata, double acceptable_error) +{ + + for (int i = 0; i < ndata; i++) { + uq_flags[i] = ((double)rand() / RAND_MAX) <= acceptable_error; + } +} From b51247de4b2751c77944d08a724b54c80736aeb9 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 23 Dec 2024 15:04:28 -0800 Subject: [PATCH 015/136] Fixing integration tests --- src/AMSlib/ml/hdcache.hpp | 574 ------------------ src/AMSlib/wf/data_handler.hpp | 353 ----------- tests/AMSlib/CMakeLists.txt | 307 +--------- tests/AMSlib/ams_interface/CMakeLists.txt | 183 ++++++ tests/AMSlib/ams_interface/ams_ete.cpp | 205 +++++++ tests/AMSlib/ams_interface/ams_ete_env.cpp | 206 +++++++ .../ams_interface/ams_multi_model_ete.cpp | 240 ++++++++ .../{ => ams_interface}/ams_rmq_env.cpp | 0 .../env_2_models_fs_rand_uq.json.in | 0 .../json_configs/objects.json.in | 26 + .../json_configs/rmq.json.in | 0 .../AMSlib/{ => ams_interface}/verify_ete.py | 6 +- .../AMSlib/{ => ams_interface}/verify_rmq.py | 0 tests/AMSlib/db/db_manager_hdf5.cpp | 3 +- tests/AMSlib/models/CMakeLists.txt | 32 +- tests/AMSlib/models/generate.sh | 9 + tests/AMSlib/models/generate_linear_model.py | 64 ++ tests/AMSlib/torch/evaluate_model.cpp | 9 +- .../torch/evalute_model_conversions.cpp | 9 +- tests/AMSlib/wf/evaluate_in_and_outs.cpp | 7 + 20 files changed, 986 insertions(+), 1247 deletions(-) delete mode 100644 src/AMSlib/ml/hdcache.hpp delete mode 100644 src/AMSlib/wf/data_handler.hpp create mode 100644 tests/AMSlib/ams_interface/CMakeLists.txt create mode 100644 tests/AMSlib/ams_interface/ams_ete.cpp create mode 100644 tests/AMSlib/ams_interface/ams_ete_env.cpp create mode 100644 tests/AMSlib/ams_interface/ams_multi_model_ete.cpp rename tests/AMSlib/{ => ams_interface}/ams_rmq_env.cpp (100%) rename tests/AMSlib/{ => ams_interface}/json_configs/env_2_models_fs_rand_uq.json.in (100%) create mode 100644 tests/AMSlib/ams_interface/json_configs/objects.json.in rename tests/AMSlib/{ => ams_interface}/json_configs/rmq.json.in (100%) rename tests/AMSlib/{ => ams_interface}/verify_ete.py (97%) rename tests/AMSlib/{ => ams_interface}/verify_rmq.py (100%) create mode 100644 tests/AMSlib/models/generate_linear_model.py diff --git a/src/AMSlib/ml/hdcache.hpp b/src/AMSlib/ml/hdcache.hpp deleted file mode 100644 index 31719979..00000000 --- a/src/AMSlib/ml/hdcache.hpp +++ /dev/null @@ -1,574 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef __AMS_HDCACHE_HPP__ -#define __AMS_HDCACHE_HPP__ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __ENABLE_FAISS__ -#include -#include -#include - -#ifdef __ENABLE_CUDA__ -#include -#include -#include -#include - -#include "wf/device.hpp" -#endif -#endif - -#include "AMS.h" -#include "wf/data_handler.hpp" -#include "wf/resource_manager.hpp" -#include "wf/utils.hpp" - -//! ---------------------------------------------------------------------------- -//! An implementation of FAISS-based HDCache -//! ---------------------------------------------------------------------------- -template -class HDCache -{ - - static_assert(std::is_floating_point::value, - "HDCache supports floating-point values (floats, doubles, and " - "long doubles) only!"); - -#ifdef __ENABLE_FAISS__ - using Index = faiss::Index; - using TypeIndex = faiss::Index::idx_t; // 64-bit int - using TypeValue = float; // faiss uses floats -#ifdef __ENABLE_CUDA__ - faiss::gpu::StandardGpuResources res; - faiss::gpu::GpuClonerOptions copyOptions; -#endif -#else - using Index = void; - using TypeIndex = uint64_t; - using TypeValue = TypeInValue; -#endif - using data_handler = - ams::DataHandler; // utils to handle float data - - Index *m_index = nullptr; - const uint8_t m_dim; - - const int m_knbrs = 0; - const AMSUQPolicy m_policy = AMSUQPolicy::AMS_FAISS_MEAN; - - AMSResourceType cache_location; - - const TypeValue acceptable_error; - - -#ifdef __ENABLE_FAISS__ - const char *index_key = "IVF4096,Flat"; - // const char* index_key = "IndexFlatL2"; - // const char* index_key = "IndexFlatL2"; - // const char* index_key = "GpuIndexFlatL2"; - - // faiss::gpu::StandardGpuResources resources; - // faiss::gpu::GpuIndexIVFPQConfig config; - // faiss::IndexIVFPQ* index_cpu; - // faiss::gpu::GpuIndexIVFPQ *index_gpu; -#endif - -protected: - // A mechanism to keep track of all unique HDCaches - static std::unordered_map>> - instances; - - //! ------------------------------------------------------------------------ - //! constructors - //! ------------------------------------------------------------------------ -#ifdef __ENABLE_FAISS__ - HDCache(const std::string &cache_path, - AMSResourceType resource, - const AMSUQPolicy uqPolicy, - int knbrs, - TypeInValue threshold = 0.5) - : m_index(load_cache(cache_path)), - m_dim(m_index->d), - m_knbrs(knbrs), - m_policy(uqPolicy), - cache_location(resource), - acceptable_error(threshold) - { -#ifdef __ENABLE_CUDA__ - // Copy index to device side - if (cache_location == AMSResourceType::AMS_DEVICE) { - faiss::gpu::GpuClonerOptions copyOptions; - faiss::gpu::ToGpuCloner cloner(&res, 0, copyOptions); - m_index = cloner.clone_Index(m_index); - } -#endif - print(); - } -#else // Disabled FAISS - HDCache(const std::string &cache_path, - AMSResourceType resource, - const AMSUQPolicy uqPolicy, - int knbrs, - TypeInValue threshold = 0.5) - : m_index(load_cache(cache_path)), - m_dim(0), - m_knbrs(knbrs), - m_policy(uqPolicy), - cache_location(resource), - acceptable_error(threshold) - { - WARNING(UQModule, "Ignoring cache path because FAISS is not available") - print(); - } -#endif - -public: - static std::shared_ptr> find_cache( - const std::string &cache_path, - AMSResourceType resource, - const AMSUQPolicy uqPolicy, - int knbrs, - TypeInValue threshold = 0.5) - { - auto model = HDCache::instances.find(cache_path); - - if (model != instances.end()) { - // Model Found - auto cache = model->second; - if (resource != cache->cache_location) - throw std::runtime_error( - "Currently we do not support loading the same index on different " - "devices."); - - if (uqPolicy != cache->m_policy) - throw std::runtime_error( - "We do not support caches of different policies."); - - if (knbrs != cache->m_knbrs) - throw std::runtime_error( - "We do not support caches of different number of neighbors."); - - // FIXME: Here we need to cast both to float. FAISS index only works for - // single precision and we shoehorn FAISS inability to support arbitary real - // types by forcing TypeValue to be 'float'. In our case this results in having - // cases where input data are of type(TypeInValue) double. Thus here, threshold can - // be of different type than 'acceptable_error' and at compile time we cannot decide - // which overloaded function to pick. - if (!is_real_equal(static_cast(threshold), - static_cast(cache->acceptable_error))) - throw std::runtime_error( - "We do not support caches of different thresholds"); - - return cache; - } - return nullptr; - } - - static std::shared_ptr> getInstance( - const std::string &cache_path, - AMSResourceType resource, - const AMSUQPolicy uqPolicy, - int knbrs, - TypeInValue threshold = 0.5) - { - - // Cache does not exist. We need to create one - // - std::shared_ptr> cache = - find_cache(cache_path, resource, uqPolicy, knbrs, threshold); - if (cache) { - DBG(UQModule, "Returning existing cache under (%s)", cache_path.c_str()) - return cache; - } - - if (uqPolicy != AMSUQPolicy::AMS_FAISS_MEAN && - uqPolicy != AMSUQPolicy::AMS_FAISS_MAX) - THROW(std::invalid_argument, - "Invalid UQ policy for hdcache" + - std::to_string(static_cast(uqPolicy))); - - DBG(UQModule, "Generating new cache under (%s)", cache_path.c_str()) - std::shared_ptr> new_cache = - std::shared_ptr>(new HDCache( - cache_path, resource, uqPolicy, knbrs, threshold)); - - instances.insert(std::make_pair(cache_path, new_cache)); - return new_cache; - } - - ~HDCache() - { - DBG(UQModule, "Deleting UQ-Module"); -#ifdef __ENABLE_FAISS__ - if (m_index) { - DBG(UQModule, "Deleting HD-Cache"); - /// TODO: Deleting the cache on device can, and does - /// result in C++ destructor. - if (cache_location != AMSResourceType::AMS_DEVICE) { - m_index->reset(); - delete m_index; - } - } -#endif - } - - //! ------------------------------------------------------------------------ - //! simple queries - //! ------------------------------------------------------------------------ - inline void print() const - { - std::string info("index = null"); - if (has_index()) { - info = "npoints = " + std::to_string(count()); - } - DBG(UQModule, "HDCache (on_device = %d %s)", cache_location, info.c_str()); - } - - inline bool has_index() const - { -#ifdef __ENABLE_FAISS__ - return m_index != nullptr && m_index->is_trained; -#endif - return true; - } - - inline size_t count() const - { -#ifdef __ENABLE_FAISS__ - return m_index->ntotal; -#endif - return 0; - } - - inline uint8_t dim() const { return m_dim; } - - //! ------------------------------------------------------------------------ - //! load/save faiss cache - //! ------------------------------------------------------------------------ - static inline Index *load_cache(const std::string &filename) - { -#ifdef __ENABLE_FAISS__ - DBG(UQModule, "Loading HDCache: %s", filename.c_str()); - return faiss::read_index(filename.c_str()); -#else - return nullptr; -#endif - } - - inline void save_cache(const std::string &filename) const - { -#ifdef __ENABLE_FAISS__ - print(); - DBG(UQModule, "Saving HDCache to: %s", filename.c_str()); - faiss::write_index(m_index, filename.c_str()); -#endif - } - - //! ----------------------------------------------------------------------- - //! add points to the faiss cache - //! ----------------------------------------------------------------------- - //! add the data that comes as linearized features - PERFFASPECT() - void add(const size_t ndata, const size_t d, TypeInValue *data) - { - DBG(UQModule, "Add %ld %ld points to HDCache", ndata, d); - CFATAL(UQModule, d != m_dim, "Mismatch in data dimensionality!") - CFATAL(UQModule, - !has_index(), - "HDCache does not have a valid and trained index!") - - _add(ndata, data); - } - - //! add the data that comes as separate features (a vector of pointers) - PERFFASPECT() - void add(const size_t ndata, const std::vector &inputs) - { - if (inputs.size() != m_dim) - CFATAL(UQModule, - inputs.size() != m_dim, - "Mismatch in data dimensionality") - CFATAL(UQModule, - !has_index(), - "HDCache does not have a valid and trained index!") - - TypeValue *lin_data = - data_handler::linearize_features(cache_location, ndata, inputs); - _add(ndata, lin_data); - auto &rm = ams::ResourceManager::getInstance(); - rm.deallocate(lin_data, cache_location); - } - - //! ----------------------------------------------------------------------- - //! train a faiss cache - //! ----------------------------------------------------------------------- - //! train on data that comes as linearized features - PERFFASPECT() - void train(const size_t ndata, const size_t d, TypeInValue *data) - { - DBG(UQModule, "Add %ld %ld points to HDCache", ndata, d); - CFATAL(UQModule, d != m_dim, "Mismatch in data dimensionality!") - CFATAL(UQModule, - !has_index(), - "HDCache does not have a valid and trained index!") - - _train(ndata, data); - DBG(UQModule, "Successfully Trained HDCache"); - } - - //! train on data that comes separate features (a vector of pointers) - PERFFASPECT() - void train(const size_t ndata, const std::vector &inputs) - { - TypeValue *lin_data = - data_handler::linearize_features(cache_location, ndata, inputs); - _train(ndata, lin_data); - auto &rm = ams::ResourceManager::getInstance(); - rm.deallocate(lin_data, cache_location); - } - - //! ------------------------------------------------------------------------ - //! evaluate uncertainty using the cache - //! ------------------------------------------------------------------------ - //! train on data that comes as linearized features - //! it looks like faiss can work directly on torch tensor - //! https://github.com/facebookresearch/faiss/wiki/Faiss-on-the-GPU#passing-in-pytorch-tensors - //! so, we should use Dino's code to linearize data into torch tensor and then - //! pass it here - PERFFASPECT() - void evaluate(const size_t ndata, - const size_t d, - TypeInValue *data, - bool *is_acceptable) const - { - - CFATAL(UQModule, - !has_index(), - "HDCache does not have a valid and trained index!") - DBG(UQModule, "Evaluating %ld %ld points using HDCache", ndata, d); - - CFATAL(UQModule, (d != m_dim), "Mismatch in data dimensionality!") - - _evaluate(ndata, data, is_acceptable); - - if (cache_location == AMSResourceType::AMS_DEVICE) { - ams::deviceCheckErrors(__FILE__, __LINE__); - } - - DBG(UQModule, "Done with evalution of uq") - } - - //! train on data that comes separate features (a vector of pointers) - PERFFASPECT() - void evaluate(const size_t ndata, - const std::vector &inputs, - bool *is_acceptable) const - { - - CFATAL(UQModule, - !has_index(), - "HDCache does not have a valid and trained index!") - DBG(UQModule, - "Evaluating %ld %ld points using HDCache configured with %d neighbors, " - "%f threshold, %d policy", - ndata, - inputs.size(), - m_knbrs, - acceptable_error, - m_policy); - CFATAL(UQModule, - (inputs.size() != m_dim), - "Mismatch in data dimensionality!") - - TypeValue *lin_data = - data_handler::linearize_features(cache_location, ndata, inputs); - _evaluate(ndata, lin_data, is_acceptable); - auto &rm = ams::ResourceManager::getInstance(); - rm.deallocate(lin_data, cache_location); - DBG(UQModule, "Done with evalution of uq"); - } - -private: -#ifdef __ENABLE_FAISS__ - //! ------------------------------------------------------------------------ - //! core faiss functionality. - //! ------------------------------------------------------------------------ - - inline uint8_t _dim() const { return (m_index != nullptr) ? m_index->d : 0; } - - //! add points to index when (data type = TypeValue) - template ::value> * = nullptr> - PERFFASPECT() - inline void _add(const size_t ndata, const T *data) - { - m_index->add(ndata, data); - } - - //! add points to index when (data type != TypeValue) - template ::value> * = nullptr> - PERFFASPECT() - inline void _add(const size_t ndata, const T *data) - { - TypeValue *vdata = - data_handler::cast_to_typevalue(cache_location, ndata, data); - _add(ndata, vdata); - delete[] vdata; - } - - - //! train an index when (data type = TypeValue) - template ::value> * = nullptr> - PERFFASPECT() - inline void _train(const size_t ndata, const T *data) - { - - if (m_index != nullptr && m_index->is_trained) - throw std::invalid_argument("!"); - - CFATAL(UQModule, - (m_index != nullptr && m_index->is_trained), - "Trying to re-train an already trained index") - - m_index = faiss::index_factory(m_dim, index_key); - m_index->train(ndata, data); - - CFATAL(UQModule, ((!m_index->is_trained)), "Failed to train index") - } - - //! train an index when (data type != TypeValue) - template ::value> * = nullptr> - PERFFASPECT() - inline void _train(const size_t ndata, const T *data) - { - TypeValue *vdata = - data_handler::cast_to_typevalue(cache_location, ndata, data); - _train(ndata, vdata); - delete[] vdata; - } - - // ------------------------------------------------------------------------- - //! evaluate cache uncertainty when (data type = TypeValue) - template ::value> * = nullptr> - PERFFASPECT() - void _evaluate(const size_t ndata, T *data, bool *is_acceptable) const - { - - const size_t knbrs = static_cast(m_knbrs); - static const TypeValue ook = 1.0 / TypeValue(knbrs); - auto &rm = ams::ResourceManager::getInstance(); - TypeValue *kdists = rm.allocate(ndata * knbrs, cache_location); - TypeIndex *kidxs = rm.allocate(ndata * knbrs, cache_location); - - // query faiss - // TODO: This is a HACK. When searching more than 65535 - // items in the GPU case, faiss is throwing an exception. - const unsigned int MAGIC_NUMBER = 65535; - for (int start = 0; start < ndata; start += MAGIC_NUMBER) { - unsigned int nElems = - ((ndata - start) < MAGIC_NUMBER) ? ndata - start : MAGIC_NUMBER; - DBG(UQModule, "Running for %d elements %d %d", nElems, start, m_dim); - m_index->search(nElems, - &data[start * m_dim], - knbrs, - &kdists[start * knbrs], - &kidxs[start * knbrs]); - } -#ifdef __ENABLE_CUDA__ - faiss::gpu::synchronizeAllDevices(); -#endif - - // compute means - if (cache_location == AMSResourceType::AMS_HOST) { - for (size_t i = 0; i < ndata; ++i) { - if (m_policy == AMSUQPolicy::AMS_FAISS_MEAN) { - TypeValue mean_dist = std::accumulate(kdists + i * knbrs, - kdists + (i + 1) * knbrs, - 0.) * - ook; - is_acceptable[i] = mean_dist < acceptable_error; - } else if (m_policy == AMSUQPolicy::AMS_FAISS_MAX) { - // Take the furtherst cluster as the distance metric - TypeValue max_dist = - *std::max_element(&kdists[i * knbrs], - &kdists[i * knbrs + knbrs - 1]); - is_acceptable[i] = (max_dist) < acceptable_error; - } - } - } else { - CFATAL(UQModule, - m_policy == AMSUQPolicy::AMS_FAISS_MAX, - "FAISS Max on device is not supported yet"); - - ams::Device::computePredicate( - kdists, is_acceptable, ndata, knbrs, acceptable_error); - } - - rm.deallocate(kdists, cache_location); - rm.deallocate(kidxs, cache_location); - } - - //! evaluate cache uncertainty when (data type != TypeValue) - template ::value> * = nullptr> - inline void _evaluate(const size_t ndata, T *data, bool *is_acceptable) const - { - TypeValue *vdata = - data_handler::cast_to_typevalue(cache_location, ndata, data); - _evaluate(ndata, data, is_acceptable); - delete[] vdata; - } - -#else - // ------------------------------------------------------------------------- - // fucntionality for randomized cache - // ------------------------------------------------------------------------- - inline uint8_t _dim() const { return 0; } - - template - PERFFASPECT() - inline void _add(const size_t, const T *) - { - } - - template - PERFFASPECT() - inline void _train(const size_t, const T *) - { - } - - template - PERFFASPECT() - inline void _evaluate(const size_t, T *, bool *) const - { - } -#endif - // ------------------------------------------------------------------------- -}; - -template -std::unordered_map>> - HDCache::instances; - -#endif diff --git a/src/AMSlib/wf/data_handler.hpp b/src/AMSlib/wf/data_handler.hpp deleted file mode 100644 index d03405b0..00000000 --- a/src/AMSlib/wf/data_handler.hpp +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef __AMS_UTILS_DATA_HPP__ -#define __AMS_UTILS_DATA_HPP__ - -#include -#include -#include - -#include "wf/device.hpp" -#include "wf/resource_manager.hpp" -#include "wf/utils.hpp" - -namespace ams -{ -/** - * @brief A "utility" class that transforms data into - * various formats. For example moving from sparse to dense - * representations - */ -template -class DataHandler -{ - -public: - /* @brief Casts C-vector from one type to another type. - * - * This function uses tempalte metaprogramming. When both - * the class Templated 'TypeValue' and the functions template - * 'TypeInValue' have the same type, we return directly - * the same memory. - * - * @tparam TypeInValue Type of the source value. - * @param[in] n The number of elements of the vector. - * @param[in] data A pointer pointing to the C-vector to be casted. - * @return A pointer to a C-vector containing the casted values. - * - */ - template < - class TypeInValue, - std::enable_if_t::value>* = nullptr> - static inline TypeValue* cast_to_typevalue(AMSResourceType resource, - const size_t n, - TypeInValue* data) - { - return data; - } - - /* @brief Casts C-vector from one type to another type. - * - * This function uses tempalte metaprogramming. Both - * the class Templated 'TypeValue' and the functions template - * 'TypeInValue' have a different type, thus we allocate a new - * vector of 'TypeInValue' type and we cast each element of the vector - * to the desired ('TypeValue') type. - * - * @tparam TypeInValue Type of the source value. - * @param[in] n The number of elements of the vector. - * @param[in] data A pointer pointing to the C-vector to be casted. - * @return A pointer to a C-vector containing the casted values. - * - */ - template < - typename TypeInValue, - std::enable_if_t::value>* = nullptr> - static inline TypeValue* cast_to_typevalue(AMSResourceType resource, - const size_t n, - TypeInValue* data) - { - auto& rm = ams::ResourceManager::getInstance(); - TypeValue* fdata = rm.allocate(resource, n); - std::transform(data, data + n, fdata, [&](const TypeInValue& v) { - return static_cast(v); - }); - return fdata; - } - - /* @brief Casts all elements of a C-vector from one type to - * the other type and stores them to the 'dest' vector. - * - * This function uses tempalte metaprogramming. In this function - * template datatypes match, thus we just copy data from - * one vector to another. - * - * @tparam TypeInValue Type of the source value. - * @param[in] n The number of elements of the vectors. - * @param[out] dest The destination vector. - * @param[in] src The source vector. - * @return A pointer to a C-vector containing the casted values. - */ - template < - typename TypeInValue, - std::enable_if_t::value>* = nullptr> - static inline void cast_from_typevalue(const size_t n, - TypeInValue* dest, - TypeValue* src) - { - std::transform(src, src + n, dest, [&](const TypeInValue& v) { return v; }); - } - - /* @brief Casts all elements of a C-vector from one type to - * the other type and stores them to the 'dest' vector. - * - * This function uses tempalte metaprogramming. In this function - * template datatypes do not match, thus we cast each element - * and store it to destination vector - * - * @tparam TypeInValue Type of the source value. - * @param[in] n The number of elements of the vectors. - * @param[out] dest The destination vector. - * @param[in] src The source vector. - * @return A pointer to a C-vector containing the casted values. - */ - template < - typename TypeInValue, - std::enable_if_t::value>* = nullptr> - static inline void cast_from_typevalue(const size_t n, - TypeInValue* dest, - TypeValue* src) - { - std::transform(src, src + n, dest, [&](const TypeInValue& v) { - return static_cast(v); - }); - } - - /* @brief linearize all elements of a vector of C-vectors - * in a single C-vector. Data are transposed. - * - * @tparam TypeInValue Type of the source value. - * @param[in] n The number of elements of the vectors. - * @param[in] features A vector containing C-vector of feature values. - * @return A pointer to a C-vector containing the linearized values. The - * C-vector is_same resident in the same device as the input feature pointers. - */ - template - PERFFASPECT() - static inline TypeValue* linearize_features( - AMSResourceType resource, - const size_t n, - const std::vector& features) - { - - const size_t nfeatures = features.size(); - const size_t nvalues = n * nfeatures; - - auto& rm = ams::ResourceManager::getInstance(); - TypeValue* data = rm.allocate(nvalues, resource); - - if (resource == AMSResourceType::AMS_HOST) { - for (size_t d = 0; d < nfeatures; d++) { - for (size_t i = 0; i < n; i++) { - data[i * nfeatures + d] = static_cast(features[d][i]); - } - } - } else { - ams::Device::linearize(data, features.data(), nfeatures, n); - } - return data; - } - - /* @brief The function stores all elements of the sparse - * vector in the dense vector if the respective index - * of the predicate vector is equal to 'denseVal. - * - * @param[in] dataLocation Location of the data - * @param[in] predicate A boolean vector storing which elements in the vector - * should be dropped. - * @param[in] n The number of elements of the C-vectors. - * @param[in] sparse A vector containing C-vectors whose elements will be - * dropped - * @param[out] dense A vector containing C-vectors with the remaining elements - * @param[in] denseVal The condition the predicate needs to meet for the index - * to be stored in the dense vector - * @return Total number of elements stored in the dense vector - * */ - PERFFASPECT() - static inline size_t pack(AMSResourceType dataLocation, - const bool* predicate, - const size_t n, - std::vector& sparse, - std::vector& dense, - bool denseVal = false) - { - if (sparse.size() != dense.size()) - throw std::invalid_argument("Packing arrays size mismatch"); - - size_t npacked = 0; - size_t dims = sparse.size(); - - if (dataLocation != AMSResourceType::AMS_DEVICE) { - for (size_t i = 0; i < n; i++) { - if (predicate[i] == denseVal) { - for (size_t j = 0; j < dims; j++) - dense[j][npacked] = sparse[j][i]; - npacked++; - } - } - } else { - npacked = ams::Device::pack(denseVal, - predicate, - n, - static_cast(sparse.data()), - dense.data(), - dims); - } - return npacked; - } - - /* @brief The function stores all elements from the dense - * vector to the sparse vector. - * - * @param[in] dataLocation Location of the data - * @param[in] predicate A boolean vector storing which elements in the vector - * should be kept. - * @param[in] n The number of elements of the C-vectors. - * dropped - * @param[in] dense A vector containing C-vectors with elements - * to be stored in the sparse vector - * @param[out] sparse A vector containing C-vectors whose elements will be - * @param[in] denseVal The condition the predicate needs to meet for the index - * to be copied to the sparse vectors. - * */ - PERFFASPECT() - static inline void unpack(AMSResourceType dataLocation, - const bool* predicate, - const size_t n, - std::vector& dense, - std::vector& sparse, - bool denseVal = false) - { - - if (sparse.size() != dense.size()) - throw std::invalid_argument("Packing arrays size mismatch"); - - size_t npacked = 0; - size_t dims = sparse.size(); - if (dataLocation != AMSResourceType::AMS_DEVICE) { - for (size_t i = 0; i < n; i++) { - if (predicate[i] == denseVal) { - for (size_t j = 0; j < dims; j++) - sparse[j][i] = dense[j][npacked]; - npacked++; - } - } - } else { - npacked = ams::Device::unpack( - denseVal, predicate, n, sparse.data(), dense.data(), dims); - } - return; - } - - /* @brief The function stores all elements of the sparse - * vector in the dense vector if the respective index - * of the predicate vector is equal to 'denseVal. - * - * @param[in] dataLocation Location of the data - * @param[in] predicate A boolean vector storing which elements in the vector - * @param[out] sparse_indices A vector storing the mapping from dense elements - * to sparse elements. - * @param[in] n The number of elements of the C-vectors. - * @param[in] sparse A vector containing C-vectors whose elements will be - * dropped - * @param[out] dense A vector containing C-vectors with the remaining elements - * @param[in] denseVal The condition the predicate needs to meet for the index - * to be stored in the dense vector - * @return Total number of elements stored in the dense vector - * */ - PERFFASPECT() - static inline size_t pack(AMSResourceType dataLocation, - const bool* predicate, - int* sparse_indices, - const size_t n, - std::vector& sparse, - std::vector& dense, - bool denseVal = false) - { - - if (sparse.size() != dense.size()) - throw std::invalid_argument("Packing arrays size mismatch"); - - size_t npacked = 0; - int dims = sparse.size(); - - if (dataLocation != AMSResourceType::AMS_DEVICE) { - for (size_t i = 0; i < n; i++) { - if (predicate[i] == denseVal) { - for (size_t j = 0; j < dims; j++) - dense[j][npacked] = sparse[j][i]; - sparse_indices[npacked++] = i; - } - } - } else { - npacked = ams::Device::pack(denseVal, - predicate, - n, - sparse.data(), - dense.data(), - sparse_indices, - dims); - } - - return npacked; - } - - /* @brief The function copies all elements from the dense - * vector to the sparse vector. - * - * @param[in] dataLocation Location of the data - * @param[in] sparse_indices A vector storing the mapping from sparse to - * dense. - * @param[in] n The number of elements of the C-vectors. - * dropped - * @param[in] dense A vector containing C-vectors with elements - * to be stored in the sparse vector - * @param[out] sparse A vector containing C-vectors whose elements will be - * @param[in] denseVal The condition the predicate needs to meet for the index - * to be copied to the sparse vectors. - * */ - PERFFASPECT() - static inline void unpack(AMSResourceType dataLocation, - int* sparse_indices, - const size_t nPacked, - std::vector& dense, - std::vector& sparse, - bool denseVal = false) - { - - if (sparse.size() != dense.size()) - throw std::invalid_argument("Packing arrays size mismatch"); - - int dims = sparse.size(); - - if (dataLocation != AMSResourceType::AMS_DEVICE) { - for (size_t i = 0; i < nPacked; i++) - for (size_t j = 0; j < dims; j++) - sparse[j][sparse_indices[i]] = dense[j][i]; - } else { - ams::Device::unpack( - denseVal, nPacked, sparse.data(), dense.data(), sparse_indices, dims); - } - - return; - } -}; -} // namespace ams - -// ----------------------------------------------------------------------------- -#endif diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index 66c1544f..9d784e21 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -3,313 +3,8 @@ # # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#function(JSON_TESTS db_type) -# set(FS_PATH "${CMAKE_CURRENT_BINARY_DIR}") -# set(AMS_DB_TEST_TYPE ${db_type}) -# set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/${db_type}.json") -# configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/env_2_models_fs_rand_uq.json.in" "${JSON_FP}" @ONLY) -# -# # Tests Random models with different percentages both models store to file -# add_test(NAME AMSEndToEndFromJSON::Random10::Random50::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_random_50") -# -# -# # Tests delta-uq models with different aggregation both models store to file -# add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean app_uq_max") -# -# -# # Tests detla uq model with a random uq model both models store to files -# add_test(NAME AMSEndToEndFromJSON::Random::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_uq_max") -# -# # Tests detla uq model with no model. uq model both store to files -# add_test(NAME AMSEndToEndFromJSON::Random::NoModel::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_no_model;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_no_model") -# -# # Tests 2 delta uq models with no deb . uq model both store to files -# add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_ndb app_uq_max_ndb;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_ndb app_uq_max_ndb") -# -# # Tests null models null dbs -# add_test(NAME AMSEndToEndFromJSON::None::None::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_no_model_no_db app_no_model_no_db ;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_no_model_no_db app_no_model_no_db") -# -# unset(AMS_DB_TEST_TYPE) -# unset(JSON_FP) -#endfunction() -# -#function(CHECK_RMQ_CONFIG file) -# # Read the JSON file. -# file(READ ${file} MY_JSON_STRING) -# message(STATUS "RabbitMQ config ${file}") -# -# string(JSON DB_CONF GET ${MY_JSON_STRING} db) -# string(JSON DB_CONF GET ${DB_CONF} rmq_config) -# string(JSON RMQ_HOST GET ${DB_CONF} "service-host") -# string(JSON RMQ_PORT GET ${DB_CONF} "service-port") -# -# if(NOT "${RMQ_HOST}" STREQUAL "" AND NOT "${RMQ_PORT}" STREQUAL "0") -# message(STATUS "RabbitMQ config ${file}: ${RMQ_HOST}:${RMQ_PORT}") -# else() -# message(WARNING "RabbitMQ config file ${file} looks empty! Make sure to fill these fields before running the tests") -# endif() -#endfunction() -# -#function(INTEGRATION_TEST_ENV) -# JSON_TESTS("csv") -# if (WITH_HDF5) -# JSON_TESTS("hdf5") -# set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/hdf5.json") -# # Tests delta-uq models with different aggregation both models store to file with debug option set to on. -# add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::hdf5-debug::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_debug app_uq_max_debug;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_debug app_uq_max_debug") -# unset(JSON_FP) -# endif() -#endfunction() -# -#function(INTEGRATION_TEST_RMQ) -# if (WITH_RMQ) -# if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") -# # If file exists we do not overwrite it -# message(STATUS "Ctest will use ${CMAKE_CURRENT_BINARY_DIR}/rmq.json as RabbitMQ configuration for testing. Make sure RabbitMQ parameters are valid.") -# else() -# message(STATUS "Copying empty configuration to ${CMAKE_CURRENT_BINARY_DIR}/rmq.json") -# configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/rmq.json.in" "rmq.json" @ONLY) -# endif() -# set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") -# CHECK_RMQ_CONFIG(${JSON_FP}) -# add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 8 9 \"double\" 2 1024; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 8 9 \"double\" 2 1024") -# endif() -#endfunction() -# -#function (INTEGRATION_TEST) -# ####################################################### -# # TEST: output format -# # UQ: Random -# ####################################################### -# -# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyPhysics::None::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"") -# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyModel::None::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"none\" \"./\"") -# -# -# ####################################################### -# # TEST: CSV output format -# # UQ: Random -# # 3 Thresholds: 0, 0.5, 1.0 -# ####################################################### -# -# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyPhysics::CSV::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"csv\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"csv\" \"./\"") -# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyModel::CSV::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"csv\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"csv\" \"./\"") -# add_test(NAME AMSEndToEnd::Random::Double::DB::HALF::CSV::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"csv\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"csv\" \"./\"") -# -# -# if (WITH_HDF5) -# ####################################################### -# # TEST: hdf5 output format -# # UQ: Random -# # 3 Thresholds: 0, 0.5, 1.0 -# # precision: double -# ####################################################### -# -# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::Random::Double::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::Random::Double::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") -# -# ####################################################### -# # TEST: hdf5 output format -# # UQ: Random -# # 3 Thresholds: 0, 0.5, 1.0 -# # precision: single -# ####################################################### -# -# -# add_test(NAME AMSEndToEnd::Random::Single::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::Random::Single::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::Random::Single::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") -# endif() -# -# -# ####################################################### -# # TEST: hdf5 output format -# # UQ: deltauq-mean -# # 3 Thresholds: 0, 0.5, 1.0 -# # precision: double -# ####################################################### -# add_test(NAME AMSEndToEnd::DeltaUQMean::Double::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::DeltaUQMean::Double::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::DeltaUQMean::Double::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") -# -# ####################################################### -# # TEST: hdf5 output format -# # UQ: deltauq-mean -# # 3 Thresholds: 0, 0.5, 1.0 -# # precision: single -# ####################################################### -# add_test(NAME AMSEndToEnd::DeltaUQMean::Single::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::DeltaUQMean::Single::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::DeltaUQMean::Single::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") -# -# ####################################################### -# # TEST: hdf5 output format -# # UQ: deltauq-max -# # 3 Thresholds: 0, 0.5, 1.0 -# # precision: double -# ####################################################### -# add_test(NAME AMSEndToEnd::DeltaUQMax::Double::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::DeltaUQMax::Double::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::DeltaUQMax::Double::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") -# -# ####################################################### -# # TEST: hdf5 output format -# # UQ: deltauq-max -# # 3 Thresholds: 0, 0.5, 1.0 -# # precision: single -# ####################################################### -# add_test(NAME AMSEndToEnd::DeltaUQMax::Single::DB::OnlyPhysics::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::DeltaUQMax::Single::DB::OnlyModel::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") -# add_test(NAME AMSEndToEnd::DeltaUQMax::Single::DB::HALF::HDF5::HOST COMMAND bash -c "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") -#endfunction() -# -# -# -#function(BUILD_TEST exe source) -# add_executable(${exe} ${source}) -# target_include_directories(${exe} PRIVATE "${PROJECT_SOURCE_DIR}/src/AMSlib/" umpire ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) -# target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) -# target_link_libraries(${exe} PRIVATE AMS ${AMS_APP_LIBRARIES}) -# -# target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) -# -# if(WITH_CUDA) -# set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") -# set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) -# set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) -# -# target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") -# endif() -#endfunction() -# -#function(ADDTEST exe test_name) -# add_test(NAME "${test_name}::HOST" COMMAND ${exe} 0 ${ARGN}) -# -# if(WITH_CUDA) -# add_test(NAME "${test_name}::DEVICE" COMMAND ${exe} 1 ${ARGN}) -# endif() -#endfunction() -# -## This test requires Allocate -## TODO: Include tests once we re-instate a pool -##BUILD_TEST(ams_allocator_test ams_allocate.cpp) -##ADDTEST(ams_allocator_test AMSAllocate) -#BUILD_TEST(ams_packing_test cpu_packing_test.cpp AMSPack) -#ADDTEST(ams_packing_test AMSPack) -# -##Tensor tests -#BUILD_TEST(ams_tensor_test ams_tensor_test.cpp) -# -#add_test(NAME ams_tensor_num_elements COMMAND ams_tensor_test "num_elements") -#set_tests_properties(ams_tensor_num_elements PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_cast COMMAND ams_tensor_test "cast") -#set_tests_properties(ams_tensor_cast PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_create COMMAND ams_tensor_test "create") -#set_tests_properties(ams_tensor_create PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_view COMMAND ams_tensor_test "view") -#set_tests_properties(ams_tensor_view PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_move COMMAND ams_tensor_test "move") -#set_tests_properties(ams_tensor_move PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_access COMMAND ams_tensor_test "access") -#set_tests_properties(ams_tensor_access PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_conversion COMMAND ams_tensor_test "conversion") -#set_tests_properties(ams_tensor_conversion PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_transpose COMMAND ams_tensor_test "transpose") -#set_tests_properties(ams_tensor_transpose PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_valid_reshapes COMMAND ams_tensor_test "test-reshape") -#set_tests_properties(ams_tensor_valid_reshapes PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_reshape COMMAND ams_tensor_test "reshape") -#set_tests_properties(ams_tensor_reshape PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_concat COMMAND ams_tensor_test "concat") -#set_tests_properties(ams_tensor_concat PROPERTIES LABELS "AMSTensor") -# -#add_test(NAME ams_tensor_expand COMMAND ams_tensor_test "expand") -#set_tests_properties(ams_tensor_expand PROPERTIES LABELS "AMSTensor") -# -# -# -#if(WITH_TORCH) -# BUILD_TEST(ams_inference_test torch_model.cpp) -# ADDTEST(ams_inference_test AMSInferDouble ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt "double") -# ADDTEST(ams_inference_test AMSInferSingle ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt "single") -# if (WITH_EXAMPLES) -# add_test(NAME AMSExampleSingleDeltaUQ::HOST COMMAND ams_example --precision single --uqtype deltauq-mean -db "./" -S ${CMAKE_CURRENT_SOURCE_DIR}/tuple-single.torchscript -e 100) -# add_test(NAME AMSExampleSingleRandomUQ::HOST COMMAND ams_example --precision single --uqtype random -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -e 100) -# add_test(NAME AMSExampleDoubleRandomUQ::HOST COMMAND ams_example --precision double --uqtype random -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -e 100) -#endif() -# -## These are integration tests. Try to use an end to end AMS run and realize issues between multiple pieces -# BUILD_TEST(ams_end_to_end ams_ete.cpp) -# INTEGRATION_TEST() -# BUILD_TEST(ams_end_to_end_env ams_ete_env.cpp) -# INTEGRATION_TEST_ENV() -# BUILD_TEST(ams_rmq ams_rmq_env.cpp) -# INTEGRATION_TEST_RMQ() -# BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) -# -# -# # UQ Tests -# BUILD_TEST(ams_delta_uq_test ams_uq_model.cpp) -# -# if(WITH_TORCH) -# add_test(NAME AMSDeltaUQDoubleMean::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 3 0.0) -# add_test(NAME AMSDeltaUQDoubleMax::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 4 0.0) -# add_test(NAME AMSDeltaUQDoubleMean_2::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq "double" 2 4 3 0.5) -# add_test(NAME AMSDeltaUQDoubleMax_2::HOST COMMAND ams_delta_uq_test 0 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq "double" 2 4 4 0.1) -# -# if(WITH_CUDA) -# add_test(NAME AMSDeltaUQDoubleMean::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 3 0.0) -# add_test(NAME AMSDeltaUQDoubleMax::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/torch.duq.cuda "double" 8 9 4 0.0) -# add_test(NAME AMSDeltaUQDoubleMean_2::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq.cuda "double" 2 4 3 0.5) -# add_test(NAME AMSDeltaUQDoubleMax_2::DEVICE COMMAND ams_delta_uq_test 1 ${CMAKE_CURRENT_SOURCE_DIR}/tuple.duq.cuda "double" 2 4 4 0.1) -# endif() -# endif() -# -# # TODO Add tests with cpu model -# BUILD_TEST(ams_update_model ams_update_model.cpp) -# ADDTEST(ams_update_model AMSUpdateModelDouble "double" ${CMAKE_CURRENT_SOURCE_DIR}/ConstantZeroModel_cpu.pt ${CMAKE_CURRENT_SOURCE_DIR}/ConstantOneModel_cpu.pt) -#endif() -# -#if(WITH_FAISS) -# BUILD_TEST(ams_hdcache_test test_hdcache.cpp) -# ADDTEST(ams_hdcache_test AMSHDCacheMeanPolicyDouble ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "double" 1 10 4.0 4 5) -# -# ADDTEST(ams_hdcache_test AMSHDCacheMeanPolicySingle ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "single" 1 10 4.0 4 5) -# -# ADDTEST(ams_hdcache_test AMSHDCacheMaxPolicyDouble ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "double" 2 10 4.0 4 5) -# ADDTEST(ams_hdcache_test AMSHDCacheMaxPolicySingle ${CMAKE_CURRENT_SOURCE_DIR}/faiss_debug.pt "single" 2 10 4.0 4 5) -# # The max case fails on DEVICE. We should be aware about this when adding support for CI for GPUs -# if (WITH_CUDA) -# set_tests_properties(AMSHDCacheMaxPolicySingle::DEVICE AMSHDCacheMaxPolicyDouble::DEVICE PROPERTIES DISABLED TRUE) -# endif() -# -# if(WITH_TORCH) -# if (WITH_EXAMPLES) -# add_test(NAME AMSExampleFaissInferSingle::HOST COMMAND ams_example --precision single --uqtype faiss-mean -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -H ${CMAKE_CURRENT_SOURCE_DIR}/example_faiss.idx -e 100) -# add_test(NAME AMSExampleFaissInferDouble::HOST COMMAND ams_example --precision double --uqtype faiss-mean -S ${CMAKE_CURRENT_SOURCE_DIR}/debug_model.pt -H ${CMAKE_CURRENT_SOURCE_DIR}/example_faiss.idx -e 100) -# endif() -# endif() -#endif() -# -## Unit Test -# -## Test 'ml/Surrogate' class ->>>>>>> b6e616f (Updated basedb-hdf5) - - add_subdirectory(models) add_subdirectory(torch) add_subdirectory(db) add_subdirectory(wf) -# add_test(NAME AMSEndToEndFromJSON::Random10::Random50::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_random_50") +add_subdirectory(ams_interface) diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt new file mode 100644 index 00000000..cba9f78d --- /dev/null +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -0,0 +1,183 @@ +function(ADD_API_UNIT_TEST gname name cmd) + message(WARNING "ARGS are ${cmd}") + add_test(NAME ${name} COMMAND bash -c "${cmd}") + set_tests_properties(${name} PROPERTIES LABELS ${gname}) +endfunction() + + +function(JSON_TESTS db_type) + set(FS_PATH "${CMAKE_CURRENT_BINARY_DIR}") + set(AMS_DB_TEST_TYPE ${db_type}) + set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/${db_type}.json") + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/env_2_models_fs_rand_uq.json.in" "${JSON_FP}" @ONLY) + + # Tests Random models with different percentages both models store to file + add_test(NAME AMSEndToEndFromJSON::Random10::Random50::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_random_50") + + + # Tests delta-uq models with different aggregation both models store to file + add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean app_uq_max") + + + # Tests detla uq model with a random uq model both models store to files + add_test(NAME AMSEndToEndFromJSON::Random::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_uq_max") + + # Tests detla uq model with no model. uq model both store to files + add_test(NAME AMSEndToEndFromJSON::Random::NoModel::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_no_model;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_no_model") + + # Tests 2 delta uq models with no deb . uq model both store to files + add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_ndb app_uq_max_ndb;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_ndb app_uq_max_ndb") + + # Tests null models null dbs + add_test(NAME AMSEndToEndFromJSON::None::None::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_no_model_no_db app_no_model_no_db ;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_no_model_no_db app_no_model_no_db") + + unset(AMS_DB_TEST_TYPE) + unset(JSON_FP) +endfunction() + + +function(CHECK_RMQ_CONFIG file) + # Read the JSON file. + file(READ ${file} MY_JSON_STRING) + message(STATUS "RabbitMQ config ${file}") + + string(JSON DB_CONF GET ${MY_JSON_STRING} db) + string(JSON DB_CONF GET ${DB_CONF} rmq_config) + string(JSON RMQ_HOST GET ${DB_CONF} "service-host") + string(JSON RMQ_PORT GET ${DB_CONF} "service-port") + + if(NOT "${RMQ_HOST}" STREQUAL "" AND NOT "${RMQ_PORT}" STREQUAL "0") + message(STATUS "RabbitMQ config ${file}: ${RMQ_HOST}:${RMQ_PORT}") + else() + message(WARNING "RabbitMQ config file ${file} looks empty! Make sure to fill these fields before running the tests") + endif() +endfunction() + + +function(INTEGRATION_TEST_ENV) + JSON_TESTS("hdf5") + set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/hdf5.json") + # Tests delta-uq models with different aggregation both models store to file with debug option set to on. + add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::hdf5-debug::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_debug app_uq_max_debug;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_debug app_uq_max_debug") + unset(JSON_FP) +endfunction() + +function(INTEGRATION_TEST_RMQ) + if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") + # If file exists we do not overwrite it + message(STATUS "Ctest will use ${CMAKE_CURRENT_BINARY_DIR}/rmq.json as RabbitMQ configuration for testing. Make sure RabbitMQ parameters are valid.") + else() + message(STATUS "Copying empty configuration to ${CMAKE_CURRENT_BINARY_DIR}/rmq.json") + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/rmq.json.in" "rmq.json" @ONLY) + endif() + set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") + CHECK_RMQ_CONFIG(${JSON_FP}) + add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 8 9 \"double\" 2 1024; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 8 9 \"double\" 2 1024") +endfunction() + +function (INTEGRATION_TEST) + ####################################################### + # TEST: output format + # UQ: Random + ####################################################### + + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyPhysics::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyModel::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"none\" \"./\"") + + + if (WITH_HDF5) + ####################################################### + # TEST: hdf5 output format + # UQ: Random + # 3 Thresholds: 0, 0.5, 1.0 + # precision: double + ####################################################### + + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") + + ####################################################### + # TEST: hdf5 output format + # UQ: Random + # 3 Thresholds: 0, 0.5, 1.0 + # precision: single + ####################################################### + + + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Single::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Single::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Single::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") + endif() + + + ####################################################### + # TEST: hdf5 output format + # UQ: deltauq-mean + # 3 Thresholds: 0, 0.5, 1.0 + # precision: double + ####################################################### + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") + + ####################################################### + # TEST: hdf5 output format + # UQ: deltauq-mean + # 3 Thresholds: 0, 0.5, 1.0 + # precision: single + ####################################################### + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Single::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Single::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Single::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") + + ####################################################### + # TEST: hdf5 output format + # UQ: deltauq-max + # 3 Thresholds: 0, 0.5, 1.0 + # precision: double + ####################################################### + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") + + ####################################################### + # TEST: hdf5 output format + # UQ: deltauq-max + # 3 Thresholds: 0, 0.5, 1.0 + # precision: single + ####################################################### + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Single::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Single::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Single::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") +endfunction() + +function(BUILD_TEST exe source) + add_executable(${exe} ${source}) + target_include_directories(${exe} PRIVATE "${PROJECT_SOURCE_DIR}/src/AMSlib/" "${PROJECT_SOURCE_DIR}/src/AMSlib/include" ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) + target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) + target_link_libraries(${exe} PRIVATE AMS ${AMS_APP_LIBRARIES}) + # This is "wrong" as we should not have a device code anymore. I keep it cause of + # weird umpire behavior + if(WITH_CUDA) + set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") + set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) + set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) + + target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") + endif() + + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) +endfunction() + + +BUILD_TEST(ams_end_to_end ams_ete.cpp) +INTEGRATION_TEST() +BUILD_TEST(ams_end_to_end_env ams_ete_env.cpp) +#INTEGRATION_TEST_ENV() + +#BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) + +#BUILD_TEST(ams_rmq ams_rmq_env.cpp) +#INTEGRATION_TEST_RMQ() +# diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp new file mode 100644 index 00000000..6c44a929 --- /dev/null +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -0,0 +1,205 @@ +#include +#ifdef __AMS_ENABLE_MPI__ +#include +#endif +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AMS.h" +#include "ml/surrogate.hpp" +#include "wf/debug.h" + +using namespace ams; + +void createUmpirePool(std::string parent_name, std::string pool_name) +{ + auto &rm = umpire::ResourceManager::getInstance(); + auto alloc_resource = rm.makeAllocator( + pool_name, rm.getAllocator(parent_name)); +} + + +AMSDType getDataType(char *d_type) +{ + AMSDType dType = AMSDType::AMS_DOUBLE; + if (std::strcmp(d_type, "float") == 0) { + dType = AMSDType::AMS_SINGLE; + } else if (std::strcmp(d_type, "double") == 0) { + dType = AMSDType::AMS_DOUBLE; + } else { + assert(false && "Unknown data type"); + } + return dType; +} + +template +struct Problem { + int num_inputs; + int num_outputs; + int multiplier; + Problem(int ni, int no) : num_inputs(ni), num_outputs(no), multiplier(100) {} + + void run(long num_elements, DType **inputs, DType **outputs) + { + for (int i = 0; i < num_elements; i++) { + DType sum = 0; + for (int j = 0; j < num_inputs; j++) { + sum += inputs[j][i]; + } + + for (int j = 0; j < num_outputs; j++) { + outputs[j][i] = sum; + } + } + } + + + DType *initialize_inputs(DType *inputs, long length) + { + for (int i = 0; i < length; i++) { + inputs[i] = static_cast(i); + } + return inputs; + } + + void ams_run(AMSExecutor &wf, + AMSResourceType resource, + int iterations, + int num_elements) + { + auto &rm = umpire::ResourceManager::getInstance(); + + for (int i = 0; i < iterations; i++) { + int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; + SmallVector input_tensors; + SmallVector output_tensors; + + // Allocate Input memory + for (int j = 0; j < num_inputs; j++) { + DType *data = new DType[elements]; + input_tensors.push_back( + AMSTensor::view(initialize_inputs(data, elements), + {num_elements, 1}, + {1, 1}, + resource)); + } + + // Allocate Output memory + for (int j = 0; j < num_outputs; j++) { + auto tmp = new DType[elements]; + output_tensors.push_back( + AMSTensor::view(initialize_inputs(tmp, elements), + {num_elements, 1}, + {1, 1}, + resource)); + } + + EOSLambda OrigComputation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + DType *ins[num_inputs]; + DType *outs[num_outputs]; + if (num_inputs != ams_ins.size()) + throw std::runtime_error( + "Expecting dimensions of inputs to remain the same"); + else if (num_outputs != ams_outs.size()) + throw std::runtime_error( + "Expecting dimensions of outputs to remain the same"); + + // Here I can use domain knowledge (inouts is empty) + int num_elements = ams_ins[0].shape()[0]; + for (int i = 0; i < num_inputs; i++) { + ins[i] = ams_ins[i].data(); + if (ams_ins[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + for (int i = 0; i < num_outputs; i++) { + outs[i] = ams_ins[i].data(); + if (ams_outs[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + run(num_elements, ins, outs); + }; + + ams::SmallVector inouts; + AMSExecute(wf, OrigComputation, input_tensors, inouts, output_tensors); + + for (int i = 0; i < input_tensors.size(); i++) { + delete input_tensors[i].data(); + } + + + for (int i = 0; i < output_tensors.size(); i++) { + delete output_tensors[i].data(); + } + } + } +}; + +int main(int argc, char **argv) +{ + if (argc != 12) { + std::cout << "Wrong cli\n"; + std::cout << argv[0] + << " use_device(0|1) num_inputs num_outputs model_path " + "data_type(float|double) uq_policy(random|deltaUQ " + "(mean)|deltaUQ (max)) threshold(0) " + "num_iterations avg_num_values db_type(none|csv|hdf5) " + "db_path(path to existing path to store data)"; + return -1; + } + + + int use_device = std::atoi(argv[1]); + int num_inputs = std::atoi(argv[2]); + int num_outputs = std::atoi(argv[3]); + char *model_path = argv[4]; + AMSDType data_type = getDataType(argv[5]); + std::string uq_name = std::string(argv[6]); + const AMSUQPolicy uq_policy = UQ::UQPolicyFromStr(uq_name); + float threshold = std::atof(argv[7]); + int num_iterations = std::atoi(argv[8]); + int avg_elements = std::atoi(argv[9]); + std::string db_type_str = std::string(argv[10]); + std::string fs_path = std::string(argv[11]); + AMSDBType db_type = ams::db::getDBType(db_type_str); + AMSResourceType resource = AMSResourceType::AMS_HOST; + srand(time(NULL)); + + AMSConfigureFSDatabase(db_type, fs_path.c_str()); + + assert((uq_policy == AMSUQPolicy::AMS_DELTAUQ_MAX || + uq_policy == AMSUQPolicy::AMS_DELTAUQ_MEAN || + uq_policy == AMSUQPolicy::AMS_RANDOM) && + "Test only supports duq models"); + + createUmpirePool("HOST", "TEST_HOST"); + AMSSetAllocator(AMSResourceType::AMS_HOST, "TEST_HOST"); + + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "test", uq_policy, threshold, model_path, "test"); + + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + if (data_type == AMSDType::AMS_SINGLE) { + Problem prob(num_inputs, num_outputs); + + + prob.ams_run(wf, resource, num_iterations, avg_elements); + } else { + Problem prob(num_inputs, num_outputs); + prob.ams_run(wf, resource, num_iterations, avg_elements); + } + + return 0; +} diff --git a/tests/AMSlib/ams_interface/ams_ete_env.cpp b/tests/AMSlib/ams_interface/ams_ete_env.cpp new file mode 100644 index 00000000..a9277263 --- /dev/null +++ b/tests/AMSlib/ams_interface/ams_ete_env.cpp @@ -0,0 +1,206 @@ +#ifdef __AMS_ENABLE_MPI__ +#include +#endif +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "AMS.h" + +using namespace ams; + +void createUmpirePool(std::string parent_name, std::string pool_name) +{ + auto &rm = umpire::ResourceManager::getInstance(); + auto alloc_resource = rm.makeAllocator( + pool_name, rm.getAllocator(parent_name)); +} + + +AMSDType getDataType(char *d_type) +{ + AMSDType dType = AMSDType::AMS_DOUBLE; + if (std::strcmp(d_type, "float") == 0) { + dType = AMSDType::AMS_SINGLE; + } else if (std::strcmp(d_type, "double") == 0) { + dType = AMSDType::AMS_DOUBLE; + } else { + assert(false && "Unknown data type"); + } + return dType; +} + +template +struct Problem { + int num_inputs; + int num_outputs; + int multiplier; + Problem(int ni, int no) : num_inputs(ni), num_outputs(no), multiplier(100) {} + + void run(long num_elements, DType **inputs, DType **outputs) + { + for (int i = 0; i < num_elements; i++) { + DType sum = 0; + for (int j = 0; j < num_inputs; j++) { + sum += inputs[j][i]; + } + + for (int j = 0; j < num_outputs; j++) { + outputs[j][i] = sum; + } + } + } + + + DType *initialize_inputs(DType *inputs, long length) + { + for (int i = 0; i < length; i++) { + inputs[i] = static_cast(i); + } + return inputs; + } + + void ams_run(AMSExecutor &wf, + AMSResourceType resource, + int iterations, + int num_elements) + { + auto &rm = umpire::ResourceManager::getInstance(); + + for (int i = 0; i < iterations; i++) { + int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; + SmallVector input_tensors; + SmallVector output_tensors; + + // Allocate Input memory + for (int j = 0; j < num_inputs; j++) { + DType *data = new DType[elements]; + input_tensors.push_back( + AMSTensor::view(initialize_inputs(data, elements), + {num_elements, 1}, + {1, 1}, + resource)); + } + + // Allocate Output memory + for (int j = 0; j < num_outputs; j++) { + auto tmp = new DType[elements]; + output_tensors.push_back( + AMSTensor::view(initialize_inputs(tmp, elements), + {num_elements, 1}, + {1, 1}, + resource)); + } + + EOSLambda OrigComputation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + DType *ins[num_inputs]; + DType *outs[num_outputs]; + if (num_inputs != ams_ins.size()) + throw std::runtime_error( + "Expecting dimensions of inputs to remain the same"); + else if (num_outputs != ams_outs.size()) + throw std::runtime_error( + "Expecting dimensions of outputs to remain the same"); + + // Here I can use domain knowledge (inouts is empty) + int num_elements = ams_ins[0].shape()[0]; + for (int i = 0; i < num_inputs; i++) { + ins[i] = ams_ins[i].data(); + if (ams_ins[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + for (int i = 0; i < num_outputs; i++) { + outs[i] = ams_ins[i].data(); + if (ams_outs[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + run(num_elements, ins, outs); + }; + + ams::SmallVector inouts; + AMSExecute(wf, OrigComputation, input_tensors, inouts, output_tensors); + + for (int i = 0; i < input_tensors.size(); i++) { + delete input_tensors[i].data(); + } + + + for (int i = 0; i < output_tensors.size(); i++) { + delete output_tensors[i].data(); + } + } + } +}; + +void callBackDouble(void *cls, long elements, void **inputs, void **outputs) +{ + std::cout << "Called the double model\n"; + static_cast *>(cls)->run(elements, + (double **)(inputs), + (double **)(outputs)); +} + + +void callBackSingle(void *cls, long elements, void **inputs, void **outputs) +{ + std::cout << "Called the single model\n"; + static_cast *>(cls)->run(elements, + (float **)(inputs), + (float **)(outputs)); +} + + +int main(int argc, char **argv) +{ + + if (argc != 9) { + std::cout << "Wrong cli\n"; + std::cout << argv[0] + << " use_device(0|1) num_inputs num_outputs " + "data_type(float|double)" + "num_iterations avg_num_values 'model-name-1' 'model-name-2'"; + return -1; + } + + + int use_device = std::atoi(argv[1]); + int num_inputs = std::atoi(argv[2]); + int num_outputs = std::atoi(argv[3]); + AMSDType data_type = getDataType(argv[4]); + int num_iterations = std::atoi(argv[5]); + int avg_elements = std::atoi(argv[6]); + const char *model1 = argv[7]; + const char *model2 = argv[8]; + AMSResourceType resource = AMSResourceType::AMS_HOST; + srand(time(NULL)); + + + createUmpirePool("HOST", "TEST_HOST"); + AMSSetAllocator(AMSResourceType::AMS_HOST, "TEST_HOST"); + + AMSCAbstrModel models[] = {AMSQueryModel(model1), AMSQueryModel(model2)}; + + for (int i = 0; i < 2; i++) { + AMSExecutor wf = AMSCreateExecutor(models[i], 0, 1); + if (data_type == AMSDType::AMS_SINGLE) { + Problem prob(num_inputs, num_outputs); + prob.ams_run(wf, resource, num_iterations, avg_elements); + } else { + Problem prob(num_inputs, num_outputs); + prob.ams_run(wf, resource, num_iterations, avg_elements); + } + } + + return 0; +} diff --git a/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp new file mode 100644 index 00000000..6ff55127 --- /dev/null +++ b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp @@ -0,0 +1,240 @@ +#ifdef __AMS_ENABLE_MPI__ +#include +#endif +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "AMS.h" +#include "wf/debug.h" + +void createUmpirePool(std::string parent_name, std::string pool_name) +{ + auto &rm = umpire::ResourceManager::getInstance(); + auto alloc_resource = rm.makeAllocator( + pool_name, rm.getAllocator(parent_name)); +} + + +AMSDType getDataType(char *d_type) +{ + AMSDType dType = AMSDType::AMS_DOUBLE; + if (std::strcmp(d_type, "float") == 0) { + dType = AMSDType::AMS_SINGLE; + } else if (std::strcmp(d_type, "double") == 0) { + dType = AMSDType::AMS_DOUBLE; + } else { + assert(false && "Unknown data type"); + } + return dType; +} + +template +struct Problem { + int num_inputs; + int num_outputs; + int multiplier; + Problem(int ni, int no) : num_inputs(ni), num_outputs(no), multiplier(100) {} + + void run(long num_elements, DType **inputs, DType **outputs) + { + for (int i = 0; i < num_elements; i++) { + DType sum = 0; + for (int j = 0; j < num_inputs; j++) { + sum += inputs[j][i]; + } + + for (int j = 0; j < num_outputs; j++) { + outputs[j][i] = sum; + } + } + } + + + const DType *initialize_inputs(DType *inputs, long length) + { + for (int i = 0; i < length; i++) { + inputs[i] = static_cast(i); + } + return inputs; + } + + void ams_run(AMSExecutor &wf, + AMSResourceType resource, + int iterations, + int num_elements) + { + auto &rm = umpire::ResourceManager::getInstance(); + + for (int i = 0; i < iterations; i++) { + int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; + std::vector inputs; + std::vector outputs; + + // Allocate Input memory + for (int j = 0; j < num_inputs; j++) { + DType *data = new DType[elements]; + inputs.push_back(initialize_inputs(data, elements)); + } + + // Allocate Output memory + for (int j = 0; j < num_outputs; j++) { + outputs.push_back(new DType[elements]); + } + + AMSExecute(wf, + (void *)this, + elements, + reinterpret_cast(inputs.data()), + reinterpret_cast(outputs.data()), + inputs.size(), + outputs.size()); + + for (int j = 0; j < num_outputs; j++) { + delete[] outputs[j]; + } + + + for (int j = 0; j < num_inputs; j++) { + delete[] inputs[j]; + } + } + } +}; + +void callBackDouble(void *cls, long elements, void **inputs, void **outputs) +{ + std::cout << "Called the double model\n"; + static_cast *>(cls)->run(elements, + (double **)(inputs), + (double **)(outputs)); +} + + +void callBackSingle(void *cls, long elements, void **inputs, void **outputs) +{ + std::cout << "Called the single model\n"; + static_cast *>(cls)->run(elements, + (float **)(inputs), + (float **)(outputs)); +} + + +int main(int argc, char **argv) +{ + if (argc != 15) { + std::cout << "Wrong cli\n"; + std::cout << argv[0] + << " use_device(0|1) num_inputs num_outputs model_path " + "data_type(float|double) uq_policy(random|deltaUQ " + "(mean)|deltaUQ (max)) threshold(0) " + "num_iterations avg_num_values db_type(none|csv|hdf5) " + "db_path(path to existing path to store data)"; + return -1; + } + + + int use_device = std::atoi(argv[1]); + int num_inputs_1 = std::atoi(argv[2]); + int num_outputs_1 = std::atoi(argv[3]); + char *model_path_1 = argv[4]; + AMSDType data_type = getDataType(argv[5]); + std::string uq_name = std::string(argv[6]); + const AMSUQPolicy uq_policy = BaseUQ::UQPolicyFromStr(uq_name); + float threshold = std::atof(argv[7]); + int num_iterations = std::atoi(argv[8]); + int avg_elements = std::atoi(argv[9]); + std::string db_type_str = std::string(argv[10]); + std::string fs_path = std::string(argv[11]); + int num_inputs_2 = std::atoi(argv[12]); + int num_outputs_2 = std::atoi(argv[13]); + char *model_path_2 = argv[14]; + AMSDBType db_type = ams::db::getDBType(db_type_str); + AMSResourceType resource = AMSResourceType::AMS_HOST; + srand(time(NULL)); + + AMSConfigureFSDatabase(db_type, fs_path.c_str()); + + assert((uq_policy == AMSUQPolicy::AMS_DELTAUQ_MAX || + uq_policy == AMSUQPolicy::AMS_DELTAUQ_MEAN || + uq_policy == AMSUQPolicy::AMS_RANDOM) && + "Test only supports duq models"); + + createUmpirePool("HOST", "TEST_HOST"); + AMSSetAllocator(AMSResourceType::AMS_HOST, "TEST_HOST"); + + AMSCAbstrModel model_descr_1 = AMSRegisterAbstractModel( + "test_1", uq_policy, threshold, model_path_1, nullptr, "test_1", -1); + + AMSCAbstrModel model_descr_2 = AMSRegisterAbstractModel( + "test_2", uq_policy, threshold, model_path_2, nullptr, "test_2", -1); + + + if (data_type == AMSDType::AMS_SINGLE) { + Problem prob1(num_inputs_1, num_outputs_1); + Problem prob2(num_inputs_2, num_outputs_2); + + AMSExecutor wf_1 = AMSCreateExecutor(model_descr_1, + AMSDType::AMS_SINGLE, + resource, + (AMSPhysicFn)callBackSingle, + 0, + 1); + + AMSExecutor wf_2 = AMSCreateExecutor(model_descr_2, + AMSDType::AMS_SINGLE, + resource, + (AMSPhysicFn)callBackSingle, + 0, + 1); + + for (int i = 0; i < num_iterations; i++) { + size_t elems = + (static_cast(rand()) / RAND_MAX) * 2 * avg_elements - + avg_elements + avg_elements; + prob1.ams_run(wf_1, resource, 1, elems); + size_t elems1 = + (static_cast(rand()) / RAND_MAX) * 2 * avg_elements - + avg_elements + avg_elements; + prob2.ams_run(wf_2, resource, 1, elems1); + } + } else { + Problem prob1(num_inputs_1, num_outputs_1); + Problem prob2(num_inputs_2, num_outputs_2); + + AMSExecutor wf_1 = AMSCreateExecutor(model_descr_1, + AMSDType::AMS_DOUBLE, + resource, + (AMSPhysicFn)callBackDouble, + 0, + 1); + + AMSExecutor wf_2 = AMSCreateExecutor(model_descr_2, + AMSDType::AMS_DOUBLE, + resource, + (AMSPhysicFn)callBackDouble, + 0, + 1); + + for (int i = 0; i < num_iterations; i++) { + size_t elems = avg_elements; + // (static_cast(rand()) / RAND_MAX) * 2 * avg_elements - + // avg_elements + avg_elements; + prob1.ams_run(wf_1, resource, 1, elems); + size_t elems1 = avg_elements; + // (static_cast(rand()) / RAND_MAX) * 2 * avg_elements - + // avg_elements + avg_elements; + prob2.ams_run(wf_2, resource, 1, elems1); + } + } + + return 0; +} diff --git a/tests/AMSlib/ams_rmq_env.cpp b/tests/AMSlib/ams_interface/ams_rmq_env.cpp similarity index 100% rename from tests/AMSlib/ams_rmq_env.cpp rename to tests/AMSlib/ams_interface/ams_rmq_env.cpp diff --git a/tests/AMSlib/json_configs/env_2_models_fs_rand_uq.json.in b/tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in similarity index 100% rename from tests/AMSlib/json_configs/env_2_models_fs_rand_uq.json.in rename to tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in diff --git a/tests/AMSlib/ams_interface/json_configs/objects.json.in b/tests/AMSlib/ams_interface/json_configs/objects.json.in new file mode 100644 index 00000000..b86eefe6 --- /dev/null +++ b/tests/AMSlib/ams_interface/json_configs/objects.json.in @@ -0,0 +1,26 @@ +{ + "db" : { + "dbType" : "@DBTYPE@", + "fs_path" : "@FS_PATH@" + }, + "ml_models" : { + "model_1": { + "uq_type": "@UQ_TYPE@", + "model_path": "model_1", + "uq_aggregate": "mean", + "threshold": 0.5, + "db_label" : "tatb_eos" + }, + "model_2": { + "uq_type": "@UQ_TYPE@", + "model_path": "model_2", + "uq_aggregate": "max", + "threshold": 0.5, + "db_label" : "tatb_eos" + } + }, + "domain_models" : { + "test_1": "model_1", + "test_2" : "model_2" + } +} diff --git a/tests/AMSlib/json_configs/rmq.json.in b/tests/AMSlib/ams_interface/json_configs/rmq.json.in similarity index 100% rename from tests/AMSlib/json_configs/rmq.json.in rename to tests/AMSlib/ams_interface/json_configs/rmq.json.in diff --git a/tests/AMSlib/verify_ete.py b/tests/AMSlib/ams_interface/verify_ete.py similarity index 97% rename from tests/AMSlib/verify_ete.py rename to tests/AMSlib/ams_interface/verify_ete.py index a7899718..27e682b7 100644 --- a/tests/AMSlib/verify_ete.py +++ b/tests/AMSlib/ams_interface/verify_ete.py @@ -131,10 +131,8 @@ def verify( # Check data type. if db_type == "hdf5": - if "data_type" == "double": - assert inputs.dtype == np.float64, "Data types do not match" - elif "data_type" == "float": - assert inputs.dtype == np.float32, "Data types do not match" + assert inputs.dtype == np.float32, "Output Data types do not match" + assert outputs.dtype == np.float32, "Input Data types do not match" # When debug db is set, we store always all elements if debug_db: diff --git a/tests/AMSlib/verify_rmq.py b/tests/AMSlib/ams_interface/verify_rmq.py similarity index 100% rename from tests/AMSlib/verify_rmq.py rename to tests/AMSlib/ams_interface/verify_rmq.py diff --git a/tests/AMSlib/db/db_manager_hdf5.cpp b/tests/AMSlib/db/db_manager_hdf5.cpp index 511d5bd5..d3be2ad3 100644 --- a/tests/AMSlib/db/db_manager_hdf5.cpp +++ b/tests/AMSlib/db/db_manager_hdf5.cpp @@ -3,6 +3,7 @@ #include #include +#include "AMSTypes.hpp" #include "wf/basedb.hpp" int main(int argc, char* argv[]) @@ -14,7 +15,7 @@ int main(int argc, char* argv[]) } std::string db_path(argv[1]); auto& db_instance = ams::db::DBManager::getInstance(); - db_instance.instantiate_fs_db(AMSDBType::AMS_HDF5, db_path); + db_instance.instantiate_fs_db(ams::AMSDBType::AMS_HDF5, db_path); for (auto dn : {std::string("domain_1"), std::string("domain_2"), std::string("domain_1"), diff --git a/tests/AMSlib/models/CMakeLists.txt b/tests/AMSlib/models/CMakeLists.txt index cc80e109..fdd0b259 100644 --- a/tests/AMSlib/models/CMakeLists.txt +++ b/tests/AMSlib/models/CMakeLists.txt @@ -9,13 +9,29 @@ set(GENERATED_CPU_MODELS ${CMAKE_CURRENT_BINARY_DIR}/single_cpu_duq_max.pt ${CMAKE_CURRENT_BINARY_DIR}/single_cpu_duq_mean.pt ${CMAKE_CURRENT_BINARY_DIR}/single_cpu_random.pt + + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_cpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_cpu_random.pt + + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_cpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_single_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_single_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_single_cpu_random.pt + + ) # Custom command to generate models add_custom_command( OUTPUT ${GENERATED_CPU_MODELS} COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/generate.sh ${CMAKE_CURRENT_BINARY_DIR}/ "cpu" - DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generate.sh;${CMAKE_CURRENT_SOURCE_DIR}/generate.py" + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/generate.sh;${CMAKE_CURRENT_SOURCE_DIR}/generate.py;${CMAKE_CURRENT_SOURCE_DIR}/generate_linear_model.py" COMMENT "Generating PyTorch models..." ) @@ -33,6 +49,20 @@ set(GENERATED_GPU_MODELS ${CMAKE_CURRENT_BINARY_DIR}/single_gpu_duq_max.pt ${CMAKE_CURRENT_BINARY_DIR}/single_gpu_duq_mean.pt ${CMAKE_CURRENT_BINARY_DIR}/single_gpu_random.pt + + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_gpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_gpu_random.pt + + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_gpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_single_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_single_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_single_gpu_random.pt ) # Custom command to generate models diff --git a/tests/AMSlib/models/generate.sh b/tests/AMSlib/models/generate.sh index 0d4b03d0..8379f16d 100755 --- a/tests/AMSlib/models/generate.sh +++ b/tests/AMSlib/models/generate.sh @@ -22,3 +22,12 @@ python ${root_dir}/generate.py double $device ${directory} duq_max python ${root_dir}/generate.py double $device ${directory} random +python ${root_dir}/generate_linear_model.py single $device ${directory} duq_mean 8 9 +python ${root_dir}/generate_linear_model.py single $device ${directory} duq_max 8 9 +python ${root_dir}/generate_linear_model.py single $device ${directory} random 8 9 + +python ${root_dir}/generate_linear_model.py double $device ${directory} duq_mean 8 9 +python ${root_dir}/generate_linear_model.py double $device ${directory} duq_max 8 9 +python ${root_dir}/generate_linear_model.py double $device ${directory} random 8 9 + + diff --git a/tests/AMSlib/models/generate_linear_model.py b/tests/AMSlib/models/generate_linear_model.py new file mode 100644 index 00000000..7a5657f5 --- /dev/null +++ b/tests/AMSlib/models/generate_linear_model.py @@ -0,0 +1,64 @@ +import torch +import sys +import numpy as np +import math +import argparse + + +class linearRegression(torch.nn.Module): + def __init__(self, inputSize, outputSize): + super(linearRegression, self).__init__() + self.linear = torch.nn.Linear(inputSize, outputSize, bias=True) + + def forward(self, x): + y = self.linear(x) + return y + + +def main(args): + parser = argparse.ArgumentParser(description="Generate and save a scripted model.") + parser.add_argument("precision", choices=["single", "double"], help="Model precision: 'single' or 'double'.") + parser.add_argument("device", choices=["cpu", "gpu"], help="Device: 'cpu' or 'gpu'.") + parser.add_argument("directory", type=str, help="Directory to save the model.") + parser.add_argument("uq", choices=["random", "duq_mean", "duq_max"], help="The UQ Type to use (this is ignored a.t.m)") + parser.add_argument("inputDim", type=int, help="The dimensions of the input data") + parser.add_argument("outputDim", type=int, help="the dimensions of the output data") + args = parser.parse_args() + + model = linearRegression(args.inputDim, args.outputDim) + + # Set the precision based on command-line argument + if args.precision == "single": + model = model.float() # Set to single precision (float32) + prec = torch.float32 + elif args.precision == "double": + model = model.double() # Set to double precision (float64) + prec = torch.float64 + + # Set the device based on command-line argument + if args.device == "gpu" and torch.cuda.is_available(): + device = torch.device("cuda") + model = model.cuda() + else: + device = torch.device("cpu") + + model.eval() + + x = torch.rand((1, args.inputDim), device=device, dtype=prec) + y_before_jit = model(x) + + # Generate the file name + file_name = f"{args.precision}_{args.device}_{args.uq}.pt" + + + with torch.jit.optimized_execution(True): + scripted = torch.jit.script(model) + file_path = f"{args.directory}/linear_scripted_{file_name}" + scripted.save(file_path) + file_path = f"{args.directory}/linear_traced_{file_name}" + traced = torch.jit.trace(model, (torch.randn(args.inputDim, dtype=prec).to(device),)) + traced.save(file_path) + + +if __name__ == "__main__": + main(sys.argv) diff --git a/tests/AMSlib/torch/evaluate_model.cpp b/tests/AMSlib/torch/evaluate_model.cpp index 716c7e11..9d995209 100644 --- a/tests/AMSlib/torch/evaluate_model.cpp +++ b/tests/AMSlib/torch/evaluate_model.cpp @@ -4,6 +4,7 @@ #include #include +#include "AMS.h" #include "ml/surrogate.hpp" std::vector getDims(const std::string input, char delimiter) @@ -41,7 +42,7 @@ bool verify(torch::Tensor& input, void test(SurrogateModel& model, std::vector& iDims, std::vector& oDims, - AMSUQPolicy policy) + ams::AMSUQPolicy policy) { auto model_type = model.getModelDataType(); auto model_device = model.getModelResourceType(); @@ -86,11 +87,11 @@ int main(int argc, char* argv[]) if (uq.compare("random") == 0) isDeltaUQ = false; auto model = SurrogateModel::getInstance(model_path, isDeltaUQ); if (std::string(argv[4]).compare("duq_mean") == 0) { - test(*model, iShape, oShape, AMSUQPolicy::AMS_DELTAUQ_MEAN); + test(*model, iShape, oShape, ams::AMSUQPolicy::AMS_DELTAUQ_MEAN); } else if (std::string(argv[4]).compare("duq_max") == 0) { - test(*model, iShape, oShape, AMSUQPolicy::AMS_DELTAUQ_MAX); + test(*model, iShape, oShape, ams::AMSUQPolicy::AMS_DELTAUQ_MAX); } else if (std::string(argv[4]).compare("random") == 0) { - test(*model, iShape, oShape, AMSUQPolicy::AMS_RANDOM); + test(*model, iShape, oShape, ams::AMSUQPolicy::AMS_RANDOM); } else { std::cout << "Unknown dUQ \n"; return 1; diff --git a/tests/AMSlib/torch/evalute_model_conversions.cpp b/tests/AMSlib/torch/evalute_model_conversions.cpp index 6f7e772f..9e9072d5 100644 --- a/tests/AMSlib/torch/evalute_model_conversions.cpp +++ b/tests/AMSlib/torch/evalute_model_conversions.cpp @@ -9,6 +9,7 @@ #include #include +#include "AMS.h" #include "ml/surrogate.hpp" void printTensorShape(const torch::Tensor& tensor) @@ -132,7 +133,7 @@ bool verify(torch::Tensor& input, void test(SurrogateModel& model, std::vector& iDims, std::vector& oDims, - AMSUQPolicy policy) + ams::AMSUQPolicy policy) { auto model_type = model.getModelDataType(); auto model_device = model.getModelResourceType(); @@ -217,11 +218,11 @@ int main(int argc, char* argv[]) if (uq.compare("random") == 0) isDeltaUQ = false; auto model = SurrogateModel::getInstance(model_path, isDeltaUQ); if (std::string(argv[4]).compare("duq_mean") == 0) { - test(*model, iShape, oShape, AMSUQPolicy::AMS_DELTAUQ_MEAN); + test(*model, iShape, oShape, ams::AMSUQPolicy::AMS_DELTAUQ_MEAN); } else if (std::string(argv[4]).compare("duq_max") == 0) { - test(*model, iShape, oShape, AMSUQPolicy::AMS_DELTAUQ_MAX); + test(*model, iShape, oShape, ams::AMSUQPolicy::AMS_DELTAUQ_MAX); } else if (std::string(argv[4]).compare("random") == 0) { - test(*model, iShape, oShape, AMSUQPolicy::AMS_RANDOM); + test(*model, iShape, oShape, ams::AMSUQPolicy::AMS_RANDOM); } else { std::cout << "Unknown dUQ \n"; return 1; diff --git a/tests/AMSlib/wf/evaluate_in_and_outs.cpp b/tests/AMSlib/wf/evaluate_in_and_outs.cpp index 4cb1c272..1bcad5e7 100644 --- a/tests/AMSlib/wf/evaluate_in_and_outs.cpp +++ b/tests/AMSlib/wf/evaluate_in_and_outs.cpp @@ -6,10 +6,14 @@ #include #include +#include #include +#include "AMS.h" #include "wf/workflow.hpp" +using namespace ams; + #define SIZE 32 @@ -148,6 +152,7 @@ void compute(ams::AMSWorkflow& wf, std::vector in; for (auto& V : pruned_ins) { c10::IntArrayRef shape(V.shape().begin(), V.shape().size()); + std::cout << "Pointer of in " << V.data() << "\n"; in.push_back(torch::from_blob((void*)V.data(), shape, torch::TensorOptions().dtype(DType).device( @@ -156,6 +161,7 @@ void compute(ams::AMSWorkflow& wf, std::vector inout; for (auto& V : pruned_inouts) { + std::cout << "Pointer of inout " << V.data() << "\n"; c10::IntArrayRef shape(V.shape().begin(), V.shape().size()); inout.push_back(torch::from_blob( (void*)V.data(), @@ -166,6 +172,7 @@ void compute(ams::AMSWorkflow& wf, std::vector out; for (auto& V : pruned_outs) { c10::IntArrayRef shape(V.shape().begin(), V.shape().size()); + std::cout << "Pointer of out " << V.data() << "\n"; out.push_back(torch::from_blob((void*)V.data(), shape, torch::TensorOptions().dtype(DType).device( From 4ac548e26bcdf71fd9f3526eb62e5db4f3bf8df8 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 23 Dec 2024 15:05:00 -0800 Subject: [PATCH 016/136] Fixed interface --- src/AMSlib/AMS.cpp | 55 ++++++-------- src/AMSlib/CMakeLists.txt | 113 +++++++---------------------- src/AMSlib/include/AMS.h | 32 +------- src/AMSlib/macro.h | 24 ++++++ src/AMSlib/ml/surrogate.cpp | 1 - src/AMSlib/wf/basedb.hpp | 1 + src/AMSlib/wf/device.hpp | 1 + src/AMSlib/wf/resource_manager.hpp | 1 + src/AMSlib/wf/workflow.hpp | 12 +-- 9 files changed, 80 insertions(+), 160 deletions(-) create mode 100644 src/AMSlib/macro.h diff --git a/src/AMSlib/AMS.cpp b/src/AMSlib/AMS.cpp index e5dfa316..2ab70d66 100644 --- a/src/AMSlib/AMS.cpp +++ b/src/AMSlib/AMS.cpp @@ -30,6 +30,8 @@ using namespace ams; +namespace +{ static int get_rank_id() { if (const char *flux_id = std::getenv("FLUX_TASK_RANK")) { @@ -57,7 +59,6 @@ struct AMSAbstractModel { bool DebugDB; double threshold; AMSUQPolicy uqPolicy; - int nClusters; static AMSUQPolicy getUQType(std::string type) { @@ -105,8 +106,9 @@ struct AMSAbstractModel { std::string path = ""; if (jRoot.contains("model_path")) { path = jRoot["model_path"].get(); - // Verify that path exists if it is different than "" -#warning fix comment + CFATAL(AMS, + (!path.empty() && !fs::exists(path)), + "Path to model does not exist\n"); } return path; } @@ -184,10 +186,8 @@ struct AMSAbstractModel { AMSAbstractModel(AMSUQPolicy uq_policy, const char *surrogate_path, - const char *uq_path, const char *db_label, - double threshold, - int num_clusters) + double threshold) { DebugDB = false; if (db_label == nullptr) @@ -204,7 +204,6 @@ struct AMSAbstractModel { if (surrogate_path != nullptr) SPath = std::string(surrogate_path); this->threshold = threshold; - nClusters = num_clusters; DBG(AMS, "Registered Model %s %g", UQ::UQPolicyToStr(uqPolicy).c_str(), @@ -216,11 +215,10 @@ struct AMSAbstractModel { { if (!SPath.empty()) DBG(AMS, "Surrogate Model Path: %s", SPath.c_str()); DBG(AMS, - "db-Label: %s threshold %f UQ-Policy: %u nClusters: %d", + "db-Label: %s threshold %f UQ-Policy: %u", DBLabel.c_str(), threshold, - uqPolicy, - nClusters); + uqPolicy); } }; @@ -405,8 +403,8 @@ class AMSWrap case AMSDBType::AMS_RMQ: setupRMQ(entry, dbStrType); break; - case AMSDBType::AMS_REDIS: - FATAL(AMS, "Cannot connect to REDIS database, missing implementation"); + default: + FATAL(AMS, "Unknown db-type"); } return; } @@ -509,9 +507,7 @@ class AMSWrap AMSUQPolicy uq_policy, double threshold, const char *surrogate_path, - const char *uq_path, - const char *db_label, - int num_clusters) + const char *db_label) { auto model = ams_candidate_models.find(domain_name); if (model != ams_candidate_models.end()) { @@ -521,13 +517,9 @@ class AMSWrap domain_name, registered_models[model->second].second.SPath.c_str()); } - registered_models.push_back(std::make_pair(std::string(domain_name), - AMSAbstractModel(uq_policy, - surrogate_path, - uq_path, - db_label, - threshold, - num_clusters))); + registered_models.push_back(std::make_pair( + std::string(domain_name), + AMSAbstractModel(uq_policy, surrogate_path, db_label, threshold))); ams_candidate_models.emplace(std::string(domain_name), registered_models.size() - 1); return registered_models.size() - 1; @@ -603,7 +595,10 @@ AMSExecutor _AMSRegisterExecutor(ams::AMSWorkflow *workflow) _amsWrap->executors.push_back(static_cast(workflow)); return static_cast(_amsWrap->executors.size()) - 1L; } +} // namespace +namespace ams +{ AMSExecutor AMSCreateExecutor(AMSCAbstrModel model, int process_id, @@ -613,8 +608,7 @@ AMSExecutor AMSCreateExecutor(AMSCAbstrModel model, return _AMSRegisterExecutor(dWF); } -namespace ams -{ + void AMSExecute(AMSExecutor executor, EOSLambda &OrigComputation, const ams::SmallVector &ins, @@ -680,21 +674,14 @@ AMSCAbstrModel AMSRegisterAbstractModel(const char *domain_name, AMSUQPolicy uq_policy, double threshold, const char *surrogate_path, - const char *uq_path, - const char *db_label, - int num_clusters) + const char *db_label) { CFATAL(AMS, _amsWrap == nullptr, "AMSInit has not been called.") std::cout << "_amsWrap = " << _amsWrap.get() << std::endl; auto id = _amsWrap->get_model_index(domain_name); if (id == -1) { - id = _amsWrap->register_model(domain_name, - uq_policy, - threshold, - surrogate_path, - uq_path, - db_label, - num_clusters); + id = _amsWrap->register_model( + domain_name, uq_policy, threshold, surrogate_path, db_label); } return id; diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index d48ca998..79d8cf97 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -4,59 +4,30 @@ # ------------------------------------------------------------------------------ # handle sources and headers -file(GLOB_RECURSE MINIAPP_INCLUDES "*.hpp") #set global library path to link with tests if necessary set(LIBRARY_OUTPUT_PATH ${AMS_LIB_OUT_PATH}) -set(AMS_LIB_SRC ${MINIAPP_INCLUDES} AMS.cpp wf/resource_manager.cpp wf/debug.cpp wf/basedb.cpp wf/logger.cpp wf/utils.cpp util/SmallVector.cpp) +set(AMS_LIB_SRC wf/debug.cpp wf/logger.cpp wf/utils.cpp wf/SmallVector.cpp ml/surrogate.cpp wf/hdf5db.cpp wf/basedb.cpp AMSTensor.cpp wf/interface.cpp wf/resource_manager.cpp AMS.cpp) -if (WITH_CUDA) - list(APPEND AMS_LIB_SRC wf/cuda/utilities.cpp) -endif() - -if (WITH_HDF5) - list(APPEND AMS_LIB_SRC wf/hdf5db.cpp) -endif() - -if (WITH_RMQ) - list(APPEND AMS_LIB_SRC wf/rmqdb.cpp) -endif() - - - -# two targets: a shared lib and an exec -add_library(AMS ${AMS_LIB_SRC} ${MINIAPP_INCLUDES}) - -# ------------------------------------------------------------------------------ -if (WITH_CUDA) - - set_target_properties(AMS PROPERTIES CUDA_ARCHITECTURES ${AMS_CUDA_ARCH}) +#if (WITH_CUDA) +# list(APPEND AMS_LIB_SRC wf/cuda/utilities.cpp) +#endif() - # if (BUILD_SHARED_LIBS) - # set_target_properties(AMS PROPERTIES CUDA_SEPARABLE_COMPILATION ON) - # else() - # set_target_properties(AMS PROPERTIES CUDA_SEPARABLE_COMPILATION ON) - # set_target_properties(AMS PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON) - # endif() +#if (WITH_HDF5) +# list(APPEND AMS_LIB_SRC wf/hdf5db.cpp) +#endif() +# +#if (WITH_RMQ) +# list(APPEND AMS_LIB_SRC wf/rmqdb.cpp) +#endif() - set_source_files_properties(wf/cuda/utilities.cpp PROPERTIES LANGUAGE CUDA) - set_source_files_properties(wf/cuda/utilities.cpp PROPERTIES CUDA_ARCHITECTURES ${AMS_CUDA_ARCH}) - set_source_files_properties(wf/cuda/utilities.cpp PROPERTIES COMPILE_FLAGS "--expt-extended-lambda") - - if (WITH_PERFFLOWASPECT) - set_property(SOURCE AMS.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " -Xcompiler=-Xclang -Xcompiler=-load -Xcompiler=-Xclang -Xcompiler=${PERFFLOWASPECT_LIB_DIR}/libWeavePass.so") - set_source_files_properties(wf/resource_manager.cpp COMPILE_FLAGS "-Xclang -load -Xclang ${PERFFLOWASPECT_LIB_DIR}/libWeavePass.so") - endif() -endif() +add_library(AMS ${AMS_LIB_SRC}) # ------------------------------------------------------------------------------ # setup the lib first message(STATUS "ALL INCLUDES ARE ${AMS_APP_INCLUDES}") target_compile_definitions(AMS PRIVATE ${AMS_APP_DEFINES}) target_include_directories(AMS PRIVATE ${AMS_APP_INCLUDES}) -target_include_directories(AMS PUBLIC - $ - $) -target_include_directories(AMS PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(AMS PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include) target_link_directories(AMS PUBLIC ${AMS_APP_LIB_DIRS}) target_link_libraries(AMS PRIVATE ${AMS_APP_LIBRARIES} stdc++fs) @@ -81,53 +52,23 @@ endif() configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMS-config.h.in" "${PROJECT_BINARY_DIR}/include/AMS-config.h") configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMS.h" "${PROJECT_BINARY_DIR}/include/AMS.h" COPYONLY) +configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMSTypes.hpp" "${PROJECT_BINARY_DIR}/include/AMSTypes.hpp" COPYONLY) +configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/SmallVector.hpp" "${PROJECT_BINARY_DIR}/include/SmallVector.hpp" COPYONLY) +configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/ArrayRef.hpp" "${PROJECT_BINARY_DIR}/include/ArrayRef.hpp" COPYONLY) +configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMSTensor.hpp" "${PROJECT_BINARY_DIR}/include/AMSTensor.hpp" COPYONLY) # setup the exec #SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath -Wl,$ORIGIN") # ------------------------------------------------------------------------------ # installation paths -# Install the AMS library -include(GNUInstallDirs) -include(CMakePackageConfigHelpers) -install(TARGETS AMS - EXPORT AMSTargets - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" # For shared libraries - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" # For static libraries - RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" # For executables (Windows-specific) - INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" # Install headers directory -) - -# Export the AMS targets for use by external projects -install(EXPORT AMSTargets - NAMESPACE AMS:: # Prefix target names with AMS:: - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/AMS" # Install location for CMake config -) - -# Install the public headers -install(FILES - ${PROJECT_BINARY_DIR}/include/AMS.h - ${PROJECT_BINARY_DIR}/include/AMS-config.h - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/" # Headers installed into AMS subdir -) - - -# Generate a version file for the package -write_basic_package_version_file( - "${CMAKE_CURRENT_BINARY_DIR}/AMSConfigVersion.cmake" - VERSION ${PROJECT_VERSION} - COMPATIBILITY AnyNewerVersion -) - -# Configure the package configuration file -configure_package_config_file( - "${CMAKE_SOURCE_DIR}/cmake/AMSConfig.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/AMSConfig.cmake" - INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/AMS" -) -# Install the generated config and version files -install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/AMSConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/AMSConfigVersion.cmake" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/AMS" -) +#install(TARGETS AMS +# EXPORT AMSTargets +# DESTINATION lib) +# +#install(EXPORT AMSTargets +# FILE AMS.cmake +# DESTINATION lib/cmake/AMS) +# +#install(FILES ${PROJECT_BINARY_DIR}/include/AMS.h DESTINATION include) +#install(FILES ${PROJECT_BINARY_DIR}/include/AMS-config.h DESTINATION include) diff --git a/src/AMSlib/include/AMS.h b/src/AMSlib/include/AMS.h index 3b5b1999..ae43625a 100644 --- a/src/AMSlib/include/AMS.h +++ b/src/AMSlib/include/AMS.h @@ -12,37 +12,13 @@ #include "AMSTensor.hpp" #include "AMSTypes.hpp" -#ifdef __AMS_ENABLE_CALIPER__ -#include -#include -#define CALIPER(stmt) stmt -#else -#define CALIPER(stmt) -#endif - -#ifdef __AMS_ENABLE_MPI__ -#include -#define MPI_CALL(stmt) \ - if (stmt != MPI_SUCCESS) { \ - fprintf(stderr, "Error in MPI-Call (File: %s, %d)\n", __FILE__, __LINE__); \ - } -#else -typedef void *MPI_Comm; -#define MPI_CALL(stm) -#endif - -#ifdef __AMS_ENABLE_PERFFLOWASPECT__ -#define PERFFASPECT() __attribute__((annotate("@critical_path()"))) -#else -#define PERFFASPECT() -#endif - namespace ams { -using EOSLambda = std::function &, - ams::SmallVector &, - ams::SmallVector &)>; +using EOSLambda = + std::function & /*inputs */, + ams::SmallVector & /*input - outputs */, + ams::SmallVector & /* outputs */)>; using EOSCFn = void (*)(void *, diff --git a/src/AMSlib/macro.h b/src/AMSlib/macro.h new file mode 100644 index 00000000..608c63e8 --- /dev/null +++ b/src/AMSlib/macro.h @@ -0,0 +1,24 @@ +#ifdef __AMS_ENABLE_CALIPER__ +#include +#include +#define CALIPER(stmt) stmt +#else +#define CALIPER(stmt) +#endif + +#ifdef __ENABLE_MPI__ +#include +#define MPI_CALL(stmt) \ + if (stmt != MPI_SUCCESS) { \ + fprintf(stderr, "Error in MPI-Call (File: %s, %d)\n", __FILE__, __LINE__); \ + } +#else +typedef void *MPI_Comm; +#define MPI_CALL(stm) +#endif + +#ifdef __AMS_ENABLE_PERFFLOWASPECT__ +#define PERFFASPECT() __attribute__((annotate("@critical_path()"))) +#else +#define PERFFASPECT() +#endif diff --git a/src/AMSlib/ml/surrogate.cpp b/src/AMSlib/ml/surrogate.cpp index 3ea50795..e6f20437 100644 --- a/src/AMSlib/ml/surrogate.cpp +++ b/src/AMSlib/ml/surrogate.cpp @@ -45,7 +45,6 @@ SurrogateModel::SurrogateModel(std::string& model_path, bool isDeltaUQ) std::error_code ec; if (!std::experimental::filesystem::exists(Path, ec)) { - std::abort(); FATAL(Surrogate, "Path to Surrogate Model (%s) Does not exist", model_path.c_str()) diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index e09ae9a3..a2ba0117 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -26,6 +26,7 @@ #include "AMS.h" #include "ArrayRef.hpp" #include "debug.h" +#include "macro.h" #include "wf/debug.h" #include "wf/resource_manager.hpp" #include "wf/utils.hpp" diff --git a/src/AMSlib/wf/device.hpp b/src/AMSlib/wf/device.hpp index 1ec6252e..a605fd6a 100644 --- a/src/AMSlib/wf/device.hpp +++ b/src/AMSlib/wf/device.hpp @@ -47,3 +47,4 @@ void device_random_uq(int seed, } // namespace ams #endif +#endif diff --git a/src/AMSlib/wf/resource_manager.hpp b/src/AMSlib/wf/resource_manager.hpp index 7f1825c6..4154dffa 100644 --- a/src/AMSlib/wf/resource_manager.hpp +++ b/src/AMSlib/wf/resource_manager.hpp @@ -13,6 +13,7 @@ #include #include "AMS.h" +#include "macro.h" #include "wf/debug.h" diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index 17879c49..390a445e 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -13,14 +13,10 @@ #include #include -#include "debug.h" -#ifdef __AMS_ENABLE_CALIPER__ -#include -#endif - #include #include "AMS.h" +#include "macro.h" #include "ArrayRef.hpp" #include "SmallVector.hpp" #include "interface.hpp" @@ -28,12 +24,6 @@ #include "resource_manager.hpp" #include "wf/basedb.hpp" -#ifdef __ENABLE_MPI__ -#include - -#include "wf/redist_load.hpp" -#endif - #include "wf/debug.h" //! ---------------------------------------------------------------------------- From 4534c0ffefb9ba354a9ae1c977e325e787cbde9e Mon Sep 17 00:00:00 2001 From: koparasy Date: Tue, 24 Dec 2024 08:42:58 -0800 Subject: [PATCH 017/136] Handle correct 2D inout tensors --- src/AMSlib/AMS.cpp | 5 + src/AMSlib/ml/surrogate.cpp | 1 + src/AMSlib/wf/interface.cpp | 21 ++- src/AMSlib/wf/workflow.hpp | 68 +++++++- tests/AMSlib/ams_interface/CMakeLists.txt | 67 ++++---- tests/AMSlib/ams_interface/ams_ete.cpp | 2 +- tests/AMSlib/ams_interface/ams_ete_env.cpp | 2 +- .../env_2_models_fs_rand_uq.json.in | 37 +--- tests/AMSlib/ams_interface/verify_ete.py | 159 ++++++------------ 9 files changed, 182 insertions(+), 180 deletions(-) diff --git a/src/AMSlib/AMS.cpp b/src/AMSlib/AMS.cpp index 2ab70d66..9c56bc51 100644 --- a/src/AMSlib/AMS.cpp +++ b/src/AMSlib/AMS.cpp @@ -621,6 +621,11 @@ void AMSExecute(AMSExecutor executor, auto currExec = _amsWrap->executors[index]; ams::AMSWorkflow *workflow = reinterpret_cast(currExec); + DBG(AMS, + "Calling AMS with in:%ld, inout:%ld, out:%ld", + ins.size(), + inouts.size(), + outs.size()); callAMS(workflow, OrigComputation, ins, inouts, outs); } diff --git a/src/AMSlib/ml/surrogate.cpp b/src/AMSlib/ml/surrogate.cpp index e6f20437..a12728c9 100644 --- a/src/AMSlib/ml/surrogate.cpp +++ b/src/AMSlib/ml/surrogate.cpp @@ -247,6 +247,7 @@ std::tuple SurrogateModel::evaluate( } auto ITensor = torch::cat(ConvertedInputs, CAxis); + std::cout << "Input concatenated tensor is " << ITensor.sizes() << "\n"; auto [OTensor, Predicate] = _evaluate(ITensor, policy, threshold); if (InputDevice != torch_device) { diff --git a/src/AMSlib/wf/interface.cpp b/src/AMSlib/wf/interface.cpp index a61a0de1..55b1473d 100644 --- a/src/AMSlib/wf/interface.cpp +++ b/src/AMSlib/wf/interface.cpp @@ -94,7 +94,7 @@ static ams::SmallVector torchToAMSTensors( } static ams::SmallVector amsToTorchTensors( - ams::MutableArrayRef &amsTensorVector) + const ams::SmallVector &amsTensorVector) { ams::SmallVector ams_tensors; for (auto &tensor : amsTensorVector) { @@ -113,7 +113,7 @@ static ams::SmallVector amsToTorchTensors( strides, torch::TensorOptions().dtype(dType).device(deviceType))); } - return ams_tensors; + return std::move(ams_tensors); } void callApplication(ams::EOSLambda CallBack, @@ -134,9 +134,18 @@ void callAMS(ams::AMSWorkflow *executor, ams::SmallVector &inouts, ams::SmallVector &outs) { - ams::MutableArrayRef tins; - ams::MutableArrayRef tinouts; - ams::MutableArrayRef touts; -#warning transform ams::AMSTensor to torch tensors. + ams::SmallVector tins = amsToTorchTensors(ins); + ams::SmallVector tinouts = amsToTorchTensors(inouts); + ams::SmallVector touts = amsToTorchTensors(outs); + + for (auto &TI : tins) + std::cout << "ITensor Shape is " << TI.sizes() << "\n"; + for (auto &TIO : tinouts) + std::cout << "IOTensor Shape is " << TIO.sizes() << "\n"; + + for (auto &TO : touts) + std::cout << "OTensor Shape is " << TO.sizes() << "\n"; + + executor->evaluate(Physics, tins, tinouts, touts); } diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index 390a445e..df1273c5 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -8,22 +8,20 @@ #ifndef __AMS_WORKFLOW_HPP__ #define __AMS_WORKFLOW_HPP__ +#include #include #include #include -#include - #include "AMS.h" -#include "macro.h" #include "ArrayRef.hpp" #include "SmallVector.hpp" #include "interface.hpp" +#include "macro.h" #include "ml/surrogate.hpp" #include "resource_manager.hpp" #include "wf/basedb.hpp" - #include "wf/debug.h" //! ---------------------------------------------------------------------------- @@ -119,10 +117,19 @@ class AMSWorkflow Inputs.end()); c10::SmallVector ConvertedOutputs(Outputs.begin(), Outputs.end()); + for (auto &T : ConvertedInputs) { + std::cout << "CI Shape is " << T.sizes() << "\n"; + } + + for (auto &T : ConvertedOutputs) { + std::cout << "CO Shape is " << T.sizes() << "\n"; + } auto Input = torch::cat(ConvertedInputs, Inputs[0].sizes().size() - 1).to(tOptions); + std::cout << "Cat Input : " << Input.sizes() << "\n"; auto Output = torch::cat(ConvertedOutputs, Outputs[0].sizes().size() - 1) .to(tOptions); + std::cout << "Cat Output: " << Output.sizes() << "\n"; // Store to database DB->store(Input, Output); @@ -207,7 +214,7 @@ class AMSWorkflow { SmallVector NewVector; for (auto O : Tensors) { - NewVector.push_back(O.index({Mask})); + NewVector.push_back(O.index({Mask}).view({-1, O.sizes()[O.dim() - 1]})); } return NewVector; } @@ -223,7 +230,12 @@ class AMSWorkflow "memories\n"); } for (int i = 0; i < computedDomain.size(); i++) { - entireDomain[i].index_put_({Predicate}, computedDomain[i]); + auto indexed_shape = computedDomain[i].sizes(); + std::cout << "Scattering outputs " << entireDomain[i].sizes() << " CD " + << computedDomain[i].sizes() << " Predicate " + << Predicate.sizes() << "\n"; + entireDomain[i].index_put_({Predicate}, + computedDomain[i].view(indexed_shape)); } } @@ -238,6 +250,9 @@ class AMSWorkflow int ConcatAxisSize = dst.sizes()[dst.dim() - 1]; torch::Tensor Slice = Src.narrow(outerDim, offset, ConcatAxisSize).to(dst.options()); + std::cout << "Slice Shape is:" << Slice.sizes() << "\n"; + std::cout << "Dst shape is " << dst.sizes() << "\n"; + std::cout << "Predicate is " << Predicate.sizes() << "\n"; dst.index_put_({Predicate}, Slice.index({Predicate})); offset += ConcatAxisSize; } @@ -299,9 +314,27 @@ class AMSWorkflow ams::MutableArrayRef Outs) { CALIPER(CALI_MARK_BEGIN("AMSEvaluate");) + DBG(Workflow, + "Entering Workflow with TorchIn:%ld, TochInOut:%ld, TorchOut:%ld", + Ins.size(), + InOuts.size(), + Outs.size()); + + for (auto &TI : Ins) + std::cout << "ITensor Shape is " << TI.sizes() << "\n"; + for (auto &TIO : InOuts) + std::cout << "IOTensor Shape is " << TIO.sizes() << "\n"; + for (auto &TO : Outs) + std::cout << "OTensor Shape is " << TO.sizes() << "\n"; + SmallVector InputTensors(Ins.begin(), Ins.end()); - SmallVector OutputTensors(Ins.begin(), Ins.end()); + SmallVector OutputTensors(Outs.begin(), Outs.end()); + CALIPER(CALI_MARK_BEGIN("AMSEvaluate");) + DBG(Workflow, + "Entering Workflow with TorchIn:%ld, TorchOut:%ld", + InputTensors.size(), + OutputTensors.size()); for (auto Tensor : InOuts) { InputTensors.push_back(Tensor); OutputTensors.push_back(Tensor); @@ -313,6 +346,7 @@ class AMSWorkflow REPORT_MEM_USAGE(Workflow, "Start") if (!MLModel) { + DBG(Workflow, "Model does not exist, calling entire application"); // We need to clone only inout data to guarantee // we have a copy of them when writting the database SmallVector PhysicInOutsBefore; @@ -350,6 +384,10 @@ class AMSWorkflow CALIPER(CALI_MARK_END("SURROGATE");) //Copy out the results of the ML Model to the correct indices, this needs to happen + // NOTE: squeezing the predicate is important for the operations next. As they require + // this shape. We cannot call the inpace operator as the Predicate is generated by the model, + // in inference mode, and thus it has the read-only property set. + Predicate = Predicate.squeeze(); CALIPER(CALI_MARK_BEGIN("MLDomainToApplication");) int offset = MLDomainToApplication(MLOutputs, Outs, Predicate, 0); MLDomainToApplication(MLOutputs, InOuts, Predicate, offset); @@ -376,15 +414,29 @@ class AMSWorkflow for (auto S : PhysicInOuts) PhysicInOutsBefore.push_back(S.clone()); + + for (auto &TI : PhysicIns) + std::cout << "Before Phy ITensor Shape is " << TI.sizes() << "\n"; + for (auto &TO : PhysicOuts) + std::cout << "Before Phy OTensor Shape is " << TO.sizes() << "\n"; + + // We call the application here CALIPER(CALI_MARK_BEGIN("PHYSICS MODULE");) callApplication(CallBack, PhysicIns, PhysicInOuts, PhysicOuts); CALIPER(CALI_MARK_END("PHYSICS MODULE");) + for (auto &TI : PhysicIns) + std::cout << "After Phy ITensor Shape is " << TI.sizes() << "\n"; + for (auto &TO : PhysicOuts) + std::cout << "After Phy OTensor Shape is " << TO.sizes() << "\n"; + CALIPER(CALI_MARK_BEGIN("UNPACK");) // Copy out the computation results to the original tensors/buffers - ScatterPhysicOutputsToOrigDomain(PhysicOuts, WrongMLIndices, Outs); + ScatterPhysicOutputsToOrigDomain(PhysicOuts, + WrongMLIndices.squeeze_(), + Outs); ScatterPhysicOutputsToOrigDomain(PhysicInOuts, WrongMLIndices, InOuts); CALIPER(CALI_MARK_END("UNPACK");) diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index cba9f78d..126115dc 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -12,24 +12,24 @@ function(JSON_TESTS db_type) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/env_2_models_fs_rand_uq.json.in" "${JSON_FP}" @ONLY) # Tests Random models with different percentages both models store to file - add_test(NAME AMSEndToEndFromJSON::Random10::Random50::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_random_50") + ADD_API_UNIT_TEST(APIEnvAPI AMS::ENV::Random10::Random50::Double::DB::${db_type}::HOST "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 8 \"double\" 1 128 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 \"double\" 128 app_random_10 app_random_50") # Tests delta-uq models with different aggregation both models store to file - add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean app_uq_max") + ADD_API_UNIT_TEST(APIEnvAPI AMS::ENV::DuqMean::DuqMax::Double::DB::${db_type}::HOST "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 8 \"double\" 1 128 app_uq_mean app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 \"double\" 128 app_uq_mean app_uq_max") # Tests detla uq model with a random uq model both models store to files - add_test(NAME AMSEndToEndFromJSON::Random::DuqMax::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_uq_max") + ADD_API_UNIT_TEST(APIEnvAPI AMS::ENV::Random::DuqMax::Double::DB::${db_type}::HOST "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 8 \"double\" 1 128 app_random_10 app_uq_max;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 \"double\" 128 app_random_10 app_uq_max") # Tests detla uq model with no model. uq model both store to files - add_test(NAME AMSEndToEndFromJSON::Random::NoModel::Double::DB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_random_10 app_no_model;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_random_10 app_no_model") + ADD_API_UNIT_TEST(APIEnvAPI AMS::ENV::Random::NoModel::Double::DB::${db_type}::HOST "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 8 \"double\" 1 128 app_random_10 app_no_model;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 \"double\" 128 app_random_10 app_no_model") # Tests 2 delta uq models with no deb . uq model both store to files - add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_ndb app_uq_max_ndb;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_ndb app_uq_max_ndb") + ADD_API_UNIT_TEST(APIEnvAPI AMS::ENV::DuqMean::DuqMax::Double::NODB::${db_type}::HOST "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 8 \"double\" 1 128 app_uq_mean_ndb app_uq_max_ndb;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 \"double\" 128 app_uq_mean_ndb app_uq_max_ndb") # Tests null models null dbs - add_test(NAME AMSEndToEndFromJSON::None::None::Double::NODB::${db_type}::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_no_model_no_db app_no_model_no_db ;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_no_model_no_db app_no_model_no_db") + ADD_API_UNIT_TEST(APIEnvAPI AMS::ENV::None::None::Double::NODB::${db_type}::HOST "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 8 \"double\" 1 128 app_no_model_no_db app_no_model_no_db ;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 \"double\" 128 app_no_model_no_db app_no_model_no_db") unset(AMS_DB_TEST_TYPE) unset(JSON_FP) @@ -57,8 +57,6 @@ endfunction() function(INTEGRATION_TEST_ENV) JSON_TESTS("hdf5") set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/hdf5.json") - # Tests delta-uq models with different aggregation both models store to file with debug option set to on. - add_test(NAME AMSEndToEndFromJSON::DuqMean::DuqMax::Double::DB::hdf5-debug::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 9 \"double\" 1 1024 app_uq_mean_debug app_uq_max_debug;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 \"double\" 1024 app_uq_mean_debug app_uq_max_debug") unset(JSON_FP) endfunction() @@ -72,7 +70,7 @@ function(INTEGRATION_TEST_RMQ) endif() set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") CHECK_RMQ_CONFIG(${JSON_FP}) - add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 8 9 \"double\" 2 1024; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 8 9 \"double\" 2 1024") + add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 8 8 \"double\" 2 128; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 8 8 \"double\" 2 128") endfunction() function (INTEGRATION_TEST) @@ -81,8 +79,8 @@ function (INTEGRATION_TEST) # UQ: Random ####################################################### - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyPhysics::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyModel::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"none\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyPhysics::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyModel::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 128 \"none\" \"./\"") if (WITH_HDF5) @@ -93,9 +91,9 @@ function (INTEGRATION_TEST) # precision: double ####################################################### - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 1.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"") ####################################################### # TEST: hdf5 output format @@ -105,9 +103,9 @@ function (INTEGRATION_TEST) ####################################################### - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Single::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Single::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Single::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Single::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"float\" \"random\" 0.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Single::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"float\" \"random\" 1.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 1.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Random::Single::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"float\" \"random\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"float\" \"random\" 0.5 1 128 \"hdf5\" \"./\"") endif() @@ -117,9 +115,9 @@ function (INTEGRATION_TEST) # 3 Thresholds: 0, 0.5, 1.0 # precision: double ####################################################### - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_double_cpu.pt \"double\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt \"double\" \"deltaUQ (mean)\" 0.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt \"double\" \"deltaUQ (mean)\" 0.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt \"double\" \"deltaUQ (mean)\" 1.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt \"double\" \"deltaUQ (mean)\" 1.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt \"double\" \"deltaUQ (mean)\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_mean.pt \"double\" \"deltaUQ (mean)\" 0.5 1 128 \"hdf5\" \"./\"") ####################################################### # TEST: hdf5 output format @@ -127,9 +125,9 @@ function (INTEGRATION_TEST) # 3 Thresholds: 0, 0.5, 1.0 # precision: single ####################################################### - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Single::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Single::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 1.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Single::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_mean_single_cpu.pt \"float\" \"deltaUQ (mean)\" 0.5 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Single::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt \"float\" \"deltaUQ (mean)\" 0.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt \"float\" \"deltaUQ (mean)\" 0.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Single::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt \"float\" \"deltaUQ (mean)\" 1.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt \"float\" \"deltaUQ (mean)\" 1.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMean::Single::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt \"float\" \"deltaUQ (mean)\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_mean.pt \"float\" \"deltaUQ (mean)\" 0.5 1 128 \"hdf5\" \"./\"") ####################################################### # TEST: hdf5 output format @@ -137,9 +135,9 @@ function (INTEGRATION_TEST) # 3 Thresholds: 0, 0.5, 1.0 # precision: double ####################################################### - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_double_cpu.pt \"double\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt \"double\" \"deltaUQ (max)\" 0.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt \"double\" \"deltaUQ (max)\" 0.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt \"double\" \"deltaUQ (max)\" 1.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt \"double\" \"deltaUQ (max)\" 1.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt \"double\" \"deltaUQ (max)\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt \"double\" \"deltaUQ (max)\" 0.5 1 128 \"hdf5\" \"./\"") ####################################################### # TEST: hdf5 output format @@ -147,9 +145,16 @@ function (INTEGRATION_TEST) # 3 Thresholds: 0, 0.5, 1.0 # precision: single ####################################################### - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Single::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Single::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 1.0 1 1024 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Single::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 9 ${CMAKE_CURRENT_SOURCE_DIR}/uq_max_single_cpu.pt \"float\" \"deltaUQ (max)\" 0.5 1 1024 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Single::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt \"float\" \"deltaUQ (max)\" 0.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt \"float\" \"deltaUQ (max)\" 0.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Single::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt \"float\" \"deltaUQ (max)\" 1.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt \"float\" \"deltaUQ (max)\" 1.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::DeltaUQMax::Single::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt \"float\" \"deltaUQ (max)\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt \"float\" \"deltaUQ (max)\" 0.5 1 128 \"hdf5\" \"./\"") + + + # Random model with inout arguments that represent 2D data. + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Inout2D::Random::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_inout_2d 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Inout2D::Random::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_inout_2d 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 1.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Inout2D::Random::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"") + endfunction() function(BUILD_TEST exe source) @@ -172,10 +177,10 @@ endfunction() BUILD_TEST(ams_end_to_end ams_ete.cpp) +BUILD_TEST(ams_inout_2d ams_ete_2d.cpp) INTEGRATION_TEST() BUILD_TEST(ams_end_to_end_env ams_ete_env.cpp) -#INTEGRATION_TEST_ENV() - +INTEGRATION_TEST_ENV() #BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) #BUILD_TEST(ams_rmq ams_rmq_env.cpp) diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp index 6c44a929..12023706 100644 --- a/tests/AMSlib/ams_interface/ams_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -124,7 +124,7 @@ struct Problem { "Expected tensors to have the same shape"); } for (int i = 0; i < num_outputs; i++) { - outs[i] = ams_ins[i].data(); + outs[i] = ams_outs[i].data(); if (ams_outs[i].shape()[0] != num_elements) throw std::runtime_error( "Expected tensors to have the same shape"); diff --git a/tests/AMSlib/ams_interface/ams_ete_env.cpp b/tests/AMSlib/ams_interface/ams_ete_env.cpp index a9277263..9781032f 100644 --- a/tests/AMSlib/ams_interface/ams_ete_env.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_env.cpp @@ -120,7 +120,7 @@ struct Problem { "Expected tensors to have the same shape"); } for (int i = 0; i < num_outputs; i++) { - outs[i] = ams_ins[i].data(); + outs[i] = ams_outs[i].data(); if (ams_outs[i].shape()[0] != num_elements) throw std::runtime_error( "Expected tensors to have the same shape"); diff --git a/tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in b/tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in index 90961bdf..e3db02b3 100644 --- a/tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in +++ b/tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in @@ -6,72 +6,56 @@ "ml_models" : { "random_50": { "uq_type": "random", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/linear_scripted_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/linear_scripted_single_cpu_random.pt", "uq_aggregate": "mean", "threshold": 0.5, "db_label" : "random_50" }, "random_10": { "uq_type": "random", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/linear_scripted_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/linear_scripted_single_cpu_random.pt", "uq_aggregate": "mean", "threshold": 0.1, "db_label" : "random_10" }, "duq_mean": { "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_mean_double_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/double_cpu_duq_mean.pt", "uq_aggregate": "mean", "threshold": 0.5, "db_label" : "duq_mean" }, "duq_max": { "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_max_double_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/double_cpu_duq_max.pt", "uq_aggregate": "max", "threshold": 0.5, "db_label" : "duq_max" }, - "duq_max_debug": { - "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_max_double_cpu.pt", - "uq_aggregate": "max", - "threshold": 0.5, - "db_label" : "duq_max", - "debug_db" : true - }, - "duq_mean_debug": { - "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_mean_double_cpu.pt", - "uq_aggregate": "mean", - "threshold": 0.5, - "db_label" : "duq_mean", - "debug_db" : true - }, "random_no_db_10": { "uq_type": "random", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/linear_scripted_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/linear_scripted_single_cpu_random.pt", "uq_aggregate": "mean", "threshold": 0.1, "db_label" : "" }, "random_no_db_50": { "uq_type": "random", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/linear_scripted_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/linear_scripted_single_cpu_random.pt", "uq_aggregate": "mean", "threshold": 0.5, "db_label" : "" }, "duq_mean_no_db": { "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_mean_double_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/double_cpu_duq_mean.pt", "uq_aggregate": "mean", "threshold": 0.5, "db_label" : "" }, "duq_max_no_db": { "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_max_double_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/double_cpu_duq_max.pt", "uq_aggregate": "max", "threshold": 0.5, "db_label" : "" @@ -99,9 +83,6 @@ "app_uq_mean_ndb" : "duq_mean_no_db", "app_uq_max_ndb" : "duq_max_no_db", "app_no_model" : "no_model", - "app_no_model_no_db" : "no_model_no_db", - "app_uq_mean_debug" : "duq_mean_debug", - "app_uq_max_debug" : "duq_max_debug" - + "app_no_model_no_db" : "no_model_no_db" } } diff --git a/tests/AMSlib/ams_interface/verify_ete.py b/tests/AMSlib/ams_interface/verify_ete.py index 27e682b7..b7a5648a 100644 --- a/tests/AMSlib/ams_interface/verify_ete.py +++ b/tests/AMSlib/ams_interface/verify_ete.py @@ -17,7 +17,7 @@ def get_suffix(db_type): return "unknown" -def verify_data_collection(fs_path, db_type, num_inputs, num_outputs, name="test", debug_db=False): +def verify_data_collection(fs_path, db_type, num_inputs, num_outputs, threshold, name="test", debug_db=False): # Returns a tuple of the input/ouput data and 0/1 for correct incorrect file. # Checks whether the files also have the right number of columns if not Path(fs_path).exists(): @@ -42,53 +42,37 @@ def verify_data_collection(fs_path, db_type, num_inputs, num_outputs, name="test fp.unlink() return None, 1 elif name == "": - return (np.empty((0, 0)), np.empty((0, 0))), 0 + return (np.empty((0, 0), dtype=np.float32), np.empty((0, 0), dtype=np.float32)), 0 elif not fp.exists(): print(f"File path {fn} does not exist") return None, 1 - if db_type == "csv": - df = pd.read_csv(str(fp), sep=":") - assert len(df.columns) == (num_inputs + num_outputs), "Expected equal number of inputs/outputs" - - inputs = sum(1 for s in df.columns if "input" in s) - assert inputs == num_inputs, "Expected equal number of inputs" - outputs = sum(1 for s in df.columns if "output" in s) - assert outputs == num_outputs, "Expected equal number of outputs" - input_data = df[[f"input_{i}" for i in range(inputs)]].to_numpy() - output_data = df[[f"output_{i}" for i in range(outputs)]].to_numpy() - fp.unlink() - return (input_data, output_data), 0 - elif db_type == "hdf5": + if db_type == "hdf5": + with h5py.File(fp, "r") as fd: dsets = fd.keys() - assert len(dsets) == ( - num_inputs + num_outputs + int(debug_db) + 1 - ), "Expected equal number of inputs/outputs" - inputs = sum(1 for s in dsets if "input" in s) - assert inputs == num_inputs, "Expected equal number of inputs" - outputs = sum(1 for s in dsets if "output" in s) - assert outputs == num_outputs, "Expected equal number of outputs" - input_data = [[] for _ in range(num_inputs)] - output_data = [[] for _ in range(num_outputs)] - for d in dsets: - if not ("input_" in d or "output_" in d): - continue - loc = int(d.split("_")[1]) - if len(fd[d]): - if "input" in d: - input_data[loc] = fd[d][:] - elif "output" in d: - output_data[loc] = fd[d][:] - predicate = None - if debug_db: - predicate = np.array(fd["predicate"][:]) - input_data = np.array(input_data) - output_data = np.array(output_data) + if threshold == 1.0: + dsets = fd.keys() + print(dsets) + assert len(dsets) == 1, "Expected input, output and domain_name dset" + + return None, 0 + + print(dsets) + assert len(dsets) == 3, "Expected input, output and domain_name dset" + data = {} + for d in {"input_data", "output_data"}: + assert d in dsets, f"Expected {d} to be in dataset names {dests}" + data[d] = fd[d] + print(d, fd[d].shape) + input_data = np.array(data["input_data"]) + output_data = np.array(data["output_data"]) + print(input_data.shape) + print(output_data.shape) fp.unlink() if debug_db: - return (input_data.T, output_data.T, predicate), 0 - return (input_data.T, output_data.T), 0 + return (input_data, output_data, predicate), 0 + return (input_data, output_data), 0 else: return None, 1 @@ -109,7 +93,6 @@ def verify( name="test", debug_db=False, ): - print("debug db is", debug_db) # When AMS has no model path it always calls the domain solution. # As such it behaves identically with threshold 0 if model_path == None or model_path == "": @@ -120,12 +103,14 @@ def verify( threshold = 1.0 if db_type != "none": - data, correct = verify_data_collection(fs_path, db_type, num_inputs, num_outputs, name, debug_db) + data, correct = verify_data_collection(fs_path, db_type, num_inputs, num_outputs, threshold, name, debug_db) if correct: return 1 + if data is None: + return 0 inputs = data[0] outputs = data[1] - + print("Model path is ", model_path) if (model_path == None or model_path == "") and name == "": return 0 @@ -135,32 +120,17 @@ def verify( assert outputs.dtype == np.float32, "Input Data types do not match" # When debug db is set, we store always all elements - if debug_db: - predicate = data[2] - assert ( - len(predicate) == num_elements - ), f"debug db should always contain all data but now it has {len(predicate)}" - assert ( - len(inputs) == num_elements and len(outputs) == num_elements - ), f"Num elements should be the same as experiment {len(inputs)} {num_elements}" - # Predicate points to 'true' when we use the model. The sum should be "equal" to - # the threshold multiplied by the number of elements - arg = sum(predicate) - actual_elems = int(threshold * num_elements) - assert arg == actual_elems, "Predicate does not accumulate to the expected value" - # Over here I pick the values from input/outputs that will be selected for "domain" evaluation - # This will allow the code to verify that predicates pick the "right" values - inputs = inputs[np.logical_not(predicate)] - outputs = outputs[np.logical_not(predicate)] - elif threshold == 0.0: + if threshold == 0.0: # Threshold 0 means collect all data. Verify the sizes. + print(inputs.shape[0]) + print(outputs.shape[0]) assert ( - len(inputs) == num_elements and len(outputs) == num_elements + inputs.shape[0] == num_elements and outputs.shape[0] == num_elements ), f"Num elements should be the same as experiment {len(inputs)} {num_elements}" elif threshold == 1.0: # Threshold 1.0 means to not collect any data. Verify the sizes. - assert len(inputs) == 0 and len(outputs) == 0, "Num elements should be zero" + assert inputs.shape[0] == 0 and outputs.shape[0] == 0, "Num elements should be zero" # There is nothing else we can check here return 0 else: @@ -170,52 +140,32 @@ def verify( lb = num_elements * (1 - threshold) - num_elements * 0.05 ub = num_elements * (1 - threshold) + num_elements * 0.05 assert ( - len(inputs) > lb and len(inputs) < ub - ), f"Not in the bounds of correct items {lb} {ub} {len(inputs)} {name}" + inputs.shape[0] > lb and inputs.shape[0] < ub + ), f"Not in the bounds of correct items {lb} {ub} {inputs.shape[0]} {name}" assert ( - len(outputs) > lb and len(outputs) < ub - ), f"Not in the bounds of correct items {lb} {ub} {len(inputs)} {name}" + outputs.shape[0] > lb and outputs.shape[0] < ub + ), f"Not in the bounds of correct items {lb} {ub} {outputs.shape[0]} {name}" if "delta" in uq_name: assert "mean" in uq_name or "max" in uq_name, "unknown Delta UQ mechanism" d_type = np.float32 - if data_type == "double": - d_type = np.float64 - - if "mean" in uq_name: - # Our DUQ-mean model skips odd evaluations. - # Here we set on verify_inputs the inputs of those evaluations - verify_inputs = np.zeros((len(inputs), num_inputs), dtype=d_type) - if threshold == 0.0: - step = 1 - elif threshold == 0.5: - verify_inputs[0] = np.ones(num_inputs, dtype=d_type) - step = 2 - for i in range(1, len(inputs)): - verify_inputs[i] = verify_inputs[i - 1] + step - # Compare whether the results match our base function. - diff_sum = np.sum(np.abs(verify_inputs - inputs)) - assert np.isclose(diff_sum, 0.0), "Mean Input data do not match" - verify_output = np.sum(inputs, axis=1).T * num_outputs - outputs = np.sum(outputs, axis=1) - diff_sum = np.sum(np.abs(outputs - verify_output)) - assert np.isclose(diff_sum, 0.0), "Mean Output data do not match" - elif "max" in uq_name: - # Our DUQ-max model skips even evaluations. - # Here we set on verify_inputs the inputs of those evaluations - verify_inputs = np.zeros((len(inputs), num_inputs), dtype=d_type) - if threshold == 0.0: - step = 1 - elif threshold == 0.5: - step = 2 - for i in range(1, len(inputs)): - verify_inputs[i] = verify_inputs[i - 1] + step - diff_sum = np.sum(np.abs(verify_inputs - inputs)) - assert np.isclose(diff_sum, 0.0), "Max Input data do not match" - verify_output = np.sum(inputs, axis=1).T * num_outputs - outputs = np.sum(outputs, axis=1) - diff_sum = np.sum(np.abs(outputs - verify_output)) - assert np.isclose(diff_sum, 0.0), "Max Output data do not match" + # Our DUQ-mean model skips odd evaluations. + # Here we set on verify_inputs the inputs of those evaluations + verify_inputs = np.zeros(inputs.shape, dtype=d_type) + if threshold == 0.0: + step = 1 + elif threshold == 0.5: + verify_inputs[0] = np.ones(num_inputs, dtype=d_type) + step = 2 + for i in range(1, len(inputs)): + verify_inputs[i] = verify_inputs[i - 1] + step + # Compare whether the results match our base function. + diff_sum = np.sum(np.abs(verify_inputs - inputs)) + assert np.isclose(diff_sum, 0.0), "Mean Input data do not match" + verify_output = np.sum(inputs, axis=1).T * num_outputs + outputs = np.sum(outputs, axis=1) + diff_sum = np.sum(np.abs(outputs - verify_output)) + assert np.isclose(diff_sum, 0.0), "Mean Output data do not match" else: return 0 @@ -300,7 +250,6 @@ def from_json(argv): db_type, fs_path, db_label, - is_debug, ) if res != 0: return res From 92010c635e965b16b54c2ba0b49851cdfddbd124 Mon Sep 17 00:00:00 2001 From: koparasy Date: Tue, 24 Dec 2024 08:47:40 -0800 Subject: [PATCH 018/136] Adding 2d test --- tests/AMSlib/ams_interface/ams_ete_2d.cpp | 241 ++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 tests/AMSlib/ams_interface/ams_ete_2d.cpp diff --git a/tests/AMSlib/ams_interface/ams_ete_2d.cpp b/tests/AMSlib/ams_interface/ams_ete_2d.cpp new file mode 100644 index 00000000..fde3b1b0 --- /dev/null +++ b/tests/AMSlib/ams_interface/ams_ete_2d.cpp @@ -0,0 +1,241 @@ +#include +#ifdef __AMS_ENABLE_MPI__ +#include +#endif +#include + +#include +#include +#include +#include +#include +#include + +#include "AMS.h" +#include "ml/surrogate.hpp" +#include "wf/debug.h" + +using namespace ams; + + +AMSDType getDataType(char *d_type) +{ + AMSDType dType = AMSDType::AMS_DOUBLE; + if (std::strcmp(d_type, "float") == 0) { + dType = AMSDType::AMS_SINGLE; + } else if (std::strcmp(d_type, "double") == 0) { + dType = AMSDType::AMS_DOUBLE; + } else { + assert(false && "Unknown data type"); + } + return dType; +} + +template +struct Problem { + int num_inputs; + int num_inouts; + int num_outputs; + int multiplier; + Problem(int ni, int nio, int no) + : num_inputs(ni), num_inouts(nio), num_outputs(no), multiplier(100) + { + } + + void run(long num_elements, + DType *input1, + DType *input2, + DType *inout, + DType *out1, + DType *out2, + int num_inout) + { + for (int i = 0; i < num_elements; i++) { + DType sum = input1[i] + input2[i]; + for (int j = 0; j < num_inout; j++) + sum += inout[i * num_inout + j]; + + out1[i] = sum; + out2[i] = sum; + for (int j = 0; j < num_inout; j++) + inout[i * num_inout + j] = sum; + } + } + + + DType *initialize_inputs(DType *inputs, long length) + { + for (int i = 0; i < length; i++) { + inputs[i] = static_cast(i); + } + return inputs; + } + + DType *initialize_inout(DType *inputs, long length, int elements_per_row) + { + for (int i = 0; i < length; i++) { + for (int j = 0; j < elements_per_row; j++) { + inputs[i * elements_per_row + j] = static_cast(i); + } + } + return inputs; + } + + + void ams_run(AMSExecutor &wf, + AMSResourceType resource, + int iterations, + int num_elements) + { + + for (int i = 0; i < iterations; i++) { + int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + // Allocate Input memory + for (int j = 0; j < num_inputs; j++) { + DType *data = new DType[elements]; + input_tensors.push_back( + AMSTensor::view(initialize_inputs(data, elements), + {num_elements, 1}, + {1, 1}, + resource)); + } + + DType *inout_data = new DType[elements * num_inouts]; + inout_tensors.push_back( + AMSTensor::view(initialize_inout(inout_data, elements, num_inouts), + {num_elements, num_inouts}, + {num_inouts, 1}, + resource)); + + // Allocate Output memory + for (int j = 0; j < num_outputs; j++) { + auto tmp = new DType[elements]; + output_tensors.push_back( + AMSTensor::view(initialize_inputs(tmp, elements), + {num_elements, 1}, + {1, 1}, + resource)); + } + + EOSLambda OrigComputation = [&](const ams::SmallVector + &ams_ins, + ams::SmallVector + &ams_inouts, + ams::SmallVector + &ams_outs) { + DType *ins[num_inputs]; + DType *outs[num_outputs]; + DType *inout; + + if (ams_inouts.size() != 1) { + throw std::runtime_error("Expecting a single inout tensor"); + } + + if (ams_inouts[0].shape()[1] != num_inouts) + throw std::runtime_error("Inout shape should be 'num_inout'"); + + inout = ams_inouts[0].data(); + int num_elements = ams_inouts[0].shape()[0]; + for (int i = 0; i < num_inputs; i++) { + ins[i] = ams_ins[i].data(); + if (ams_ins[i].shape()[0] != num_elements) + throw std::runtime_error("Expected tensors to have the same shape"); + } + for (int i = 0; i < num_outputs; i++) { + outs[i] = ams_outs[i].data(); + if (ams_outs[i].shape()[0] != num_elements) + throw std::runtime_error("Expected tensors to have the same shape"); + } + run(num_elements, + ins[0], + ins[1], + inout, + outs[0], + outs[1], + // I have access to inouts, because we captured everything by reference. + num_inouts); + }; + + AMSExecute( + wf, OrigComputation, input_tensors, inout_tensors, output_tensors); + + for (int i = 0; i < input_tensors.size(); i++) { + delete input_tensors[i].data(); + } + + inout_tensors.clear(); + delete[] inout_data; + + + for (int i = 0; i < output_tensors.size(); i++) { + delete output_tensors[i].data(); + } + } + } +}; + +int main(int argc, char **argv) +{ + if (argc != 12) { + std::cout << "Wrong cli\n"; + std::cout << argv[0] + << " use_device(0|1) num_inputs num_outputs model_path " + "data_type(float|double) uq_policy(random|deltaUQ " + "(mean)|deltaUQ (max)) threshold(0) " + "num_iterations avg_num_values db_type(none|csv|hdf5) " + "db_path(path to existing path to store data)"; + return -1; + } + + + int use_device = std::atoi(argv[1]); + int num_inputs = std::atoi(argv[2]); + int num_outputs = std::atoi(argv[3]); + char *model_path = argv[4]; + AMSDType data_type = getDataType(argv[5]); + std::string uq_name = std::string(argv[6]); + const AMSUQPolicy uq_policy = UQ::UQPolicyFromStr(uq_name); + float threshold = std::atof(argv[7]); + int num_iterations = std::atoi(argv[8]); + int avg_elements = std::atoi(argv[9]); + std::string db_type_str = std::string(argv[10]); + std::string fs_path = std::string(argv[11]); + AMSDBType db_type = ams::db::getDBType(db_type_str); + AMSResourceType resource = AMSResourceType::AMS_HOST; + srand(time(NULL)); + + int num_inouts = 6; + assert(num_inputs == 8 && "Num Inputs should always be 8"); + assert(num_outputs == 8 && "Num outputs should always be 8"); + + AMSConfigureFSDatabase(db_type, fs_path.c_str()); + + assert((uq_policy == AMSUQPolicy::AMS_DELTAUQ_MAX || + uq_policy == AMSUQPolicy::AMS_DELTAUQ_MEAN || + uq_policy == AMSUQPolicy::AMS_RANDOM) && + "Test only supports duq models"); + + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "test", uq_policy, threshold, model_path, "test"); + + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + if (data_type == AMSDType::AMS_SINGLE) { + Problem prob(num_inputs - num_inouts, + num_inouts, + num_outputs - num_inouts); + + + prob.ams_run(wf, resource, num_iterations, avg_elements); + } else { + Problem prob(num_inputs - num_inouts, + num_inouts, + num_outputs - num_inouts); + prob.ams_run(wf, resource, num_iterations, avg_elements); + } + + return 0; +} From a5f3f2ec44ebdf71d4e45fe1b6d4cdd0870b0d3c Mon Sep 17 00:00:00 2001 From: koparasy Date: Tue, 24 Dec 2024 09:15:04 -0800 Subject: [PATCH 019/136] Add broadcast test --- tests/AMSlib/ams_interface/CMakeLists.txt | 8 +- .../ams_interface/ams_ete_broadcast.cpp | 194 ++++++++++++++++++ 2 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 tests/AMSlib/ams_interface/ams_ete_broadcast.cpp diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index 126115dc..c10c15b5 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -153,7 +153,12 @@ function (INTEGRATION_TEST) # Random model with inout arguments that represent 2D data. ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Inout2D::Random::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_inout_2d 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 128 \"hdf5\" \"./\"") ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Inout2D::Random::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_inout_2d 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 1.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 128 \"hdf5\" \"./\"") - ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Inout2D::Random::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Inout2D::Random::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_inout_2d 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"") + +# Random model with inout arguments that represent 2D data. + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Broadcast::Random::Double::DB::OnlyPhysics::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_ete_broadcast 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Broadcast::Random::Double::DB::OnlyModel::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_ete_broadcast 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 1.0 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 1.0 1 128 \"hdf5\" \"./\"") + ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::ModelDefine::Broadcast::Random::Double::DB::HALF::HDF5::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_ete_broadcast 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.5 1 128 \"hdf5\" \"./\"") endfunction() @@ -178,6 +183,7 @@ endfunction() BUILD_TEST(ams_end_to_end ams_ete.cpp) BUILD_TEST(ams_inout_2d ams_ete_2d.cpp) +BUILD_TEST(ams_ete_broadcast ams_ete_broadcast.cpp) INTEGRATION_TEST() BUILD_TEST(ams_end_to_end_env ams_ete_env.cpp) INTEGRATION_TEST_ENV() diff --git a/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp b/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp new file mode 100644 index 00000000..47d6b451 --- /dev/null +++ b/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp @@ -0,0 +1,194 @@ +#include + +#include +#include +#include +#include +#include +#include + +#include "AMS.h" +#include "ml/surrogate.hpp" +#include "wf/debug.h" + +using namespace ams; + +AMSDType getDataType(char *d_type) +{ + AMSDType dType = AMSDType::AMS_DOUBLE; + if (std::strcmp(d_type, "float") == 0) { + dType = AMSDType::AMS_SINGLE; + } else if (std::strcmp(d_type, "double") == 0) { + dType = AMSDType::AMS_DOUBLE; + } else { + assert(false && "Unknown data type"); + } + return dType; +} + +template +struct Problem { + int num_inputs; + int num_outputs; + int multiplier; + Problem(int ni, int no) : num_inputs(ni), num_outputs(no), multiplier(100) {} + + void run(long num_elements, DType **inputs, DType **outputs, DType constant) + { + for (int i = 0; i < num_elements; i++) { + DType sum = constant; + for (int j = 0; j < num_inputs - 1; j++) { + sum += inputs[j][i]; + } + + for (int j = 0; j < num_outputs; j++) { + outputs[j][i] = sum; + } + } + } + + + DType *initialize_inputs(DType *inputs, long length) + { + for (int i = 0; i < length; i++) { + inputs[i] = static_cast(i); + } + return inputs; + } + + void ams_run(AMSExecutor &wf, + AMSResourceType resource, + int iterations, + int num_elements) + { + DType value = 1.0; + for (int i = 0; i < iterations; i++) { + int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; + SmallVector input_tensors; + SmallVector output_tensors; + + // Allocate Input memory + for (int j = 0; j < num_inputs - 1; j++) { + DType *data = new DType[elements]; + input_tensors.push_back( + AMSTensor::view(initialize_inputs(data, elements), + {num_elements, 1}, + {1, 1}, + resource)); + } + value = num_inputs - 1; + input_tensors.push_back( + AMSTensor::view(&value, {num_elements, 1}, {0, 0}, resource)); + + + // Allocate Output memory + for (int j = 0; j < num_outputs; j++) { + auto tmp = new DType[elements]; + output_tensors.push_back( + AMSTensor::view(initialize_inputs(tmp, elements), + {num_elements, 1}, + {1, 1}, + resource)); + } + + EOSLambda OrigComputation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + DType *ins[num_inputs - 1]; + DType *outs[num_outputs]; + if (num_inputs != ams_ins.size()) + throw std::runtime_error( + "Expecting dimensions of inputs to remain the same"); + else if (num_outputs != ams_outs.size()) + throw std::runtime_error( + "Expecting dimensions of outputs to remain the same"); + + // Here I can use domain knowledge (inouts is empty) + int num_elements = ams_ins[0].shape()[0]; + for (int i = 0; i < num_inputs - 1; i++) { + ins[i] = ams_ins[i].data(); + if (ams_ins[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + for (int i = 0; i < num_outputs; i++) { + outs[i] = ams_outs[i].data(); + if (ams_outs[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + run(num_elements, + ins, + outs, + *ams_ins[num_inputs - 1].data()); + }; + + ams::SmallVector inouts; + AMSExecute(wf, OrigComputation, input_tensors, inouts, output_tensors); + + for (int i = 0; i < input_tensors.size() - 1; i++) { + delete input_tensors[i].data(); + } + + + for (int i = 0; i < output_tensors.size(); i++) { + delete output_tensors[i].data(); + } + } + } +}; + +int main(int argc, char **argv) +{ + if (argc != 12) { + std::cout << "Wrong cli\n"; + std::cout << argv[0] + << " use_device(0|1) num_inputs num_outputs model_path " + "data_type(float|double) uq_policy(random|deltaUQ " + "(mean)|deltaUQ (max)) threshold(0) " + "num_iterations avg_num_values db_type(none|csv|hdf5) " + "db_path(path to existing path to store data)"; + return -1; + } + + + int use_device = std::atoi(argv[1]); + int num_inputs = std::atoi(argv[2]); + int num_outputs = std::atoi(argv[3]); + char *model_path = argv[4]; + AMSDType data_type = getDataType(argv[5]); + std::string uq_name = std::string(argv[6]); + const AMSUQPolicy uq_policy = UQ::UQPolicyFromStr(uq_name); + float threshold = std::atof(argv[7]); + int num_iterations = std::atoi(argv[8]); + int avg_elements = std::atoi(argv[9]); + std::string db_type_str = std::string(argv[10]); + std::string fs_path = std::string(argv[11]); + AMSDBType db_type = ams::db::getDBType(db_type_str); + AMSResourceType resource = AMSResourceType::AMS_HOST; + srand(time(NULL)); + + AMSConfigureFSDatabase(db_type, fs_path.c_str()); + + assert((uq_policy == AMSUQPolicy::AMS_DELTAUQ_MAX || + uq_policy == AMSUQPolicy::AMS_DELTAUQ_MEAN || + uq_policy == AMSUQPolicy::AMS_RANDOM) && + "Test only supports duq models"); + + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "test", uq_policy, threshold, model_path, "test"); + + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + if (data_type == AMSDType::AMS_SINGLE) { + Problem prob(num_inputs, num_outputs); + + + prob.ams_run(wf, resource, num_iterations, avg_elements); + } else { + Problem prob(num_inputs, num_outputs); + prob.ams_run(wf, resource, num_iterations, avg_elements); + } + + return 0; +} From 4147d3a674b5b9ea0f8a86490c13f2eec4775f25 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 07:45:18 -0800 Subject: [PATCH 020/136] Nit fixes --- src/AMSlib/AMS.cpp | 22 ++++------------------ src/AMSlib/AMSTensor.cpp | 1 - tests/AMSlib/ams_interface/CMakeLists.txt | 1 - 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/src/AMSlib/AMS.cpp b/src/AMSlib/AMS.cpp index 9c56bc51..eb1d3fd4 100644 --- a/src/AMSlib/AMS.cpp +++ b/src/AMSlib/AMS.cpp @@ -708,28 +708,14 @@ void AMSConfigureFSDatabase(AMSDBType db_type, const char *db_path) #ifdef __ENABLE_MPI__ AMSExecutor AMSCreateDistributedExecutor(AMSCAbstrModel model, - AMSDType data_type, - AMSResourceType resource_type, - AMSPhysicFn call_back, MPI_Comm Comm, int process_id, int world_size) + { - if (data_type == AMSDType::AMS_DOUBLE) { - auto *dWF = _AMSCreateExecutor( - model, data_type, resource_type, call_back, process_id, world_size); - dWF->set_communicator(Comm); - return _AMSRegisterExecutor(data_type, dWF); - - } else if (data_type == AMSDType::AMS_SINGLE) { - auto *sWF = _AMSCreateExecutor( - model, data_type, resource_type, call_back, process_id, world_size); - sWF->set_communicator(Comm); - return _AMSRegisterExecutor(data_type, sWF); - } else { - throw std::invalid_argument("Data type is not supported by AMSLib!"); - return static_cast(-1); - } + auto *dWF = _AMSCreateExecutor(model, process_id, world_size); + dWF->set_communicator(Comm); + return _AMSRegisterExecutor(dWF); } #endif } // namespace ams diff --git a/src/AMSlib/AMSTensor.cpp b/src/AMSlib/AMSTensor.cpp index 2c903035..9702fa36 100644 --- a/src/AMSlib/AMSTensor.cpp +++ b/src/AMSlib/AMSTensor.cpp @@ -47,7 +47,6 @@ AMSTensor::AMSTensor(uint8_t* data, _location(location), _owned(!view) { -#warning add a check to verify that user provided data are contiguous _bytes = _elements * _element_size; _elements = computeNumElements(shapes); if (!_data) { diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index c10c15b5..87e10f04 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -1,5 +1,4 @@ function(ADD_API_UNIT_TEST gname name cmd) - message(WARNING "ARGS are ${cmd}") add_test(NAME ${name} COMMAND bash -c "${cmd}") set_tests_properties(${name} PROPERTIES LABELS ${gname}) endfunction() From 4b7f92770c84a2a7dc14e87ceec8a0d070ce5820 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 07:54:58 -0800 Subject: [PATCH 021/136] Remove faiss from cmake --- CMakeLists.txt | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 010019a1..9005b4e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,6 @@ option(WITH_CUDA "Option to enable CUDA" OFF) option(WITH_EXAMPLES "Build examples" OFF) option(WITH_MPI "Option to enable MPI" OFF) option(WITH_CALIPER "Use Caliper for Profiling" OFF) -option(WITH_FAISS "Use C/C++ FAISS interface for HD Cache" OFF) option(WITH_TORCH "Use C/C++ Torch interface for Surrogate Model Inference" OFF) option(WITH_TORCH_DEBUG "Compute RMSE of Surrogate Model and Physics Module" OFF) option(WITH_TESTS "Compile tests" OFF) @@ -215,36 +214,6 @@ if (WITH_TORCH) endif() # ------------------------------------------------------------------------------ -if (WITH_FAISS) - ## TODO: still need to create FindFaiss.cmake - #find_package(FAISS REQUIRED HINTS ${FAISS_DIR}) - #include(${PROJECT_SOURCE_DIR}/cmake/FindFAISS.cmake) - - if (FAISS_DIR) - message(STATUS "FAISS_DIR = ${FAISS_DIR}") - set(FAISS_INCLUDE_DIRS "${FAISS_DIR}/include") - set(FAISS_LIB_DIR "${FAISS_DIR}/lib") - set(FAISS_LIB64_DIR "${FAISS_DIR}/lib64") - set(FAISS_LIBRARIES "faiss") - else() - message(FATAL_ERROR "Cannot find FAISS. FAISS_DIR is not defined.") - endif() - - ## TODO: we need to make a FindFaiss.cmake - list(APPEND AMS_APP_INCLUDES "${FAISS_INCLUDE_DIRS}") - list(APPEND AMS_APP_LIB_DIRS "${FAISS_LIB_DIR}" "${FAISS_LIB64_DIR}") - list(APPEND AMS_APP_LIBRARIES "${FAISS_LIBRARIES}") - list(APPEND AMS_APP_DEFINES "-D__ENABLE_FAISS__") - - - find_package(OpenMP) - if (OPENMP_FOUND) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") - set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") - endif() -endif() - if (WITH_RZ) find_package(MPI REQUIRED) add_subdirectory(rz) @@ -314,10 +283,6 @@ if (WITH_EXAMPLES) list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_CALIPER__") endif() - if (WITH_FAISS) - list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_FAISS__") - endif() - if (WITH_TORCH) list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_TORCH__") endif() From 776468faffe5a453ac5074b38cc770a0b83e12b9 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 07:55:24 -0800 Subject: [PATCH 022/136] Remove redis from cmake --- CMakeLists.txt | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9005b4e4..e308078d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,6 @@ option(WITH_CALIPER "Use Caliper for Profiling" OFF) option(WITH_TORCH "Use C/C++ Torch interface for Surrogate Model Inference" OFF) option(WITH_TORCH_DEBUG "Compute RMSE of Surrogate Model and Physics Module" OFF) option(WITH_TESTS "Compile tests" OFF) -option(WITH_REDIS "Use REDIS as a database back end" OFF) option(WITH_HDF5 "Use HDF5 as a database back end" OFF) option(WITH_RMQ "Use RabbitMQ as a database back end (require a reachable and running RabbitMQ server service)" OFF) option(WITH_AMS_DEBUG "Enable verbose messages" OFF) @@ -99,39 +98,6 @@ endif() # ------------------------------------------------------------------------------ list(APPEND AMS_APP_DEFINES "-D__ENABLE_DB__") -if (WITH_REDIS) - # Temprorary fix for:= the following error which happens when using Cuda 11.6 and Redis backend - # error: #error The version of CUB in your include path is not compatible with this release of Thrust. - if (WITH_CUDA) - add_compile_definitions(THRUST_IGNORE_CUB_VERSION_CHECK) - endif() - if (HIREDIS_DIR) - find_path(HIREDIS_HEADER NAMES hiredis HINTS ${HIREDIS_DIR} PATH_SUFFIXES include) - find_library(HIREDIS_LIB NAMES hiredis HINTS ${HIREDIS_DIR} PATH_SUFFIXES lib) - else() - find_package(hiredis REQUIRED) - find_path(HIREDIS_HEADER hiredis) - find_library(HIREDIS_LIB hiredis) - endif() - message(STATUS "Hiredis library is ${HIREDIS_LIB}") - message(STATUS "Hiredis headers are ${HIREDIS_HEADER}") - list(APPEND AMS_APP_INCLUDES ${HIREDIS_HEADER}) - list(APPEND AMS_APP_LIBRARIES ${HIREDIS_LIB}) - list(APPEND AMS_APP_DEFINES "-D__ENABLE_REDIS__") - - if (REDIS_PLUS_PLUS_DIR) - find_path(REDIS_PLUS_PLUS_HEADER NAMES sw PATHS ${REDIS_PLUS_PLUS_DIR} PATH_SUFFIXES include) - find_library(REDIS_PLUS_PLUS_LIB NAMES redis++ PATHS ${REDIS_PLUS_PLUS_DIR} PATH_SUFFIXES lib) - else() - find_path(REDIS_PLUS_PLUS_HEADER sw) - find_library(REDIS_PLUS_PLUS_LIB redis++) - endif() - message(STATUS "Redis++ library is ${REDIS_PLUS_PLUS_LIB}") - list(APPEND AMS_APP_INCLUDES ${REDIS_PLUS_PLUS_HEADER}) - list(APPEND AMS_APP_LIBRARIES ${REDIS_PLUS_PLUS_LIB}) -endif() # WITH_REDIS - - if (WITH_HDF5) if (HDF5_USE_STATIC_LIBRARIES) find_package(HDF5 NAMES hdf5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) @@ -257,10 +223,6 @@ if (WITH_EXAMPLES) list(APPEND AMS_EXAMPLE_LIBRARIES "${MFEM_LIBRARIES}") list(APPEND AMS_EXAMPLE_LIB_DIRS "${MFEM_LIB_DIR}") - if (WITH_REDIS) - list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_REDIS__") - endif() - if (WITH_RMQ) list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_RMQ__") list(APPEND AMS_EXAMPLE_INCLUDES ${amqpcpp_INCLUDE_DIR}) From 60c6839618e5a94f13a9ce670a64e427a220d764 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 07:59:04 -0800 Subject: [PATCH 023/136] Enable DB is always on --- CMakeLists.txt | 8 -------- src/AMSlib/wf/basedb.hpp | 2 -- 2 files changed, 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e308078d..a8d82438 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,6 @@ option(WITH_AMS_DEBUG "Enable verbose messages" OFF) option(WITH_PERFFLOWASPECT "Use PerfFlowAspect for Profiling" OFF) option(WITH_WORKFLOW "Install python drivers used by the outer workflow" OFF) option(WITH_AMS_LIB "Install C++ library to support scientific applications" ON) -option(WITH_ADIAK "Use Adiak for recording metadata" OFF) option(BUILD_SHARED_LIBS "Build using shared libraries" ON) if (WITH_MPI) @@ -253,13 +252,6 @@ if (WITH_EXAMPLES) list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_PERFFLOWASPECT__") endif() - if (WITH_ADIAK) - find_package(adiak REQUIRED) - list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_ADIAK__") - list(APPEND AMS_EXAMPLE_INCLUDES ${adiak_INCLUDE_DIR}) - list(APPEND AMS_EXAMPLE_LIBRARIES adiak::adiak) - endif() - add_subdirectory(examples) endif() endif() diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index a2ba0117..8e0d9fc0 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -1786,7 +1786,6 @@ class DBManager uint64_t rId = 0) { -#ifdef __ENABLE_DB__ DBG(DBManager, "Instantiating data base"); if ((dbType == AMSDBType::AMS_CSV || dbType == AMSDBType::AMS_HDF5) && @@ -1815,7 +1814,6 @@ class DBManager default: return nullptr; } -#endif return nullptr; } From 55791ad507d06223521f75a82ba76c6c494f10bb Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 08:34:41 -0800 Subject: [PATCH 024/136] Delete models and clean up amslib test directory --- tests/AMSlib/ConstantOneModel_cpu.pt | Bin 3455 -> 0 bytes tests/AMSlib/ConstantZeroModel_cpu.pt | Bin 3500 -> 0 bytes tests/AMSlib/ams_allocate.cpp | 83 ---------- tests/AMSlib/ams_ete.cpp | 201 ------------------------ tests/AMSlib/ams_ete_env.cpp | 192 ---------------------- tests/AMSlib/ams_update_model.cpp | 123 --------------- tests/AMSlib/ams_uq_model.cpp | 80 ---------- tests/AMSlib/cpu_packing_test.cpp | 184 ---------------------- tests/AMSlib/debug_model.pt | Bin 3255 -> 0 bytes tests/AMSlib/example_faiss.idx | Bin 8045 -> 0 bytes tests/AMSlib/faiss_debug.pt | Bin 16045 -> 0 bytes tests/AMSlib/generate_constant_model.py | 64 -------- tests/AMSlib/generate_faiss.py | 73 --------- tests/AMSlib/generate_tupple_model.py | 97 ------------ tests/AMSlib/gpu_packing_test.cpp | 132 ---------------- tests/AMSlib/lb.cpp | 112 ------------- tests/AMSlib/linear_scripted_cpu.pt | Bin 4022 -> 0 bytes tests/AMSlib/test_hdcache.cpp | 188 ---------------------- tests/AMSlib/torch.duq | Bin 3086 -> 0 bytes tests/AMSlib/torch.duq.cuda | Bin 3121 -> 0 bytes tests/AMSlib/torch_model.cpp | 89 ----------- tests/AMSlib/tuple-single.torchscript | Bin 835986 -> 0 bytes tests/AMSlib/tuple.duq | Bin 1658450 -> 0 bytes tests/AMSlib/tuple.duq.cuda | Bin 1658514 -> 0 bytes tests/AMSlib/uq_max_cpu.pt | Bin 5156 -> 0 bytes tests/AMSlib/uq_max_double_cpu.pt | Bin 5290 -> 0 bytes tests/AMSlib/uq_max_single_cpu.pt | Bin 4842 -> 0 bytes tests/AMSlib/uq_mean_cpu.pt | Bin 5166 -> 0 bytes tests/AMSlib/uq_mean_double_cpu.pt | Bin 5364 -> 0 bytes tests/AMSlib/uq_mean_single_cpu.pt | Bin 4852 -> 0 bytes 30 files changed, 1618 deletions(-) delete mode 100644 tests/AMSlib/ConstantOneModel_cpu.pt delete mode 100644 tests/AMSlib/ConstantZeroModel_cpu.pt delete mode 100644 tests/AMSlib/ams_allocate.cpp delete mode 100644 tests/AMSlib/ams_ete.cpp delete mode 100644 tests/AMSlib/ams_ete_env.cpp delete mode 100644 tests/AMSlib/ams_update_model.cpp delete mode 100644 tests/AMSlib/ams_uq_model.cpp delete mode 100644 tests/AMSlib/cpu_packing_test.cpp delete mode 100644 tests/AMSlib/debug_model.pt delete mode 100644 tests/AMSlib/example_faiss.idx delete mode 100644 tests/AMSlib/faiss_debug.pt delete mode 100644 tests/AMSlib/generate_constant_model.py delete mode 100644 tests/AMSlib/generate_faiss.py delete mode 100644 tests/AMSlib/generate_tupple_model.py delete mode 100644 tests/AMSlib/gpu_packing_test.cpp delete mode 100644 tests/AMSlib/lb.cpp delete mode 100644 tests/AMSlib/linear_scripted_cpu.pt delete mode 100644 tests/AMSlib/test_hdcache.cpp delete mode 100644 tests/AMSlib/torch.duq delete mode 100644 tests/AMSlib/torch.duq.cuda delete mode 100644 tests/AMSlib/torch_model.cpp delete mode 100644 tests/AMSlib/tuple-single.torchscript delete mode 100644 tests/AMSlib/tuple.duq delete mode 100644 tests/AMSlib/tuple.duq.cuda delete mode 100644 tests/AMSlib/uq_max_cpu.pt delete mode 100644 tests/AMSlib/uq_max_double_cpu.pt delete mode 100644 tests/AMSlib/uq_max_single_cpu.pt delete mode 100644 tests/AMSlib/uq_mean_cpu.pt delete mode 100644 tests/AMSlib/uq_mean_double_cpu.pt delete mode 100644 tests/AMSlib/uq_mean_single_cpu.pt diff --git a/tests/AMSlib/ConstantOneModel_cpu.pt b/tests/AMSlib/ConstantOneModel_cpu.pt deleted file mode 100644 index 05131615720cdfe285293d9352121a193b6e50ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3455 zcmbtX3s4hR6x}31$l@0*wF*?RV03DNqVll_L=9q4LPSYXT=QATlDJ`$4OBZIsEFWz z42r02rAoDmUmR@#!B438rGm-X7{R#z0JHwi?%x5}XXf(FJNbszPM(I<8zoO1PeU9s`Psis~cwjt_(aru__A zmM##;QB&BDJ>LD;GlkFdqU?Fs0aSwVJiyvY*{3@G)#qcu25MTj&jotVx_z8@rHaoR z-q*qux(q=`wMM2u5ZKb)Fab?WO=63w=#Ux-hGTdvLCX+3fqMkgA~8CZ3Xw`=%0!7q zjwsY>B|%>(wgYcf7>-Ib1fv(6V^G4uan4G$T&F^{9OE81)UXvMYz(R>;Y1XRRgi?O z%qW8BNKB=L5e+KUVJbO7qPSMAK@z6IgdLkLW&#N<*eQuc38qm5o}<=DRp=t)Q<$(9 z)4(QAf+c2v6>x}v1@>e(;UIw60viFHWDDp58o5y>Q>#>{jKl!#;4qCG)u8e@n2dyp zK@&x!h!`veT!o~VL`w`&0No0v!U#Qu7^;8;HUM&%0TKWLIE7JaxPq3UpfA)(2}dwT zaHx>h>!wMxz$j``Asq=)pl=R%K)!DesSG3o_f6b5@vHc}>3w565H3cCRpWZkL8seB z⁣r3L`?AAMH)t8oXf1ZNKsQn-@c-yRHdgJH{6ues-b2zc`FFD?;>FZaWY08kRY@fb{sjJ;tZ(mrxJuq?I>cpYt`0mCo2IWqsd{v$I5#O&Z8|at-Ol#c^&=MskfAX`quwzhB+UtOc8cvH^eQwtuN_Da!Nn4Rmj|@sd^! z+09<*GJ3f5!8dE0w)ofRb6oIY$CxQ&@!gWB&eY5Z-%-D89OoFj_jzNIv}vtF{-LZnr*D?*Z*8e?ttOL3 z?Rvo@tJ^C5ec`GCSbR73#EJ}uI{u#t7bkplAFGYJbdV?XW;y2NFDt70txcWss55&= za`N|@oQ!3q>C&S4lkYplY*9{NRGrYIlpTMH6?9j%ORu*sr}(t=QHk5nz{kt`P0x9d z&;RtZDbJ=2(Br+nr>?5E3Y24}47+eLyY2SrBmRFqc1=KMZu(-IsD<}oP=k}I?y=+g z@_W~dPOd(6M12WUk4q0ctz209G&g7Hu-udy&)k@1@4sm--#-^XXY&gRNuP1)%q?p9 zCm*6j)gy*yk}XLjGyWD{*QY6 z?lazm!|tq?X9C8qTYn7Odcgg`)Iw*?jI_AcX3>-L6`T`SABN|py}opKv)3(WnC9TS zRI}#nj*AB}u9emO=6Ry_L7iWjeTZ4z@LA8f!G1p$s_uaoCK z(#GrI^RpYO&K#*7av`ZCCv$Y%jp@-r)mwvYb(iO%g=<;-ytUWmKRmixnzmzPHhiN* zmv*l8fa-o-=hIHEHpi#QVX=>TOHt!(_pCv?@97^_@+v}dmHUP2rr)Dm3ZA^Iw?*CR zXC}_PHUDCJ)`kyx6`R6bE4{y-{cXY6oNHVuR~tI=ic|8{I`<|o{raY>Wx{|~XPw5I z2c?Pv4rU?0URbfb;cMt*ja}T0PLJEXI|^oMOE+ig-sJ4S)wej|!hON#x;)D2xtBX& zie@$+98#77iuu^~SJ>SkD~*S&r#sRbtNVZIKT_xu4JXS=E-R8MZq&5iV>m-o-_H01 zRHFq|lh5P4Ba6KZj;P%gyO<6%Q&T9QQOld2(6l=nL%lE?mMx1(hiD08+D4fJf!8tG#LA@-Ty9fL7(LP1fn}I%-(~^ z(qhx2ah4gnA7JqS(EBMnmby&yW1g9=J)lqgf4VHcu$OSAso-X&mBq5E)%ZWfkcpP@ zFeSIM8QxZFcs=PP6xi8)+#})2nEXZ-h#AJes{_^6g5d}oS0G1q#gNNj<2_&{NGn^a Nw}x2YN9{N6{Ra$hDX{4l7)5n@1o zd}eWcT4_#Bd{Sa^c6nk^N_<9ses&>~Uj!RaHYYPLHL<9W8DY8}*cQFKJiXlfl+v8k zVm*i&y?B@dauf5?b5i4txO~8xxe8gpmV=BdPt8ovC@Ex3h8PlGT9TPl%oSghnpB#Z zlM-K&npd1(6klen4Vh54$;Epl3$vXlNt;WXP{!*ORJu7SVnjDa z@=WdDn0MHK$K`tstGl#^X^F`Mz1ZlImsb`jq|El}xsc*;GQ)2Fq(=;#n>-HfeJpFb zpcvJ6%9-NlM)$PreI|>rWju zapmDQ{#Ix4w^I7!imFq8Ue8ezJ^wpNXR{4w7a-wXZg?>u8{@MgcS61cW?`u49kLpQD4(mZL)wD5!}V!|2g zf?ntKPS@QsyB-vdZoCb}=YVk%2n|Q>G9wU#E%}L4NMUdK+D|x zgM1xB;=?^dJmP~xf;|1)<3k*sd|V3|B7m|Cg^aC*Ox_I8)SH!Aq8DF~nVg-I$^}Wk znRz8SnZ>|F#jFvlky;Yu&EU<@UdRHbfUMR+)^>0j+4ym`Ox_Y-cTczcFek%DHz#TLX$>6dJ50*W zPD{;}n{_e3iWtWnJ2Yk<>PYAy$3bTk1%$=KgDT%aorDw)pw`r^dI|n=Fc3m;J`nr7aadTv8`L%D4iJ=c5zeF<0P)k z+{q8tPV%Zrb?e$CbnZ~%EZ&8auT7d$V{NJAZkhObNl5mIR8Pw%Ieb^I=`O99)Yo>w zC|p&M`)^F7eEKO>5vFTJ8=w7aFb)iyyy|U&$tijJ+Ap57cul(_zJHi6edJY6yXh$# z@r^NgCsgn9{j2qUv1ziy^WuU-Sx1xa9+%g7k>wooHyMH_{{r@eW6; z_*c=WcVEB5$L;qQtk6u^vZp8SOS9Tvc2L^7n&!{H1DLKXSn<{C$_(Z>(-x$4R1B%y zjd7(BP&&Z{8kjV}B}=Y8XE>-P17X~43|R(49BwH~Eh+}qk#0`9q`AVF3ltI;=cR`- z0c{510B=SR1#c4~x6Wih5-0$p$%52EL^lb!9ffMr1fZFCOfp0_3AwJ8LvfD*Fg|gc z1d1q#S%}&lxxP|IF-r{CG{J5bMqQ8YK;(+T5XI0qUHuL6)-Im zV?0T954!cp87CUW`Zd7DBGs)&4+lirM9wwJC=TJ^#O)BIT#FuW$QeNv#lR^z4TNUB z0B<%n9jF#LW?i^upgu5w(H5WvFAxZEL1>^pP - -constexpr int ERROR = 1; -constexpr int SUCCESS = 0; - -#include -#include -#include -#include -#include -#include - -#include "../utils.hpp" - -int test_allocation(AMSResourceType resource, std::string pool_name) -{ - std::cout << "Testing Pool: " << pool_name << "\n"; - auto& rm = umpire::ResourceManager::getInstance(); - auto& ams_rm = ams::ResourceManager::getInstance(); - double* data = ams_rm.allocate(1, resource); - auto found_allocator = rm.getAllocator(data); - if (ams_rm.getAllocatorName(resource) != found_allocator.getName()) { - std::cout << "Allocator Name" << ams_rm.getAllocatorName(resource) - << "Actual Allocation " << found_allocator.getName() << "\n"; - return 1; - } - - - if (ams_rm.getAllocatorName(resource) != pool_name) { - std::cout << "Allocator Name" << ams_rm.getAllocatorName(resource) - << "is not equal to pool name " << pool_name << "\n"; - return 1; - } - - ams_rm.deallocate(data, resource); - return 0; -} - -int main(int argc, char* argv[]) -{ - installSignals(); - AMSInit(); - int device = std::atoi(argv[1]); - // Testing with global umpire allocators - auto& ams_rm = ams::ResourceManager::getInstance(); - ams_rm.init(); - if (device == 1) { - if (test_allocation(AMSResourceType::AMS_DEVICE, "DEVICE") != 0) return 1; - } else if (device == 0) { - if (test_allocation(AMSResourceType::AMS_HOST, "HOST") != 0) return 1; - } - - // Testing with pools - - if (device == 1) { - auto& rm = umpire::ResourceManager::getInstance(); - auto alloc_resource = rm.makeAllocator( - "test-device", rm.getAllocator("DEVICE")); - ams_rm.setAllocator("test-device", AMSResourceType::AMS_DEVICE); - if (test_allocation(AMSResourceType::AMS_DEVICE, "test-device") != 0) - return ERROR; - } else if (device == 0) { - auto& rm = umpire::ResourceManager::getInstance(); - auto alloc_resource = rm.makeAllocator( - "test-host", rm.getAllocator("HOST")); - ams_rm.setAllocator("test-host", AMSResourceType::AMS_HOST); - if (test_allocation(AMSResourceType::AMS_HOST, "test-host") != 0) - return ERROR; - } else { - std::cout << "Unknown device type " << device - << "should be either 1 for GPU device or 0 for HOST\n"; - } - - AMSFinalize(); - return 0; -} diff --git a/tests/AMSlib/ams_ete.cpp b/tests/AMSlib/ams_ete.cpp deleted file mode 100644 index ed5a91ad..00000000 --- a/tests/AMSlib/ams_ete.cpp +++ /dev/null @@ -1,201 +0,0 @@ -#ifdef __AMS_ENABLE_MPI__ -#include -#endif -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "AMS.h" -#include "wf/debug.h" - -#include "../utils.hpp" - -void createUmpirePool(std::string parent_name, std::string pool_name) -{ - auto &rm = umpire::ResourceManager::getInstance(); - auto alloc_resource = rm.makeAllocator( - pool_name, rm.getAllocator(parent_name)); -} - - -AMSDType getDataType(char *d_type) -{ - AMSDType dType = AMSDType::AMS_DOUBLE; - if (std::strcmp(d_type, "float") == 0) { - dType = AMSDType::AMS_SINGLE; - } else if (std::strcmp(d_type, "double") == 0) { - dType = AMSDType::AMS_DOUBLE; - } else { - assert(false && "Unknown data type"); - } - return dType; -} - -template -struct Problem { - int num_inputs; - int num_outputs; - int multiplier; - Problem(int ni, int no) : num_inputs(ni), num_outputs(no), multiplier(100) {} - - void run(long num_elements, DType **inputs, DType **outputs) - { - for (int i = 0; i < num_elements; i++) { - DType sum = 0; - for (int j = 0; j < num_inputs; j++) { - sum += inputs[j][i]; - } - - for (int j = 0; j < num_outputs; j++) { - outputs[j][i] = sum; - } - } - } - - - const DType *initialize_inputs(DType *inputs, long length) - { - for (int i = 0; i < length; i++) { - inputs[i] = static_cast(i); - } - return inputs; - } - - void ams_run(AMSExecutor &wf, - AMSResourceType resource, - int iterations, - int num_elements) - { - auto &rm = umpire::ResourceManager::getInstance(); - - for (int i = 0; i < iterations; i++) { - int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; - std::vector inputs; - std::vector outputs; - - // Allocate Input memory - for (int j = 0; j < num_inputs; j++) { - DType *data = new DType[elements]; - inputs.push_back(initialize_inputs(data, elements)); - } - - // Allocate Output memory - for (int j = 0; j < num_outputs; j++) { - outputs.push_back(new DType[elements]); - } - - AMSExecute(wf, - (void *)this, - elements, - reinterpret_cast(inputs.data()), - reinterpret_cast(outputs.data()), - inputs.size(), - outputs.size()); - - for (int i = 0; i < num_outputs; i++) { - delete outputs[i]; - } - - - for (int i = 0; i < num_inputs; i++) { - delete inputs[i]; - } - } - } -}; - -void callBackDouble(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << "Called the double model\n"; - static_cast *>(cls)->run(elements, - (double **)(inputs), - (double **)(outputs)); -} - - -void callBackSingle(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << "Called the single model\n"; - static_cast *>(cls)->run(elements, - (float **)(inputs), - (float **)(outputs)); -} - - -int main(int argc, char **argv) -{ - if (argc != 12) { - std::cout << "Wrong cli\n"; - std::cout << argv[0] - << " use_device(0|1) num_inputs num_outputs model_path " - "data_type(float|double) uq_policy(random|deltaUQ " - "(mean)|deltaUQ (max)) threshold(0) " - "num_iterations avg_num_values db_type(none|csv|hdf5) " - "db_path(path to existing path to store data)"; - return -1; - } - - installSignals(); - AMSInit(); - - int use_device = std::atoi(argv[1]); - int num_inputs = std::atoi(argv[2]); - int num_outputs = std::atoi(argv[3]); - char *model_path = argv[4]; - AMSDType data_type = getDataType(argv[5]); - std::string uq_name = std::string(argv[6]); - const AMSUQPolicy uq_policy = BaseUQ::UQPolicyFromStr(uq_name); - float threshold = std::atof(argv[7]); - int num_iterations = std::atoi(argv[8]); - int avg_elements = std::atoi(argv[9]); - std::string db_type_str = std::string(argv[10]); - std::string fs_path = std::string(argv[11]); - AMSDBType db_type = ams::db::getDBType(db_type_str); - AMSResourceType resource = AMSResourceType::AMS_HOST; - srand(time(NULL)); - - AMSConfigureFSDatabase(db_type, fs_path.c_str()); - - assert((uq_policy == AMSUQPolicy::AMS_DELTAUQ_MAX || - uq_policy == AMSUQPolicy::AMS_DELTAUQ_MEAN || - uq_policy == AMSUQPolicy::AMS_RANDOM) && - "Test only supports duq models"); - - createUmpirePool("HOST", "TEST_HOST"); - AMSSetAllocator(AMSResourceType::AMS_HOST, "TEST_HOST"); - - AMSCAbstrModel model_descr = AMSRegisterAbstractModel( - "test", uq_policy, threshold, model_path, nullptr, "test", -1); - - if (data_type == AMSDType::AMS_SINGLE) { - Problem prob(num_inputs, num_outputs); - - AMSExecutor wf = AMSCreateExecutor(model_descr, - AMSDType::AMS_SINGLE, - resource, - (AMSPhysicFn)callBackSingle, - 0, - 1); - - prob.ams_run(wf, resource, num_iterations, avg_elements); - } else { - Problem prob(num_inputs, num_outputs); - AMSExecutor wf = AMSCreateExecutor(model_descr, - AMSDType::AMS_DOUBLE, - resource, - (AMSPhysicFn)callBackDouble, - 0, - 1); - prob.ams_run(wf, resource, num_iterations, avg_elements); - } - AMSFinalize(); - return 0; -} diff --git a/tests/AMSlib/ams_ete_env.cpp b/tests/AMSlib/ams_ete_env.cpp deleted file mode 100644 index b1331a78..00000000 --- a/tests/AMSlib/ams_ete_env.cpp +++ /dev/null @@ -1,192 +0,0 @@ -#ifdef __AMS_ENABLE_MPI__ -#include -#endif -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "AMS.h" -#include "wf/debug.h" - -#include "../utils.hpp" - -void createUmpirePool(std::string parent_name, std::string pool_name) -{ - auto &rm = umpire::ResourceManager::getInstance(); - auto alloc_resource = rm.makeAllocator( - pool_name, rm.getAllocator(parent_name)); -} - - -AMSDType getDataType(char *d_type) -{ - AMSDType dType = AMSDType::AMS_DOUBLE; - if (std::strcmp(d_type, "float") == 0) { - dType = AMSDType::AMS_SINGLE; - } else if (std::strcmp(d_type, "double") == 0) { - dType = AMSDType::AMS_DOUBLE; - } else { - assert(false && "Unknown data type"); - } - return dType; -} - -template -struct Problem { - int num_inputs; - int num_outputs; - int multiplier; - Problem(int ni, int no) : num_inputs(ni), num_outputs(no), multiplier(100) {} - - void run(long num_elements, DType **inputs, DType **outputs) - { - for (int i = 0; i < num_elements; i++) { - DType sum = 0; - for (int j = 0; j < num_inputs; j++) { - sum += inputs[j][i]; - } - - for (int j = 0; j < num_outputs; j++) { - outputs[j][i] = sum; - } - } - } - - - const DType *initialize_inputs(DType *inputs, long length) - { - for (int i = 0; i < length; i++) { - inputs[i] = static_cast(i); - } - return inputs; - } - - void ams_run(AMSExecutor &wf, - AMSResourceType resource, - int iterations, - int num_elements) - { - auto &rm = umpire::ResourceManager::getInstance(); - - for (int i = 0; i < iterations; i++) { - int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; - std::vector inputs; - std::vector outputs; - - // Allocate Input memory - for (int j = 0; j < num_inputs; j++) { - DType *data = new DType[elements]; - inputs.push_back(initialize_inputs(data, elements)); - } - - // Allocate Output memory - for (int j = 0; j < num_outputs; j++) { - outputs.push_back(new DType[elements]); - } - - AMSExecute(wf, - (void *)this, - elements, - reinterpret_cast(inputs.data()), - reinterpret_cast(outputs.data()), - inputs.size(), - outputs.size()); - - for (int i = 0; i < num_outputs; i++) { - delete[] outputs[i]; - outputs[i] = nullptr; - } - - - for (int i = 0; i < num_inputs; i++) { - delete[] inputs[i]; - inputs[i] = nullptr; - } - } - } -}; - -void callBackDouble(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << "Called the double model\n"; - static_cast *>(cls)->run(elements, - (double **)(inputs), - (double **)(outputs)); -} - - -void callBackSingle(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << "Called the single model\n"; - static_cast *>(cls)->run(elements, - (float **)(inputs), - (float **)(outputs)); -} - - -int main(int argc, char **argv) -{ - - if (argc != 9) { - std::cout << "Wrong cli\n"; - std::cout << argv[0] - << " use_device(0|1) num_inputs num_outputs " - "data_type(float|double)" - "num_iterations avg_num_values 'model-name-1' 'model-name-2'"; - return -1; - } - - installSignals(); - AMSInit(); - - int use_device = std::atoi(argv[1]); - int num_inputs = std::atoi(argv[2]); - int num_outputs = std::atoi(argv[3]); - AMSDType data_type = getDataType(argv[4]); - int num_iterations = std::atoi(argv[5]); - int avg_elements = std::atoi(argv[6]); - const char *model1 = argv[7]; - const char *model2 = argv[8]; - AMSResourceType resource = AMSResourceType::AMS_HOST; - srand(time(NULL)); - - - createUmpirePool("HOST", "TEST_HOST"); - AMSSetAllocator(AMSResourceType::AMS_HOST, "TEST_HOST"); - - AMSCAbstrModel models[] = {AMSQueryModel(model1), AMSQueryModel(model2)}; - - for (int i = 0; i < 2; i++) { - if (data_type == AMSDType::AMS_SINGLE) { - Problem prob(num_inputs, num_outputs); - AMSExecutor wf = AMSCreateExecutor(models[i], - AMSDType::AMS_SINGLE, - resource, - (AMSPhysicFn)callBackSingle, - 0, - 1); - - prob.ams_run(wf, resource, num_iterations, avg_elements); - } else { - Problem prob(num_inputs, num_outputs); - AMSExecutor wf = AMSCreateExecutor(models[i], - AMSDType::AMS_DOUBLE, - resource, - (AMSPhysicFn)callBackDouble, - 0, - 1); - prob.ams_run(wf, resource, num_iterations, avg_elements); - } - } - - AMSFinalize(); - return 0; -} diff --git a/tests/AMSlib/ams_update_model.cpp b/tests/AMSlib/ams_update_model.cpp deleted file mode 100644 index 9a1b1c2d..00000000 --- a/tests/AMSlib/ams_update_model.cpp +++ /dev/null @@ -1,123 +0,0 @@ -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "../utils.hpp" - -#define SIZE (32L) - -template -bool inference(SurrogateModel &model, - AMSResourceType resource, - std::string update_path) -{ - using namespace ams; - - std::vector inputs; - std::vector outputs; - auto &ams_rm = ams::ResourceManager::getInstance(); - - for (int i = 0; i < 2; i++) - inputs.push_back(ams_rm.allocate(SIZE, resource)); - - for (int i = 0; i < 4 * 2; i++) - outputs.push_back(ams_rm.allocate(SIZE, resource)); - - for (int repeat = 0; repeat < 2; repeat++) { - model.evaluate( - SIZE, inputs.size(), 4, inputs.data(), &(outputs.data()[repeat * 4])); - if (repeat == 0) model.update(update_path); - } - - // Verify - bool errors = false; - for (int i = 0; i < 4; i++) { - T *first_model_out = outputs[i]; - T *second_model_out = outputs[i + 4]; - if (resource == AMSResourceType::AMS_DEVICE) { - first_model_out = ams_rm.allocate(SIZE, AMSResourceType::AMS_HOST); - second_model_out = ams_rm.allocate(SIZE, AMSResourceType::AMS_HOST); - ams_rm.copy(outputs[i], - resource, - first_model_out, - AMSResourceType::AMS_HOST, - SIZE); - ams_rm.copy(outputs[i + 4], - resource, - second_model_out, - AMSResourceType::AMS_HOST, - SIZE); - } - - for (int j = 0; j < SIZE; j++) { - if (first_model_out[j] != 1.0) { - errors = true; - std::cout << "One Model " << first_model_out << " " << j << " " - << first_model_out[j] << "\n"; - } - if (second_model_out[j] != 0.0) { - std::cout << "Zero Model " << second_model_out << " " << j << " " - << second_model_out[j] << "\n"; - errors = true; - } - } - - if (resource == AMSResourceType::AMS_DEVICE) { - ams_rm.deallocate(first_model_out, AMSResourceType::AMS_HOST); - ams_rm.deallocate(second_model_out, AMSResourceType::AMS_HOST); - } - } - - for (int i = 0; i < 2; i++) - ams_rm.deallocate(const_cast(inputs[i]), resource); - - for (int i = 0; i < 4 * 2; i++) - ams_rm.deallocate(outputs[i], resource); - - return errors; -} - - -int main(int argc, char *argv[]) -{ - using namespace ams; - installSignals(); - AMSInit(); - - auto &ams_rm = ams::ResourceManager::getInstance(); - int use_device = std::atoi(argv[1]); - std::string data_type(argv[2]); - std::string zero_model(argv[3]); - std::string one_model(argv[4]); - - AMSResourceType resource = AMSResourceType::AMS_HOST; - if (use_device == 1) { - resource = AMSResourceType::AMS_DEVICE; - } - - int ret = 0; - if (data_type.compare("double") == 0) { - std::shared_ptr> model = - SurrogateModel::getInstance(one_model, resource); - assert(model->is_double()); - ret = inference(*model, resource, zero_model); - } else if (data_type.compare("single") == 0) { - std::shared_ptr> model = - SurrogateModel::getInstance(one_model, resource); - assert(!model->is_double()); - ret = inference(*model, resource, zero_model); - } - std::cout << "Zero Model is " << zero_model << "\n"; - std::cout << "One Model is " << one_model << "\n"; - AMSFinalize(); - return ret; -} diff --git a/tests/AMSlib/ams_uq_model.cpp b/tests/AMSlib/ams_uq_model.cpp deleted file mode 100644 index 0c033f39..00000000 --- a/tests/AMSlib/ams_uq_model.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../utils.hpp" - -#define SIZE (32L * 1024L + 3L) - -template -void model(UQ &model, - AMSResourceType resource, - int num_inputs, - int num_outputs) -{ - std::vector inputs; - std::vector outputs; - auto &ams_rm = ams::ResourceManager::getInstance(); - - for (int i = 0; i < num_inputs; i++) - inputs.push_back(ams_rm.allocate(SIZE, resource)); - - for (int i = 0; i < num_outputs; i++) - outputs.push_back(ams_rm.allocate(SIZE, resource)); - - bool *predicates = ams_rm.allocate(SIZE, resource); - - std::cout << "We are calling evaluate\n"; - model.evaluate(SIZE, inputs, outputs, predicates); - - - for (int i = 0; i < num_inputs; i++) - ams_rm.deallocate(const_cast(inputs[i]), resource); - - for (int i = 0; i < num_outputs; i++) - ams_rm.deallocate(outputs[i], resource); - - ams_rm.deallocate(predicates, resource); -} - - -int main(int argc, char *argv[]) -{ - using namespace ams; - installSignals(); - AMSInit(); - - auto &ams_rm = ResourceManager::getInstance(); - int use_device = std::atoi(argv[1]); - std::string model_path(argv[2]); - std::string data_type(argv[3]); - std::string uq_path; - int num_inputs = std::atoi(argv[4]); - int num_outputs = std::atoi(argv[5]); - const AMSUQPolicy uq_policy = static_cast(std::atoi(argv[6])); - float threshold = std::atof(argv[7]); - - std::cout << "Executing on device " << use_device << "\n"; - - AMSResourceType resource = AMSResourceType::AMS_HOST; - if (use_device == 1) { - resource = AMSResourceType::AMS_DEVICE; - } - - if (data_type.compare("double") == 0) { - UQ UQModel(resource, uq_policy, uq_path, -1, model_path, threshold); - model(UQModel, resource, num_inputs, num_outputs); - } else if (data_type.compare("single") == 0) { - UQ UQModel(resource, uq_policy, uq_path, -1, model_path, threshold); - model(UQModel, resource, num_inputs, num_outputs); - } - AMSFinalize(); - return 0; -} diff --git a/tests/AMSlib/cpu_packing_test.cpp b/tests/AMSlib/cpu_packing_test.cpp deleted file mode 100644 index a84eaa3d..00000000 --- a/tests/AMSlib/cpu_packing_test.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#include - -#include -#include -#include -#include -#include - -#include "../utils.hpp" - -#define SIZE (32 * 1024 + 1) - -void initPredicate(bool* ptr, double* data, int size) -{ - for (int i = 0; i < size; i++) { - ptr[i] = i % 2 == 0; - data[i] = i; - } -} - -int verify(double* dense, int size, int flag) -{ - for (int i = 0; i < size; i++) { - if (dense[i] != (i * 2 + (!flag))) { - std::cout << i << " Expected " << i * 2 << " gotten " << dense[i] << "\n"; - return 1; - } - } - return 0; -} - -int verify(bool* pred, double* d1, double* d2, int size, int flag) -{ - for (int i = 0; i < size; i++) { - if ((pred[i] == flag) && d1[i] != d2[i]) { - std::cout << pred[i] << " dense " << d1[i] << " sparse " << d2[i] << "\n"; - return 1; - } - } - return 0; -} - -int main(int argc, char* argv[]) -{ - using namespace ams; - installSignals(); - AMSInit(); - - using data_handler = DataHandler; - const size_t size = SIZE; - int device = std::atoi(argv[1]); - auto& rm = ams::ResourceManager::getInstance(); - rm.init(); - if (device == 0) { - AMSResourceType resource = AMSResourceType::AMS_HOST; - bool* predicate = rm.allocate(SIZE, resource); - double* dense = rm.allocate(SIZE, resource); - double* sparse = rm.allocate(SIZE, resource); - double* rsparse = rm.allocate(SIZE, resource); - - initPredicate(predicate, sparse, SIZE); - std::vector s_data({const_cast(sparse)}); - std::vector sr_data({rsparse}); - std::vector d_data({dense}); - int elements; - - for (int flag = 0; flag < 2; flag++) { - elements = - data_handler::pack(resource, predicate, size, s_data, d_data, flag); - - if (elements != (SIZE + flag) / 2) { - std::cout << "Did not compute dense number correctly " << elements - << "\n"; - return 1; - } - - if (verify(dense, elements, flag)) { - std::cout << "Dense elements do not have the correct values\n"; - return 1; - } - - data_handler::unpack(resource, predicate, size, d_data, sr_data, flag); - - if (verify(predicate, sparse, rsparse, size, flag)) { - std::cout << "Unpacking packed data does not match initial values\n"; - return 1; - } - } - - rm.deallocate(predicate, AMSResourceType::AMS_HOST); - rm.deallocate(dense, AMSResourceType::AMS_HOST); - rm.deallocate(sparse, AMSResourceType::AMS_HOST); - rm.deallocate(rsparse, AMSResourceType::AMS_HOST); - } else if (device == 1) { - AMSResourceType resource = AMSResourceType::AMS_DEVICE; - bool* h_predicate = rm.allocate(SIZE, AMSResourceType::AMS_HOST); - double* h_dense = rm.allocate(SIZE, AMSResourceType::AMS_HOST); - double* h_sparse = rm.allocate(SIZE, AMSResourceType::AMS_HOST); - double* h_rsparse = rm.allocate(SIZE, AMSResourceType::AMS_HOST); - - initPredicate(h_predicate, h_sparse, SIZE); - - bool* predicate = rm.allocate(SIZE, resource); - double* dense = rm.allocate(SIZE, resource); - double* sparse = rm.allocate(SIZE, resource); - double* rsparse = rm.allocate(SIZE, resource); - int* reindex = rm.allocate(SIZE, resource); - - rm.copy(h_predicate, - AMSResourceType::AMS_HOST, - predicate, - AMSResourceType::AMS_DEVICE, - SIZE); - rm.copy(h_sparse, - AMSResourceType::AMS_HOST, - sparse, - AMSResourceType::AMS_DEVICE, - SIZE); - - std::vector s_data({const_cast(sparse)}); - std::vector sr_data({rsparse}); - std::vector d_data({dense}); - - for (int flag = 0; flag < 2; flag++) { - int elements; - elements = - data_handler::pack(resource, predicate, size, s_data, d_data, flag); - - if (elements != (SIZE + flag) / 2) { - std::cout << "Did not compute dense number correctly(" << elements - << ")\n"; - return 1; - } - - rm.copy(dense, - AMSResourceType::AMS_DEVICE, - h_dense, - AMSResourceType::AMS_HOST, - elements); - - if (verify(h_dense, elements, flag)) { - std::cout << "Dense elements do not have the correct values\n"; - return 1; - } - - data_handler::unpack(resource, predicate, size, d_data, sr_data, flag); - - rm.copy(rsparse, - AMSResourceType::AMS_DEVICE, - h_rsparse, - AMSResourceType::AMS_HOST, - size); - - if (verify(h_predicate, h_sparse, h_rsparse, size, flag)) { - // for ( int k = 0; k < SIZE; k++){ - // std::cout << k << " " << h_sparse[k] << " " << h_rsparse[k] << - // "\n"; - // } - std::cout << "Unpacking packed data does not match initial values\n"; - return 1; - } - } - - rm.deallocate(predicate, AMSResourceType::AMS_DEVICE); - rm.deallocate(h_predicate, AMSResourceType::AMS_HOST); - rm.deallocate(dense, AMSResourceType::AMS_DEVICE); - rm.deallocate(h_dense, AMSResourceType::AMS_HOST); - rm.deallocate(sparse, AMSResourceType::AMS_DEVICE); - rm.deallocate(h_sparse, AMSResourceType::AMS_HOST); - rm.deallocate(rsparse, AMSResourceType::AMS_DEVICE); - rm.deallocate(h_rsparse, AMSResourceType::AMS_HOST); - rm.deallocate(reindex, AMSResourceType::AMS_DEVICE); - } - - AMSFinalize(); - return 0; -} diff --git a/tests/AMSlib/debug_model.pt b/tests/AMSlib/debug_model.pt deleted file mode 100644 index 28b510db3fda51236314c619a557946109704e7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3255 zcmbVO2~ZPP7+w;Nun-Oj9<(|g4+ym6P_a`1gFvIW0s*Q96k|vN350}AHYko-g$glv za*6f8t5vL6rz2E~f+7MUQW>#WLTVb|Mz|0e{c|@ zDFl&7(1^Ukk#+N|=cU@DMpj5z z`R%sK?6QG)&a2=(-K^Vlom{qrwz8@g_6N+P1KtW`EsgNVCtmerjo z{VDOmjxue0XCp&C0kPq0^!Oa1sUzc~CB#YDzEehza5F)`<6&}zK+NO8y5kNN#VABd zr9>`+QOI@6Mk*I)2UGARGKnk(HBoaXg5Nxek{7L#N_kOyLEKutLdX-#<#8w>h-(g> z>X1<4FgQ)?geH^G0GleQNJ-P#z)Q6p!>Fm&6~1|`ND?E)P&0vU3r~efq)M2l5JjmZ zQXvl$$&_*hFL5@Enp3G<3$Q~8Ecr1a)Izrf_Lr-oq@pn0zc5PTngAmPYRM&nyC6Y@ z!UzcqL9GyoikKn{7Rhd1CO{>&gAj z6Xws!pBOiLru*vqLCZLK6JEZHUfNOW32$Z z{#(FCq6plD#8xou{QH!e%1^B*_HuHj!%Si3J-csDmb~XWUgbr=ku)B(yHjo z!S02WqkE%IA2iKYB)Is5wyPcJEgx4;`zX>S@r?;Cm-f^~!4ts4x-pZ^2XgzLTvqFep{G^1}w~+CyxghCOZme!9Af`K8zS6waZ-IrVb`GNpydtpTjmyz6qo zFHJX67F~uPXFMFtV3j?bb)ln@ooBr*&h^Og;MHM2@-TXehrGXGrfDVn%A>0`&B#`# zKpQq6vvp|5JH}m_n=^geR*wX)^NVxWR4v)UBLBQ<@<2j)yY&;bs;Rhodhg<1_XQ94 z#aiUdaJHQr?QB+eX5pipCHDQ^jM~bAa-v*7T;8cpwqrP@SI>6c{nqXNooDA#ZoE^~ z`EOrexar)s3saOXS)0vJd1KGc<8_?-4U^AzS+zcE$(dn8-W%S3;(W=$WKZ8ZzZ~jc z;QYwkyn~Gjm_~EgT+4}&o(*!xig$pP$^z=*Gj|kKA8Gw zO6QHcmdTnviv?e<{dM20>I&O+y_$~o+?KZb*rv&)dzu;#WBeB_8v-Z26~1V|vR_>~ zMvjO@vJ>0uPn|uq9&^r1!iu^#ls=4ocJp-kgW{r95{F%N?Y~P)0#^*!;u?vl2#whe z^l=BYmC<{x6ZDy}Mr2BiFT<3&hD#kM`wVfj1X?jqaBM%{TO$C{o~! zn(aGp+#U@Jz#JHV>-s}6%Lu?TzBq^petSQY=}$)v_ydE>plazRv=IP$45b4HF*pBg$Z{Id{rw(buD$-bU(pI3f-;8w0Q>N15?W@hvjge^>0pM> Nq>v@};PyJ(zX6(^5rhB$ diff --git a/tests/AMSlib/example_faiss.idx b/tests/AMSlib/example_faiss.idx deleted file mode 100644 index e3f07e66367c7f231e802728d64f5f25a2ed596e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8045 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 diff --git a/tests/AMSlib/faiss_debug.pt b/tests/AMSlib/faiss_debug.pt deleted file mode 100644 index 7ea0c6eb5809890f632b40bd05c1374800999032..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16045 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 Tuple[Tensor, Tensor]: - outer_dim = y.shape[0] - fake_uq_dim = fake_uq.shape[0] - tmp = fake_uq.clone().detach() - additional_dims = torch.div(outer_dim, fake_uq_dim, rounding_mode="floor") + outer_dim % fake_uq_dim - final_shape = (additional_dims * fake_uq_dim, *fake_uq.shape[1:]) - tmp = tmp.unsqueeze(0) - my_list = [1] * len(fake_uq.shape) - new_dims = (additional_dims, *my_list) - tmp = tmp.repeat(new_dims) - tmp = tmp.reshape(final_shape) - std = tmp[: y.shape[0], ...] - return y, std - - -class TuppleModel(torch.nn.Module): - def __init__(self, inputSize, outputSize, fake_uq): - super(TuppleModel, self).__init__() - self.linear = torch.nn.Linear(inputSize, outputSize) - self.linear.weight.data.fill_(0.0) - self.linear.bias.data.fill_(0.0) - self.fake_uq = torch.nn.Parameter(fake_uq, requires_grad=False) - - def forward(self, x): - y = self.linear(x) - return to_tupple(y, self.fake_uq) - - -def main(args): - inputDim = int(args[1]) - outputDim = int(args[2]) - device = args[3] - uq_type = args[4] - precision = args[5] - output_name = args[6] - enable_cuda = True - if device == "cuda": - enable_cuda = True - suffix = "_gpu" - elif device == "cpu": - enable_cuda = False - suffix = "_cpu" - prec = torch.float32 - if precision == "double": - prec = torch.double - - fake_uq = torch.rand(2, outputDim, dtype=prec) - if uq_type == "mean": - # This sets odd uq to less than 0.5 - fake_uq[0, ...] *= 0.5 - # This sets even uq to larger than 0.5 - fake_uq[1, ...] = 0.5 + 0.5 * (fake_uq[1, ...]) - elif uq_type == "max": - max_val = torch.max(fake_uq, axis=1).values - scale = 0.49 / max_val - fake_uq *= scale.unsqueeze(0).T - fake_uq[0, int(outputDim / 2)] = 0.51 - else: - print("Unknown uq type") - sys.exit() - if precision == "double": - model = TuppleModel(inputDim, outputDim, fake_uq).double() - else: - model = TuppleModel(inputDim, outputDim, fake_uq) - - if torch.cuda.is_available() and enable_cuda: - model = model.cuda() - - model.eval() - - data = torch.randn(1023, inputDim, dtype=prec) - - with torch.jit.optimized_execution(True): - traced = torch.jit.trace(model, (torch.randn(inputDim, dtype=prec).to(device),)) - traced.save(f"{output_name}") - - data = torch.zeros(2, inputDim, dtype=prec) - inputs = Variable(data.to(device)) - model = jit.load(f"{output_name}") - model.eval() - with torch.no_grad(): - print("Ouput", model(inputs)) - - -if __name__ == "__main__": - main(sys.argv) diff --git a/tests/AMSlib/gpu_packing_test.cpp b/tests/AMSlib/gpu_packing_test.cpp deleted file mode 100644 index 63635ded..00000000 --- a/tests/AMSlib/gpu_packing_test.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#include -#include -#include -#include - -#include "utils/allocator.hpp" -#include "utils/utils_data.hpp" - -#include "../utils.hpp" - -// All allocations and operations will happen on top of this 'SIZE'. -// Keep a small value for test to be 'fast'. -#define SIZE (3280) - -void initPredicate(bool* ptr, double* data, int size) -{ - for (int i = 0; i < size; i++) { - ptr[i] = i % 2 == 0; - data[i] = i; - } -} - -int verify(double* dense, int size) -{ - for (int i = 0; i < size; i++) { - if (dense[i] != i * 2) { - return 1; - } - } - return 0; -} - -int verify(bool* pred, double* d1, double* d2, int size) -{ - for (int i = 0; i < size; i++) { - if (pred[i] && d1[i] != d2[i]) { - std::cout << i << " " << d1[i] << " " << d2[i] << "\n"; - return 1; - } - } - return 0; -} - -int main(int argc, char* argv[]) -{ - using namespace ams; - installSignals(); - AMSInit(); - - using data_handler = DataHandler; - auto& rm = umpire::ResourceManager::getInstance(); - auto& ams_rm = ams::ResourceManager::getInstance(); - const size_t size = SIZE; - int dims = std::atoi(argv[1]); - - bool* h_predicate = - ams_rm.allocate(SIZE, - ResourceManager::ResourceType::HOST); - double* h_dense = ams_rm.allocate( - SIZE, ResourceManager::ResourceType::HOST); - double* h_sparse = ams_rm.allocate( - SIZE, ResourceManager::ResourceType::HOST); - double* h_rsparse = ams_rm.allocate( - SIZE, ResourceManager::ResourceType::HOST); - - initPredicate(h_predicate, h_sparse, SIZE); - - bool* predicate = ams_rm.allocate(SIZE); - double* dense = ams_rm.allocate(SIZE); - double* sparse = ams_rm.allocate(SIZE); - double* rsparse = ams_rm.allocate(SIZE); - int* reindex = ams_rm.allocate(SIZE); - - rm.copy(predicate, h_predicate); - rm.copy(sparse, h_sparse); - - std::vector s_data({sparse}); - std::vector sr_data({rsparse}); - std::vector d_data({dense}); - - int elements; - if (use_reindex) - elements = data_handler::pack(predicate, reindex, size, s_data, d_data); - else - elements = data_handler::pack(predicate, size, s_data, d_data); - - if (elements != (SIZE + 1) / 2) { - std::cout << "Did not compute dense number correctly(" << elements << ")\n"; - return 1; - } - - rm.copy(h_dense, dense); - if (verify(h_dense, elements)) { - std::cout << "Dense elements do not have the correct values\n"; - return 1; - } - - if (use_reindex) - data_handler::unpack(reindex, elements, d_data, sr_data); - else - data_handler::unpack(predicate, size, d_data, sr_data); - - rm.copy(h_rsparse, rsparse); - if (verify(h_predicate, h_sparse, h_rsparse, size)) { - std::cout << "Unpacking packed data does not match initial values\n"; - return 1; - } - - ams_rm.deallocate(predicate); - ams_rm.deallocate(h_predicate, - ResourceManager::ResourceType::HOST); - ams_rm.deallocate(dense); - ams_rm.deallocate(h_dense, - ResourceManager::ResourceType::HOST); - ams_rm.deallocate(sparse); - ams_rm.deallocate(h_sparse, - ResourceManager::ResourceType::HOST); - ams_rm.deallocate(rsparse); - ams_rm.deallocate(h_rsparse, - ResourceManager::ResourceType::HOST); - ams_rm.deallocate(reindex); - - AMSFinalize(); - return 0; -} diff --git a/tests/AMSlib/lb.cpp b/tests/AMSlib/lb.cpp deleted file mode 100644 index a48749a5..00000000 --- a/tests/AMSlib/lb.cpp +++ /dev/null @@ -1,112 +0,0 @@ -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "wf/redist_load.hpp" - -#include "../utils.hpp" - -#define SIZE (10) - -void init(double *data, int elements, double value) -{ - for (int i = 0; i < elements; i++) { - data[i] = value; - } -} - -void evaluate(double *data, double *src, int elements) -{ - auto &rm = ams::ResourceManager::getInstance(); - rm.copy(src, data, elements * sizeof(double)); -} - -int verify(double *data, double *src, int elements, int rId) -{ - return std::memcmp(data, src, elements * sizeof(double)); -} - -int main(int argc, char *argv[]) -{ - using namespace ams; - int device = std::atoi(argv[1]); - - installSignals(); - AMSInit(); - - MPI_Init(&argc, &argv); - AMSSetupAllocator(AMSResourceType::AMS_HOST); - AMSResourceType resource = AMSResourceType::AMS_HOST; - AMSSetDefaultAllocator(AMSResourceType::AMS_HOST); - int rId, wS; - MPI_Comm_size(MPI_COMM_WORLD, &wS); - MPI_Comm_rank(MPI_COMM_WORLD, &rId); - srand(rId); - std::default_random_engine generator; - std::normal_distribution distribution(0.5, 0.3); - srand(rId); - double threshold; - for (int i = 0; i <= rId; i++) { - threshold = distribution(generator); - } - - int computeElements = (threshold * SIZE); // / sizeof(double); - - double *srcData, *destData; - double *srcHData = srcData = - ResourceManager::allocate(computeElements, - AMSResourceType::AMS_HOST); - double *destHData = destData = - ResourceManager::allocate(computeElements, - AMSResourceType::AMS_HOST); - - init(srcHData, computeElements, static_cast(rId)); - - if (device == 1) { - AMSSetupAllocator(AMSResourceType::AMS_DEVICE); - AMSSetDefaultAllocator(AMSResourceType::AMS_DEVICE); - resource = AMSResourceType::AMS_DEVICE; - srcData = ResourceManager::allocate(computeElements, - AMSResourceType::AMS_DEVICE); - destData = ResourceManager::allocate(computeElements, - AMSResourceType::AMS_DEVICE); - } - - std::vector inputs({srcData}); - std::vector outputs({destData}); - - { - - std::cerr << "Resource is " << resource << "\n"; - AMSLoadBalancer lBalancer( - rId, wS, computeElements, MPI_COMM_WORLD, 1, 1, resource); - lBalancer.scatterInputs(inputs, resource); - double **lbInputs = lBalancer.inputs(); - double **lbOutputs = lBalancer.outputs(); - evaluate(*lbOutputs, *lbInputs, lBalancer.getBalancedSize()); - lBalancer.gatherOutputs(outputs, resource); - } - - if (device == 1) { - ResourceManager::copy(destData, - destHData, - computeElements * sizeof(double)); - ResourceManager::deallocate(destData, AMSResourceType::AMS_DEVICE); - ResourceManager::deallocate(srcData, AMSResourceType::AMS_DEVICE); - } - - int ret = verify(destHData, srcHData, computeElements, rId); - - ResourceManager::deallocate(destHData, AMSResourceType::AMS_HOST); - ResourceManager::deallocate(srcHData, AMSResourceType::AMS_HOST); - - MPI_Finalize(); - AMSFinalize(); - return ret; -} diff --git a/tests/AMSlib/linear_scripted_cpu.pt b/tests/AMSlib/linear_scripted_cpu.pt deleted file mode 100644 index fe67b26d409779b164374aa26ff02de4b92b7765..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4022 zcmbtX30PCd7QSo&A_lC03Mt5@gkr*)ih!e0*`f%Fnj#oN5=bN@WI<6uw1`hCs8}fC z0u>Q857}f9L9dZTgcoHK6{08wOI?7nD7IC5Lwpq!Z2da<=9?sU&VOdk@}F~k$SSH3 zq@e+QGz=gOh{NVGX#%Q{E?`H9m<%dCB9g$MiD(2HH(JC#1E^W(7e@=ufSbk7R9pr1pp-;xe<`j4$1VkI-OiPQJJMp8^A>sF*!uLh zbdx$zep=si+2cx3TH0!4XO;(lk^Stz7D@xWXR~$YPnE4;P)1Ac)qn)w01cxO)QVAymJdq(LPo@dZY$EIh~3*yK1qNEo~qHbHkk= zE(Hl&JN0UXQsC6aF;{tB58p>UH!ZJ{0GC0B!F-P<7%zA-JEr+MXeLNT${e#`yN&BS z@AuS!fjL4kV@4JH-yJJb{dP9PT}qWYN30}pxANSQ15V8#)%WX{#H8ck%!mmWR?UIG z1ZNvE^&0@S$U2L*vK5$1&dtf8G{Y#H(c%2zMxYt+qDka;5_HF0Bh%MsKotOVVuj{U8Y@iAXNNllWnpD=54}xru0a_f_PHk zyetWL&@<>Y$jOE;lnuw8POF70vMf!0_C5sDcHAs%d0PuOo3?w5FE3kN4F)$hm^bFv zg8jr7;lkDyP&Ox?JKEa{R7$H~zgQ#&N*11K-pAWOT3uyfRBb6Rzn6PL=-&o@-<+t_ z8(j#@y>dmD*ENCkzpYk5~h%k;D$?7w1 zvP+pxrHXh0I*Uq0E7ElhGgQD73fVj^nh)W2$5>M2*)0;#*jzR@l&_RP(MNt$*+Oba zB!@!{rqRQ;(gX}Di^mJ&D|=H=$WsLpU*$bGeoP6T%f*ND7?B*N5U<#SUOC1QXuj&0 zD!K4hCOecR;;YdWBGgC`n zAQ3MG_|sW9qzQRkmlOPMlx=B zV6f!!4okI{+&4Q}Cq|%ym>0UKr{gm_na`~*bn|}1`pZ&vyuM$~3OVbTfAzXS`|X)> zTN=--qQZz@Tt8_`0%ZQrY>8(eaTZD)%cQw~Yt>bWWOB8QZhXtlQ8ZVUz%6RVct$q;@^$ zLw&sKB!Fbwa?W7H$NPqKKzq^oZ&wIrq<6H(=CzfG_DWuwJCue@w7KD%gXnVF}3lxPPzTJ=)WSqMeOhVN&CA(`v1WGgt3$- zaJhtcEJ0AP#8`}fF^M-KeJZ$BHd?YFy*={{BOJ?6&4p__a2s_ridNN-bn6>cmcG5B z`&>V8QF5iTk@5Fm<0KVk4u!8ZgumXMt`42wFjM-aeQmZQ_L0n`F)&Rw+?aUN{J^ZH zq?&fBZ#?l!tq78riQSr!*r(VeGxrU(wK~xye9w-q%SKYsjw1`7TI?|#%G^CLTw)rA zW$&Mtw(s^cY4We3?ys&1Gt)5^ZyR76a7xWE*pWALyYoPwQ#HHE-_vjT6TGoUeZ#WW z7ik$4Pe)6-GtCx7ZNJ~L^zQ3kGrzEsb)>rI&H+Ltv%#aP9e2amfA!`yx0OuYI*J-A zchkP|>__aK`AK`bL)d?3@9}vsdlJhlSj5$vOs-m@^Pqa`&fV9sYgt9U+bmz70yZNfo8!w%E;n(WNj^D;``d;UQ> z7Q-{{Q;o>li@LV&kC3~om<;Z%Y2^o)k1ek~4m>tk)U4uc9-vo5ueehY8Kh}{Np`RO z@bV3ZJIoIHdI$f)NeZl3^=sQ6{2(~gNQtyAoE789rQkI0#0QA&yfv{X``P&^9a*Qz zqlT$!)ERkt!N|f< z-cFl9c2oG1D-_YVBB7%8BAwM_hx-Wf zecpcv9x{%2Tql5QBfZPtgMWhDKU6h7C)_8fiq-s=sy@8m`$!v~111xcuAVlP(s9YB zxWjw6@j-1k0j_llxOZvfLq?&j-w7D0Eci - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "../utils.hpp" - -template -std::vector generate_vectors(const int num_clusters, - int elements, - int dims) -{ - std::vector v_data; - auto &rm = ams::ResourceManager::getInstance(); - // This are fixed to mimic the way the faiss was generated - // The code below generates data values that are either within - // the distance of the faiss index or just outside of it. - const T distance = 10.0; - const T offset = 5.0; - for (int i = 0; i < dims; i++) { - T *data = - rm.allocate(num_clusters * elements, AMSResourceType::AMS_HOST); - for (int j = 0; j < elements; j++) { - // Generate a value for every cluster center - for (int k = 0; k < num_clusters; k++) { - T tmp = ((T)rand()) / INT_MAX; - tmp += (k + 1) * num_clusters; - if ((j % 2) == 0) { - tmp += offset; - } - data[j * num_clusters + k] = tmp; - } - } - v_data.push_back(data); - } - return std::move(v_data); -} - -template -void print_vectors(std::vector &vec, int num_elements, int num_clusters) -{ - for (int i = 0; i < num_elements; i++) { - for (int c = 0; c < num_clusters; c++) { - for (auto v : vec) { - std::cout << v[i * num_clusters + c] << ":"; - } - std::cout << "\n"; - } - } -} - - -bool validate(const int num_clusters, const int elements, bool *predicates) -{ - bool res = true; - for (int j = 0; j < elements; j++) { - // Generate a value for every cluster center - for (int k = 0; k < num_clusters; k++) { - if (j % 2 == 0 && predicates[j * num_clusters + k] == true) { - res = false; - } else if (j % 2 == 1 && predicates[j * num_clusters + k] == false) { - res = false; - } - } - } - return res; -} - -template -bool do_faiss(std::shared_ptr> &index, - AMSResourceType resource, - int nClusters, - int nDims, - int nElements, - float threshold) -{ - - std::vector orig_data = - generate_vectors(nClusters, nElements, nDims); - std::vector data = orig_data; - auto &rm = ams::ResourceManager::getInstance(); - - bool *predicates = rm.allocate(nClusters * nElements, resource); - - if (resource == AMSResourceType::AMS_DEVICE) { - for (int i = 0; i < orig_data.size(); i++) { - T *d_data = rm.allocate(nClusters * nElements, resource); - rm.copy(const_cast(orig_data[i]), - AMSResourceType::AMS_HOST, - d_data, - AMSResourceType::AMS_DEVICE, - nClusters * nElements); - data[i] = d_data; - } - } - - - index->evaluate(nClusters * nElements, data, predicates); - - bool *h_predicates = predicates; - - if (resource == AMSResourceType::AMS_DEVICE) { - h_predicates = - rm.allocate(nClusters * nElements, AMSResourceType::AMS_HOST); - rm.copy(predicates, - AMSResourceType::AMS_DEVICE, - h_predicates, - AMSResourceType::AMS_HOST, - nClusters * nElements); - for (auto d : data) { - rm.deallocate(const_cast(d), AMSResourceType::AMS_DEVICE); - } - rm.deallocate(predicates, AMSResourceType::AMS_DEVICE); - } - - - for (auto h_d : orig_data) - rm.deallocate(const_cast(h_d), AMSResourceType::AMS_HOST); - - bool res = validate(nClusters, nElements, h_predicates); - - rm.deallocate(h_predicates, AMSResourceType::AMS_HOST); - return res; -} - - -int main(int argc, char *argv[]) -{ - using namespace ams; - installSignals(); - AMSInit(); - - if (argc < 8) { - std::cerr << "Wrong CLI\n"; - std::cerr << argv[0] - << " 'use device' 'path to faiss' 'data type (double|float)' " - "'UQPolicy (0:Mean, 1:Max)' 'Num Clusters' 'Threshold' " - "'number of dimensions' 'num elements'"; - abort(); - } - auto &rm = umpire::ResourceManager::getInstance(); - int use_device = std::atoi(argv[1]); - char *faiss_path = argv[2]; - char *data_type = argv[3]; - AMSUQPolicy uq_policy = static_cast(std::atoi(argv[4])); - int nClusters = std::atoi(argv[5]); - float threshold = std::atoi(argv[6]); - int nDims = std::atoi(argv[7]); - int nElements = std::atoi(argv[8]); - - AMSResourceType resource = AMSResourceType::AMS_HOST; - if (use_device == 1) resource = AMSResourceType::AMS_DEVICE; - - auto &ams_rm = ResourceManager::getInstance(); - ams_rm.init(); - - if (std::strcmp("double", data_type) == 0) { - std::shared_ptr> cache = HDCache::getInstance( - faiss_path, resource, uq_policy, 10, threshold); - bool result = - do_faiss(cache, resource, nClusters, nDims, nElements, threshold); - cache.reset(); - return !result; - } else if (std::strcmp("single", data_type) == 0) { - std::shared_ptr> cache = HDCache::getInstance( - faiss_path, resource, uq_policy, 10, threshold); - bool result = - do_faiss(cache, resource, nClusters, nDims, nElements, threshold); - cache.reset(); - return !result; - } - - AMSFinalize(); - return 0; -} diff --git a/tests/AMSlib/torch.duq b/tests/AMSlib/torch.duq deleted file mode 100644 index 58ee24fc7938e71fa48621371a64c68ea9d186e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3086 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 W!UyHV0B=@cNP_gRGl0}X)B*sDyA5jq diff --git a/tests/AMSlib/torch_model.cpp b/tests/AMSlib/torch_model.cpp deleted file mode 100644 index 47c84178..00000000 --- a/tests/AMSlib/torch_model.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "../utils.hpp" - -#define SIZE (32L * 1024L + 3L) - -template -void inference(SurrogateModel &model, AMSResourceType resource) -{ - using namespace ams; - - std::vector inputs; - std::vector outputs; - auto &ams_rm = ams::ResourceManager::getInstance(); - - for (int i = 0; i < 2; i++) - inputs.push_back(ams_rm.allocate(SIZE, resource)); - - for (int i = 0; i < 4; i++) - outputs.push_back(ams_rm.allocate(SIZE, resource)); - - model.evaluate( - SIZE, inputs.size(), outputs.size(), inputs.data(), outputs.data()); - - - for (int i = 0; i < 2; i++) - ams_rm.deallocate(const_cast(inputs[i]), resource); - - for (int i = 0; i < 4; i++) - ams_rm.deallocate(outputs[i], resource); -} - -int main(int argc, char *argv[]) -{ - using namespace ams; - installSignals(); - AMSInit(); - - if (argc != 4) { - std::cout << "Wrong cli, correct one: \n"; - std::cout << argv[0] << " " - << "use-device(0|1) model-path data_type('double'|'single') \n"; - } - - auto &ams_rm = ams::ResourceManager::getInstance(); - int use_device = std::atoi(argv[1]); - std::string model_path(argv[2]); - char *data_type = argv[3]; - - AMSResourceType resource = AMSResourceType::AMS_HOST; - if (use_device == 1) { - resource = AMSResourceType::AMS_DEVICE; - } - - ams_rm.init(); - - if (std::strcmp("double", data_type) == 0) { - std::shared_ptr> model = - SurrogateModel::getInstance(model_path, resource); - assert(model->is_double()); - inference(*model, resource); - } else if (std::strcmp("single", data_type) == 0) { - std::shared_ptr> model = - SurrogateModel::getInstance(model_path, resource); - assert(!model->is_double()); - inference(*model, resource); - } else { - std::cout << "Unknown data type " << data_type << "\n"; - return 1; - } - - AMSFinalize(); - return 0; -} diff --git a/tests/AMSlib/tuple-single.torchscript b/tests/AMSlib/tuple-single.torchscript deleted file mode 100644 index c40411b447a1de1f88313bb66aa6a0a60f83d406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 835986 zcmb@tc{tTk)GuzzT;_}!k_wR_v-AC)RAioI2ubECQB+itxyWm3Kkwoj=;7qe>`x^b7P|lZX@6>26MY88v*fo;rvCtK zeN6rVv91kKG2Yr1H{s)YM{}aYPrT+l?KVit8y{N6F z`k(UpU()>FvXz$IzD08E;Fn~`AsJ!8^J zUE@hjOM2cw$=4!P3MY?T84(n>FZ-_HY`S@~_-3qdLwrxktCPn~IGSyEPJ&NlPENzH z8}z(lV&&Rj`#H|omr+ezJ<@)+Q>-rbtg7n5<*7H%oU1ivO6bNl82)mIPuc9nYC_9% zPK-y+u74kVxx5q@64SG1>8NL(-DDO=?|xz5f+ACy4I1AU1qnK&4+>mn&U(>d$15MW zpX+khGZKr{J++}2TKUdjDR|%W9DN(lD(X${I-`7P8NC68fR7T$s(d{k(jtc)hYv;alN{ zmZxIm+}Xqhs-+V7!GzkS$FJQ7^0KZ+IG<`gx?!=dIHXD#zyA3}xmMt;r}nO>n5gkU z{uA}vLwc-kKf2Jeuil|ixl&T!(wc5=O*44lc}o55M=bqpw};qwbDr;N#=~`s8h0$d z7!9oVB*#c+H8FmBuFb76Q{Gm=1@r#yHhJthZ~T45>zK1+?u4A8!&TiyHkQWbT%Vl* zzxeMc`cJL;;oTE6X}_Nhu-ANxK|Y5V9_xK`X2!$QQruG(m0jmx9F ze`(rt4(jGVXIYyRcx=D%%1uUKy`rtTRqeJ<+y$bGxyJd27cY5*j-RPNklebdZU_!M z?eZ)9ST9q*QQu%&cl~$Xi5~AArjO-vCmxb~Vo&jnHE#-zjg1T|hbne2OsGDNIQve) zey)^-~^xOjnXsD=$|INDp{RA|olK=l_0?M9oIep&E5iKz? z|94aIwT+jz&9miXjKx4aYV}_(!{f_7cPYE z6^l@>e~@&b_wC860b6Hdgyt@v@gwdg?F79+D{M~&o z&0`FV?Hq;Pn?JC8*X6pbHs@@j+WGQW^HbTEYs)*@GW#l$O)Xg4r_Em�Kfr%ea)h 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%0DsU<+)I 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

7r6PsMO>#MEv3t#qKd+)Eu297G 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

=ZpjFZ-YK!_P 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

^cr{Hgft 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 z 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�Da#ciT+!^ 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≥1|t)QcEAwj8`%`~s+-e#!X!OBso2ssZWA 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 diff --git a/tests/AMSlib/tuple.duq b/tests/AMSlib/tuple.duq deleted file mode 100644 index dd16fef920ee4cee4cf305a5333eddc43f2665e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1658450 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

#42M|?RU&k4|3pPUBXiNW8E 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 z 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

OBx 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�|>{P=|LrJfvy8jF7@5wOlY_a$7V_pA2 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%0DxAU{>8*8hm| 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Ð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⪼FrI7vzg1$R8JrA*egPz&iTdHQ?JT<$%jBzhnRA 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 S*No-fbGq*rcmE^4<^CT}cl(6^ diff --git a/tests/AMSlib/tuple.duq.cuda b/tests/AMSlib/tuple.duq.cuda deleted file mode 100644 index 46a0c959a2a1bb80f229acd05bd79559367bcc41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1658514 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

7Bn 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

v6^p7lqa=xl@L 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

RDA zN8I3Qr`&=dD zoh9sf(?H}~zHaF1vrh6g^2essM4z+X8G-7DI`PC;O@BZ?@D72_aVVoIrdz@nI6={5k4bC6vQ_;!mHT z&&>6q=zn%6BmwpVe~$wGIVFaWWpVF8;Z?j3iu97U*|_zD{LaZx57BArpCwv^c1Hfp zukpx-dR`Fq$1=PB_lj*r5D)u#2PS~Bi#cIScSb(t9ru4Ub>hZH(lZ-| zHzKsDYrPL6dTTQFC*B=%abD2mE%DXKwarOSuJ{Y_^1j%^{k?waRV2yvFLo*Pvh~4_jBiujz&N6&@B6iuS!gQ2D>?Twh_wYblZq8kA|?AR{a-&eX{F+p$^T? z`8VMALRJlI&DX)-qYwUsDt9gTGj$tWhrDJY@@A%1N1d4}e?JMMb<%vlPsiu&bfQgz z5n-e+`khAJSjQOjjjkIMNqikBFA&Q4WgkMXUT4&&=;w1G%**G8-E#}ng?L;KSXj_t z(z8`MYLd(DWihw(<_6dg`!^JE=QEz~Bt6xLPlaCU9;g>{W6EZt`L1)@Np4EZuSA>6 zA0I>S%_Zc?_Q`FbmuK^C=#74axT-~Q_`ECfEe$8RI@%NY5HnM5COtd)1?Cp7?%va6 zeqO&7e%g)0`f}X4V?^6cyW>fp^{I#Rh*9o7D1JBVJmSmWCvE{2SZ4{v9}ivp29&r9 z`m1|hu(qSHKl|ot0`XOu7N{%Dmc9=2()N5f;-TC2MZKt{6+>X3HYLtu-VJe|^K0BX zOnlp{|6=%Ang#I{+WlRvxo0);<+>I7!@MXa1)v_J&j{3$Y_k#l!$vg=A~}1z%Eh}k zKSZ=%-3s+-o1VbA^^r8F3tgZr=B94E4RxT85B7(B>D8D!sz%+Z9$GK<>Q3U@6$R0U zy!OqF(EBhNap9pKkWW$NIQ*FI(M!or6@D;=(C+SnI<^NJlkCieQ?7ni**m0XMl^AK(bt1`s&`p^Nl$M6+r_Kpspq68Yh}mz*yP{t zkz5^Ug85*&7eJkuTs;tP+4WE4LnVIye}04ip)N#vREnI#0kHFj$L%ZOd zf?dURMTJd9U6}YXTdOIr3_*_eml>{^!I{;_FR6xc&KFzYM)B?O-P|PdGp{zkfT1^jXL9uoFAJ#lr6V z$cMl&KO=vvpa=1jer=*jpRc=%`qRZO+#@}a?)7m(mdQPDoMkbf?Xg!|h;K$d_5tSm z^npx{s4fR#LjxUiwdT^9n~bJpa7vWTy})&bXZk^i2%9!z=U`hZUg zBR}@m7$1)pdB%6>Qx>@eeaK=~J|(%Fz18KXW`6WPZ~yl?($_8XVSe*Ri)IjQZXbO~ z`eIg!5ulTQ^CPr{X5qX%t{&={6`1yb^vw3rZXZ2!VSQyk?;w5IGTG&Q(mw1%|1=4G zs_tZP=j=Ec{jAQ^cJ(yx4EjTM{T4-jd9TLn2-!$?pP^Wj==yy_4IHH{>YM_U5Z?;E$_|xyOq%+UoK0S-a{< z#OKlOcjRng@u9>Qop$Ub)cZ%BAh}F81AgVLM0~E1&7%-kS*q&>(lde zJfsuWlf0bk@4cTdfuDLc_=K~Wh>F9B&u;deNhn&)ydCC6lcLvVVBNTV#FyVj9wu50UVf60Z>oU0_x_L)_NwIs z^p##Q4CfJJ4guB3jZvv1ijFHG$A8N`>l-E%{E z@y`B4^K0%tb^UxZ;>K=_j3K^m|91r0i&-d#5$_au8YLimHO}XkbZ-$!Gy9;?<2%lOUB|lqK2<@ar8~|0{nATu^zALe#fax ztao*u;zbB=r8TAVDlnNS`qi+t(s^`NIrd)H5^)1i(GYmd3Y*00(~ z`uyr$*r_T<`VnnEHE?yDs@Ih;q61sGd<|KEbI4Xl_rY#LcQ;QPrC&m{e*Fx2)8pzR zk2Y)63bN-PvLT+fVe}%R#kkYc2z6M?*@WswBjib3@OSgFOzDl_Xa9GGhx9V!K>hHK zpRjMfs{#5$_~kfAa?@(u9_R(R~wm}s@v{r|zP8M2A& zcx)k@n;ltuiD>)d$?2qLqDEdOw5tL_2zk%7#|TwQ|J8(YT#74%`cp)Z$BXQTd6>KU zre+aTO-UxF?{v{^2ZO&@+Eu2{tG0u zA0CDi-xl}XK(x5{ER<-|B#STj(|^MCK-@2#OmgFsfVj#bzeSK-&3WwlU;J_i@&k*4 z31zBL@GrX;I7zhkEuE31FB3ETOEjP1-V3J=M;`~hYtnvTW%r&*rSjmqq|5h2yi~fU zi6r;l55AmGpZJD(!4C9B-7w$Za6WDS*#|!+!P#r~Tt3TVkAOdMqnkIe`S3YJuQ>CJ z_-u$qAF^lVzt_p1^Pqp_(ktMA@M!2&>yCQlwR<3Mru@^r9+0Lq;D@Qi6s=>Y9Ay%kD258{J(Oj1MzUEn=6Hny7*r&f0Fcd z4fmWr7M%}$B8$2A@2W{ZkA=K{)nkNQp1wk8ucYz;PFaTj)ti4teC&pfLx|7n6+pen zk?#I9S);$3V@vM??Us<`q^HYoMc&QDN;=F-oBAbCFKo>{cbJWcl86>Fho2@nZ$1fqz~Z;#daFMTb9uU40`+7Ejow3gc39M7LfLRw zB%$(Ifqqc`Jl+X;o7tBLO-McThwRf}6VdErM&wKXd&r+?F|gA|Lf!8V%z540J@3u? zdq1pi_FcS9a^9sK{PH7f@j1>!9E&Hux|tJx^pR@2;O~=i>o2*3K2vcU*1-RtmC*-$ zc$uZ}7kG6QA=`Tfd9?f6V?91MH{zlPfB(N$t@$^gH~%{JXWP$398}eju8*I*K)vfL zrFN5^85f6m*)2UFH`AYCKYFqMLz3InwXqKC{tx14dUc1~Bs`fza@ph#`p(pL?+aDg zPQ$Ovk=vbr)$CKy%XujV{?hrP?&YZ^*oPRC^&RoqvO=gwQ@9Y~!#89_e)v3hf2eNw z{XUa8?-Q@R>f+o@oZA+P!a3RG3Fr_0uo&_vVk=|cW@SC&@#>rOS>wn~z1j=Zw`aNe z8S(E+;>+D-TzpI&1Yf zv8%+F>2skzY`LZI&&KA#x}s*l3zBou1AG}^Tt36gVgE)|!@gK(M&wQBsJPkV)feO5 zqfXWKpzUOD29$!GXuj(ZZp!_>!L3J{|KwkBpvAG~4#f)q9#Y=pz+3 z&DG!PnQkr=`ieZ;jq4C+-ees1!E5=szOZ)&(t6$pk0Af1=#1&)*UX3s0PeZJnUEjP zgnbC_=LMpzk3{~M3V=U3Iw}-;mu4;@)CI*gLbiJ4UFaX)g!r2HkI*wA!?7=YvMur? z@8yIayX5@{peq?)?O;$TSzPcK&P0A1|2zdzpJX`i~E6>EhD7-a4%J?;scN zFX8c^_nyMsHuY}0x_W=z#iR8pKa!ir3D~zxQwH&u@nhjnZCR8+a^3qL_O1Skz~=;A zv^wG|a!oi-a-Ok}%kxid=Mc@tA4b2aIg7Cmp^v~$b{m27s>|+u)vEbb^sha<40Rv_ zx4JsrR04fqc8+#+wE2XKTi)I-?oWEaPS{SDXg$^Z5$1(zTXF-@cJR;3JYLkw{obD! zy1xnh18orxmY5lSO#Q;(n~Gyl@A~q;$h)nXDTM4*i79Kyjvd?_LC6oUnn$RjXKf)l zFL4Use zBE7IbTm7o5x3$I5uj;}^d_J+g0&#xTuFFQUV_`4c{oj%dE?=~}WA(<^I2%}b;2 zdCNawZ@QI59hiB(=Sa>c1Rx)(+75T_ZucU{k4g?fT+N3|v7~2f)`7jgo``(w-?DEb zzI;?2e6jix;>Eh3Jpm4{_KZ;77<`$K zkF6O;C@+1+e%RO*$d8RH{tkR!U!O3q+>YM-mS}VGTp%IuSQGmCZbCHCy4-No8#~n( z=ktCcmrQ(HvFh0{FN%W-sH#6pAiha4{~;mY^7B1HmFCk$LUAB(LKw+2HG^N?Z1;KM z>ty$PP_g4C?DVsIs8^MHcR$h>!w!RQ#@@a{`tnf@oL9|xeT`^#qsDDQyQUlF9qZWk zKIn-LuM&!Z%OU6Cxeyn7c{SoBcO(aqT>Ulh6Ct~^_HLLLc-!@;N7mvX^z`g*qe*Uu zDm>?xwcP*|vK#Dq`fOiFuA5!B3%zPdh=W>G>?P46X=V(eDe{MVPuueB*NNtj@0|)G ze%c3!6L0Y067kvgg)azgl@@!T*VH{f(pJs^KlazDH;M0k&X==)7K-z#yEhIK--JXX zPNG{U)Ti1Qfc0##v#&`mdj;$wv{m!tzB0Qm!=5lN&GU>xobAOAx1iS{^c?Zo8-scg z-D1(#`q?{YCj{aqE@eSJ?2L7=S3it73Hv+~aUT6*%1WY5je6*N*8S#QqHV3phz~ne z68mHOYuzBe>e=lS^qW7Dzsfoqc4AX?tjiB%MI70%$kSve zvi}eH&^5}qzWCz%fb8X*&f5q@ir1(Mb@#^*qRqq1s3(3Yb_3b-q8Tus&9A*L5v`wO zLA*uY@4t5~J=gX5gT6(DS8o1^8B2QhO4(5Iryrd5C$y7OZ705{+zb1b=^MuqUyeS9 z`!UUy7V#ukZOdVw;`J^KdEf?j-g?!pl3ZS$?CSNmP5Vf0u5^do`}*udMDyD_@SY)- zX%_Y`^jXXsTYZmv&TX06h_AkL1@)yjGFK0aFLU9wXGc?E-pM25c4NK2PvHFOP`PlT z*~jnqiG7L0^NZP4_q%V=9W_&={0RJ zKlrKI=zqJW-FdPzN4hNy^P+s_pA0{{n>-~{lgq^tUrhXUE%2xM?tY7R72UimHefO7 z@j(%&L$fXh^Ou`JpGjYhT#Y)mE2rVytX=3_(pQz^d?#J**rz$@5KXbHsK1T;aN$hZ}#19o)z7s$UnL_U@5ahhmTXwk_q+DGoI z?*8FZy-pHe%~nMO@v~=#Up8a^VCa===AOSESqyb7TGcH;db)5#O5nR_Tt|7IhPb}5 zw+9cBoxT12cPSMb#*u%Ku@UOpPFOvGX#F)4=7y+s9COE>>gDPpTjk?qFWUFrL3*<9 zdN)@B&Y^zg>ChB{_zeZt(YqJ_5giyAOh;eEg7TJ>tx9lAE0!{0a5i5Y(krfo|Ucb^zp8Zb47$gg0boCznK@ zn4K2+Hx;I0UpgsQBFTB1<5vmAkF^n3+jQw=(8ES!A8c_V_RT|o1>gIR{GBA1S=CcQ zo$}5;=qL4Yak|@I6Ky-5I_B}BSzO@(^jgKbx&6}~=*w>lu}^t!(<;&vmCJu2JyS3m z`PYx?9VNc^zP51U^WYV@4%o7PB@wMcKf6AvHev_SOu75;RfZJtWG8%D;QMbrwew5p zpKtJ-P{uvF3A~y29ieVN4Cj~aZ=^O}ns+|q&h@emt{c2=@Du2DZZ;5hbCe{s9U|ih z&8u=tz(2V1k;h9j-YJ$)r%Hrh-lM=$qSdwWs7KaUxX*Kw&R!tCC@~fJGuso^LvQ}- zaM=IS6#Z*zeccPaY<{R)dF;<`VO~4ACjJhgs1ylgo0H*3-I{^ElCPh-`%~H$1K$?Q zfVm=52D`qKYf#@NWAkg|N42ScgVtekuxf%JecM66Qhvje1PQo#F|Znc4#Ai z(2WbAzV#^gdk`}?Xd~IFz3%zvO1kIZiJ`;LuiWzw`d*0l*grp9Es*@Efw{n!SssTI zZ7!S3@Uys=i`$4!(3jsHEG9m0P}i+r=c>y~366QsR(3$2i%$zsfAZR6Khif5BavTr zy9)BgKHWTob*faoMacYax;$q{fxa+9ry#F7;xhW0e_DY4Vx>z2lRqhab`pwgS9XE! z_vs{|>7Mx>p;Gx^r|MR6{d8RJ3G?##(@4Zm9h{3g)3>v_{$6$^$=N-5NXWML4kmpW zGZXs}rs{s!cU*(|(7XF%&Z(k3uzy>+-dWgJ7#UA`_T$M=*iW5+xT&94E{FX7m^ecA zw(vZX>->JmpZEEbr-;w*HE{iqy5TF5o97L1o#Hvh;d6jkRp2i1RpXk`gfgh_7DC^7**aP>unmvz3oOQcwmcLmos}0_uy){irMZNBIEqBiCfTM`%`+MLz8K^VdPw z*@Ze`gZ3OIzj}->_Q_go`a-n4nFD_GPbqzfHkSp~)4vVhP4;T(@O{vm-PFbZY0`V} zM>SqWDC!);d@#)>`+z^X4)knuKjejtIXHvtMU7S8NY4HofVrij`n)4rA3O4a&<6Z* zoY0t$iwR}Eu^9|ut4Z#B7k|U`ji2b<)8plMeV#*YF$R zX9-oi9}ySz;RN)I=O1?+>(vtd!U|noL3*rO6yl~|82FLjes}e^-reV|w+>iKdgj~W zv%qC{G4Djn?azp|OFki=vc>EWkC)cR9_KV(6y?`nCtCd50CgpUuSUYYuMCA=ONDtW zM#Z9@WK1daGcOl_>#=^EEj#&9w>H4P-8=->4Lx#@J9qP6as3qmBO=M4n&Y19%-YO> zoXzh7e`59S-6ZGTqL*OZ<4+zC+G`V0A2w&;Dx%G#J*W$jVk-RFD`}B;u1=i@BmHi( zkViYZQWvZFTueh;zFY)!(Ur_(*&|u`v9?GCePpr<5 zI^wGr;XLa0IMkh*ejVr1<3GE62VF(J#E3jWWM{J-7s(Ff}4Huy7-u3sfSA5tM6 zc&8Kmv#JFyke%I{3H5KL&x1d{wDw`r6H{KeI5)fzL3*;(%}_#CGURVUlTdXS>9MwX zb`kP|V-aUl{4C-rFSfi&dVFw~aU|EVUlXC1br|BwE?q!9vdaq)7a4x|G31*cpbl-q zvHys+A8KH3OC9srLw+)>_W?Ek?MzF64uZKS7TS71Ks;JmmFvg0q1UmG8Poa83Ov@e8w*RGu&(htu8 zdwswAQ`iSpyH6-DPr~&`?h_Y?Hs4;OAMLDmJ771Nr8Qo@F4f1K?{m2|q^G+77(-|) zA4fg0b-S?+OLTuP@wdfYzL$h!U9)V{9n$Besw2XwaFLB!K0t(!$O|B@GT zRu)Y$8uI(ukCUCQvIz0xm-Kq*jr=`{_$=<4-4`q-~p+xsNx**ftdgsRcSaFUzb{~aUb znPPFBGapAHULwP0AJQ}LGA$sqnSSj{dOCYU#92M6{+ej}(cNFI8l*uT*#GLzBz@NY z#U_%ApZbHZeQTmFWc&=|M~hLe?j2-Op>hVT14WUgp z=OfAa4{i1mio}v`{9pwdLmsR z_~X?h713&dyKmJb)Wzp8QTF*x@V`C6T-Eg^4<%Z+9KXp!`mbKa5whYpl0fI{_MYS_ z=l%(V-sg{DUDNLV5R%)4uhD-pzUpq!>+_?2^yde+Nna0GkNV~Vy9_6q=Q^^2^yIp3 z7YR*lXau1xPz?3SN{vB2&A4&vAfM}g2O%bGLVxMZas%;I(G)AgyvX|v!#tCT?)kJL zE>Ae|RlxVZ^S&0ryk|w5Zy>(yIUVQZ$D6MuKf)IG0l!ai>_=@{@e%aZf_n)0&2ei; z&n7j-ypn@EV_&R9&>Z5k>MvuUm-AQ@p{@E4>RKg5p&!|tEATHf4n&>EZNIN4J#nFk zCVRQ<#W~m|*S|+J&m7m7XjY+T0-;{{OAzr{+0Hiz<&SglIn7oY8$oi_aHKEfp9B1f zmNRlC60Nh$3L@I>O+r73T_rHz*xCzQpkK--6!L}laX$Iw#ATw*xIZ6|T>U-s9_XQG z@wr0pa`%O+W_u8K7BgxN>;qCiA$=WNDwvR$&+q)q_r>Q6k?u|m@l8@V;-GyKF^}!K zhzqcvdv_+u)tK|QfPeMF@BaAo^1hG{D~&jc`(K>?i)M!S;^;%viH>dQ^7C8K{m`#g z6!8(u7hpduE(qu0&yGGKxe{*z2<2ZVkzdj2?GBHZ=H-f^uEaX`9&0)DwD+D(@42cq zb9H^_0sCgeGF+3X+>y?tUP9=r8zV zyJt=$KL5Qu?09VV!$hn6J_%&Udsjd`$vSfn5MSp%ae(+XY|MG0Wv45Mi@X*dM>Jpl z{e5@iQobZTlc_1{LoZ+N`f)||bHvw;{9XOb{~zWc-*t2$*^AmMF@Jc*ET}j8lY3u? zn!NTZ$<5@A%Lwh7=;@#zoIm67(yH`E^n==we--h0_3!W7nC+g=Aln6gB|Zyia)R`E zyJeC}g~1p3QamF)eW>X+@biUWeSWL^TB7x(hN}q8qmLV* zS77r&qFLy4=XYqi&qUjC8LtuQHE}q<8mUlEtkN&O;2+6wG0ZDB=`O4U-DncxBN{Yy z@ssyHl3WE9M}L?FvHMAne{CB8yTjwR!mj%g4ea#4H^i4!D;^`%p9fk(QF{>hJj={v zqE)8fwtKwjeLe^HDt~@_KGe}&P7`0>%;EZA%w(KL)eS)$Y~nLq|7|US{h3DJzmGiO zo*yF$%tRluJS|~oSH5#`%j1K5^BHB9l7EqItvg?;H9oW-7JYLEp_#lHbAlZl_Xhj$ znH57QODs(!xg7i#;=tPnEhE0&o*VmN54t+L$Y9i`iM=?M^!4>0(Fd&m4?(1FhL76< zKY350uK4jKM~OCX=X4>t%(@HvGtD<*en|5g{m!@e+<<)cX+P3ezUNR^>U3EbhySy5 z-SIgefBbAUYSpNDYSyNxDsrt&ZOYF)iW;@4&DncLYz_%xB?vL|TtciMK_nu^MeI$) z9>3@FzW()oedgVL*7ut{&-eR$-((8$ZNO)o+sv%x`27zfKT2#s9OQbJca^iE+gJDW zs2j8MN-y#+T2{k(bo*kf$e;QA)}Q!H4O>a59^Aox#qS$Y|Mt#6#8p4CKy^0;=Q0O= znMV5hXBGkb-~PA>j5~n5+P-5#JYKmxUkdxPxAWsXd}|8gD+jE_er=tmcSuj)d~lo4 z9O;cY!!l-GO#Z~I%9ww8+w4f9O`1WNV$nl9S!{^4X%M=mRCM29Ulfv>5Y&HSUkRs}HYS9Q@q-o%xK^ zrKG2VKCU6OoqM1kZERD-k^N;)(t5U4{bZ8!`#gYXS-d3rP9)?DBR*T35KpL9tj2z& zPnB@eW4pGXE<|uDkQe^%|20fNF0Le>os@0{jl$=koPY;X0we zanB=)8IPX8@B6qo_}kZdCL!~T+)rp0=X2jr_~v()-x*P^Zu7sL<>Qs}zNI&jo<7uK z7WB{FSw(!+_lWC@!0V_l@u$xc=q)aLhvd4zH#m>#KV=x`^@+;}`7`%@9aZg*SkhMk zC6HIu^X^-s`M7`4*ZOfj@Y#>2aXk^M+Q{#BLA-dL zWlf2%U;l|X>q%A6Hzs{?)E6^iAIW*`PB#eUjGD-ksnQ1LwdLINTBd%#lSWVQA%Ck%;hg5$znCN9_>IlP z=R^KN{!C5x`*HmIWBk3qdsoFesz>Tr@}ql9Mqc#@_dXZyxqeiv51rA3xp2 z*>~Cpzp~D!E3}R(KXD!T;pP8#jA(Y{#B}%#O7J6;`Tjzkig{B$5N#*CI{`da=e&=X zHnXZ9hTfBo=vNhc*6ly*QcHZ(ChHC8kNbWs>5DhB(I>JPM_gIJB+Oy8My-V2pJ9lb zZgo6{^x2rHs2jN;F_dVTz8&Huk5-rnIxNQ?vNLDhbE`7?5azsXE6@+RQ47?qeLolZ zKh`x#1I~~=JL#UEQ032VCYsk=xRmsGwtcw2vm?4-F328VQQvk!8tl); z-$s0Rx!#Badz`SI?BtLAV>7uZJ;*RhmNZ$8J=K@{rz+EN(8& zZ;buvS1h`a&{oepgY>w67x-1aZjP(=2gAU> zkzpC3eSh=->FbbMTZk6jTwc`H3NwjTgYxVkxs9HQ`r_Rm;5<62#w3z!|M}RT$eD1C z^!V<$7leBLKd%1#&%69C?6i#d%)j{x$o;DZ`*=wk`1(E3_V0<9-*&k_`dhxeGLHBv zW5q4dFZ>(w%{xqY^Jl~#+sU5I$cnxO zJQ#>RmgB~tew9v|27gOBoFYB5t2oxtl`dm_GhkW}@%7Fl*q?dtK1Y@bqoQ1FJ9ZA~@hSbVZ+2@4{Hk5<_s4YlWm8B`{@et9_?36q zr)tq=HQAY@KL5b}r+^Wpr{{&?x}nyEg@g8Oj6Si2LMKD7`aI-K{~EoXXj%R%{E3K_ zE)Oy8IV$z`)CsZ|lRu3jJ+;2TA);B9A($7!_uMAp>&s_X5wi8ocM{s8z2ks69^4}| zZQi>$se`CrF>w^`yZH~#+mT!dpBO@2$~`9~{e9;V&C?!n^Y*)&*gtPqZ@CZoD>?Hm z>>jR0ote66F(;L65I}Mra|iy|mQU+QPsZ)Uyb|BXqtAHh!>Dg{>h)~sZ=Z?licE3W zOR@ht{MxG(4wGE+bQ{SJd;jzr(W*dQ)DIgLhjWWO?!H#NJcjGHDt&(+^gOu_60&9g zJ+C&X74plQcXxj6$Xz7YC7WFHcu`~=g?)%;rYq=0>-Lgd^eT+?jN+3wzt&C?cGOLj*3ttVuGQSLnVzdcNPtoxN^#J7*rxFK;K>G)_=DS^G{r>cpLg%wxbU0$iblP-Evr;m56&ua@{SvTYr1~o8(Wd&UA%P zK95-f`&yk)ze*f*|Nnc_<}&yvvppmK+@;S z@?VC1^vvg=%RJjdsEfG21Jq9U{TFlmFGG5E=lmGxpLus5`rk%kJu%un*Cx(MoQs!x z0DtOZ#3Sf^xO<7v-hArzJ!IoWqS=dFD}1~l)15<}?dZ8UpKSfZ6_U#*F)nUA9_#55 zyIoxR#5w&t(T_=wN0&h!Rr;@3mu(BgI$}!FdGfCpWk8*Y@mCRF?{mZN$W9dOmrQb- zGXQc{fALM?t1IoXj@bGtfM{KEb|UGSoBdsUsz1TG*_ti5o||z~q0djYLS32h^;})O zjKluqLqFul%qxj_*jCH2jyQD`{ch5%eM{@GbhV!n@_iHIXg%9-J?dG6xp?azli|-U z3PXNX_fXWMN!pITZ)`$=S7fiQbxR<76VqxY{2iQ(`qrIFBfi=v8FgbiL{BF@mayss z>3M&q0`W7G|BNSE}|^78v}^p~z#1of}tZ=NAPvT-K(7x8m15Ur}a z?@90{voLp5o(pcj>)iK9_|@PPtef~Qicr;V8ct}N6b71@+PBD$&h-J`@8&rb;%BD$ zLoR*Wgps~Hy3FOT*>=>QuF%5u-P-x^uWPPyeQ^EP)8x;rnt-`#LJwajdllOV@lhS? zxqAM7FV1IcWkLP0pna%A-l-Gjj{f$$J=j;xtx>?-KU{;~@F>gyc0B{`k92TN>__d0 zegM5M8&4A2QSV*db#H`ut?rk1{k!)`Jjq3)mcE31=+UblFUtD9n6GNaoC`#=2=`o> z{{0&6n|P)Rh>NN|@jBV*^}o0{Z)(c48#@ivQ67anau=S@LIZbw^*Qb4Ogg2KKy7eDmE-oJ*|OihZcc z?)_Z))n4R}*}e%L(u=EzJ`v|)<`OM>y^aO{#+%E8HkXgKV zf?WMnPrOEaUANmxA1|7{l@Skh>m2f}o_~Y$$O1LtU#!dYl=Mxi``r%_o$W5!@&6S$ zLC8GIQIB@Z;5g`&h{k#{Lps#CdG`b~_j%&_u~gVcveO%5(T}p&yIJrzqCDn{IIzz7 zyLbZ6E6DQh_X^E{Yo|%i_|HK-t1DeD5G@8i`{*J5!a{CdHFWO*5Ur1fk=*)BLB7=K z-=j&7&3l0To1s|{AJb^Z3h?jeMf~`Z`N*THAA)_0Yo}64ZXZ|19At4Zs2lP9KQ6CB z`FhCnOxsK-!aW;+^_##yA9#MJkC(5Gk61?N{XOg$lB?=>{ebQ3hJgRkZw8^he_;{v z<)^TQ$iMB6{mO}FPcJs!4J%$ys6~&S3^^4*)$abPmbo+V(h)js9yZ z@%53YU4$~t*wrK#lgCaY^B1 z>nBUM0qY8%H!Fy*Hx@;|sy@{tVK2uXB;@x~kbn8A0Q%Y{&r_st`;5SRH7xZK>DjRC z`-m?NY^@IZ$Ej}LElT5@vVQPklIx{q;nzNWxs7O5>DJqjVIA@1PvMI6SVC4;SNT(S5TEaC z0eyZa*4YPM#ktwsZ(QAs=y9C%%;89^CtKW~K(uN;ZUy-h?cy2{@_wsbUV0V9e)Pn8 z<%zFiPvN}Wuf|@YW#*-rziQU&e|@~P`T1f1__LY7<}bt&Hr zM4j`&&BDl@ZA-U_w8tPvSzm2{! zy$1eE_Uwt62>V4N5g)dv&_3def_a09FVi-1brP929Q1eJpw49dY1oHp^WXo=&;A8F z8G17q_T}9F>DbwOIG4(}XD{*9n`NkDdnOrkf@gX)fc)y(uQtPft2-@0m;M3k+jQ8A5QkR!B4*M)3Uoi=z!THK>t-6^=3r}^dH+-9q|zv zpS$(udvKk$Z$gn59=soU6g7_G9JcQ6E#$|vDuDX10gn)8p-L|Gp?#h?3tAmddw^&* z|JfMm+h&*(;^ckgQ?v^_PIC3bw+~2eANNCFuquafPSL##@-H6!l0b5m?#L?WJqlSz zsGEz$gnZ0k)U8-L)zwqpsxD9S8TKK&XISmy)f1Ojqke6F-veZ4s$4xmd|SAti`(`F zD~UEOn&JHXNf!8#t1bMpdV4RBTvxtiGYZT))<@y(>yn@C?~YJD1d=|3bAZHBy>O|<%<1LlP zxD)>j`TawI2NZLvRi|t>Ou? zQ_E-FBfkBbdkfJlb;~N~?I;C1-MBRJX#(7JRPVXHl=N)cIheQN(<1Z*mv~!%R^55s;wN`C_|2_+s5Snd)=r^^ZpPOreMbCMN|M&*_RE?a6eVFYH z5ii>@!R=?s4aAE_UUG52m$DB2T1`Ma#ZLGAR#9+{tHZqcwvn8zuY@|V-Pst>Bg?%e zR9mZ|fBC!S*5jphK%lFWiybzSTvXhQbBadw?-R{;Mx$QkSob|g{%I!km5+O`o*3Bx z`!mgkI=j(6n49{DK1TL-R;|T^Y;6kaojuQv_1WJ`+&Qyu4TOAND9$HKmBzd<1%AYJ z!9LB8zGjt+`;wmATx|eBOWug{>yrtn7tv(?Q^+e9 z!M<43B3CCjlTdeN)QwAKCGZYY}(8LSet^Zl~(dI-6*AF%Qv44Ih8RwOsMUrFyUTMXi2|HzBEq4vMUIn2%&tiw|4;ks;s z;x5qsP259G$YxiHrhUq)SJ59V7e{<#I?r0-vu%ChUxZFPNwjXc9CL)%&INz$Sw}Y~ zaz8-du(0^~q{n+N!~8TIvLU`QugimIyQ~ZRhH5`T``Zw=UQm^V9K|H4zm-JC5ojQH%P`~IZ4^*>iHi@rr&vdMR`Uwfn9G19YxvaTc4-=9G} zini&8`FLsGzp1O+{{DXvZ8MFB+>~62JgDCPOeH&3CcuzfZ1@{_RL6D=hka5lqY{`G$x0(?6lKiOK z(@`Jl_XVqoHitT*Zk7Gj^-YR12hk8^?hKG}#eUs7*>zsZ2glIN1 z0`ZUokL)JCD7C=py_^_Hw7pZ&U2m>r#T@5-8Z0L}y{PY>BgMgS zanneTedUKp&;0Uu4WazJ@)Y<7{g5~PvI^#*Ui|_26Sk$>?`rqGXwzZ#Lef{)|A#u& z4{M=r&0p1H$)CvT4}BAG>j2UA_ddv@zUPa+<3(~!AbYtZJ^GVZ8SDIa*bliHavJe6 zO~&;md-=D!9;;j5?Il`QAB1|6;clLq;(buhD(fG}BQL|8ztA2Lq;Hm5^eO-Ror~Yf zOfIjx!(G39y>*84Y_T6M1KHIWA6jR@wrfO--v6M!Sm$)di8fnTrGS5aO@8s5_;T}(mxSV{t?ql2)3$@p7bl;Ge4V~asM2hG zO{o9ZEYZh{Y|qL!MBDvQw~4lieG-W_D;qxoJ+cR1+JWo5 zW;@Z(?AlKse7t;nZQu*o{oE^rXw`op@~gkg5Cwjb4PSu$K4U&8-{B`59gTJ6g-3`h zUyy)(=?_t1kjJr`K3;$P?R~7r_oTf@e750eD)HIE5}%0Xr!zbt+Dy#&7MQrqy&quF zebl{qlJP6_T9$VCUBBZp>9J%c4>u|&zhAv zOL}6(8}x%onvFb(4DLB})2t`zTs&Rq^4cvD^(l6wy6bt>y|})Joz)RX(P!EtT2HP> zctWTOS3(_`j32OH*=bw~@pa*(XhL4m|Co;#O|CW2V~z9!;>-G(Hxr*-$l~&w;Tu;U zM{XgWa;n%&dZJ9sEkbsw{vKfAxw{Bu(QBwn9Z(m~9qHg{sBa$H&ef$)Gvw1IMdNxS zQz|1rY|+)LWUoRhpq_1;xo-Zij0BpDdr&|8$@PuUE0qTE6s=nX`FQO_$^!H;@3_g2 z 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ⅇ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

U)Y9X~Z@9eFLTc&yXul3(KuD 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

Q@iJRs~v-9!frx6%!lZ38FOX}p4&(I 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

Y5~{mHsUhdsshSgXhJ1=bhJKa<7Gkc= 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

MiCU!n`m??!KXQohAT%s4dBMny#pW8RY&?SVTNU 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

AE6?$sZ7NN(Bh&aZVHP)|0` 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 z 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 diff --git a/tests/AMSlib/uq_max_double_cpu.pt b/tests/AMSlib/uq_max_double_cpu.pt deleted file mode 100644 index ecc83c31a5a6ef3ed5ae3ac739c006832a4e02e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5290 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 T=z*gAVio-V3Ig!Q3&#E%i8)%H diff --git a/tests/AMSlib/uq_mean_cpu.pt b/tests/AMSlib/uq_mean_cpu.pt deleted file mode 100644 index e4c479e1ef392177d0e9e4d4535c04debdcd364c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5166 zcmeHLc{r478-I~yW;A3gY7{CG1|>-hLleyrm6(uen89ck!wl-P7NR0sp|Z_Mi^{P~ zmP*Q2oj6&_sYpmD4Wb&SQs4WIzGM52bA5gPp69xr>wcH#cR$blyuW*SUI)C`0sxSb z0_HS1Ko;Pzh;#~xLG<+FpvfdQ39XOAN&_y_8VKtuLbYHZxVbq`D2-%tA!(u0|6F)) zzoS_wMXbt%&)+26hve;lbv6j4*izv*i|S~Ba9nEV2qYt7^9F=6)9NiGSFFi=C%nIm z=!N9IuwQ$G(gpio_`Krn2aE$=Qp!TPUo;UM0Ck6X?9-oXp8*c5GsC`VrvBGUaEgE0 zKRfWlI{@)@Y{^?I3sKNvz&;;eE#~so5Qp9TKk;=oiGO(Evw)BtJ8x9W*nrQW{?~RW z02}7mq35@shQk{EfF%*4o>F?=7B*GmzettBH9g|Fo5m83Ay6 ze=^0NLbj%Qvf(VLH9OfmSug?=c-j6WDuc@KX2IhKO5i<_8bI{o&}c*tlIQ*)l0TW~ z!({GfA+{4Fz_&CigF^CWNl)3WH)$4wp+{$uIW$Uu-sBkgPr{*a))!T>7 zLi&J)`iS{V+F`(w@sYsWfa{lq)(^u=f$Nt7*B|RMxy(fbFh>9$R8jy-ZU)kjB@ZHD zAW}hy1aVU+MIU&a4`MsVgQW!a#d;7$b|+McT?Y3K>JUW~z|=E0_n-jy42pPyUljf4 zXV&vOfWu0B=gP_CcHfu!vN6M-71W(K1lx6tNfg@`9y!wyt*`YlSVJ9OfTX`}4O;mi ze~m70pU3D!!M7~sOD8*AO2=Mmy*n}Fp!9xl)u}UxdH}~5k3hzY?{h6Be)w{{Yq^u6 zsdd-DXLIMnsX!^o)X`~a^4V@I>_ay1=QhLfsOU~SY-?v$cKPeBb00F^e8Xw-diCyC*=2SkFDN5YLnmfEdf2sep2FoCef9UI?-}7ou{5!)L+q@JTb1Q zq{hO)c55%&u;{F0dvW5P3sps_r+-p35m*Kk*y^m#z0#kRwbrS=_#_UhPg)>TiR>nGFIH?eP;t-5*Ag<^iE>1I(+(LG(~ z2YT9GJZDsQ(}UN!ulEgcn^?YCB|bb# zMgE&eJ0;?26dB2QL^dwrhhVb*C^ap~Xfs`9d)?ghh^ErLp5AIZ!zz7alYqlIKe=Vz z!sQ)Twa2f|dsu(i2`)xwh1s}{g=pwkFQkh;Osh&##*s!J6s29;-D)JJVQA|(8hUr- z7G@p0_$$uKuUz2a+*|Zn+itKN-qsyLtK^Fh;tIJt_kTN~Q5tDgF{~dv<{Fa))-7dtF zVu?3P@vh9b#oLy?UmHGj&XDHy$N>~we2PAWY=!H7tu7bI|aEzjhd+oY4>uPRT) z3tUc(2aQa889J@S*8!)+Bjf%jGX4x0l*@gC92!rK4KfW2* zcr~`#OeaLP@CspBzE%epg|&}KIsybCYASU)VC7qjHu9WfKNgLUZigxkh)1_))+p{W z8QP(KP_?*91oBI!;VRYTV4m|v%;%RzfcZRri58|PG=qWuo}$o`DM}d2H~p=b&aPUf z?(I%kCRFQ7ZxNiWev^N4lZnNuz6I+%YLK~Fbd<^>kKS{KUZ!jmFFHCgG0Mjrkk|N9 z5fRfKe%krO^FpzvPmCuW`f6LRl4LIQMGh68JAcHBy}D1J(^2m7Ir6BZ$&#*EH97CR zkr$yJFApKouEbm4dQyIo|E5y4ksZ1u>jReEI96k30mOOKJV%|sVtDk_~uJ=E_`+#|2 zvh{0gt-T1ayy`?tchoY}cJq{XWcD~;K12FN_(YE7($AhbOUJ8>3waWHh?2siUed@` zgL4)9sK?xzUNi%qvF^3b+xiJTcJ#HCYE=SBa-ys`pPV1Xy>~ICRDHBp-pJBJc%0o8C%!xSz`IX>oT%2hl(FS{+`}Q+{q)}nmACrU zofPo?TgoEshhcleF-->+S_T(bpL5+F<^=;k^+a=4NI8XMGba0LcoZl6w$*@Sbu zl)A5W?Yc!#0*T*`6~%pf9$1d4I9#hdtktz_rCP&5+qUMd2NBLeh!5Jfdb#SA@l_ob z&xoqQb!YvRUuQ18hEv~(JGl5;rA+wVt=lmcD=sr@%`X}3*z7va-HzAuio$D_ zbCSZIm^0QHV}ZzRnEZI=>l^i(&*n(@au+_zziY>fE^S7Nc7N3~JQ;S};$UZfQ;D`2 zqv02K=TEkZL@>KbN}+7BhOUA1LW$2;tSbWxW>Jh0z$P)+0h1Lwct{srBP{IbXqYop zBtreKYkzsbbcVV>ihlrD8{@FXKgz=OaL5=Xsnsgr;R%4c16~9YfBw^${x?7ldNHHT z{lhUEKmBwz6W;}Dnu9l(jh}uhnu$*YgX$c-;cWc$l38KK+M%j^HXiyelNzQ<>*<9R zYKDe?foFp08s-$*vsF#c1)4KdrGaJqysD;x&TOUAqn*(VrD*B-l+Ke>W=}Dl?a;rX zsm5LSgHz15XNqyteL;C@Ch$sJcJ^e`+-Y*nQ);G@T7HHa$60E=yO9H4LPF>JKvgl_ uKOyk%SO1Zpg#G~lEub2xfjH=x3^aV71&j*dGjZs=2p+`X05pDb?7sm4mMjqf diff --git a/tests/AMSlib/uq_mean_double_cpu.pt b/tests/AMSlib/uq_mean_double_cpu.pt deleted file mode 100644 index 19dcecfb8bd925187a24bf466fc7d97212b728f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5364 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 diff --git a/tests/AMSlib/uq_mean_single_cpu.pt b/tests/AMSlib/uq_mean_single_cpu.pt deleted file mode 100644 index 0637ef97db3fb4cbe36abf2ed5c707b450d26e16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4852 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 T6X=VQ!nPHFfIs1S(b|6l^;A~u From 0d30693ae735d98b6e3e8cc58c1b079c1b499d6c Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 08:44:05 -0800 Subject: [PATCH 025/136] Remove dependencies on umpire --- tests/AMSlib/ams_interface/ams_ete.cpp | 15 --------------- tests/AMSlib/ams_interface/ams_ete_env.cpp | 16 ---------------- .../ams_interface/ams_multi_model_ete.cpp | 15 --------------- tests/AMSlib/ams_interface/ams_rmq_env.cpp | 17 +---------------- 4 files changed, 1 insertion(+), 62 deletions(-) diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp index 12023706..c7f17127 100644 --- a/tests/AMSlib/ams_interface/ams_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -8,8 +8,6 @@ #include #include #include -#include -#include #include #include @@ -19,14 +17,6 @@ using namespace ams; -void createUmpirePool(std::string parent_name, std::string pool_name) -{ - auto &rm = umpire::ResourceManager::getInstance(); - auto alloc_resource = rm.makeAllocator( - pool_name, rm.getAllocator(parent_name)); -} - - AMSDType getDataType(char *d_type) { AMSDType dType = AMSDType::AMS_DOUBLE; @@ -75,8 +65,6 @@ struct Problem { int iterations, int num_elements) { - auto &rm = umpire::ResourceManager::getInstance(); - for (int i = 0; i < iterations; i++) { int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; SmallVector input_tensors; @@ -184,9 +172,6 @@ int main(int argc, char **argv) uq_policy == AMSUQPolicy::AMS_RANDOM) && "Test only supports duq models"); - createUmpirePool("HOST", "TEST_HOST"); - AMSSetAllocator(AMSResourceType::AMS_HOST, "TEST_HOST"); - AMSCAbstrModel model_descr = AMSRegisterAbstractModel( "test", uq_policy, threshold, model_path, "test"); diff --git a/tests/AMSlib/ams_interface/ams_ete_env.cpp b/tests/AMSlib/ams_interface/ams_ete_env.cpp index 9781032f..f49c2cc0 100644 --- a/tests/AMSlib/ams_interface/ams_ete_env.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_env.cpp @@ -6,8 +6,6 @@ #include #include #include -#include -#include #include #include @@ -15,14 +13,6 @@ using namespace ams; -void createUmpirePool(std::string parent_name, std::string pool_name) -{ - auto &rm = umpire::ResourceManager::getInstance(); - auto alloc_resource = rm.makeAllocator( - pool_name, rm.getAllocator(parent_name)); -} - - AMSDType getDataType(char *d_type) { AMSDType dType = AMSDType::AMS_DOUBLE; @@ -71,8 +61,6 @@ struct Problem { int iterations, int num_elements) { - auto &rm = umpire::ResourceManager::getInstance(); - for (int i = 0; i < iterations; i++) { int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; SmallVector input_tensors; @@ -185,10 +173,6 @@ int main(int argc, char **argv) AMSResourceType resource = AMSResourceType::AMS_HOST; srand(time(NULL)); - - createUmpirePool("HOST", "TEST_HOST"); - AMSSetAllocator(AMSResourceType::AMS_HOST, "TEST_HOST"); - AMSCAbstrModel models[] = {AMSQueryModel(model1), AMSQueryModel(model2)}; for (int i = 0; i < 2; i++) { diff --git a/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp index 6ff55127..ff4b39ff 100644 --- a/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp @@ -8,22 +8,12 @@ #include #include #include -#include -#include #include #include #include "AMS.h" #include "wf/debug.h" -void createUmpirePool(std::string parent_name, std::string pool_name) -{ - auto &rm = umpire::ResourceManager::getInstance(); - auto alloc_resource = rm.makeAllocator( - pool_name, rm.getAllocator(parent_name)); -} - - AMSDType getDataType(char *d_type) { AMSDType dType = AMSDType::AMS_DOUBLE; @@ -72,8 +62,6 @@ struct Problem { int iterations, int num_elements) { - auto &rm = umpire::ResourceManager::getInstance(); - for (int i = 0; i < iterations; i++) { int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; std::vector inputs; @@ -168,9 +156,6 @@ int main(int argc, char **argv) uq_policy == AMSUQPolicy::AMS_RANDOM) && "Test only supports duq models"); - createUmpirePool("HOST", "TEST_HOST"); - AMSSetAllocator(AMSResourceType::AMS_HOST, "TEST_HOST"); - AMSCAbstrModel model_descr_1 = AMSRegisterAbstractModel( "test_1", uq_policy, threshold, model_path_1, nullptr, "test_1", -1); diff --git a/tests/AMSlib/ams_interface/ams_rmq_env.cpp b/tests/AMSlib/ams_interface/ams_rmq_env.cpp index 6db24edb..f037e1dc 100644 --- a/tests/AMSlib/ams_interface/ams_rmq_env.cpp +++ b/tests/AMSlib/ams_interface/ams_rmq_env.cpp @@ -8,24 +8,13 @@ #include #include #include -#include -#include #include #include +#include "../utils.hpp" #include "AMS.h" #include "wf/debug.h" -#include "../utils.hpp" - -void createUmpirePool(std::string parent_name, std::string pool_name) -{ - auto &rm = umpire::ResourceManager::getInstance(); - auto alloc_resource = rm.makeAllocator( - pool_name, rm.getAllocator(parent_name)); -} - - AMSDType getDataType(char *d_type) { AMSDType dType = AMSDType::AMS_DOUBLE; @@ -73,8 +62,6 @@ struct Problem { int iterations, int num_elements) { - auto &rm = umpire::ResourceManager::getInstance(); - for (int i = 0; i < iterations; i++) { int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; std::vector inputs; @@ -156,8 +143,6 @@ int main(int argc, char **argv) AMSResourceType resource = AMSResourceType::AMS_HOST; srand(time(NULL)); - createUmpirePool("HOST", "TEST_HOST"); - AMSSetAllocator(AMSResourceType::AMS_HOST, "TEST_HOST"); AMSCAbstrModel ams_model = AMSRegisterAbstractModel("rmq_db_no_model", AMSUQPolicy::AMS_RANDOM, From 0428867c0a092284f1d94b2267d131508fdc23f3 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 08:49:10 -0800 Subject: [PATCH 026/136] Remove cuda specific compilations --- tests/AMSlib/ams_interface/CMakeLists.txt | 10 ---------- tests/AMSlib/db/CMakeLists.txt | 8 -------- tests/AMSlib/torch/CMakeLists.txt | 5 ----- 3 files changed, 23 deletions(-) diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index 87e10f04..4b2475fa 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -166,16 +166,6 @@ function(BUILD_TEST exe source) target_include_directories(${exe} PRIVATE "${PROJECT_SOURCE_DIR}/src/AMSlib/" "${PROJECT_SOURCE_DIR}/src/AMSlib/include" ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) target_link_libraries(${exe} PRIVATE AMS ${AMS_APP_LIBRARIES}) - # This is "wrong" as we should not have a device code anymore. I keep it cause of - # weird umpire behavior - if(WITH_CUDA) - set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") - set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) - set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) - - target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") - endif() - target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) endfunction() diff --git a/tests/AMSlib/db/CMakeLists.txt b/tests/AMSlib/db/CMakeLists.txt index c107b40b..1aa7a65a 100644 --- a/tests/AMSlib/db/CMakeLists.txt +++ b/tests/AMSlib/db/CMakeLists.txt @@ -8,14 +8,6 @@ function(BUILD_UNIT_TEST exe source) target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS) target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) - - if(WITH_CUDA) - set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") - set_property(TARGET ${exe} PROPERTY CUDA_SEPARABLE_COMPILATION ON) - set_source_files_properties(${source} PROPERTIES LANGUAGE CUDA) - - target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") - endif() endfunction() function(ADD_HDF5_UNIT_TEST name exec) diff --git a/tests/AMSlib/torch/CMakeLists.txt b/tests/AMSlib/torch/CMakeLists.txt index 5e7776ed..d858bbaa 100644 --- a/tests/AMSlib/torch/CMakeLists.txt +++ b/tests/AMSlib/torch/CMakeLists.txt @@ -20,11 +20,6 @@ function(BUILD_UNIT_TEST exe source) target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS) target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) - - if(WITH_CUDA) - set_target_properties(${exe} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") - target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") - endif() endfunction() From 652cf8a28b271b73fd34188d656b20e8a3c7f151 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 10:20:41 -0800 Subject: [PATCH 027/136] Clean up cmake --- CMakeLists.txt | 100 ++++++---------------- src/AMSlib/CMakeLists.txt | 25 ++---- tests/AMSlib/ams_interface/CMakeLists.txt | 6 +- tests/AMSlib/db/CMakeLists.txt | 8 +- tests/AMSlib/models/CMakeLists.txt | 2 +- tests/AMSlib/torch/CMakeLists.txt | 13 +-- tests/AMSlib/wf/CMakeLists.txt | 10 ++- 7 files changed, 60 insertions(+), 104 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a8d82438..3742b9e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -37,7 +37,6 @@ option(WITH_EXAMPLES "Build examples" OFF) option(WITH_MPI "Option to enable MPI" OFF) option(WITH_CALIPER "Use Caliper for Profiling" OFF) option(WITH_TORCH "Use C/C++ Torch interface for Surrogate Model Inference" OFF) -option(WITH_TORCH_DEBUG "Compute RMSE of Surrogate Model and Physics Module" OFF) option(WITH_TESTS "Compile tests" OFF) option(WITH_HDF5 "Use HDF5 as a database back end" OFF) option(WITH_RMQ "Use RabbitMQ as a database back end (require a reachable and running RabbitMQ server service)" OFF) @@ -47,71 +46,51 @@ option(WITH_WORKFLOW "Install python drivers used by the outer workflow" O option(WITH_AMS_LIB "Install C++ library to support scientific applications" ON) option(BUILD_SHARED_LIBS "Build using shared libraries" ON) -if (WITH_MPI) - # SET(CMAKE_CXX_COMPILER "${MPI_CXX_COMPILER}" CACHE FILEPATH "CXX compiler overridden with MPI C++ wrapper") - #SET(CMAKE_C_COMPILER "${MPI_C_COMPILER}" CACHE FILEPATH "CXX compiler overridden with MPI C++ wrapper") +# ------------------------------------------------------------------------------ +find_package(nlohmann_json REQUIRED) +list(APPEND AMS_APP_LIBRARIES nlohmann_json::nlohmann_json) +# ------------------------------------------------------------------------------ +find_package(Threads REQUIRED) + +# ------------------------------------------------------------------------------ + +if (WITH_MPI) find_package(MPI REQUIRED) message(STATUS "MPICC: ${MPI_C_COMPILER}") message(STATUS "MPICXX: ${MPI_CXX_COMPILER}") - list(APPEND AMS_APP_LIBRARIES MPI::MPI_CXX) message(STATUS "MPI Library used: " MPI::MPI_CXX) - list(APPEND AMS_APP_DEFINES "-D__ENABLE_MPI__") endif() # ------------------------------------------------------------------------------ if (WITH_CUDA) - if (NOT DEFINED AMS_CUDA_ARCH) - message(WARNING "CUDA ARCH IS NOT DEFINED, USING 70") - set(AMS_CUDA_ARCH 70) - endif() - - if (BUILD_SHARED_LIBS) - set(CUDA_RUNTIME_LIBRARY "Shared") - else() - set(CUDA_RUNTIME_LIBRARY "Static") - endif() - - # we need to enable nvcc - enable_language(CUDA) - # set(CMAKE_CUDA_STANDARD 14) - # Turn off message of mfem - set(ENABLE_CUDA True) - list(APPEND AMS_APP_LIBRARIES ${CUDA_LIBRARIES} cuda) - list(APPEND AMS_APP_DEFINES "-D__ENABLE_CUDA__") - set(THRUST_IGNORE_CUB_VERSION_CHECK True) + find_package(CUDAToolkit) endif() + # ------------------------------------------------------------------------------ if (WITH_CALIPER) find_package(caliper REQUIRED) - list(APPEND AMS_APP_INCLUDES ${caliper_INCLUDE_DIR}) - list(APPEND AMS_APP_LIBRARIES caliper) - list(APPEND AMS_APP_DEFINES "-D__ENABLE_CALIPER__") endif() if (WITH_AMS_DEBUG) list(APPEND AMS_APP_DEFINES "-DLIBAMS_VERBOSE") endif() -# ------------------------------------------------------------------------------ -list(APPEND AMS_APP_DEFINES "-D__ENABLE_DB__") - if (WITH_HDF5) + message(WARNING "WARNING") + set(HDF5_ROOT ${AMS_HDF5_DIR}) if (HDF5_USE_STATIC_LIBRARIES) - find_package(HDF5 NAMES hdf5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) - list(APPEND AMS_APP_LIBRARIES ${HDF5_C_STATIC_LIBRARY}) - message(STATUS "HDF5 Static Library : ${HDF5_C_STATIC_LIBRARY}") - set(AMS_HDF5_LIB_TYPE "static") + find_package(HDF5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) + set(AMS_HDF5_TARGET hdf5-static) + message(STATUS "HDF5 uses Static Library : ${AMS_HDF5_TARGET}") else() - find_package(HDF5 NAMES hdf5 COMPONENTS C shared NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) - list(APPEND AMS_APP_LIBRARIES ${HDF5_C_SHARED_LIBRARY}) - message(STATUS "HDF5 Shared Library : ${HDF5_C_SHARED_LIBRARY}") - set(AMS_HDF5_LIB_TYPE "shared") + find_package(HDF5 COMPONENTS C shared NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) + set(AMS_HDF5_TARGET hdf5-shared) + message(STATUS "HDF5 uses Shared Library : ${AMS_HDF5_TARGET}") endif() - list(APPEND AMS_APP_INCLUDES ${HDF5_INCLUDE_DIR}) list(APPEND AMS_APP_DEFINES "-D__ENABLE_HDF5__") - message(STATUS "HDF5 Include directories: ${HDF5_INCLUDE_DIR}") + endif() # WITH_HDF5 if (WITH_RMQ) @@ -144,23 +123,6 @@ if (WITH_RMQ) list(APPEND AMS_APP_LIBRARIES amqpcpp event_pthreads event) endif() # WITH_RMQ -if(NOT DEFINED UMPIRE_DIR) - message(FATAL_ERROR "Missing required 'UMPIRE_DIR' variable pointing to an installed Umpire ${UMPIRE_DIR}") -endif() - -find_package(UMPIRE REQUIRED - NO_DEFAULT_PATH - PATHS ${UMPIRE_DIR}/share/umpire/cmake ${UMPIRE_DIR}/lib/cmake/umpire) -list(APPEND AMS_APP_LIBRARIES umpire) -list(APPEND AMS_APP_INCLUDES ${UMPIRE_INCLUDE_DIR}) - -# ------------------------------------------------------------------------------ -find_package(nlohmann_json REQUIRED) -list(APPEND AMS_APP_LIBRARIES nlohmann_json::nlohmann_json) - -# ------------------------------------------------------------------------------ -find_package(Threads REQUIRED) - # ------------------------------------------------------------------------------ if (WITH_TORCH) find_package(Torch REQUIRED) @@ -169,13 +131,6 @@ if (WITH_TORCH) set(CMAKE_CUDA_FLAGS "") set(CMAKE_CUDA_ARCHITECTURES ON) - list(APPEND AMS_APP_INCLUDES "${TORCH_INCLUDE_DIRS}") - list(APPEND AMS_APP_LIBRARIES "${TORCH_LIBRARIES}") - - list(APPEND AMS_APP_DEFINES "-D__ENABLE_TORCH__") - set(BLA_VENDER OpenBLAS) - find_package(BLAS REQUIRED) - list(APPEND AMS_APP_LIBRARIES "${BLAS_LIBRARIES}") endif() # ------------------------------------------------------------------------------ @@ -200,6 +155,12 @@ endif() add_subdirectory(src) +if (WITH_TESTS) + include(CTest) + add_subdirectory(tests) +endif() + + # ------------------------------------------------------------------------------ if (WITH_AMS_LIB) if (WITH_EXAMPLES) @@ -244,10 +205,6 @@ if (WITH_EXAMPLES) list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_CALIPER__") endif() - if (WITH_TORCH) - list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_TORCH__") - endif() - if (WITH_PERFFLOWASPECT) list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_PERFFLOWASPECT__") endif() @@ -256,9 +213,4 @@ if (WITH_EXAMPLES) endif() endif() -if (WITH_TESTS) - include(CTest) - add_subdirectory(tests) -endif() - # ------------------------------------------------------------------------------ diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index 79d8cf97..c097e4b0 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -26,30 +26,23 @@ add_library(AMS ${AMS_LIB_SRC}) # setup the lib first message(STATUS "ALL INCLUDES ARE ${AMS_APP_INCLUDES}") target_compile_definitions(AMS PRIVATE ${AMS_APP_DEFINES}) -target_include_directories(AMS PRIVATE ${AMS_APP_INCLUDES}) target_include_directories(AMS PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include) -target_link_directories(AMS PUBLIC ${AMS_APP_LIB_DIRS}) -target_link_libraries(AMS PRIVATE ${AMS_APP_LIBRARIES} stdc++fs) -#------------------------------------------------------------------------------- -# create the configuration header file with the respective information -#------------------------------------------------------------------------------- -set(CALIPER_DEFINES "// #define __AMS_ENABLE_CALIPER__") -set(MPI_DEFINES "// #define __AMS_ENABLE_MPI__") -set(PERFF_DEFINES "// #define __AMS_ENABLE_PERFFLOWASPECT__") - -if (${WITH_CALIPER}) - set(CALIPER_DEFINES "#define __AMS_ENABLE_CALIPER__") +if (WITH_CUDA) + target_link_libraries(AMS PRIVATE CUDA::cudart) endif() -if (${WITH_MPI}) - set(MPI_DEFINES "#define __AMS_ENABLE_MPI__") +if (WITH_HDF5) + target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) endif() -if (${WITH_PERFFLOWASPECT}) - set(PERFF_DEFINES "#define __AMS_ENABLE_PERFFLOWASPECT__") +if (WITH_MPI) + target_link_libraries(AMS PRIVATE MPI::MPI_CXX) endif() +target_link_libraries(AMS PRIVATE stdc++fs torch) + + configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMS-config.h.in" "${PROJECT_BINARY_DIR}/include/AMS-config.h") configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMS.h" "${PROJECT_BINARY_DIR}/include/AMS.h" COPYONLY) configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMSTypes.hpp" "${PROJECT_BINARY_DIR}/include/AMSTypes.hpp" COPYONLY) diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index 4b2475fa..b3a0e266 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -164,8 +164,10 @@ endfunction() function(BUILD_TEST exe source) add_executable(${exe} ${source}) target_include_directories(${exe} PRIVATE "${PROJECT_SOURCE_DIR}/src/AMSlib/" "${PROJECT_SOURCE_DIR}/src/AMSlib/include" ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) - target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) - target_link_libraries(${exe} PRIVATE AMS ${AMS_APP_LIBRARIES}) + target_link_libraries(${exe} PRIVATE AMS torch) + if (WITH_HDF5) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) + endif() target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) endfunction() diff --git a/tests/AMSlib/db/CMakeLists.txt b/tests/AMSlib/db/CMakeLists.txt index 1aa7a65a..3038f908 100644 --- a/tests/AMSlib/db/CMakeLists.txt +++ b/tests/AMSlib/db/CMakeLists.txt @@ -4,14 +4,18 @@ function(BUILD_UNIT_TEST exe source) target_include_directories(${exe} PRIVATE ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) - target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) - target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS) + target_link_libraries(${exe} PRIVATE stdc++fs AMS torch) + + if (WITH_HDF5) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) + endif() target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) endfunction() function(ADD_HDF5_UNIT_TEST name exec) add_test(NAME ${name} COMMAND ${exec} ${ARGN}) + set_tests_properties(${name} PROPERTIES LABELS HDF5_UNIT_TEST) endfunction() diff --git a/tests/AMSlib/models/CMakeLists.txt b/tests/AMSlib/models/CMakeLists.txt index fdd0b259..97a8b01e 100644 --- a/tests/AMSlib/models/CMakeLists.txt +++ b/tests/AMSlib/models/CMakeLists.txt @@ -41,7 +41,7 @@ add_custom_target(generate_cpu_models ALL COMMENT "Generate cpu models before ctests..." ) -if (ENABLE_CUDA) +if (WITH_CUDA) set(GENERATED_GPU_MODELS ${CMAKE_CURRENT_BINARY_DIR}/double_gpu_duq_max.pt ${CMAKE_CURRENT_BINARY_DIR}/double_gpu_duq_mean.pt diff --git a/tests/AMSlib/torch/CMakeLists.txt b/tests/AMSlib/torch/CMakeLists.txt index d858bbaa..710e8076 100644 --- a/tests/AMSlib/torch/CMakeLists.txt +++ b/tests/AMSlib/torch/CMakeLists.txt @@ -9,15 +9,18 @@ function(BUILD_UNIT_TEST exe source) add_executable(${exe} ${source}) add_dependencies(${exe} generate_cpu_models) - if (ENABLE_CUDA) + if (WITH_CUDA) add_dependencies(${exe} generate_gpu_models) + target_link_libraries(${exe} PRIVATE CUDA::cudart) endif() - target_include_directories(${exe} PRIVATE ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) - target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) - target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS) + target_link_libraries(${exe} PRIVATE stdc++fs AMS torch) + if (WITH_HDF5) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) + endif() + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) endfunction() @@ -65,7 +68,7 @@ ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMean::Single ams_convert_ ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMax::Double ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/double_cpu_duq_max.pt "duq_max") ADD_TORCH_UNIT_TEST(Surrogate::EvaluateAndCat::HOST::UQMax::Single ams_convert_and_evaluate_model "2000,8" "2000,8" ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max") -if(ENABLE_CUDA) +if(WITH_CUDA) #detect datatype ADD_TORCH_UNIT_TEST(Surrogate::DType::DEVICE::Double::Random ams_verify_dtype double ${TORCH_MODEL_DIR}/double_gpu_random.pt) diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt index 7c73b90c..3e839504 100644 --- a/tests/AMSlib/wf/CMakeLists.txt +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -7,15 +7,17 @@ endfunction() function(BUILD_UNIT_TEST exe source) add_executable(${exe} ${source}) - target_include_directories(${exe} PRIVATE ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) - target_link_directories(${exe} PRIVATE ${AMS_APP_LIB_DIRS}) - target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS) + target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS torch) + if (WITH_HDF5) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) + endif() target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) if(WITH_CUDA) + target_link_libraries(${exe} PRIVATE CUDA::cudart) target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") endif() endfunction() @@ -80,7 +82,7 @@ ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhDouble:: ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") -if (ENABLE_CUDA) +if (WITH_CUDA) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::FLOAT::FLOAT domain_to_application float float cuda) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::DOUBLE::FLOAT domain_to_application double float cuda) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::FLOAT::DOUBLE domain_to_application float double cuda) From 012d05220f7735913fcaa957f15fdbd4f3cd0a59 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 15:18:25 -0800 Subject: [PATCH 028/136] Adopt new interface on ideal gas --- examples/CMakeLists.txt | 8 +- examples/ideal_gas/app/eos_ams.cpp | 94 +++++------ examples/ideal_gas/app/eos_ams.hpp | 52 ++---- examples/ideal_gas/main.cpp | 247 ++++------------------------- src/AMSlib/CMakeLists.txt | 28 +++- src/AMSlib/include/AMS.h | 1 - 6 files changed, 114 insertions(+), 316 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 6b1d7d0e..9c229a38 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -3,8 +3,8 @@ # # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -add_subdirectory(ideal_gas) -if (WITH_CUDA) -add_subdirectory(bnm_opt) -endif() +#add_subdirectory(ideal_gas) +#if (WITH_CUDA) +#add_subdirectory(bnm_opt) +#endif() diff --git a/examples/ideal_gas/app/eos_ams.cpp b/examples/ideal_gas/app/eos_ams.cpp index cf7b9de5..7fdaff04 100644 --- a/examples/ideal_gas/app/eos_ams.cpp +++ b/examples/ideal_gas/app/eos_ams.cpp @@ -5,64 +5,27 @@ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception */ -#include "eos_ams.hpp" - +#include #include -template -void callBack(void *cls, - long elements, - const void *const *inputs, - void *const *outputs) -{ - static_cast *>(cls)->Eval(elements, - static_cast(inputs[0]), - static_cast(inputs[1]), - static_cast(outputs[0]), - static_cast(outputs[1]), - static_cast(outputs[2]), - static_cast(outputs[3])); -} +#include "eos_ams.hpp" +using namespace ams; template -AMSEOS::AMSEOS(EOS *model, - const AMSDBType db_type, - const AMSDType dtype, +AMSEOS::AMSEOS(const AMSDBType db_type, + const AMSResourceType resource, const AMSExecPolicy exec_policy, - const AMSResourceType res_type, const AMSUQPolicy uq_policy, - const int k_nearest, const int mpi_task, const int mpi_nproc, const double threshold, - const char *surrogate_path, - const char *uq_path) - : model_(model) + const char *surrogate_path) + : res_(resource), IdealGas(1.6, 1.4) { - AMSCAbstrModel model_descr = AMSRegisterAbstractModel("ideal_gas", - uq_policy, - threshold, - surrogate_path, - uq_path, - "ideal_gas", - k_nearest); -#ifdef __ENABLE_MPI__ - wf_ = AMSCreateDistributedExecutor(model_descr, - dtype, - res_type, - (AMSPhysicFn)callBack, - MPI_COMM_WORLD, - mpi_task, - mpi_nproc); -#else - wf_ = AMSCreateExecutor(model_descr, - dtype, - res_type, - (AMSPhysicFn)callBack, - mpi_task, - mpi_nproc); -#endif + AMSCAbstrModel model_descr = ams::AMSRegisterAbstractModel( + "ideal_gas", uq_policy, threshold, surrogate_path, "ideal_gas"); + wf_ = AMSCreateExecutor(model_descr, mpi_task, mpi_nproc); } template @@ -77,16 +40,35 @@ void AMSEOS::Eval(const int length, FPType *bulkmod, FPType *temperature) const { - std::vector inputs = {density, energy}; - std::vector outputs = {pressure, soundspeed2, bulkmod, temperature}; + ams::SmallVector inputs = { + ams::AMSTensor::view(density, {length, 1}, {1, 1}, res_), + ams::AMSTensor::view(density, {length, 1}, {1, 1}, res_), + }; + + ams::SmallVector inout; + ams::SmallVector outputs = { + ams::AMSTensor::view(pressure, {length, 1}, {1, 1}, res_), + ams::AMSTensor::view(soundspeed2, {length, 1}, {1, 1}, res_), + ams::AMSTensor::view(bulkmod, {length, 1}, {1, 1}, res_), + ams::AMSTensor::view(temperature, {length, 1}, {1, 1}, res_), + }; + + EOSLambda OrigComputation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + IdealGas::Eval( + ams_ins[0].shape()[1], + static_cast(ams_ins[0].data()), + static_cast(inputs[1].data()), + static_cast(ams_outs[0].data()), + static_cast(ams_outs[1].data()), + static_cast(ams_outs[2].data()), + static_cast(ams_outs[3].data())); + }; + - AMSExecute(wf_, - (void *)model_, - length, - reinterpret_cast(inputs.data()), - reinterpret_cast(outputs.data()), - inputs.size(), - outputs.size()); + AMSExecute(wf_, OrigComputation, inputs, inout, outputs); } template class AMSEOS; diff --git a/examples/ideal_gas/app/eos_ams.hpp b/examples/ideal_gas/app/eos_ams.hpp index c799568c..ac9748d1 100644 --- a/examples/ideal_gas/app/eos_ams.hpp +++ b/examples/ideal_gas/app/eos_ams.hpp @@ -11,49 +11,31 @@ #include #include "AMS.h" -#include "eos.hpp" +#include "eos_idealgas.hpp" template -class AMSEOS : public EOS +class AMSEOS : public IdealGas { - AMSExecutor wf_; - EOS *model_ = nullptr; + ams::AMSExecutor wf_; + ams::AMSResourceType res_; public: - AMSEOS(EOS *model, - const AMSDBType db_type, - const AMSDType dtype, - const AMSExecPolicy exec_policy, - const AMSResourceType res_type, - const AMSUQPolicy uq_policy, - const int k_nearest, + AMSEOS(const ams::AMSDBType db_type, + const ams::AMSResourceType resource, + const ams::AMSExecPolicy exec_policy, + const ams::AMSUQPolicy uq_policy, const int mpi_task, const int mpi_nproc, const double threshold, - const char *surrogate_path, - const char *uq_path); - - virtual ~AMSEOS() { delete model_; } - - void Eval(const int length, - const FPType *density, - const FPType *energy, - FPType *pressure, - FPType *soundspeed2, - FPType *bulkmod, - FPType *temperature) const override; - - void Eval_with_filter(const int length, - const FPType *density, - const FPType *energy, - const bool *filter, - FPType *pressure, - FPType *soundspeed2, - FPType *bulkmod, - FPType *temperature) const override - { - throw std::runtime_error("AMSEOS: Eval_with_filter is not implemented"); - } + const char *surrogate_path); + + virtual void Eval(const int length, + const FPType *density, + const FPType *energy, + FPType *pressure, + FPType *soundspeed2, + FPType *bulkmod, + FPType *temperature) const override; }; #endif // _AMS_EOS_HPP_ diff --git a/examples/ideal_gas/main.cpp b/examples/ideal_gas/main.cpp index b35d4293..d71f653b 100644 --- a/examples/ideal_gas/main.cpp +++ b/examples/ideal_gas/main.cpp @@ -5,9 +5,6 @@ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception */ -#ifdef __AMS_ENABLE_ADIAK__ -#include -#endif #include #include #include @@ -31,7 +28,8 @@ // this macro completely bypasses all AMS functionality // this allows us to check how easy is it to test ams -#include "AMS.h" +#include +using namespace ams; void printMemory(std::unordered_set &allocators) { @@ -56,68 +54,21 @@ void createUmpirePool(std::string parent_name, std::string pool_name) pool_name, rm.getAllocator(parent_name)); } -std::unordered_set createMemoryAllocators( - std::string pool, - std::string &physics_host_alloc, - std::string &physics_device_alloc, - std::string &physics_pinned_alloc, - std::string &ams_host_alloc, - std::string &ams_device_alloc, - std::string &ams_pinned_alloc) +void createMemoryAllocators(std::string &physics_host_alloc, + std::string &physics_device_alloc, + std::string &physics_pinned_alloc) { std::unordered_set allocator_names; if (pool == "default") { - physics_host_alloc = ams_host_alloc = "HOST"; - allocator_names.insert(ams_host_alloc); + physics_host_alloc = "HOST"; #ifdef __ENABLE_CUDA__ - physics_device_alloc = ams_device_alloc = "DEVICE"; - allocator_names.insert(ams_device_alloc); - physics_pinned_alloc = ams_pinned_alloc = "PINNED"; - allocator_names.insert(ams_pinned_alloc); -#endif - } else if (pool == "split") { - physics_host_alloc = "phys-host"; - createUmpirePool("HOST", "phys-host"); - allocator_names.insert(physics_host_alloc); - - ams_host_alloc = "ams-host"; - createUmpirePool("HOST", ams_host_alloc); - allocator_names.insert(ams_host_alloc); - -#ifdef __ENABLE_CUDA__ - physics_device_alloc = "phys-device"; - createUmpirePool("DEVICE", physics_device_alloc); - allocator_names.insert(physics_device_alloc); - - physics_pinned_alloc = "phys-pinned"; - createUmpirePool("PINNED", physics_pinned_alloc); - allocator_names.insert(physics_pinned_alloc); - - ams_device_alloc = "ams-device"; - createUmpirePool("DEVICE", ams_device_alloc); - allocator_names.insert(ams_device_alloc); - - ams_pinned_alloc = "ams-pinned"; - createUmpirePool("PINNED", ams_pinned_alloc); - allocator_names.insert(ams_pinned_alloc); -#endif - } else if (pool == "same") { - physics_host_alloc = ams_host_alloc = "common-host"; - createUmpirePool("HOST", "common-host"); - allocator_names.insert(physics_host_alloc); -#ifdef __ENABLE_CUDA__ - physics_device_alloc = ams_device_alloc = "common-device"; - createUmpirePool("DEVICE", "common-device"); - allocator_names.insert(ams_device_alloc); - physics_pinned_alloc = ams_pinned_alloc = "common-pinned"; - createUmpirePool("PINNED", "common-pinned"); - allocator_names.insert(ams_pinned_alloc); + physics_device_alloc = "DEVICE"; + physics_pinned_alloc = "PINNED"; #endif } else { std::cout << "Stategy is " << pool << "\n"; throw std::runtime_error("Pool strategy does not exist\n"); } - return std::move(allocator_names); } int computeNumElements(int globalNumElements, int id, int numRanks) @@ -148,7 +99,6 @@ template int run(const char *device_name, const char *db_type, const char *uq_policy_opt, - AMSDType precision, int seed, int rId, int imbalance, @@ -156,7 +106,6 @@ int run(const char *device_name, double avg, double stdDev, double threshold, - const char *pool, int num_mats, int num_elems, int num_qpts, @@ -165,11 +114,8 @@ int run(const char *device_name, const char *eos_name, int stop_cycle, bool pack_sparse_mats, - const char *hdcache_path, const char *model_path, - const char *db_config, - bool lbalance, - int k_nearest) + const char *db_config) { // ------------------------------------------------------------------------- // setup @@ -180,9 +126,7 @@ int run(const char *device_name, const bool use_device = std::strcmp(device_name, "cpu") != 0; AMSDBType dbType = AMSDBType::AMS_NONE; - if (std::strcmp(db_type, "csv") == 0) { - dbType = AMSDBType::AMS_CSV; - } else if (std::strcmp(db_type, "hdf5") == 0) { + if (std::strcmp(db_type, "hdf5") == 0) { dbType = AMSDBType::AMS_HDF5; } else if (std::strcmp(db_type, "rmq") == 0) { dbType = AMSDBType::AMS_RMQ; @@ -196,12 +140,7 @@ int run(const char *device_name, } AMSUQPolicy uq_policy; - - if (strcmp(uq_policy_opt, "faiss-max") == 0) - uq_policy = AMSUQPolicy::AMS_FAISS_MAX; - else if (strcmp(uq_policy_opt, "faiss-mean") == 0) - uq_policy = AMSUQPolicy::AMS_FAISS_MEAN; - else if (strcmp(uq_policy_opt, "deltauq-max") == 0) + if (strcmp(uq_policy_opt, "deltauq-max") == 0) uq_policy = AMSUQPolicy::AMS_DELTAUQ_MAX; else if (strcmp(uq_policy_opt, "deltauq-mean") == 0) uq_policy = AMSUQPolicy::AMS_DELTAUQ_MEAN; @@ -246,17 +185,9 @@ int run(const char *device_name, std::string physics_device_alloc; std::string physics_pinned_alloc; - std::string ams_host_alloc; - std::string ams_device_alloc; - std::string ams_pinned_alloc; - - auto allocator_names = createMemoryAllocators(std::string(pool), - physics_host_alloc, - physics_device_alloc, - physics_pinned_alloc, - ams_host_alloc, - ams_device_alloc, - ams_pinned_alloc); + createMemoryAllocators(physics_host_alloc, + physics_device_alloc, + physics_pinned_alloc); mfem::MemoryManager::SetUmpireHostAllocatorName(physics_host_alloc.c_str()); @@ -266,17 +197,6 @@ int run(const char *device_name, } - // When we are not allocating from parent/root umpire allocator - // we need to inform AMS about the pool allocators. - if (strcmp(pool, "default") != 0) { - AMSSetAllocator(AMSResourceType::AMS_HOST, ams_host_alloc.c_str()); - - if (use_device) { - AMSSetAllocator(AMSResourceType::AMS_DEVICE, ams_device_alloc.c_str()); - AMSSetAllocator(AMSResourceType::AMS_PINNED, ams_pinned_alloc.c_str()); - } - } - mfem::Device::SetMemoryTypes(mfem::MemoryType::HOST_UMPIRE, mfem::MemoryType::DEVICE_UMPIRE); @@ -325,29 +245,17 @@ int run(const char *device_name, // --------------------------------------------------------------------- // setup AMS options // --------------------------------------------------------------------- -#ifdef USE_AMS - constexpr bool use_ams = true; - const char *uq_path = nullptr; + constexpr bool use_ams = false; const char *surrogate_path = nullptr; const char *db_path = nullptr; -#ifdef __ENABLE_FAISS__ - uq_path = (strlen(hdcache_path) > 0) ? hdcache_path : nullptr; -#endif - std::cout << "surrogate Path is : " << model_path << "\n"; -#ifdef __ENABLE_TORCH__ surrogate_path = (strlen(model_path) > 0) ? model_path : nullptr; -#endif db_path = (strlen(db_config) > 0) ? db_config : nullptr; - AMSResourceType ams_device = AMSResourceType::AMS_HOST; - if (use_device) ams_device = AMSResourceType::AMS_DEVICE; - AMSExecPolicy ams_loadBalance = AMSExecPolicy::AMS_UBALANCED; - if (lbalance) ams_loadBalance = AMSExecPolicy::AMS_BALANCED; -#else - constexpr bool use_ams = false; +#ifdef USE_AMS + constexpr bool use_ams = true; #endif // --------------------------------------------------------------------- @@ -358,26 +266,23 @@ int run(const char *device_name, EOS *base; if (eos_name == std::string("ideal_gas")) { base = new IdealGas(1.6, 1.4); - } else if (eos_name == std::string("constant_host")) { - base = new ConstantEOSOnHost(physics_host_alloc.c_str(), 1.0); } else { std::cerr << "unknown eos `" << eos_name << "'" << std::endl; return 1; } #ifdef USE_AMS if (use_ams) { - eoses[mat_idx] = new AMSEOS(base, - dbType, - precision, - ams_loadBalance, - ams_device, - uq_policy, - k_nearest, - rId, - wS, - threshold, - surrogate_path, - uq_path); + eoses[mat_idx] = + new AMSEOS(dbType, + use_device == true + ? ams::AMSResourceType::AMS_DEVICE + : ams::AMSResourceType::AMS_HOST, + ams_loadBalance, + uq_policy, + rId, + wS, + threshold, + surrogate_path); } else #endif @@ -578,7 +483,6 @@ int run(const char *device_name, } CALIPER(CALI_MARK_END("Cycle");) MPI_CALL(MPI_Barrier(MPI_COMM_WORLD)); - printMemory(allocator_names); } // TODO: Add smart-pointers @@ -592,7 +496,6 @@ int run(const char *device_name, return 0; } -PERFFASPECT() int main(int argc, char **argv) { // ------------------------------------------------------------------------- @@ -605,9 +508,9 @@ int main(int argc, char **argv) int rId = 0; // Level of Threading provided by MPI int provided = 0; - MPI_CALL(MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &provided)); - MPI_CALL(MPI_Comm_size(MPI_COMM_WORLD, &wS)); - MPI_CALL(MPI_Comm_rank(MPI_COMM_WORLD, &rId)); + MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &provided); + MPI_Comm_size(MPI_COMM_WORLD, &wS); + MPI_Comm_rank(MPI_COMM_WORLD, &rId); // FIXME: Create a logger class to write // depending on rank id and severity. if (rId != 0) { @@ -617,15 +520,12 @@ int main(int argc, char **argv) const char *device_name = "cpu"; const char *eos_name = "ideal_gas"; const char *model_path = ""; - const char *hdcache_path = ""; const char *db_config = ""; const char *db_type = ""; const char *precision_opt = "double"; - AMSDType precision = AMSDType::AMS_DOUBLE; const char *uq_policy_opt = ""; - int k_nearest = 5; int seed = 0; double empty_element_ratio = -1; @@ -651,30 +551,6 @@ int main(int argc, char **argv) bool verbose = false; -#ifdef __AMS_ENABLE_ADIAK__ - // add adiak init here - adiak::init(NULL); - - // replace with adiak::collect_all(); once adiak v0.4.0 - adiak::uid(); - adiak::launchdate(); - adiak::launchday(); - adiak::executable(); - adiak::executablepath(); - adiak::workdir(); - adiak::libraries(); - adiak::cmdline(); - adiak::hostname(); - adiak::clustername(); - adiak::walltime(); - adiak::systime(); - adiak::cputime(); - adiak::jobsize(); - adiak::hostlist(); - adiak::numhosts(); - adiak::value("compiler", std::string("@RAJAPERF_COMPILER@")); -#endif - // ------------------------------------------------------------------------- // setup command line parser // ------------------------------------------------------------------------- @@ -689,7 +565,6 @@ int main(int argc, char **argv) // surrogate model args.AddOption(&model_path, "-S", "--surrogate", "Path to surrogate model"); - args.AddOption(&hdcache_path, "-H", "--hdcache", "Path to hdcache index"); // eos model and length of simulation args.AddOption(&eos_name, "-z", "--eos", "EOS model type"); @@ -735,13 +610,6 @@ int main(int argc, char **argv) "--stdev", "Standard deviation of random number generator of imbalance "); - args.AddOption(&lbalance, - "-lb", - "--with-load-balance", - "-nlb", - "--without-load-balance", - "Enable Load balance module in AMS"); - args.AddOption(&threshold, "-t", "--threshold", @@ -759,25 +627,13 @@ int main(int argc, char **argv) "-dt", "--dbtype", "Configuration option of the different DB types:\n" - "\t 'csv' Use csv as back end\n" "\t 'hdf5': use hdf5 as a back end\n" "\t 'rmq': use RabbitMQ as a back end\n"); - args.AddOption(&k_nearest, - "-knn", - "--k-nearest-neighbors", - "Number of closest neightbors we should look at"); - args.AddOption(&uq_policy_opt, "-uq", "--uqtype", "Types of UQ to select from: \n" - "\t 'faiss-mean' Uncertainty is computed in comparison " - "against the " - "mean distance of k-nearest neighbors\n" - "\t 'faiss-max': Uncertainty is computed in comparison with " - "the " - "k'st cluster \n" "\t 'deltauq-mean': Uncertainty through DUQ using mean\n" "\t 'deltauq-max': Uncertainty through DUQ using max\n" "\t 'random': Uncertainty throug a random model\n"); @@ -785,14 +641,6 @@ int main(int argc, char **argv) args.AddOption( &verbose, "-v", "--verbose", "-qu", "--quiet", "Print extra stuff"); - args.AddOption(&pool, - "-ptype", - "--pool-type", - "How to assign memory pools to AMSlib:\n" - "\t 'default' Use the default Umpire pool\n" - "\t 'split' provide a separate pool to AMSlib\n" - "\t 'same': assign the same with physics to AMS\n"); - // ------------------------------------------------------------------------- // parse arguments // ------------------------------------------------------------------------- @@ -842,21 +690,11 @@ int main(int argc, char **argv) std::cout << "Total computed elements across all ranks: " << wS * num_elems << "(Weak Scaling)\n"; - if (strcmp(precision_opt, "single") == 0) - precision = AMSDType::AMS_SINGLE; - else if (strcmp(precision_opt, "double") == 0) - precision = AMSDType::AMS_DOUBLE; - else { - std::cerr << "Invalid precision " << precision_opt << "\n"; - return -1; - } - int ret = 0; - if (precision == AMSDType::AMS_SINGLE) + if (strcmp(precision_opt, "single") == 0) ret = run(device_name, db_type, uq_policy_opt, - precision, seed, rId, imbalance, @@ -864,7 +702,6 @@ int main(int argc, char **argv) avg, stdDev, threshold, - pool, num_mats, num_elems, num_qpts, @@ -873,16 +710,12 @@ int main(int argc, char **argv) eos_name, stop_cycle, pack_sparse_mats, - hdcache_path, model_path, - db_config, - lbalance, - k_nearest); - else if (precision == AMSDType::AMS_DOUBLE) + db_config); + else if (strcmp(precision_opt, "double") == 0) ret = run(device_name, db_type, uq_policy_opt, - precision, seed, rId, imbalance, @@ -890,7 +723,6 @@ int main(int argc, char **argv) avg, stdDev, threshold, - pool, num_mats, num_elems, num_qpts, @@ -899,22 +731,13 @@ int main(int argc, char **argv) eos_name, stop_cycle, pack_sparse_mats, - hdcache_path, model_path, - db_config, - lbalance, - k_nearest); + db_config); else { std::cerr << "Invalid precision " << precision_opt << "\n"; return -1; } - // --------------------------------------------------------------------------- -#ifdef __AMS_ENABLE_ADIAK__ - // adiak finalize - adiak::fini(); -#endif - MPI_CALL(MPI_Finalize()); AMSFinalize(); return ret; diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index c097e4b0..d52f027f 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -55,13 +55,25 @@ configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMSTensor.hpp" "${PROJECT_B # ------------------------------------------------------------------------------ # installation paths -#install(TARGETS AMS -# EXPORT AMSTargets -# DESTINATION lib) -# -#install(EXPORT AMSTargets -# FILE AMS.cmake -# DESTINATION lib/cmake/AMS) +include(GNUInstallDirs) + +# Install the library +install(TARGETS AMS + EXPORT AMSTargets + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" +) + + +install(EXPORT AMSTargets + NAMESPACE AMS:: + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/AMS" +) + # -#install(FILES ${PROJECT_BINARY_DIR}/include/AMS.h DESTINATION include) +install(FILES ${PROJECT_BINARY_DIR}/include/AMS.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(FILES ${PROJECT_BINARY_DIR}/include/AMSTensor.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(FILES ${PROJECT_BINARY_DIR}/include/AMSTypes.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(FILES ${PROJECT_BINARY_DIR}/include/ArrayRef.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install(FILES ${PROJECT_BINARY_DIR}/include/SmallVector.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) #install(FILES ${PROJECT_BINARY_DIR}/include/AMS-config.h DESTINATION include) diff --git a/src/AMSlib/include/AMS.h b/src/AMSlib/include/AMS.h index ae43625a..5583f801 100644 --- a/src/AMSlib/include/AMS.h +++ b/src/AMSlib/include/AMS.h @@ -8,7 +8,6 @@ #include -//#include "AMS-config.h" #include "AMSTensor.hpp" #include "AMSTypes.hpp" From b1d0307eaac2c3c4d1f027c6c012cbcb12807842 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 26 Dec 2024 17:56:46 -0800 Subject: [PATCH 029/136] Update tests for gitlab --- CMakeLists.txt | 14 +++++--------- scripts/gitlab/ci-build-test.sh | 30 +++++++++++++----------------- src/AMSlib/AMSTensor.cpp | 11 ++++++++++- src/AMSlib/CMakeLists.txt | 12 ++++-------- tests/AMSlib/CMakeLists.txt | 2 ++ tests/AMSlib/wf/CMakeLists.txt | 12 ++++++------ 6 files changed, 40 insertions(+), 41 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3742b9e6..9aa14188 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,6 @@ option(WITH_CUDA "Option to enable CUDA" OFF) option(WITH_EXAMPLES "Build examples" OFF) option(WITH_MPI "Option to enable MPI" OFF) option(WITH_CALIPER "Use Caliper for Profiling" OFF) -option(WITH_TORCH "Use C/C++ Torch interface for Surrogate Model Inference" OFF) option(WITH_TESTS "Compile tests" OFF) option(WITH_HDF5 "Use HDF5 as a database back end" OFF) option(WITH_RMQ "Use RabbitMQ as a database back end (require a reachable and running RabbitMQ server service)" OFF) @@ -90,7 +89,6 @@ else() message(STATUS "HDF5 uses Shared Library : ${AMS_HDF5_TARGET}") endif() list(APPEND AMS_APP_DEFINES "-D__ENABLE_HDF5__") - endif() # WITH_HDF5 if (WITH_RMQ) @@ -124,14 +122,12 @@ if (WITH_RMQ) endif() # WITH_RMQ # ------------------------------------------------------------------------------ -if (WITH_TORCH) - find_package(Torch REQUIRED) - # This is annoying, torch populates all my cuda flags - # and resets them - set(CMAKE_CUDA_FLAGS "") - set(CMAKE_CUDA_ARCHITECTURES ON) +find_package(Torch REQUIRED) +# This is annoying, torch populates all my cuda flags +# and resets them +set(CMAKE_CUDA_FLAGS "") +set(CMAKE_CUDA_ARCHITECTURES ON) -endif() # ------------------------------------------------------------------------------ if (WITH_RZ) diff --git a/scripts/gitlab/ci-build-test.sh b/scripts/gitlab/ci-build-test.sh index e3ba63b3..af1bb807 100755 --- a/scripts/gitlab/ci-build-test.sh +++ b/scripts/gitlab/ci-build-test.sh @@ -1,4 +1,5 @@ #!/bin/bash +echo ${CI_PROJECT_DIR} source scripts/gitlab/setup-env.sh @@ -16,17 +17,15 @@ cleanup() { } build_and_test() { - WITH_TORCH=${1} - WITH_FAISS=${2} - WITH_HDF5=${3} - WITH_MPI=${4} + WITH_HDF5=${1} + WITH_MPI=${2} + WITH_WORKFLOW=${3} echo "*******************************************************************************************" echo "Build configuration" \ - "WITH_TORCH ${WITH_TORCH}" \ - "WITH_FAISS ${WITH_FAISS}" \ "WITH_HDF5 ${WITH_HDF5}" \ "WITH_MPI ${WITH_MPI}" \ + "WITH_MPI ${WITH_WORKFLOW}" \ "WITH_CUDA ${WITH_CUDA}" echo "*******************************************************************************************" @@ -45,7 +44,7 @@ build_and_test() { -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ -DWITH_CALIPER=On \ -DWITH_HDF5=${WITH_HDF5} \ - -DWITH_EXAMPLES=On \ + -DWITH_EXAMPLES=Off \ -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ -DCMAKE_INSTALL_PREFIX=./install \ -DCMAKE_BUILD_TYPE=Release \ @@ -55,13 +54,10 @@ build_and_test() { -DMFEM_DIR=$AMS_MFEM_PATH \ -DWITH_FAISS=${WITH_FAISS} \ -DWITH_MPI=${WITH_MPI} \ - -DWITH_TORCH=${WITH_TORCH} \ -DWITH_TESTS=On \ -DTorch_DIR=$AMS_TORCH_PATH \ - -DFAISS_DIR=$AMS_FAISS_PATH \ -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=On \ + -DWITH_WORKFLOW=${WITH_WORKFLOW} \ ${CI_PROJECT_DIR} || { echo "CMake failed"; exit 1; } make -j || { echo "Building failed"; exit 1; } @@ -74,10 +70,10 @@ build_and_test() { rm -rf /tmp/ams } -# build_and_test WITH_TORCH WITH_FAISS WITH_HDF5 WITH_MPI -build_and_test "On" "On" "On" "On" -build_and_test "On" "On" "On" "Off" -build_and_test "Off" "On" "On" "On" -build_and_test "Off" "Off" "On" "On" -build_and_test "Off" "Off" "Off" "On" +# build_and_test WITH_HDF5 WITH_MPI +build_and_test "On" "On" "Off" +build_and_test "On" "Off" "Off" +build_and_test "Off" "On" "Off" +build_and_test "Off" "Off" "Off" +build_and_test "Off" "Off" "On" diff --git a/src/AMSlib/AMSTensor.cpp b/src/AMSlib/AMSTensor.cpp index 9702fa36..84451c08 100644 --- a/src/AMSlib/AMSTensor.cpp +++ b/src/AMSlib/AMSTensor.cpp @@ -184,7 +184,7 @@ AMSTensor AMSTensor::transpose(AMSTensor::IntDimType axis1, if (dType() == AMSDType::AMS_DOUBLE) return view((double*)_data, newShape, newStrides, _location); else if (dType() == AMSDType::AMS_SINGLE) - return view((double*)_data, newShape, newStrides, _location); + return view((float*)_data, newShape, newStrides, _location); throw std::runtime_error("Unknow data type in transpose\n"); } @@ -195,3 +195,12 @@ template AMSTensor AMSTensor::create(ams::ArrayRef, template AMSTensor AMSTensor::create(ams::ArrayRef, ams::ArrayRef, AMSResourceType); + +template AMSTensor AMSTensor::view(float*, + ams::ArrayRef, + ams::ArrayRef, + AMSResourceType); +template AMSTensor AMSTensor::view(double*, + ams::ArrayRef, + ams::ArrayRef, + AMSResourceType); diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index d52f027f..c01621cf 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -6,15 +6,11 @@ # handle sources and headers #set global library path to link with tests if necessary set(LIBRARY_OUTPUT_PATH ${AMS_LIB_OUT_PATH}) -set(AMS_LIB_SRC wf/debug.cpp wf/logger.cpp wf/utils.cpp wf/SmallVector.cpp ml/surrogate.cpp wf/hdf5db.cpp wf/basedb.cpp AMSTensor.cpp wf/interface.cpp wf/resource_manager.cpp AMS.cpp) +set(AMS_LIB_SRC wf/debug.cpp wf/logger.cpp wf/utils.cpp wf/SmallVector.cpp ml/surrogate.cpp wf/basedb.cpp AMSTensor.cpp wf/interface.cpp wf/resource_manager.cpp AMS.cpp) -#if (WITH_CUDA) -# list(APPEND AMS_LIB_SRC wf/cuda/utilities.cpp) -#endif() - -#if (WITH_HDF5) -# list(APPEND AMS_LIB_SRC wf/hdf5db.cpp) -#endif() +if (WITH_HDF5) + list(APPEND AMS_LIB_SRC wf/hdf5db.cpp) +endif() # #if (WITH_RMQ) # list(APPEND AMS_LIB_SRC wf/rmqdb.cpp) diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index 9d784e21..4b0b5f9a 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -7,4 +7,6 @@ add_subdirectory(models) add_subdirectory(torch) add_subdirectory(db) add_subdirectory(wf) +if (WITH_HDF5) add_subdirectory(ams_interface) +endif() diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt index 3e839504..0977e65f 100644 --- a/tests/AMSlib/wf/CMakeLists.txt +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -22,15 +22,12 @@ function(BUILD_UNIT_TEST exe source) endif() endfunction() -function(ADD_HDF5_UNIT_TEST name exec) - add_test(NAME ${name} COMMAND ${exec} ${ARGN}) - set_tests_properties(${name} PROPERTIES LABELS WORKFLOW_UNIT_TEST) -endfunction() - BUILD_UNIT_TEST(domain_to_application domain_to_application.cpp) BUILD_UNIT_TEST(subselect_tensors subselect_tensors.cpp) BUILD_UNIT_TEST(scatter_physics scatter_physics.cpp) +if (WITH_HDF5) BUILD_UNIT_TEST(evaluate_in_and_outs evaluate_in_and_outs.cpp) +endif() ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::FLOAT::FLOAT domain_to_application float float cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::DomainToApplication::DOUBLE::FLOAT domain_to_application double float cpu) @@ -43,6 +40,7 @@ ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::SubSelect::Float subselect_tensors float ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::ScatterPhysics::Double scatter_physics double cpu) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::HOST::ScatterPhysics::Float scatter_physics float cpu) +if (WITH_HDF5) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") @@ -81,6 +79,7 @@ ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhDouble::MLD ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLHost::Evaluate::Inouts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double cpu ${TORCH_MODEL_DIR}/single_cpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +endif() if (WITH_CUDA) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::DomainToApplication::FLOAT::FLOAT domain_to_application float float cuda) @@ -94,7 +93,7 @@ ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::SubSelect::Float subselect_tensors floa ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::ScatterPhysics::Double scatter_physics double cuda) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::DEVICE::ScatterPhysics::Float scatter_physics float cuda) - +if (WITH_HDF5) ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::InInoutsAndOuts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhHOST::MLDevice::Evaluate::Inouts::PhFloat::MLFloat::AllPhysics evaluate_in_and_outs float cpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 0.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") @@ -169,6 +168,7 @@ ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhDouble: ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "0") ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::InInoutsAndOuts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "1") ADD_WORKFLOW_UNIT_TEST(WORKFLOW::PhDevice::MLDevice::Evaluate::Inouts::PhDouble::MLFloat::AllModel evaluate_in_and_outs double gpu ${TORCH_MODEL_DIR}/single_gpu_duq_max.pt "duq_max" 1.0 "1,8" "1,8" ${CMAKE_CURRENT_BINARY_DIR}/ "8") +endif() endif() From f4ba541edd13d42234656fcc0fe3990052920b61 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 2 Jan 2025 08:55:15 -0800 Subject: [PATCH 030/136] Fix cmake to generate models under expected path --- tests/AMSlib/models/CMakeLists.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/AMSlib/models/CMakeLists.txt b/tests/AMSlib/models/CMakeLists.txt index 97a8b01e..c365e1c0 100644 --- a/tests/AMSlib/models/CMakeLists.txt +++ b/tests/AMSlib/models/CMakeLists.txt @@ -10,12 +10,12 @@ set(GENERATED_CPU_MODELS ${CMAKE_CURRENT_BINARY_DIR}/single_cpu_duq_mean.pt ${CMAKE_CURRENT_BINARY_DIR}/single_cpu_random.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_cpu_duq_max.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_cpu_duq_mean.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_cpu_random.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_cpu_duq_max.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_cpu_duq_mean.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_cpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_double_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_double_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_double_cpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_single_cpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_single_cpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_single_cpu_random.pt ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_cpu_duq_max.pt ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_cpu_duq_mean.pt @@ -50,12 +50,12 @@ set(GENERATED_GPU_MODELS ${CMAKE_CURRENT_BINARY_DIR}/single_gpu_duq_mean.pt ${CMAKE_CURRENT_BINARY_DIR}/single_gpu_random.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_gpu_duq_max.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_gpu_duq_mean.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_double_gpu_random.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_gpu_duq_max.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_gpu_duq_mean.pt - ${CMAKE_CURRENT_BINARY_DIR}linear_traced_single_gpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_double_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_double_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_double_gpu_random.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_single_gpu_duq_max.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_single_gpu_duq_mean.pt + ${CMAKE_CURRENT_BINARY_DIR}/linear_traced_single_gpu_random.pt ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_gpu_duq_max.pt ${CMAKE_CURRENT_BINARY_DIR}/linear_scripted_double_gpu_duq_mean.pt From 4d0d8a76662d62856814f6de05b63dafe1d6b38c Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 2 Jan 2025 09:23:17 -0800 Subject: [PATCH 031/136] Properly define caliper --- CMakeLists.txt | 17 +++++++++-------- src/AMSlib/CMakeLists.txt | 5 +++++ tests/AMSlib/wf/CMakeLists.txt | 7 ++++++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9aa14188..b9c3216c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -70,10 +70,11 @@ endif() # ------------------------------------------------------------------------------ if (WITH_CALIPER) find_package(caliper REQUIRED) + list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_CALIPER__") endif() if (WITH_AMS_DEBUG) - list(APPEND AMS_APP_DEFINES "-DLIBAMS_VERBOSE") + list(APPEND AMS_APP_DEFINES "LIBAMS_VERBOSE") endif() if (WITH_HDF5) @@ -88,14 +89,14 @@ else() set(AMS_HDF5_TARGET hdf5-shared) message(STATUS "HDF5 uses Shared Library : ${AMS_HDF5_TARGET}") endif() - list(APPEND AMS_APP_DEFINES "-D__ENABLE_HDF5__") + list(APPEND AMS_APP_DEFINES "__ENABLE_HDF5__") endif() # WITH_HDF5 if (WITH_RMQ) if (WITH_CUDA) add_compile_definitions(THRUST_IGNORE_CUB_VERSION_CHECK) endif() - list(APPEND AMS_APP_DEFINES "-D__ENABLE_RMQ__") + list(APPEND AMS_APP_DEFINES "__ENABLE_RMQ__") find_package(amqpcpp REQUIRED) get_target_property(amqpcpp_INCLUDE_DIR amqpcpp INTERFACE_INCLUDE_DIRECTORIES) @@ -142,7 +143,7 @@ endif() if (WITH_PERFFLOWASPECT) find_package(perfflowaspect CONFIG REQUIRED) - list(APPEND AMS_APP_DEFINES "-D__ENABLE_PERFFLOWASPECT__") + list(APPEND AMS_APP_DEFINES "__ENABLE_PERFFLOWASPECT__") list(APPEND AMS_APP_LIB_DIRS "${PERFFLOWASPECT_LIB_DIR}") list(APPEND AMS_APP_LIBRARIES "perfflow_runtime") @@ -164,7 +165,7 @@ if (WITH_EXAMPLES) #examples we use do. if (WITH_MPI) list(APPEND AMS_EXAMPLE_LIBRARIES MPI::MPI_CXX) - list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_MPI__") + list(APPEND AMS_EXAMPLE_DEFINES "__ENABLE_MPI__") endif() list(APPEND AMS_EXAMPLE_LIBRARIES umpire) @@ -180,7 +181,7 @@ if (WITH_EXAMPLES) list(APPEND AMS_EXAMPLE_LIB_DIRS "${MFEM_LIB_DIR}") if (WITH_RMQ) - list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_RMQ__") + list(APPEND AMS_EXAMPLE_DEFINES "__ENABLE_RMQ__") list(APPEND AMS_EXAMPLE_INCLUDES ${amqpcpp_INCLUDE_DIR}) list(APPEND AMS_EXAMPLE_INCLUDES ${OPENSSL_INCLUDE_DIR}) list(APPEND AMS_EXAMPLE_INCLUDES ${LIBEVENT_INCLUDE_DIR}) @@ -192,13 +193,13 @@ if (WITH_EXAMPLES) if (WITH_CUDA) list(APPEND AMS_EXAMPLE_LIBRARIES ${CUDA_LIBRARIES} cuda) - list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_CUDA__") + list(APPEND AMS_EXAMPLE_DEFINES "__ENABLE_CUDA__") endif() if (WITH_CALIPER) list(APPEND AMS_EXAMPLE_INCLUDES ${caliper_INCLUDE_DIR}) list(APPEND AMS_EXAMPLE_LIBRARIES caliper) - list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_CALIPER__") + list(APPEND AMS_EXAMPLE_DEFINES "__ENABLE_CALIPER__") endif() if (WITH_PERFFLOWASPECT) diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index c01621cf..4591e6e5 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -32,6 +32,11 @@ if (WITH_HDF5) target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) endif() + +if (WITH_CALIPER) + target_link_libraries(AMS PRIVATE caliper) +endif() + if (WITH_MPI) target_link_libraries(AMS PRIVATE MPI::MPI_CXX) endif() diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt index 0977e65f..7699265d 100644 --- a/tests/AMSlib/wf/CMakeLists.txt +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -18,7 +18,12 @@ function(BUILD_UNIT_TEST exe source) if(WITH_CUDA) target_link_libraries(${exe} PRIVATE CUDA::cudart) - target_compile_definitions(${exe} PRIVATE "-D__ENABLE_CUDA__ -DLIBAMS_VERBOSE") + target_compile_definitions(${exe} PRIVATE __ENABLE_CUDA__ LIBAMS_VERBOSE) + endif() + + if (WITH_CALIPER) + target_compile_definitions(${exe} PRIVATE __AMS_ENABLE_CALIPER__) + target_link_libraries(${exe} PRIVATE caliper) endif() endfunction() From 62e02f49f3075fe0bb31fc9995eb464aea943ec3 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 2 Jan 2025 12:43:44 -0800 Subject: [PATCH 032/136] Fixed ideal gas as an external --- CMakeLists.txt | 2 +- examples/ideal_gas/CMakeLists.txt | 90 ++++++++++++------ examples/ideal_gas/app/eos_ams.cpp | 55 ++++++----- examples/ideal_gas/app/eos_idealgas.hpp | 8 ++ .../ideal_gas/cmake}/FindMFEM.cmake | 0 examples/ideal_gas/main.cpp | 44 ++++++--- src/AMSlib/AMSTensor.cpp | 31 +++++-- src/AMSlib/CMakeLists.txt | 53 ++++++++--- src/AMSlib/include/AMSTensor.hpp | 5 +- src/AMSlib/include/ArrayRef.hpp | 91 +------------------ src/AMSlib/include/SmallVector.hpp | 6 +- 11 files changed, 204 insertions(+), 181 deletions(-) rename {cmake => examples/ideal_gas/cmake}/FindMFEM.cmake (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index b9c3216c..710d357c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception cmake_minimum_required(VERSION 3.18) -project(AMS VERSION 0.1.0 LANGUAGES CXX C) +project(AMS VERSION 0.1.1 LANGUAGES CXX C) cmake_policy(SET CMP0074 NEW) # NOTE: This may break some of our integrations with the applications. But flux requires > C++20, RMQ requires C++17 and although AMS does not have diff --git a/examples/ideal_gas/CMakeLists.txt b/examples/ideal_gas/CMakeLists.txt index d0a41287..85f507b1 100644 --- a/examples/ideal_gas/CMakeLists.txt +++ b/examples/ideal_gas/CMakeLists.txt @@ -3,47 +3,83 @@ # # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -file(GLOB_RECURSE AMS_CURRENT_EXAMPLE_INCLUDES "*.hpp") +cmake_minimum_required(VERSION 3.10) +cmake_policy(SET CMP0104 NEW) + +# Define the project +project(IdealGasExample LANGUAGES CXX) + + +option(WITH_CUDA "Option to enable CUDA" On) +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +if (WITH_CUDA) + message(WARNING "CUDA is ${CMAKE_CUDA_ARCHITECTURES}") + enable_language(CUDA) + find_package(CUDAToolkit) + message(WARNING "CUDA is ${CMAKE_CUDA_ARCHITECTURES}") +endif() + +if (MFEM_DIR) + include(${PROJECT_SOURCE_DIR}/cmake/FindMFEM.cmake) +else() + find_package(MFEM REQUIRED) +endif() + set(AMS_EXAMPLE_SRC ${MINIAPP_INCLUDES} main.cpp app/eos_ams.cpp) +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + + +function(ADDExec binary_name use_ams) + target_link_libraries(${binary_name} PRIVATE ${MFEM_LIBRARIES}) + target_include_directories(${binary_name} PRIVATE ${MFEM_INCLUDE_DIRS}) + # we always use ams to avoid if def conflicts. + # but we only enable it for the use_ams case + find_package(AMS REQUIRED) + target_link_libraries(${binary_name} PUBLIC AMS::AMS) + if (${use_ams}) + target_compile_definitions(${binary_name} PRIVATE USE_AMS) + endif() -function(ADDExec binary_name definitions) - if (WITH_RZ) - list(APPEND AMS_EXAMPLE_SRC ${RZ_AMS_SOURCES} ${AMS_CURRENT_EXAMPLE_INCLUDES}) + if (WITH_MPI) + target_link_libraries(${binary_name} PRIVATE MPI::MPI_CXX) + target_compile_definitions(${binary_name} PRIVATE "__ENABLE_MPI__") endif() - target_include_directories(${binary_name} PRIVATE ${AMS_EXAMPLE_INCLUDES} - ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_BINARY_DIR}/include) - target_compile_definitions(${binary_name} PRIVATE ${definitions}) - target_link_directories(${binary_name} PRIVATE ${AMS_EXAMPLE_LIB_DIRS}) - target_link_libraries(${binary_name} PUBLIC AMS ${AMS_EXAMPLE_LIBRARIES}) if (WITH_CUDA) - set_source_files_properties(main.cpp PROPERTIES LANGUAGE CUDA) - set_source_files_properties(main.cpp PROPERTIES COMPILE_FLAGS "--expt-extended-lambda") - set_source_files_properties(app/eos_ams.cpp PROPERTIES LANGUAGE CUDA) - set_source_files_properties(app/eos_ams.cpp PROPERTIES COMPILE_FLAGS "--expt-extended-lambda") - set_target_properties(${binary_name} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") - - if (WITH_RZ) - set_source_files_properties(${RZ_AMS_SOURCES} PROPERTIES LANGUAGE CUDA) - set_source_files_properties(${RZ_AMS_SOURCES} PROPERTIES COMPILE_FLAGS "--expt-extended-lambda") - set_property(TARGET ${binary_name} PROPERTY CUDA_SEPARABLE_COMPILATION ON) - endif() - - if (WITH_PERFFLOWASPECT) - set_property(SOURCE ${AMS_EXAMPLE_SRC} APPEND_STRING PROPERTY COMPILE_FLAGS " -Xcompiler=-Xclang -Xcompiler=-load -Xcompiler=-Xclang -Xcompiler=${PERFFLOWASPECT_LIB_DIR}/libWeavePass.so") - endif() + target_link_libraries(${binary_name} PRIVATE + CUDA::cudart # CUDA Runtime + CUDA::cublas # cuBLAS + CUDA::cusparse # cuSPARSE + CUDA::curand # cuRAND + ) + set_source_files_properties(main.cpp PROPERTIES LANGUAGE CUDA) + set_source_files_properties(main.cpp PROPERTIES COMPILE_FLAGS "--expt-extended-lambda") + set_source_files_properties(app/eos_ams.cpp PROPERTIES LANGUAGE CUDA) + set_source_files_properties(app/eos_ams.cpp PROPERTIES COMPILE_FLAGS "--expt-extended-lambda") + set_target_properties(${binary_name} PROPERTIES CUDA_ARCHITECTURES "${CMAKE_CUDA_ARCHITECTURES}") + target_compile_definitions(${binary_name} PRIVATE "__ENABLE_CUDA__") endif() endfunction() add_executable(no_ams_example ${AMS_EXAMPLE_SRC} ${MINIAPP_INCLUDES}) -ADDExec(no_ams_example "${AMS_EXAMPLE_DEFINES}") +ADDExec(no_ams_example FALSE) -list(APPEND AMS_EXAMPLE_DEFINES "-DUSE_AMS") add_executable(ams_example ${AMS_EXAMPLE_SRC} ${MINIAPP_INCLUDES}) -ADDExec(ams_example "${AMS_EXAMPLE_DEFINES}") +ADDExec(ams_example TRUE) if (WITH_WORKFLOW) set(TRAIN_DEVICE "cpu") diff --git a/examples/ideal_gas/app/eos_ams.cpp b/examples/ideal_gas/app/eos_ams.cpp index 7fdaff04..3f5735b9 100644 --- a/examples/ideal_gas/app/eos_ams.cpp +++ b/examples/ideal_gas/app/eos_ams.cpp @@ -23,7 +23,7 @@ AMSEOS::AMSEOS(const AMSDBType db_type, const char *surrogate_path) : res_(resource), IdealGas(1.6, 1.4) { - AMSCAbstrModel model_descr = ams::AMSRegisterAbstractModel( + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( "ideal_gas", uq_policy, threshold, surrogate_path, "ideal_gas"); wf_ = AMSCreateExecutor(model_descr, mpi_task, mpi_nproc); } @@ -40,32 +40,37 @@ void AMSEOS::Eval(const int length, FPType *bulkmod, FPType *temperature) const { - ams::SmallVector inputs = { - ams::AMSTensor::view(density, {length, 1}, {1, 1}, res_), - ams::AMSTensor::view(density, {length, 1}, {1, 1}, res_), - }; + SmallVector inputs; + inputs.push_back( + std::move(AMSTensor::view(density, {length, 1}, {1, 1}, res_))); + inputs.push_back( + std::move(AMSTensor::view(density, {length, 1}, {1, 1}, res_))); - ams::SmallVector inout; - ams::SmallVector outputs = { - ams::AMSTensor::view(pressure, {length, 1}, {1, 1}, res_), - ams::AMSTensor::view(soundspeed2, {length, 1}, {1, 1}, res_), - ams::AMSTensor::view(bulkmod, {length, 1}, {1, 1}, res_), - ams::AMSTensor::view(temperature, {length, 1}, {1, 1}, res_), - }; + SmallVector inout; + SmallVector outputs; + outputs.push_back( + std::move(AMSTensor::view(pressure, {length, 1}, {1, 1}, res_))); + outputs.push_back( + std::move(AMSTensor::view(soundspeed2, {length, 1}, {1, 1}, res_))); + outputs.push_back( + std::move(AMSTensor::view(bulkmod, {length, 1}, {1, 1}, res_))); + outputs.push_back( + std::move(AMSTensor::view(temperature, {length, 1}, {1, 1}, res_))); - EOSLambda OrigComputation = - [&](const ams::SmallVector &ams_ins, - ams::SmallVector &ams_inouts, - ams::SmallVector &ams_outs) { - IdealGas::Eval( - ams_ins[0].shape()[1], - static_cast(ams_ins[0].data()), - static_cast(inputs[1].data()), - static_cast(ams_outs[0].data()), - static_cast(ams_outs[1].data()), - static_cast(ams_outs[2].data()), - static_cast(ams_outs[3].data())); - }; + EOSLambda OrigComputation = [&, this](const SmallVector &ams_ins, + SmallVector &ams_inouts, + SmallVector &ams_outs) { + std::cout << "Shape is " << ams_ins[0].shape()[0] << ", " + << ams_ins[1].shape()[1] << "\n"; + IdealGas::Eval( + ams_ins[0].shape()[0], + static_cast(ams_ins[0].data()), + static_cast(ams_ins[1].data()), + static_cast(ams_outs[0].data()), + static_cast(ams_outs[1].data()), + static_cast(ams_outs[2].data()), + static_cast(ams_outs[3].data())); + }; AMSExecute(wf_, OrigComputation, inputs, inout, outputs); diff --git a/examples/ideal_gas/app/eos_idealgas.hpp b/examples/ideal_gas/app/eos_idealgas.hpp index d1af5e43..d7b203f0 100644 --- a/examples/ideal_gas/app/eos_idealgas.hpp +++ b/examples/ideal_gas/app/eos_idealgas.hpp @@ -39,6 +39,7 @@ class IdealGas : public EOS { const FPType gamma = gamma_; const FPType specific_heat = specific_heat_; + std::cout << "Evaluating for " << length << " elements\n"; using mfem::ForallWrap; MFEM_FORALL(i, length, { @@ -47,6 +48,13 @@ class IdealGas : public EOS bulkmod[i] = gamma * pressure[i]; temperature[i] = energy[i] / specific_heat; }); + + for (int i = 0; i < length; i++) { + std::cout << "( " << i << ") Outputs are (" << pressure[i] << ", "; + std::cout << soundspeed2[i] << ", "; + std::cout << bulkmod[i] << ", "; + std::cout << temperature[i] << ")\n"; + } } #ifdef __ENABLE_PERFFLOWASPECT__ diff --git a/cmake/FindMFEM.cmake b/examples/ideal_gas/cmake/FindMFEM.cmake similarity index 100% rename from cmake/FindMFEM.cmake rename to examples/ideal_gas/cmake/FindMFEM.cmake diff --git a/examples/ideal_gas/main.cpp b/examples/ideal_gas/main.cpp index d71f653b..ab41bc4e 100644 --- a/examples/ideal_gas/main.cpp +++ b/examples/ideal_gas/main.cpp @@ -31,6 +31,18 @@ #include using namespace ams; +#define CALIPER(stmt) + +#ifdef __ENABLE_MPI__ +#include +#define MPI_CALL(stmt) \ + if (stmt != MPI_SUCCESS) { \ + fprintf(stderr, "Error in MPI-Call (File: %s, %d)\n", __FILE__, __LINE__); \ + } +#else +#define MPI_CALL(stm) +#endif + void printMemory(std::unordered_set &allocators) { auto &rm = umpire::ResourceManager::getInstance(); @@ -59,16 +71,11 @@ void createMemoryAllocators(std::string &physics_host_alloc, std::string &physics_pinned_alloc) { std::unordered_set allocator_names; - if (pool == "default") { - physics_host_alloc = "HOST"; + physics_host_alloc = "HOST"; #ifdef __ENABLE_CUDA__ - physics_device_alloc = "DEVICE"; - physics_pinned_alloc = "PINNED"; + physics_device_alloc = "DEVICE"; + physics_pinned_alloc = "PINNED"; #endif - } else { - std::cout << "Stategy is " << pool << "\n"; - throw std::runtime_error("Pool strategy does not exist\n"); - } } int computeNumElements(int globalNumElements, int id, int numRanks) @@ -115,7 +122,8 @@ int run(const char *device_name, int stop_cycle, bool pack_sparse_mats, const char *model_path, - const char *db_config) + const char *db_config, + ams::AMSExecPolicy ams_loadBalance) { // ------------------------------------------------------------------------- // setup @@ -245,7 +253,6 @@ int run(const char *device_name, // --------------------------------------------------------------------- // setup AMS options // --------------------------------------------------------------------- - constexpr bool use_ams = false; const char *surrogate_path = nullptr; const char *db_path = nullptr; @@ -256,6 +263,8 @@ int run(const char *device_name, #ifdef USE_AMS constexpr bool use_ams = true; +#else + constexpr bool use_ams = false; #endif // --------------------------------------------------------------------- @@ -508,9 +517,9 @@ int main(int argc, char **argv) int rId = 0; // Level of Threading provided by MPI int provided = 0; - MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &provided); - MPI_Comm_size(MPI_COMM_WORLD, &wS); - MPI_Comm_rank(MPI_COMM_WORLD, &rId); + MPI_CALL(MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED, &provided)); + MPI_CALL(MPI_Comm_size(MPI_COMM_WORLD, &wS)); + MPI_CALL(MPI_Comm_rank(MPI_COMM_WORLD, &rId)); // FIXME: Create a logger class to write // depending on rank id and severity. if (rId != 0) { @@ -655,6 +664,9 @@ int main(int argc, char **argv) std::cout << std::endl; } + ams::AMSExecPolicy ams_loadBalance = ams::AMSExecPolicy::AMS_UBALANCED; + if (lbalance) ams_loadBalance = ams::AMSExecPolicy::AMS_BALANCED; + // ------------------------------------------------------------------------- // additional argument validation // ------------------------------------------------------------------------- @@ -711,7 +723,8 @@ int main(int argc, char **argv) stop_cycle, pack_sparse_mats, model_path, - db_config); + db_config, + ams_loadBalance); else if (strcmp(precision_opt, "double") == 0) ret = run(device_name, db_type, @@ -732,7 +745,8 @@ int main(int argc, char **argv) stop_cycle, pack_sparse_mats, model_path, - db_config); + db_config, + ams_loadBalance); else { std::cerr << "Invalid precision " << precision_opt << "\n"; return -1; diff --git a/src/AMSlib/AMSTensor.cpp b/src/AMSlib/AMSTensor.cpp index 84451c08..61e54b99 100644 --- a/src/AMSlib/AMSTensor.cpp +++ b/src/AMSlib/AMSTensor.cpp @@ -52,21 +52,22 @@ AMSTensor::AMSTensor(uint8_t* data, if (!_data) { throw std::runtime_error("Generating tensor with Null Pointer AMSTensor."); } - std::cout << "Pointer is " << _data << "\n"; } template >> + typename = std::enable_if_t::value>> AMSTensor AMSTensor::create(ams::ArrayRef shapes, ams::ArrayRef strides, AMSResourceType location) { auto numElements = computeNumElements(shapes); auto& rm = ams::ResourceManager::getInstance(); - if constexpr (std::is_same_v) { + if constexpr ((std::is_same_v) || + (std::is_same_v)) { float* _data = rm.allocate(numElements, location, sizeof(float)); return AMSTensor((uint8_t*)_data, shapes, strides, AMS_SINGLE, location); - } else if constexpr (std::is_same_v) { + } else if constexpr ((std::is_same_v) || + (std::is_same_v)) { double* _data = rm.allocate(numElements, location, sizeof(double)); return AMSTensor((uint8_t*)_data, shapes, strides, AMS_DOUBLE, location); } else { @@ -79,22 +80,24 @@ AMSTensor AMSTensor::create(ams::ArrayRef shapes, template >> + typename = std::enable_if_t::value>> AMSTensor AMSTensor::view(FPType* data, ams::ArrayRef shapes, ams::ArrayRef strides, AMSResourceType location) { - if constexpr (std::is_same_v) { - std::cout << "Generating float view from pointer " << data << "\n"; + if constexpr ((std::is_same_v) || + (std::is_same_v)) { return AMSTensor( (uint8_t*)data, shapes, strides, AMS_SINGLE, location, true); - } else if constexpr (std::is_same_v) { - std::cout << "Generating a double view from pointer " << data << "\n"; + } else if constexpr ((std::is_same_v) || + (std::is_same_v)) { return AMSTensor( (uint8_t*)data, shapes, strides, AMS_DOUBLE, location, true); } else { static_assert(std::is_same_v || + std::is_same_v || + std::is_same_v || std::is_same_v, "AMSTensor only supports float or double tensor view"); } @@ -103,7 +106,6 @@ AMSTensor AMSTensor::view(FPType* data, AMSTensor AMSTensor::view(AMSTensor& tensor) { - std::cout << "Creating a view here from AMS Tensor\n"; if (tensor._dType == AMS_DOUBLE) return AMSTensor::view((double*)tensor._data, tensor._shape, @@ -204,3 +206,12 @@ template AMSTensor AMSTensor::view(double*, ams::ArrayRef, ams::ArrayRef, AMSResourceType); + +template AMSTensor AMSTensor::view(const float*, + ams::ArrayRef, + ams::ArrayRef, + AMSResourceType); +template AMSTensor AMSTensor::view(const double*, + ams::ArrayRef, + ams::ArrayRef, + AMSResourceType); diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index 4591e6e5..ed006e91 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -34,6 +34,7 @@ endif() if (WITH_CALIPER) + target_link_libraries(AMS PRIVATE caliper) endif() @@ -57,24 +58,52 @@ configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMSTensor.hpp" "${PROJECT_B # installation paths include(GNUInstallDirs) +include(CMakePackageConfigHelpers) -# Install the library +# Install the AMS library install(TARGETS AMS EXPORT AMSTargets - LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" - ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" # For shared libraries + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" # For static libraries + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" # For executables (Windows-specific) + INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" # Install headers directory ) - +# Export the AMS targets for use by external projects install(EXPORT AMSTargets - NAMESPACE AMS:: + NAMESPACE AMS:: # Prefix target names with AMS:: + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/AMS" # Install location for CMake config +) + +# Install the public headers +install(FILES + ${PROJECT_BINARY_DIR}/include/AMS.h + ${PROJECT_BINARY_DIR}/include/AMSTensor.hpp + ${PROJECT_BINARY_DIR}/include/AMSTypes.hpp + ${PROJECT_BINARY_DIR}/include/ArrayRef.hpp + ${PROJECT_BINARY_DIR}/include/SmallVector.hpp + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/" # Headers installed into AMS subdir +) + + +# Generate a version file for the package +write_basic_package_version_file( + "${CMAKE_CURRENT_BINARY_DIR}/AMSConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY AnyNewerVersion +) + +# Configure the package configuration file +configure_package_config_file( + "${CMAKE_SOURCE_DIR}/cmake/AMSConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/AMSConfig.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/AMS" +) + +# Install the generated config and version files +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/AMSConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/AMSConfigVersion.cmake" DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/AMS" ) -# -install(FILES ${PROJECT_BINARY_DIR}/include/AMS.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -install(FILES ${PROJECT_BINARY_DIR}/include/AMSTensor.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -install(FILES ${PROJECT_BINARY_DIR}/include/AMSTypes.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -install(FILES ${PROJECT_BINARY_DIR}/include/ArrayRef.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -install(FILES ${PROJECT_BINARY_DIR}/include/SmallVector.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) -#install(FILES ${PROJECT_BINARY_DIR}/include/AMS-config.h DESTINATION include) diff --git a/src/AMSlib/include/AMSTensor.hpp b/src/AMSlib/include/AMSTensor.hpp index 0420eff7..53483838 100644 --- a/src/AMSlib/include/AMSTensor.hpp +++ b/src/AMSlib/include/AMSTensor.hpp @@ -3,6 +3,7 @@ #include #include +#include #include "AMSTypes.hpp" #include "ArrayRef.hpp" @@ -66,7 +67,7 @@ class AMSTensor * @return A new AMSTensor with allocated memory. */ template >> + typename = std::enable_if_t::value>> static AMSTensor create(ams::ArrayRef shapes, ams::ArrayRef strides, AMSResourceType location); @@ -81,7 +82,7 @@ class AMSTensor * @return A new AMSTensor that acts as a view of the existing data. */ template >> + typename = std::enable_if_t::value>> static AMSTensor view(FPType* data, ams::ArrayRef shapes, ams::ArrayRef strides, diff --git a/src/AMSlib/include/ArrayRef.hpp b/src/AMSlib/include/ArrayRef.hpp index 503da8d3..87c63d6a 100644 --- a/src/AMSlib/include/ArrayRef.hpp +++ b/src/AMSlib/include/ArrayRef.hpp @@ -24,7 +24,7 @@ namespace ams { template -class [[nodiscard]] MutableArrayRef; +class MutableArrayRef; /// ArrayRef - Represent a constant reference to an array (0 or more elements /// consecutively in memory), i.e. a start pointer and a length. It allows @@ -38,7 +38,7 @@ class [[nodiscard]] MutableArrayRef; /// This is intended to be trivially copyable, so it should be passed by /// value. template -class [[nodiscard]] ArrayRef +class ArrayRef { public: using value_type = T; @@ -67,9 +67,6 @@ class [[nodiscard]] ArrayRef /// Construct an empty ArrayRef. /*implicit*/ ArrayRef() = default; - /// Construct an empty ArrayRef from std::nullopt. - /*implicit*/ ArrayRef(std::nullopt_t) {} - /// Construct an ArrayRef from a single element. /*implicit*/ ArrayRef(const T &OneElt) : Data(&OneElt), Length(1) {} @@ -327,7 +324,7 @@ class [[nodiscard]] ArrayRef /// This is intended to be trivially copyable, so it should be passed by /// value. template -class [[nodiscard]] MutableArrayRef : public ArrayRef +class MutableArrayRef : public ArrayRef { public: using value_type = T; @@ -345,9 +342,6 @@ class [[nodiscard]] MutableArrayRef : public ArrayRef /// Construct an empty MutableArrayRef. /*implicit*/ MutableArrayRef() = default; - /// Construct an empty MutableArrayRef from std::nullopt. - /*implicit*/ MutableArrayRef(std::nullopt_t) : ArrayRef() {} - /// Construct a MutableArrayRef from a single element. /*implicit*/ MutableArrayRef(T &OneElt) : ArrayRef(OneElt) {} @@ -511,85 +505,6 @@ class OwningArrayRef : public MutableArrayRef ~OwningArrayRef() { delete[] this->data(); } }; -/// @name ArrayRef Deduction guides -/// @{ -/// Deduction guide to construct an ArrayRef from a single element. -template -ArrayRef(const T &OneElt) -> ArrayRef; - -/// Deduction guide to construct an ArrayRef from a pointer and length -template -ArrayRef(const T *data, size_t length) -> ArrayRef; - -/// Deduction guide to construct an ArrayRef from a range -template -ArrayRef(const T *data, const T *end) -> ArrayRef; - -/// Deduction guide to construct an ArrayRef from a SmallVector -template -ArrayRef(const SmallVectorImpl &Vec) -> ArrayRef; - -/// Deduction guide to construct an ArrayRef from a SmallVector -template -ArrayRef(const SmallVector &Vec) -> ArrayRef; - -/// Deduction guide to construct an ArrayRef from a std::vector -template -ArrayRef(const std::vector &Vec) -> ArrayRef; - -/// Deduction guide to construct an ArrayRef from a std::array -template -ArrayRef(const std::array &Vec) -> ArrayRef; - -/// Deduction guide to construct an ArrayRef from an ArrayRef (const) -template -ArrayRef(const ArrayRef &Vec) -> ArrayRef; - -/// Deduction guide to construct an ArrayRef from an ArrayRef -template -ArrayRef(ArrayRef &Vec) -> ArrayRef; - -/// Deduction guide to construct an ArrayRef from a C array. -template -ArrayRef(const T (&Arr)[N]) -> ArrayRef; - -/// @} - -/// @name ArrayRef Convenience constructors -/// @{ -/// Construct an ArrayRef from a single element. - -/// @name MutableArrayRef Deduction guides -/// @{ -/// Deduction guide to construct a `MutableArrayRef` from a single element -template -MutableArrayRef(T &OneElt) -> MutableArrayRef; - -/// Deduction guide to construct a `MutableArrayRef` from a pointer and -/// length. -template -MutableArrayRef(T *data, size_t length) -> MutableArrayRef; - -/// Deduction guide to construct a `MutableArrayRef` from a `SmallVector`. -template -MutableArrayRef(SmallVectorImpl &Vec) -> MutableArrayRef; - -template -MutableArrayRef(SmallVector &Vec) -> MutableArrayRef; - -/// Deduction guide to construct a `MutableArrayRef` from a `std::vector`. -template -MutableArrayRef(std::vector &Vec) -> MutableArrayRef; - -/// Deduction guide to construct a `MutableArrayRef` from a `std::array`. -template -MutableArrayRef(std::array &Vec) -> MutableArrayRef; - -/// Deduction guide to construct a `MutableArrayRef` from a C array. -template -MutableArrayRef(T (&Arr)[N]) -> MutableArrayRef; - -/// @} template inline bool operator==(ArrayRef LHS, ArrayRef RHS) diff --git a/src/AMSlib/include/SmallVector.hpp b/src/AMSlib/include/SmallVector.hpp index c43afd55..685b0f37 100644 --- a/src/AMSlib/include/SmallVector.hpp +++ b/src/AMSlib/include/SmallVector.hpp @@ -405,10 +405,14 @@ class SmallVectorTemplateBase : public SmallVectorTemplateCommon /// Move the range [I, E) into the uninitialized memory starting with "Dest", /// constructing elements as needed. + /// We expose a C++14 API, so we cannot directly call uninitialized_move that was intorduced + /// on C++17. This is equivalent. template static void uninitialized_move(It1 I, It1 E, It2 Dest) { - std::uninitialized_move(I, E, Dest); + std::uninitialized_copy(std::make_move_iterator(I), + std::make_move_iterator(E), + Dest); } /// Copy the range [I, E) onto the uninitialized memory starting with "Dest", From 05961076f81640f64cc4586794dc9672d042bb66 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 2 Jan 2025 13:44:19 -0800 Subject: [PATCH 033/136] Remove warning --- CMakeLists.txt | 57 -------------------------------------------------- 1 file changed, 57 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 710d357c..6ca9e22e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,6 @@ set(AMS_EXAMPLE_INCLUDES "") # ------------------------------------------------------------------------------ option(WITH_CUDA "Option to enable CUDA" OFF) -option(WITH_EXAMPLES "Build examples" OFF) option(WITH_MPI "Option to enable MPI" OFF) option(WITH_CALIPER "Use Caliper for Profiling" OFF) option(WITH_TESTS "Compile tests" OFF) @@ -51,7 +50,6 @@ list(APPEND AMS_APP_LIBRARIES nlohmann_json::nlohmann_json) # ------------------------------------------------------------------------------ find_package(Threads REQUIRED) - # ------------------------------------------------------------------------------ if (WITH_MPI) @@ -78,7 +76,6 @@ if (WITH_AMS_DEBUG) endif() if (WITH_HDF5) - message(WARNING "WARNING") set(HDF5_ROOT ${AMS_HDF5_DIR}) if (HDF5_USE_STATIC_LIBRARIES) find_package(HDF5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) @@ -157,57 +154,3 @@ if (WITH_TESTS) add_subdirectory(tests) endif() - -# ------------------------------------------------------------------------------ -if (WITH_AMS_LIB) -if (WITH_EXAMPLES) - #The AMS Runtime does not depend on MFEM. The - #examples we use do. - if (WITH_MPI) - list(APPEND AMS_EXAMPLE_LIBRARIES MPI::MPI_CXX) - list(APPEND AMS_EXAMPLE_DEFINES "__ENABLE_MPI__") - endif() - - list(APPEND AMS_EXAMPLE_LIBRARIES umpire) - list(APPEND AMS_EXAMPLE_INCLUDES ${UMPIRE_INCLUDE_DIR}) - - if (MFEM_DIR) - include(${PROJECT_SOURCE_DIR}/cmake/FindMFEM.cmake) - else() - find_package(MFEM REQUIRED) - endif() - list(APPEND AMS_EXAMPLE_INCLUDES "${MFEM_INCLUDE_DIRS}") - list(APPEND AMS_EXAMPLE_LIBRARIES "${MFEM_LIBRARIES}") - list(APPEND AMS_EXAMPLE_LIB_DIRS "${MFEM_LIB_DIR}") - - if (WITH_RMQ) - list(APPEND AMS_EXAMPLE_DEFINES "__ENABLE_RMQ__") - list(APPEND AMS_EXAMPLE_INCLUDES ${amqpcpp_INCLUDE_DIR}) - list(APPEND AMS_EXAMPLE_INCLUDES ${OPENSSL_INCLUDE_DIR}) - list(APPEND AMS_EXAMPLE_INCLUDES ${LIBEVENT_INCLUDE_DIR}) - list(APPEND AMS_EXAMPLE_LIBRARIES OpenSSL::SSL amqpcpp pthread event_pthreads event) - if (WITH_MPI) - list(APPEND AMS_EXAMPLE_LIBRARIES MPI::MPI_CXX) - endif() - endif() - - if (WITH_CUDA) - list(APPEND AMS_EXAMPLE_LIBRARIES ${CUDA_LIBRARIES} cuda) - list(APPEND AMS_EXAMPLE_DEFINES "__ENABLE_CUDA__") - endif() - - if (WITH_CALIPER) - list(APPEND AMS_EXAMPLE_INCLUDES ${caliper_INCLUDE_DIR}) - list(APPEND AMS_EXAMPLE_LIBRARIES caliper) - list(APPEND AMS_EXAMPLE_DEFINES "__ENABLE_CALIPER__") - endif() - - if (WITH_PERFFLOWASPECT) - list(APPEND AMS_EXAMPLE_DEFINES "-D__ENABLE_PERFFLOWASPECT__") - endif() - - add_subdirectory(examples) -endif() -endif() - -# ------------------------------------------------------------------------------ From 8023cf6f7ff6469728d6157f5f70919e72c282f2 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 2 Jan 2025 14:56:52 -0800 Subject: [PATCH 034/136] Define matrix strategy for ci --- .github/workflows/ci.yml | 348 ++++----------------------------------- 1 file changed, 33 insertions(+), 315 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c868adb0..45115d3d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,10 +13,15 @@ jobs: runs-on: ubuntu-latest container: ghcr.io/llnl/ams-ci-almalinux8:latest - # Steps represent a sequence of tasks that will be executed as part of the job + strategy: + matrix: + with_hdf5: [ON, OFF] + with_caliper: [ON, OFF] + with_mpi : [ON, OFF] + steps: - uses: actions/checkout@v3 - - name: Build Torch=On FAISS=On HDF5=On AMS + - name: Build WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} shell: bash -l {0} run: | module load gcc/11.2.1 @@ -32,232 +37,49 @@ jobs: export AMS_HDF5_PATH=$(spack location -i hdf5) cmake \ -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=On \ - -DWITH_HDF5=On \ - -DWITH_EXAMPLES=On \ + -DCMAKE_PREFIX_PATH=./install \ + -DWITH_CALIPER=${{ matrix.with_caliper }} \ + -DWITH_HDF5=${{ matrix.with_hdf5 }} \ -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ - -DCMAKE_INSTALL_PREFIX=./install \ -DCMAKE_BUILD_TYPE=Release \ -DWITH_CUDA=Off \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=On \ - -DWITH_MPI=On \ - -DWITH_TORCH=On \ + -DWITH_MPI=${{ matrix.with_mpi }} \ -DWITH_TESTS=On \ -DTorch_DIR=$AMS_TORCH_PATH \ - -DFAISS_DIR=$AMS_FAISS_PATH \ - -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=On \ - $GITHUB_WORKSPACE - make - - name: Run tests Torch=On FAISS=On HDF5=On AMS - run: | - cd build - source /spack/share/spack/setup-env.sh - spack env activate -p /ams-spack-env - env CTEST_OUTPUT_ON_FAILURE=1 make test - - name: Build Torch=On FAISS=On HDF5=On MPI=Off AMS - shell: bash -l {0} - run: | - module load gcc/11.2.1 - source /spack/share/spack/setup-env.sh - spack env activate -p /ams-spack-env - rm -rf build/ - mkdir build - cd build - export AMS_MFEM_PATH=$(spack location -i mfem) - export AMS_TORCH_PATH=$(spack location -i py-torch)/lib/python3.10/site-packages/torch/share/cmake/Torch - export AMS_FAISS_PATH=$(spack location -i faiss) - export AMS_UMPIRE_PATH=$(spack location -i umpire) - export AMS_HDF5_PATH=$(spack location -i hdf5) - cmake \ - -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=On \ - -DWITH_HDF5=On \ - -DWITH_EXAMPLES=On \ - -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ - -DCMAKE_INSTALL_PREFIX=./install \ - -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CUDA=Off \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=On \ - -DWITH_MPI=Off \ - -DWITH_TORCH=On \ - -DWITH_TESTS=On \ - -DTorch_DIR=$AMS_TORCH_PATH \ - -DFAISS_DIR=$AMS_FAISS_PATH \ - -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=On \ - $GITHUB_WORKSPACE - make - - name: Build CALIPER=Off Torch=Off FAISS=On HDF5=On AMS - shell: bash -l {0} - run: | - module load gcc/11.2.1 - source /spack/share/spack/setup-env.sh - spack env activate -p /ams-spack-env - rm -rf build/ - mkdir build - cd build - export AMS_MFEM_PATH=$(spack location -i mfem) - export AMS_FAISS_PATH=$(spack location -i faiss) - export AMS_UMPIRE_PATH=$(spack location -i umpire) - export AMS_HDF5_PATH=$(spack location -i hdf5) - cmake \ - -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=Off \ - -DWITH_HDF5=On \ - -DWITH_EXAMPLES=On \ - -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ - -DCMAKE_INSTALL_PREFIX=./install \ - -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CUDA=Off \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=On \ - -DWITH_MPI=On \ - -DWITH_TORCH=Off \ - -DWITH_TESTS=On \ - -DFAISS_DIR=$AMS_FAISS_PATH \ -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ + -DWITH_WORKFLOW=Off \ $GITHUB_WORKSPACE make - - name: Build Torch=Off FAISS=On HDF5=On AMS - shell: bash -l {0} - run: | - module load gcc/11.2.1 - source /spack/share/spack/setup-env.sh - spack env activate -p /ams-spack-env - rm -rf build/ - mkdir build - cd build - export AMS_MFEM_PATH=$(spack location -i mfem) - export AMS_FAISS_PATH=$(spack location -i faiss) - export AMS_UMPIRE_PATH=$(spack location -i umpire) - export AMS_HDF5_PATH=$(spack location -i hdf5) - cmake \ - -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=On \ - -DWITH_HDF5=On \ - -DWITH_EXAMPLES=On \ - -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ - -DCMAKE_INSTALL_PREFIX=./install \ - -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CUDA=Off \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=On \ - -DWITH_MPI=On \ - -DWITH_TORCH=Off \ - -DWITH_TESTS=On \ - -DFAISS_DIR=$AMS_FAISS_PATH \ - -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=On \ - $GITHUB_WORKSPACE - make - - name: Run tests Torch=Off FAISS=On HDF5=On AMS + - name: Run Tests WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} run: | cd build source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env env CTEST_OUTPUT_ON_FAILURE=1 make test - - name: Build Torch=Off FAISS=Off HDF5=On AMS - shell: bash -l {0} - run: | - module load gcc/11.2.1 - source /spack/share/spack/setup-env.sh - spack env activate -p /ams-spack-env - rm -rf build/ - mkdir build - cd build - export AMS_MFEM_PATH=$(spack location -i mfem) - export AMS_UMPIRE_PATH=$(spack location -i umpire) - export AMS_HDF5_PATH=$(spack location -i hdf5) - cmake \ - -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=On \ - -DWITH_EXAMPLES=On \ - -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ - -DWITH_HDF5=On \ - -DCMAKE_INSTALL_PREFIX=./install \ - -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CUDA=Off \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=Off \ - -DWITH_MPI=On \ - -DWITH_TORCH=Off \ - -DWITH_TESTS=On \ - -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=On \ - $GITHUB_WORKSPACE - make - - name: Run tests Torch=Off FAISS=Off HDF5=On AMS - run: | - cd build - source /spack/share/spack/setup-env.sh - spack env activate -p /ams-spack-env - make test - - name: Build Torch=Off FAISS=Off HDF5=Off AMS - shell: bash -l {0} - run: | - module load gcc/11.2.1 - source /spack/share/spack/setup-env.sh - spack env activate -p /ams-spack-env - rm -rf build/ - mkdir build - cd build - export AMS_MFEM_PATH=$(spack location -i mfem) - export AMS_UMPIRE_PATH=$(spack location -i umpire) - cmake \ - -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=On \ - -DWITH_EXAMPLES=On \ - -DCMAKE_INSTALL_PREFIX=./install \ - -DCMAKE_BUILD_TYPE=Release \ - -DWITH_CUDA=Off \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=Off \ - -DWITH_MPI=On \ - -DWITH_TORCH=Off \ - -DWITH_TESTS=On \ - -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=Off \ - $GITHUB_WORKSPACE - make - - name: Run tests Torch=Off FAISS=Off HDF5=Off AMS + + - name: Install AMS WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} run: | cd build source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env - make test + make install build-cuda-tests: # The type of runner that the job will run on runs-on: ubuntu-latest container: ghcr.io/llnl/ams-ci-cuda11.6.1:latest - # Steps represent a sequence of tasks that will be executed as part of the job + strategy: + matrix: + with_hdf5: [ON, OFF] + with_caliper: [ON, OFF] + with_mpi : [ON, OFF] steps: - uses: actions/checkout@v3 - - name: Build Torch=On FAISS=On HDF5=On AMS + - name: Build WITH_CUDA=On WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} shell: bash -l {0} run: | + module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env rm -rf build/ @@ -270,127 +92,26 @@ jobs: export AMS_HDF5_PATH=$(spack location -i hdf5) cmake \ -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=On \ - -DWITH_HDF5=On \ - -DWITH_EXAMPLES=On \ + -DCMAKE_PREFIX_PATH=./install \ + -DWITH_CALIPER=${{ matrix.with_caliper }} \ + -DWITH_HDF5=${{ matrix.with_hdf5 }} \ -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ - -DCMAKE_INSTALL_PREFIX=./install \ -DCMAKE_BUILD_TYPE=Release \ - -DCUDA_ARCH=70 \ -DWITH_CUDA=On \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=On \ - -DWITH_MPI=On \ - -DWITH_TORCH=On \ + -DWITH_MPI=${{ matrix.with_mpi }} \ -DWITH_TESTS=On \ -DTorch_DIR=$AMS_TORCH_PATH \ - -DFAISS_DIR=$AMS_FAISS_PATH \ - -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=On \ - $GITHUB_WORKSPACE - make - - name: Build Torch=Off FAISS=On HDF5=On AMS - shell: bash -l {0} - run: | - source /spack/share/spack/setup-env.sh - spack env activate -p /ams-spack-env - rm -rf build/ - mkdir build - cd build - export AMS_MFEM_PATH=$(spack location -i mfem) - export AMS_FAISS_PATH=$(spack location -i faiss) - export AMS_UMPIRE_PATH=$(spack location -i umpire) - export AMS_HDF5_PATH=$(spack location -i hdf5) - cmake \ - -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=On \ - -DWITH_HDF5=On \ - -DWITH_EXAMPLES=On \ - -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ - -DCMAKE_INSTALL_PREFIX=./install \ - -DCMAKE_BUILD_TYPE=Release \ - -DCUDA_ARCH=70 \ - -DWITH_CUDA=On \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=On \ - -DWITH_MPI=On \ - -DWITH_TORCH=Off \ - -DWITH_TESTS=On \ - -DFAISS_DIR=$AMS_FAISS_PATH \ -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=On \ + -DWITH_WORKFLOW=Off \ $GITHUB_WORKSPACE make - - name: Build Torch=Off FAISS=Off HDF5=On AMS - shell: bash -l {0} + - name: Install AMS WITH_CUDA=On WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} run: | - source /spack/share/spack/setup-env.sh - spack env activate -p /ams-spack-env - rm -rf build/ - mkdir build cd build - export AMS_MFEM_PATH=$(spack location -i mfem) - export AMS_UMPIRE_PATH=$(spack location -i umpire) - export AMS_HDF5_PATH=$(spack location -i hdf5) - cmake \ - -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=On \ - -DWITH_EXAMPLES=On \ - -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ - -DWITH_HDF5=On \ - -DCMAKE_INSTALL_PREFIX=./install \ - -DCMAKE_BUILD_TYPE=Release \ - -DCUDA_ARCH=70 \ - -DWITH_CUDA=On \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=Off \ - -DWITH_MPI=On \ - -DWITH_TORCH=Off \ - -DWITH_TESTS=On \ - -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=On \ - $GITHUB_WORKSPACE - make - - name: Build Torch=Off FAISS=Off HDF5=Off AMS - shell: bash -l {0} - run: | source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env - rm -rf build/ - mkdir build - cd build - export AMS_MFEM_PATH=$(spack location -i mfem) - export AMS_UMPIRE_PATH=$(spack location -i umpire) - cmake \ - -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ - -DWITH_CALIPER=On \ - -DWITH_EXAMPLES=On \ - -DCMAKE_INSTALL_PREFIX=./install \ - -DCMAKE_BUILD_TYPE=Release \ - -DCUDA_ARCH=70 \ - -DWITH_CUDA=On \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=Off \ - -DWITH_MPI=On \ - -DWITH_TORCH=Off \ - -DWITH_TESTS=On \ - -DWITH_AMS_DEBUG=On \ - -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=Off \ - $GITHUB_WORKSPACE - make - + make install + build-rmq-tests: # The type of runner that the job will run on runs-on: ubuntu-latest @@ -425,7 +146,6 @@ jobs: cd build export AMS_MFEM_PATH=$(spack location -i mfem) export AMS_TORCH_PATH=$(spack location -i py-torch)/lib/python3.10/site-packages/torch/share/cmake/Torch - export AMS_FAISS_PATH=$(spack location -i faiss) export AMS_UMPIRE_PATH=$(spack location -i umpire) export AMS_HDF5_PATH=$(spack location -i hdf5) export AMS_AMQPCPP_PATH=$(spack location -i amqp-cpp)/cmake @@ -446,7 +166,6 @@ jobs: -DWITH_TORCH=On \ -DWITH_TESTS=On \ -DTorch_DIR=$AMS_TORCH_PATH \ - -DFAISS_DIR=$AMS_FAISS_PATH \ -DWITH_AMS_DEBUG=On \ -DWITH_WORKFLOW=On \ -DWITH_ADIAK=Off \ @@ -486,8 +205,8 @@ jobs: RABBITMQ_USER: ams RABBITMQ_PASS: ams RABBITMQ_HOST: rabbitmq - RABBITMQ_PORT: 5672 - + RABBITMQ_PORT: 5672 + sqlite-tests: runs-on: ubuntu-latest container: ghcr.io/llnl/ams-ci-flux-mariadb:latest @@ -534,4 +253,3 @@ jobs: run: | source /venv/bin/activate python -m unittest discover -s tests/AMSWorkflow -p "test_*.py" -v - From 86e81dd8cde195178a0b8dbbbc2c740ff66a8671 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 2 Jan 2025 15:00:11 -0800 Subject: [PATCH 035/136] Adding config --- cmake/AMSConfig.cmake.in | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/AMSConfig.cmake.in b/cmake/AMSConfig.cmake.in index b94b6308..2ba3f82a 100644 --- a/cmake/AMSConfig.cmake.in +++ b/cmake/AMSConfig.cmake.in @@ -77,3 +77,4 @@ if (AMS_WITH_RMQ) endif() check_required_components("@PROJECT_NAME@") + From 7d347a643705133ce353129fa1d9f3081aa3f6fd Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 2 Jan 2025 15:17:33 -0800 Subject: [PATCH 036/136] Adding full path in the case of bash tests --- tests/AMSlib/wf/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt index 7699265d..a76d74fa 100644 --- a/tests/AMSlib/wf/CMakeLists.txt +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -1,6 +1,6 @@ function(ADD_WORKFLOW_UNIT_TEST name exec) string(JOIN " " args ${ARGN}) - add_test(NAME ${name} COMMAND bash -c "rm -f ${CMAKE_CURRENT_BINARY_DIR}/db_label*.h5; ${exec} ${args}") + add_test(NAME ${name} COMMAND bash -c "rm -f ${CMAKE_CURRENT_BINARY_DIR}/db_label*.h5; ${CMAKE_CURRENT_BINARY_DIR}/${exec} ${args}") set_tests_properties(${name} PROPERTIES LABELS WORKFLOW_UNIT_TEST) endfunction() From 5e9a4c9dea4df1be81a1ad5d7c680f0303d59216 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 2 Jan 2025 15:36:09 -0800 Subject: [PATCH 037/136] Deleting cuda code --- src/AMSlib/wf/cuda/utilities.cpp | 768 ------------------------------- 1 file changed, 768 deletions(-) delete mode 100644 src/AMSlib/wf/cuda/utilities.cpp diff --git a/src/AMSlib/wf/cuda/utilities.cpp b/src/AMSlib/wf/cuda/utilities.cpp deleted file mode 100644 index 0af826da..00000000 --- a/src/AMSlib/wf/cuda/utilities.cpp +++ /dev/null @@ -1,768 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - */ - -#ifndef __DEVICE_UTILITIES__ -#define __DEVICE_UTILITIES__ - - -#include -#include -#include -#include -#include - -#include - -#include "wf/device.hpp" -#include "wf/resource_manager.hpp" - -namespace ams -{ -namespace Device -{ - -const int warpSize = 32; -const unsigned int fullMask = 0xffffffff; - -__host__ int divup(int x, int y) { return (x + y - 1) / y; } - -__device__ __inline__ int pow2i(int e) { return 1 << e; } - -// Define this to turn on error checking -#define CUDA_ERROR_CHECK - -#define CUDASAFECALL(err) __cudaSafeCall(err, __FILE__, __LINE__) -#define CUDACHECKERROR() __cudaCheckError(__FILE__, __LINE__) - -inline void __cudaSafeCall(cudaError err, const char* file, const int line) -{ -#ifdef CUDA_ERROR_CHECK - if (cudaSuccess != err) { - fprintf(stderr, - "cudaSafeCall() failed at %s:%i : %s\n", - file, - line, - cudaGetErrorString(err)); - - fprintf(stdout, - "cudaSafeCall() failed at %s:%i : %s\n", - file, - line, - cudaGetErrorString(err)); - exit(-1); - } -#endif - - return; -} - -struct is_true { - __host__ __device__ bool operator()(const int x) { return x; } -}; - -struct is_false { - __host__ __device__ bool operator()(const int x) { return !x; } -}; - - -inline void __cudaCheckError(const char* file, const int line) -{ -#ifdef CUDA_ERROR_CHECK - cudaError err = cudaGetLastError(); - if (cudaSuccess != err) { - fprintf(stderr, - "cudaCheckError() failed at %s:%i : %s\n", - file, - line, - cudaGetErrorString(err)); - exit(-1); - } - - // More careful checking. However, this will affect performance. - // Comment away if needed. - err = cudaDeviceSynchronize(); - if (cudaSuccess != err) { - fprintf(stderr, - "cudaCheckError() with sync failed at %s:%i : %s\n", - file, - line, - cudaGetErrorString(err)); - exit(-1); - } -#endif - - return; -} - -__global__ void srand_dev(curandState* states, const int total_threads) -{ - int id = threadIdx.x + blockDim.x * blockIdx.x; - if (id < total_threads) { - int seed = id; // different seed per thread - curand_init(seed, id, 0, &states[id]); - } -} - -__global__ void initIndices(int* ind, int length) -{ - int id = threadIdx.x + blockDim.x * blockIdx.x; - if (id < length) ind[id] = id; -} - -template -__global__ void fillRandom(bool* predicate, - const int total_threads, - curandState* states, - const size_t length, - T threshold) -{ - int id = threadIdx.x + blockDim.x * blockIdx.x; - if (id < total_threads) { - for (int i = id; i < length; i += total_threads) { - float x = curand_uniform(&states[id]); - predicate[i] = (x <= threshold); - } - } -} - -template -__global__ void computeBlockCounts(bool cond, - T* d_input, - int length, - int* d_BlockCounts) -{ - int idx = threadIdx.x + blockIdx.x * blockDim.x; - if (idx < length) { - int pred = (d_input[idx] == cond); - int BC = __syncthreads_count(pred); - - if (threadIdx.x == 0) { - d_BlockCounts[blockIdx.x] = - BC; // BC will contain the number of valid elements in all threads of this thread block - } - } -} - -template -__global__ void assignK(T** sparse, - T** dense, - int* indices, - size_t length, - int dims, - bool isReverse) -{ - int idx = threadIdx.x + blockIdx.x * blockDim.x; - if (idx < length) { - int index = indices[idx]; - if (!isReverse) { - for (int i = 0; i < dims; i++) { - dense[i][idx] = sparse[i][index]; - } - } else { - for (int i = 0; i < dims; i++) { - sparse[i][index] = dense[i][idx]; - } - } - } -} - -template -__global__ void device_compactK(bool cond, - T** d_input, - T** d_output, - const bool* predicates, - const size_t length, - int dims, - int* d_BlocksOffset, - bool reverse) -{ - int idx = threadIdx.x + blockIdx.x * blockDim.x; - extern __shared__ int warpTotals[]; - if (idx < length) { - int pred = (predicates[idx] == cond); - int w_i = threadIdx.x / warpSize; //warp index - int w_l = idx % warpSize; //thread index within a warp - - // compute exclusive prefix sum based on predicate validity to get output offset for thread in warp - int t_m = fullMask >> (warpSize - w_l); //thread mask -#if (CUDART_VERSION < 9000) - int b = __ballot(pred) & t_m; //ballot result = number whose ith bit - //is one if the ith's thread pred is true - //masked up to the current index in warp -#else - int b = __ballot_sync(fullMask, pred) & t_m; -#endif - int t_u = __popc( - b); // popc count the number of bit one. simply count the number predicated true BEFORE MY INDEX - - // last thread in warp computes total valid counts for the warp - if (w_l == warpSize - 1) { - warpTotals[w_i] = t_u + pred; - } - - // need all warps in thread block to fill in warpTotals before proceeding - __syncthreads(); - - // first numWarps threads in first warp compute exclusive prefix sum to get output offset for each warp in thread block - int numWarps = blockDim.x / warpSize; - unsigned int numWarpsMask = fullMask >> (warpSize - numWarps); - if (w_i == 0 && w_l < numWarps) { - int w_i_u = 0; - for (int j = 0; j <= 5; j++) { -#if (CUDART_VERSION < 9000) - int b_j = __ballot( - warpTotals[w_l] & - pow2i(j)); //# of the ones in the j'th digit of the warp offsets -#else - int b_j = __ballot_sync(numWarpsMask, warpTotals[w_l] & pow2i(j)); -#endif - w_i_u += (__popc(b_j & t_m)) << j; - } - warpTotals[w_l] = w_i_u; - } - - // need all warps in thread block to wait until prefix sum is calculated in warpTotals - __syncthreads(); - - // if valid element, place the element in proper destination address based on thread offset in warp, warp offset in block, and block offset in grid - if (pred) { - if (!reverse) { - for (int i = 0; i < dims; i++) - d_output[i][t_u + warpTotals[w_i] + d_BlocksOffset[blockIdx.x]] = - d_input[i][idx]; - } else { - for (int i = 0; i < dims; i++) - d_input[i][idx] = - d_output[i][t_u + warpTotals[w_i] + d_BlocksOffset[blockIdx.x]]; - } - } - } -} - - -template -void __global__ linearizeK(TypeOutValue* output, - const TypeInValue* const* inputs, - size_t dims, - size_t elements) -{ - int idx = threadIdx.x + blockIdx.x * blockDim.x; - if (idx >= elements) return; - - for (int i = 0; i < dims; i++) { - output[idx * dims + i] = static_cast(inputs[i][idx]); - } -} - - -void __global__ compute_predicate(float* data, - bool* predicate, - size_t nData, - const size_t kneigh, - float threshold) -{ - int idx = threadIdx.x + blockIdx.x * blockDim.x; - if (idx >= nData) return; - - int index = idx * kneigh; - float acc = 0.0f; - for (int i = 0; i < kneigh; i++) { - acc += data[index + i]; - } - - acc /= static_cast(kneigh); - - bool pred = acc < threshold ? true : false; - - predicate[idx] = pred; -} - -template -int device_compact(bool cond, - const T** sparse, - T** dense, - const bool* dPredicate, - const size_t length, - int dims, - int blockSize, - bool isReverse) -{ - int numBlocks = divup(length, blockSize); - auto& rm = ams::ResourceManager::getInstance(); - int* d_BlocksCount = rm.allocate(numBlocks, AMSResourceType::AMS_DEVICE); - int* d_BlocksOffset = - rm.allocate(numBlocks, AMSResourceType::AMS_DEVICE); - // determine number of elements in the compacted list - int* h_BlocksCount = rm.allocate(numBlocks, AMSResourceType::AMS_HOST); - int* h_BlocksOffset = rm.allocate(numBlocks, AMSResourceType::AMS_HOST); - - T** d_dense = rm.allocate(dims, AMSResourceType::AMS_DEVICE); - T** d_sparse = rm.allocate(dims, AMSResourceType::AMS_DEVICE); - - - rm.copy(dense, - AMSResourceType::AMS_HOST, - d_dense, - AMSResourceType::AMS_DEVICE, - dims); - rm.copy(const_cast(sparse), - AMSResourceType::AMS_HOST, - d_sparse, - AMSResourceType::AMS_DEVICE, - dims); - - thrust::device_ptr thrustPrt_bCount(d_BlocksCount); - thrust::device_ptr thrustPrt_bOffset(d_BlocksOffset); - - //phase 1: count number of valid elements in each thread block - computeBlockCounts<<>>(cond, - dPredicate, - length, - d_BlocksCount); - - //phase 2: compute exclusive prefix sum of valid block counts to get output offset for each thread block in grid - thrust::exclusive_scan(thrust::device, - d_BlocksCount, - d_BlocksCount + numBlocks, - d_BlocksOffset); - - //phase 3: compute output offset for each thread in warp and each warp in thread block, then output valid elements - device_compactK<<>>(cond, - d_sparse, - d_dense, - dPredicate, - length, - dims, - d_BlocksOffset, - isReverse); - cudaDeviceSynchronize(); - CUDACHECKERROR(); - - rm.copy(d_BlocksCount, - AMSResourceType::AMS_DEVICE, - h_BlocksCount, - AMSResourceType::AMS_HOST, - numBlocks); - rm.copy(d_BlocksOffset, - AMSResourceType::AMS_DEVICE, - h_BlocksOffset, - AMSResourceType::AMS_HOST, - numBlocks); - - int compact_length = - h_BlocksOffset[numBlocks - 1] + thrustPrt_bCount[numBlocks - 1]; - - rm.deallocate(d_BlocksCount, AMSResourceType::AMS_DEVICE); - rm.deallocate(d_BlocksOffset, AMSResourceType::AMS_DEVICE); - - rm.deallocate(h_BlocksCount, AMSResourceType::AMS_HOST); - rm.deallocate(h_BlocksOffset, AMSResourceType::AMS_HOST); - - rm.deallocate(d_dense, AMSResourceType::AMS_DEVICE); - rm.deallocate(d_sparse, AMSResourceType::AMS_DEVICE); - - cudaDeviceSynchronize(); - CUDACHECKERROR(); - - return compact_length; -} - -template -int device_compact(bool cond, - T** sparse, - T** dense, - int* indices, - const size_t length, - int dims, - int blockSize, - const bool* dPredicate, - bool isReverse) -{ - int numBlocks = divup(length, blockSize); - size_t sparseElements = length; - - if (!isReverse) { - initIndices<<>>(indices, length); - if (cond) { - auto last = thrust::copy_if(thrust::device, - indices, - indices + sparseElements, - dPredicate, - indices, - is_true()); - sparseElements = last - indices; - } else { - auto last = thrust::copy_if(thrust::device, - indices, - indices + sparseElements, - dPredicate, - indices, - is_false()); - sparseElements = last - indices; - } - } - - assignK<<>>( - sparse, dense, indices, sparseElements, dims, isReverse); - cudaDeviceSynchronize(); - CUDACHECKERROR(); - - return sparseElements; -} - -template -void device_linearize(TypeOutValue* output, - const TypeInValue* const* inputs, - size_t dims, - size_t elements) -{ - // TODO: Fix "magic number". - const int NT = 256; - // TODO: We should add a max number of blocks typically this should be around 3K. - int NB = (elements + NT - 1) / NT; - DBG(Device, - "Linearize using %ld blocks %ld threads to transpose %ld, %ld matrix", - NB, - NT, - dims, - elements); - - linearizeK<<>>(output, inputs, dims, elements); - cudaDeviceSynchronize(); - CUDACHECKERROR(); -} - -template -void cuda_rand_init(bool* predicate, const size_t length, T threshold) -{ - static curandState* dev_random = NULL; - const int TS = 4096; - const int BS = 128; - int numBlocks = divup(TS, BS); - auto& rm = ams::ResourceManager::getInstance(); - if (!dev_random) { - dev_random = rm.allocate(4096, AMSResourceType::AMS_DEVICE); - srand_dev<<>>(dev_random, TS); - } - - DBG(Device, - "Random Fill using %ld blocks %ld threads to randomly initialize %ld " - "elements", - numBlocks, - BS, - length); - fillRandom<<>>(predicate, TS, dev_random, length, threshold); - cudaDeviceSynchronize(); - CUDACHECKERROR(); -} - - -void device_compute_predicate(float* data, - bool* predicate, - size_t nData, - const size_t kneigh, - float threshold) -{ - const int NT = 256; - int NB = (nData + NT - 1) / NT; - DBG(Device, - "Compute predicate for %d elements with threshold %f", - nData, - threshold); - compute_predicate<<>>(data, predicate, nData, kneigh, threshold); - cudaDeviceSynchronize(); - CUDACHECKERROR(); -} - -__global__ void random_uq_device(int seed, - bool* uq_flags, - int ndata, - double acceptable_error) -{ - - /* CUDA's random number library uses curandState_t to keep track of the seed - value we will store a random state for every thread */ - curandState_t state; - int id = threadIdx.x + blockDim.x * blockIdx.x; - - if (id >= ndata) return; - - /* we have to initialize the state */ - curand_init( - seed + - id, /* the seed controls the sequence of random values that are produced */ - 0, /* the sequence number is only important with multiple cores */ - 0, /* the offset is how much extra we advance in the sequence for each - call, can be 0 */ - &state); - - float x = curand_uniform(&state); - uq_flags[id] = (x <= acceptable_error); -} - - -template -__global__ void computeDeltaUQMeanPredicatesKernel( - const scalar_t* __restrict__ outputs_stdev, - bool* __restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold) -{ - - size_t idx = blockDim.x * blockIdx.x + threadIdx.x; - size_t stride = blockDim.x * gridDim.x; - // Compute mean over columns, strided loop. - for (size_t i = idx; i < nrows; i += stride) { - double mean = 0.0; - for (size_t j = 0; j < ncols; ++j) - mean += outputs_stdev[j + i * ncols]; - mean /= ncols; - - predicates[i] = (mean < threshold); - } -} - -template -__global__ void computeDeltaUQMaxPredicatesKernel( - const scalar_t* __restrict__ outputs_stdev, - bool* __restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold) -{ - - size_t idx = blockDim.x * blockIdx.x + threadIdx.x; - size_t stride = blockDim.x * gridDim.x; - // Compute max delta uq over columns, strided loop. - for (size_t i = idx; i < nrows; i += stride) { - predicates[i] = true; - for (size_t j = 0; j < ncols; ++j) - if (outputs_stdev[j + i * ncols] >= threshold) { - predicates[i] = false; - break; - } - } -} - - -template -void rand_init(bool* predicate, const size_t n, TypeValue threshold) -{ - cuda_rand_init(predicate, n, threshold); - return; -} - -template -void computeDeltaUQMeanPredicatesDevice( - const scalar_t* __restrict__ outputs_stdev, - bool* __restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold) -{ - constexpr int block_size = 256; - int grid_size = divup(nrows, block_size); - computeDeltaUQMeanPredicatesKernel<<>>( - outputs_stdev, predicates, nrows, ncols, threshold); - cudaDeviceSynchronize(); - CUDACHECKERROR(); -}; - -template -void computeDeltaUQMaxPredicatesDevice( - const scalar_t* __restrict__ outputs_stdev, - bool* __restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold) -{ - constexpr int block_size = 256; - int grid_size = divup(nrows, block_size); - computeDeltaUQMaxPredicatesKernel<<>>( - outputs_stdev, predicates, nrows, ncols, threshold); - cudaDeviceSynchronize(); - CUDACHECKERROR(); -} - - -// Specializations - -template void computeDeltaUQMaxPredicatesDevice( - const float* __restrict__ outputs_stdev, - bool* __restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold); - -template void computeDeltaUQMaxPredicatesDevice( - const double* __restrict__ outputs_stdev, - bool* __restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold); - -template void computeDeltaUQMeanPredicatesDevice( - const float* __restrict__ outputs_stdev, - bool* __restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold); - -template void computeDeltaUQMeanPredicatesDevice( - const double* __restrict__ outputs_stdev, - bool* __restrict__ predicates, - const size_t nrows, - const size_t ncols, - const double threshold); - -template void cuda_rand_init(bool* predicate, - const size_t length, - float threshold); - -template void cuda_rand_init(bool* predicate, - const size_t length, - double threshold); - - -template void device_linearize(float* output, - const float* const* inputs, - size_t dims, - size_t elements); - -template void device_linearize(double* output, - const float* const* inputs, - size_t dims, - size_t elements); - -template void device_linearize(double* output, - const double* const* inputs, - size_t dims, - size_t elements); - -template void device_linearize(float* output, - const double* const* inputs, - size_t dims, - size_t elements); - -template int device_compact(bool cond, - const double** sparse, - double** dense, - const bool* dPredicate, - const size_t length, - int dims, - int blockSize, - bool isReverse); - -template int device_compact(bool cond, - const float** sparse, - float** dense, - const bool* dPredicate, - const size_t length, - int dims, - int blockSize, - bool isReverse); - -template int device_compact(bool cond, - double** sparse, - double** dense, - int* indices, - const size_t length, - int dims, - int blockSize, - const bool* dPredicate, - bool isReverse); - -template int device_compact(bool cond, - float** sparse, - float** dense, - int* indices, - const size_t length, - int dims, - int blockSize, - const bool* dPredicate, - bool isReverse); - - -template void rand_init(bool* predicate, - const size_t n, - double threshold); - -template void rand_init(bool* predicate, - const size_t n, - float threshold); - -} // namespace Device - - -void DtoDMemcpy(void* dest, void* src, size_t nBytes) -{ - cudaMemcpy(dest, src, nBytes, cudaMemcpyDeviceToDevice); -} - -void HtoHMemcpy(void* dest, void* src, size_t nBytes) -{ - std::memcpy(dest, src, nBytes); -} - -void HtoDMemcpy(void* dest, void* src, size_t nBytes) -{ - cudaMemcpy(dest, src, nBytes, cudaMemcpyHostToDevice); -}; - -void DtoHMemcpy(void* dest, void* src, size_t nBytes) -{ - cudaMemcpy(dest, src, nBytes, cudaMemcpyDeviceToHost); -} - -void* DeviceAllocate(size_t nBytes) -{ - void* devPtr; - cudaMalloc(&devPtr, nBytes); - return devPtr; -} - -void DeviceFree(void* ptr) -{ - cudaFree(ptr); - return; -} - -void* DevicePinnedAlloc(size_t nBytes) -{ - void* ptr; - cudaHostAlloc(&ptr, nBytes, cudaHostAllocPortable); - return ptr; -} - -void DeviceFreePinned(void* ptr) { cudaFreeHost(ptr); } - - -void deviceCheckErrors(const char* file, int line) -{ - ams::Device::__cudaCheckError(file, line); -} - -void device_random_uq(int seed, - bool* uq_flags, - int ndata, - double acceptable_error) -{ - size_t block_size = 256; - size_t blocks = ams::Device::divup(ndata, block_size); - ams::Device::random_uq_device<<>>(seed, - uq_flags, - ndata, - acceptable_error); -} - - -} // namespace ams - -#endif From 1f3f54396b6561068ac9530ec04f068adc4ffa7b Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 2 Jan 2025 16:07:53 -0800 Subject: [PATCH 038/136] Extend allocation time in lassen CI --- .gitlab/custom-jobs-and-variables.yml | 2 +- scripts/gitlab/ci-build-test.sh | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.gitlab/custom-jobs-and-variables.yml b/.gitlab/custom-jobs-and-variables.yml index c0eaf759..f752c33c 100644 --- a/.gitlab/custom-jobs-and-variables.yml +++ b/.gitlab/custom-jobs-and-variables.yml @@ -48,7 +48,7 @@ variables: # Lassen uses a different job scheduler (spectrum lsf) that does not allow # pre-allocation the same way slurm does. Arguments for job level allocation - LASSEN_JOB_ALLOC: "1 -W 30 -q pci" + LASSEN_JOB_ALLOC: "1 -W 45 -q pci" # Add variables that should apply to all the jobs on a machine: # LASSEN_MY_VAR: "..." diff --git a/scripts/gitlab/ci-build-test.sh b/scripts/gitlab/ci-build-test.sh index af1bb807..d452f111 100755 --- a/scripts/gitlab/ci-build-test.sh +++ b/scripts/gitlab/ci-build-test.sh @@ -29,8 +29,9 @@ build_and_test() { "WITH_CUDA ${WITH_CUDA}" echo "*******************************************************************************************" - mkdir -p /tmp/ams - pushd /tmp/ams + build_dir="/tmp/ams/$(uuidgen)" + mkdir -p ${build_dir} + pushd ${build_dir} cleanup @@ -44,14 +45,11 @@ build_and_test() { -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ -DWITH_CALIPER=On \ -DWITH_HDF5=${WITH_HDF5} \ - -DWITH_EXAMPLES=Off \ -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ -DCMAKE_INSTALL_PREFIX=./install \ -DCMAKE_BUILD_TYPE=Release \ -DCUDA_ARCH=$AMS_CUDA_ARCH \ -DWITH_CUDA=${WITH_CUDA} \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ -DWITH_FAISS=${WITH_FAISS} \ -DWITH_MPI=${WITH_MPI} \ -DWITH_TESTS=On \ @@ -67,7 +65,7 @@ build_and_test() { cleanup popd - rm -rf /tmp/ams + rm -rf ${build_dir} } # build_and_test WITH_HDF5 WITH_MPI From 797e10f514aa9c31b0af14c8f70d996340b16137 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 08:06:53 -0800 Subject: [PATCH 039/136] Remove faiss for CI --- scripts/gitlab/ci-build-test.sh | 1 - src/AMSlib/macro.h | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/gitlab/ci-build-test.sh b/scripts/gitlab/ci-build-test.sh index d452f111..ca85960e 100755 --- a/scripts/gitlab/ci-build-test.sh +++ b/scripts/gitlab/ci-build-test.sh @@ -50,7 +50,6 @@ build_and_test() { -DCMAKE_BUILD_TYPE=Release \ -DCUDA_ARCH=$AMS_CUDA_ARCH \ -DWITH_CUDA=${WITH_CUDA} \ - -DWITH_FAISS=${WITH_FAISS} \ -DWITH_MPI=${WITH_MPI} \ -DWITH_TESTS=On \ -DTorch_DIR=$AMS_TORCH_PATH \ diff --git a/src/AMSlib/macro.h b/src/AMSlib/macro.h index 608c63e8..980d4e3e 100644 --- a/src/AMSlib/macro.h +++ b/src/AMSlib/macro.h @@ -22,3 +22,4 @@ typedef void *MPI_Comm; #else #define PERFFASPECT() #endif + From da2c426ff390fd81a3075aa4bde44377fcad8296 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 09:05:04 -0800 Subject: [PATCH 040/136] Update BO to new API --- examples/bnm_opt/CMakeLists.txt | 74 +++++++++++++++++++++------ examples/bnm_opt/binomial_options.cpp | 2 +- examples/bnm_opt/kernel.cpp | 48 ++++++++++++----- examples/bnm_opt/kernel.hpp | 10 +--- 4 files changed, 94 insertions(+), 40 deletions(-) diff --git a/examples/bnm_opt/CMakeLists.txt b/examples/bnm_opt/CMakeLists.txt index 0f147c2b..76064a14 100644 --- a/examples/bnm_opt/CMakeLists.txt +++ b/examples/bnm_opt/CMakeLists.txt @@ -3,25 +3,65 @@ # # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -set(binomial_options_src binomial_options.cpp kernel.cpp) - -function(ADDExec binary_name definitions) - target_include_directories(${binary_name} PUBLIC "${AMS_EXAMPLE_INCLUDES}") - target_compile_definitions(${binary_name} PRIVATE ${definitions}) - target_compile_definitions(${binary_name} PRIVATE ${AMS_EXAMPLE_DEFINES}) - target_link_directories(${binary_name} PRIVATE ${AMS_EXAMPLE_LIB_DIRS}) - target_link_libraries(${binary_name} PUBLIC AMS ${AMS_EXAMPLE_LIBRARIES}) - - if (WITH_CUDA) - set_source_files_properties(kernel.cpp PROPERTIES LANGUAGE CUDA) - set_target_properties(${binary_name} PROPERTIES CUDA_ARCHITECTURES "${AMS_CUDA_ARCH}") + +cmake_minimum_required(VERSION 3.10) +cmake_policy(SET CMP0104 NEW) + +# Define the project +project(BOptions LANGUAGES CXX) + +set(AMS_EXAMPLE_SRC binomial_options.cpp kernel.cpp) + + +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +enable_language(CUDA) +find_package(CUDAToolkit REQUIRED) + +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + +function(ADDExec binary_name use_ams) + target_link_libraries(${binary_name} PRIVATE ${MFEM_LIBRARIES}) + target_include_directories(${binary_name} PRIVATE ${MFEM_INCLUDE_DIRS}) + # we always use ams to avoid if def conflicts. + # but we only enable it for the use_ams case + find_package(AMS REQUIRED) + target_link_libraries(${binary_name} PUBLIC AMS::AMS) + if (${use_ams}) + target_compile_definitions(${binary_name} PRIVATE USE_AMS) + endif() + + if (WITH_MPI) + target_link_libraries(${binary_name} PRIVATE MPI::MPI_CXX) + target_compile_definitions(${binary_name} PRIVATE "__ENABLE_MPI__") endif() + + + target_link_libraries(${binary_name} PRIVATE + CUDA::cudart + CUDA::cublas + CUDA::cusparse + CUDA::curand + ) + set_source_files_properties(kernel.cpp PROPERTIES LANGUAGE CUDA) + set_target_properties(${binary_name} PROPERTIES CUDA_ARCHITECTURES "${CMAKE_CUDA_ARCHITECTURES}") + target_compile_definitions(${binary_name} PRIVATE "__ENABLE_CUDA__") endfunction() -add_executable(no_ams_bo ${binomial_options_src} ${MINIAPP_INCLUDES}) -ADDExec(no_ams_bo minibude "${AMS_EXAMPLE_DEFINES}") +add_executable(no_ams_boptions ${AMS_EXAMPLE_SRC} ${MINIAPP_INCLUDES}) +ADDExec(no_ams_boptions FALSE) + +add_executable(ams_boptions ${AMS_EXAMPLE_SRC} ${MINIAPP_INCLUDES}) +ADDExec(ams_boptions TRUE) -list(APPEND AMS_EXAMPLE_DEFINES "-DUSE_AMS") -add_executable(ams_bo ${binomial_options_src} ${MINIAPP_INCLUDES}) -ADDExec(ams_bo "${AMS_EXAMPLE_DEFINES}") diff --git a/examples/bnm_opt/binomial_options.cpp b/examples/bnm_opt/binomial_options.cpp index f9a2a4e0..8ff8182d 100644 --- a/examples/bnm_opt/binomial_options.cpp +++ b/examples/bnm_opt/binomial_options.cpp @@ -253,7 +253,7 @@ int main(int argc, char **argv) #endif if (argc != 5) { - std::cout << "USAGE: " << argv[0] << " num-options batch_size"; + std::cout << "USAGE: " << argv[0] << " num-options batch_size num_fractions fraction_id"; return EXIT_FAILURE; } diff --git a/examples/bnm_opt/kernel.cpp b/examples/bnm_opt/kernel.cpp index a2e9631e..0364b622 100644 --- a/examples/bnm_opt/kernel.cpp +++ b/examples/bnm_opt/kernel.cpp @@ -26,6 +26,8 @@ #include #endif +using namespace ams; + // Overloaded shortcut functions for different precision modes #ifndef DOUBLE_PRECISION @@ -169,6 +171,7 @@ BinomialOptions::BinomialOptions(unsigned int batchSize, #ifdef USE_AMS const char *model_name = std::getenv("BO_MODEL_NAME"); + std::cout << "Model name is " << model_name << "\n"; if (model_name) { model = AMSQueryModel(model_name); } else { @@ -176,9 +179,6 @@ BinomialOptions::BinomialOptions(unsigned int batchSize, } wf = AMSCreateExecutor(model, - AMSDType::AMS_DOUBLE, - AMSResourceType::AMS_DEVICE, - (AMSPhysicFn)(BinomialOptions::AMSRun), rank, worldSize); #endif @@ -219,18 +219,38 @@ void BinomialOptions::run(real *callValue, cudaMemcpy(d_X, _X, sizeof(real) * optN, cudaMemcpyHostToDevice); #ifdef USE_AMS - std::vector inputs({(const real *)d_S, - (const real *)d_X, - (const real *)d_R, - (const real *)d_V, - (const real *)d_T}); + + SmallVector inputs; + SmallVector inout; + SmallVector outputs; + inputs.push_back(std::move(AMSTensor::view(d_S, {static_cast(optN), 1L}, {1, 1}, AMSResourceType::AMS_DEVICE))); + inputs.push_back(std::move(AMSTensor::view(d_X, {static_cast(optN), 1L}, {1, 1}, AMSResourceType::AMS_DEVICE))); + inputs.push_back(std::move(AMSTensor::view(d_R, {static_cast(optN), 1L}, {1, 1}, AMSResourceType::AMS_DEVICE))); + inputs.push_back(std::move(AMSTensor::view(d_V, {static_cast(optN), 1L}, {1, 1}, AMSResourceType::AMS_DEVICE))); + inputs.push_back(std::move(AMSTensor::view(d_T, {static_cast(optN), 1L}, {1, 1}, AMSResourceType::AMS_DEVICE))); + + + outputs.push_back(std::move(AMSTensor::view(d_CallValue, {static_cast(optN), 1}, {1, 1}, AMSResourceType::AMS_DEVICE))); + + EOSLambda OrigComputation = [&, this](const SmallVector &ams_ins, + SmallVector &ams_inouts, + SmallVector &ams_outs) { + binomialOptionsGPU(ams_outs[0].data(), + ams_ins[0].data(), + ams_ins[1].data(), + ams_ins[2].data(), + ams_ins[3].data(), + ams_ins[4].data(), + d_vDt, + d_puByDf, + d_pdByDf, + ams_outs[0].shape()[0]); + }; + + AMSExecute(wf, - (void *)this, - optN, - reinterpret_cast(inputs.data()), - reinterpret_cast(&d_CallValue), - inputs.size(), - 1); + OrigComputation, + inputs, inout, outputs); #else binomialOptionsGPU( d_CallValue, d_S, d_X, d_R, d_V, d_T, d_puByDf, d_pdByDf, d_vDt, optN); diff --git a/examples/bnm_opt/kernel.hpp b/examples/bnm_opt/kernel.hpp index 939dd5f6..0f4176a0 100644 --- a/examples/bnm_opt/kernel.hpp +++ b/examples/bnm_opt/kernel.hpp @@ -2,9 +2,7 @@ #include "realtype.h" -#ifdef USE_AMS #include -#endif class BinomialOptions { @@ -18,10 +16,8 @@ class BinomialOptions real *d_X; real *d_CallValue; -#ifdef USE_AMS - AMSCAbstrModel model; - AMSExecutor wf; -#endif + ams::AMSCAbstrModel model; + ams::AMSExecutor wf; public: BinomialOptions(unsigned int batchSize, int rank, int worldSize); @@ -33,9 +29,7 @@ class BinomialOptions real *_T, size_t optN); -#ifdef USE_AMS static void AMSRun(void *cls, long numOptions, void **inputs, void **outputs); -#endif ~BinomialOptions(); }; From 5480886479a7f240269f33f74e2cd9b5cd9439fa Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 09:06:06 -0800 Subject: [PATCH 041/136] Delete cmake for examples --- examples/CMakeLists.txt | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 examples/CMakeLists.txt diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt deleted file mode 100644 index 9c229a38..00000000 --- a/examples/CMakeLists.txt +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright 2021-2023 Lawrence Livermore National Security, LLC and other -# AMSLib Project Developers -# -# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - -#add_subdirectory(ideal_gas) -#if (WITH_CUDA) -#add_subdirectory(bnm_opt) -#endif() - From f179d3010f1b2bc884eeac18e7f249f8f0afc7c8 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 11:06:44 -0800 Subject: [PATCH 042/136] Fix static compilation --- cmake/AMSConfig.cmake.in | 77 ++++++--------------------------- examples/bnm_opt/CMakeLists.txt | 5 ++- src/AMSlib/CMakeLists.txt | 56 +++++++++++++++++------- 3 files changed, 58 insertions(+), 80 deletions(-) diff --git a/cmake/AMSConfig.cmake.in b/cmake/AMSConfig.cmake.in index 2ba3f82a..9ed67a38 100644 --- a/cmake/AMSConfig.cmake.in +++ b/cmake/AMSConfig.cmake.in @@ -7,74 +7,25 @@ set(AMS_WITH_MPI @WITH_MPI@) set(AMS_WITH_CUDA @WITH_CUDA@) set(AMS_WITH_CALIPER @WITH_CALIPER@) set(AMS_WITH_HDF5 @WITH_HDF5@) -set(AMS_WITH_RMQ @WITH_RMQ@) -include(CMakeFindDependencyMacro) +# Check if the AMS target is static +get_target_property(AMS_TYPE AMS::AMS TYPE) -find_dependency(nlohmann_json REQUIRED) -if (NOT TARGET Torch) - set(AMS_TORCH_DIR @Torch_DIR@) - if (NOT Torch_DIR) - set(Torch_DIR ${AMS_TORCH_DIR}) +if(AMS_TYPE STREQUAL "STATIC_LIBRARY") + message(STATUS "AMS is a static library. Finding required dependencies...") +# Add usage hints for downstream projects + if(AMS_WITH_MPI) + find_package(MPI REQUIRED) endif() - find_dependency(Torch REQUIRED HINTS ${Torch_DIR}) -endif() - -#Add usage hints for downstream projects -if(AMS_WITH_MPI) - if (NOT TARGET MPI) - find_dependency(MPI REQUIRED) - endif() -endif() - -if(AMS_WITH_CUDA) - if (NOT TARGET CUDA::cudart) - find_dependency(CUDAToolkit REQUIRED) + if(AMS_WITH_CUDA) + find_package(CUDAToolkit REQUIRED) endif() -endif() - -if (AMS_WITH_HDF5) - set(AMS_HDF5_DIR @AMS_HDF5_DIR@) - set(AMS_HDF5_LIB_TYPE @AMS_HDF5_LIB_TYPE@) - if (NOT TARGET hdf5-shared OR NOT TARGET hdf5-static) - if (NOT HDF5_DIR) - set(HDF5_DIR ${AMS_HDF5_DIR}) - endif() - - if (${AMS_HDF5_LIB_TYPE} STREQUAL "static") - find_dependency(HDF5 COMPONENTS C static HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) + if (AMS_WITH_HDF5) + if (@HDF5_USE_STATIC_LIBRARIES@) + find_package(HDF5 COMPONENTS C static HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) else() - find_dependency(HDF5 COMPONENTS C shared HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) + find_package(HDF5 COMPONENTS C shared HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) endif() endif() + find_package(Torch REQUIRED HINTS @Torch_DIR@) endif() -if (AMS_WITH_CALIPER) - if (NOT TARGET caliper) - set(CALIPER_AMS_DIR @caliper_DIR@) - # check if we specify another caliper directory - if (NOT caliper_DIR) - set(caliper_DIR ${CALIPER_AMS_DIR}) - endif() - find_dependency(caliper HINTS ${caliper_DIR}) - endif() -endif() - -if (AMS_WITH_RMQ) - set(AMS_RMQ_DIR @amqpcpp_DIR@) - if (NOT amqpcpp_DIR) - set(amqpcpp_DIR ${AMS_RMQ_DIR}) - endif() - set(AMS_OPENSSL_FOUND_ROOT @AMS_OPENSSL_FOUND_ROOT@) - if (NOT OPENSSL_ROOT_DIR) - set(OPENSSL_ROOT_DIR ${AMS_OPENSSL_FOUND_ROOT}) - endif() - find_dependency(amqpcpp REQUIRED HINTS ${amqpcpp_DIR}) - # find dependency does not correctly discover OpenSSL, not sure why. - find_dependency(OpenSSL) - if (NOT OPENSSL_FOUND) - find_dependency(OpenSSL HINTS ${AMS_OPENSSL_FOUND_ROOT}) - endif() -endif() - -check_required_components("@PROJECT_NAME@") - diff --git a/examples/bnm_opt/CMakeLists.txt b/examples/bnm_opt/CMakeLists.txt index 76064a14..2f5a2712 100644 --- a/examples/bnm_opt/CMakeLists.txt +++ b/examples/bnm_opt/CMakeLists.txt @@ -20,6 +20,8 @@ set(CMAKE_CXX_STANDARD 14) # Enable C++14 set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard enable_language(CUDA) + +find_package(AMS REQUIRED) find_package(CUDAToolkit REQUIRED) if (WITH_CALIPER) @@ -35,8 +37,7 @@ function(ADDExec binary_name use_ams) target_include_directories(${binary_name} PRIVATE ${MFEM_INCLUDE_DIRS}) # we always use ams to avoid if def conflicts. # but we only enable it for the use_ams case - find_package(AMS REQUIRED) - target_link_libraries(${binary_name} PUBLIC AMS::AMS) + target_link_libraries(${binary_name} PRIVATE AMS::AMS) if (${use_ams}) target_compile_definitions(${binary_name} PRIVATE USE_AMS) endif() diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index ed006e91..c86dd6d5 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -4,8 +4,6 @@ # ------------------------------------------------------------------------------ # handle sources and headers -#set global library path to link with tests if necessary -set(LIBRARY_OUTPUT_PATH ${AMS_LIB_OUT_PATH}) set(AMS_LIB_SRC wf/debug.cpp wf/logger.cpp wf/utils.cpp wf/SmallVector.cpp ml/surrogate.cpp wf/basedb.cpp AMSTensor.cpp wf/interface.cpp wf/resource_manager.cpp AMS.cpp) if (WITH_HDF5) @@ -18,31 +16,59 @@ endif() add_library(AMS ${AMS_LIB_SRC}) +get_target_property(AMS_TYPE AMS TYPE) + # ------------------------------------------------------------------------------ # setup the lib first message(STATUS "ALL INCLUDES ARE ${AMS_APP_INCLUDES}") target_compile_definitions(AMS PRIVATE ${AMS_APP_DEFINES}) -target_include_directories(AMS PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include) +target_include_directories(AMS PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(AMS PUBLIC + $ + $ +) -if (WITH_CUDA) - target_link_libraries(AMS PRIVATE CUDA::cudart) -endif() -if (WITH_HDF5) - target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) -endif() +if (AMS_TYPE STREQUAL "STATIC_LIBRARY") + if (WITH_CUDA) + target_link_libraries(AMS PRIVATE CUDA::cudart) + endif() + if (WITH_HDF5) + target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) + endif() -if (WITH_CALIPER) - target_link_libraries(AMS PRIVATE caliper) -endif() + if (WITH_CALIPER) + target_link_libraries(AMS PRIVATE caliper) + endif() + + if (WITH_MPI) + target_link_libraries(AMS PRIVATE MPI::MPI_CXX) + endif() + + target_link_libraries(AMS PRIVATE stdc++fs torch) +else() + if (WITH_CUDA) + target_link_libraries(AMS PRIVATE CUDA::cudart) + endif() + + if (WITH_HDF5) + target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) + endif() + + + if (WITH_CALIPER) + target_link_libraries(AMS PRIVATE caliper) + endif() + + if (WITH_MPI) + target_link_libraries(AMS PRIVATE MPI::MPI_CXX) + endif() -if (WITH_MPI) - target_link_libraries(AMS PRIVATE MPI::MPI_CXX) + target_link_libraries(AMS PRIVATE stdc++fs torch) endif() -target_link_libraries(AMS PRIVATE stdc++fs torch) configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMS-config.h.in" "${PROJECT_BINARY_DIR}/include/AMS-config.h") From a7ce0ca27bf62df78d2cc6b21b4e8f6c419dd415 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 11:23:53 -0800 Subject: [PATCH 043/136] Add linkage tests --- .github/workflows/ci.yml | 203 +++++++++++++++++++++++++++------------ 1 file changed, 141 insertions(+), 62 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 45115d3d..6689e767 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,7 +37,7 @@ jobs: export AMS_HDF5_PATH=$(spack location -i hdf5) cmake \ -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=./install \ + -DCMAKE_INSTALL_PREFIX=./install \ -DWITH_CALIPER=${{ matrix.with_caliper }} \ -DWITH_HDF5=${{ matrix.with_hdf5 }} \ -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ @@ -49,7 +49,7 @@ jobs: -DWITH_AMS_DEBUG=On \ -DWITH_WORKFLOW=Off \ $GITHUB_WORKSPACE - make + make -j$(nproc) - name: Run Tests WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} run: | cd build @@ -62,7 +62,7 @@ jobs: cd build source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env - make install + make -j$(nproc) install build-cuda-tests: # The type of runner that the job will run on @@ -92,7 +92,7 @@ jobs: export AMS_HDF5_PATH=$(spack location -i hdf5) cmake \ -DBUILD_SHARED_LIBS=On \ - -DCMAKE_PREFIX_PATH=./install \ + -DCMAKE_INSTALL_PREFIX=./install \ -DWITH_CALIPER=${{ matrix.with_caliper }} \ -DWITH_HDF5=${{ matrix.with_hdf5 }} \ -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ @@ -104,13 +104,142 @@ jobs: -DWITH_AMS_DEBUG=On \ -DWITH_WORKFLOW=Off \ $GITHUB_WORKSPACE - make + make -j$(nproc) - name: Install AMS WITH_CUDA=On WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} run: | cd build source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env - make install + make -j$(nproc) install + + + install-link-cpu-tests: + # The type of runner that the job will run on + runs-on: ubuntu-latest + container: ghcr.io/llnl/ams-ci-almalinux8:latest + + strategy: + matrix: + with_shared: [ON, OFF] + steps: + - uses: actions/checkout@v3 + - name: Build SharedLibray=${{ matrix.with_shared }} + shell: bash -l {0} + run: | + module load gcc/11.2.1 + source /spack/share/spack/setup-env.sh + spack env activate -p /ams-spack-env + rm -rf build/ + mkdir build + cd build + export AMS_INSTALL_PATH=$(pwd)/install + echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" + export AMS_MFEM_PATH=$(spack location -i mfem) + export AMS_TORCH_PATH=$(spack location -i py-torch)/lib/python3.10/site-packages/torch/share/cmake/Torch + export AMS_FAISS_PATH=$(spack location -i faiss) + export AMS_UMPIRE_PATH=$(spack location -i umpire) + export AMS_HDF5_PATH=$(spack location -i hdf5) + export AMS_AMQPCPP_PATH=$(spack location -i amqp-cpp)/cmake + cmake \ + -DBUILD_SHARED_LIBS=${{ matrix.with_shared }} \ + -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=${{ matrix.with_shared }} \ + -DCMAKE_INSTALL_PREFIX=$AMS_INSTALL_PATH \ + -DWITH_RMQ=On \ + -Damqpcpp_DIR=$AMS_AMQPCPP_PATH \ + -DWITH_CALIPER=On \ + -DWITH_HDF5=On \ + -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_CUDA=Off \ + -DWITH_MPI=On \ + -DWITH_TESTS=On \ + -DTorch_DIR=$AMS_TORCH_PATH \ + -DWITH_AMS_DEBUG=On \ + -DWITH_WORKFLOW=Off \ + $GITHUB_WORKSPACE + make -j$(nproc) + make -j$(nproc) install + echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" >> $GITHUB_ENV + - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} + shell: bash -l {0} + run: | + module load gcc/11.2.1 + source /spack/share/spack/setup-env.sh + spack env activate -p /ams-spack-env + mkdir build_idealgas/ + cd build_idealgas/ + export AMS_MFEM_PATH=$(spack location -i mfem) + echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" + cmake -DWITH_CUDA=Off -DAMS_DIR=${AMS_INSTALL_PATH}/lib64/cmake/AMS -DMFEM_DIR=${AMS_MFEM_PATH} $GITHUB_WORKSPACE/examples/ideal_gas/ + make -j$(nproc) VERBOSE=1 + + install-link-cuda-tests: + # The type of runner that the job will run on + runs-on: ubuntu-latest + container: ghcr.io/llnl/ams-ci-cuda11.6.1:latest + + strategy: + matrix: + with_shared: [ON, OFF] + steps: + - uses: actions/checkout@v3 + - name: Build SharedLibray=${{ matrix.with_shared }} + shell: bash -l {0} + run: | + module load gcc/11.2.1 + source /spack/share/spack/setup-env.sh + spack env activate -p /ams-spack-env + rm -rf build/ + mkdir build + cd build + export AMS_INSTALL_PATH=$(pwd)/install + echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" + export AMS_MFEM_PATH=$(spack location -i mfem) + export AMS_TORCH_PATH=$(spack location -i py-torch)/lib/python3.10/site-packages/torch/share/cmake/Torch + export AMS_FAISS_PATH=$(spack location -i faiss) + export AMS_UMPIRE_PATH=$(spack location -i umpire) + export AMS_HDF5_PATH=$(spack location -i hdf5) + echo "Current directory is: $(pwd)" + cmake \ + -DBUILD_SHARED_LIBS=${{ matrix.with_shared }} \ + -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=${{ matrix.with_shared }} \ + -DCMAKE_INSTALL_PREFIX=$AMS_INSTALL_PATH \ + -DWITH_CALIPER=On \ + -DWITH_HDF5=On \ + -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ + -DCMAKE_BUILD_TYPE=Release \ + -DWITH_CUDA=On \ + -DWITH_MPI=On \ + -DWITH_TESTS=On \ + -DTorch_DIR=$AMS_TORCH_PATH \ + -DWITH_AMS_DEBUG=On \ + -DWITH_WORKFLOW=Off \ + $GITHUB_WORKSPACE + make -j$(nproc) + make -j$(nproc) install + echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" >> $GITHUB_ENV + ls ${AMS_INSTALL_PATH} + - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} + shell: bash -l {0} + run: | + module load gcc/11.2.1 + source /spack/share/spack/setup-env.sh + spack env activate -p /ams-spack-env + mkdir build_idealgas/ + cd build_idealgas/ + export AMS_MFEM_PATH=$(spack location -i mfem) + cmake -DCMAKE_CUDA_ARCHITECTURES=70 -DAMS_DIR=${AMS_INSTALL_PATH}/lib64/cmake/AMS -DMFEM_DIR=${AMS_MFEM_PATH} $GITHUB_WORKSPACE/examples/ideal_gas/ + make -j$(nproc) VERBOSE=1 + - name: Install BOptions SharedLibray=${{ matrix.with_shared }} + shell: bash -l {0} + run: | + module load gcc/11.2.1 + source /spack/share/spack/setup-env.sh + spack env activate -p /ams-spack-env + mkdir build_bnm_opt/ + cd build_bnm_opt/ + cmake -DCMAKE_CUDA_ARCHITECTURES=70 -DAMS_DIR=${AMS_INSTALL_PATH}/lib64/cmake/AMS $GITHUB_WORKSPACE/examples/bnm_opt/ + make -j$(nproc) VERBOSE=1 build-rmq-tests: # The type of runner that the job will run on @@ -146,6 +275,7 @@ jobs: cd build export AMS_MFEM_PATH=$(spack location -i mfem) export AMS_TORCH_PATH=$(spack location -i py-torch)/lib/python3.10/site-packages/torch/share/cmake/Torch + export AMS_FAISS_PATH=$(spack location -i faiss) export AMS_UMPIRE_PATH=$(spack location -i umpire) export AMS_HDF5_PATH=$(spack location -i hdf5) export AMS_AMQPCPP_PATH=$(spack location -i amqp-cpp)/cmake @@ -154,21 +284,16 @@ jobs: -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ -DWITH_CALIPER=On \ -DWITH_HDF5=On \ - -DWITH_EXAMPLES=On \ -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ -DCMAKE_INSTALL_PREFIX=./install \ -DCMAKE_BUILD_TYPE=Release \ -DWITH_CUDA=Off \ - -DUMPIRE_DIR=$AMS_UMPIRE_PATH \ - -DMFEM_DIR=$AMS_MFEM_PATH \ - -DWITH_FAISS=On \ -DWITH_MPI=On \ -DWITH_TORCH=On \ -DWITH_TESTS=On \ -DTorch_DIR=$AMS_TORCH_PATH \ -DWITH_AMS_DEBUG=On \ -DWITH_WORKFLOW=On \ - -DWITH_ADIAK=Off \ -DWITH_RMQ=On \ -Damqpcpp_DIR=$AMS_AMQPCPP_PATH \ $GITHUB_WORKSPACE @@ -185,14 +310,15 @@ jobs: \"db\": { \"dbType\": \"rmq\", \"rmq_config\": { + \"rabbitmq-name\": \"rabbit\", \"rabbitmq-user\": \"${RABBITMQ_USER}\", \"rabbitmq-password\": \"${RABBITMQ_PASS}\", \"service-port\": ${RABBITMQ_PORT}, \"service-host\": \"${RABBITMQ_HOST}\", \"rabbitmq-vhost\": \"/\", - \"rabbitmq-queue-physics\": \"test-ci\", - \"rabbitmq-exchange-training\": \"ams-fanout\", - \"rabbitmq-key-training\": \"training\" + \"rabbitmq-outbound-queue\": \"test-ci\", + \"rabbitmq-exchange\": \"ams-fanout\", + \"rabbitmq-routing-key\": \"training\" }, \"update_surrogate\": false }, @@ -205,51 +331,4 @@ jobs: RABBITMQ_USER: ams RABBITMQ_PASS: ams RABBITMQ_HOST: rabbitmq - RABBITMQ_PORT: 5672 - - sqlite-tests: - runs-on: ubuntu-latest - container: ghcr.io/llnl/ams-ci-flux-mariadb:latest - - steps: - - uses: actions/checkout@v4 - - - name: Install AMS package (editable) - shell: bash -l {0} - run: | - source /venv/bin/activate - pip install -e ./ - - - name: Run AMS unittests (SQlite) - shell: bash -l {0} - run: | - source /venv/bin/activate - python -m unittest discover -s tests/AMSWorkflow -p "test_*.py" -v - mariadb-tests: - runs-on: ubuntu-latest - container: ghcr.io/llnl/ams-ci-flux-mariadb:latest - - steps: - - uses: actions/checkout@v4 - - - name: Start MariaDB - shell: bash -l {0} - run: | - mysqld_safe --datadir=/var/lib/mysql & - echo "Waiting for MariaDB..." - until mysqladmin ping -h 127.0.0.1 --silent; do sleep 1; done - echo "MariaDB is up" - - - name: Install AMS package (editable) - shell: bash -l {0} - run: | - source /venv/bin/activate - pip install -e ./ - - - name: Run AMS unittests (MariaDB) - env: - AMS_DB_URL: "mysql+mysqlconnector://testuser:testpass@127.0.0.1/testdb" - shell: bash -l {0} - run: | - source /venv/bin/activate - python -m unittest discover -s tests/AMSWorkflow -p "test_*.py" -v + RABBITMQ_PORT: 5672 From 788970d3610b87bc5d790b27fc2018d79cb6accd Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 11:33:59 -0800 Subject: [PATCH 044/136] Remove module load --- .github/workflows/ci.yml | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6689e767..bac183fc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,6 @@ jobs: - name: Build WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} shell: bash -l {0} run: | - module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env rm -rf build/ @@ -79,7 +78,6 @@ jobs: - name: Build WITH_CUDA=On WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} shell: bash -l {0} run: | - module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env rm -rf build/ @@ -126,7 +124,6 @@ jobs: - name: Build SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | - module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env rm -rf build/ @@ -163,7 +160,6 @@ jobs: - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | - module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env mkdir build_idealgas/ @@ -186,7 +182,6 @@ jobs: - name: Build SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | - module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env rm -rf build/ @@ -215,14 +210,14 @@ jobs: -DWITH_AMS_DEBUG=On \ -DWITH_WORKFLOW=Off \ $GITHUB_WORKSPACE - make -j$(nproc) - make -j$(nproc) install - echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" >> $GITHUB_ENV - ls ${AMS_INSTALL_PATH} + make + make install + echo "AMS_INSTALL_PATH=$(pwd)/install" >> $GITHUB_ENV + echo "AMS_INSTALL_PATH=$(pwd)/install" + ls $(pwd)/install - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | - module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env mkdir build_idealgas/ @@ -233,7 +228,6 @@ jobs: - name: Install BOptions SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | - module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env mkdir build_bnm_opt/ From e5de4e1a6482a474bcf06a52d95e2f0bf79024e4 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 11:37:13 -0800 Subject: [PATCH 045/136] Add back module load --- .github/workflows/ci.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bac183fc..8c0f3e9a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,6 +24,7 @@ jobs: - name: Build WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} shell: bash -l {0} run: | + module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env rm -rf build/ @@ -78,6 +79,7 @@ jobs: - name: Build WITH_CUDA=On WITH_HDF5=${{ matrix.with_hdf5 }}, WITH_CALIPER=${{ matrix.with_caliper }} WITH_MPI=${{ matrix.with_mpi }} shell: bash -l {0} run: | + module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env rm -rf build/ @@ -124,6 +126,7 @@ jobs: - name: Build SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | + module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env rm -rf build/ @@ -160,6 +163,7 @@ jobs: - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | + module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env mkdir build_idealgas/ @@ -182,6 +186,7 @@ jobs: - name: Build SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | + module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env rm -rf build/ @@ -218,6 +223,7 @@ jobs: - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | + module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env mkdir build_idealgas/ @@ -228,6 +234,7 @@ jobs: - name: Install BOptions SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | + module load gcc/11.2.1 source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env mkdir build_bnm_opt/ From b81a643b845489039ed29ecfad70b346bbecff43 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 12:09:54 -0800 Subject: [PATCH 046/136] Fix warnings --- tests/AMSlib/ams_interface/ams_ete.cpp | 21 +++++++++++---------- tests/AMSlib/ams_interface/ams_ete_env.cpp | 20 ++++++++++---------- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp index c7f17127..b3e6c6b4 100644 --- a/tests/AMSlib/ams_interface/ams_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -73,21 +73,22 @@ struct Problem { // Allocate Input memory for (int j = 0; j < num_inputs; j++) { DType *data = new DType[elements]; - input_tensors.push_back( - AMSTensor::view(initialize_inputs(data, elements), - {num_elements, 1}, - {1, 1}, - resource)); + DType *ptr = initialize_inputs(data, elements); + input_tensors.push_back(AMSTensor::view( + ptr, + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } // Allocate Output memory for (int j = 0; j < num_outputs; j++) { auto tmp = new DType[elements]; - output_tensors.push_back( - AMSTensor::view(initialize_inputs(tmp, elements), - {num_elements, 1}, - {1, 1}, - resource)); + output_tensors.push_back(AMSTensor::view( + initialize_inputs(tmp, elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } EOSLambda OrigComputation = diff --git a/tests/AMSlib/ams_interface/ams_ete_env.cpp b/tests/AMSlib/ams_interface/ams_ete_env.cpp index f49c2cc0..fc72a10a 100644 --- a/tests/AMSlib/ams_interface/ams_ete_env.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_env.cpp @@ -69,21 +69,21 @@ struct Problem { // Allocate Input memory for (int j = 0; j < num_inputs; j++) { DType *data = new DType[elements]; - input_tensors.push_back( - AMSTensor::view(initialize_inputs(data, elements), - {num_elements, 1}, - {1, 1}, - resource)); + input_tensors.push_back(AMSTensor::view( + initialize_inputs(data, elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } // Allocate Output memory for (int j = 0; j < num_outputs; j++) { auto tmp = new DType[elements]; - output_tensors.push_back( - AMSTensor::view(initialize_inputs(tmp, elements), - {num_elements, 1}, - {1, 1}, - resource)); + output_tensors.push_back(AMSTensor::view( + initialize_inputs(tmp, elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } EOSLambda OrigComputation = From b99b8c56d566f1259c354381c103d2b24aafc6de Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 12:15:14 -0800 Subject: [PATCH 047/136] Fix include interfaces --- src/AMSlib/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index c86dd6d5..6525cec0 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -22,7 +22,8 @@ get_target_property(AMS_TYPE AMS TYPE) # setup the lib first message(STATUS "ALL INCLUDES ARE ${AMS_APP_INCLUDES}") target_compile_definitions(AMS PRIVATE ${AMS_APP_DEFINES}) -target_include_directories(AMS PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +target_include_directories(AMS PRIVATE + $) target_include_directories(AMS PUBLIC $ $ From c8724c81ebf459343fabfe972e48ea2f2a4bf728 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 12:31:42 -0800 Subject: [PATCH 048/136] Configure mfem --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8c0f3e9a..9d7cbb9b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -230,7 +230,8 @@ jobs: cd build_idealgas/ export AMS_MFEM_PATH=$(spack location -i mfem) cmake -DCMAKE_CUDA_ARCHITECTURES=70 -DAMS_DIR=${AMS_INSTALL_PATH}/lib64/cmake/AMS -DMFEM_DIR=${AMS_MFEM_PATH} $GITHUB_WORKSPACE/examples/ideal_gas/ - make -j$(nproc) VERBOSE=1 + make + - name: Install BOptions SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | From c582dae8812e0540e8f9c681a362e840056bcebb Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 15:09:35 -0800 Subject: [PATCH 049/136] Fix initializer of test --- tests/AMSlib/ams_interface/ams_ete_2d.cpp | 30 +++++++++---------- .../ams_interface/ams_ete_broadcast.cpp | 27 +++++++++-------- 2 files changed, 30 insertions(+), 27 deletions(-) diff --git a/tests/AMSlib/ams_interface/ams_ete_2d.cpp b/tests/AMSlib/ams_interface/ams_ete_2d.cpp index fde3b1b0..a1435da1 100644 --- a/tests/AMSlib/ams_interface/ams_ete_2d.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_2d.cpp @@ -97,28 +97,28 @@ struct Problem { // Allocate Input memory for (int j = 0; j < num_inputs; j++) { DType *data = new DType[elements]; - input_tensors.push_back( - AMSTensor::view(initialize_inputs(data, elements), - {num_elements, 1}, - {1, 1}, - resource)); + input_tensors.push_back(AMSTensor::view( + initialize_inputs(data, elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } DType *inout_data = new DType[elements * num_inouts]; - inout_tensors.push_back( - AMSTensor::view(initialize_inout(inout_data, elements, num_inouts), - {num_elements, num_inouts}, - {num_inouts, 1}, - resource)); + inout_tensors.push_back(AMSTensor::view( + initialize_inout(inout_data, elements, num_inouts), + SmallVector({num_elements, num_inouts}), + SmallVector({num_inouts, 1}), + resource)); // Allocate Output memory for (int j = 0; j < num_outputs; j++) { auto tmp = new DType[elements]; - output_tensors.push_back( - AMSTensor::view(initialize_inputs(tmp, elements), - {num_elements, 1}, - {1, 1}, - resource)); + output_tensors.push_back(AMSTensor::view( + initialize_inputs(tmp, elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } EOSLambda OrigComputation = [&](const ams::SmallVector diff --git a/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp b/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp index 47d6b451..7afc17bf 100644 --- a/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp @@ -70,25 +70,28 @@ struct Problem { // Allocate Input memory for (int j = 0; j < num_inputs - 1; j++) { DType *data = new DType[elements]; - input_tensors.push_back( - AMSTensor::view(initialize_inputs(data, elements), - {num_elements, 1}, - {1, 1}, - resource)); + input_tensors.push_back(AMSTensor::view( + initialize_inputs(data, elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } value = num_inputs - 1; - input_tensors.push_back( - AMSTensor::view(&value, {num_elements, 1}, {0, 0}, resource)); + input_tensors.push_back(AMSTensor::view( + &value, + SmallVector({num_elements, 1}), + SmallVector({0, 0}), + resource)); // Allocate Output memory for (int j = 0; j < num_outputs; j++) { auto tmp = new DType[elements]; - output_tensors.push_back( - AMSTensor::view(initialize_inputs(tmp, elements), - {num_elements, 1}, - {1, 1}, - resource)); + output_tensors.push_back(AMSTensor::view( + initialize_inputs(tmp, elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } EOSLambda OrigComputation = From 814a87f608834ae0a99f831a2892eaf27a80f44d Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 15:12:16 -0800 Subject: [PATCH 050/136] Adding rpaths for tests --- .github/workflows/ci.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9d7cbb9b..a0791144 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -230,8 +230,7 @@ jobs: cd build_idealgas/ export AMS_MFEM_PATH=$(spack location -i mfem) cmake -DCMAKE_CUDA_ARCHITECTURES=70 -DAMS_DIR=${AMS_INSTALL_PATH}/lib64/cmake/AMS -DMFEM_DIR=${AMS_MFEM_PATH} $GITHUB_WORKSPACE/examples/ideal_gas/ - make - + make VERBOSE=1 - name: Install BOptions SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | @@ -306,7 +305,6 @@ jobs: export SPACK_ROOT=/spack/ source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env - # We overwrite the rmq.json created by CMake echo """{ \"db\": { From a6e115df374cb98998cf6e7f8693fd1f1edcb80c Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 15:12:58 -0800 Subject: [PATCH 051/136] add find_dependency for cmake --- CMakeLists.txt | 20 +++++------ cmake/AMSConfig.cmake.in | 60 +++++++++++++++++++++++-------- examples/ideal_gas/CMakeLists.txt | 6 ++-- src/AMSlib/CMakeLists.txt | 46 +++++++----------------- 4 files changed, 70 insertions(+), 62 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ca9e22e..f03f3454 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,6 @@ option(WITH_AMS_DEBUG "Enable verbose messages" OFF) option(WITH_PERFFLOWASPECT "Use PerfFlowAspect for Profiling" OFF) option(WITH_WORKFLOW "Install python drivers used by the outer workflow" OFF) option(WITH_AMS_LIB "Install C++ library to support scientific applications" ON) -option(BUILD_SHARED_LIBS "Build using shared libraries" ON) # ------------------------------------------------------------------------------ find_package(nlohmann_json REQUIRED) @@ -68,6 +67,7 @@ endif() # ------------------------------------------------------------------------------ if (WITH_CALIPER) find_package(caliper REQUIRED) + message(STATUS "Caliper Directory is ${caliper_DIR}") list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_CALIPER__") endif() @@ -76,16 +76,16 @@ if (WITH_AMS_DEBUG) endif() if (WITH_HDF5) - set(HDF5_ROOT ${AMS_HDF5_DIR}) if (HDF5_USE_STATIC_LIBRARIES) - find_package(HDF5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) - set(AMS_HDF5_TARGET hdf5-static) - message(STATUS "HDF5 uses Static Library : ${AMS_HDF5_TARGET}") -else() - find_package(HDF5 COMPONENTS C shared NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) - set(AMS_HDF5_TARGET hdf5-shared) - message(STATUS "HDF5 uses Shared Library : ${AMS_HDF5_TARGET}") -endif() + find_package(HDF5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) + set(AMS_HDF5_TARGET hdf5-static) + set(AMS_HDF5_LIB_TYPE "static") + else() + find_package(HDF5 COMPONENTS C shared NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) + set(AMS_HDF5_LIB_TYPE "shared") + set(AMS_HDF5_TARGET hdf5-shared) + endif() + message(STATUS "HDF5 Dir is ${HDF5_DIR}") list(APPEND AMS_APP_DEFINES "__ENABLE_HDF5__") endif() # WITH_HDF5 diff --git a/cmake/AMSConfig.cmake.in b/cmake/AMSConfig.cmake.in index 9ed67a38..72debb42 100644 --- a/cmake/AMSConfig.cmake.in +++ b/cmake/AMSConfig.cmake.in @@ -7,25 +7,55 @@ set(AMS_WITH_MPI @WITH_MPI@) set(AMS_WITH_CUDA @WITH_CUDA@) set(AMS_WITH_CALIPER @WITH_CALIPER@) set(AMS_WITH_HDF5 @WITH_HDF5@) -# Check if the AMS target is static -get_target_property(AMS_TYPE AMS::AMS TYPE) - -if(AMS_TYPE STREQUAL "STATIC_LIBRARY") - message(STATUS "AMS is a static library. Finding required dependencies...") -# Add usage hints for downstream projects - if(AMS_WITH_MPI) - find_package(MPI REQUIRED) +include(CMakeFindDependencyMacro) + +if (NOT TARGET Torch) + set(AMS_TORCH_DIR @Torch_DIR@) + if (NOT Torch_DIR) + set(Torch_DIR ${AMS_TORCH_DIR}) + endif() + find_dependency(Torch REQUIRED HINTS ${Torch_DIR}) +endif() + +#Add usage hints for downstream projects +if(AMS_WITH_MPI) + if (NOT TARGET MPI) + find_dependency(MPI REQUIRED) endif() - if(AMS_WITH_CUDA) - find_package(CUDAToolkit REQUIRED) +endif() + + +if(AMS_WITH_CUDA) + if (NOT TARGET CUDA::cudart) + find_dependency(CUDAToolkit REQUIRED) endif() - if (AMS_WITH_HDF5) - if (@HDF5_USE_STATIC_LIBRARIES@) - find_package(HDF5 COMPONENTS C static HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) +endif() + +if (AMS_WITH_HDF5) + set(AMS_HDF5_DIR @AMS_HDF5_DIR@) + set(AMS_HDF5_LIB_TYPE @AMS_HDF5_LIB_TYPE@) + if (NOT TARGET hdf5-shared OR NOT TARGET hdf5-static) + if (NOT HDF5_DIR) + set(HDF5_DIR ${AMS_HDF5_DIR}) + endif() + + if (${AMS_HDF5_LIB_TYPE} STREQUAL "static") + find_dependency(HDF5 COMPONENTS C static HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) else() - find_package(HDF5 COMPONENTS C shared HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) + find_dependency(HDF5 COMPONENTS C shared HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) + endif() + endif() +endif() + +if (AMS_WITH_CALIPER) + if (NOT TARGET caliper) + set(CALIPER_AMS_DIR @caliper_DIR@) + # check if we specify another caliper directory + if (NOT caliper_DIR) + set(caliper_DIR ${CALIPER_AMS_DIR}) endif() + find_dependency(caliper HINTS ${caliper_DIR}) endif() - find_package(Torch REQUIRED HINTS @Torch_DIR@) endif() +check_required_components("@PROJECT_NAME@") diff --git a/examples/ideal_gas/CMakeLists.txt b/examples/ideal_gas/CMakeLists.txt index 85f507b1..dfa32e0c 100644 --- a/examples/ideal_gas/CMakeLists.txt +++ b/examples/ideal_gas/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright 2021-2023 Lawrence Livermore National Security, LLC and other +# Copyright 2021-2023 Lawrence Livermore National Security, LLC and otherMS # AMSLib Project Developers # # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception @@ -41,14 +41,14 @@ if (WITH_MPI) find_package(MPI REQUIRED) endif() +find_package(AMS REQUIRED) function(ADDExec binary_name use_ams) target_link_libraries(${binary_name} PRIVATE ${MFEM_LIBRARIES}) target_include_directories(${binary_name} PRIVATE ${MFEM_INCLUDE_DIRS}) # we always use ams to avoid if def conflicts. # but we only enable it for the use_ams case - find_package(AMS REQUIRED) - target_link_libraries(${binary_name} PUBLIC AMS::AMS) + target_link_libraries(${binary_name} PRIVATE AMS::AMS) if (${use_ams}) target_compile_definitions(${binary_name} PRIVATE USE_AMS) endif() diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index 6525cec0..37b4f29b 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -30,46 +30,24 @@ target_include_directories(AMS PUBLIC ) -if (AMS_TYPE STREQUAL "STATIC_LIBRARY") - if (WITH_CUDA) - target_link_libraries(AMS PRIVATE CUDA::cudart) - endif() - - if (WITH_HDF5) - target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) - endif() - - - if (WITH_CALIPER) - target_link_libraries(AMS PRIVATE caliper) - endif() - - if (WITH_MPI) - target_link_libraries(AMS PRIVATE MPI::MPI_CXX) - endif() - - target_link_libraries(AMS PRIVATE stdc++fs torch) -else() - if (WITH_CUDA) - target_link_libraries(AMS PRIVATE CUDA::cudart) - endif() - - if (WITH_HDF5) - target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) - endif() +if (WITH_CUDA) + target_link_libraries(AMS PRIVATE CUDA::cudart) +endif() +if (WITH_HDF5) + target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) +endif() - if (WITH_CALIPER) - target_link_libraries(AMS PRIVATE caliper) - endif() - if (WITH_MPI) - target_link_libraries(AMS PRIVATE MPI::MPI_CXX) - endif() +if (WITH_CALIPER) + target_link_libraries(AMS PRIVATE caliper) +endif() - target_link_libraries(AMS PRIVATE stdc++fs torch) +if (WITH_MPI) + target_link_libraries(AMS PRIVATE MPI::MPI_CXX) endif() +target_link_libraries(AMS PRIVATE stdc++fs torch) configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMS-config.h.in" "${PROJECT_BINARY_DIR}/include/AMS-config.h") From 3f956e2e575450b6ef6f94ad9e733371f2fd8321 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 15:38:30 -0800 Subject: [PATCH 052/136] Nit --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a0791144..39e09f2a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -169,7 +169,7 @@ jobs: mkdir build_idealgas/ cd build_idealgas/ export AMS_MFEM_PATH=$(spack location -i mfem) - echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" + echo "AMS_INSTALL_PATH=$(AMS_INSTALL_PATH}" cmake -DWITH_CUDA=Off -DAMS_DIR=${AMS_INSTALL_PATH}/lib64/cmake/AMS -DMFEM_DIR=${AMS_MFEM_PATH} $GITHUB_WORKSPACE/examples/ideal_gas/ make -j$(nproc) VERBOSE=1 @@ -203,7 +203,7 @@ jobs: cmake \ -DBUILD_SHARED_LIBS=${{ matrix.with_shared }} \ -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=${{ matrix.with_shared }} \ - -DCMAKE_INSTALL_PREFIX=$AMS_INSTALL_PATH \ + -DCMAKE_PREFIX_PATH=$AMS_INSTALL_PATH \ -DWITH_CALIPER=On \ -DWITH_HDF5=On \ -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ @@ -217,9 +217,9 @@ jobs: $GITHUB_WORKSPACE make make install - echo "AMS_INSTALL_PATH=$(pwd)/install" >> $GITHUB_ENV - echo "AMS_INSTALL_PATH=$(pwd)/install" - ls $(pwd)/install + echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" >> $GITHUB_ENV + echo "AMS_INSTALL_PATH=$(AMS_INSTALL_PATH}" + ls ${AMS_INSTALL_PATH} - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | From 69f9eeef063a700ebb033eca73f4da2a435c0e52 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 15:44:33 -0800 Subject: [PATCH 053/136] Nit --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 39e09f2a..8e6a8c96 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -133,7 +133,7 @@ jobs: mkdir build cd build export AMS_INSTALL_PATH=$(pwd)/install - echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" + echo "AMS_INSTALL_PATH=$(AMS_INSTALL_PATH}" export AMS_MFEM_PATH=$(spack location -i mfem) export AMS_TORCH_PATH=$(spack location -i py-torch)/lib/python3.10/site-packages/torch/share/cmake/Torch export AMS_FAISS_PATH=$(spack location -i faiss) @@ -218,7 +218,6 @@ jobs: make make install echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" >> $GITHUB_ENV - echo "AMS_INSTALL_PATH=$(AMS_INSTALL_PATH}" ls ${AMS_INSTALL_PATH} - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} From afed2fa9145f752cd8d77b5c562d042d3c6b08c4 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 15:48:19 -0800 Subject: [PATCH 054/136] Nit --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8e6a8c96..e0b3b16a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -133,7 +133,7 @@ jobs: mkdir build cd build export AMS_INSTALL_PATH=$(pwd)/install - echo "AMS_INSTALL_PATH=$(AMS_INSTALL_PATH}" + echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" export AMS_MFEM_PATH=$(spack location -i mfem) export AMS_TORCH_PATH=$(spack location -i py-torch)/lib/python3.10/site-packages/torch/share/cmake/Torch export AMS_FAISS_PATH=$(spack location -i faiss) @@ -169,7 +169,7 @@ jobs: mkdir build_idealgas/ cd build_idealgas/ export AMS_MFEM_PATH=$(spack location -i mfem) - echo "AMS_INSTALL_PATH=$(AMS_INSTALL_PATH}" + echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" cmake -DWITH_CUDA=Off -DAMS_DIR=${AMS_INSTALL_PATH}/lib64/cmake/AMS -DMFEM_DIR=${AMS_MFEM_PATH} $GITHUB_WORKSPACE/examples/ideal_gas/ make -j$(nproc) VERBOSE=1 From 2f57ae2fb7aa4f319a943b0ba0567fc7294bda15 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 3 Jan 2025 16:04:47 -0800 Subject: [PATCH 055/136] Nit --- .github/workflows/ci.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e0b3b16a..3ed82afa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -203,7 +203,7 @@ jobs: cmake \ -DBUILD_SHARED_LIBS=${{ matrix.with_shared }} \ -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=${{ matrix.with_shared }} \ - -DCMAKE_PREFIX_PATH=$AMS_INSTALL_PATH \ + -DCMAKE_INSTALL_PREFIX=$AMS_INSTALL_PATH \ -DWITH_CALIPER=On \ -DWITH_HDF5=On \ -DAMS_HDF5_DIR=$AMS_HDF5_PATH \ @@ -215,8 +215,8 @@ jobs: -DWITH_AMS_DEBUG=On \ -DWITH_WORKFLOW=Off \ $GITHUB_WORKSPACE - make - make install + make -j$(nproc) + make -j$(nproc) install echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" >> $GITHUB_ENV ls ${AMS_INSTALL_PATH} - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} @@ -229,7 +229,7 @@ jobs: cd build_idealgas/ export AMS_MFEM_PATH=$(spack location -i mfem) cmake -DCMAKE_CUDA_ARCHITECTURES=70 -DAMS_DIR=${AMS_INSTALL_PATH}/lib64/cmake/AMS -DMFEM_DIR=${AMS_MFEM_PATH} $GITHUB_WORKSPACE/examples/ideal_gas/ - make VERBOSE=1 + make -j$(nproc) VERBOSE=1 - name: Install BOptions SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} run: | @@ -260,7 +260,6 @@ jobs: RABBITMQ_PASS: ams RABBITMQ_HOST: rabbitmq RABBITMQ_PORT: 5672 - steps: - uses: actions/checkout@v4 - name: Build Torch=On FAISS=On RMQ=On AMS From 31212cf06058dbeaa7fc4b0fc339e8b1a7313590 Mon Sep 17 00:00:00 2001 From: koparasy Date: Sun, 5 Jan 2025 11:05:35 -0800 Subject: [PATCH 056/136] Move store-cat into db --- src/AMSlib/wf/basedb.hpp | 7 ++++-- src/AMSlib/wf/hdf5db.cpp | 26 ++++++++++++++++++++-- src/AMSlib/wf/workflow.hpp | 44 +------------------------------------- 3 files changed, 30 insertions(+), 47 deletions(-) diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index 8e0d9fc0..7009f018 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -10,6 +10,7 @@ #include #include +#include #include #include @@ -121,7 +122,8 @@ class BaseDB * 'num_elements' values to be stored */ - virtual void store(const at::Tensor& inputs, const at::Tensor& outputs) = 0; + virtual void store(ArrayRef Inputs, + ArrayRef Outputs) = 0; uint64_t getId() const { return id; } @@ -305,7 +307,8 @@ class hdf5DB final : public FileDB * @param[in] inputs Tensor containing the inputs to bestored * @param[in] outputs Tensor containing the outputs to bestored */ - void store(const at::Tensor& inputs, const at::Tensor& outputs) override; + virtual void store(ArrayRef Inputs, + ArrayRef Outputs) override; }; #endif diff --git a/src/AMSlib/wf/hdf5db.cpp b/src/AMSlib/wf/hdf5db.cpp index 3b431831..7934ab69 100644 --- a/src/AMSlib/wf/hdf5db.cpp +++ b/src/AMSlib/wf/hdf5db.cpp @@ -16,11 +16,11 @@ #include #include "ArrayRef.hpp" -#include "utils.hpp" #include "wf/basedb.hpp" using namespace ams::db; +using namespace ams; static std::string SmallVectorToString(ams::MutableArrayRef shape) { @@ -310,8 +310,30 @@ hdf5DB::~hdf5DB() // HDF5_ERROR(err); } -void hdf5DB::store(const at::Tensor& inputs, const at::Tensor& outputs) +void hdf5DB::store(ArrayRef Inputs, + ArrayRef Outputs) { + + auto tOptions = torch::TensorOptions() + .dtype(torch::kFloat32) + .device(c10::DeviceType::CPU); + + c10::SmallVector ConvertedInputs(Inputs.begin(), Inputs.end()); + c10::SmallVector ConvertedOutputs(Outputs.begin(), + Outputs.end()); + for (auto& T : ConvertedInputs) { + std::cout << "CI Shape is " << T.sizes() << "\n"; + } + + for (auto& T : ConvertedOutputs) { + std::cout << "CO Shape is " << T.sizes() << "\n"; + } + auto inputs = + torch::cat(ConvertedInputs, Inputs[0].sizes().size() - 1).to(tOptions); + auto outputs = + torch::cat(ConvertedOutputs, Outputs[0].sizes().size() - 1).to(tOptions); + + if (inputs.dtype() != outputs.dtype()) { throw std::invalid_argument( "Storing into HDF5 database requires all tensors to have the same " diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index df1273c5..398e9a30 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -90,52 +90,10 @@ class AMSWorkflow DBG(Workflow, "Storing data (#elements = %ld) to database", StoreInputTensors[0].sizes()[0]); - store(StoreInputTensors, StoreOutputTensors); + DB->store(StoreInputTensors, StoreOutputTensors); CALIPER(CALI_MARK_END("DBSTORE");) } - /** \brief Store the data in the database and copies - * data from the GPU to the CPU and then to the database. - * To store GPU resident data we use a 1MB of "pinned" - * memory as a buffer - * @param[in] num_elements Number of elements of each 1-D vector - * @param[in] inputs vector to 1-D vectors storing num_elements - * items to be stored in the database - * @param[in] outputs vector to 1-D vectors storing num_elements - * items to be stored in the database - */ - void store(ArrayRef Inputs, ArrayRef Outputs) - { - if (!DB) return; - - - auto tOptions = torch::TensorOptions() - .dtype(torch::kFloat32) - .device(c10::DeviceType::CPU); - - c10::SmallVector ConvertedInputs(Inputs.begin(), - Inputs.end()); - c10::SmallVector ConvertedOutputs(Outputs.begin(), - Outputs.end()); - for (auto &T : ConvertedInputs) { - std::cout << "CI Shape is " << T.sizes() << "\n"; - } - - for (auto &T : ConvertedOutputs) { - std::cout << "CO Shape is " << T.sizes() << "\n"; - } - auto Input = - torch::cat(ConvertedInputs, Inputs[0].sizes().size() - 1).to(tOptions); - std::cout << "Cat Input : " << Input.sizes() << "\n"; - auto Output = torch::cat(ConvertedOutputs, Outputs[0].sizes().size() - 1) - .to(tOptions); - std::cout << "Cat Output: " << Output.sizes() << "\n"; - // Store to database - DB->store(Input, Output); - - return; - } - /** \brief Check if we can perform a surrogate model update. * AMS can update surrogate model only when all MPI ranks have received * the latest model from RabbitMQ. From 5d71ecd9efc65444bce97aa54f55f00fa0cd9c6e Mon Sep 17 00:00:00 2001 From: koparasy Date: Sun, 5 Jan 2025 20:14:31 -0800 Subject: [PATCH 057/136] Fixing cmake with RMQ on --- CMakeLists.txt | 11 +-- cmake/AMSConfig.cmake.in | 13 +++ src/AMSlib/CMakeLists.txt | 15 ++- src/AMSlib/wf/basedb.hpp | 203 +++++++++++++++++--------------------- src/AMSlib/wf/rmqdb.cpp | 60 ++--------- 5 files changed, 124 insertions(+), 178 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f03f3454..c09b062a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -102,21 +102,16 @@ if (WITH_RMQ) find_package(OpenSSL REQUIRED) set(AMS_OPENSSL_FOUND_ROOT "") if (OPENSSL_FOUND) - list(APPEND AMS_APP_INCLUDES ${OPENSSL_INCLUDE_DIR}) - list(APPEND AMS_APP_LIBRARIES "${OPENSSL_LIBRARIES}") - list(APPEND AMS_APP_LIBRARIES ssl) + message(STATUS "OpenSSL libraries found: ${OPENSSL_LIBRARIES}") + message(STATUS "OpenSSL includes found: " ${OPENSSL_INCLUDE_DIR}) get_filename_component(AMS_OPENSSL_FOUND_ROOT "${OPENSSL_SSL_LIBRARY}" DIRECTORY) get_filename_component(AMS_OPENSSL_FOUND_ROOT "${AMS_OPENSSL_FOUND_ROOT}" DIRECTORY) - message(STATUS "OpenSSL includes found: " ${OPENSSL_INCLUDE_DIR}) - message(STATUS "OpenSSL libraries found: " ${OPENSSL_LIBRARIES}) + message(STATUS "OPENSSL Root dir is ${AMS_OPENSSL_FOUND_ROOT}") else() message(STATUS "OpenSSL Not Found") endif() find_package(libevent REQUIRED) # event loop library - list(APPEND AMS_APP_INCLUDES ${LIBEVENT_INCLUDE_DIR}) - list(APPEND AMS_APP_LIBRARIES "${LIBEVENT_LIBRARIES}") - list(APPEND AMS_APP_LIBRARIES amqpcpp event_pthreads event) endif() # WITH_RMQ # ------------------------------------------------------------------------------ diff --git a/cmake/AMSConfig.cmake.in b/cmake/AMSConfig.cmake.in index 72debb42..ff591a9d 100644 --- a/cmake/AMSConfig.cmake.in +++ b/cmake/AMSConfig.cmake.in @@ -7,6 +7,7 @@ set(AMS_WITH_MPI @WITH_MPI@) set(AMS_WITH_CUDA @WITH_CUDA@) set(AMS_WITH_CALIPER @WITH_CALIPER@) set(AMS_WITH_HDF5 @WITH_HDF5@) +set(AMS_WITH_RMQ @WITH_RMQ@) include(CMakeFindDependencyMacro) if (NOT TARGET Torch) @@ -24,6 +25,18 @@ if(AMS_WITH_MPI) endif() endif() +if (AMS_WITH_RMQ) + set(AMS_RMQ_DIR @amqpcpp_DIR@) + if (NOT amqpcpp_DIR) + set(amqpcpp_DIR ${AMS_RMQ_DIR}) + endif() + set(AMS_OPENSSL_FOUND_ROOT @AMS_OPENSSL_FOUND_ROOT@) + if (NOT OPENSSL_ROOT_DIR) + set(OPENSSL_ROOT_DIR ${AMS_OPENSSL_FOUND_ROOT}) + endif() + find_dependency(amqpcpp REQUIRED HINTS ${amqpcpp_DIR}) + find_package(OpenSSL REQUIRED HINTS ${OPENSSL_ROOT_DIR}) +endif() if(AMS_WITH_CUDA) if (NOT TARGET CUDA::cudart) diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index 37b4f29b..fb903c3f 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -9,10 +9,10 @@ set(AMS_LIB_SRC wf/debug.cpp wf/logger.cpp wf/utils.cpp wf/SmallVector.cpp ml/su if (WITH_HDF5) list(APPEND AMS_LIB_SRC wf/hdf5db.cpp) endif() -# -#if (WITH_RMQ) -# list(APPEND AMS_LIB_SRC wf/rmqdb.cpp) -#endif() + +if (WITH_RMQ) + list(APPEND AMS_LIB_SRC wf/rmqdb.cpp) +endif() add_library(AMS ${AMS_LIB_SRC}) @@ -47,6 +47,13 @@ if (WITH_MPI) target_link_libraries(AMS PRIVATE MPI::MPI_CXX) endif() +if (WITH_RMQ) + target_link_libraries(AMS PRIVATE amqpcpp) + if (OPENSSL_FOUND) + target_link_libraries(AMS PRIVATE OpenSSL::SSL OpenSSL::Crypto) + endif() +endif() + target_link_libraries(AMS PRIVATE stdc++fs torch) diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index 7009f018..d2428db0 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -323,17 +323,15 @@ enum class ConnectionStatus { FAILED, CONNECTED, CLOSED, ERROR }; * @brief AMS represents the header as follows: * The header is 16 bytes long: * - 1 byte is the size of the header (here 16). Limit max: 255 - * - 1 byte is the precision (4 for float, 8 for double). Limit max: 255 * - 2 bytes are the MPI rank (0 if AMS is not running with MPI). Limit max: 65535 * - 2 bytes to store the size of the MSG domain name. Limit max: 65535 - * - 4 bytes are the number of elements in the message. Limit max: 2^32 - 1 - * - 2 bytes are the input dimension. Limit max: 65535 - * - 2 bytes are the output dimension. Limit max: 65535 + * - 2 bytes are the number of input tensors . Limit max: 65535 + * - 2 bytes are the number of output tensors . Limit max: 65535 * - 2 bytes for padding. Limit max: 2^16 - 1 * - * |_Header_|_Datatype_|___Rank___|__DomainSize__|__#elems__|___InDim____|___OutDim___|_Pad_|.real data.| + * |_Header_|___Rank___|__DomainSize__|___InDim____|___OutDim___|_Pad_|.real data.| * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ - * | Byte 1 | Byte 2 | Byte 3-4 | Byte 5-6 |Byte 6-10 | Byte 10-12 | Byte 12-14 |-----| Byte 16-k | + * | Byte 1 | Byte 2-3 | Byte 4-5 | Byte 6-7 |Byte 8-9 | Byte 10-12 | Byte 12-14 |-----| Byte 16-k | * * where X = datatype * num_element * (InDim + OutDim). Total message size is 16+k. * @@ -346,17 +344,13 @@ enum class ConnectionStatus { FAILED, CONNECTED, CLOSED, ERROR }; struct AMSMsgHeader { /** @brief Header size (bytes) */ uint8_t hsize; - /** @brief Data type size (bytes) */ - uint8_t dtype; /** @brief MPI rank */ uint16_t mpi_rank; /** @brief Domain Name Size */ uint16_t domain_size; - /** @brief Number of elements */ - uint32_t num_elem; - /** @brief Inputs dimension */ + /** @brief Number of input tensors*/ uint16_t in_dim; - /** @brief Outputs dimension */ + /** @brief Number of ouput tensors */ uint16_t out_dim; /** @@ -368,10 +362,8 @@ struct AMSMsgHeader { */ AMSMsgHeader(size_t mpi_rank, size_t domain_size, - size_t num_elem, size_t in_dim, - size_t out_dim, - size_t type_size); + size_t out_dim); /** * @brief Constructor for AMSMsgHeader @@ -382,10 +374,8 @@ struct AMSMsgHeader { */ AMSMsgHeader(uint16_t mpi_rank, uint16_t domain_size, - uint32_t num_elem, uint16_t in_dim, - uint16_t out_dim, - uint8_t type_size); + uint16_t out_dim); /** * @brief Return the size of a header in the AMS protocol. @@ -393,9 +383,8 @@ struct AMSMsgHeader { */ static size_t constexpr size() { - return ((sizeof(hsize) + sizeof(dtype) + sizeof(mpi_rank) + - sizeof(domain_size) + sizeof(num_elem) + sizeof(in_dim) + - sizeof(out_dim) + sizeof(double) - 1) / + return ((sizeof(hsize) + sizeof(mpi_rank) + sizeof(domain_size) + + sizeof(in_dim) + sizeof(out_dim) + sizeof(double) - 1) / sizeof(double)) * sizeof(double); } @@ -421,6 +410,40 @@ struct AMSMsgHeader { */ class AMSMessage { +private: + static size_t computeSerializedSize(const torch::Tensor& tensor) + { + // First we need to store how many dimensions this tensor has. + size_t totalBytes = sizeof(size_t); + // Next we need to get the required bytes to store both shape and strides. + totalBytes += tensor.sizes().size() * sizeof(size_t) * 2; + // Next we need to store the number of bytes of this tensor. + totalBytes += sizeof(size_t); + // And finally the size of the data themselves. + return totalBytes + tensor.nbytes(); + } + + static void serializeTensor(const torch::Tensor& tensor, uint8_t*& blob) + { + *reinterpret_cast(blob) = tensor.sizes().size(); + blob += sizeof(size_t); + for (auto& V : tensor.sizes()) { + *reinterpret_cast(blob) = static_cast(V); + blob += sizeof(size_t); + } + // Copy in + for (auto& V : tensor.strides()) { + *reinterpret_cast(blob) = static_cast(V); + blob += sizeof(size_t); + } + + *reinterpret_cast(blob) = static_cast(tensor.nbytes()); + blob += sizeof(size_t); + + std::memcpy(blob, tensor.data_ptr(), tensor.nbytes()); + blob += tensor.nbytes(); + } + public: /** @brief message ID */ int _id; @@ -430,8 +453,6 @@ class AMSMessage uint8_t* _data; /** @brief The total size of the binary blob in bytes */ size_t _total_size; - /** @brief The number of input/output pairs */ - size_t _num_elements; /** @brief The dimensions of inputs */ size_t _input_dim; /** @brief The dimensions of outputs */ @@ -443,7 +464,6 @@ class AMSMessage AMSMessage() : _id(0), _rank(0), - _num_elements(0), _input_dim(0), _output_dim(0), _data(nullptr), @@ -459,31 +479,38 @@ class AMSMessage * @param[in] inputs Inputs * @param[in] outputs Outputs */ - template AMSMessage(int id, uint64_t rId, std::string& domain_name, - size_t num_elements, - const std::vector& inputs, - const std::vector& outputs) + ArrayRef Inputs, + ArrayRef Outputs) : _id(id), _rank(rId), - _num_elements(num_elements), - _input_dim(inputs.size()), - _output_dim(outputs.size()), + _input_dim(Inputs.size()), + _output_dim(Outputs.size()), _data(nullptr), _total_size(0) { - CALIPER(CALI_MARK_BEGIN("AMS_MESSAGE");) - AMSMsgHeader header(_rank, - domain_name.size(), - _num_elements, - _input_dim, - _output_dim, - sizeof(TypeValue)); - - _total_size = AMSMsgHeader::size() + domain_name.size() + - getTotalElements() * sizeof(TypeValue); + SmallVector _inputs; + SmallVector _outputs; + auto tOptions = torch::TensorOptions() + .dtype(torch::kFloat32) + .device(c10::DeviceType::CPU); + + for (auto& tensor : Inputs) + _inputs.push_back(tensor.contiguous().to(tOptions)); + + for (auto& tensor : Outputs) + _outputs.push_back(tensor.contiguous().to(tOptions)); + + AMSMsgHeader header(_rank, domain_name.size(), _input_dim, _output_dim); + + _total_size = AMSMsgHeader::size() + domain_name.size(); + for (auto& tensor : _inputs) + _total_size += computeSerializedSize(tensor); + for (auto& tensor : _outputs) + _total_size += computeSerializedSize(tensor); + auto& rm = ams::ResourceManager::getInstance(); _data = rm.allocate(_total_size, AMSResourceType::AMS_HOST); @@ -492,9 +519,19 @@ class AMSMessage domain_name.c_str(), domain_name.size()); current_offset += domain_name.size(); - current_offset += encode_data(_data + current_offset, inputs, outputs); - DBG(AMSMessage, "Allocated message %d: %p", _id, _data); - CALIPER(CALI_MARK_END("AMS_MESSAGE");) + + uint8_t* blob = _data + current_offset; + + + for (auto& tensor : _inputs) + serializeTensor(tensor, blob); + for (auto& tensor : _outputs) + serializeTensor(tensor, blob); + DBG(AMSMessage, + "Allocated message %d: %p with size: %ld", + _id, + _data, + reinterpret_cast(blob) - reinterpret_cast(_data)); } /** @@ -556,49 +593,6 @@ class AMSMessage return *this; } - /** - * @brief Fill a buffer with a data section starting at a given position. - * @param[in] data_blob The buffer to fill - * @param[in] offset Position where to start writing in the buffer - * @param[in] inputs Inputs - * @param[in] outputs Outputs - * @return The number of bytes in the message or 0 if error - */ - template - size_t encode_data(uint8_t* data_blob, - const std::vector& inputs, - const std::vector& outputs) - { - if (!data_blob) return 0; - size_t offset = 0; - - // Creating the body part of the message - for (size_t i = 0; i < _input_dim; i++) { - std::memcpy(data_blob + offset, - inputs[i], - _num_elements * sizeof(TypeValue)); - offset += (_num_elements * sizeof(TypeValue)); - } - - for (size_t i = 0; i < _output_dim; i++) { - std::memcpy(data_blob + offset, - outputs[i], - _num_elements * sizeof(TypeValue)); - offset += (_num_elements * sizeof(TypeValue)); - } - - return ((_input_dim + _output_dim) * _num_elements) * sizeof(TypeValue); - } - - /** - * @brief Return the total number of elements in this message - * @return Size in bytes of the data portion - */ - size_t getTotalElements() const - { - return (_num_elements * (_input_dim + _output_dim)); - } - /** * @brief Return the underlying data pointer * @return Data pointer (binary blob) @@ -1512,22 +1506,18 @@ class RMQInterface * @param[in] inputs A vector containing arrays of inputs, each array has num_elements elements * @param[in] outputs A vector containing arrays of outputs, each array has num_elements elements */ - template void publish(std::string& domain_name, - size_t num_elements, - std::vector& inputs, - std::vector& outputs) + ArrayRef Inputs, + ArrayRef Outputs) { DBG(RMQInterface, "[tag=%d] stores %ld elements of input/output " "dimensions (%ld, %ld)", _msg_tag, - num_elements, - inputs.size(), - outputs.size()) + Inputs.size(), + Outputs.size()) - CALIPER(CALI_MARK_BEGIN("STORE_RMQ");) - AMSMessage msg(_msg_tag, _rId, domain_name, num_elements, inputs, outputs); + AMSMessage msg(_msg_tag, _rId, domain_name, Inputs, Outputs); // TODO: we could simplify the logic here // AMSMessage could directly produce a shared ptr @@ -1621,27 +1611,12 @@ class RabbitMQDB final : public BaseDB * @param[in] predicate (NOT SUPPORTED YET) Series of predicate */ PERFFASPECT() - void store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate = nullptr) override + virtual void store(ArrayRef Inputs, + ArrayRef Outputs) { - CFATAL(RMQDB, - predicate != nullptr, - "RMQ database does not support storing uq-predicates") - interface.publish(appDomain, num_elements, inputs, outputs); + interface.publish(appDomain, Inputs, Outputs); } - void store(size_t num_elements, - std::vector& inputs, - std::vector& outputs, - bool* predicate = nullptr) override - { - CFATAL(RMQDB, - predicate != nullptr, - "RMQ database does not support storing uq-predicates") - interface.publish(appDomain, num_elements, inputs, outputs); - } /** * @brief Return the type of this broker diff --git a/src/AMSlib/wf/rmqdb.cpp b/src/AMSlib/wf/rmqdb.cpp index 4f3cdf62..65d9ed97 100644 --- a/src/AMSlib/wf/rmqdb.cpp +++ b/src/AMSlib/wf/rmqdb.cpp @@ -5,6 +5,8 @@ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception */ +#include + #include "wf/basedb.hpp" using namespace ams::db; @@ -15,15 +17,11 @@ using namespace ams::db; AMSMsgHeader::AMSMsgHeader(size_t mpi_rank, size_t domain_size, - size_t num_elem, size_t in_dim, - size_t out_dim, - size_t type_size) + size_t out_dim) : hsize(static_cast(AMSMsgHeader::size())), - dtype(static_cast(type_size)), mpi_rank(static_cast(mpi_rank)), domain_size(static_cast(domain_size)), - num_elem(static_cast(num_elem)), in_dim(static_cast(in_dim)), out_dim(static_cast(out_dim)) { @@ -31,15 +29,11 @@ AMSMsgHeader::AMSMsgHeader(size_t mpi_rank, AMSMsgHeader::AMSMsgHeader(uint16_t mpi_rank, uint16_t domain_size, - uint32_t num_elem, uint16_t in_dim, - uint16_t out_dim, - uint8_t type_size) + uint16_t out_dim) : hsize(static_cast(AMSMsgHeader::size())), - dtype(type_size), mpi_rank(mpi_rank), domain_size(domain_size), - num_elem(num_elem), in_dim(in_dim), out_dim(out_dim) { @@ -53,28 +47,23 @@ size_t AMSMsgHeader::encode(uint8_t* data_blob) // Header size (should be 1 bytes) data_blob[current_offset] = hsize; current_offset += sizeof(hsize); - // Data type (should be 1 bytes) - data_blob[current_offset] = dtype; - current_offset += sizeof(dtype); // MPI rank (should be 2 bytes) std::memcpy(data_blob + current_offset, &(mpi_rank), sizeof(mpi_rank)); current_offset += sizeof(mpi_rank); // Domain Size (should be 2 bytes) DBG(AMSMsgHeader, - "Generating domain name of size %d --- %d offset %d", + "Generating domain name of size %d --- %lu offset %lu", domain_size, sizeof(domain_size), current_offset); std::memcpy(data_blob + current_offset, &(domain_size), sizeof(domain_size)); current_offset += sizeof(domain_size); - // Num elem (should be 4 bytes) - std::memcpy(data_blob + current_offset, &(num_elem), sizeof(num_elem)); - current_offset += sizeof(num_elem); // Input dim (should be 2 bytes) std::memcpy(data_blob + current_offset, &(in_dim), sizeof(in_dim)); + *reinterpret_cast(data_blob) = static_cast(in_dim); current_offset += sizeof(in_dim); // Output dim (should be 2 bytes) - std::memcpy(data_blob + current_offset, &(out_dim), sizeof(out_dim)); + *reinterpret_cast(data_blob) = static_cast(out_dim); current_offset += sizeof(out_dim); return AMSMsgHeader::size(); @@ -117,12 +106,7 @@ AMSMsgHeader AMSMsgHeader::decode(uint8_t* data_blob) uint16_t new_out_dim; std::memcpy(&new_out_dim, data_blob + current_offset, sizeof(uint16_t)); - return AMSMsgHeader(new_mpirank, - new_domain_size, - new_num_elem, - new_in_dim, - new_out_dim, - new_dtype); + return AMSMsgHeader(new_mpirank, new_domain_size, new_in_dim, new_out_dim); } /** @@ -133,40 +117,12 @@ void AMSMessage::swap(const AMSMessage& other) { _id = other._id; _rank = other._rank; - _num_elements = other._num_elements; _input_dim = other._input_dim; _output_dim = other._output_dim; _total_size = other._total_size; _data = other._data; } -AMSMessage::AMSMessage(int id, uint64_t rId, uint8_t* data) - : _id(id), - _num_elements(0), - _input_dim(0), - _output_dim(0), - _data(data), - _total_size(0) -{ - auto header = AMSMsgHeader::decode(data); - - int current_rank = rId; - _rank = header.mpi_rank; - CWARNING(AMSMessage, - _rank != current_rank, - "MPI rank are not matching (using %d)", - _rank) - - _num_elements = header.num_elem; - _input_dim = header.in_dim; - _output_dim = header.out_dim; - _data = data; - auto type_value = header.dtype; - - _total_size = AMSMsgHeader::size() + getTotalElements() * type_value; - - DBG(AMSMessage, "Allocated message %d: %p", _id, _data); -} /** * AMSMessageInbound From 716364ea867c4fc299f5536883cb33908f52af0e Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 6 Jan 2025 16:57:07 -0800 Subject: [PATCH 058/136] Fix libevent linkage, by side-stepping the issue --- CMakeLists.txt | 11 +++++++++-- cmake/AMSConfig.cmake.in | 30 +++++++++++++++++------------- cmake/Findlibevent.cmake | 34 ++++++++++++++++++++++++++++------ src/AMSlib/CMakeLists.txt | 5 +++++ 4 files changed, 59 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c09b062a..5fe5b823 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,11 +51,18 @@ list(APPEND AMS_APP_LIBRARIES nlohmann_json::nlohmann_json) find_package(Threads REQUIRED) # ------------------------------------------------------------------------------ +set(MPI_DIRECTORIES "") if (WITH_MPI) find_package(MPI REQUIRED) message(STATUS "MPICC: ${MPI_C_COMPILER}") message(STATUS "MPICXX: ${MPI_CXX_COMPILER}") message(STATUS "MPI Library used: " MPI::MPI_CXX) + foreach(LIBRARY ${MPI_CXX_LIBRARIES}) + get_filename_component(LIB_DIR ${LIBRARY} DIRECTORY) + list(APPEND MPI_DIRECTORIES ${LIB_DIR}) + endforeach() + list(REMOVE_DUPLICATES MPI_DIRECTORIES) + message(STATUS "MPI Liraries: ${MPI_DIRECTORIES}") endif() # ------------------------------------------------------------------------------ @@ -110,7 +117,8 @@ if (WITH_RMQ) else() message(STATUS "OpenSSL Not Found") endif() - + set(AMS_LIBEVENT_HINTS ${MPI_DIRECTORIES}) + find_package(libevent REQUIRED) # event loop library endif() # WITH_RMQ @@ -148,4 +156,3 @@ if (WITH_TESTS) include(CTest) add_subdirectory(tests) endif() - diff --git a/cmake/AMSConfig.cmake.in b/cmake/AMSConfig.cmake.in index ff591a9d..a967f501 100644 --- a/cmake/AMSConfig.cmake.in +++ b/cmake/AMSConfig.cmake.in @@ -25,19 +25,6 @@ if(AMS_WITH_MPI) endif() endif() -if (AMS_WITH_RMQ) - set(AMS_RMQ_DIR @amqpcpp_DIR@) - if (NOT amqpcpp_DIR) - set(amqpcpp_DIR ${AMS_RMQ_DIR}) - endif() - set(AMS_OPENSSL_FOUND_ROOT @AMS_OPENSSL_FOUND_ROOT@) - if (NOT OPENSSL_ROOT_DIR) - set(OPENSSL_ROOT_DIR ${AMS_OPENSSL_FOUND_ROOT}) - endif() - find_dependency(amqpcpp REQUIRED HINTS ${amqpcpp_DIR}) - find_package(OpenSSL REQUIRED HINTS ${OPENSSL_ROOT_DIR}) -endif() - if(AMS_WITH_CUDA) if (NOT TARGET CUDA::cudart) find_dependency(CUDAToolkit REQUIRED) @@ -71,4 +58,21 @@ if (AMS_WITH_CALIPER) endif() endif() +if (AMS_WITH_RMQ) + set(AMS_RMQ_DIR @amqpcpp_DIR@) + if (NOT amqpcpp_DIR) + set(amqpcpp_DIR ${AMS_RMQ_DIR}) + endif() + set(AMS_OPENSSL_FOUND_ROOT @AMS_OPENSSL_FOUND_ROOT@) + if (NOT OPENSSL_ROOT_DIR) + set(OPENSSL_ROOT_DIR ${AMS_OPENSSL_FOUND_ROOT}) + endif() + find_dependency(amqpcpp REQUIRED HINTS ${amqpcpp_DIR}) + # find dependency does not correctly discover OpenSSL, not sure why. + find_dependency(OpenSSL) + if (NOT OPENSSL_FOUND) + find_dependency(OpenSSL HINTS ${AMS_OPENSSL_FOUND_ROOT}) + endif() +endif() + check_required_components("@PROJECT_NAME@") diff --git a/cmake/Findlibevent.cmake b/cmake/Findlibevent.cmake index 849434ab..553d8ec1 100644 --- a/cmake/Findlibevent.cmake +++ b/cmake/Findlibevent.cmake @@ -6,16 +6,38 @@ # LIBEVENT_FOUND - System has LibEvent # LIBEVENT_INCLUDE_DIR - the LibEvent include directory # LIBEVENT_LIBRARIES 0 The libraries needed to use LibEvent -find_path (LIBEVENT_INCLUDE_DIR NAMES event.h) -find_library (LIBEVENT_LIBRARY NAMES event) -find_library (LIBEVENT_CORE NAMES event_core) -find_library (LIBEVENT_EXTRA NAMES event_extra) +find_path (LIBEVENT_INCLUDE_DIR NAMES event.h HINTS ${AMS_LIBEVENT_HINTS}) +find_library (LIBEVENT_LIBRARY NAMES event HINTS ${AMS_LIBEVENT_HINTS} NO_CMAKE_SYSTEM_PATH) + +if(NOT LIBEVENT_LIBRARY) + find_library(LIBEVENT_LIBRARY NAMES event) +endif() + +find_library (LIBEVENT_CORE NAMES event_core HINTS ${AMS_LIBEVENT_HINTS} NO_CMAKE_SYSTEM_PATH) +if(NOT LIBEVENT_CORE) + find_library(LIBEVENT_CORE NAMES event_core) +endif() + + +find_library (LIBEVENT_EXTRA NAMES event_extra HINTS ${AMS_LIBEVENT_HINTS} NO_CMAKE_SYSTEM_PATH) +if(NOT LIBEVENT_EXTRA) + find_library(LIBEVENT_EXTRA NAMES event_extra) +endif() + if (NOT EVHTP_DISABLE_EVTHR) - find_library (LIBEVENT_THREAD NAMES event_pthreads) + find_library (LIBEVENT_THREAD NAMES event_pthreads HINTS ${AMS_LIBEVENT_HINTS} NO_CMAKE_SYSTEM_PATH) + if(NOT LIBEVENT_THREAD) + find_library(LIBEVENT_THREAD NAMES event_pthreads) + endif() endif() + if (NOT EVHTP_DISABLE_SSL) - find_library (LIBEVENT_SSL NAMES event_openssl) + find_library (LIBEVENT_SSL NAMES event_openssl HINTS ${AMS_LIBEVENT_HINTS} NO_CMAKE_SYSTEM_PATH) + if(NOT LIBEVENT_SSL) + find_library(LIBEVENT_SSL NAMES event_openssl) + endif() endif() + include (FindPackageHandleStandardArgs) set (LIBEVENT_INCLUDE_DIRS ${LIBEVENT_INCLUDE_DIR}) set (LIBEVENT_LIBRARIES diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index fb903c3f..cf7af169 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -52,6 +52,11 @@ if (WITH_RMQ) if (OPENSSL_FOUND) target_link_libraries(AMS PRIVATE OpenSSL::SSL OpenSSL::Crypto) endif() + # NOTE: We set here the event/event pthreads as public. As there is no easy way + # to do a find package(libevent) and RMQ is not exposing that properly. + message(STATUS "Event libs are ${LIBEVENT_LIBRARY}") + message(STATUS "Event libs are ${LIBEVENT_LIBRARY} and ${LIBEVENT_THREAD}") + target_link_libraries(AMS PUBLIC ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) endif() target_link_libraries(AMS PRIVATE stdc++fs torch) From e59fe79ef4ac29e519822c5682a153101c03f08f Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 13 Jan 2025 16:34:19 -0800 Subject: [PATCH 059/136] Delete rmq reliable --- src/AMSlib/wf/rmq_reliable.hpp | 318 --------------------------------- 1 file changed, 318 deletions(-) delete mode 100644 src/AMSlib/wf/rmq_reliable.hpp diff --git a/src/AMSlib/wf/rmq_reliable.hpp b/src/AMSlib/wf/rmq_reliable.hpp deleted file mode 100644 index 21b89701..00000000 --- a/src/AMSlib/wf/rmq_reliable.hpp +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright 2021-2023 Lawrence Livermore National Security, LLC and other - * AMSLib Project Developers - * - * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception - * - * A channel wrapper based on AMQP::Reliable that allows message callbacks to be installed - * on the publish-confirms, to be called when they a confirmation is received from RabbitMQ. - * - * You can also change the base class and use Reliable if you not only - * want to be notified about the publish-confirms, but want to use it for automatic - * throttling at the same time. - * - * @author Michael van der Werve - * @copyright 2020 - 2023 Copernica BV - */ - -/** - * Header guard - */ -#pragma once - -/** - * Includes - */ -#include -#include -#include - -#include -#include - -/** - * Begin of namespaces - */ -namespace AMQP -{ - -/** - * Class definition - */ -template -class AMSReliable : public BASE -{ -private: - // make sure it is a proper channel - static_assert(std::is_base_of::value, - "base should be derived from a confirmed channel."); - - /** - * Set of open deliverytags. We want a normal set (not unordered_set) because - * removal will be cheaper for whole ranges. - * @var size_t - */ - std::map> _handlers; - - /** - * Called when the deliverytag(s) are acked - * @param deliveryTag - * @param multiple - */ - void onAck(uint64_t deliveryTag, bool multiple) override - { - // monitor the object, watching for destruction since these ack/nack handlers - // could destruct the object - Monitor monitor(this); - - // single element is simple - if (!multiple) { - // find the element - auto iter = _handlers.find(deliveryTag); - - // we did not find it (this should not be possible, unless somebody explicitly called) - // the base-class publish methods for some reason. - if (iter == _handlers.end()) return BASE::onAck(deliveryTag, multiple); - - // get the handler (we store it first so that we can remove it) - auto handler = iter->second; - - // erase it from the map (we remove it before the call, because the callback might update - // the _handlers and invalidate the iterator) - _handlers.erase(iter); - - // call the ack handler - handler->reportAck(); - - } - - // do multiple at once - else { - // keep looping for as long as the object is in a valid state - while (monitor && !_handlers.empty()) { - // get the first handler - auto iter = _handlers.begin(); - - // make sure this is the right deliverytag, if we've passed it we leap out - if (iter->first > deliveryTag) break; - - // get the handler - auto handler = iter->second; - - // remove it from the map (before we make a call to userspace, so that user space - // can add even more handlers, without invalidating iterators) - _handlers.erase(iter); - - // call the ack handler - handler->reportAck(); - } - } - - // make sure the object is still valid - if (!monitor) return; - - // call base handler as well - BASE::onAck(deliveryTag, multiple); - } - - /** - * Called when the deliverytag(s) are nacked - * @param deliveryTag - * @param multiple - */ - void onNack(uint64_t deliveryTag, bool multiple) override - { - // monitor the object, watching for destruction since these ack/nack handlers - // could destruct the object - Monitor monitor(this); - - // single element is simple - if (!multiple) { - // find the element - auto iter = _handlers.find(deliveryTag); - - // we did not find it (this should not be possible, unless somebody explicitly called) - // the base-class publish methods for some reason. - if (iter == _handlers.end()) return BASE::onNack(deliveryTag, multiple); - - // get the handler (we store it first so that we can remove it) - auto handler = iter->second; - - // erase it from the map (we remove it before the call, because the callback might update - // the _handlers and invalidate the iterator) - _handlers.erase(iter); - - // call the ack handler - handler->reportNack(); - } - - // nack multiple elements - else { - // keep looping for as long as the object is in a valid state - while (monitor && !_handlers.empty()) { - // get the first handler - auto iter = _handlers.begin(); - - // make sure this is the right deliverytag, if we've passed it we leap out - if (iter->first > deliveryTag) break; - - // get the handler - auto handler = iter->second; - - // remove it from the map (before we make a call to userspace, so that user space - // can add even more handlers, without invalidating iterators) - _handlers.erase(iter); - - // call the ack handler - handler->reportNack(); - } - } - - // if the object is no longer valid, return - if (!monitor) return; - - // call the base handler - BASE::onNack(deliveryTag, multiple); - } - - /** - * Method that is called to report an error - * @param message - */ - void reportError(const char *message) override - { - // monitor the object, watching for destruction since these ack/nack handlers - // could destruct the object - Monitor monitor(this); - - // move the handlers out - auto handlers = std::move(_handlers); - - // iterate over all the messages - // call the handlers - for (const auto &iter : handlers) { - // call the handler - iter.second->reportError(message); - - // if we were destructed in the meantime, we leap out - if (!monitor) return; - } - - // if the monitor is no longer valid, leap out - if (!monitor) return; - - // call the base handler - BASE::reportError(message); - } - -public: - /** - * Constructor - * @param channel - * @param throttle - */ - template - Reliable(Args &&...args) : BASE(std::forward(args)...) - { - } - - /** - * Deleted copy constructor, deleted move constructor - * @param other - */ - Reliable(const Reliable &other) = delete; - Reliable(Reliable &&other) = delete; - - /** - * Deleted copy assignment, deleted move assignment - * @param other - */ - Reliable &operator=(const Reliable &other) = delete; - Reliable &operator=(Reliable &&other) = delete; - - /** - * Virtual destructor - */ - virtual ~Reliable() = default; - - /** - * Method to check how many messages are still unacked. - * @return size_t - */ - virtual size_t unacknowledged() const override { return _handlers.size(); } - - /** - * Publish a message to an exchange. See amqpcpp/channel.h for more details on the flags. - * Delays actual publishing depending on the publisher confirms sent by RabbitMQ. - * - * @param exchange the exchange to publish to - * @param routingkey the routing key - * @param envelope the full envelope to send - * @param message the message to send - * @param size size of the message - * @param flags optional flags - * @return bool - */ - DeferredPublish &publish(const std::string_view &exchange, - const std::string_view &routingKey, - const std::string_view &message, - int flags = 0) - { - return publish(exchange, - routingKey, - Envelope(message.data(), message.size()), - flags); - } - DeferredPublish &publish(const std::string_view &exchange, - const std::string_view &routingKey, - const char *message, - size_t size, - int flags = 0) - { - return publish(exchange, routingKey, Envelope(message, size), flags); - } - DeferredPublish &publish(const std::string_view &exchange, - const std::string_view &routingKey, - const char *message, - int flags = 0) - { - return publish(exchange, - routingKey, - Envelope(message, strlen(message)), - flags); - } - - /** - * Publish a message to an exchange. See amqpcpp/channel.h for more details on the flags. - * Delays actual publishing depending on the publisher confirms sent by RabbitMQ. - * - * @param exchange the exchange to publish to - * @param routingkey the routing key - * @param envelope the full envelope to send - * @param message the message to send - * @param size size of the message - * @param flags optional flags - */ - DeferredPublish &publish(const std::string_view &exchange, - const std::string_view &routingKey, - const Envelope &envelope, - int flags = 0) - { - // publish the entire thing, and remember if it failed at any point - uint64_t tag = BASE::publish(exchange, routingKey, envelope, flags); - - // create the publish deferred object, if we got no tag we failed - auto handler = std::make_shared(tag == 0); - - // add it to the open handlers - _handlers[tag] = handler; - - // return the dereferenced handler - return *handler; - } -}; - -/** - * End of namespaces - */ -} // namespace AMQP From c7aab0c0e99c9635dd7a3ebc367713bab700af22 Mon Sep 17 00:00:00 2001 From: koparasy Date: Wed, 5 Feb 2025 08:04:33 -0800 Subject: [PATCH 060/136] Simple physics example, that adds broadcast with inout and 2D tensor --- tests/AMSlib/ams_interface/CMakeLists.txt | 2 +- tests/AMSlib/ams_interface/ams_ete.cpp | 1 - tests/AMSlib/ams_interface/ams_physics.cpp | 184 +++++++++++++++++++++ 3 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 tests/AMSlib/ams_interface/ams_physics.cpp diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index b3a0e266..4fe61d59 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -171,7 +171,7 @@ function(BUILD_TEST exe source) target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) endfunction() - +BUILD_TEST(ams_physics ams_physics.cpp) BUILD_TEST(ams_end_to_end ams_ete.cpp) BUILD_TEST(ams_inout_2d ams_ete_2d.cpp) BUILD_TEST(ams_ete_broadcast ams_ete_broadcast.cpp) diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp index b3e6c6b4..4f6c4945 100644 --- a/tests/AMSlib/ams_interface/ams_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -13,7 +13,6 @@ #include "AMS.h" #include "ml/surrogate.hpp" -#include "wf/debug.h" using namespace ams; diff --git a/tests/AMSlib/ams_interface/ams_physics.cpp b/tests/AMSlib/ams_interface/ams_physics.cpp new file mode 100644 index 00000000..b7bce53c --- /dev/null +++ b/tests/AMSlib/ams_interface/ams_physics.cpp @@ -0,0 +1,184 @@ +#include +#include +#include +#include + +#include "AMS.h" + +using real_t = double; +using namespace ams; + +void eval(real_t *density, + real_t *e_mass, + real_t *qc, + real_t deltaTime, + real_t **mat, + int NumComps, + int NumZones) +{ + // Density is a 0->vector. + real_t *Dense = density; + real_t *eMass = e_mass; + real_t *QC = qc; + + for (int j = 0; j < NumZones; j++) { + real_t A = Dense[j]; // Reactant A + for (int i = 0; i < NumComps; i++) { + real_t k = mat[j][i]; // Reaction rate constant + real_t reaction_rate = k * A * deltaTime; + Dense[j] -= reaction_rate; + eMass[j] = reaction_rate * k; + QC[j] += reaction_rate; + } + } +} + +void eval_ams(AMSExecutor &wf, + real_t *density, + real_t *e_mass, + real_t *qc, + real_t deltaTime, + real_t **mat, + int NumComps, + int NumZones) +{ + // Density is a 0->vector. + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + // Density is inout. + inout_tensors.push_back( + AMSTensor::view(density, + SmallVector({NumZones, 1}), + SmallVector({1, 1}), + AMSResourceType::AMS_HOST)); + // QC is inout + inout_tensors.push_back( + AMSTensor::view(qc, + SmallVector({NumZones, 1}), + SmallVector({1, 1}), + AMSResourceType::AMS_HOST)); + + input_tensors.push_back(AMSTensor::view( + &mat[0][0], + SmallVector({NumZones, NumComps}), + SmallVector({NumComps, 1}), + AMSResourceType::AMS_HOST)); + + // deltaTime is a scalar input, I BROADCAST it now with 0 strides. + input_tensors.push_back( + AMSTensor::view(&deltaTime, + SmallVector({NumZones, 1}), + SmallVector({0, 0}), + AMSResourceType::AMS_HOST)); + + // e_mass is just an output + output_tensors.push_back( + AMSTensor::view(e_mass, + SmallVector({NumZones, 1}), + SmallVector({1, 1}), + AMSResourceType::AMS_HOST)); + + + EOSLambda OrigComputation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + int prunedZones = ams_ins[0].shape()[0]; + std::cout << "Pruned are " << prunedZones << "\n"; + real_t *pruned_mat[prunedZones]; + // The 2D data of materials are unnder a c_vector. + real_t *c_mats = ams_ins[0].data(); + // We need this as eval requires a c like 2D vector + for (int i = 0; i < prunedZones; i++) { + pruned_mat[i] = &c_mats[i * ams_ins[0].shape()[1]]; + } + eval(ams_inouts[0].data(),// density was the first entry in inout + ams_outs[0].data(), + ams_inouts[1].data(), // qc was the second entry in inout + *ams_ins[1].data(), + pruned_mat, + NumComps, + prunedZones); + }; + // After I call this, I expect the database to have the following order: + // input_Data: **input_tensors, **inout_tensors + // input_Data: **output_tensors, **inout_tensors + // In this example the database will have the following: + // Input: |Mat_0|Mat_1|dt|density|qc| Output : |e_mass|density|qc| + AMSExecute(wf, OrigComputation, input_tensors, inout_tensors, output_tensors); +} + +void initializeRandom(real_t *data, + size_t NumElements, + real_t minVal = 0.0, + real_t maxVal = 1.0) +{ + std::random_device rd; + std::mt19937 gen(0); + std::uniform_real_distribution dist(minVal, maxVal); + for (size_t i = 0; i < NumElements; i++) { + data[i] = dist(gen); + } +} + + +int main(int argc, char *argv[]) +{ + int numZones = std::atoi(argv[1]); + int numComps = std::atoi(argv[2]); + real_t *actualDensity = new real_t[numZones]; + initializeRandom(actualDensity, numZones); + real_t *eMass = new real_t[numZones]; + initializeRandom(eMass, numZones); + real_t *qc = new real_t[numZones]; + initializeRandom(qc, numZones); + real_t dt = 1.0; + ams::AMSConfigureFSDatabase(ams::AMSDBType::AMS_HDF5, "./"); + ams::AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "test", ams::AMSUQPolicy::AMS_RANDOM, 0.0, nullptr, "test"); + ams::AMSExecutor wf = ams::AMSCreateExecutor(model_descr, 0, 1); + + // Here I am uncertain if materials are NumComps or NumZones. + // NOTE: Materials may or may not be contineous on the outer dimension. + // We take a worst case scenario here, in which data are non contineous. + real_t *materials[numZones]; + real_t *tmpData = new real_t[numZones * numComps]; + for (int i = 0; i < numZones; i++) { + materials[i] = &tmpData[i * numComps]; + initializeRandom(materials[i], numComps); + } + +#if 0 + // THIS WE DO NOT SUPPORT CAUSE the materials data will be a non contineous vector + real_t *materials[numZones]; + for (int i = 0; i < numZones; i++) { + materials[i] = new real_t[numComps]; + initializeRandom(materials[i], numComps); + } +#endif + std::cout << std::fixed << std::setprecision(2); + + std::cout << "Before\n"; + for (int i = 0; i < numZones; i++) { + std::cout << "Dense: " << actualDensity[i] << " eMass:" << eMass[i] + << " QC:" << qc[i]; + for (int j = 0; j < numComps; j++) { + std::cout << " Mat_" << j << " " << materials[i][j]; + } + std::cout << "\n"; + } + + + eval_ams(wf, actualDensity, eMass, qc, dt, materials, numComps, numZones); + + std::cout << "After\n"; + for (int i = 0; i < numZones; i++) { + std::cout << "Dense: " << actualDensity[i] << " eMass:" << eMass[i] + << " QC:" << qc[i]; + for (int j = 0; j < numComps; j++) { + std::cout << " Mat_" << j << " " << materials[i][j]; + } + std::cout << "\n"; + } +} From 76e59c0b9a35284b92ca30d6571a9cb2bb5c98b2 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 10 Feb 2025 21:06:36 -0800 Subject: [PATCH 061/136] Fix hdf5 offset compute --- src/AMSlib/ml/surrogate.cpp | 5 ++++- src/AMSlib/wf/hdf5db.cpp | 19 ++++++++++--------- src/AMSlib/wf/interface.cpp | 11 ----------- src/AMSlib/wf/workflow.hpp | 35 +++++++++++++++-------------------- 4 files changed, 29 insertions(+), 41 deletions(-) diff --git a/src/AMSlib/ml/surrogate.cpp b/src/AMSlib/ml/surrogate.cpp index a12728c9..bbc29108 100644 --- a/src/AMSlib/ml/surrogate.cpp +++ b/src/AMSlib/ml/surrogate.cpp @@ -11,6 +11,7 @@ #include "AMS.h" #include "surrogate.hpp" #include "wf/debug.h" +#include "wf/utils.hpp" using namespace ams; static std::string getDTypeAsString(torch::Dtype dtype) @@ -247,7 +248,9 @@ std::tuple SurrogateModel::evaluate( } auto ITensor = torch::cat(ConvertedInputs, CAxis); - std::cout << "Input concatenated tensor is " << ITensor.sizes() << "\n"; + DBG(Surrogate, + "Input concatenated tensor is %s", + shapeToString(ITensor).c_str()); auto [OTensor, Predicate] = _evaluate(ITensor, policy, threshold); if (InputDevice != torch_device) { diff --git a/src/AMSlib/wf/hdf5db.cpp b/src/AMSlib/wf/hdf5db.cpp index 7934ab69..b7b5fccf 100644 --- a/src/AMSlib/wf/hdf5db.cpp +++ b/src/AMSlib/wf/hdf5db.cpp @@ -196,7 +196,9 @@ void hdf5DB::writeDataToDataset(ams::MutableArrayRef currentShape, // Prepare the dataset for new data ams::SmallVector newShape(tensor_dims.begin(), tensor_dims.end()); + newShape[0] += currentShape[0]; // Update the first dimension + status = H5Dset_extent(dset, newShape.data()); if (status < 0) { throw std::runtime_error("Failed to extend dataset's dimensions."); @@ -239,7 +241,7 @@ void hdf5DB::writeDataToDataset(ams::MutableArrayRef currentShape, } // Update currentShape - currentShape[0] += newShape[0]; + currentShape[0] = newShape[0]; // Close HDF5 objects H5Sclose(memSpace); @@ -250,8 +252,8 @@ void hdf5DB::writeDataToDataset(ams::MutableArrayRef currentShape, void hdf5DB::_store(const at::Tensor& inputs, const at::Tensor& outputs) { DBG(DB, - "DB of type %s stores input/output tensors of shapes(%s, " - "%s)", + "DB of type %s stores input/output tensors of shapes %s, " + "%s", type().c_str(), tensorSizeToString(inputs.sizes()).c_str(), tensorSizeToString(outputs.sizes()).c_str()); @@ -262,6 +264,11 @@ void hdf5DB::_store(const at::Tensor& inputs, const at::Tensor& outputs) writeDataToDataset(currentInputShape, HDIset, inputs); writeDataToDataset(currentOutputShape, HDOset, outputs); + DBG(DB, + "DB (file:%s) next elements to be stored at Input:%s Output: %s", + fn.c_str(), + SmallVectorToString(currentOutputShape).c_str(), + SmallVectorToString(currentInputShape).c_str()); } @@ -321,13 +328,7 @@ void hdf5DB::store(ArrayRef Inputs, c10::SmallVector ConvertedInputs(Inputs.begin(), Inputs.end()); c10::SmallVector ConvertedOutputs(Outputs.begin(), Outputs.end()); - for (auto& T : ConvertedInputs) { - std::cout << "CI Shape is " << T.sizes() << "\n"; - } - for (auto& T : ConvertedOutputs) { - std::cout << "CO Shape is " << T.sizes() << "\n"; - } auto inputs = torch::cat(ConvertedInputs, Inputs[0].sizes().size() - 1).to(tOptions); auto outputs = diff --git a/src/AMSlib/wf/interface.cpp b/src/AMSlib/wf/interface.cpp index 55b1473d..3bdba47a 100644 --- a/src/AMSlib/wf/interface.cpp +++ b/src/AMSlib/wf/interface.cpp @@ -81,11 +81,9 @@ static ams::SmallVector torchToAMSTensors( auto shapes = ArrayRef(tensor.sizes().begin(), tensor.strides().size()); auto strides = ArrayRef(tensor.strides().begin(), tensor.strides().size()); if (dType == AMSDType::AMS_SINGLE) { - std::cout << "Setting pointer " << tensor.data_ptr() << "\n"; ams_tensors.push_back( AMSTensor::view(tensor.data_ptr(), shapes, strides, rType)); } else if (dType == AMSDType::AMS_DOUBLE) { - std::cout << "Setting pointer " << tensor.data_ptr() << "\n"; ams_tensors.push_back( AMSTensor::view(tensor.data_ptr(), shapes, strides, rType)); } @@ -138,14 +136,5 @@ void callAMS(ams::AMSWorkflow *executor, ams::SmallVector tinouts = amsToTorchTensors(inouts); ams::SmallVector touts = amsToTorchTensors(outs); - for (auto &TI : tins) - std::cout << "ITensor Shape is " << TI.sizes() << "\n"; - for (auto &TIO : tinouts) - std::cout << "IOTensor Shape is " << TIO.sizes() << "\n"; - - for (auto &TO : touts) - std::cout << "OTensor Shape is " << TO.sizes() << "\n"; - - executor->evaluate(Physics, tins, tinouts, touts); } diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index 398e9a30..f5a75930 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -21,6 +21,7 @@ #include "macro.h" #include "ml/surrogate.hpp" #include "resource_manager.hpp" +#include "utils.hpp" #include "wf/basedb.hpp" #include "wf/debug.h" @@ -189,9 +190,6 @@ class AMSWorkflow } for (int i = 0; i < computedDomain.size(); i++) { auto indexed_shape = computedDomain[i].sizes(); - std::cout << "Scattering outputs " << entireDomain[i].sizes() << " CD " - << computedDomain[i].sizes() << " Predicate " - << Predicate.sizes() << "\n"; entireDomain[i].index_put_({Predicate}, computedDomain[i].view(indexed_shape)); } @@ -208,9 +206,6 @@ class AMSWorkflow int ConcatAxisSize = dst.sizes()[dst.dim() - 1]; torch::Tensor Slice = Src.narrow(outerDim, offset, ConcatAxisSize).to(dst.options()); - std::cout << "Slice Shape is:" << Slice.sizes() << "\n"; - std::cout << "Dst shape is " << dst.sizes() << "\n"; - std::cout << "Predicate is " << Predicate.sizes() << "\n"; dst.index_put_({Predicate}, Slice.index({Predicate})); offset += ConcatAxisSize; } @@ -278,12 +273,23 @@ class AMSWorkflow InOuts.size(), Outs.size()); + std::string msg{"ApplicationInput: [ "}; for (auto &TI : Ins) - std::cout << "ITensor Shape is " << TI.sizes() << "\n"; + msg += shapeToString(TI) + " "; + msg += "]"; + DBG(Workflow, "%s", msg.c_str()); + + msg = "ApplicationInOut: [ "; for (auto &TIO : InOuts) - std::cout << "IOTensor Shape is " << TIO.sizes() << "\n"; + msg += shapeToString(TIO) + " "; + msg += "]"; + DBG(Workflow, "%s", msg.c_str()); + + msg = "ApplicationOutput: [ "; for (auto &TO : Outs) - std::cout << "OTensor Shape is " << TO.sizes() << "\n"; + msg += shapeToString(TO) + " "; + msg += "]"; + DBG(Workflow, "%s", msg.c_str()); SmallVector InputTensors(Ins.begin(), Ins.end()); @@ -373,22 +379,11 @@ class AMSWorkflow PhysicInOutsBefore.push_back(S.clone()); - for (auto &TI : PhysicIns) - std::cout << "Before Phy ITensor Shape is " << TI.sizes() << "\n"; - for (auto &TO : PhysicOuts) - std::cout << "Before Phy OTensor Shape is " << TO.sizes() << "\n"; - - // We call the application here CALIPER(CALI_MARK_BEGIN("PHYSICS MODULE");) callApplication(CallBack, PhysicIns, PhysicInOuts, PhysicOuts); CALIPER(CALI_MARK_END("PHYSICS MODULE");) - for (auto &TI : PhysicIns) - std::cout << "After Phy ITensor Shape is " << TI.sizes() << "\n"; - for (auto &TO : PhysicOuts) - std::cout << "After Phy OTensor Shape is " << TO.sizes() << "\n"; - CALIPER(CALI_MARK_BEGIN("UNPACK");) // Copy out the computation results to the original tensors/buffers From ec1d8ee9a205711098c63a7b97b58197fd6d0341 Mon Sep 17 00:00:00 2001 From: koparasy Date: Fri, 21 Feb 2025 09:16:37 -0800 Subject: [PATCH 062/136] Adding extra tests for C interface --- tests/AMSlib/ams_interface/CMakeLists.txt | 8 +- tests/AMSlib/ams_interface/ams_ete.cpp | 1 + .../ams_interface/ams_multi_model_ete.cpp | 197 ++++++++---------- 3 files changed, 95 insertions(+), 111 deletions(-) diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index 4fe61d59..2fac27b5 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -178,7 +178,13 @@ BUILD_TEST(ams_ete_broadcast ams_ete_broadcast.cpp) INTEGRATION_TEST() BUILD_TEST(ams_end_to_end_env ams_ete_env.cpp) INTEGRATION_TEST_ENV() -#BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) +BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) +ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::MultiModelDefine::Random::Double::DB::OnlyPhysics::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_multi_model_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"") + + +BUILD_TEST(ams_multi_model_end_to_end_env ams_multi_model_ete_env.cpp) +ADD_API_UNIT_TEST(APIEnvAPI AMS::ENV::MultiModelDefine::Random10::Random50::Double::DB::${db_type}::HOST "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 8 \"double\" 1 128 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 \"double\" 128 app_random_10 app_random_50") + #BUILD_TEST(ams_rmq ams_rmq_env.cpp) #INTEGRATION_TEST_RMQ() diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp index 4f6c4945..b3e6c6b4 100644 --- a/tests/AMSlib/ams_interface/ams_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -13,6 +13,7 @@ #include "AMS.h" #include "ml/surrogate.hpp" +#include "wf/debug.h" using namespace ams; diff --git a/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp index ff4b39ff..e6749813 100644 --- a/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp @@ -1,3 +1,4 @@ +#include #ifdef __AMS_ENABLE_MPI__ #include #endif @@ -7,12 +8,13 @@ #include #include #include -#include #include #include #include "AMS.h" -#include "wf/debug.h" +#include "ml/surrogate.hpp" + +using namespace ams; AMSDType getDataType(char *d_type) { @@ -34,7 +36,7 @@ struct Problem { int multiplier; Problem(int ni, int no) : num_inputs(ni), num_outputs(no), multiplier(100) {} - void run(long num_elements, DType **inputs, DType **outputs) + void run(long num_elements, DType **inputs, DType **outputs, DType scalar) { for (int i = 0; i < num_elements; i++) { DType sum = 0; @@ -43,13 +45,13 @@ struct Problem { } for (int j = 0; j < num_outputs; j++) { - outputs[j][i] = sum; + outputs[j][i] = sum + scalar; } } } - const DType *initialize_inputs(DType *inputs, long length) + DType *initialize_inputs(DType *inputs, long length) { for (int i = 0; i < length; i++) { inputs[i] = static_cast(i); @@ -60,65 +62,83 @@ struct Problem { void ams_run(AMSExecutor &wf, AMSResourceType resource, int iterations, - int num_elements) + int num_elements, + int scalar) { for (int i = 0; i < iterations; i++) { int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; - std::vector inputs; - std::vector outputs; + SmallVector input_tensors; + SmallVector output_tensors; // Allocate Input memory for (int j = 0; j < num_inputs; j++) { DType *data = new DType[elements]; - inputs.push_back(initialize_inputs(data, elements)); + DType *ptr = initialize_inputs(data, elements); + input_tensors.push_back(AMSTensor::view( + ptr, + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } // Allocate Output memory for (int j = 0; j < num_outputs; j++) { - outputs.push_back(new DType[elements]); + auto tmp = new DType[elements]; + output_tensors.push_back(AMSTensor::view( + initialize_inputs(tmp, elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } - AMSExecute(wf, - (void *)this, - elements, - reinterpret_cast(inputs.data()), - reinterpret_cast(outputs.data()), - inputs.size(), - outputs.size()); - - for (int j = 0; j < num_outputs; j++) { - delete[] outputs[j]; + EOSLambda OrigComputation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + DType *ins[num_inputs]; + DType *outs[num_outputs]; + if (num_inputs != ams_ins.size()) + throw std::runtime_error( + "Expecting dimensions of inputs to remain the same"); + else if (num_outputs != ams_outs.size()) + throw std::runtime_error( + "Expecting dimensions of outputs to remain the same"); + + // Here I can use domain knowledge (inouts is empty) + int num_elements = ams_ins[0].shape()[0]; + for (int i = 0; i < num_inputs; i++) { + ins[i] = ams_ins[i].data(); + if (ams_ins[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + for (int i = 0; i < num_outputs; i++) { + outs[i] = ams_outs[i].data(); + if (ams_outs[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + run(num_elements, ins, outs, scalar); + }; + + ams::SmallVector inouts; + AMSExecute(wf, OrigComputation, input_tensors, inouts, output_tensors); + + for (int i = 0; i < input_tensors.size(); i++) { + delete input_tensors[i].data(); } - for (int j = 0; j < num_inputs; j++) { - delete[] inputs[j]; + for (int i = 0; i < output_tensors.size(); i++) { + delete output_tensors[i].data(); } } } }; -void callBackDouble(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << "Called the double model\n"; - static_cast *>(cls)->run(elements, - (double **)(inputs), - (double **)(outputs)); -} - - -void callBackSingle(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << "Called the single model\n"; - static_cast *>(cls)->run(elements, - (float **)(inputs), - (float **)(outputs)); -} - - int main(int argc, char **argv) { - if (argc != 15) { + if (argc != 12) { std::cout << "Wrong cli\n"; std::cout << argv[0] << " use_device(0|1) num_inputs num_outputs model_path " @@ -131,20 +151,17 @@ int main(int argc, char **argv) int use_device = std::atoi(argv[1]); - int num_inputs_1 = std::atoi(argv[2]); - int num_outputs_1 = std::atoi(argv[3]); - char *model_path_1 = argv[4]; + int num_inputs = std::atoi(argv[2]); + int num_outputs = std::atoi(argv[3]); + char *model_path = argv[4]; AMSDType data_type = getDataType(argv[5]); std::string uq_name = std::string(argv[6]); - const AMSUQPolicy uq_policy = BaseUQ::UQPolicyFromStr(uq_name); + const AMSUQPolicy uq_policy = UQ::UQPolicyFromStr(uq_name); float threshold = std::atof(argv[7]); int num_iterations = std::atoi(argv[8]); int avg_elements = std::atoi(argv[9]); std::string db_type_str = std::string(argv[10]); std::string fs_path = std::string(argv[11]); - int num_inputs_2 = std::atoi(argv[12]); - int num_outputs_2 = std::atoi(argv[13]); - char *model_path_2 = argv[14]; AMSDBType db_type = ams::db::getDBType(db_type_str); AMSResourceType resource = AMSResourceType::AMS_HOST; srand(time(NULL)); @@ -156,68 +173,28 @@ int main(int argc, char **argv) uq_policy == AMSUQPolicy::AMS_RANDOM) && "Test only supports duq models"); - AMSCAbstrModel model_descr_1 = AMSRegisterAbstractModel( - "test_1", uq_policy, threshold, model_path_1, nullptr, "test_1", -1); - - AMSCAbstrModel model_descr_2 = AMSRegisterAbstractModel( - "test_2", uq_policy, threshold, model_path_2, nullptr, "test_2", -1); - - - if (data_type == AMSDType::AMS_SINGLE) { - Problem prob1(num_inputs_1, num_outputs_1); - Problem prob2(num_inputs_2, num_outputs_2); - - AMSExecutor wf_1 = AMSCreateExecutor(model_descr_1, - AMSDType::AMS_SINGLE, - resource, - (AMSPhysicFn)callBackSingle, - 0, - 1); - - AMSExecutor wf_2 = AMSCreateExecutor(model_descr_2, - AMSDType::AMS_SINGLE, - resource, - (AMSPhysicFn)callBackSingle, - 0, - 1); - - for (int i = 0; i < num_iterations; i++) { - size_t elems = - (static_cast(rand()) / RAND_MAX) * 2 * avg_elements - - avg_elements + avg_elements; - prob1.ams_run(wf_1, resource, 1, elems); - size_t elems1 = - (static_cast(rand()) / RAND_MAX) * 2 * avg_elements - - avg_elements + avg_elements; - prob2.ams_run(wf_2, resource, 1, elems1); - } - } else { - Problem prob1(num_inputs_1, num_outputs_1); - Problem prob2(num_inputs_2, num_outputs_2); - - AMSExecutor wf_1 = AMSCreateExecutor(model_descr_1, - AMSDType::AMS_DOUBLE, - resource, - (AMSPhysicFn)callBackDouble, - 0, - 1); - - AMSExecutor wf_2 = AMSCreateExecutor(model_descr_2, - AMSDType::AMS_DOUBLE, - resource, - (AMSPhysicFn)callBackDouble, - 0, - 1); - - for (int i = 0; i < num_iterations; i++) { - size_t elems = avg_elements; - // (static_cast(rand()) / RAND_MAX) * 2 * avg_elements - - // avg_elements + avg_elements; - prob1.ams_run(wf_1, resource, 1, elems); - size_t elems1 = avg_elements; - // (static_cast(rand()) / RAND_MAX) * 2 * avg_elements - - // avg_elements + avg_elements; - prob2.ams_run(wf_2, resource, 1, elems1); + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "test_1", uq_policy, threshold, nullptr, "test_1"); + + AMSCAbstrModel model_descr1 = AMSRegisterAbstractModel( + "test_2", uq_policy, threshold, nullptr, "test_2"); + + std::cout << "Running with " << num_iterations << "\n"; + AMSExecutor wf1 = AMSCreateExecutor(model_descr, 0, 1); + AMSExecutor wf2 = AMSCreateExecutor(model_descr1, 0, 1); + for (int i = 0; i < 10; i++) { + if (data_type == AMSDType::AMS_SINGLE) { + Problem prob1(num_inputs, num_outputs); + Problem prob2(num_inputs + 1, num_outputs + 1); + + + prob1.ams_run(wf1, resource, num_iterations, avg_elements, 0); + prob2.ams_run(wf2, resource, num_iterations, avg_elements, 1); + } else { + Problem prob1(num_inputs, num_outputs); + Problem prob2(num_inputs + 1, num_outputs + 1); + prob2.ams_run(wf2, resource, num_iterations, avg_elements, 1); + prob1.ams_run(wf1, resource, num_iterations, avg_elements, 0); } } From 895d2a4dac1033c7bc359bdb3033107685864617 Mon Sep 17 00:00:00 2001 From: koparasy Date: Wed, 26 Feb 2025 04:16:19 -0800 Subject: [PATCH 063/136] Minor prints and tests --- src/AMSlib/AMSTensor.cpp | 6 ++---- src/AMSlib/ml/surrogate.cpp | 11 +++++++++-- tests/AMSlib/ams_interface/CMakeLists.txt | 4 ++-- tests/AMSlib/torch/evalute_model_conversions.cpp | 3 +-- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/AMSlib/AMSTensor.cpp b/src/AMSlib/AMSTensor.cpp index 61e54b99..20fa882b 100644 --- a/src/AMSlib/AMSTensor.cpp +++ b/src/AMSlib/AMSTensor.cpp @@ -54,8 +54,7 @@ AMSTensor::AMSTensor(uint8_t* data, } } -template ::value>> +template AMSTensor AMSTensor::create(ams::ArrayRef shapes, ams::ArrayRef strides, AMSResourceType location) @@ -79,8 +78,7 @@ AMSTensor AMSTensor::create(ams::ArrayRef shapes, } -template ::value>> +template AMSTensor AMSTensor::view(FPType* data, ams::ArrayRef shapes, ams::ArrayRef strides, diff --git a/src/AMSlib/ml/surrogate.cpp b/src/AMSlib/ml/surrogate.cpp index bbc29108..86ef89a5 100644 --- a/src/AMSlib/ml/surrogate.cpp +++ b/src/AMSlib/ml/surrogate.cpp @@ -91,6 +91,9 @@ std::tuple SurrogateModel:: } // If no parameters or buffers are found, default to unknown + FATAL(Surrogate, + "Cannot determine device type of model %s", + _model_path.c_str()); return std::make_tuple(AMS_UNKNOWN, c10::DeviceType::COMPILE_TIME_MAX_DEVICE_TYPES); } @@ -98,7 +101,7 @@ std::tuple SurrogateModel:: std::tuple SurrogateModel::getModelDataType() { AMSDType dParamType = AMSDType::AMS_DOUBLE; - torch::Dtype torchType; + torch::Dtype torchType = at::kDouble; for (const auto& parameter : module.parameters()) { // Return the device of the first parameter found if (parameter.dtype() == at::kFloat) { @@ -112,6 +115,7 @@ std::tuple SurrogateModel::getModelDataType() std::string(parameter.dtype().name())); } } + // Verify for (const auto& parameter : module.parameters()) { if (parameter.dtype() != torchType) @@ -142,6 +146,10 @@ std::tuple SurrogateModel::getModelDataType() throw std::runtime_error( "Provided model has mixed data types between parameters and buffers"); + DBG(Surrogate, + "Detected model data type %s %s", + getDTypeAsString(torchType).c_str(), + getAMSDTypeAsString(dParamType).c_str()); return std::make_tuple(dParamType, torchType); } @@ -237,7 +245,6 @@ std::tuple SurrogateModel::evaluate( "types\n"); } } - c10::SmallVector ConvertedInputs(Inputs.begin(), Inputs.end()); // If either the model's execution device or the data type differ // in respect to the inputs we need to handle this separately. diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index 2fac27b5..e9e93222 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -179,11 +179,11 @@ INTEGRATION_TEST() BUILD_TEST(ams_end_to_end_env ams_ete_env.cpp) INTEGRATION_TEST_ENV() BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) -ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::MultiModelDefine::Random::Double::DB::OnlyPhysics::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_multi_model_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"") +#ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::MultiModelDefine::Random::Double::DB::OnlyPhysics::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_multi_model_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"") BUILD_TEST(ams_multi_model_end_to_end_env ams_multi_model_ete_env.cpp) -ADD_API_UNIT_TEST(APIEnvAPI AMS::ENV::MultiModelDefine::Random10::Random50::Double::DB::${db_type}::HOST "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 8 \"double\" 1 128 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 \"double\" 128 app_random_10 app_random_50") +#ADD_API_UNIT_TEST(APIEnvAPI AMS::ENV::MultiModelDefine::Random10::Random50::Double::DB::${db_type}::HOST "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_end_to_end_env 0 8 8 \"double\" 1 128 app_random_10 app_random_50;AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 \"double\" 128 app_random_10 app_random_50") #BUILD_TEST(ams_rmq ams_rmq_env.cpp) diff --git a/tests/AMSlib/torch/evalute_model_conversions.cpp b/tests/AMSlib/torch/evalute_model_conversions.cpp index 9e9072d5..f86e5546 100644 --- a/tests/AMSlib/torch/evalute_model_conversions.cpp +++ b/tests/AMSlib/torch/evalute_model_conversions.cpp @@ -51,8 +51,7 @@ std::string deviceTypeToString(c10::DeviceType deviceType) {c10::DeviceType::HIP, "HIP"}, {c10::DeviceType::FPGA, "FPGA"}, {c10::DeviceType::XLA, "XLA"}, - {c10::DeviceType::Meta, "Meta"}, - {c10::DeviceType::ORT, "ORT"}}; + {c10::DeviceType::Meta, "Meta"}}; return deviceMap.count(deviceType) ? deviceMap.at(deviceType) : "unknown device"; } From c50d8b993e377dca8804bf9b0d6582f1eb0cac55 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 10 Apr 2025 10:43:02 -0700 Subject: [PATCH 064/136] Abort when h5py is not present --- tests/CMakeLists.txt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 103bac3e..f4e11848 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -3,6 +3,26 @@ # # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +find_package(Python3 REQUIRED COMPONENTS Interpreter) +message(STATUS "Python executable: ${Python3_EXECUTABLE}") + +# Check if h5py is installed +execute_process( + COMMAND ${Python3_EXECUTABLE} -c "import h5py" + RESULT_VARIABLE H5PY_CHECK_RESULT + OUTPUT_QUIET + ERROR_QUIET +) + +if(NOT H5PY_CHECK_RESULT EQUAL 0) + message(FATAL_ERROR + "Missing Python dependency: h5py\n" + "Try running:\n" + " pip install h5py\n" + "Or ensure it is available in your environment." + ) +endif() + if (WITH_AMS_LIB) add_subdirectory(AMSlib) endif() From 71036206f870334dc2146eaa6747360b8cdf437a Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 10 Apr 2025 10:59:43 -0700 Subject: [PATCH 065/136] Adding missing test --- .../ams_interface/ams_multi_model_ete_env.cpp | 208 ++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100644 tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp diff --git a/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp b/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp new file mode 100644 index 00000000..5f99bfec --- /dev/null +++ b/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp @@ -0,0 +1,208 @@ +#include +#ifdef __AMS_ENABLE_MPI__ +#include +#endif +#include + +#include +#include +#include +#include +#include +#include + +#include "AMS.h" +#include "ml/surrogate.hpp" + +using namespace ams; + +AMSDType getDataType(char *d_type) +{ + AMSDType dType = AMSDType::AMS_DOUBLE; + if (std::strcmp(d_type, "float") == 0) { + dType = AMSDType::AMS_SINGLE; + } else if (std::strcmp(d_type, "double") == 0) { + dType = AMSDType::AMS_DOUBLE; + } else { + assert(false && "Unknown data type"); + } + return dType; +} + +template +void OrigComputation(void *cls, + const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs); + +template +struct Problem { + int num_inputs; + int num_outputs; + int multiplier; + int scalar; + Problem(int ni, int no) : num_inputs(ni), num_outputs(no), multiplier(100) {} + + void run(long num_elements, DType **inputs, DType **outputs, DType scalar) + { + std::cout << "In run " << num_inputs << " " << num_outputs << "\n"; + for (int i = 0; i < num_elements; i++) { + DType sum = 0; + for (int j = 0; j < num_inputs; j++) { + sum += inputs[j][i]; + } + + for (int j = 0; j < num_outputs; j++) { + outputs[j][i] = sum + scalar; + } + } + } + + + DType *initialize_inputs(DType *inputs, long length) + { + for (int i = 0; i < length; i++) { + inputs[i] = static_cast(i); + } + return inputs; + } + + void ams_run(AMSExecutor &wf, + AMSResourceType resource, + int iterations, + int num_elements, + int scalar) + { + this->scalar = scalar; + for (int i = 0; i < iterations; i++) { + int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; + SmallVector input_tensors; + SmallVector output_tensors; + std::cout << "Num Inputs are " << num_inputs << " num outputs are " + << num_outputs << "\n"; + // Allocate Input memory + for (int j = 0; j < num_inputs; j++) { + DType *data = new DType[elements]; + DType *ptr = initialize_inputs(data, elements); + std::cout << "Input_" << j << " is " << std::hex << ptr << std::dec + << "\n"; + input_tensors.push_back(AMSTensor::view( + ptr, + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); + } + + // Allocate Output memory + for (int j = 0; j < num_outputs; j++) { + auto tmp = new DType[elements]; + std::cout << "output " << j << " is " << std::hex << tmp << std::dec + << "\n"; + output_tensors.push_back(AMSTensor::view( + initialize_inputs(tmp, elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); + } + + ams::SmallVector inouts; + AMSCExecute(wf, + OrigComputation, + (void *)this, + input_tensors, + inouts, + output_tensors); + + for (int i = 0; i < input_tensors.size(); i++) { + delete input_tensors[i].data(); + } + + + for (int i = 0; i < output_tensors.size(); i++) { + delete output_tensors[i].data(); + } + } + } +}; + +template +void OrigComputation(void *cls, + const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) +{ + std::cout << "Num Inputs are " << ams_ins.size() + ams_inouts.size() << "\n"; + std::cout << "Num Ouputs are " << ams_outs.size() + ams_inouts.size() << "\n"; + DType *ins[ams_ins.size() + ams_inouts.size()]; + DType *outs[ams_outs.size() + ams_inouts.size()]; + Problem *Prob = (Problem *)cls; + + + // Here I can use domain knowledge (inouts is empty) + int num_elements = ams_ins[0].shape()[0]; + for (int i = 0; i < ams_ins.size(); i++) { + ins[i] = ams_ins[i].data(); + std::cout << "Input_" << i << " is " << std::hex << ins[i] << std::dec + << "\n"; + if (ams_ins[i].shape()[0] != num_elements) + throw std::runtime_error("Expected tensors to have the same shape"); + } + for (int i = 0; i < ams_outs.size(); i++) { + outs[i] = ams_outs[i].data(); + std::cout << "Output_" << i << " is " << std::hex << outs[i] << std::dec + << "\n"; + if (ams_outs[i].shape()[0] != num_elements) + throw std::runtime_error("Expected tensors to have the same shape"); + } + Prob->run(num_elements, ins, outs, Prob->scalar); +}; + + +int main(int argc, char **argv) +{ + + if (argc != 9) { + std::cout << "Wrong cli\n"; + std::cout << argv[0] + << " use_device(0|1) num_inputs num_outputs " + "data_type(float|double)" + "num_iterations avg_num_values 'model-name-1' 'model-name-2'"; + return -1; + } + + + int use_device = std::atoi(argv[1]); + int num_inputs = std::atoi(argv[2]); + int num_outputs = std::atoi(argv[3]); + AMSDType data_type = getDataType(argv[4]); + int num_iterations = std::atoi(argv[5]); + int avg_elements = std::atoi(argv[6]); + const char *model1 = argv[7]; + const char *model2 = argv[8]; + AMSResourceType resource = AMSResourceType::AMS_HOST; + srand(time(NULL)); + + AMSCAbstrModel model_descr = AMSQueryModel(model1); + AMSCAbstrModel model_descr1 = AMSQueryModel(model2); + + std::cout << "Running with " << num_iterations << "\n"; + AMSExecutor wf1 = AMSCreateExecutor(model_descr, 0, 1); + AMSExecutor wf2 = AMSCreateExecutor(model_descr1, 0, 1); + for (int i = 0; i < 10; i++) { + if (data_type == AMSDType::AMS_SINGLE) { + Problem prob1(num_inputs, num_outputs); + Problem prob2(num_inputs + 1, num_outputs + 1); + + + prob1.ams_run(wf1, resource, num_iterations, avg_elements, 0); + prob2.ams_run(wf2, resource, num_iterations, avg_elements, 1); + } else { + Problem prob1(num_inputs, num_outputs); + Problem prob2(num_inputs + 1, num_outputs + 1); + prob2.ams_run(wf2, resource, num_iterations, avg_elements, 1); + prob1.ams_run(wf1, resource, num_iterations, avg_elements, 0); + } + } + + return 0; +} From faa830bcebfdd8af53a9cf0331e77b2171f66045 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 10 Apr 2025 14:59:06 -0700 Subject: [PATCH 066/136] Add proper linkage to test --- src/AMSlib/CMakeLists.txt | 1 - tests/AMSlib/db/CMakeLists.txt | 15 +++++++++++++++ tests/AMSlib/wf/CMakeLists.txt | 17 +++++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index cf7af169..f78a4ffd 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -38,7 +38,6 @@ if (WITH_HDF5) target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) endif() - if (WITH_CALIPER) target_link_libraries(AMS PRIVATE caliper) endif() diff --git a/tests/AMSlib/db/CMakeLists.txt b/tests/AMSlib/db/CMakeLists.txt index 3038f908..9ce0ff55 100644 --- a/tests/AMSlib/db/CMakeLists.txt +++ b/tests/AMSlib/db/CMakeLists.txt @@ -10,6 +10,21 @@ function(BUILD_UNIT_TEST exe source) target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) endif() + if (WITH_CALIPER) + message(STATUS "BUilding witth calier ${exe}") + target_link_libraries(${exe} PRIVATE caliper) + endif() + + if (WITH_RMQ) + target_link_libraries(${exe} PRIVATE amqpcpp) + if (OPENSSL_FOUND) + target_link_libraries(${exe} PRIVATE OpenSSL::SSL OpenSSL::Crypto) + endif() + # NOTE: We set here the event/event pthreads as public. As there is no easy way + # to do a find package(libevent) and RMQ is not exposing that properly. + target_link_libraries(${exe} PRIVATE ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) + endif() + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) endfunction() diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt index a76d74fa..b4041291 100644 --- a/tests/AMSlib/wf/CMakeLists.txt +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -22,9 +22,22 @@ function(BUILD_UNIT_TEST exe source) endif() if (WITH_CALIPER) - target_compile_definitions(${exe} PRIVATE __AMS_ENABLE_CALIPER__) - target_link_libraries(${exe} PRIVATE caliper) + target_compile_definitions(${exe} PRIVATE __AMS_ENABLE_CALIPER__) + target_link_libraries(${exe} PRIVATE caliper) endif() + + if (WITH_RMQ) + target_link_libraries(${exe} PRIVATE amqpcpp) + if (OPENSSL_FOUND) + target_link_libraries(${exe} PRIVATE OpenSSL::SSL OpenSSL::Crypto) + endif() + # NOTE: We set here the event/event pthreads as public. As there is no easy way + # to do a find package(libevent) and RMQ is not exposing that properly. + target_link_libraries(${exe} PRIVATE ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) + endif() + + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) + endfunction() BUILD_UNIT_TEST(domain_to_application domain_to_application.cpp) From 7e5139fd0cc0aa3238d3e83a2b7de9e85fc37710 Mon Sep 17 00:00:00 2001 From: koparasy Date: Wed, 16 Apr 2025 11:17:30 -0700 Subject: [PATCH 067/136] Logger now is initialized independently --- src/AMSlib/AMS.cpp | 86 +-------------------------------------- src/AMSlib/wf/logger.cpp | 88 ++++++++++++++++++++++++++++++++++++++++ src/AMSlib/wf/logger.hpp | 1 + 3 files changed, 90 insertions(+), 85 deletions(-) diff --git a/src/AMSlib/AMS.cpp b/src/AMSlib/AMS.cpp index eb1d3fd4..5546e5fd 100644 --- a/src/AMSlib/AMS.cpp +++ b/src/AMSlib/AMS.cpp @@ -32,19 +32,6 @@ using namespace ams; namespace { -static int get_rank_id() -{ - if (const char *flux_id = std::getenv("FLUX_TASK_RANK")) { - return std::stoi(flux_id); - } else if (const char *rid = std::getenv("SLURM_PROCID")) { - return std::stoi(rid); - } else if (const char *jsm = std::getenv("JSM_NAMESPACE_RANK")) { - return std::stoi(jsm); - } else if (const char *pmi = std::getenv("PMIX_RANK")) { - return std::stoi(pmi); - } - return 0; -} struct AMSAbstractModel { enum UQAggrType { @@ -409,80 +396,9 @@ class AMSWrap return; } - std::pair setup_loggers() - { - const char *ams_logger_level = std::getenv("AMS_LOG_LEVEL"); - const char *ams_logger_dir = std::getenv("AMS_LOG_DIR"); - const char *ams_logger_prefix = std::getenv("AMS_LOG_PREFIX"); - std::string log_fn(""); - std::string log_path("./"); - - auto logger = ams::util::Logger::getActiveLogger(); - bool enable_log = false; - - if (ams_logger_level) { - auto log_lvl = ams::util::getVerbosityLevel(ams_logger_level); - logger->setLoggingMsgLevel(log_lvl); - enable_log = true; - } - - // In the case we specify a directory and we do not specify a file - // by default we write to a file. - if (ams_logger_dir && !ams_logger_prefix) { - ams_logger_prefix = "ams"; - } - - if (ams_logger_prefix) { - // We are going to redirect stdout to some file - // By default we store to the current directory - std::string pattern(""); - std::string log_prefix(ams_logger_prefix); - - if (ams_logger_dir) { - log_path = std::string(ams_logger_dir); - } - - char hostname[HOST_NAME_MAX]; - if (gethostname(hostname, HOST_NAME_MAX) != 0) { - FATAL(AMS, "Get hostname returns error"); - } - - int id = 0; - if (log_prefix.find("") != std::string::npos) { - pattern = std::string(""); - id = get_rank_id(); - } else if (log_prefix.find("") != std::string::npos) { - pattern = std::string(""); - id = getpid(); - } - - // Combine hostname and pid - std::ostringstream combined; - combined << "." << hostname << "." << id; - - if (!pattern.empty()) { - log_path = fs::absolute(log_path).string(); - log_fn = - std::regex_replace(log_prefix, std::regex(pattern), combined.str()); - } else { - log_path = fs::absolute(log_path).string(); - log_fn = log_prefix + combined.str(); - } - } - logger->initialize_std_io_err(enable_log, log_path, log_fn); - - return std::make_pair(enable_log, log_path); - } - public: AMSWrap() : memManager(ams::ResourceManager::getInstance()) { - auto log_stats = setup_loggers(); - DBG(AMS, - "Enable Log %d stored under %s", - log_stats.first, - log_stats.second.c_str()) - memManager.init(); if (const char *object_descr = std::getenv("AMS_OBJECTS")) { @@ -681,7 +597,7 @@ AMSCAbstrModel AMSRegisterAbstractModel(const char *domain_name, const char *surrogate_path, const char *db_label) { - CFATAL(AMS, _amsWrap == nullptr, "AMSInit has not been called.") + CFATAL(AMS, !_amsWrap, "AMSInit has not been called.") std::cout << "_amsWrap = " << _amsWrap.get() << std::endl; auto id = _amsWrap->get_model_index(domain_name); if (id == -1) { diff --git a/src/AMSlib/wf/logger.cpp b/src/AMSlib/wf/logger.cpp index 478326e0..f01c4627 100644 --- a/src/AMSlib/wf/logger.cpp +++ b/src/AMSlib/wf/logger.cpp @@ -6,13 +6,18 @@ */ +#include +#include + #include // for std::equal #include // for std::toupper #include // for getenv() #include #include #include +#include #include +#include #include #include "debug.h" @@ -20,6 +25,20 @@ #include "wf/debug.h" #include "wf/logger.hpp" +static int get_rank_id() +{ + if (const char* flux_id = std::getenv("FLUX_TASK_RANK")) { + return std::stoi(flux_id); + } else if (const char* rid = std::getenv("SLURM_PROCID")) { + return std::stoi(rid); + } else if (const char* jsm = std::getenv("JSM_NAMESPACE_RANK")) { + return std::stoi(jsm); + } else if (const char* pmi = std::getenv("PMIX_RANK")) { + return std::stoi(pmi); + } + return 0; +} + namespace ams { @@ -87,6 +106,8 @@ void Logger::setLoggingMsgLevel(LogVerbosityLevel level) Logger* Logger::getActiveLogger() { static Logger logger; + static std::once_flag _amsLogger; + std::call_once(_amsLogger, [&]() { logger.setup_loggers(); }); return &logger; } @@ -119,6 +140,73 @@ void Logger::initialize_std_io_err(const bool enable_log, } } + +void Logger::setup_loggers() +{ + namespace fs = std::experimental::filesystem; + const char* ams_logger_level = std::getenv("AMS_LOG_LEVEL"); + const char* ams_logger_dir = std::getenv("AMS_LOG_DIR"); + const char* ams_logger_prefix = std::getenv("AMS_LOG_PREFIX"); + std::string log_fn(""); + std::string log_path("./"); + + bool enable_log = false; + + if (ams_logger_level) { + auto log_lvl = ams::util::getVerbosityLevel(ams_logger_level); + setLoggingMsgLevel(log_lvl); + enable_log = true; + } + + // In the case we specify a directory and we do not specify a file + // by default we write to a file. + if (ams_logger_dir && !ams_logger_prefix) { + ams_logger_prefix = "ams"; + } + + if (ams_logger_prefix) { + // We are going to redirect stdout to some file + // By default we store to the current directory + std::string pattern(""); + std::string log_prefix(ams_logger_prefix); + + if (ams_logger_dir) { + log_path = std::string(ams_logger_dir); + } + + char hostname[HOST_NAME_MAX]; + if (gethostname(hostname, HOST_NAME_MAX) != 0) { + FATAL(AMS, "Get hostname returns error"); + } + + int id = 0; + if (log_prefix.find("") != std::string::npos) { + pattern = std::string(""); + id = get_rank_id(); + } else if (log_prefix.find("") != std::string::npos) { + pattern = std::string(""); + id = getpid(); + } + + // Combine hostname and pid + std::ostringstream combined; + combined << "." << hostname << "." << id; + + if (!pattern.empty()) { + log_path = fs::absolute(log_path).string(); + log_fn = + std::regex_replace(log_prefix, std::regex(pattern), combined.str()); + } else { + log_path = fs::absolute(log_path).string(); + log_fn = log_prefix + combined.str(); + } + } + initialize_std_io_err(enable_log, log_path, log_fn); + + return; +} + + void Logger::flush() { if (ams_out != nullptr && ams_out != stdout) fflush(ams_out); diff --git a/src/AMSlib/wf/logger.hpp b/src/AMSlib/wf/logger.hpp index 5f1be46a..80715ce2 100644 --- a/src/AMSlib/wf/logger.hpp +++ b/src/AMSlib/wf/logger.hpp @@ -62,6 +62,7 @@ class Logger private: Logger() noexcept; + void setup_loggers(); bool m_is_enabled[LogVerbosityLevel::Num_Levels]; FILE *ams_out, *ams_err; From c185debe7a73fe86b3dcca455e7b2876688b3d65 Mon Sep 17 00:00:00 2001 From: koparasy Date: Wed, 16 Apr 2025 11:28:25 -0700 Subject: [PATCH 068/136] Add AMSInit on new tests --- src/AMSlib/AMS.cpp | 35 +++++++------ tests/AMSlib/ams_interface/ams_ete.cpp | 4 +- tests/AMSlib/ams_interface/ams_ete_2d.cpp | 2 + .../ams_interface/ams_ete_broadcast.cpp | 2 + tests/AMSlib/ams_interface/ams_ete_env.cpp | 2 + .../ams_interface/ams_multi_model_ete.cpp | 2 + .../ams_interface/ams_multi_model_ete_env.cpp | 2 + tests/AMSlib/ams_interface/ams_physics.cpp | 49 ++++++++++--------- 8 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/AMSlib/AMS.cpp b/src/AMSlib/AMS.cpp index 5546e5fd..00520846 100644 --- a/src/AMSlib/AMS.cpp +++ b/src/AMSlib/AMS.cpp @@ -471,23 +471,6 @@ static std::once_flag _amsInitFlag; static std::once_flag _amsFinalizeFlag; static std::unique_ptr _amsWrap; -void AMSInit() -{ - std::call_once(_amsInitFlag, [&]() { - DBG(AMS, "Initialization of AMS") - _amsWrap = std::make_unique(); - }); -} - -void AMSFinalize() -{ - std::call_once(_amsFinalizeFlag, [&]() { - DBG(AMS, "Finalization of AMS") - _amsWrap.reset(); - }); -} - - ams::AMSWorkflow *_AMSCreateExecutor(AMSCAbstrModel model, int process_id, int world_size) @@ -516,6 +499,23 @@ AMSExecutor _AMSRegisterExecutor(ams::AMSWorkflow *workflow) namespace ams { +void AMSInit() +{ + std::call_once(_amsInitFlag, [&]() { + DBG(AMS, "Initialization of AMS") + _amsWrap = std::make_unique(); + }); +} + +void AMSFinalize() +{ + std::call_once(_amsFinalizeFlag, [&]() { + DBG(AMS, "Finalization of AMS") + _amsWrap.reset(); + }); +} + + AMSExecutor AMSCreateExecutor(AMSCAbstrModel model, int process_id, int world_size) @@ -598,7 +598,6 @@ AMSCAbstrModel AMSRegisterAbstractModel(const char *domain_name, const char *db_label) { CFATAL(AMS, !_amsWrap, "AMSInit has not been called.") - std::cout << "_amsWrap = " << _amsWrap.get() << std::endl; auto id = _amsWrap->get_model_index(domain_name); if (id == -1) { id = _amsWrap->register_model( diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp index b3e6c6b4..8600a741 100644 --- a/tests/AMSlib/ams_interface/ams_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -149,7 +149,7 @@ int main(int argc, char **argv) return -1; } - + AMSInit(); int use_device = std::atoi(argv[1]); int num_inputs = std::atoi(argv[2]); int num_outputs = std::atoi(argv[3]); @@ -186,6 +186,6 @@ int main(int argc, char **argv) Problem prob(num_inputs, num_outputs); prob.ams_run(wf, resource, num_iterations, avg_elements); } - + AMSFinalize(); return 0; } diff --git a/tests/AMSlib/ams_interface/ams_ete_2d.cpp b/tests/AMSlib/ams_interface/ams_ete_2d.cpp index a1435da1..b4ae2228 100644 --- a/tests/AMSlib/ams_interface/ams_ete_2d.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_2d.cpp @@ -180,6 +180,7 @@ struct Problem { int main(int argc, char **argv) { + AMSInit(); if (argc != 12) { std::cout << "Wrong cli\n"; std::cout << argv[0] @@ -237,5 +238,6 @@ int main(int argc, char **argv) prob.ams_run(wf, resource, num_iterations, avg_elements); } + AMSFinalize(); return 0; } diff --git a/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp b/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp index 7afc17bf..dd9eb870 100644 --- a/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp @@ -154,6 +154,7 @@ int main(int argc, char **argv) "db_path(path to existing path to store data)"; return -1; } + AMSInit(); int use_device = std::atoi(argv[1]); @@ -193,5 +194,6 @@ int main(int argc, char **argv) prob.ams_run(wf, resource, num_iterations, avg_elements); } + AMSFinalize(); return 0; } diff --git a/tests/AMSlib/ams_interface/ams_ete_env.cpp b/tests/AMSlib/ams_interface/ams_ete_env.cpp index fc72a10a..9ccb267c 100644 --- a/tests/AMSlib/ams_interface/ams_ete_env.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_env.cpp @@ -152,6 +152,7 @@ void callBackSingle(void *cls, long elements, void **inputs, void **outputs) int main(int argc, char **argv) { + AMSInit(); if (argc != 9) { std::cout << "Wrong cli\n"; std::cout << argv[0] @@ -186,5 +187,6 @@ int main(int argc, char **argv) } } + AMSFinalize(); return 0; } diff --git a/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp index e6749813..64028c44 100644 --- a/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp @@ -149,6 +149,7 @@ int main(int argc, char **argv) return -1; } + AMSInit(); int use_device = std::atoi(argv[1]); int num_inputs = std::atoi(argv[2]); @@ -198,5 +199,6 @@ int main(int argc, char **argv) } } + AMSFinalize(); return 0; } diff --git a/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp b/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp index 5f99bfec..784eb804 100644 --- a/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp +++ b/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp @@ -170,6 +170,7 @@ int main(int argc, char **argv) return -1; } + AMSInit(); int use_device = std::atoi(argv[1]); int num_inputs = std::atoi(argv[2]); @@ -204,5 +205,6 @@ int main(int argc, char **argv) } } + AMSFinalize(); return 0; } diff --git a/tests/AMSlib/ams_interface/ams_physics.cpp b/tests/AMSlib/ams_interface/ams_physics.cpp index b7bce53c..d9aea739 100644 --- a/tests/AMSlib/ams_interface/ams_physics.cpp +++ b/tests/AMSlib/ams_interface/ams_physics.cpp @@ -80,30 +80,30 @@ void eval_ams(AMSExecutor &wf, AMSResourceType::AMS_HOST)); - EOSLambda OrigComputation = - [&](const ams::SmallVector &ams_ins, - ams::SmallVector &ams_inouts, - ams::SmallVector &ams_outs) { - int prunedZones = ams_ins[0].shape()[0]; - std::cout << "Pruned are " << prunedZones << "\n"; - real_t *pruned_mat[prunedZones]; - // The 2D data of materials are unnder a c_vector. - real_t *c_mats = ams_ins[0].data(); - // We need this as eval requires a c like 2D vector - for (int i = 0; i < prunedZones; i++) { - pruned_mat[i] = &c_mats[i * ams_ins[0].shape()[1]]; - } - eval(ams_inouts[0].data(),// density was the first entry in inout - ams_outs[0].data(), - ams_inouts[1].data(), // qc was the second entry in inout - *ams_ins[1].data(), - pruned_mat, - NumComps, - prunedZones); - }; + EOSLambda OrigComputation = [&](const ams::SmallVector + &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + int prunedZones = ams_ins[0].shape()[0]; + std::cout << "Pruned are " << prunedZones << "\n"; + real_t *pruned_mat[prunedZones]; + // The 2D data of materials are unnder a c_vector. + real_t *c_mats = ams_ins[0].data(); + // We need this as eval requires a c like 2D vector + for (int i = 0; i < prunedZones; i++) { + pruned_mat[i] = &c_mats[i * ams_ins[0].shape()[1]]; + } + eval(ams_inouts[0].data(), // density was the first entry in inout + ams_outs[0].data(), + ams_inouts[1].data(), // qc was the second entry in inout + *ams_ins[1].data(), + pruned_mat, + NumComps, + prunedZones); + }; // After I call this, I expect the database to have the following order: - // input_Data: **input_tensors, **inout_tensors - // input_Data: **output_tensors, **inout_tensors + // input_Data: **input_tensors, **inout_tensors + // input_Data: **output_tensors, **inout_tensors // In this example the database will have the following: // Input: |Mat_0|Mat_1|dt|density|qc| Output : |e_mass|density|qc| AMSExecute(wf, OrigComputation, input_tensors, inout_tensors, output_tensors); @@ -125,6 +125,7 @@ void initializeRandom(real_t *data, int main(int argc, char *argv[]) { + AMSInit(); int numZones = std::atoi(argv[1]); int numComps = std::atoi(argv[2]); real_t *actualDensity = new real_t[numZones]; @@ -181,4 +182,6 @@ int main(int argc, char *argv[]) } std::cout << "\n"; } + AMSFinalize(); + return 0; } From 0443e09f65da62567c2c194c6346919e015caad2 Mon Sep 17 00:00:00 2001 From: koparasy Date: Wed, 16 Apr 2025 13:10:47 -0700 Subject: [PATCH 069/136] Moving files of testing --- tests/AMSlib/{ => perf_regression}/ams_bench_db.cpp | 0 tests/{ => AMSlib}/utils.hpp | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename tests/AMSlib/{ => perf_regression}/ams_bench_db.cpp (100%) rename tests/{ => AMSlib}/utils.hpp (100%) diff --git a/tests/AMSlib/ams_bench_db.cpp b/tests/AMSlib/perf_regression/ams_bench_db.cpp similarity index 100% rename from tests/AMSlib/ams_bench_db.cpp rename to tests/AMSlib/perf_regression/ams_bench_db.cpp diff --git a/tests/utils.hpp b/tests/AMSlib/utils.hpp similarity index 100% rename from tests/utils.hpp rename to tests/AMSlib/utils.hpp From de5ec2028bb78f0f6944a6f2b6ec9a8f069f29fd Mon Sep 17 00:00:00 2001 From: koparasy Date: Wed, 16 Apr 2025 14:10:13 -0700 Subject: [PATCH 070/136] Fix defines and tests --- CMakeLists.txt | 7 +- src/AMSlib/AMS.cpp | 4 +- src/AMSlib/CMakeLists.txt | 1 + src/AMSlib/macro.h | 3 +- src/AMSlib/wf/basedb.hpp | 22 +- src/AMSlib/wf/device.hpp | 2 +- src/AMSlib/wf/resource_manager.cpp | 14 +- src/AMSlib/wf/resource_manager.hpp | 2 +- src/AMSlib/wf/workflow.hpp | 10 +- tests/AMSlib/CMakeLists.txt | 1 + tests/AMSlib/ams_interface/ams_ete.cpp | 15 +- tests/AMSlib/perf_regression/ams_bench_db.cpp | 206 ++++++-------- tests/AMSlib/utils.hpp | 260 ++++++++++++++++-- tests/AMSlib/wf/CMakeLists.txt | 10 +- 14 files changed, 353 insertions(+), 204 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5fe5b823..785adf91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,7 @@ if (WITH_MPI) endforeach() list(REMOVE_DUPLICATES MPI_DIRECTORIES) message(STATUS "MPI Liraries: ${MPI_DIRECTORIES}") + list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_MPI__") endif() # ------------------------------------------------------------------------------ @@ -93,14 +94,14 @@ if (WITH_HDF5) set(AMS_HDF5_TARGET hdf5-shared) endif() message(STATUS "HDF5 Dir is ${HDF5_DIR}") - list(APPEND AMS_APP_DEFINES "__ENABLE_HDF5__") + list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_HDF5__") endif() # WITH_HDF5 if (WITH_RMQ) if (WITH_CUDA) add_compile_definitions(THRUST_IGNORE_CUB_VERSION_CHECK) endif() - list(APPEND AMS_APP_DEFINES "__ENABLE_RMQ__") + list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_RMQ__") find_package(amqpcpp REQUIRED) get_target_property(amqpcpp_INCLUDE_DIR amqpcpp INTERFACE_INCLUDE_DIRECTORIES) @@ -143,7 +144,7 @@ endif() if (WITH_PERFFLOWASPECT) find_package(perfflowaspect CONFIG REQUIRED) - list(APPEND AMS_APP_DEFINES "__ENABLE_PERFFLOWASPECT__") + list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_PERFFLOWASPECT__") list(APPEND AMS_APP_LIB_DIRS "${PERFFLOWASPECT_LIB_DIR}") list(APPEND AMS_APP_LIBRARIES "perfflow_runtime") diff --git a/src/AMSlib/AMS.cpp b/src/AMSlib/AMS.cpp index 00520846..041341f2 100644 --- a/src/AMSlib/AMS.cpp +++ b/src/AMSlib/AMS.cpp @@ -7,7 +7,7 @@ #include -#ifdef __ENABLE_MPI__ +#ifdef __AMS_ENABLE_MPI__ #include #endif #include @@ -621,7 +621,7 @@ void AMSConfigureFSDatabase(AMSDBType db_type, const char *db_path) } -#ifdef __ENABLE_MPI__ +#ifdef __AMS_ENABLE_MPI__ AMSExecutor AMSCreateDistributedExecutor(AMSCAbstrModel model, MPI_Comm Comm, int process_id, diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index f78a4ffd..0c06caec 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -22,6 +22,7 @@ get_target_property(AMS_TYPE AMS TYPE) # setup the lib first message(STATUS "ALL INCLUDES ARE ${AMS_APP_INCLUDES}") target_compile_definitions(AMS PRIVATE ${AMS_APP_DEFINES}) +message(STATUS "All AMS Internal Defines are ${AMS_APP_DEFINES}") target_include_directories(AMS PRIVATE $) target_include_directories(AMS PUBLIC diff --git a/src/AMSlib/macro.h b/src/AMSlib/macro.h index 980d4e3e..33483688 100644 --- a/src/AMSlib/macro.h +++ b/src/AMSlib/macro.h @@ -6,7 +6,7 @@ #define CALIPER(stmt) #endif -#ifdef __ENABLE_MPI__ +#ifdef __AMS_ENABLE_MPI__ #include #define MPI_CALL(stmt) \ if (stmt != MPI_SUCCESS) { \ @@ -22,4 +22,3 @@ typedef void *MPI_Comm; #else #define PERFFASPECT() #endif - diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index d2428db0..e6596e33 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -34,7 +34,7 @@ namespace fs = std::experimental::filesystem; -#ifdef __ENABLE_HDF5__ +#ifdef __AMS_ENABLE_HDF5__ #include #include #define HDF5_ERROR(Eid) \ @@ -49,7 +49,7 @@ namespace fs = std::experimental::filesystem; #include #endif -#ifdef __ENABLE_RMQ__ +#ifdef __AMS_ENABLE_RMQ__ #include #include #include @@ -72,7 +72,7 @@ namespace fs = std::experimental::filesystem; #include #include -#endif // __ENABLE_RMQ__ +#endif // __AMS_ENABLE_RMQ__ namespace ams { @@ -206,7 +206,7 @@ class FileDB : public BaseDB }; -#ifdef __ENABLE_HDF5__ +#ifdef __AMS_ENABLE_HDF5__ class hdf5DB final : public FileDB { private: @@ -314,7 +314,7 @@ class hdf5DB final : public FileDB #endif -#ifdef __ENABLE_RMQ__ +#ifdef __AMS_ENABLE_RMQ__ // TODO IMPLEMENT THIS AFTER everything else is working enum class ConnectionStatus { FAILED, CONNECTED, CLOSED, ERROR }; @@ -1651,7 +1651,7 @@ class RMQInterface void close() {} }; -#endif // __ENABLE_RMQ__ +#endif // __AMS_ENABLE_RMQ__ class FilesystemInterface { @@ -1696,7 +1696,7 @@ class FilesystemInterface class DBManager { -#ifdef __ENABLE_RMQ__ +#ifdef __AMS_ENABLE_RMQ__ friend RabbitMQDB; #endif @@ -1707,7 +1707,7 @@ class DBManager /** @brief If True, the DB is allowed to update the surrogate model */ bool updateSurrogate; - DBManager() : dbType(AMSDBType::AMS_NONE), updateSurrogate(false) {}; + DBManager() : dbType(AMSDBType::AMS_NONE), updateSurrogate(false){}; protected: RMQInterface rmq_interface; @@ -1775,14 +1775,14 @@ class DBManager } switch (dbType) { -#ifdef __ENABLE_HDF5__ +#ifdef __AMS_ENABLE_HDF5__ case AMSDBType::AMS_HDF5: return std::make_shared(fs_interface.path(), domainName, dbLabel, rId); #endif -#ifdef __ENABLE_RMQ__ +#ifdef __AMS_ENABLE_RMQ__ case AMSDBType::AMS_RMQ: return std::make_shared(rmq_interface, domainName, @@ -1895,7 +1895,7 @@ class DBManager rmq_cert.c_str()); dbType = AMSDBType::AMS_RMQ; updateSurrogate = update_surrogate; -#ifdef __ENABLE_RMQ__ +#ifdef __AMS_ENABLE_RMQ__ rmq_interface.connect(rmq_user, rmq_pass, rmq_vhost, diff --git a/src/AMSlib/wf/device.hpp b/src/AMSlib/wf/device.hpp index a605fd6a..893075d3 100644 --- a/src/AMSlib/wf/device.hpp +++ b/src/AMSlib/wf/device.hpp @@ -18,7 +18,7 @@ #define UNDEFINED_FUNC -1 -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ namespace ams { void DtoDMemcpy(void *dest, void *src, size_t nBytes); diff --git a/src/AMSlib/wf/resource_manager.cpp b/src/AMSlib/wf/resource_manager.cpp index db25479a..a23a9384 100644 --- a/src/AMSlib/wf/resource_manager.cpp +++ b/src/AMSlib/wf/resource_manager.cpp @@ -8,7 +8,7 @@ #include #include -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ #include #endif @@ -36,7 +36,7 @@ struct AMSDefaultDeviceAllocator final : AMSAllocator { void *allocate(size_t num_bytes, size_t alignment) { -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ void *devPtr; cudaMalloc(&devPtr, num_bytes); return devPtr; @@ -47,7 +47,7 @@ struct AMSDefaultDeviceAllocator final : AMSAllocator { void deallocate(void *ptr) { -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ cudaFree(ptr); #endif } @@ -74,7 +74,7 @@ struct AMSDefaultPinnedAllocator final : AMSAllocator { void *allocate(size_t num_bytes, size_t alignment) { -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ void *ptr; cudaHostAlloc(&ptr, num_bytes, cudaHostAllocPortable); return ptr; @@ -85,7 +85,7 @@ struct AMSDefaultPinnedAllocator final : AMSAllocator { void deallocate(void *ptr) { -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ cudaFreeHost(ptr); #endif } @@ -109,7 +109,7 @@ void _raw_copy(void *src, std::memcpy(dest, src, num_bytes); break; case AMSResourceType::AMS_DEVICE: -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ cudaMemcpy(dest, src, num_bytes, cudaMemcpyHostToDevice); #endif break; @@ -118,7 +118,7 @@ void _raw_copy(void *src, break; } break; -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ case AMSResourceType::AMS_DEVICE: switch (dest_dev) { case AMSResourceType::AMS_DEVICE: diff --git a/src/AMSlib/wf/resource_manager.hpp b/src/AMSlib/wf/resource_manager.hpp index 4154dffa..20eb64f4 100644 --- a/src/AMSlib/wf/resource_manager.hpp +++ b/src/AMSlib/wf/resource_manager.hpp @@ -155,7 +155,7 @@ class ResourceManager std::string pinned_alloc("PINNED"); if (!RMAllocators[AMSResourceType::AMS_HOST]) setAllocator(host_alloc, AMSResourceType::AMS_HOST); -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ if (!RMAllocators[AMSResourceType::AMS_DEVICE]) setAllocator(host_alloc, AMSResourceType::AMS_DEVICE); diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index f5a75930..8b42c0d2 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -66,7 +66,7 @@ class AMSWorkflow /** @brief The maximum distance of the predicate for a sample prediction to be considered as valid **/ const float threshold; -#ifdef __ENABLE_MPI__ +#ifdef __AMS_ENABLE_MPI__ /** @brief MPI Communicator for all ranks that call collectively the evaluate function **/ MPI_Comm comm; #endif @@ -104,7 +104,7 @@ class AMSWorkflow { if (!DB || !DB->allowModelUpdate()) return false; bool local = DB->updateModel(); -#ifdef __ENABLE_MPI__ +#ifdef __AMS_ENABLE_MPI__ bool global = false; MPI_Allreduce(&local, &global, 1, MPI_CXX_BOOL, MPI_LAND, comm); return global; @@ -126,7 +126,7 @@ class AMSWorkflow rId(_pId), wSize(_wSize), uqPolicy(uq_policy), -#ifdef __ENABLE_MPI__ +#ifdef __AMS_ENABLE_MPI__ comm(MPI_COMM_NULL), #endif threshold(threshold), @@ -151,7 +151,7 @@ class AMSWorkflow } -#ifdef __ENABLE_MPI__ +#ifdef __AMS_ENABLE_MPI__ void set_communicator(MPI_Comm communicator) { comm = communicator; } #endif @@ -159,7 +159,7 @@ class AMSWorkflow bool should_load_balance() const { -#ifdef __ENABLE_MPI__ +#ifdef __AMS_ENABLE_MPI__ return (comm != MPI_COMM_NULL && ePolicy == AMSExecPolicy::AMS_BALANCED); #else return false; diff --git a/tests/AMSlib/CMakeLists.txt b/tests/AMSlib/CMakeLists.txt index 4b0b5f9a..1cbfbca0 100644 --- a/tests/AMSlib/CMakeLists.txt +++ b/tests/AMSlib/CMakeLists.txt @@ -7,6 +7,7 @@ add_subdirectory(models) add_subdirectory(torch) add_subdirectory(db) add_subdirectory(wf) +add_subdirectory(perf_regression) if (WITH_HDF5) add_subdirectory(ams_interface) endif() diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp index 8600a741..64e4a93e 100644 --- a/tests/AMSlib/ams_interface/ams_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -11,24 +11,13 @@ #include #include +#include "../utils.hpp" #include "AMS.h" #include "ml/surrogate.hpp" #include "wf/debug.h" using namespace ams; -AMSDType getDataType(char *d_type) -{ - AMSDType dType = AMSDType::AMS_DOUBLE; - if (std::strcmp(d_type, "float") == 0) { - dType = AMSDType::AMS_SINGLE; - } else if (std::strcmp(d_type, "double") == 0) { - dType = AMSDType::AMS_DOUBLE; - } else { - assert(false && "Unknown data type"); - } - return dType; -} template struct Problem { @@ -179,8 +168,6 @@ int main(int argc, char **argv) AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); if (data_type == AMSDType::AMS_SINGLE) { Problem prob(num_inputs, num_outputs); - - prob.ams_run(wf, resource, num_iterations, avg_elements); } else { Problem prob(num_inputs, num_outputs); diff --git a/tests/AMSlib/perf_regression/ams_bench_db.cpp b/tests/AMSlib/perf_regression/ams_bench_db.cpp index 9efc1444..7b4abb3f 100644 --- a/tests/AMSlib/perf_regression/ams_bench_db.cpp +++ b/tests/AMSlib/perf_regression/ams_bench_db.cpp @@ -6,45 +6,23 @@ #include #endif +#include + #include -#include #include +#include #include -#include +#include #include +#include #include - -#include - -#include "AMS.h" +#include +#include #include "../utils.hpp" +#include "AMS.h" +#include "macro.h" -AMSDType getDataType(const char *d_type) -{ - AMSDType dType = AMSDType::AMS_DOUBLE; - if (std::strcmp(d_type, "float") == 0) { - dType = AMSDType::AMS_SINGLE; - } else if (d_type == "double") { - dType = AMSDType::AMS_DOUBLE; - } else { - assert(false && "Unknown data type (must be 'float' or 'double')"); - } - return dType; -} - -AMSDBType getDBType(const char *db_type) -{ - AMSDBType dbType = AMSDBType::AMS_NONE; - if (std::strcmp(db_type, "csv") == 0) { - dbType = AMSDBType::AMS_CSV; - } else if (std::strcmp(db_type, "hdf5") == 0) { - dbType = AMSDBType::AMS_HDF5; - } else if (std::strcmp(db_type, "rmq") == 0) { - dbType = AMSDBType::AMS_RMQ; - } - return dbType; -} template struct Problem { @@ -71,7 +49,7 @@ struct Problem { std::this_thread::sleep_for(std::chrono::milliseconds(sleep_msec)); } - const DType *initialize_inputs(DType *inputs, long length) + DType *initialize_inputs(DType *inputs, long length) { for (int i = 0; i < length; i++) { inputs[i] = static_cast(i); @@ -84,65 +62,83 @@ struct Problem { int iterations, int num_elements) { - CALIPER(CALI_CXX_MARK_FUNCTION;) + CALIPER(CALI_CXX_MARK_FUNCTION); CALIPER(CALI_CXX_MARK_LOOP_BEGIN(mainloop_id, "mainloop");) for (int i = 0; i < iterations; i++) { std::cout << "Iteration [" << i << "]\n"; - CALIPER(CALI_CXX_MARK_LOOP_ITERATION(mainloop_id, i);) - int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; - std::vector inputs; - std::vector outputs; + + SmallVector input_tensors; + SmallVector output_tensors; // Allocate Input memory for (int j = 0; j < num_inputs; j++) { - DType *data = new DType[elements]; - inputs.push_back(initialize_inputs(data, elements)); + DType *data = new DType[num_elements]; + DType *ptr = initialize_inputs(data, num_elements); + input_tensors.push_back(AMSTensor::view( + ptr, + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } // Allocate Output memory for (int j = 0; j < num_outputs; j++) { - outputs.push_back(new DType[elements]); + auto tmp = new DType[num_elements]; + output_tensors.push_back(AMSTensor::view( + initialize_inputs(tmp, num_elements), + SmallVector({num_elements, 1}), + SmallVector({1, 1}), + resource)); } - AMSExecute(wf, - (void *)this, - elements, - reinterpret_cast(inputs.data()), - reinterpret_cast(outputs.data()), - inputs.size(), - outputs.size()); - - for (int i = 0; i < num_outputs; i++) { - delete[] outputs[i]; - outputs[i] = nullptr; + EOSLambda OrigComputation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + DType *ins[num_inputs]; + DType *outs[num_outputs]; + if (num_inputs != ams_ins.size()) + throw std::runtime_error( + "Expecting dimensions of inputs to remain the same"); + else if (num_outputs != ams_outs.size()) + throw std::runtime_error( + "Expecting dimensions of outputs to remain the same"); + + // Here I can use domain knowledge (inouts is empty) + int num_elements = ams_ins[0].shape()[0]; + for (int i = 0; i < num_inputs; i++) { + ins[i] = ams_ins[i].data(); + if (ams_ins[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + for (int i = 0; i < num_outputs; i++) { + outs[i] = ams_outs[i].data(); + if (ams_outs[i].shape()[0] != num_elements) + throw std::runtime_error( + "Expected tensors to have the same shape"); + } + run(num_elements, ins, outs); + }; + + ams::SmallVector inouts; + AMSExecute(wf, OrigComputation, input_tensors, inouts, output_tensors); + + for (int i = 0; i < input_tensors.size(); i++) { + delete input_tensors[i].data(); } - for (int i = 0; i < num_inputs; i++) { - delete[] inputs[i]; - inputs[i] = nullptr; + + + for (int i = 0; i < output_tensors.size(); i++) { + delete output_tensors[i].data(); } + CALIPER(CALI_CXX_MARK_LOOP_ITERATION(mainloop_id, i);) } - CALIPER(CALI_CXX_MARK_LOOP_END(mainloop_id);) } }; -void callBackDouble(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << " > Called the double precision model\n"; - static_cast *>(cls)->run(elements, - (double **)(inputs), - (double **)(outputs)); -} - -void callBackSingle(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << " > Called the single precision model\n"; - static_cast *>(cls)->run(elements, - (float **)(inputs), - (float **)(outputs)); -} - int main(int argc, char **argv) { // Number of ranks in this run @@ -164,10 +160,10 @@ int main(int argc, char **argv) std::cout.setstate(std::ios::failbit); } - const char *device_name = "cpu"; - const char *db_config = ""; - const char *db_type = ""; - const char *precision_opt = "double"; + std::string device_name = "cpu"; + std::string db_config = ""; + std::string db_type = ""; + std::string precision_opt = "double"; int seed = 0; int num_elems = 1024; @@ -180,7 +176,7 @@ int main(int argc, char **argv) // ------------------------------------------------------------------------- // setup command line parser // ------------------------------------------------------------------------- - mfem::OptionsParser args(argc, argv); + TestArgs args; args.AddOption(&device_name, "-d", "--device", @@ -219,24 +215,19 @@ int main(int argc, char **argv) "\t 'hdf5': use HDF5 as a back end\n" "\t 'rmq': use RabbitMQ as a back end\n"); - args.AddOption(&verbose, - "-v", - "--verbose", - "-qu", - "--quiet", - "Enable more verbose benchmark"); + args.AddOption(&verbose, "-v", "--verbose", "Enable more verbose benchmark"); // ------------------------------------------------------------------------- // parse arguments // ------------------------------------------------------------------------- - args.Parse(); + args.Parse(argc, argv); if (!args.Good()) { - args.PrintUsage(std::cout); + args.PrintOptions(); return -1; } if (rId == 0) { - args.PrintOptions(std::cout); + args.PrintUsage(); std::cout << std::endl; } @@ -261,9 +252,9 @@ int main(int argc, char **argv) // AMS allocators setup // ------------------------------------------------------------------------- AMSResourceType resource = AMSResourceType::AMS_HOST; - const bool use_device = std::strcmp(device_name, "cpu") != 0; + const bool use_device = device_name == "cpu"; if (use_device) { -#ifdef __ENABLE_CUDA__ +#ifdef __AMS_ENABLE_CUDA__ resource = AMSResourceType::AMS_DEVICE; #else std::cerr << "Error: Benchmark has not been compiled with CUDA support\n"; @@ -275,55 +266,24 @@ int main(int argc, char **argv) AMSUQPolicy::AMS_RANDOM, 0.5, "", - "", - "bench_db_no_model", - 1); + "bench_db_no_model"); + std::cout << "Total elements across all " << wS << " ranks: " << wS * num_elems << "\n"; std::cout << "Total elements per rank: " << num_elems << "\n"; + AMSExecutor wf = AMSCreateExecutor(ams_model, rId, wS); if (data_type == AMSDType::AMS_SINGLE) { Problem prob(num_inputs, num_outputs, sleep_msec); -#ifdef __ENABLE_MPI__ - AMSExecutor wf = AMSCreateDistributedExecutor(ams_model, - AMSDType::AMS_SINGLE, - resource, - (AMSPhysicFn)callBackSingle, - MPI_COMM_WORLD, - rId, - wS); -#else - AMSExecutor wf = AMSCreateExecutor(ams_model, - AMSDType::AMS_SINGLE, - resource, - (AMSPhysicFn)callBackSingle, - rId, - wS); -#endif prob.ams_run(wf, resource, num_iterations, num_elems); } else { Problem prob(num_inputs, num_outputs, sleep_msec); -#ifdef __ENABLE_MPI__ - AMSExecutor wf = AMSCreateDistributedExecutor(ams_model, - AMSDType::AMS_DOUBLE, - resource, - (AMSPhysicFn)callBackDouble, - MPI_COMM_WORLD, - rId, - wS); -#else - AMSExecutor wf = AMSCreateExecutor(ams_model, - AMSDType::AMS_DOUBLE, - resource, - (AMSPhysicFn)callBackDouble, - rId, - wS); -#endif + prob.ams_run(wf, resource, num_iterations, num_elems); prob.ams_run(wf, resource, num_iterations, num_elems); } MPI_CALL(MPI_Finalize()); AMSFinalize(); return 0; -} \ No newline at end of file +} diff --git a/tests/AMSlib/utils.hpp b/tests/AMSlib/utils.hpp index bef7b939..1f94eabb 100644 --- a/tests/AMSlib/utils.hpp +++ b/tests/AMSlib/utils.hpp @@ -5,45 +5,245 @@ * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception */ - #ifndef __TEST_UTILS__ - #define __TEST_UTILS__ - -#include -#include +#ifndef __TEST_UTILS__ +#define __TEST_UTILS__ + #include +#include + +#include + +#include "AMS.h" + +#ifdef __AMS_ENABLE_MPI__ +#include +#define MPI_CALL(stmt) \ + if (stmt != MPI_SUCCESS) { \ + fprintf(stderr, "Error in MPI-Call (File: %s, %d)\n", __FILE__, __LINE__); \ + } +#else +typedef void* MPI_Comm; +#define MPI_CALL(stm) +#endif + +using namespace ams; + +static inline AMSDType getDataType(const char* d_type) +{ + AMSDType dType = AMSDType::AMS_DOUBLE; + if (std::strcmp(d_type, "float") == 0) { + dType = AMSDType::AMS_SINGLE; + } else if (std::strcmp(d_type, "double") == 0) { + dType = AMSDType::AMS_DOUBLE; + } else { + assert(false && "Unknown data type (must be 'float' or 'double')"); + } + return dType; +} + +static inline AMSDType getDataType(std::string& d_type) +{ + AMSDType dType = AMSDType::AMS_DOUBLE; + if (d_type == "float") { + dType = AMSDType::AMS_SINGLE; + } else if (d_type == "double") { + dType = AMSDType::AMS_DOUBLE; + } else { + assert(false && "Unknown data type (must be 'float' or 'double')"); + } + return dType; +} + + +static inline AMSDBType getDBType(const char* db_type) +{ + AMSDBType dbType = AMSDBType::AMS_NONE; + if (std::strcmp(db_type, "csv") == 0) { + dbType = AMSDBType::AMS_CSV; + } else if (std::strcmp(db_type, "hdf5") == 0) { + dbType = AMSDBType::AMS_HDF5; + } else if (std::strcmp(db_type, "rmq") == 0) { + dbType = AMSDBType::AMS_RMQ; + } + return dbType; +} + +static inline AMSDBType getDBType(std::string db_type) +{ + AMSDBType dbType = AMSDBType::AMS_NONE; + if (db_type == "csv") { + dbType = AMSDBType::AMS_CSV; + } else if (db_type == "hdf5") { + dbType = AMSDBType::AMS_HDF5; + } else if (db_type == "rmq") { + dbType = AMSDBType::AMS_RMQ; + } + return dbType; +} + // Signal handler to print the stack trace -void signalHandler(int signum) { - const char* msg = "[signalHandler] Caught signal\n"; - write(STDERR_FILENO, msg, sizeof(msg)); +static inline void signalHandler(int signum) +{ + const char* msg = "[signalHandler] Caught signal\n"; + write(STDERR_FILENO, msg, strlen(msg)); - // Obtain the backtrace - const int maxFrames = 128; - void *addrlist[maxFrames]; + // Obtain the backtrace + const int maxFrames = 128; + void* addrlist[maxFrames]; - // Get void*'s for all entries on the stack - int addrlen = backtrace(addrlist, maxFrames); + // Get void*'s for all entries on the stack + int addrlen = backtrace(addrlist, maxFrames); - if (addrlen == 0) { - const char* no_stack = "No stack trace available\n"; - write(STDERR_FILENO, no_stack, sizeof(no_stack)); - _exit(1); // _exit() Cannot be trap, interrupted - } + if (addrlen == 0) { + const char* no_stack = "No stack trace available\n"; + write(STDERR_FILENO, no_stack, strlen(no_stack)); + _exit(1); // _exit() Cannot be trap, interrupted + } - // Print out all the frames to stderr - backtrace_symbols_fd(addrlist, addrlen, STDERR_FILENO); - _exit(1); + // Print out all the frames to stderr + backtrace_symbols_fd(addrlist, addrlen, STDERR_FILENO); + _exit(1); } -void installSignals() { - std::signal(SIGSEGV, signalHandler); // segmentation fault - std::signal(SIGABRT, signalHandler); // abort() - std::signal(SIGFPE, signalHandler); // floating-point exception - std::signal(SIGILL, signalHandler); // illegal instruction - std::signal(SIGINT, signalHandler); // interrupt (e.g., Ctrl+C) - std::signal(SIGTERM, signalHandler); // termination request - std::signal(SIGPIPE, signalHandler); // broken pipe +static inline void installSignals() +{ + std::signal(SIGSEGV, signalHandler); // segmentation fault + std::signal(SIGABRT, signalHandler); // abort() + std::signal(SIGFPE, signalHandler); // floating-point exception + std::signal(SIGILL, signalHandler); // illegal instruction + std::signal(SIGINT, signalHandler); // interrupt (e.g., Ctrl+C) + std::signal(SIGTERM, signalHandler); // termination request + std::signal(SIGPIPE, signalHandler); // broken pipe } -#endif \ No newline at end of file +class TestArgs +{ +public: + void PrintOptions() const + { + std::cout << "Available options:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << "\n " << opt.help << "\n"; + } + } + + void Parse(int argc, char** argv) + { + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg[0] != '-') continue; + + std::string key = arg; + std::string value; + + // If the next item isn't an option, treat it as a value + if (i + 1 < argc && argv[i + 1][0] != '-') { + value = argv[++i]; + } else { + value = "true"; // Boolean flag + } + + options_[key] = value; + } + + // Set parsed values into variables + for (auto& opt : registered_) { + const auto& keys = opt.keys; + for (const auto& key : keys) { + if (options_.count(key)) { + opt.setter(options_[key]); + opt.wasset = true; + break; + } + } + } + } + + template + void AddOption(T* out, + std::string short_opt, + std::string long_opt, + std::string help, + bool required = true) + { + registered_.push_back( + {{short_opt, long_opt}, + [out](const std::string& val) { parseValue(val, out); }, + [out]() { return toString(*out); }, + help, + required, + false}); + } + + bool Good() const + { + for (const auto& opt : registered_) { + if (opt.required && !opt.wasset) { + return false; + } + } + return true; + } + + void PrintUsage() const + { + std::cout << "Parsed arguments:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << " = " << opt.getter() << "\n"; + } + } + +private: + struct RegisteredOption { + std::vector keys; + std::function setter; + std::function getter; + std::string help; + bool required; + bool wasset; + }; + + std::vector registered_; + std::unordered_map options_; + + // Parser helper + template + static void parseValue(const std::string& s, T* out); + + static void parseValue(const std::string& s, std::string* out) { *out = s; } + + static void parseValue(const std::string& s, int* out) + { + *out = std::stoi(s); + } + + static void parseValue(const std::string& s, bool* out) + { + *out = (s == "true" || s == "1"); + } + + static void parseValue(const std::string& s, double* out) + { + *out = std::stod(s); + } + + + static std::string toString(const std::string& val) { return val; } + static std::string toString(bool val) { return val ? "true" : "false"; } + static std::string toString(int val) { return std::to_string(val); } + static std::string toString(double val) { return std::to_string(val); } +}; + +#endif diff --git a/tests/AMSlib/wf/CMakeLists.txt b/tests/AMSlib/wf/CMakeLists.txt index b4041291..4160b6d1 100644 --- a/tests/AMSlib/wf/CMakeLists.txt +++ b/tests/AMSlib/wf/CMakeLists.txt @@ -10,19 +10,18 @@ function(BUILD_UNIT_TEST exe source) target_include_directories(${exe} PRIVATE ${CMAKE_SOURCE_DIR}/src/AMSlib/) target_include_directories(${exe} PRIVATE ${CMAKE_BINARY_DIR}/include/) target_link_libraries(${exe} PRIVATE ${AMS_APP_LIBRARIES} stdc++fs AMS torch) + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) if (WITH_HDF5) target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) endif() - target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) + if(WITH_CUDA) target_link_libraries(${exe} PRIVATE CUDA::cudart) - target_compile_definitions(${exe} PRIVATE __ENABLE_CUDA__ LIBAMS_VERBOSE) endif() if (WITH_CALIPER) - target_compile_definitions(${exe} PRIVATE __AMS_ENABLE_CALIPER__) target_link_libraries(${exe} PRIVATE caliper) endif() @@ -36,8 +35,9 @@ function(BUILD_UNIT_TEST exe source) target_link_libraries(${exe} PRIVATE ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) endif() - target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) - + if (WITH_MPI) + target_link_libraries(${exe} PRIVATE MPI::MPI_CXX) + endif() endfunction() BUILD_UNIT_TEST(domain_to_application domain_to_application.cpp) From 153e9babd08094f585fda8bead5da2c64b8933d6 Mon Sep 17 00:00:00 2001 From: koparasy Date: Wed, 16 Apr 2025 14:13:16 -0700 Subject: [PATCH 071/136] Adding missing cmake file --- tests/AMSlib/perf_regression/CMakeLists.txt | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 tests/AMSlib/perf_regression/CMakeLists.txt diff --git a/tests/AMSlib/perf_regression/CMakeLists.txt b/tests/AMSlib/perf_regression/CMakeLists.txt new file mode 100644 index 00000000..0a0a56b6 --- /dev/null +++ b/tests/AMSlib/perf_regression/CMakeLists.txt @@ -0,0 +1,33 @@ +function(BUILD_TEST exe source) + add_executable(${exe} ${source}) + target_include_directories(${exe} PRIVATE "${PROJECT_SOURCE_DIR}/src/AMSlib/" "${PROJECT_SOURCE_DIR}/src/AMSlib/include" ${caliper_INCLUDE_DIR} ${MPI_INCLUDE_PATH}) + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) + message("On test defines are ${AMS_APP_DEFINES}") + target_link_libraries(${exe} PRIVATE AMS torch) + if (WITH_HDF5) + target_link_libraries(${exe} PRIVATE ${AMS_HDF5_TARGET}) + endif() + if (WITH_CALIPER) + target_link_libraries(${exe} PRIVATE caliper) + endif() + if (WITH_RMQ) + target_link_libraries(${exe} PRIVATE amqpcpp) + if (OPENSSL_FOUND) + target_link_libraries(${exe} PRIVATE OpenSSL::SSL OpenSSL::Crypto) + endif() + # NOTE: We set here the event/event pthreads as public. As there is no easy way + # to do a find package(libevent) and RMQ is not exposing that properly. + target_link_libraries(${exe} PRIVATE ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) + endif() + + if (WITH_MPI) + target_link_libraries(${exe} PRIVATE MPI::MPI_CXX) + endif() +endfunction() + + +# AMS Database benchmark (RMQ and/or HDF5 + MPI / No ML models used) +BUILD_TEST(ams_benchmark_db ams_bench_db.cpp) +# The AMS DB Benchmark requires mfem +# TODO: Remove mfem requirement from the benchmark +target_link_libraries(ams_benchmark_db PRIVATE AMS ${AMS_EXAMPLE_LIBRARIES}) From fee3696230c9eb16d301ec687f40d0e17a96f080 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 21 Apr 2025 10:30:46 -0700 Subject: [PATCH 072/136] RMQ Stagers receive tensors --- src/AMSWorkflow/ams/rmq.py | 110 +++++++++--------- src/AMSlib/AMS.cpp | 3 +- src/AMSlib/wf/basedb.hpp | 45 ++++--- src/AMSlib/wf/rmqdb.cpp | 32 ++--- tests/AMSlib/ams_interface/CMakeLists.txt | 4 +- tests/AMSlib/ams_interface/ams_rmq_env.cpp | 14 --- .../ams_interface/json_configs/rmq.json.in | 37 ++---- tests/AMSlib/ams_interface/verify_rmq.py | 82 ++++++++----- 8 files changed, 164 insertions(+), 163 deletions(-) diff --git a/src/AMSWorkflow/ams/rmq.py b/src/AMSWorkflow/ams/rmq.py index d342140b..9a430adb 100644 --- a/src/AMSWorkflow/ams/rmq.py +++ b/src/AMSWorkflow/ams/rmq.py @@ -53,24 +53,22 @@ def header_format(self) -> str: This string represents the AMS format in Python pack format: See https://docs.python.org/3/library/struct.html#format-characters - 1 byte is the size of the header (here 12). Limit max: 255 - - 1 byte is the precision (4 for float, 8 for double). Limit max: 255 - 2 bytes are the MPI rank (0 if AMS is not running with MPI). Limit max: 65535 - 2 bytes to store the size of the MSG domain name. Limit max: 65535 - - 4 bytes are the number of elements in the message. Limit max: 2^32 - 1 - 2 bytes are the input dimension. Limit max: 65535 - 2 bytes are the output dimension. Limit max: 65535 - - 2 bytes are for aligning memory to 8 + - 3 bytes are for aligning memory to 4 - |_Header_|_Datatype_|_Rank_|_DomainSize_|_#elems_|_InDim_|_OutDim_|_Pad_|_DomainName_|.Real_Data.| + |_Header_|_Rank_|_DomainSize_|_InDim_|_OutDim_|_Pad_|_DomainName_|.Real_Data.| - Then the data starts at byte 16 with the domain name, then the real data and + Then the data starts at byte 12 with the domain name, then the real data and is structured as pairs of input/outputs. Let K be the total number of elements, - then we have K pairs of inputs/outputs (either float or double): + then we have K inputs followed by K outputs: - |__Header_(16B)__|_Domain_Name_|__Input 1__|__Output 1__|...|__Input_K__|__Output_K__| + |__Header_(16B)__|_Domain_Name_|__Input 1__|...|__Input_K__|__Output_1__|... """ - return "BBHHIHHH" + return "BHHHH3x" def endianness(self) -> str: """ @@ -90,7 +88,7 @@ def encode( """ For debugging and testing purposes, this function encode a message identical to what AMS would send """ - header_format = self.ams_endianness() + self.ams_header_format() + header_format = self.endianness() + self.ams_header_format() hsize = struct.calcsize(header_format) assert dtype_byte in [4, 8] dt = "f" if dtype_byte == 4 else "d" @@ -127,29 +125,13 @@ def _parse_header(self, body: str) -> dict: # Parse header ( res["hsize"], - res["datatype"], res["mpirank"], res["domain_size"], - res["num_element"], res["input_dim"], res["output_dim"], - res["padding"], ) = struct.unpack(fmt, body[:hsize]) - assert hsize == res["hsize"], f"Hsize is {hsize} expected value is {res['hsize']}" - assert res["datatype"] in [4, 8] - if len(body) < hsize: - print(f"Incomplete message of size {len(body)}. Header should be of size {hsize}. skipping") - return {} - - # Theoritical size in Bytes for the incoming message (without the header) - # Int() is needed otherwise we might overflow here (because of uint16 / uint8) - res["dsize"] = int(res["datatype"]) * int(res["num_element"]) * (int(res["input_dim"]) + int(res["output_dim"])) - res["msg_size"] = hsize + res["dsize"] - res["multiple_msg"] = len(body) != res["msg_size"] - self.num_elements = int(res["num_element"]) self.hsize = int(res["hsize"]) - self.dtype_byte = int(res["datatype"]) self.mpi_rank = int(res["mpirank"]) self.domain_name_size = int(res["domain_size"]) self.input_dim = int(res["input_dim"]) @@ -157,53 +139,74 @@ def _parse_header(self, body: str) -> dict: return res + def _parse_tensor(self, body: str, offset: int): + print("Parsing tensor") + start = offset + (num_dims,) = struct.unpack_from(self.endianness() + "Q", body, offset) + offset += 8 + + (total_bytes,) = struct.unpack_from(self.endianness() + "Q", body, offset) + offset += 8 + print("Total bytes are", total_bytes) + + shapes_fmt = self.endianness() + "Q" * num_dims + print("Format is " , shapes_fmt) + shapes = struct.unpack_from(shapes_fmt, body, offset) + offset += 8 * num_dims + + strides = struct.unpack_from(shapes_fmt, body, offset) + offset += 8 * num_dims + + print("Offset is", offset, " diff is ", offset - start, start) + tensor_data = body[offset : offset + total_bytes] + offset += total_bytes + + return num_dims, shapes, strides, tensor_data, offset + def _parse_data(self, body: str, header_info: dict) -> Tuple[str, np.array, np.array]: data = np.array([]) if len(body) == 0: return data hsize = header_info["hsize"] - dsize = header_info["dsize"] domain_name_size = header_info["domain_size"] domain_name = body[hsize : hsize + domain_name_size] domain_name = domain_name.decode("utf-8") - try: - if header_info["datatype"] == 4: # if datatype takes 4 bytes (float) - data = np.frombuffer( - body[hsize + domain_name_size : hsize + domain_name_size + dsize], - dtype=np.float32, - ) - else: - data = np.frombuffer( - body[hsize + domain_name_size : hsize + domain_name_size + dsize], - dtype=np.float64, - ) - except ValueError as e: - print(f"Error: {e} => {header_info}") - return np.array([]) - - idim = header_info["input_dim"] - odim = header_info["output_dim"] - data = data.reshape((idim + odim, -1)).transpose() + inputs = [] + offset = hsize + domain_name_size + dtype=np.dtype(self.endianness() + "f4") + print(f"hsize is {hsize} and domain size is {domain_name_size} of name {domain_name} offset is {offset}") + for i in range(0, header_info["input_dim"]): + num_dims, shapes, strides, data, offset = self._parse_tensor(body, offset) + ndarray = np.ndarray(shape=shapes, dtype=dtype, buffer=data, strides=tuple(s * dtype.itemsize for s in strides)) + inputs.append(ndarray) + + outputs = [] + for i in range(0, header_info["output_dim"]): + num_dims, shapes, strides, data, offset = self._parse_tensor(body, offset) + ndarray = np.ndarray(shape=shapes, dtype=dtype, buffer=data, strides=tuple(s * dtype.itemsize for s in strides )) + outputs.append(ndarray) + # Return input, output - return (domain_name, data[:, :idim], data[:, idim:]) + + return offset, (domain_name, np.concatenate(inputs, axis=-1), np.concatenate(outputs, axis=-1)) def _decode(self, body: str) -> Tuple[np.array]: - input = [] - output = [] + inputs = [] + outputs = [] # Multiple AMS messages could be packed in one RMQ message # TODO: we should manage potential mutliple messages per AMSMessage better while body: header_info = self._parse_header(body) - domain_name, temp_input, temp_output = self._parse_data(body, header_info) + print(f"Message header info {header_info}") + offset, (domain_name, temp_input, temp_output) = self._parse_data(body, header_info) # print(f"MSG: {domain_name} input shape {temp_input.shape} outpute shape {temp_output.shape}") # total size of byte we read for that message - chunk_size = header_info["hsize"] + header_info["dsize"] + header_info["domain_size"] - input.append(temp_input) - output.append(temp_output) + inputs.append(temp_input) + outputs.append(temp_output) # We remove the current message and keep going - body = body[chunk_size:] + body = body[offset:] self.domain_names.append(domain_name) - return domain_name, np.concatenate(input), np.concatenate(output) + return domain_name, np.concatenate(inputs), np.concatenate(outputs) def decode(self) -> Tuple[str, np.array, np.array]: return self._decode(self.body) @@ -211,6 +214,7 @@ def decode(self) -> Tuple[str, np.array, np.array]: def default_ams_callback(method, properties, body): """Simple callback that decode incoming message assuming they are AMS binary messages""" + print("I am here") return AMSMessage(body) diff --git a/src/AMSlib/AMS.cpp b/src/AMSlib/AMS.cpp index 041341f2..c1817395 100644 --- a/src/AMSlib/AMS.cpp +++ b/src/AMSlib/AMS.cpp @@ -95,7 +95,8 @@ struct AMSAbstractModel { path = jRoot["model_path"].get(); CFATAL(AMS, (!path.empty() && !fs::exists(path)), - "Path to model does not exist\n"); + "Path '%s' to model does not exist\n", + path.c_str()); } return path; } diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index e6596e33..0c3749a4 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -327,7 +327,7 @@ enum class ConnectionStatus { FAILED, CONNECTED, CLOSED, ERROR }; * - 2 bytes to store the size of the MSG domain name. Limit max: 65535 * - 2 bytes are the number of input tensors . Limit max: 65535 * - 2 bytes are the number of output tensors . Limit max: 65535 - * - 2 bytes for padding. Limit max: 2^16 - 1 + * - 3 bytes for padding. Limit max: 2^16 - 1 * * |_Header_|___Rank___|__DomainSize__|___InDim____|___OutDim___|_Pad_|.real data.| * ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ @@ -384,9 +384,9 @@ struct AMSMsgHeader { static size_t constexpr size() { return ((sizeof(hsize) + sizeof(mpi_rank) + sizeof(domain_size) + - sizeof(in_dim) + sizeof(out_dim) + sizeof(double) - 1) / - sizeof(double)) * - sizeof(double); + sizeof(in_dim) + sizeof(out_dim) + sizeof(float) - 1) / + sizeof(float)) * + sizeof(float); } /** @@ -404,6 +404,16 @@ struct AMSMsgHeader { static AMSMsgHeader decode(uint8_t* data_blob); }; +template +static inline size_t serialize_data(uint8_t* dest, T src) +{ + uint8_t* ptr = reinterpret_cast(&src); + for (int i = 0; i < sizeof(T); i++) { + dest[i] = ptr[i]; + } + + return sizeof(T); +} /** * @brief Class representing a message for the AMSLib @@ -423,25 +433,30 @@ class AMSMessage return totalBytes + tensor.nbytes(); } - static void serializeTensor(const torch::Tensor& tensor, uint8_t*& blob) + static void serializeTensorHeader(const torch::Tensor& tensor, uint8_t*& blob) { - *reinterpret_cast(blob) = tensor.sizes().size(); - blob += sizeof(size_t); + blob += serialize_data(blob, static_cast(tensor.sizes().size())); + blob += serialize_data(blob, static_cast(tensor.nbytes())); for (auto& V : tensor.sizes()) { - *reinterpret_cast(blob) = static_cast(V); - blob += sizeof(size_t); + blob += serialize_data(blob, static_cast(V)); } - // Copy in for (auto& V : tensor.strides()) { - *reinterpret_cast(blob) = static_cast(V); - blob += sizeof(size_t); + blob += serialize_data(blob, static_cast(V)); } + } - *reinterpret_cast(blob) = static_cast(tensor.nbytes()); - blob += sizeof(size_t); + static void serializeTensor(const torch::Tensor& tensor, uint8_t*& blob) + { + auto start = blob; + serializeTensorHeader(tensor, blob); + auto afterHeader = blob; std::memcpy(blob, tensor.data_ptr(), tensor.nbytes()); blob += tensor.nbytes(); + auto afterData = blob; + + std::cout << "Distance to header " << (int64_t)((intptr_t) afterHeader - (intptr_t) start) << "\n"; + std::cout << "Distance from header to data " << (int64_t)((intptr_t) afterData - (intptr_t) afterHeader) << "\n"; } public: @@ -506,6 +521,7 @@ class AMSMessage AMSMsgHeader header(_rank, domain_name.size(), _input_dim, _output_dim); _total_size = AMSMsgHeader::size() + domain_name.size(); + std::cout << "Header size is :" << AMSMsgHeader::size() << " and domain size: " << domain_name.size() << "\n"; for (auto& tensor : _inputs) _total_size += computeSerializedSize(tensor); for (auto& tensor : _outputs) @@ -1510,6 +1526,7 @@ class RMQInterface ArrayRef Inputs, ArrayRef Outputs) { + CALIPER(CALI_MARK_BEGIN("STORE_RMQ");) DBG(RMQInterface, "[tag=%d] stores %ld elements of input/output " "dimensions (%ld, %ld)", diff --git a/src/AMSlib/wf/rmqdb.cpp b/src/AMSlib/wf/rmqdb.cpp index 65d9ed97..b398f99d 100644 --- a/src/AMSlib/wf/rmqdb.cpp +++ b/src/AMSlib/wf/rmqdb.cpp @@ -44,28 +44,20 @@ size_t AMSMsgHeader::encode(uint8_t* data_blob) if (!data_blob) return 0; size_t current_offset = 0; - // Header size (should be 1 bytes) - data_blob[current_offset] = hsize; - current_offset += sizeof(hsize); // MPI rank (should be 2 bytes) - std::memcpy(data_blob + current_offset, &(mpi_rank), sizeof(mpi_rank)); - current_offset += sizeof(mpi_rank); + current_offset += serialize_data(&data_blob[current_offset], hsize); + current_offset += serialize_data(&data_blob[current_offset], mpi_rank); + current_offset += serialize_data(&data_blob[current_offset], domain_size); + current_offset += + serialize_data(&data_blob[current_offset], static_cast(in_dim)); + current_offset += + serialize_data(&data_blob[current_offset], static_cast(out_dim)); + // Domain Size (should be 2 bytes) DBG(AMSMsgHeader, - "Generating domain name of size %d --- %lu offset %lu", + "Generating domain name of size %d --- %lu", domain_size, - sizeof(domain_size), - current_offset); - std::memcpy(data_blob + current_offset, &(domain_size), sizeof(domain_size)); - current_offset += sizeof(domain_size); - // Input dim (should be 2 bytes) - std::memcpy(data_blob + current_offset, &(in_dim), sizeof(in_dim)); - *reinterpret_cast(data_blob) = static_cast(in_dim); - current_offset += sizeof(in_dim); - // Output dim (should be 2 bytes) - *reinterpret_cast(data_blob) = static_cast(out_dim); - current_offset += sizeof(out_dim); - + sizeof(domain_size)); return AMSMsgHeader::size(); } @@ -139,7 +131,7 @@ AMSMessageInbound::AMSMessageInbound(uint64_t id, body(std::move(body)), exchange(std::move(exchange)), routing_key(std::move(routing_key)), - redelivered(redelivered) {}; + redelivered(redelivered){}; bool AMSMessageInbound::empty() { return body.empty() || routing_key.empty(); } @@ -296,4 +288,4 @@ void AMQPHandler::onClosed(AMQP::TcpConnection* connection) void AMQPHandler::onReady(AMQP::TcpConnection* connection) { DBG(AMQPHandler, "Connection established and ready") -} \ No newline at end of file +} diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index e9e93222..2e1d129b 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -69,7 +69,7 @@ function(INTEGRATION_TEST_RMQ) endif() set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") CHECK_RMQ_CONFIG(${JSON_FP}) - add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 8 8 \"double\" 2 128; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 8 8 \"double\" 2 128") + #add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 8 8 \"double\" 2 128; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 8 8 \"double\" 2 128") endfunction() function (INTEGRATION_TEST) @@ -187,5 +187,5 @@ BUILD_TEST(ams_multi_model_end_to_end_env ams_multi_model_ete_env.cpp) #BUILD_TEST(ams_rmq ams_rmq_env.cpp) -#INTEGRATION_TEST_RMQ() +INTEGRATION_TEST_RMQ() # diff --git a/tests/AMSlib/ams_interface/ams_rmq_env.cpp b/tests/AMSlib/ams_interface/ams_rmq_env.cpp index f037e1dc..18cb0001 100644 --- a/tests/AMSlib/ams_interface/ams_rmq_env.cpp +++ b/tests/AMSlib/ams_interface/ams_rmq_env.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include #include @@ -15,19 +14,6 @@ #include "AMS.h" #include "wf/debug.h" -AMSDType getDataType(char *d_type) -{ - AMSDType dType = AMSDType::AMS_DOUBLE; - if (std::strcmp(d_type, "float") == 0) { - dType = AMSDType::AMS_SINGLE; - } else if (std::strcmp(d_type, "double") == 0) { - dType = AMSDType::AMS_DOUBLE; - } else { - assert(false && "Unknown data type"); - } - return dType; -} - template struct Problem { int num_inputs; diff --git a/tests/AMSlib/ams_interface/json_configs/rmq.json.in b/tests/AMSlib/ams_interface/json_configs/rmq.json.in index c3ac11c3..72e8aa2d 100644 --- a/tests/AMSlib/ams_interface/json_configs/rmq.json.in +++ b/tests/AMSlib/ams_interface/json_configs/rmq.json.in @@ -18,72 +18,56 @@ "ml_models" : { "random_50": { "uq_type": "random", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/linear_scripted_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/linear_scripted_single_cpu_random.pt", "uq_aggregate": "mean", "threshold": 0.5, "db_label" : "random_50" }, "random_10": { "uq_type": "random", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/linear_scripted_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/linear_scripted_single_cpu_random.pt", "uq_aggregate": "mean", "threshold": 0.1, "db_label" : "random_10" }, "duq_mean": { "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_mean_double_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/double_cpu_duq_mean.pt", "uq_aggregate": "mean", "threshold": 0.5, "db_label" : "duq_mean" }, "duq_max": { "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_max_double_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/double_cpu_duq_max.pt", "uq_aggregate": "max", "threshold": 0.5, "db_label" : "duq_max" }, - "duq_max_debug": { - "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_max_double_cpu.pt", - "uq_aggregate": "max", - "threshold": 0.5, - "db_label" : "duq_max", - "debug_db" : true - }, - "duq_mean_debug": { - "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_mean_double_cpu.pt", - "uq_aggregate": "mean", - "threshold": 0.5, - "db_label" : "duq_mean", - "debug_db" : true - }, "random_no_db_10": { "uq_type": "random", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/linear_scripted_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/linear_scripted_single_cpu_random.pt", "uq_aggregate": "mean", "threshold": 0.1, "db_label" : "" }, "random_no_db_50": { "uq_type": "random", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/linear_scripted_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/linear_scripted_single_cpu_random.pt", "uq_aggregate": "mean", "threshold": 0.5, "db_label" : "" }, "duq_mean_no_db": { "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_mean_double_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/double_cpu_duq_mean.pt", "uq_aggregate": "mean", "threshold": 0.5, "db_label" : "" }, "duq_max_no_db": { "uq_type": "deltaUQ", - "model_path": "@CMAKE_CURRENT_SOURCE_DIR@/uq_max_double_cpu.pt", + "model_path": "@TORCH_MODEL_DIR@/double_cpu_duq_max.pt", "uq_aggregate": "max", "threshold": 0.5, "db_label" : "" @@ -111,9 +95,6 @@ "app_uq_mean_ndb" : "duq_mean_no_db", "app_uq_max_ndb" : "duq_max_no_db", "app_no_model" : "no_model", - "app_no_model_no_db" : "no_model_no_db", - "app_uq_mean_debug" : "duq_mean_debug", - "app_uq_max_debug" : "duq_max_debug" - + "app_no_model_no_db" : "no_model_no_db" } } diff --git a/tests/AMSlib/ams_interface/verify_rmq.py b/tests/AMSlib/ams_interface/verify_rmq.py index 6917e8cd..971c7d03 100644 --- a/tests/AMSlib/ams_interface/verify_rmq.py +++ b/tests/AMSlib/ams_interface/verify_rmq.py @@ -6,6 +6,7 @@ from ams.rmq import BlockingClient, default_ams_callback + def verify( use_device, num_inputs, @@ -14,8 +15,8 @@ def verify( num_iterations, num_elements, rmq_json, - timeout = None, - domain_test = "rmq_db_no_model" # defined in ams_rmq_env.cpp + timeout=None, + domain_test="rmq_db_no_model", # defined in ams_rmq_env.cpp ): host = rmq_json["service-host"] vhost = rmq_json["rabbitmq-vhost"] @@ -33,47 +34,65 @@ def verify( dtype = 8 with BlockingClient(host, port, vhost, user, password, cert, default_ams_callback) as client: + print(queue) with client.connect(queue) as channel: - msgs = channel.receive(n_msg = num_iterations, timeout = timeout) - - assert len(msgs) == num_iterations, f"Received incorrect number of messsages ({len(msgs)}): expected #msgs ({num_iterations})" - - expected_input = np.array([[0., 0.], - [1., 1.], - [2., 2.], - [3., 3.], - [4., 4.], - [5., 5.], - [6., 6.], - [7., 7.], - [8., 8.], - [9., 9.]] + msgs = channel.receive(n_msg=num_iterations, timeout=timeout) + + assert ( + len(msgs) == num_iterations + ), f"Received incorrect number of messsages ({len(msgs)}): expected #msgs ({num_iterations})" + + expected_input = np.array( + [ + [0.0, 0.0], + [1.0, 1.0], + [2.0, 2.0], + [3.0, 3.0], + [4.0, 4.0], + [5.0, 5.0], + [6.0, 6.0], + [7.0, 7.0], + [8.0, 8.0], + [9.0, 9.0], + ] ) - expected_output = np.array([[ 0., 0.], - [ 2., 2.], - [ 4., 4.], - [ 6., 6.], - [ 8., 8.], - [10., 10.], - [12., 12.], - [14., 14.], - [16., 16.], - [18., 18.]] + expected_output = np.array( + [ + [0.0, 0.0], + [2.0, 2.0], + [4.0, 4.0], + [6.0, 6.0], + [8.0, 8.0], + [10.0, 10.0], + [12.0, 12.0], + [14.0, 14.0], + [16.0, 16.0], + [18.0, 18.0], + ] ) for i, msg in enumerate(msgs): domain, input_data, output_data = msg.decode() - assert msg.num_elements == num_elements, f"Message #{i}: incorrect #elements ({msg.num_element}) vs. expected #elem {num_elements})" - assert msg.input_dim == num_inputs, f"Message #{i}: incorrect #inputs ({msg.input_dim}) vs. expected #inputs {num_inputs})" - assert msg.output_dim == num_outputs, f"Message #{i}: incorrect #outputs ({msg.output_dim}) vs. expected #outputs {num_outputs})" - assert msg.dtype_byte == dtype, f"Message #{i}: incorrect datatype ({msg.dtype_byte} bytes) vs. expected type {dtype} bytes)" + assert ( + msg.num_elements == num_elements + ), f"Message #{i}: incorrect #elements ({msg.num_element}) vs. expected #elem {num_elements})" + assert ( + msg.input_dim == num_inputs + ), f"Message #{i}: incorrect #inputs ({msg.input_dim}) vs. expected #inputs {num_inputs})" + assert ( + msg.output_dim == num_outputs + ), f"Message #{i}: incorrect #outputs ({msg.output_dim}) vs. expected #outputs {num_outputs})" + assert ( + msg.dtype_byte == dtype + ), f"Message #{i}: incorrect datatype ({msg.dtype_byte} bytes) vs. expected type {dtype} bytes)" assert domain == domain_test, f"Message #{i}: incorrect domain name (got {domain}) expected rmq_db_no_model)" assert np.array_equal(input_data, expected_input), f"Message #{i}: incorrect incorrect input data" assert np.array_equal(output_data, expected_output), f"Message #{i}: incorrect incorrect output data" return 0 + def from_json(argv): use_device = int(argv[0]) num_inputs = int(argv[1]) @@ -98,13 +117,14 @@ def from_json(argv): num_iterations, num_elements, rmq_json["db"]["rmq_config"], - timeout = 20 # in seconds + timeout=20, # in seconds ) if res != 0: return res print("[Success] rmq test received") return 0 + if __name__ == "__main__": if "AMS_OBJECTS" in os.environ: sys.exit(from_json(sys.argv[1:])) From d7ddbb0bbe010edfa2c19b469fee75c037e0995f Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 15:38:37 -0700 Subject: [PATCH 073/136] Fix testing --- src/AMSWorkflow/ams/rmq.py | 22 +- src/AMSlib/wf/basedb.hpp | 6 +- tests/AMSlib/ams_interface/CMakeLists.txt | 38 +- .../ams_interface/ams_multi_model_ete_env.cpp | 2 - .../env_2_models_fs_rand_uq.json.in | 2 +- tests/AMSlib/ams_interface/verify_ete.py | 405 ++++++++++++------ 6 files changed, 311 insertions(+), 164 deletions(-) diff --git a/src/AMSWorkflow/ams/rmq.py b/src/AMSWorkflow/ams/rmq.py index 9a430adb..06f4505e 100644 --- a/src/AMSWorkflow/ams/rmq.py +++ b/src/AMSWorkflow/ams/rmq.py @@ -140,24 +140,20 @@ def _parse_header(self, body: str) -> dict: return res def _parse_tensor(self, body: str, offset: int): - print("Parsing tensor") start = offset (num_dims,) = struct.unpack_from(self.endianness() + "Q", body, offset) offset += 8 (total_bytes,) = struct.unpack_from(self.endianness() + "Q", body, offset) offset += 8 - print("Total bytes are", total_bytes) shapes_fmt = self.endianness() + "Q" * num_dims - print("Format is " , shapes_fmt) shapes = struct.unpack_from(shapes_fmt, body, offset) offset += 8 * num_dims strides = struct.unpack_from(shapes_fmt, body, offset) offset += 8 * num_dims - - print("Offset is", offset, " diff is ", offset - start, start) + tensor_data = body[offset : offset + total_bytes] offset += total_bytes @@ -173,17 +169,21 @@ def _parse_data(self, body: str, header_info: dict) -> Tuple[str, np.array, np.a domain_name = domain_name.decode("utf-8") inputs = [] offset = hsize + domain_name_size - dtype=np.dtype(self.endianness() + "f4") - print(f"hsize is {hsize} and domain size is {domain_name_size} of name {domain_name} offset is {offset}") + dtype = np.dtype(self.endianness() + "f4") + for i in range(0, header_info["input_dim"]): num_dims, shapes, strides, data, offset = self._parse_tensor(body, offset) - ndarray = np.ndarray(shape=shapes, dtype=dtype, buffer=data, strides=tuple(s * dtype.itemsize for s in strides)) + ndarray = np.ndarray( + shape=shapes, dtype=dtype, buffer=data, strides=tuple(s * dtype.itemsize for s in strides) + ) inputs.append(ndarray) outputs = [] for i in range(0, header_info["output_dim"]): num_dims, shapes, strides, data, offset = self._parse_tensor(body, offset) - ndarray = np.ndarray(shape=shapes, dtype=dtype, buffer=data, strides=tuple(s * dtype.itemsize for s in strides )) + ndarray = np.ndarray( + shape=shapes, dtype=dtype, buffer=data, strides=tuple(s * dtype.itemsize for s in strides) + ) outputs.append(ndarray) # Return input, output @@ -195,9 +195,9 @@ def _decode(self, body: str) -> Tuple[np.array]: outputs = [] # Multiple AMS messages could be packed in one RMQ message # TODO: we should manage potential mutliple messages per AMSMessage better + while body: header_info = self._parse_header(body) - print(f"Message header info {header_info}") offset, (domain_name, temp_input, temp_output) = self._parse_data(body, header_info) # print(f"MSG: {domain_name} input shape {temp_input.shape} outpute shape {temp_output.shape}") # total size of byte we read for that message @@ -214,7 +214,7 @@ def decode(self) -> Tuple[str, np.array, np.array]: def default_ams_callback(method, properties, body): """Simple callback that decode incoming message assuming they are AMS binary messages""" - print("I am here") + return AMSMessage(body) diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index 0c3749a4..047e3ea5 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -447,16 +447,12 @@ class AMSMessage static void serializeTensor(const torch::Tensor& tensor, uint8_t*& blob) { - auto start = blob; serializeTensorHeader(tensor, blob); auto afterHeader = blob; std::memcpy(blob, tensor.data_ptr(), tensor.nbytes()); blob += tensor.nbytes(); auto afterData = blob; - - std::cout << "Distance to header " << (int64_t)((intptr_t) afterHeader - (intptr_t) start) << "\n"; - std::cout << "Distance from header to data " << (int64_t)((intptr_t) afterData - (intptr_t) afterHeader) << "\n"; } public: @@ -521,7 +517,7 @@ class AMSMessage AMSMsgHeader header(_rank, domain_name.size(), _input_dim, _output_dim); _total_size = AMSMsgHeader::size() + domain_name.size(); - std::cout << "Header size is :" << AMSMsgHeader::size() << " and domain size: " << domain_name.size() << "\n"; + for (auto& tensor : _inputs) _total_size += computeSerializedSize(tensor); for (auto& tensor : _outputs) diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index 2e1d129b..52ac5494 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -5,9 +5,6 @@ endfunction() function(JSON_TESTS db_type) - set(FS_PATH "${CMAKE_CURRENT_BINARY_DIR}") - set(AMS_DB_TEST_TYPE ${db_type}) - set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/${db_type}.json") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/env_2_models_fs_rand_uq.json.in" "${JSON_FP}" @ONLY) # Tests Random models with different percentages both models store to file @@ -54,21 +51,40 @@ endfunction() function(INTEGRATION_TEST_ENV) - JSON_TESTS("hdf5") + set(DB_CONFIG "\"fs_path\" : \"${CMAKE_CURRENT_BINARY_DIR}\"") + set(AMS_DB_TEST_TYPE "hdf5") set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/hdf5.json") + JSON_TESTS("hdf5") unset(JSON_FP) endfunction() + +function(CONFIGURE_RMQ_FILE) + if(DEFINED ENV{AMS_RMQ_CONFIG}) + message(STATUS "Env variable for rmq is set: $ENV{AMS_RMQ_CONFIG}") + set(AMS_DB_TEST_TYPE "rmq") + set(DB_CONFIG "\"rmq_config\" : $ENV{AMS_RMQ_CONFIG},\n \"update_surrogate\": false\n") + set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") + JSON_TESTS("rmq") + CHECK_RMQ_CONFIG(${JSON_FP}) + unset(JSON_FP) + else() + message(STATUS "Copying empty configuration to ${CMAKE_CURRENT_BINARY_DIR}/rmq.json") + configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/rmq.json.in" "rmq.json" @ONLY) + endif() +endfunction() + function(INTEGRATION_TEST_RMQ) if(EXISTS "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") # If file exists we do not overwrite it message(STATUS "Ctest will use ${CMAKE_CURRENT_BINARY_DIR}/rmq.json as RabbitMQ configuration for testing. Make sure RabbitMQ parameters are valid.") + set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") + JSON_TESTS("rmq") + CHECK_RMQ_CONFIG(${CMAKE_CURRENT_BINARY_DIR}/rmq.json) + unset(JSON_FP) else() - message(STATUS "Copying empty configuration to ${CMAKE_CURRENT_BINARY_DIR}/rmq.json") - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/rmq.json.in" "rmq.json" @ONLY) + CONFIGURE_RMQ_FILE() endif() - set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") - CHECK_RMQ_CONFIG(${JSON_FP}) #add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 8 8 \"double\" 2 128; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 8 8 \"double\" 2 128") endfunction() @@ -177,7 +193,12 @@ BUILD_TEST(ams_inout_2d ams_ete_2d.cpp) BUILD_TEST(ams_ete_broadcast ams_ete_broadcast.cpp) INTEGRATION_TEST() BUILD_TEST(ams_end_to_end_env ams_ete_env.cpp) +if (WITH_HDF5) INTEGRATION_TEST_ENV() +endif() +if (WITH_RMQ) +INTEGRATION_TEST_RMQ() +endif() BUILD_TEST(ams_multi_model_end_to_end ams_multi_model_ete.cpp) #ADD_API_UNIT_TEST(API_DIRECT_QUERY AMS::API::MultiModelDefine::Random::Double::DB::OnlyPhysics::None::HOST "${CMAKE_CURRENT_BINARY_DIR}/ams_multi_model_end_to_end 0 8 8 ${TORCH_MODEL_DIR}/linear_scripted_single_cpu_random.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"; python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_ete.py 0 8 8 ${CMAKE_CURRENT_SOURCE_DIR}/linear_scripted_cpu.pt \"double\" \"random\" 0.0 1 128 \"none\" \"./\"") @@ -187,5 +208,4 @@ BUILD_TEST(ams_multi_model_end_to_end_env ams_multi_model_ete_env.cpp) #BUILD_TEST(ams_rmq ams_rmq_env.cpp) -INTEGRATION_TEST_RMQ() # diff --git a/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp b/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp index 784eb804..18921472 100644 --- a/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp +++ b/tests/AMSlib/ams_interface/ams_multi_model_ete_env.cpp @@ -193,8 +193,6 @@ int main(int argc, char **argv) if (data_type == AMSDType::AMS_SINGLE) { Problem prob1(num_inputs, num_outputs); Problem prob2(num_inputs + 1, num_outputs + 1); - - prob1.ams_run(wf1, resource, num_iterations, avg_elements, 0); prob2.ams_run(wf2, resource, num_iterations, avg_elements, 1); } else { diff --git a/tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in b/tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in index e3db02b3..e382c013 100644 --- a/tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in +++ b/tests/AMSlib/ams_interface/json_configs/env_2_models_fs_rand_uq.json.in @@ -1,7 +1,7 @@ { "db" : { "dbType" : "@AMS_DB_TEST_TYPE@", - "fs_path" : "@FS_PATH@" + @DB_CONFIG@ }, "ml_models" : { "random_50": { diff --git a/tests/AMSlib/ams_interface/verify_ete.py b/tests/AMSlib/ams_interface/verify_ete.py index b7a5648a..2980100e 100644 --- a/tests/AMSlib/ams_interface/verify_ete.py +++ b/tests/AMSlib/ams_interface/verify_ete.py @@ -5,6 +5,9 @@ import h5py import numpy as np import os +from typing import Tuple, Optional +from ams.rmq import BlockingClient, default_ams_callback +import ams def get_suffix(db_type): @@ -17,6 +20,76 @@ def get_suffix(db_type): return "unknown" +def verify_fs_db(db_type: str, fs_path: str, name: str) -> Tuple[bool, bool, str]: + """ + @brief verifies that the db file exists and is correct in format + + @param db_type The type of the database ('can be only hdf5') + @param fs_path: The path of the database + @param name: The filename prefix of the db + + @return [continue, has_error] Whether we should continue processing the test or stop and whether the formats etc are correct + db_type: + """ + + if not Path(fs_path).exists(): + print("Expecting output directory to exist") + return True, 1, None + + suffix = get_suffix(db_type) + if suffix == "none": + return False, 0, None + fn = f"{name}_0.{suffix}" + fp = Path(f"{fs_path}/{fn}") + + if name == "": + # We don't have a file and we should return to stop analysis + return False, 0, None + + if name == "" and fp.exists(): + print(f"I was expecting file({fp}) to not exist") + fp.unlink() + return False, 1, None + + return True, 0, str(fp) + + +def read_file(fp: str, threshold: float) -> Tuple[Optional[Tuple[np.ndarray, np.ndarray]], bool]: + """ + @brief verifies that the db file has the appropriate format + + @param fp the path to the file + @param threshold The threshold of UQ + + @return [input, output], has_error] The data in the file and whether there is some error + """ + + with h5py.File(fp, "r") as fd: + dsets = fd.keys() + if threshold == 1.0: + dsets = fd.keys() + print(dsets) + assert len(dsets) == 1, "Expected input, output and domain_name dset" + return (None, None), 0 + print(dsets) + if len(dsets) != 3: + print(f"Expected input, output and domain_name dset") + return (None, None), 1 + + data = {} + for d in {"input_data", "output_data"}: + if d not in dsets: + print(f"Expected {d} to be in dataset names {dests}") + return (None, None), 1 + data[d] = fd[d] + print(d, fd[d].shape) + input_data = np.array(data["input_data"]) + output_data = np.array(data["output_data"]) + print(input_data.shape) + print(output_data.shape) + return (input_data, output_data), 0 + + def verify_data_collection(fs_path, db_type, num_inputs, num_outputs, threshold, name="test", debug_db=False): # Returns a tuple of the input/ouput data and 0/1 for correct incorrect file. # Checks whether the files also have the right number of columns @@ -48,7 +121,6 @@ def verify_data_collection(fs_path, db_type, num_inputs, num_outputs, threshold, return None, 1 if db_type == "hdf5": - with h5py.File(fp, "r") as fd: dsets = fd.keys() if threshold == 1.0: @@ -78,98 +150,89 @@ def verify_data_collection(fs_path, db_type, num_inputs, num_outputs, threshold, return None, 1 -def verify( - use_device, - num_inputs, - num_outputs, - model_path, - data_type, - uq_name, - threshold, - num_iterations, - num_elements, - db_type, - fs_path, - name="test", - debug_db=False, -): - # When AMS has no model path it always calls the domain solution. - # As such it behaves identically with threshold 0 - if model_path == None or model_path == "": - threshold = 0.0 - - # Name maps to the db-name. When empty it means we did not want to collect any data - if name == "": - threshold = 1.0 - - if db_type != "none": - data, correct = verify_data_collection(fs_path, db_type, num_inputs, num_outputs, threshold, name, debug_db) - if correct: - return 1 - if data is None: - return 0 - inputs = data[0] - outputs = data[1] - print("Model path is ", model_path) - if (model_path == None or model_path == "") and name == "": - return 0 - - # Check data type. - if db_type == "hdf5": - assert inputs.dtype == np.float32, "Output Data types do not match" - assert outputs.dtype == np.float32, "Input Data types do not match" - - # When debug db is set, we store always all elements +def verify_data( + threshold: float, uq_name, num_elements, inputs: np.ndarray, outputs: np.ndarray, num_inputs: int, num_outputs: int +) -> bool: + """ + @brief verifies that the collected data have the expected values + + @param threshold The threshold of UQ + @param uq_name The uq name/technology being used + @param num_elements The number of elements we executed our simulation with + @param inputs: The data collected as inputs + @param outputs: The data collected as outputs + @param num_inputs: The number of inputs on the outer dimension + @param num_outputs: The number of outputs on the outer dimension + + @return has_error Whether we are correct or not + """ + if threshold == 0.0: + # Threshold 0 means collect all data. Verify the sizes. + assert ( + inputs.shape[0] == num_elements and outputs.shape[0] == num_elements + ), f"Did not collect all expected data, Input Size: {inputs.shape} : Output Size: {outputs.shape}, expected size: {num_elements}" + + elif threshold == 1.0: + # Threshold 1.0 means to not collect any data. Verify the sizes. + assert inputs.shape[0] == 0 and outputs.shape[0] == 0, "Num elements should be zero" + # There is nothing else we can check here + return 0 + else: + # Compute a theoritical range of possible values in the db. + # The duq/faiss tests have specific settings. The random one can have a + # bound. This checks for all these cases + lb = num_elements * (1 - threshold) - num_elements * 0.05 + ub = num_elements * (1 - threshold) + num_elements * 0.05 + assert ( + inputs.shape[0] > lb and inputs.shape[0] < ub + ), f"Not in the bounds of correct items {lb} {ub} {inputs.shape[0]}" + assert ( + outputs.shape[0] > lb and outputs.shape[0] < ub + ), f"Not in the bounds of correct items {lb} {ub} {outputs.shape[0]}" + + if "delta" in uq_name: + assert "mean" in uq_name or "max" in uq_name, "unknown Delta UQ mechanism" + d_type = np.float32 + # Our DUQ-mean model skips odd evaluations. + # Here we set on verify_inputs the inputs of those evaluations + verify_inputs = np.zeros(inputs.shape, dtype=d_type) if threshold == 0.0: - # Threshold 0 means collect all data. Verify the sizes. - print(inputs.shape[0]) - print(outputs.shape[0]) - assert ( - inputs.shape[0] == num_elements and outputs.shape[0] == num_elements - ), f"Num elements should be the same as experiment {len(inputs)} {num_elements}" - - elif threshold == 1.0: - # Threshold 1.0 means to not collect any data. Verify the sizes. - assert inputs.shape[0] == 0 and outputs.shape[0] == 0, "Num elements should be zero" - # There is nothing else we can check here - return 0 - else: - # Compute a theoritical range of possible values in the db. - # The duq/faiss tests have specific settings. The random one can have a - # bound. This checks for all these cases - lb = num_elements * (1 - threshold) - num_elements * 0.05 - ub = num_elements * (1 - threshold) + num_elements * 0.05 - assert ( - inputs.shape[0] > lb and inputs.shape[0] < ub - ), f"Not in the bounds of correct items {lb} {ub} {inputs.shape[0]} {name}" - assert ( - outputs.shape[0] > lb and outputs.shape[0] < ub - ), f"Not in the bounds of correct items {lb} {ub} {outputs.shape[0]} {name}" - - if "delta" in uq_name: - assert "mean" in uq_name or "max" in uq_name, "unknown Delta UQ mechanism" - d_type = np.float32 - # Our DUQ-mean model skips odd evaluations. - # Here we set on verify_inputs the inputs of those evaluations - verify_inputs = np.zeros(inputs.shape, dtype=d_type) - if threshold == 0.0: - step = 1 - elif threshold == 0.5: - verify_inputs[0] = np.ones(num_inputs, dtype=d_type) - step = 2 - for i in range(1, len(inputs)): - verify_inputs[i] = verify_inputs[i - 1] + step - # Compare whether the results match our base function. - diff_sum = np.sum(np.abs(verify_inputs - inputs)) - assert np.isclose(diff_sum, 0.0), "Mean Input data do not match" - verify_output = np.sum(inputs, axis=1).T * num_outputs - outputs = np.sum(outputs, axis=1) - diff_sum = np.sum(np.abs(outputs - verify_output)) - assert np.isclose(diff_sum, 0.0), "Mean Output data do not match" + step = 1 + elif threshold == 0.5: + verify_inputs[0] = np.ones(num_inputs, dtype=d_type) + step = 2 + for i in range(1, len(inputs)): + verify_inputs[i] = verify_inputs[i - 1] + step + # Compare whether the results match our base function. + diff_sum = np.sum(np.abs(verify_inputs - inputs)) + assert np.isclose(diff_sum, 0.0), "Mean Input data do not match" + verify_output = np.sum(inputs, axis=1).T * num_outputs + outputs = np.sum(outputs, axis=1) + diff_sum = np.sum(np.abs(outputs - verify_output)) + assert np.isclose(diff_sum, 0.0), "Mean Output data do not match" else: return 0 - return 0 +def get_fs_data(db_type, fs_path, model_path, threshold, name="test"): + if db_type != "hdf5" and db_type != "none": + print(f"Wrong db_type, we support only hdf5 instead got {db_type}") + return 1 + + if model_path == None or model_path == "": + threshold = 0.0 + + cont, has_error, fp = verify_fs_db(db_type, fs_path, name) + + if has_error: + return (None, None), threshold, 1 + + if not cont: + return (None, None), threshold, 0 + + (_in, _out), has_error = read_file(fp, threshold) + + Path(fp).unlink() + return (_in, _out), threshold, has_error def from_cli(argv): @@ -185,19 +248,79 @@ def from_cli(argv): db_type = argv[9] fs_path = argv[10] - return verify( - use_device, - num_inputs, - num_outputs, - model_path, - data_type, - uq_name, - threshold, - num_iterations, - num_elements, - db_type, - fs_path, - ) + (_in, _out), thresh, has_error = get_fs_data(db_type, fs_path, model_path, threshold) + + if has_error: + return 1 + + if (_in is None) and (_out is None): + return 0 + + if _in is None: + print("In is None, Out is not") + return 1 + + if _out is None: + print("Out is None, In is not") + return 1 + + error = verify_data(thresh, uq_name, num_elements, _in, _out, num_inputs, num_outputs) + return error + + +def get_rmq_data(ams_config, domain_names, num_iterations, timeout=1): + rmq_json = ams_config["db"]["rmq_config"] + print(rmq_json) + host = rmq_json["service-host"] + vhost = rmq_json["rabbitmq-vhost"] + port = rmq_json["service-port"] + user = rmq_json["rabbitmq-user"] + password = rmq_json["rabbitmq-password"] + queue = rmq_json["rabbitmq-queue-physics"] + cert = None + if "rabbitmq-cert" in rmq_json: + cert = rmq_json["rabbitmq-cert"] + cert = None if cert == "" else cert + with BlockingClient(host, port, vhost, user, password, cert, default_ams_callback) as client: + with client.connect(queue) as channel: + msgs = channel.receive(n_msg=num_iterations * len(domain_names), timeout=timeout) + + dns = set(domain_names) + + _data = {k: ([], []) for k in dns} + + # sim_data[] = (_in, _out, thresh, uq_type) + for msg in msgs: + domain, input_data, output_data = msg.decode() + print(domain) + print(msg) + if domain not in dns: + raise RuntimeError(f"Received unknown domain name {domain}") + _data[domain][0].append(input_data) + _data[domain][1].append(output_data) + + sim_data = {} + for d in _data.keys(): + ml_id = ams_config["domain_models"][d] + model = ams_config["ml_models"][ml_id] + threshold = model["threshold"] + model_path = model.get("model_path", None) + uq_type = model["uq_type"] + if "uq_aggregate" in model: + uq_type += " ({0})".format(model["uq_aggregate"]) + + if model_path == None or model_path == "": + threshold = 0.0 + + print("Type for domain", d, type(_data[d]), len(_data[d])) + if model["db_label"] == "" and len(_data[d][0]) != 0: + raise RuntimeError("Expected data to not exist") + elif model["db_label"] != "": + inputs = np.vstack(_data[d][0]) + outputs = np.vstack(_data[d][1]) + sim_data[d] = (inputs, outputs, threshold, uq_type) + + return sim_data def from_json(argv): @@ -219,41 +342,51 @@ def from_json(argv): data = json.load(fd) db_type = data["db"]["dbType"] - fs_path = data["db"]["fs_path"] - - for m in [model_1, model_2]: - print("Testing Model", m) - ml_id = data["domain_models"][m] - model = data["ml_models"][ml_id] - uq_type = model["uq_type"] - print(json.dumps(model, indent=6)) - if "uq_aggregate" in model: - uq_type += " ({0})".format(model["uq_aggregate"]) - - print(uq_type) - - threshold = model["threshold"] - db_label = model["db_label"] - model_path = model.get("model_path", None) - is_debug = model.get("debug_db", False) - res = verify( - use_device, - num_inputs, - num_outputs, - model_path, - data_type, - uq_type, - threshold, - -1, - num_elements, - db_type, - fs_path, - db_label, - ) - if res != 0: - return res - print("[Success] Model", m) + sim_data = {} + if db_type == "hdf5" or db_type == "none": + db_path = data["db"]["fs_path"] + for m in [model_1, model_2]: + print("Reading Model", m) + ml_id = data["domain_models"][m] + model = data["ml_models"][ml_id] + uq_type = model["uq_type"] + if "uq_aggregate" in model: + uq_type += " ({0})".format(model["uq_aggregate"]) + + threshold = model["threshold"] + db_label = model["db_label"] + model_path = model.get("model_path", None) + + (_in, _out), thresh, has_error = get_fs_data(db_type, db_path, model_path, threshold, model["db_label"]) + + if has_error: + return 1 + + if (_in is None) and (_out is None): + # This means we returned 0 as an error and we don't have any data + # to analyze, so we skip + continue + + if _in is None: + print("In is None, Out is not") + return 1 + + if _out is None: + print("Out is None, In is not") + return 1 + + sim_data[m] = (_in, _out, thresh, uq_type) + elif db_type == "rmq": + print("RMQ") + sim_data = get_rmq_data(data, [model_1, model_2], 1) + + for m, (_in, _out, thresh, uq_type) in sim_data.items(): + print("Verify data of Model", m) + error = verify_data(thresh, uq_type, num_elements, _in, _out, num_inputs, num_outputs) + if error: + print("Error when verify_data") + return error return 0 From ca3814a84cb20e646536d4d8a9bdbc2969f7a22f Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 15:40:32 -0700 Subject: [PATCH 074/136] Delete individual rmq tests --- tests/AMSlib/ams_interface/ams_rmq_env.cpp | 165 --------------------- tests/AMSlib/ams_interface/verify_rmq.py | 131 ---------------- 2 files changed, 296 deletions(-) delete mode 100644 tests/AMSlib/ams_interface/ams_rmq_env.cpp delete mode 100644 tests/AMSlib/ams_interface/verify_rmq.py diff --git a/tests/AMSlib/ams_interface/ams_rmq_env.cpp b/tests/AMSlib/ams_interface/ams_rmq_env.cpp deleted file mode 100644 index 18cb0001..00000000 --- a/tests/AMSlib/ams_interface/ams_rmq_env.cpp +++ /dev/null @@ -1,165 +0,0 @@ -#ifdef __AMS_ENABLE_MPI__ -#include -#endif -#include - -#include -#include -#include -#include -#include -#include - -#include "../utils.hpp" -#include "AMS.h" -#include "wf/debug.h" - -template -struct Problem { - int num_inputs; - int num_outputs; - Problem(int ni, int no) : num_inputs(ni), num_outputs(no) {} - - void run(long num_elements, DType **inputs, DType **outputs) - { - for (int i = 0; i < num_elements; i++) { - DType sum = 0; - for (int j = 0; j < num_inputs; j++) { - sum += inputs[j][i]; - } - - for (int j = 0; j < num_outputs; j++) { - outputs[j][i] = sum; - } - } - } - - - const DType *initialize_inputs(DType *inputs, long length) - { - for (int i = 0; i < length; i++) { - inputs[i] = static_cast(i); - } - return inputs; - } - - void ams_run(AMSExecutor &wf, - AMSResourceType resource, - int iterations, - int num_elements) - { - for (int i = 0; i < iterations; i++) { - int elements = num_elements; // * ((DType)(rand()) / RAND_MAX) + 1; - std::vector inputs; - std::vector outputs; - - // Allocate Input memory - for (int j = 0; j < num_inputs; j++) { - DType *data = new DType[elements]; - inputs.push_back(initialize_inputs(data, elements)); - } - - // Allocate Output memory - for (int j = 0; j < num_outputs; j++) { - outputs.push_back(new DType[elements]); - } - - AMSExecute(wf, - (void *)this, - elements, - reinterpret_cast(inputs.data()), - reinterpret_cast(outputs.data()), - inputs.size(), - outputs.size()); - - for (int i = 0; i < num_outputs; i++) { - delete[] outputs[i]; - outputs[i] = nullptr; - } - - - for (int i = 0; i < num_inputs; i++) { - delete[] inputs[i]; - inputs[i] = nullptr; - } - } - } -}; - -void callBackDouble(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << "Called the double precision model\n"; - static_cast *>(cls)->run(elements, - (double **)(inputs), - (double **)(outputs)); -} - - -void callBackSingle(void *cls, long elements, void **inputs, void **outputs) -{ - std::cout << "Called the single precision model\n"; - static_cast *>(cls)->run(elements, - (float **)(inputs), - (float **)(outputs)); -} - - -int main(int argc, char **argv) -{ - - if (argc != 7) { - std::cout << "Wrong cli\n"; - std::cout << argv[0] - << " use_device(0|1) num_inputs num_outputs " - "data_type(float|double) " - "num_iterations num_elements" - << std::endl; - return -1; - } - - installSignals(); - AMSInit(); - - int use_device = std::atoi(argv[1]); - int num_inputs = std::atoi(argv[2]); - int num_outputs = std::atoi(argv[3]); - AMSDType data_type = getDataType(argv[4]); - int num_iterations = std::atoi(argv[5]); - int num_elements = std::atoi(argv[6]); - AMSResourceType resource = AMSResourceType::AMS_HOST; - srand(time(NULL)); - - - AMSCAbstrModel ams_model = AMSRegisterAbstractModel("rmq_db_no_model", - AMSUQPolicy::AMS_RANDOM, - 0.5, - "", - "", - "rmq_db_no_model", - 1); - - if (data_type == AMSDType::AMS_SINGLE) { - Problem prob(num_inputs, num_outputs); - AMSExecutor wf = AMSCreateExecutor(ams_model, - AMSDType::AMS_SINGLE, - resource, - (AMSPhysicFn)callBackSingle, - 0, - 1); - - prob.ams_run(wf, resource, num_iterations, num_elements); - } else { - Problem prob(num_inputs, num_outputs); - AMSExecutor wf = AMSCreateExecutor(ams_model, - AMSDType::AMS_DOUBLE, - resource, - (AMSPhysicFn)callBackDouble, - 0, - 1); - prob.ams_run(wf, resource, num_iterations, num_elements); - } - - std::this_thread::sleep_for(std::chrono::milliseconds(1000)); - AMSFinalize(); - return 0; -} diff --git a/tests/AMSlib/ams_interface/verify_rmq.py b/tests/AMSlib/ams_interface/verify_rmq.py deleted file mode 100644 index 971c7d03..00000000 --- a/tests/AMSlib/ams_interface/verify_rmq.py +++ /dev/null @@ -1,131 +0,0 @@ -import sys -import json -from pathlib import Path -import os -import numpy as np - -from ams.rmq import BlockingClient, default_ams_callback - - -def verify( - use_device, - num_inputs, - num_outputs, - data_type, - num_iterations, - num_elements, - rmq_json, - timeout=None, - domain_test="rmq_db_no_model", # defined in ams_rmq_env.cpp -): - host = rmq_json["service-host"] - vhost = rmq_json["rabbitmq-vhost"] - port = rmq_json["service-port"] - user = rmq_json["rabbitmq-user"] - password = rmq_json["rabbitmq-password"] - queue = rmq_json["rabbitmq-queue-physics"] - cert = None - if "rabbitmq-cert" in rmq_json: - cert = rmq_json["rabbitmq-cert"] - cert = None if cert == "" else cert - - dtype = 4 - if data_type == "double": - dtype = 8 - - with BlockingClient(host, port, vhost, user, password, cert, default_ams_callback) as client: - print(queue) - with client.connect(queue) as channel: - msgs = channel.receive(n_msg=num_iterations, timeout=timeout) - - assert ( - len(msgs) == num_iterations - ), f"Received incorrect number of messsages ({len(msgs)}): expected #msgs ({num_iterations})" - - expected_input = np.array( - [ - [0.0, 0.0], - [1.0, 1.0], - [2.0, 2.0], - [3.0, 3.0], - [4.0, 4.0], - [5.0, 5.0], - [6.0, 6.0], - [7.0, 7.0], - [8.0, 8.0], - [9.0, 9.0], - ] - ) - - expected_output = np.array( - [ - [0.0, 0.0], - [2.0, 2.0], - [4.0, 4.0], - [6.0, 6.0], - [8.0, 8.0], - [10.0, 10.0], - [12.0, 12.0], - [14.0, 14.0], - [16.0, 16.0], - [18.0, 18.0], - ] - ) - - for i, msg in enumerate(msgs): - domain, input_data, output_data = msg.decode() - assert ( - msg.num_elements == num_elements - ), f"Message #{i}: incorrect #elements ({msg.num_element}) vs. expected #elem {num_elements})" - assert ( - msg.input_dim == num_inputs - ), f"Message #{i}: incorrect #inputs ({msg.input_dim}) vs. expected #inputs {num_inputs})" - assert ( - msg.output_dim == num_outputs - ), f"Message #{i}: incorrect #outputs ({msg.output_dim}) vs. expected #outputs {num_outputs})" - assert ( - msg.dtype_byte == dtype - ), f"Message #{i}: incorrect datatype ({msg.dtype_byte} bytes) vs. expected type {dtype} bytes)" - assert domain == domain_test, f"Message #{i}: incorrect domain name (got {domain}) expected rmq_db_no_model)" - assert np.array_equal(input_data, expected_input), f"Message #{i}: incorrect incorrect input data" - assert np.array_equal(output_data, expected_output), f"Message #{i}: incorrect incorrect output data" - - return 0 - - -def from_json(argv): - use_device = int(argv[0]) - num_inputs = int(argv[1]) - num_outputs = int(argv[2]) - data_type = argv[3] - num_iterations = int(argv[4]) - num_elements = int(argv[5]) - - env_file = Path(os.environ["AMS_OBJECTS"]) - if not env_file.exists(): - print("Environment file does not exist") - return -1 - - with open(env_file, "r") as fd: - rmq_json = json.load(fd) - - res = verify( - use_device, - num_inputs, - num_outputs, - data_type, - num_iterations, - num_elements, - rmq_json["db"]["rmq_config"], - timeout=20, # in seconds - ) - if res != 0: - return res - print("[Success] rmq test received") - return 0 - - -if __name__ == "__main__": - if "AMS_OBJECTS" in os.environ: - sys.exit(from_json(sys.argv[1:])) - sys.exit(1) From bca5e15c1363fbdc04381c284ad9e66078c2f30c Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 15:50:59 -0700 Subject: [PATCH 075/136] Hide import in funciton --- tests/AMSlib/ams_interface/verify_ete.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/AMSlib/ams_interface/verify_ete.py b/tests/AMSlib/ams_interface/verify_ete.py index 2980100e..e26615b1 100644 --- a/tests/AMSlib/ams_interface/verify_ete.py +++ b/tests/AMSlib/ams_interface/verify_ete.py @@ -6,7 +6,6 @@ import numpy as np import os from typing import Tuple, Optional -from ams.rmq import BlockingClient, default_ams_callback import ams @@ -213,6 +212,7 @@ def verify_data( else: return 0 + def get_fs_data(db_type, fs_path, model_path, threshold, name="test"): if db_type != "hdf5" and db_type != "none": print(f"Wrong db_type, we support only hdf5 instead got {db_type}") @@ -269,6 +269,8 @@ def from_cli(argv): def get_rmq_data(ams_config, domain_names, num_iterations, timeout=1): + from ams.rmq import BlockingClient, default_ams_callback + rmq_json = ams_config["db"]["rmq_config"] print(rmq_json) host = rmq_json["service-host"] From fa6ea02413b4c9d2f8b97179b84b2147d2cba368 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 16:05:52 -0700 Subject: [PATCH 076/136] Remove imports --- tests/AMSlib/ams_interface/verify_ete.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/AMSlib/ams_interface/verify_ete.py b/tests/AMSlib/ams_interface/verify_ete.py index e26615b1..8aab26bb 100644 --- a/tests/AMSlib/ams_interface/verify_ete.py +++ b/tests/AMSlib/ams_interface/verify_ete.py @@ -6,7 +6,6 @@ import numpy as np import os from typing import Tuple, Optional -import ams def get_suffix(db_type): From 200dc8292880c6628cc2ec0e38963e91caf6e794 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 16:34:35 -0700 Subject: [PATCH 077/136] Add ctest even when env variable not defined --- tests/AMSlib/ams_interface/CMakeLists.txt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index 52ac5494..b3dd5c13 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -36,9 +36,8 @@ function(CHECK_RMQ_CONFIG file) # Read the JSON file. file(READ ${file} MY_JSON_STRING) message(STATUS "RabbitMQ config ${file}") - - string(JSON DB_CONF GET ${MY_JSON_STRING} db) - string(JSON DB_CONF GET ${DB_CONF} rmq_config) + string(JSON DB_CONF GET ${MY_JSON_STRING} "db") + string(JSON DB_CONF GET ${DB_CONF} "rmq_config") string(JSON RMQ_HOST GET ${DB_CONF} "service-host") string(JSON RMQ_PORT GET ${DB_CONF} "service-port") @@ -69,8 +68,11 @@ function(CONFIGURE_RMQ_FILE) CHECK_RMQ_CONFIG(${JSON_FP}) unset(JSON_FP) else() - message(STATUS "Copying empty configuration to ${CMAKE_CURRENT_BINARY_DIR}/rmq.json") + message(WARNING "Copying empty configuration to ${CMAKE_CURRENT_BINARY_DIR}/rmq.json") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/rmq.json.in" "rmq.json" @ONLY) + JSON_TESTS("rmq") + CHECK_RMQ_CONFIG(${JSON_FP}) + unset(JSON_FP) endif() endfunction() From a2a7afa974a3aa77d16327c2d8421f5a5daf39e0 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 16:34:58 -0700 Subject: [PATCH 078/136] Remove CSV and REDIS from files --- src/AMSWorkflow/ams/faccessors.py | 132 +----------------- src/AMSWorkflow/ams/stage.py | 4 +- src/AMSlib/include/AMSTypes.hpp | 2 +- src/AMSlib/wf/basedb.cpp | 8 -- src/AMSlib/wf/basedb.hpp | 5 +- tests/AMSWorkflow/test_faccessors.py | 42 +----- tests/AMSlib/ams_interface/ams_ete.cpp | 2 +- tests/AMSlib/ams_interface/ams_ete_2d.cpp | 2 +- .../ams_interface/ams_ete_broadcast.cpp | 2 +- .../ams_interface/ams_multi_model_ete.cpp | 2 +- tests/AMSlib/ams_interface/verify_ete.py | 2 - tests/AMSlib/perf_regression/ams_bench_db.cpp | 1 - tests/AMSlib/utils.hpp | 8 +- 13 files changed, 20 insertions(+), 192 deletions(-) diff --git a/src/AMSWorkflow/ams/faccessors.py b/src/AMSWorkflow/ams/faccessors.py index c5d7a218..e250d881 100644 --- a/src/AMSWorkflow/ams/faccessors.py +++ b/src/AMSWorkflow/ams/faccessors.py @@ -5,7 +5,6 @@ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception import argparse -import csv from abc import ABC, abstractmethod from pathlib import Path @@ -57,61 +56,6 @@ def load(self) -> tuple: raise NotImplementedError -class CSVReader(FileReader): - """ - A CSV File Reader - """ - - suffix = "csv" - - def __init__(self, file_name: str, delimiter: str = ":"): - super().__init__() - self.file_name = file_name - self.delimiter = delimiter - self.fd = None - - def open(self): - self.fd = open(self.file_name, "r") - return self - - def close(self): - self.fd.close() - - def __enter__(self): - self.open() - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - - def load(self) -> tuple: - """ - load the data in the file and return a tupple of the inputs, outputs - - We assume the file is produced by the C/C++ front-end. Thus the file - will have a generic header row specifying the inputs/outputs - - Returns: - A tuple of None, input, output data values - """ - - if self.fd and self.fd.closed: - return None, None - - file_data = list(csv.reader(self.fd, delimiter=self.delimiter)) - header = file_data[0] - data = file_data[1:] - output_start = header.index("output_0") - data = np.array(data) - input_data = data[:, :output_start] - output_data = data[:, output_start:] - return (None, input_data.astype(np.float64), output_data.astype(np.float64)) - - @classmethod - def get_file_format_suffix(cls): - return cls.suffix - - class HDF5CLibReader(FileReader): """ An HDF5 reader for files generated directly by the C/C++ code. @@ -270,68 +214,6 @@ def store(self, inputs, outputs) -> int: raise NotImplementedError -class CSVWriter(FileWriter): - """ - A simple CSV backend. - """ - - suffix = "csv" - - def __init__(self, file_name: str, delimiter: str = ":"): - super().__init__() - self.file_name = file_name - self.delimiter = delimiter - self.fd = None - self.write_header = False - - def __str__(self) -> str: - return f"{__class__.__name__}(fd={self.fd}, delimiter={self.delimiter})" - - def open(self): - if not Path(self.file_name).exists(): - self.write_header = True - - self.fd = open(self.file_name, "a") - return self - - def close(self): - self.write_header = False - self.fd.close() - - def __enter__(self): - return self.open() - - def __exit__(self, exc_type, exc_val, exc_tb): - self.close() - - def store(self, inputs: np.array, outputs: np.array) -> int: - """Store the two arrays in a CSV file""" - assert len(inputs) == len(outputs) - if self.fd and self.fd.closed: - return 0 - if self.write_header: - writer = csv.DictWriter( - self.fd, - fieldnames=[f"input_{i}" for i in range(inputs.shape[-1])] - + [f"output_{i}" for i in range(outputs.shape[-1])], - delimiter=self.delimiter, - ) - writer.writeheader() - self.write_header = False - - csvwriter = csv.writer(self.fd, delimiter=self.delimiter, quotechar="'", quoting=csv.QUOTE_MINIMAL) - nelem = len(inputs) - elem_wrote: int = 0 - # We follow the mini-app format, inputs elem and then output elems - for i in range(nelem): - elem_wrote += csvwriter.writerow(np.concatenate((inputs[i], outputs[i]), axis=0)) - return elem_wrote - - @classmethod - def get_file_format_suffix(cls): - return cls.suffix - - class HDF5Writer(FileWriter): """ A simple hdf5 backend. @@ -422,7 +304,7 @@ def get_reader(ftype="dhdf5"): Factory method return a AMS file reader depending on the requested filetype """ - readers = {"shdf5": HDF5CLibReader, "dhdf5": HDF5PackedReader, "csv": CSVReader} + readers = {"shdf5": HDF5CLibReader, "dhdf5": HDF5PackedReader} return readers[ftype] @@ -431,21 +313,19 @@ def get_writer(ftype="shdf5"): Factory method return a AMS file writer depending on the requested filetype """ - writers = {"shdf5": HDF5Writer, "dhdf5": HDF5PackedWriter, "csv": CSVWriter} + writers = {"shdf5": HDF5Writer, "dhdf5": HDF5PackedWriter} return writers[ftype] def main(): parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument("--type", "-t", help="version to assign to data file", choices=["hdf5", "csv"], required=True) + parser.add_argument("--type", "-t", help="version to assign to data file", choices=["hdf5"], required=True) parser.add_argument("--action", "-a", help="action", choices=["write", "read"], required=True) parser.add_argument("filename") args = parser.parse_args() if args.action == "write": - if args.type == "csv": - db = CSVWriter - elif args.type == "hdf5": + if args.type == "hdf5": db = HDF5PackedWriter with db(args.filename) as fd: @@ -454,9 +334,7 @@ def main(): fd.store(inputs, outputs) elif args.action == "read": - if args.type == "csv": - db = CSVReader - elif args.type == "hdf5": + if args.type == "hdf5": db = HDF5PackedReader with db(args.filename) as fd: diff --git a/src/AMSWorkflow/ams/stage.py b/src/AMSWorkflow/ams/stage.py index 758099a8..c7103cf8 100644 --- a/src/AMSWorkflow/ams/stage.py +++ b/src/AMSWorkflow/ams/stage.py @@ -703,7 +703,7 @@ class Pipeline(ABC): """ supported_policies = {"sequential", "thread", "process"} - supported_writers = {"shdf5", "dhdf5", "csv"} + supported_writers = {"shdf5", "dhdf5"} def __init__(self, application_name, dest_dir, db_url, db_type="dhdf5"): """ @@ -965,7 +965,7 @@ class FSPipeline(Pipeline): src_type: The file format of the source data """ - supported_readers = ("shdf5", "dhdf5", "csv") + supported_readers = ("shdf5", "dhdf5") def __init__( self, application_name, dest_dir, db_url, db_type, src, src_type, pattern diff --git a/src/AMSlib/include/AMSTypes.hpp b/src/AMSlib/include/AMSTypes.hpp index 37d57ec2..35b036ce 100644 --- a/src/AMSlib/include/AMSTypes.hpp +++ b/src/AMSlib/include/AMSTypes.hpp @@ -14,7 +14,7 @@ typedef enum { typedef enum { AMS_UBALANCED = 0, AMS_BALANCED } AMSExecPolicy; -typedef enum { AMS_NONE = 0, AMS_CSV, AMS_REDIS, AMS_HDF5, AMS_RMQ } AMSDBType; +typedef enum { AMS_NONE = 0, AMS_HDF5, AMS_RMQ } AMSDBType; enum struct AMSUQPolicy { AMS_UQ_BEGIN = 0, diff --git a/src/AMSlib/wf/basedb.cpp b/src/AMSlib/wf/basedb.cpp index da8b8a10..0edaa158 100644 --- a/src/AMSlib/wf/basedb.cpp +++ b/src/AMSlib/wf/basedb.cpp @@ -15,10 +15,6 @@ AMSDBType getDBType(std::string type) { if (type.compare("hdf5") == 0) { return AMSDBType::AMS_HDF5; - } else if (type.compare("csv") == 0) { - return AMSDBType::AMS_CSV; - } else if (type.compare("redis") == 0) { - return AMSDBType::AMS_REDIS; } else if (type.compare("rmq") == 0) { return AMSDBType::AMS_RMQ; } @@ -30,14 +26,10 @@ std::string getDBTypeAsStr(AMSDBType type) switch (type) { case AMSDBType::AMS_NONE: return "None"; - case AMSDBType::AMS_CSV: - return "csv"; case AMSDBType::AMS_HDF5: return "hdf5"; case AMSDBType::AMS_RMQ: return "rmq"; - case AMSDBType::AMS_REDIS: - return "redis"; } return "Unknown"; } diff --git a/src/AMSlib/wf/basedb.hpp b/src/AMSlib/wf/basedb.hpp index 047e3ea5..8e337bca 100644 --- a/src/AMSlib/wf/basedb.hpp +++ b/src/AMSlib/wf/basedb.hpp @@ -1360,7 +1360,7 @@ class ConnectionManagerAMQP * @brief Class that manages a RabbitMQ broker and handles connection, event * loop and set up various handlers. * @details This class handles a specific type of database backend in AMSLib. - * Instead of writing inputs/outputs directly to files (CSV or HDF5), we + * Instead of writing inputs/outputs directly to files (HDF5), we * send these elements (a collection of inputs and their corresponding outputs) * to a service called RabbitMQ which is listening on a given IP and port. * @@ -1779,8 +1779,7 @@ class DBManager DBG(DBManager, "Instantiating data base"); - if ((dbType == AMSDBType::AMS_CSV || dbType == AMSDBType::AMS_HDF5) && - !fs_interface.isConnected()) { + if ((dbType == AMSDBType::AMS_HDF5) && !fs_interface.isConnected()) { THROW(std::runtime_error, "File System is not configured, Please specify output directory"); } else if (dbType == AMSDBType::AMS_RMQ && !rmq_interface.isConnected()) { diff --git a/tests/AMSWorkflow/test_faccessors.py b/tests/AMSWorkflow/test_faccessors.py index 97386dc8..299cf171 100644 --- a/tests/AMSWorkflow/test_faccessors.py +++ b/tests/AMSWorkflow/test_faccessors.py @@ -1,4 +1,3 @@ -import csv import pathlib import unittest @@ -34,27 +33,6 @@ def _store(self, cls, fn): return inputs, outputs -class TestCSVWriter(TestWriter): - def test_csv_open_close( - self, - ): - super()._open_close(faccessors.CSVWriter, "ams_test." + faccessors.CSVReader.get_file_format_suffix()) - - def test_csv_store(self): - fn = "ams_test." + faccessors.CSVReader.get_file_format_suffix() - inputs, outputs = super()._store(faccessors.CSVWriter, fn) - with open(fn, "r") as x: - sample_data = list(csv.reader(x, delimiter=":")) - data = np.delete(np.array(sample_data), (0), axis=0).astype(inputs.dtype) - _cdata = np.hstack((inputs, outputs)) - self.assertTrue(np.array_equal(data, _cdata), msg="Writting data loses information") - - def tearDown(self): - fn = pathlib.Path("ams_test." + faccessors.CSVReader.get_file_format_suffix()) - if fn.exists(): - fn.unlink() - - class TestHDF5Writer(TestWriter): def _pack_dsets_to_list(self, dsets, selector): data = [dsets[k[0]] for k in selector] @@ -67,12 +45,12 @@ def _map_name_to_index(self, dsets_keys, name): keys = [(k, int(k.split("_")[-1])) for k in keys] return keys - def test_csv_open_close( + def test_hdf5_open_close( self, ): super()._open_close(faccessors.HDF5Writer, "ams_test." + faccessors.HDF5Writer.get_file_format_suffix()) - def test_csv_store(self): + def test_hdf5_store(self): fn = "ams_test." + faccessors.HDF5Writer.get_file_format_suffix() inputs, outputs = super()._store(faccessors.HDF5Writer, fn) @@ -93,14 +71,14 @@ def tearDown(self): class TestH5PackedWriter(TestWriter): - def test_csv_open_close( + def test_hdf5_open_close( self, ): super()._open_close( faccessors.HDF5PackedWriter, "ams_test." + faccessors.HDF5PackedWriter.get_file_format_suffix() ) - def test_csv_store(self): + def test_hdf5_store(self): fn = "ams_test." + faccessors.HDF5PackedWriter.get_file_format_suffix() inputs, outputs = super()._store(faccessors.HDF5PackedWriter, fn) @@ -149,18 +127,6 @@ def _cmp(self, writer_cls, reader_cls, fn): ) -class TestCSVReader(TestReader): - def test_load(self): - fn = "ams_test." + faccessors.CSVReader.get_file_format_suffix() - super()._cmp(faccessors.CSVWriter, faccessors.CSVReader, fn) - - def tearDown(self): - fn = "ams_test." + faccessors.CSVReader.get_file_format_suffix() - fn = pathlib.Path(fn) - if fn.exists(): - fn.unlink() - - class TestHDF5Reader(TestReader): def test_load(self): fn = "ams_test." + faccessors.HDF5CLibReader.get_file_format_suffix() diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp index 64e4a93e..ba86be64 100644 --- a/tests/AMSlib/ams_interface/ams_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -133,7 +133,7 @@ int main(int argc, char **argv) << " use_device(0|1) num_inputs num_outputs model_path " "data_type(float|double) uq_policy(random|deltaUQ " "(mean)|deltaUQ (max)) threshold(0) " - "num_iterations avg_num_values db_type(none|csv|hdf5) " + "num_iterations avg_num_values db_type(none|hdf5) " "db_path(path to existing path to store data)"; return -1; } diff --git a/tests/AMSlib/ams_interface/ams_ete_2d.cpp b/tests/AMSlib/ams_interface/ams_ete_2d.cpp index b4ae2228..351f2de8 100644 --- a/tests/AMSlib/ams_interface/ams_ete_2d.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_2d.cpp @@ -187,7 +187,7 @@ int main(int argc, char **argv) << " use_device(0|1) num_inputs num_outputs model_path " "data_type(float|double) uq_policy(random|deltaUQ " "(mean)|deltaUQ (max)) threshold(0) " - "num_iterations avg_num_values db_type(none|csv|hdf5) " + "num_iterations avg_num_values db_type(none|hdf5) " "db_path(path to existing path to store data)"; return -1; } diff --git a/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp b/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp index dd9eb870..b3c64fb3 100644 --- a/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_broadcast.cpp @@ -150,7 +150,7 @@ int main(int argc, char **argv) << " use_device(0|1) num_inputs num_outputs model_path " "data_type(float|double) uq_policy(random|deltaUQ " "(mean)|deltaUQ (max)) threshold(0) " - "num_iterations avg_num_values db_type(none|csv|hdf5) " + "num_iterations avg_num_values db_type(none|hdf5) " "db_path(path to existing path to store data)"; return -1; } diff --git a/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp index 64028c44..25ee21d2 100644 --- a/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_multi_model_ete.cpp @@ -144,7 +144,7 @@ int main(int argc, char **argv) << " use_device(0|1) num_inputs num_outputs model_path " "data_type(float|double) uq_policy(random|deltaUQ " "(mean)|deltaUQ (max)) threshold(0) " - "num_iterations avg_num_values db_type(none|csv|hdf5) " + "num_iterations avg_num_values db_type(none|hdf5) " "db_path(path to existing path to store data)"; return -1; } diff --git a/tests/AMSlib/ams_interface/verify_ete.py b/tests/AMSlib/ams_interface/verify_ete.py index 8aab26bb..290e2749 100644 --- a/tests/AMSlib/ams_interface/verify_ete.py +++ b/tests/AMSlib/ams_interface/verify_ete.py @@ -9,8 +9,6 @@ def get_suffix(db_type): - if db_type == "csv": - return "csv" if db_type == "none": return "none" if db_type == "hdf5": diff --git a/tests/AMSlib/perf_regression/ams_bench_db.cpp b/tests/AMSlib/perf_regression/ams_bench_db.cpp index 7b4abb3f..6b729dc7 100644 --- a/tests/AMSlib/perf_regression/ams_bench_db.cpp +++ b/tests/AMSlib/perf_regression/ams_bench_db.cpp @@ -211,7 +211,6 @@ int main(int argc, char **argv) "-dt", "--dbtype", "Configuration option of the different DB types:\n" - "\t 'csv': use CSV as a back end\n" "\t 'hdf5': use HDF5 as a back end\n" "\t 'rmq': use RabbitMQ as a back end\n"); diff --git a/tests/AMSlib/utils.hpp b/tests/AMSlib/utils.hpp index 1f94eabb..4c12ae98 100644 --- a/tests/AMSlib/utils.hpp +++ b/tests/AMSlib/utils.hpp @@ -58,9 +58,7 @@ static inline AMSDType getDataType(std::string& d_type) static inline AMSDBType getDBType(const char* db_type) { AMSDBType dbType = AMSDBType::AMS_NONE; - if (std::strcmp(db_type, "csv") == 0) { - dbType = AMSDBType::AMS_CSV; - } else if (std::strcmp(db_type, "hdf5") == 0) { + if (std::strcmp(db_type, "hdf5") == 0) { dbType = AMSDBType::AMS_HDF5; } else if (std::strcmp(db_type, "rmq") == 0) { dbType = AMSDBType::AMS_RMQ; @@ -71,9 +69,7 @@ static inline AMSDBType getDBType(const char* db_type) static inline AMSDBType getDBType(std::string db_type) { AMSDBType dbType = AMSDBType::AMS_NONE; - if (db_type == "csv") { - dbType = AMSDBType::AMS_CSV; - } else if (db_type == "hdf5") { + if (db_type == "hdf5") { dbType = AMSDBType::AMS_HDF5; } else if (db_type == "rmq") { dbType = AMSDBType::AMS_RMQ; From c1270361c56123ac2edab7f291326d59de388653 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 16:40:13 -0700 Subject: [PATCH 079/136] Fix caliper begin - end --- src/AMSlib/wf/workflow.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index 8b42c0d2..7185fafb 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -294,7 +294,6 @@ class AMSWorkflow SmallVector InputTensors(Ins.begin(), Ins.end()); SmallVector OutputTensors(Outs.begin(), Outs.end()); - CALIPER(CALI_MARK_BEGIN("AMSEvaluate");) DBG(Workflow, "Entering Workflow with TorchIn:%ld, TorchOut:%ld", InputTensors.size(), @@ -323,6 +322,7 @@ class AMSWorkflow CALIPER(CALI_MARK_END("PHYSICS MODULE");) storeComputedData(Ins, PhysicInOutsBefore, Outs, InOuts); + CALIPER(CALI_MARK_END("AMSEvaluate");) return; } From 43ad363b61669b785072903a7caa42afdfc0f97c Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 16:49:20 -0700 Subject: [PATCH 080/136] Printing out model device and data type --- src/AMSlib/ml/surrogate.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/AMSlib/ml/surrogate.cpp b/src/AMSlib/ml/surrogate.cpp index 86ef89a5..db653a0f 100644 --- a/src/AMSlib/ml/surrogate.cpp +++ b/src/AMSlib/ml/surrogate.cpp @@ -37,6 +37,15 @@ static std::string getAMSDTypeAsString(AMSDType dType) return "unknown"; } +static std::string getAMSResourceTypeAsString(AMSResourceType res) +{ + if (res == ams::AMS_DEVICE) + return "device"; + else if (res == ams::AMS_HOST) + return "host"; + return "unknown-device"; +} + SurrogateModel::SurrogateModel(std::string& model_path, bool isDeltaUQ) : _model_path(model_path), _is_DeltaUQ(isDeltaUQ) @@ -58,6 +67,10 @@ SurrogateModel::SurrogateModel(std::string& model_path, bool isDeltaUQ) } std::tie(model_device, torch_device) = getModelResourceType(); std::tie(model_dtype, torch_dtype) = getModelDataType(); + DBG(SurrogateModel, + "Loaded model with type %s on device %s", + getAMSDTypeAsString(model_dtype).c_str(), + getAMSResourceTypeAsString(model_device).c_str()); } std::tuple SurrogateModel:: From 0e0b153832bf741348356cbb479a0eee74fcb7fe Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 17:28:39 -0700 Subject: [PATCH 081/136] Fix cmake file --- tests/AMSlib/ams_interface/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index b3dd5c13..6b364b26 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -70,6 +70,7 @@ function(CONFIGURE_RMQ_FILE) else() message(WARNING "Copying empty configuration to ${CMAKE_CURRENT_BINARY_DIR}/rmq.json") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/rmq.json.in" "rmq.json" @ONLY) + set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") JSON_TESTS("rmq") CHECK_RMQ_CONFIG(${JSON_FP}) unset(JSON_FP) From 1e0e323add9f6c2af96c181332a5c29767580001 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 18:00:00 -0700 Subject: [PATCH 082/136] Extra fixes --- .github/workflows/ci.yml | 1 + tests/AMSlib/ams_interface/CMakeLists.txt | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3ed82afa..9ea31e80 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -159,6 +159,7 @@ jobs: $GITHUB_WORKSPACE make -j$(nproc) make -j$(nproc) install + echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" echo "AMS_INSTALL_PATH=${AMS_INSTALL_PATH}" >> $GITHUB_ENV - name: Install IdealGas SharedLibray=${{ matrix.with_shared }} shell: bash -l {0} diff --git a/tests/AMSlib/ams_interface/CMakeLists.txt b/tests/AMSlib/ams_interface/CMakeLists.txt index 6b364b26..9761a257 100644 --- a/tests/AMSlib/ams_interface/CMakeLists.txt +++ b/tests/AMSlib/ams_interface/CMakeLists.txt @@ -72,7 +72,6 @@ function(CONFIGURE_RMQ_FILE) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/json_configs/rmq.json.in" "rmq.json" @ONLY) set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") JSON_TESTS("rmq") - CHECK_RMQ_CONFIG(${JSON_FP}) unset(JSON_FP) endif() endfunction() @@ -83,12 +82,10 @@ function(INTEGRATION_TEST_RMQ) message(STATUS "Ctest will use ${CMAKE_CURRENT_BINARY_DIR}/rmq.json as RabbitMQ configuration for testing. Make sure RabbitMQ parameters are valid.") set(JSON_FP "${CMAKE_CURRENT_BINARY_DIR}/rmq.json") JSON_TESTS("rmq") - CHECK_RMQ_CONFIG(${CMAKE_CURRENT_BINARY_DIR}/rmq.json) unset(JSON_FP) else() CONFIGURE_RMQ_FILE() endif() - #add_test(NAME AMSEndToEndFromJSON::NoModel::Double::DB::rmq::HOST COMMAND bash -c "AMS_OBJECTS=${JSON_FP} ${CMAKE_CURRENT_BINARY_DIR}/ams_rmq 0 8 8 \"double\" 2 128; AMS_OBJECTS=${JSON_FP} python3 ${CMAKE_CURRENT_SOURCE_DIR}/verify_rmq.py 0 8 8 \"double\" 2 128") endfunction() function (INTEGRATION_TEST) From 949f0d041d2e54e8a50f38220781c31bf966a059 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 18:23:29 -0700 Subject: [PATCH 083/136] Pass RMQ at configure time --- .github/workflows/ci.yml | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ea31e80..3b1b3645 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -279,6 +279,19 @@ jobs: export AMS_UMPIRE_PATH=$(spack location -i umpire) export AMS_HDF5_PATH=$(spack location -i hdf5) export AMS_AMQPCPP_PATH=$(spack location -i amqp-cpp)/cmake + echo """{ + \"rabbitmq-name\": \"rabbit\", + \"rabbitmq-user\": \"${RABBITMQ_USER}\", + \"rabbitmq-password\": \"${RABBITMQ_PASS}\", + \"service-port\": ${RABBITMQ_PORT}, + \"service-host\": \"${RABBITMQ_HOST}\", + \"rabbitmq-vhost\": \"/\", + \"rabbitmq-outbound-queue\": \"test-ci\", + \"rabbitmq-exchange\": \"ams-fanout\", + \"rabbitmq-routing-key\": \"training\" + }""" > rmq.json + jq < rm.json + export AMS_RMQ_CONFIG=$(cat ./rmq.json) cmake \ -DBUILD_SHARED_LIBS=On \ -DCMAKE_PREFIX_PATH=$INSTALL_DIR \ @@ -305,26 +318,6 @@ jobs: source /spack/share/spack/setup-env.sh spack env activate -p /ams-spack-env # We overwrite the rmq.json created by CMake - echo """{ - \"db\": { - \"dbType\": \"rmq\", - \"rmq_config\": { - \"rabbitmq-name\": \"rabbit\", - \"rabbitmq-user\": \"${RABBITMQ_USER}\", - \"rabbitmq-password\": \"${RABBITMQ_PASS}\", - \"service-port\": ${RABBITMQ_PORT}, - \"service-host\": \"${RABBITMQ_HOST}\", - \"rabbitmq-vhost\": \"/\", - \"rabbitmq-outbound-queue\": \"test-ci\", - \"rabbitmq-exchange\": \"ams-fanout\", - \"rabbitmq-routing-key\": \"training\" - }, - \"update_surrogate\": false - }, - \"ml_models\": {}, - \"domain_models\": {} - }""" > $GITHUB_WORKSPACE/build/tests/AMSlib/rmq.json - ctest --output-on-failure ./ env: RABBITMQ_USER: ams From 64d761ddda877cd82150352040fcc9ca136bc597 Mon Sep 17 00:00:00 2001 From: koparasy Date: Thu, 24 Apr 2025 21:20:11 -0700 Subject: [PATCH 084/136] Add new rmq config --- .github/workflows/ci.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3b1b3645..0daca14a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -280,15 +280,14 @@ jobs: export AMS_HDF5_PATH=$(spack location -i hdf5) export AMS_AMQPCPP_PATH=$(spack location -i amqp-cpp)/cmake echo """{ - \"rabbitmq-name\": \"rabbit\", \"rabbitmq-user\": \"${RABBITMQ_USER}\", \"rabbitmq-password\": \"${RABBITMQ_PASS}\", \"service-port\": ${RABBITMQ_PORT}, \"service-host\": \"${RABBITMQ_HOST}\", \"rabbitmq-vhost\": \"/\", - \"rabbitmq-outbound-queue\": \"test-ci\", - \"rabbitmq-exchange\": \"ams-fanout\", - \"rabbitmq-routing-key\": \"training\" + \"rabbitmq-queue-physics\": \"test-ci\", + \"rabbitmq-exchange-training\": \"ams-fanout\", + \"rabbitmq-key-training\": \"training\" }""" > rmq.json jq < rm.json export AMS_RMQ_CONFIG=$(cat ./rmq.json) From ad25c1f690f439fe2aaf9dc0f9cf1a8b6e725915 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Fri, 25 Apr 2025 12:11:11 -0700 Subject: [PATCH 085/136] Find HDF5 when installed in root through config --- CMakeLists.txt | 23 +++++++++++++--------- src/AMSlib/CMakeLists.txt | 2 +- tests/AMSlib/ams_interface/ams_ete.cpp | 11 ++--------- tests/AMSlib/ams_interface/ams_ete_env.cpp | 5 ----- tests/AMSlib/db/CMakeLists.txt | 4 ++++ tests/AMSlib/utils.hpp | 22 +++++++++++++++++++++ 6 files changed, 43 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 785adf91..446eff2b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ if (WITH_MPI) message(STATUS "MPICC: ${MPI_C_COMPILER}") message(STATUS "MPICXX: ${MPI_CXX_COMPILER}") message(STATUS "MPI Library used: " MPI::MPI_CXX) - foreach(LIBRARY ${MPI_CXX_LIBRARIES}) + foreach(LIBRARY ${MPI_C_LIBRARIES}) get_filename_component(LIB_DIR ${LIBRARY} DIRECTORY) list(APPEND MPI_DIRECTORIES ${LIB_DIR}) endforeach() @@ -84,16 +84,21 @@ if (WITH_AMS_DEBUG) endif() if (WITH_HDF5) - if (HDF5_USE_STATIC_LIBRARIES) - find_package(HDF5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) - set(AMS_HDF5_TARGET hdf5-static) - set(AMS_HDF5_LIB_TYPE "static") + if (AMS_HDF5_DIR) + if (HDF5_USE_STATIC_LIBRARIES) + find_package(HDF5 COMPONENTS C static NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) + set(AMS_HDF5_TARGET hdf5-static) + set(AMS_HDF5_LIB_TYPE "static") + else() + find_package(HDF5 COMPONENTS C shared NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) + set(AMS_HDF5_LIB_TYPE "shared") + set(AMS_HDF5_TARGET hdf5-shared) + endif() else() - find_package(HDF5 COMPONENTS C shared NO_DEFAULT_PATH PATHS ${AMS_HDF5_DIR} ${AMS_HDF5_DIR}/share/cmake) - set(AMS_HDF5_LIB_TYPE "shared") - set(AMS_HDF5_TARGET hdf5-shared) + find_package(HDF5 REQUIRED COMPONENTS C CXX) + set(AMS_HDF5_TARGET HDF5::HDF5) endif() - message(STATUS "HDF5 Dir is ${HDF5_DIR}") + message(STATUS "HDF5 Dir is ${HDF5_FOUND}") list(APPEND AMS_APP_DEFINES "__AMS_ENABLE_HDF5__") endif() # WITH_HDF5 diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index 0c06caec..0f881ae3 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -44,7 +44,7 @@ if (WITH_CALIPER) endif() if (WITH_MPI) - target_link_libraries(AMS PRIVATE MPI::MPI_CXX) + target_link_libraries(AMS PUBLIC MPI::MPI_CXX) endif() if (WITH_RMQ) diff --git a/tests/AMSlib/ams_interface/ams_ete.cpp b/tests/AMSlib/ams_interface/ams_ete.cpp index ba86be64..e88e96d8 100644 --- a/tests/AMSlib/ams_interface/ams_ete.cpp +++ b/tests/AMSlib/ams_interface/ams_ete.cpp @@ -1,20 +1,13 @@ #include -#ifdef __AMS_ENABLE_MPI__ -#include -#endif #include #include #include #include #include -#include -#include #include "../utils.hpp" #include "AMS.h" -#include "ml/surrogate.hpp" -#include "wf/debug.h" using namespace ams; @@ -145,13 +138,13 @@ int main(int argc, char **argv) char *model_path = argv[4]; AMSDType data_type = getDataType(argv[5]); std::string uq_name = std::string(argv[6]); - const AMSUQPolicy uq_policy = UQ::UQPolicyFromStr(uq_name); + const AMSUQPolicy uq_policy = UQPolicyFromStr(uq_name); float threshold = std::atof(argv[7]); int num_iterations = std::atoi(argv[8]); int avg_elements = std::atoi(argv[9]); std::string db_type_str = std::string(argv[10]); std::string fs_path = std::string(argv[11]); - AMSDBType db_type = ams::db::getDBType(db_type_str); + AMSDBType db_type = getDBType(db_type_str); AMSResourceType resource = AMSResourceType::AMS_HOST; srand(time(NULL)); diff --git a/tests/AMSlib/ams_interface/ams_ete_env.cpp b/tests/AMSlib/ams_interface/ams_ete_env.cpp index 9ccb267c..4da14c06 100644 --- a/tests/AMSlib/ams_interface/ams_ete_env.cpp +++ b/tests/AMSlib/ams_interface/ams_ete_env.cpp @@ -1,13 +1,8 @@ -#ifdef __AMS_ENABLE_MPI__ -#include -#endif #include #include #include #include -#include -#include #include "AMS.h" diff --git a/tests/AMSlib/db/CMakeLists.txt b/tests/AMSlib/db/CMakeLists.txt index 9ce0ff55..0f2f66c1 100644 --- a/tests/AMSlib/db/CMakeLists.txt +++ b/tests/AMSlib/db/CMakeLists.txt @@ -25,6 +25,10 @@ function(BUILD_UNIT_TEST exe source) target_link_libraries(${exe} PRIVATE ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) endif() + if (WITH_MPI) + target_link_libraries(${exe} PRIVATE MPI::MPI_CXX) + endif() + target_compile_definitions(${exe} PRIVATE ${AMS_APP_DEFINES}) endfunction() diff --git a/tests/AMSlib/utils.hpp b/tests/AMSlib/utils.hpp index 4c12ae98..ba0716b1 100644 --- a/tests/AMSlib/utils.hpp +++ b/tests/AMSlib/utils.hpp @@ -77,6 +77,28 @@ static inline AMSDBType getDBType(std::string db_type) return dbType; } +static std::string UQPolicyToStr(AMSUQPolicy policy) +{ + if (policy == AMSUQPolicy::AMS_RANDOM) + return "random"; + else if (policy == AMSUQPolicy::AMS_DELTAUQ_MEAN) + return "deltaUQ (mean)"; + else if (policy == AMSUQPolicy::AMS_DELTAUQ_MAX) + return "deltaUQ (max)"; + return "Unknown"; +} + +static AMSUQPolicy UQPolicyFromStr(std::string &policy) +{ + if (policy.compare("random") == 0) + return AMSUQPolicy::AMS_RANDOM; + else if (policy.compare("deltaUQ (mean)") == 0) + return AMSUQPolicy::AMS_DELTAUQ_MEAN; + else if (policy.compare("deltaUQ (max)") == 0) + return AMSUQPolicy::AMS_DELTAUQ_MAX; + return AMSUQPolicy::AMS_UQ_END; +} + // Signal handler to print the stack trace static inline void signalHandler(int signum) From 755b13bde30cffe62c4680d91fbf0583b3a2ce78 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Fri, 25 Apr 2025 14:15:20 -0700 Subject: [PATCH 086/136] Base Docker file for all containers --- .../Dockerfile | 99 +++++++++++++++++++ .../entrypoint.sh | 27 +++++ .../init.sql | 6 ++ .../rabbitmq.conf | 5 + .../supervisord.conf | 22 +++++ 5 files changed, 159 insertions(+) create mode 100644 .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/Dockerfile create mode 100644 .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/entrypoint.sh create mode 100644 .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/init.sql create mode 100644 .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/rabbitmq.conf create mode 100644 .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/supervisord.conf diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/Dockerfile b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/Dockerfile new file mode 100644 index 00000000..44ee7561 --- /dev/null +++ b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/Dockerfile @@ -0,0 +1,99 @@ +FROM fluxrm/flux-core:latest AS base +USER root +SHELL ["/bin/bash", "-lc"] + +ARG num_jobs +ARG hypre_version + +# Install MariaDB + tools +# Install extra packages (e.g., git, python3-pip) +RUN apt-get update && \ + apt-get install -y lsb-release gnupg software-properties-common \ + git python3 python3-pip mariadb-server mariadb-client \ + curl \ + rabbitmq-server supervisor \ + python3-venv \ + nlohmann-json3-dev \ + build-essential cmake \ + libopenmpi-dev libmetis-dev libhypre-dev \ + libblas-dev liblapack-dev \ + libhdf5-dev hdf5-tools && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +RUN chmod +x /usr/local/bin/entrypoint.sh + +COPY rabbitmq.conf /etc/rabbitmq/rabbitmq.conf +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +RUN mkdir -p /run/mysqld \ + && chown mysql:mysql /run/mysqld + +RUN rabbitmq-plugins enable --offline rabbitmq_management + + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/entrypoint.sh b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/entrypoint.sh new file mode 100644 index 00000000..72444209 --- /dev/null +++ b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/entrypoint.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +set -e + +# 1) ensure the socket directory exists and is owned by mysql +mkdir -p /run/mysqld +chown mysql:mysql /run/mysqld + +# 2) start MariaDB directly +# this will background itself (via mysqld_safe) +exec /usr/bin/mysqld_safe --datadir=/var/lib/mysql & + +# 3) wait until it's up +while ! mysqladmin ping -uroot --silent; do + sleep 1 +done +echo "MariaDB is up!" + +# 4) start RabbitMQ in detached mode +rabbitmq-server -detached + +# 5) drop into a shell (or run passed-in command) +if [ $# -gt 0 ]; then + exec "$@" +else + exec bash +fi + diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/init.sql b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/init.sql new file mode 100644 index 00000000..8401db2c --- /dev/null +++ b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/init.sql @@ -0,0 +1,6 @@ +ALTER USER 'root'@'localhost' IDENTIFIED BY 'secret'; +CREATE DATABASE IF NOT EXISTS testdb; +CREATE USER IF NOT EXISTS 'testuser'@'localhost' IDENTIFIED BY 'testpass'; +GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost'; +FLUSH PRIVILEGES; + diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/rabbitmq.conf b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/rabbitmq.conf new file mode 100644 index 00000000..3d5e1f4f --- /dev/null +++ b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/rabbitmq.conf @@ -0,0 +1,5 @@ +# rabbitmq.conf +listeners.tcp.default = 127.0.0.1:5672 +management.listener.ip = 127.0.0.1 +management.listener.port = 15672 + diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/supervisord.conf b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/supervisord.conf new file mode 100644 index 00000000..c6c24358 --- /dev/null +++ b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/supervisord.conf @@ -0,0 +1,22 @@ +[supervisord] +nodaemon=true +logfile=/var/log/supervisord.log + +[program:mariadb] +; run MariaDB as the mysql user so mysqld won’t abort +user = mysql +command = /usr/bin/mysqld_safe --datadir=/var/lib/mysql +stdout_logfile = /dev/stdout +stderr_logfile = /dev/stderr +priority = 10 +autorestart = true + +[program:rabbitmq] +; run RabbitMQ as the rabbitmq user +user = rabbitmq +command = /usr/sbin/rabbitmq-server +stdout_logfile = /dev/stdout +stderr_logfile = /dev/stderr +priority = 20 +autorestart = true + From 8ac39a3de727a88f2a5aa4b6d8d95927909c7bb8 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Fri, 25 Apr 2025 16:01:08 -0700 Subject: [PATCH 087/136] Remove pandas from verify in testing --- tests/AMSlib/ams_interface/verify_ete.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/AMSlib/ams_interface/verify_ete.py b/tests/AMSlib/ams_interface/verify_ete.py index 290e2749..524d7a64 100644 --- a/tests/AMSlib/ams_interface/verify_ete.py +++ b/tests/AMSlib/ams_interface/verify_ete.py @@ -1,7 +1,6 @@ import sys import json from pathlib import Path -import pandas as pd import h5py import numpy as np import os From c56a3028753abfbbcbedd6817fbcd2c02b3102a7 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Fri, 25 Apr 2025 16:43:13 -0700 Subject: [PATCH 088/136] Adding maria db tests --- .github/workflows/ci.yml | 46 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0daca14a..9c099418 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -323,3 +323,49 @@ jobs: RABBITMQ_PASS: ams RABBITMQ_HOST: rabbitmq RABBITMQ_PORT: 5672 + sqlite-tests: + runs-on: ubuntu-latest + container: ghcr.io/llnl/ams-ci-flux-mariadb:latest + + steps: + - uses: actions/checkout@v4 + + - name: Install AMS package (editable) + shell: bash -l {0} + run: | + source /venv/bin/activate + pip install -e ./ + + - name: Run AMS unittests (SQlite) + shell: bash -l {0} + run: | + source /venv/bin/activate + python -m unittest discover -s tests/AMSWorkflow -p "test_*.py" -v + mariadb-tests: + runs-on: ubuntu-latest + container: ghcr.io/llnl/ams-ci-flux-mariadb:latest + + steps: + - uses: actions/checkout@v4 + + - name: Start MariaDB + shell: bash -l {0} + run: | + mysqld_safe --datadir=/var/lib/mysql & + echo "Waiting for MariaDB..." + until mysqladmin ping -h 127.0.0.1 --silent; do sleep 1; done + echo "MariaDB is up" + + - name: Install AMS package (editable) + shell: bash -l {0} + run: | + source /venv/bin/activate + pip install -e ./ + + - name: Run AMS unittests (MariaDB) + env: + AMS_DB_URL: "mysql+mysqlconnector://testuser:testpass@127.0.0.1/testdb" + shell: bash -l {0} + run: | + source /venv/bin/activate + python -m unittest discover -s tests/AMSWorkflow -p "test_*.py" -v From 10310f904ea4561a39d14da742b6c54cd8fc17c1 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Sat, 26 Apr 2025 11:13:54 -0700 Subject: [PATCH 089/136] Separate build with install interface --- src/AMSlib/CMakeLists.txt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/AMSlib/CMakeLists.txt b/src/AMSlib/CMakeLists.txt index 0f881ae3..8e94c075 100644 --- a/src/AMSlib/CMakeLists.txt +++ b/src/AMSlib/CMakeLists.txt @@ -36,21 +36,23 @@ if (WITH_CUDA) endif() if (WITH_HDF5) - target_link_libraries(AMS PRIVATE ${AMS_HDF5_TARGET}) + target_link_libraries(AMS PUBLIC $ PRIVATE $) endif() if (WITH_CALIPER) - target_link_libraries(AMS PRIVATE caliper) + target_link_libraries(AMS PUBLIC $ PRIVATE $) endif() if (WITH_MPI) - target_link_libraries(AMS PUBLIC MPI::MPI_CXX) + target_link_libraries(AMS PUBLIC $ PRIVATE $) endif() if (WITH_RMQ) - target_link_libraries(AMS PRIVATE amqpcpp) + target_link_libraries(AMS PUBLIC $ PRIVATE $) + if (OPENSSL_FOUND) - target_link_libraries(AMS PRIVATE OpenSSL::SSL OpenSSL::Crypto) + target_link_libraries(AMS PUBLIC $ PRIVATE + $) endif() # NOTE: We set here the event/event pthreads as public. As there is no easy way # to do a find package(libevent) and RMQ is not exposing that properly. @@ -59,7 +61,9 @@ if (WITH_RMQ) target_link_libraries(AMS PUBLIC ${LIBEVENT_LIBRARY} ${LIBEVENT_THREAD}) endif() -target_link_libraries(AMS PRIVATE stdc++fs torch) +target_link_libraries(AMS PUBLIC + $ PRIVATE + $) configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/include/AMS-config.h.in" "${PROJECT_BINARY_DIR}/include/AMS-config.h") From e933ebc4a76812a4d2f72fa87eb19efb39ded224 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 07:56:11 -0700 Subject: [PATCH 090/136] Add tutorial docker file --- .../Dockerfile | 99 ------------- .github/containers/x86_64-tutorial/Dockerfile | 133 ++++++++++++++++++ .github/containers/x86_64-tutorial/README.md | 3 + .../entrypoint.sh | 12 +- .../init.sql | 0 .../rabbitmq.conf | 0 .../supervisord.conf | 0 7 files changed, 147 insertions(+), 100 deletions(-) delete mode 100644 .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/Dockerfile create mode 100644 .github/containers/x86_64-tutorial/Dockerfile create mode 100644 .github/containers/x86_64-tutorial/README.md rename .github/containers/{x86_64-gcc.12.2-mariadb-flux-rmq-base => x86_64-tutorial}/entrypoint.sh (59%) rename .github/containers/{x86_64-gcc.12.2-mariadb-flux-rmq-base => x86_64-tutorial}/init.sql (100%) rename .github/containers/{x86_64-gcc.12.2-mariadb-flux-rmq-base => x86_64-tutorial}/rabbitmq.conf (100%) rename .github/containers/{x86_64-gcc.12.2-mariadb-flux-rmq-base => x86_64-tutorial}/supervisord.conf (100%) diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/Dockerfile b/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/Dockerfile deleted file mode 100644 index 44ee7561..00000000 --- a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/Dockerfile +++ /dev/null @@ -1,99 +0,0 @@ -FROM fluxrm/flux-core:latest AS base -USER root -SHELL ["/bin/bash", "-lc"] - -ARG num_jobs -ARG hypre_version - -# Install MariaDB + tools -# Install extra packages (e.g., git, python3-pip) -RUN apt-get update && \ - apt-get install -y lsb-release gnupg software-properties-common \ - git python3 python3-pip mariadb-server mariadb-client \ - curl \ - rabbitmq-server supervisor \ - python3-venv \ - nlohmann-json3-dev \ - build-essential cmake \ - libopenmpi-dev libmetis-dev libhypre-dev \ - libblas-dev liblapack-dev \ - libhdf5-dev hdf5-tools && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -COPY entrypoint.sh /usr/local/bin/entrypoint.sh -RUN chmod +x /usr/local/bin/entrypoint.sh - -COPY rabbitmq.conf /etc/rabbitmq/rabbitmq.conf -COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf - -RUN mkdir -p /run/mysqld \ - && chown mysql:mysql /run/mysqld - -RUN rabbitmq-plugins enable --offline rabbitmq_management - - -ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] -CMD ["supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/.github/containers/x86_64-tutorial/Dockerfile b/.github/containers/x86_64-tutorial/Dockerfile new file mode 100644 index 00000000..a96a2a07 --- /dev/null +++ b/.github/containers/x86_64-tutorial/Dockerfile @@ -0,0 +1,133 @@ +# ┌──────────────┐ +# │ BUILDER │ +# └──────────────┘ + +FROM fluxrm/flux-core:latest AS builder +USER root +SHELL ["/bin/bash", "-lc"] + +ARG num_jobs +ARG hypre_version + +# Install MariaDB + tools +# Install extra packages (e.g., git, python3-pip) +RUN apt-get update && \ + apt-get install -y lsb-release gnupg software-properties-common \ + git python3 python3-pip mariadb-server mariadb-client \ + curl \ + rabbitmq-server supervisor \ + python3-venv \ + nlohmann-json3-dev \ + build-essential cmake \ + libopenmpi-dev libmetis-dev libhypre-dev \ + libblas-dev liblapack-dev \ + libhdf5-dev hdf5-tools && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +RUN mkdir -p /run/mysqld \ + && chown mysql:mysql /run/mysqld + +RUN rabbitmq-plugins enable --offline rabbitmq_management +WORKDIR /opt/archives +#HYPRE +RUN curl -L https://github.com/hypre-space/hypre/archive/refs/tags/v${hypre_version}.tar.gz > /opt/archives/hypre-v${hypre_version}.tar.gz && \ + tar xzf hypre-v${hypre_version}.tar.gz && cd hypre-${hypre_version}/src && \ + ./configure --prefix /usr/local --enable-shared --disable-static && \ + make -j ${num_jobs} && make install && \ + rm -rf hypre-v${hypre_version}* + +#MFEM +RUN git clone --depth=1 https://github.com/mfem/mfem.git /opt/archives/mfem && \ + mkdir -p /opt/archives/mfem/build && cd /opt/archives/mfem/build/ && \ + cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DMFEM_USE_MPI=ON -DMFEM_USE_METIS_5=ON -DMFEM_USE_HYPRE=ON .. && \ + make -j"$(nproc)" && \ + make install + +#CALIPER +RUN cd /opt/archives/ && \ + git clone --depth 1 https://github.com/LLNL/Caliper.git && \ + cd Caliper && \ + mkdir build && cd build && \ + cmake -DCMAKE_INSTALL_PREFIX=/usr/local/ .. && \ + make && \ + make install + +#AMQCPP +RUN cd /opt/archives/ && \ + git clone --depth=1 https://github.com/CopernicaMarketingSoftware/AMQP-CPP.git && \ + mkdir -p /opt/archives/AMQP-CPP/build/ && \ + cd /opt/archives/AMQP-CPP/build/ && \ + cmake -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=0" -DAMQP-CPP_LINUX_TCP=ON -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DAMQP-CPP_BUILD_SHARED=On .. && \ + make && \ + make install + +RUN python3 -m venv /app/venv --system-site-packages +ENV PATH="/app/venv/bin:$PATH" +RUN source /app/venv/bin/activate && \ + python3 -m pip install --no-cache-dir torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + python -m pip install --no-cache-dir h5py + +ENV AMS_MFEM_PATH=/usr/local/ +ENV AMS_TORCH_PATH=/app/venv/lib/python3.11/site-packages/torch/share/cmake/Torch + +RUN cd /opt/archives/ && \ + source /app/venv/bin/activate && \ + git clone --depth 1 https://github.com/LLNL/AMS.git -b features/ams-new-interface && \ + mkdir -p /opt/archives/AMS/build/ && \ + cd /opt/archives/AMS/build/ && \ + cmake \ + -DBUILD_SHARED_LIBS=On \ + -DWITH_RMQ=On \ + -DWITH_CALIPER=On \ + -DWITH_HDF5=On \ + -DWITH_AMS_DEBUG=On \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DWITH_CUDA=Off \ + -DMFEM_DIR=$AMS_MFEM_PATH \ + -DWITH_MPI=On \ + -DWITH_TORCH=On \ + -DTorch_DIR=$AMS_TORCH_PATH \ + -DWITH_WORKFLOW=On \ + ../ && \ + make && \ + make install + +# ┌──────────────┐ +# │ RUNTIME │ +# └──────────────┘ +FROM fluxrm/flux-core:latest AS runtime +USER root +SHELL ["/bin/bash", "-lc"] + +# 1) Install _only_ runtime deps +RUN apt-get update && \ + apt-get install -y lsb-release gnupg software-properties-common \ + git python3 python3-pip mariadb-server mariadb-client \ + curl \ + rabbitmq-server supervisor \ + python3-venv \ + nlohmann-json3-dev \ + build-essential cmake \ + libopenmpi-dev libmetis-dev libhypre-dev \ + libblas-dev liblapack-dev \ + libhdf5-dev hdf5-tools && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# 2) Copy in your built artifacts +COPY --from=builder /usr/local /usr/local +COPY --from=builder /app/venv /app/venv + +# 3) Copy configs & entrypoint +COPY entrypoint.sh /usr/local/bin/entrypoint.sh +COPY rabbitmq.conf /etc/rabbitmq/rabbitmq.conf +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf +ENV PATH="/app/venv/bin:$PATH" + +RUN chmod +x /usr/local/bin/entrypoint.sh + +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] +CMD ["supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] + diff --git a/.github/containers/x86_64-tutorial/README.md b/.github/containers/x86_64-tutorial/README.md new file mode 100644 index 00000000..4393671d --- /dev/null +++ b/.github/containers/x86_64-tutorial/README.md @@ -0,0 +1,3 @@ +# Container with all necessary AMS dependencies installed and with AMS + +The container runs a RMQ and a MariaDB server. diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/entrypoint.sh b/.github/containers/x86_64-tutorial/entrypoint.sh similarity index 59% rename from .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/entrypoint.sh rename to .github/containers/x86_64-tutorial/entrypoint.sh index 72444209..83cea3a3 100644 --- a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/entrypoint.sh +++ b/.github/containers/x86_64-tutorial/entrypoint.sh @@ -15,10 +15,20 @@ while ! mysqladmin ping -uroot --silent; do done echo "MariaDB is up!" +: "${MYSQL_ROOT_PASSWORD:=root}" # default, if not passed-in +mysql -uroot <<-EOSQL + ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}'; + FLUSH PRIVILEGES; +EOSQL +echo "Root password set to '${MYSQL_ROOT_PASSWORD}'" + # 4) start RabbitMQ in detached mode rabbitmq-server -detached -# 5) drop into a shell (or run passed-in command) +# 5) Load the python venv +source /app/venv/bin/activate + +# 6) drop into a shell (or run passed-in command) if [ $# -gt 0 ]; then exec "$@" else diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/init.sql b/.github/containers/x86_64-tutorial/init.sql similarity index 100% rename from .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/init.sql rename to .github/containers/x86_64-tutorial/init.sql diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/rabbitmq.conf b/.github/containers/x86_64-tutorial/rabbitmq.conf similarity index 100% rename from .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/rabbitmq.conf rename to .github/containers/x86_64-tutorial/rabbitmq.conf diff --git a/.github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/supervisord.conf b/.github/containers/x86_64-tutorial/supervisord.conf similarity index 100% rename from .github/containers/x86_64-gcc.12.2-mariadb-flux-rmq-base/supervisord.conf rename to .github/containers/x86_64-tutorial/supervisord.conf From e6125fa6ec4d30abfda93d8ebc96b1f4dff83416 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 07:58:57 -0700 Subject: [PATCH 091/136] Update readme --- .github/containers/x86_64-tutorial/README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/containers/x86_64-tutorial/README.md b/.github/containers/x86_64-tutorial/README.md index 4393671d..2400dbe7 100644 --- a/.github/containers/x86_64-tutorial/README.md +++ b/.github/containers/x86_64-tutorial/README.md @@ -1,3 +1,13 @@ # Container with all necessary AMS dependencies installed and with AMS -The container runs a RMQ and a MariaDB server. +The container runs a RMQ and a MariaDB server on startup. To build issue: + +```bash +docker build -t /ams-tutorial:latest . --build-arg hypre_version=2.33.0 +``` + +To run issue: +```bash +docker run --rm -it -v "$(pwd)":/workspace -w /workspace /ams-tutorial:latest bash +``` + From bfbf51836d5da26c698c260e1f5a72022bb1a5e2 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 08:32:34 -0700 Subject: [PATCH 092/136] Add initial instructions --- tutorial/README.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 tutorial/README.md diff --git a/tutorial/README.md b/tutorial/README.md new file mode 100644 index 00000000..03a0a7c6 --- /dev/null +++ b/tutorial/README.md @@ -0,0 +1,44 @@ +# AMS Tutorial + +The tutorial provides a docker with all the necessary installations to build applications against AMS and run them on a CPU system. + +## Download container + +To download the container please issue the following command on your terminal: + +``` +docker pull ghcr.io/llnl/ams-x86-tutorial:latest +``` + +The expected output should be similar to: + +``` +154ef9065217: Already exists +4e338da1ac28: Already exists +068a1074ab96: Already exists +dd6c369f83fa: Already exists +a112725ae27e: Already exists +c948d35905b3: Already exists +edcd2ec99d0b: Already exists + +Digest: sha256:24950b5ebb5ee90657fdd17d007921732b36e7d8e3820a6778779ed9357d2b9f +Status: Downloaded newer image for ghcr.io/llnl/ams-x86-tutorial:latest +``` + +## Run container interactively + +docker run --rm -it \ + -v "$(pwd)":/workspace -w /workspace \ + ghcr.io/llnl/ams-x86-tutorial:latest \ + bash + +The command should provide an interactive `bash` shell and the output should look like the following: + +``` +250428 15:31:30 mysqld_safe Logging to syslog. +250428 15:31:30 mysqld_safe Starting mariadbd daemon with databases from /var/lib/mysql +mysqld is alive +MariaDB is up! +Root password set to 'root' +``` + From 0c1e13bcfb8d38053d975339121911435cdb6b87 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 10:37:39 -0700 Subject: [PATCH 093/136] Example 0 instructions and code --- tutorial/0.Build/CMakeLists.txt | 38 +++++++++ tutorial/0.Build/README.md | 41 ++++++++++ tutorial/0.Build/common.hpp | 132 ++++++++++++++++++++++++++++++++ tutorial/0.Build/ex0.cpp | 62 +++++++++++++++ 4 files changed, 273 insertions(+) create mode 100644 tutorial/0.Build/CMakeLists.txt create mode 100644 tutorial/0.Build/README.md create mode 100644 tutorial/0.Build/common.hpp create mode 100644 tutorial/0.Build/ex0.cpp diff --git a/tutorial/0.Build/CMakeLists.txt b/tutorial/0.Build/CMakeLists.txt new file mode 100644 index 00000000..683d13ab --- /dev/null +++ b/tutorial/0.Build/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright 2021-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +cmake_minimum_required(VERSION 3.10) +cmake_policy(SET CMP0104 NEW) + +# Define the project +project(EX0 LANGUAGES CXX) + +set(AMS_EXAMPLE_SRC ex0.cpp) + + +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +find_package(AMS REQUIRED) + +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + + +add_executable(EX0 ${AMS_EXAMPLE_SRC}) +target_link_libraries(EX0 PRIVATE ${MFEM_LIBRARIES}) +target_include_directories(EX0 PRIVATE ${MFEM_INCLUDE_DIRS}) +target_link_libraries(EX0 PRIVATE AMS::AMS) + + diff --git a/tutorial/0.Build/README.md b/tutorial/0.Build/README.md new file mode 100644 index 00000000..ea701c5e --- /dev/null +++ b/tutorial/0.Build/README.md @@ -0,0 +1,41 @@ +# Build and Link with AMS + +AMS is a standard cmake package providing a `AMS-config.cmake` file and the AMS target. +We provide an example C++ code and the respective `cmake` file to build and link with AMS. + +## Include and link with AMS + +To use AMS we need to `find_package(AMS REQUIRED)` ([here](./CMakeLists.txt#L22)) and then use the `AMS::AMS` target in the `cmake` function `target_link_libraries`([here](./CMakeLists.txt#L27)). + +## Example Code + +The [example](./ex0.cpp) code is very simple. The user provides in the *cli* the length of 2 vectors, the example initializes the `input` vector from *0-length-1* values and then assigns these values to the [output vector](./ex0.cpp#L50) finally it computes the sum of all elements in the output vector and prints the sum at the terminal with the expected output value. + + +## Configure and link + +To configure the example please provide these commands: + +``` +mkdir build +cd build +cmake ../ +``` + +If AMS is not installed in a default cmake directory please also provide the path to the AMS installation by passing the option +`-DAMS_DIR=` to the cmake command. + +## Execute example + +To execute the example please provide the following *cli*: + +``` +./EX0 -l 10 +``` + +And the expected output should be: + +``` +[Example] Expected output is 45 and computed 45 +``` + diff --git a/tutorial/0.Build/common.hpp b/tutorial/0.Build/common.hpp new file mode 100644 index 00000000..ae8ef4f3 --- /dev/null +++ b/tutorial/0.Build/common.hpp @@ -0,0 +1,132 @@ +#include +#include +#include +#include + +class ExampleArgs +{ +public: + void PrintOptions() const + { + std::cout << "Available options:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << "\n " << opt.help << "\n"; + } + } + + void Parse(int argc, char** argv) + { + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg[0] != '-') continue; + + std::string key = arg; + std::string value; + + // If the next item isn't an option, treat it as a value + if (i + 1 < argc && argv[i + 1][0] != '-') { + value = argv[++i]; + } else { + value = "true"; // Boolean flag + } + + options_[key] = value; + } + + // Set parsed values into variables + for (auto& opt : registered_) { + const auto& keys = opt.keys; + for (const auto& key : keys) { + if (options_.count(key)) { + opt.setter(options_[key]); + opt.wasset = true; + break; + } + } + } + } + + template + void AddOption(T* out, + std::string short_opt, + std::string long_opt, + std::string help, + bool required = true) + { + registered_.push_back( + {{short_opt, long_opt}, + [out](const std::string& val) { parseValue(val, out); }, + [out]() { return toString(*out); }, + help, + required, + false}); + } + + bool Good() const + { + for (const auto& opt : registered_) { + if (opt.required && !opt.wasset) { + return false; + } + } + return true; + } + + void PrintUsage() const + { + std::cout << "Parsed arguments:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << " = " << opt.getter() << "\n"; + } + } + +private: + struct RegisteredOption { + std::vector keys; + std::function setter; + std::function getter; + std::string help; + bool required; + bool wasset; + }; + + std::vector registered_; + std::unordered_map options_; + + // Parser helper + template + static void parseValue(const std::string& s, T* out); + + static void parseValue(const std::string& s, std::string* out) { *out = s; } + + static void parseValue(const std::string& s, int* out) + { + *out = std::stoi(s); + } + + static void parseValue(const std::string& s, bool* out) + { + *out = (s == "true" || s == "1"); + } + + static void parseValue(const std::string& s, double* out) + { + *out = std::stod(s); + } + + + static std::string toString(const std::string& val) { return val; } + static std::string toString(bool val) { return val ? "true" : "false"; } + static std::string toString(int val) { return std::to_string(val); } + static std::string toString(double val) { return std::to_string(val); } +}; diff --git a/tutorial/0.Build/ex0.cpp b/tutorial/0.Build/ex0.cpp new file mode 100644 index 00000000..f2442956 --- /dev/null +++ b/tutorial/0.Build/ex0.cpp @@ -0,0 +1,62 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + int length; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + double* input = new double[length]; + double* output = new double[length]; + + InitMemBlob(input, length); + ExampleCompute(input, output, length); + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + + + return 0; +} From f5e90769d6451b828960686dc055b99bec14d4fb Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 10:48:01 -0700 Subject: [PATCH 094/136] Fixes for cmake --- CMakeLists.txt | 1 + cmake/AMSConfig.cmake.in | 4 +++- tutorial/README.md | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 446eff2b..bccc4e99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,6 +95,7 @@ if (WITH_HDF5) set(AMS_HDF5_TARGET hdf5-shared) endif() else() + set(AMS_HDF5_LIB_TYPE "") find_package(HDF5 REQUIRED COMPONENTS C CXX) set(AMS_HDF5_TARGET HDF5::HDF5) endif() diff --git a/cmake/AMSConfig.cmake.in b/cmake/AMSConfig.cmake.in index a967f501..fe12973f 100644 --- a/cmake/AMSConfig.cmake.in +++ b/cmake/AMSConfig.cmake.in @@ -39,7 +39,9 @@ if (AMS_WITH_HDF5) set(HDF5_DIR ${AMS_HDF5_DIR}) endif() - if (${AMS_HDF5_LIB_TYPE} STREQUAL "static") + if (${AMS_HDF5_LIB_TYPE} STREQUAL "") + find_dependency(HDF5 COMPONENTS C) + elseif (${AMS_HDF5_LIB_TYPE} STREQUAL "static") find_dependency(HDF5 COMPONENTS C static HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) else() find_dependency(HDF5 COMPONENTS C shared HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) diff --git a/tutorial/README.md b/tutorial/README.md index 03a0a7c6..ae669aa6 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -27,10 +27,12 @@ Status: Downloaded newer image for ghcr.io/llnl/ams-x86-tutorial:latest ## Run container interactively +``` docker run --rm -it \ -v "$(pwd)":/workspace -w /workspace \ ghcr.io/llnl/ams-x86-tutorial:latest \ bash +``` The command should provide an interactive `bash` shell and the output should look like the following: From c4706ed368d3e5f70c7bd86c898c65133a9cf952 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 11:19:46 -0700 Subject: [PATCH 095/136] Point to tutorial branch --- .github/containers/x86_64-tutorial/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/containers/x86_64-tutorial/Dockerfile b/.github/containers/x86_64-tutorial/Dockerfile index a96a2a07..8190e115 100644 --- a/.github/containers/x86_64-tutorial/Dockerfile +++ b/.github/containers/x86_64-tutorial/Dockerfile @@ -73,7 +73,7 @@ ENV AMS_TORCH_PATH=/app/venv/lib/python3.11/site-packages/torch/share/cmake/Torc RUN cd /opt/archives/ && \ source /app/venv/bin/activate && \ - git clone --depth 1 https://github.com/LLNL/AMS.git -b features/ams-new-interface && \ + git clone --depth 1 https://github.com/LLNL/AMS.git -b features/tutorial && \ mkdir -p /opt/archives/AMS/build/ && \ cd /opt/archives/AMS/build/ && \ cmake \ From 53ae4bf6a3b7120fb8631f597a1b89b0b597cd9f Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 11:23:20 -0700 Subject: [PATCH 096/136] Add default option on h5 --- CMakeLists.txt | 2 +- cmake/AMSConfig.cmake.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bccc4e99..eef2edef 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,7 +95,7 @@ if (WITH_HDF5) set(AMS_HDF5_TARGET hdf5-shared) endif() else() - set(AMS_HDF5_LIB_TYPE "") + set(AMS_HDF5_LIB_TYPE "default") find_package(HDF5 REQUIRED COMPONENTS C CXX) set(AMS_HDF5_TARGET HDF5::HDF5) endif() diff --git a/cmake/AMSConfig.cmake.in b/cmake/AMSConfig.cmake.in index fe12973f..a87e5bd0 100644 --- a/cmake/AMSConfig.cmake.in +++ b/cmake/AMSConfig.cmake.in @@ -39,7 +39,7 @@ if (AMS_WITH_HDF5) set(HDF5_DIR ${AMS_HDF5_DIR}) endif() - if (${AMS_HDF5_LIB_TYPE} STREQUAL "") + if (${AMS_HDF5_LIB_TYPE} STREQUAL "default") find_dependency(HDF5 COMPONENTS C) elseif (${AMS_HDF5_LIB_TYPE} STREQUAL "static") find_dependency(HDF5 COMPONENTS C static HINTS @AMS_HDF5_DIR@ @AMS_HDF5_DIR@/share/cmake) From 62ec46bbb6dd90b155d3bb2ebde630cdd68a0ed1 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 11:34:26 -0700 Subject: [PATCH 097/136] Minor --- .github/containers/x86_64-tutorial/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/containers/x86_64-tutorial/Dockerfile b/.github/containers/x86_64-tutorial/Dockerfile index 8190e115..c28cfb5a 100644 --- a/.github/containers/x86_64-tutorial/Dockerfile +++ b/.github/containers/x86_64-tutorial/Dockerfile @@ -74,14 +74,14 @@ ENV AMS_TORCH_PATH=/app/venv/lib/python3.11/site-packages/torch/share/cmake/Torc RUN cd /opt/archives/ && \ source /app/venv/bin/activate && \ git clone --depth 1 https://github.com/LLNL/AMS.git -b features/tutorial && \ - mkdir -p /opt/archives/AMS/build/ && \ - cd /opt/archives/AMS/build/ && \ + mkdir -p /opt/archives/AMS/build-ams/ && \ + cd /opt/archives/AMS/build-ams/ && \ cmake \ -DBUILD_SHARED_LIBS=On \ -DWITH_RMQ=On \ -DWITH_CALIPER=On \ -DWITH_HDF5=On \ - -DWITH_AMS_DEBUG=On \ + -DWITH_AMS_DEBUG=On \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DWITH_CUDA=Off \ From 4cd6b0c312168fd739ff3e08980d18337d35d55a Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 11:37:19 -0700 Subject: [PATCH 098/136] Define examples as C project --- tutorial/0.Build/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/0.Build/CMakeLists.txt b/tutorial/0.Build/CMakeLists.txt index 683d13ab..4bd311bf 100644 --- a/tutorial/0.Build/CMakeLists.txt +++ b/tutorial/0.Build/CMakeLists.txt @@ -8,7 +8,7 @@ cmake_minimum_required(VERSION 3.10) cmake_policy(SET CMP0104 NEW) # Define the project -project(EX0 LANGUAGES CXX) +project(EX0 LANGUAGES CXX C) set(AMS_EXAMPLE_SRC ex0.cpp) From a3ad7e576010b52b9bec82d3590b649d95fd4770 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 11:50:36 -0700 Subject: [PATCH 099/136] Modifications to init ams on 0-example --- .github/containers/x86_64-tutorial/Dockerfile | 1 + tutorial/0.Build/README.md | 17 +++++++++++++++++ tutorial/0.Build/ex0.cpp | 3 +++ 3 files changed, 21 insertions(+) diff --git a/.github/containers/x86_64-tutorial/Dockerfile b/.github/containers/x86_64-tutorial/Dockerfile index c28cfb5a..0943f510 100644 --- a/.github/containers/x86_64-tutorial/Dockerfile +++ b/.github/containers/x86_64-tutorial/Dockerfile @@ -82,6 +82,7 @@ RUN cd /opt/archives/ && \ -DWITH_CALIPER=On \ -DWITH_HDF5=On \ -DWITH_AMS_DEBUG=On \ + -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=On \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DWITH_CUDA=Off \ diff --git a/tutorial/0.Build/README.md b/tutorial/0.Build/README.md index ea701c5e..4ded92a6 100644 --- a/tutorial/0.Build/README.md +++ b/tutorial/0.Build/README.md @@ -39,3 +39,20 @@ And the expected output should be: [Example] Expected output is 45 and computed 45 ``` +## Enable Logger + +The container's AMS version is linked and working with the AMS logger to enable it you can execute: + +``` +AMS_LOG_LEVEL=debug ./EX0 -l 10 +``` + +The output should look like this: + +``` +[AMS:DEBUG:ResourceManager] Initialization of allocators +[AMS:DEBUG:ResourceManager] Set Allocator [0] to pool with name : HOST +[Example] Expected output is 45 and computed 45 +[AMS:DEBUG:AMS] Finalization of AMS +[AMS:DEBUG:AMSDefaultDeviceAllocator] Destroying default host allocator +``` diff --git a/tutorial/0.Build/ex0.cpp b/tutorial/0.Build/ex0.cpp index f2442956..90bb304b 100644 --- a/tutorial/0.Build/ex0.cpp +++ b/tutorial/0.Build/ex0.cpp @@ -43,6 +43,8 @@ int main(int argc, char* argv[]) return -1; } + ams::AMSInit(); + double* input = new double[length]; double* output = new double[length]; @@ -56,6 +58,7 @@ int main(int argc, char* argv[]) delete[] input; delete[] output; + ams::AMSFinalize(); return 0; From 881d78cb99d8c55fe65025293bb7cf9001bbfa6e Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 12:45:56 -0700 Subject: [PATCH 100/136] Adding code structure --- tutorial/1.AMSTensor/CMakeLists.txt | 37 ++++++++ tutorial/1.AMSTensor/common.hpp | 132 ++++++++++++++++++++++++++++ tutorial/1.AMSTensor/ex1.cpp | 65 ++++++++++++++ tutorial/1.AMSTensor/sol1.cpp | 75 ++++++++++++++++ 4 files changed, 309 insertions(+) create mode 100644 tutorial/1.AMSTensor/CMakeLists.txt create mode 100644 tutorial/1.AMSTensor/common.hpp create mode 100644 tutorial/1.AMSTensor/ex1.cpp create mode 100644 tutorial/1.AMSTensor/sol1.cpp diff --git a/tutorial/1.AMSTensor/CMakeLists.txt b/tutorial/1.AMSTensor/CMakeLists.txt new file mode 100644 index 00000000..7e76f22a --- /dev/null +++ b/tutorial/1.AMSTensor/CMakeLists.txt @@ -0,0 +1,37 @@ +# Copyright 2021-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +cmake_minimum_required(VERSION 3.10) +cmake_policy(SET CMP0104 NEW) + +# Define the project +project(EX1 LANGUAGES CXX C) + +set(AMS_EXAMPLE_SRC ex1.cpp) + +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +find_package(AMS REQUIRED) + +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + + +add_executable(EX1 ${AMS_EXAMPLE_SRC}) +target_link_libraries(EX1 PRIVATE ${MFEM_LIBRARIES}) +target_include_directories(EX1 PRIVATE ${MFEM_INCLUDE_DIRS}) +target_link_libraries(EX1 PRIVATE AMS::AMS) + + diff --git a/tutorial/1.AMSTensor/common.hpp b/tutorial/1.AMSTensor/common.hpp new file mode 100644 index 00000000..ae8ef4f3 --- /dev/null +++ b/tutorial/1.AMSTensor/common.hpp @@ -0,0 +1,132 @@ +#include +#include +#include +#include + +class ExampleArgs +{ +public: + void PrintOptions() const + { + std::cout << "Available options:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << "\n " << opt.help << "\n"; + } + } + + void Parse(int argc, char** argv) + { + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg[0] != '-') continue; + + std::string key = arg; + std::string value; + + // If the next item isn't an option, treat it as a value + if (i + 1 < argc && argv[i + 1][0] != '-') { + value = argv[++i]; + } else { + value = "true"; // Boolean flag + } + + options_[key] = value; + } + + // Set parsed values into variables + for (auto& opt : registered_) { + const auto& keys = opt.keys; + for (const auto& key : keys) { + if (options_.count(key)) { + opt.setter(options_[key]); + opt.wasset = true; + break; + } + } + } + } + + template + void AddOption(T* out, + std::string short_opt, + std::string long_opt, + std::string help, + bool required = true) + { + registered_.push_back( + {{short_opt, long_opt}, + [out](const std::string& val) { parseValue(val, out); }, + [out]() { return toString(*out); }, + help, + required, + false}); + } + + bool Good() const + { + for (const auto& opt : registered_) { + if (opt.required && !opt.wasset) { + return false; + } + } + return true; + } + + void PrintUsage() const + { + std::cout << "Parsed arguments:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << " = " << opt.getter() << "\n"; + } + } + +private: + struct RegisteredOption { + std::vector keys; + std::function setter; + std::function getter; + std::string help; + bool required; + bool wasset; + }; + + std::vector registered_; + std::unordered_map options_; + + // Parser helper + template + static void parseValue(const std::string& s, T* out); + + static void parseValue(const std::string& s, std::string* out) { *out = s; } + + static void parseValue(const std::string& s, int* out) + { + *out = std::stoi(s); + } + + static void parseValue(const std::string& s, bool* out) + { + *out = (s == "true" || s == "1"); + } + + static void parseValue(const std::string& s, double* out) + { + *out = std::stod(s); + } + + + static std::string toString(const std::string& val) { return val; } + static std::string toString(bool val) { return val ? "true" : "false"; } + static std::string toString(int val) { return std::to_string(val); } + static std::string toString(double val) { return std::to_string(val); } +}; diff --git a/tutorial/1.AMSTensor/ex1.cpp b/tutorial/1.AMSTensor/ex1.cpp new file mode 100644 index 00000000..90bb304b --- /dev/null +++ b/tutorial/1.AMSTensor/ex1.cpp @@ -0,0 +1,65 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + int length; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + InitMemBlob(input, length); + ExampleCompute(input, output, length); + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} diff --git a/tutorial/1.AMSTensor/sol1.cpp b/tutorial/1.AMSTensor/sol1.cpp new file mode 100644 index 00000000..56bc1349 --- /dev/null +++ b/tutorial/1.AMSTensor/sol1.cpp @@ -0,0 +1,75 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } + +} + +void ExampleComputeTensors(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + using ams; + int length; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + + + InitMemBlob(input, length); + ExampleCompute(input, output, length); + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} From 8d7216144a7828fcd00ee787f44d296ce81032cb Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 12:54:47 -0700 Subject: [PATCH 101/136] Example and solution code --- tutorial/1.AMSTensor/ex1.cpp | 23 ++++++++++++++++++++++- tutorial/1.AMSTensor/sol1.cpp | 4 +--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/tutorial/1.AMSTensor/ex1.cpp b/tutorial/1.AMSTensor/ex1.cpp index 90bb304b..54239475 100644 --- a/tutorial/1.AMSTensor/ex1.cpp +++ b/tutorial/1.AMSTensor/ex1.cpp @@ -18,6 +18,10 @@ void ExampleCompute(double* in, double* out, int size) } } +void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out, int size) +{ + ExampleCompute(in.data(), out.data(), size); +} double ComputeSum(double* out, int size) { @@ -49,7 +53,24 @@ int main(int argc, char* argv[]) double* output = new double[length]; InitMemBlob(input, length); - ExampleCompute(input, output, length); + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + ams::AMSTensor InT = ams::AMSTensor::view(input, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); + + ams::AMSTensor OutT = ams::AMSTensor::view(output, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); + + + ExampleAMSTensorCompute(InT, OutT, length); auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 diff --git a/tutorial/1.AMSTensor/sol1.cpp b/tutorial/1.AMSTensor/sol1.cpp index 56bc1349..cade0a40 100644 --- a/tutorial/1.AMSTensor/sol1.cpp +++ b/tutorial/1.AMSTensor/sol1.cpp @@ -16,7 +16,6 @@ void ExampleCompute(double* in, double* out, int size) for (int i = 0; i < size; i++) { out[i] = in[i]; } - } void ExampleComputeTensors(double* in, double* out, int size) @@ -37,7 +36,7 @@ double ComputeSum(double* out, int size) int main(int argc, char* argv[]) { - using ams; + using namespace ams; int length; ExampleArgs args; args.AddOption(&length, @@ -57,7 +56,6 @@ int main(int argc, char* argv[]) double* output = new double[length]; - InitMemBlob(input, length); ExampleCompute(input, output, length); auto sum = ComputeSum(output, length); From 80c1aba35cca453811112b21f6fb8d69ccdab62c Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 13:06:06 -0700 Subject: [PATCH 102/136] Adding 1st step --- tutorial/0.Build/CMakeLists.txt | 4 ---- tutorial/0.Build/README.md | 4 ++-- tutorial/1.AMSTensor/CMakeLists.txt | 5 +++-- tutorial/1.AMSTensor/ex1.cpp | 6 +++--- tutorial/README.md | 4 ++++ 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/tutorial/0.Build/CMakeLists.txt b/tutorial/0.Build/CMakeLists.txt index 4bd311bf..7feb67e4 100644 --- a/tutorial/0.Build/CMakeLists.txt +++ b/tutorial/0.Build/CMakeLists.txt @@ -31,8 +31,4 @@ endif() add_executable(EX0 ${AMS_EXAMPLE_SRC}) -target_link_libraries(EX0 PRIVATE ${MFEM_LIBRARIES}) -target_include_directories(EX0 PRIVATE ${MFEM_INCLUDE_DIRS}) target_link_libraries(EX0 PRIVATE AMS::AMS) - - diff --git a/tutorial/0.Build/README.md b/tutorial/0.Build/README.md index 4ded92a6..c3b469b8 100644 --- a/tutorial/0.Build/README.md +++ b/tutorial/0.Build/README.md @@ -5,11 +5,11 @@ We provide an example C++ code and the respective `cmake` file to build and link ## Include and link with AMS -To use AMS we need to `find_package(AMS REQUIRED)` ([here](./CMakeLists.txt#L22)) and then use the `AMS::AMS` target in the `cmake` function `target_link_libraries`([here](./CMakeLists.txt#L27)). +To use AMS we need to `find_package(AMS REQUIRED)` ([here](./CMakeLists.txt#L22)) and then use the `AMS::AMS` target in the `cmake` function `target_link_libraries`([here](./CMakeLists.txt#L36)). ## Example Code -The [example](./ex0.cpp) code is very simple. The user provides in the *cli* the length of 2 vectors, the example initializes the `input` vector from *0-length-1* values and then assigns these values to the [output vector](./ex0.cpp#L50) finally it computes the sum of all elements in the output vector and prints the sum at the terminal with the expected output value. +The [example](./ex0.cpp) code is very simple. The user provides in the *cli* the length of 2 vectors, the example initializes the `input` vector from *0-length-1* values and then assigns these values to the [output vector](./ex0.cpp#L52) finally it computes the sum of all elements in the output vector and prints the sum at the terminal with the expected output value. ## Configure and link diff --git a/tutorial/1.AMSTensor/CMakeLists.txt b/tutorial/1.AMSTensor/CMakeLists.txt index 7e76f22a..ce83ac62 100644 --- a/tutorial/1.AMSTensor/CMakeLists.txt +++ b/tutorial/1.AMSTensor/CMakeLists.txt @@ -11,6 +11,7 @@ cmake_policy(SET CMP0104 NEW) project(EX1 LANGUAGES CXX C) set(AMS_EXAMPLE_SRC ex1.cpp) +set(AMS_SOL_SRC ex1.cpp) option(WITH_MPI "Option to enable MPI" OFF) option(WITH_CALIPER "Use Caliper for Profiling" OFF) @@ -30,8 +31,8 @@ endif() add_executable(EX1 ${AMS_EXAMPLE_SRC}) -target_link_libraries(EX1 PRIVATE ${MFEM_LIBRARIES}) -target_include_directories(EX1 PRIVATE ${MFEM_INCLUDE_DIRS}) target_link_libraries(EX1 PRIVATE AMS::AMS) +add_executable(SOL1 ${AMS_SOL_SRC}) +target_link_libraries(SOL1 PRIVATE AMS::AMS) diff --git a/tutorial/1.AMSTensor/ex1.cpp b/tutorial/1.AMSTensor/ex1.cpp index 54239475..15b47803 100644 --- a/tutorial/1.AMSTensor/ex1.cpp +++ b/tutorial/1.AMSTensor/ex1.cpp @@ -18,9 +18,9 @@ void ExampleCompute(double* in, double* out, int size) } } -void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out, int size) +void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out) { - ExampleCompute(in.data(), out.data(), size); + ExampleCompute(in.data(), out.data(), in.shape()[0]); } double ComputeSum(double* out, int size) @@ -70,7 +70,7 @@ int main(int argc, char* argv[]) ams::AMSResourceType::AMS_HOST); - ExampleAMSTensorCompute(InT, OutT, length); + ExampleAMSTensorCompute(InT, OutT); auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 diff --git a/tutorial/README.md b/tutorial/README.md index ae669aa6..26ee00b5 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -44,3 +44,7 @@ MariaDB is up! Root password set to 'root' ``` +## Contents + +1. [Build-Link-Logger](./0.Build) +2. [AMS Data Flow](./1.DataFlow) From af1de982baf69436a2162e5d19b3fef001093ec5 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 13:07:53 -0700 Subject: [PATCH 103/136] Adding step 2 files --- tutorial/2.DataFlow/CMakeLists.txt | 38 +++++++++ tutorial/2.DataFlow/README.md | 12 +++ tutorial/2.DataFlow/common.hpp | 132 +++++++++++++++++++++++++++++ tutorial/2.DataFlow/ex2.cpp | 86 +++++++++++++++++++ tutorial/2.DataFlow/sol2.cpp | 73 ++++++++++++++++ 5 files changed, 341 insertions(+) create mode 100644 tutorial/2.DataFlow/CMakeLists.txt create mode 100644 tutorial/2.DataFlow/README.md create mode 100644 tutorial/2.DataFlow/common.hpp create mode 100644 tutorial/2.DataFlow/ex2.cpp create mode 100644 tutorial/2.DataFlow/sol2.cpp diff --git a/tutorial/2.DataFlow/CMakeLists.txt b/tutorial/2.DataFlow/CMakeLists.txt new file mode 100644 index 00000000..7bc4da8c --- /dev/null +++ b/tutorial/2.DataFlow/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright 2022-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +cmake_minimum_required(VERSION 3.20) +cmake_policy(SET CMP0204 NEW) + +# Define the project +project(EX2 LANGUAGES CXX C) + +set(AMS_EXAMPLE_SRC ex2.cpp) +set(AMS_SOL_SRC ex2.cpp) + +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 24) # Enable C++24 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +find_package(AMS REQUIRED) + +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + + +add_executable(EX2 ${AMS_EXAMPLE_SRC}) +target_link_libraries(EX2 PRIVATE AMS::AMS) + +add_executable(SOL2 ${AMS_SOL_SRC}) +target_link_libraries(SOL2 PRIVATE AMS::AMS) + diff --git a/tutorial/2.DataFlow/README.md b/tutorial/2.DataFlow/README.md new file mode 100644 index 00000000..6da29f4f --- /dev/null +++ b/tutorial/2.DataFlow/README.md @@ -0,0 +1,12 @@ +# AMS DataFlow +AMS (partially) replaces some arbitary function with Machine Learning (Torch) model. + +## The AMSTensor + +The AMSTensor is a C++ abstraction that associates a contineous memory blob with some access pattern and reshaping. In other words, it represents the memory as a tensor. The AMSTensor is a shim lay on top of the torch tensor representation and currently only isolates the binary linkage of the example/application code to the torch librarry. + + +### Use AMSTensors in the example code + + + diff --git a/tutorial/2.DataFlow/common.hpp b/tutorial/2.DataFlow/common.hpp new file mode 100644 index 00000000..ae8ef4f3 --- /dev/null +++ b/tutorial/2.DataFlow/common.hpp @@ -0,0 +1,132 @@ +#include +#include +#include +#include + +class ExampleArgs +{ +public: + void PrintOptions() const + { + std::cout << "Available options:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << "\n " << opt.help << "\n"; + } + } + + void Parse(int argc, char** argv) + { + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg[0] != '-') continue; + + std::string key = arg; + std::string value; + + // If the next item isn't an option, treat it as a value + if (i + 1 < argc && argv[i + 1][0] != '-') { + value = argv[++i]; + } else { + value = "true"; // Boolean flag + } + + options_[key] = value; + } + + // Set parsed values into variables + for (auto& opt : registered_) { + const auto& keys = opt.keys; + for (const auto& key : keys) { + if (options_.count(key)) { + opt.setter(options_[key]); + opt.wasset = true; + break; + } + } + } + } + + template + void AddOption(T* out, + std::string short_opt, + std::string long_opt, + std::string help, + bool required = true) + { + registered_.push_back( + {{short_opt, long_opt}, + [out](const std::string& val) { parseValue(val, out); }, + [out]() { return toString(*out); }, + help, + required, + false}); + } + + bool Good() const + { + for (const auto& opt : registered_) { + if (opt.required && !opt.wasset) { + return false; + } + } + return true; + } + + void PrintUsage() const + { + std::cout << "Parsed arguments:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << " = " << opt.getter() << "\n"; + } + } + +private: + struct RegisteredOption { + std::vector keys; + std::function setter; + std::function getter; + std::string help; + bool required; + bool wasset; + }; + + std::vector registered_; + std::unordered_map options_; + + // Parser helper + template + static void parseValue(const std::string& s, T* out); + + static void parseValue(const std::string& s, std::string* out) { *out = s; } + + static void parseValue(const std::string& s, int* out) + { + *out = std::stoi(s); + } + + static void parseValue(const std::string& s, bool* out) + { + *out = (s == "true" || s == "1"); + } + + static void parseValue(const std::string& s, double* out) + { + *out = std::stod(s); + } + + + static std::string toString(const std::string& val) { return val; } + static std::string toString(bool val) { return val ? "true" : "false"; } + static std::string toString(int val) { return std::to_string(val); } + static std::string toString(double val) { return std::to_string(val); } +}; diff --git a/tutorial/2.DataFlow/ex2.cpp b/tutorial/2.DataFlow/ex2.cpp new file mode 100644 index 00000000..15b47803 --- /dev/null +++ b/tutorial/2.DataFlow/ex2.cpp @@ -0,0 +1,86 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out) +{ + ExampleCompute(in.data(), out.data(), in.shape()[0]); +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + int length; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + InitMemBlob(input, length); + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + ams::AMSTensor InT = ams::AMSTensor::view(input, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); + + ams::AMSTensor OutT = ams::AMSTensor::view(output, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); + + + ExampleAMSTensorCompute(InT, OutT); + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} diff --git a/tutorial/2.DataFlow/sol2.cpp b/tutorial/2.DataFlow/sol2.cpp new file mode 100644 index 00000000..cade0a40 --- /dev/null +++ b/tutorial/2.DataFlow/sol2.cpp @@ -0,0 +1,73 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleComputeTensors(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + using namespace ams; + int length; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + + InitMemBlob(input, length); + ExampleCompute(input, output, length); + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} From a37d85c890deeb8461cd0a9bb9fe5b2badcf0efd Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 13:28:50 -0700 Subject: [PATCH 104/136] Dataflow --- tutorial/2.DataFlow/README.md | 13 +++++++++---- tutorial/2.DataFlow/ex2.cpp | 35 +++++++++++++++-------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/tutorial/2.DataFlow/README.md b/tutorial/2.DataFlow/README.md index 6da29f4f..d1fb43be 100644 --- a/tutorial/2.DataFlow/README.md +++ b/tutorial/2.DataFlow/README.md @@ -1,12 +1,17 @@ # AMS DataFlow -AMS (partially) replaces some arbitary function with Machine Learning (Torch) model. +AMS (partially) replaces some arbitary function with Machine Learning (Torch) model. The `AMSTensor` provides information to the AMS runtime regarding the memory access pattern of a single memory blob. -## The AMSTensor +However, an arbitary function can access multiple memory blobs with different intentions. AMS categorizes intention in 3 categories: -The AMSTensor is a C++ abstraction that associates a contineous memory blob with some access pattern and reshaping. In other words, it represents the memory as a tensor. The AMSTensor is a shim lay on top of the torch tensor representation and currently only isolates the binary linkage of the example/application code to the torch librarry. +1. Memory locations that are being written by the underlying computation and are considered a result of the function. In the example this would be `out`. +2. Memory locations that are being read by the underlying computation and is "necessary" for the mathematical formulation of the underlying result. Intermediate inputs or temporal variables can be ignored. In the example this would be `in`. +3. Memory locations that are being read AND written by the underlying computation and is "necessary" for the mathematical formulation of the underlying result. Intermediate inputs or temporal variables can be ignored. +## The SmallVector -### Use AMSTensors in the example code +Multiple memory blobs of the same intention can be packed together in a vector. AMS instead of using the `std::vector` uses ams::SmallVector a lightweight C++ vector abstraction (originated from the LLVM project) that can be allocated in the stack and is more efficient. + +### Create a C++ lambda that takes 3 input parameters (1 for each memory category), each of Smallvector type storing the AMSTensors. diff --git a/tutorial/2.DataFlow/ex2.cpp b/tutorial/2.DataFlow/ex2.cpp index 15b47803..af8ffe31 100644 --- a/tutorial/2.DataFlow/ex2.cpp +++ b/tutorial/2.DataFlow/ex2.cpp @@ -18,9 +18,11 @@ void ExampleCompute(double* in, double* out, int size) } } -void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out) +void ExampleComputeTensors(double* in, double* out, int size) { - ExampleCompute(in.data(), out.data(), in.shape()[0]); + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } } double ComputeSum(double* out, int size) @@ -34,6 +36,7 @@ double ComputeSum(double* out, int size) int main(int argc, char* argv[]) { + using namespace ams; int length; ExampleArgs args; args.AddOption(&length, @@ -52,25 +55,17 @@ int main(int argc, char* argv[]) double* input = new double[length]; double* output = new double[length]; - InitMemBlob(input, length); - - /* - * Create AMS tensors for memory blobs - */ - // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. - ams::AMSTensor InT = ams::AMSTensor::view(input, - {length, 1}, - {1, 1}, - ams::AMSResourceType::AMS_HOST); - - ams::AMSTensor OutT = ams::AMSTensor::view(output, - {length, 1}, - {1, 1}, - ams::AMSResourceType::AMS_HOST); - - - ExampleAMSTensorCompute(InT, OutT); + InitMemBlob(input, length); + auto Computation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs){ + ExampleCompute(input, output, length); + }; + Computation( /* inputs */ {input}, + /* inouts */, {} + /*outputs */, {output}); auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 From e73bfd1559e4ce9a4e85d8954184d138b586af02 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 13:31:15 -0700 Subject: [PATCH 105/136] Format files --- tutorial/1.AMSTensor/ex1.cpp | 20 ++++++++++---------- tutorial/2.DataFlow/sol2.cpp | 8 ++++---- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tutorial/1.AMSTensor/ex1.cpp b/tutorial/1.AMSTensor/ex1.cpp index 15b47803..1d3ddf61 100644 --- a/tutorial/1.AMSTensor/ex1.cpp +++ b/tutorial/1.AMSTensor/ex1.cpp @@ -37,9 +37,9 @@ int main(int argc, char* argv[]) int length; ExampleArgs args; args.AddOption(&length, - "-l", - "--length", - "The size of the vectors to be initialized"); + "-l", + "--length", + "The size of the vectors to be initialized"); args.Parse(argc, argv); if (!args.Good()) { std::cout << "Wrong command line arguments\n"; @@ -60,21 +60,21 @@ int main(int argc, char* argv[]) // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. ams::AMSTensor InT = ams::AMSTensor::view(input, - {length, 1}, - {1, 1}, - ams::AMSResourceType::AMS_HOST); + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); ams::AMSTensor OutT = ams::AMSTensor::view(output, - {length, 1}, - {1, 1}, - ams::AMSResourceType::AMS_HOST); + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); ExampleAMSTensorCompute(InT, OutT); auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 - << " and computed " << sum << "\n"; + << " and computed " << sum << "\n"; delete[] input; diff --git a/tutorial/2.DataFlow/sol2.cpp b/tutorial/2.DataFlow/sol2.cpp index cade0a40..857d09bd 100644 --- a/tutorial/2.DataFlow/sol2.cpp +++ b/tutorial/2.DataFlow/sol2.cpp @@ -40,9 +40,9 @@ int main(int argc, char* argv[]) int length; ExampleArgs args; args.AddOption(&length, - "-l", - "--length", - "The size of the vectors to be initialized"); + "-l", + "--length", + "The size of the vectors to be initialized"); args.Parse(argc, argv); if (!args.Good()) { std::cout << "Wrong command line arguments\n"; @@ -61,7 +61,7 @@ int main(int argc, char* argv[]) auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 - << " and computed " << sum << "\n"; + << " and computed " << sum << "\n"; delete[] input; From 1ff66eb7a666db0caa534c5a6ce07d1ba5d506b2 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 14:11:12 -0700 Subject: [PATCH 106/136] Restructure --- .../0.Build/CMakeLists.txt | 0 .../0.Build/README.md | 0 .../0.Build/common.hpp | 0 .../{ => Chapter.1.DataFlow}/0.Build/ex0.cpp | 0 .../1.AMSTensor/CMakeLists.txt | 0 .../1.AMSTensor/common.hpp | 0 .../1.AMSTensor/ex1.cpp} | 8 -- .../1.AMSTensor/sol1.cpp} | 0 .../2.DataFlow/CMakeLists.txt | 4 +- .../2.DataFlow/README.md | 0 .../2.DataFlow/common.hpp | 0 .../2.DataFlow/ex2.cpp} | 27 ++++-- .../Chapter.1.DataFlow/2.DataFlow/sol2.cpp | 95 +++++++++++++++++++ .../1.CompoundModel/ex3.cpp} | 43 +++++---- 14 files changed, 141 insertions(+), 36 deletions(-) rename tutorial/{ => Chapter.1.DataFlow}/0.Build/CMakeLists.txt (100%) rename tutorial/{ => Chapter.1.DataFlow}/0.Build/README.md (100%) rename tutorial/{ => Chapter.1.DataFlow}/0.Build/common.hpp (100%) rename tutorial/{ => Chapter.1.DataFlow}/0.Build/ex0.cpp (100%) rename tutorial/{ => Chapter.1.DataFlow}/1.AMSTensor/CMakeLists.txt (100%) rename tutorial/{ => Chapter.1.DataFlow}/1.AMSTensor/common.hpp (100%) rename tutorial/{1.AMSTensor/sol1.cpp => Chapter.1.DataFlow/1.AMSTensor/ex1.cpp} (88%) rename tutorial/{1.AMSTensor/ex1.cpp => Chapter.1.DataFlow/1.AMSTensor/sol1.cpp} (100%) rename tutorial/{ => Chapter.1.DataFlow}/2.DataFlow/CMakeLists.txt (91%) rename tutorial/{ => Chapter.1.DataFlow}/2.DataFlow/README.md (100%) rename tutorial/{ => Chapter.1.DataFlow}/2.DataFlow/common.hpp (100%) rename tutorial/{2.DataFlow/sol2.cpp => Chapter.1.DataFlow/2.DataFlow/ex2.cpp} (65%) create mode 100644 tutorial/Chapter.1.DataFlow/2.DataFlow/sol2.cpp rename tutorial/{2.DataFlow/ex2.cpp => Chapter.2.CompoundModel/1.CompoundModel/ex3.cpp} (58%) diff --git a/tutorial/0.Build/CMakeLists.txt b/tutorial/Chapter.1.DataFlow/0.Build/CMakeLists.txt similarity index 100% rename from tutorial/0.Build/CMakeLists.txt rename to tutorial/Chapter.1.DataFlow/0.Build/CMakeLists.txt diff --git a/tutorial/0.Build/README.md b/tutorial/Chapter.1.DataFlow/0.Build/README.md similarity index 100% rename from tutorial/0.Build/README.md rename to tutorial/Chapter.1.DataFlow/0.Build/README.md diff --git a/tutorial/0.Build/common.hpp b/tutorial/Chapter.1.DataFlow/0.Build/common.hpp similarity index 100% rename from tutorial/0.Build/common.hpp rename to tutorial/Chapter.1.DataFlow/0.Build/common.hpp diff --git a/tutorial/0.Build/ex0.cpp b/tutorial/Chapter.1.DataFlow/0.Build/ex0.cpp similarity index 100% rename from tutorial/0.Build/ex0.cpp rename to tutorial/Chapter.1.DataFlow/0.Build/ex0.cpp diff --git a/tutorial/1.AMSTensor/CMakeLists.txt b/tutorial/Chapter.1.DataFlow/1.AMSTensor/CMakeLists.txt similarity index 100% rename from tutorial/1.AMSTensor/CMakeLists.txt rename to tutorial/Chapter.1.DataFlow/1.AMSTensor/CMakeLists.txt diff --git a/tutorial/1.AMSTensor/common.hpp b/tutorial/Chapter.1.DataFlow/1.AMSTensor/common.hpp similarity index 100% rename from tutorial/1.AMSTensor/common.hpp rename to tutorial/Chapter.1.DataFlow/1.AMSTensor/common.hpp diff --git a/tutorial/1.AMSTensor/sol1.cpp b/tutorial/Chapter.1.DataFlow/1.AMSTensor/ex1.cpp similarity index 88% rename from tutorial/1.AMSTensor/sol1.cpp rename to tutorial/Chapter.1.DataFlow/1.AMSTensor/ex1.cpp index cade0a40..90bb304b 100644 --- a/tutorial/1.AMSTensor/sol1.cpp +++ b/tutorial/Chapter.1.DataFlow/1.AMSTensor/ex1.cpp @@ -18,12 +18,6 @@ void ExampleCompute(double* in, double* out, int size) } } -void ExampleComputeTensors(double* in, double* out, int size) -{ - for (int i = 0; i < size; i++) { - out[i] = in[i]; - } -} double ComputeSum(double* out, int size) { @@ -36,7 +30,6 @@ double ComputeSum(double* out, int size) int main(int argc, char* argv[]) { - using namespace ams; int length; ExampleArgs args; args.AddOption(&length, @@ -55,7 +48,6 @@ int main(int argc, char* argv[]) double* input = new double[length]; double* output = new double[length]; - InitMemBlob(input, length); ExampleCompute(input, output, length); auto sum = ComputeSum(output, length); diff --git a/tutorial/1.AMSTensor/ex1.cpp b/tutorial/Chapter.1.DataFlow/1.AMSTensor/sol1.cpp similarity index 100% rename from tutorial/1.AMSTensor/ex1.cpp rename to tutorial/Chapter.1.DataFlow/1.AMSTensor/sol1.cpp diff --git a/tutorial/2.DataFlow/CMakeLists.txt b/tutorial/Chapter.1.DataFlow/2.DataFlow/CMakeLists.txt similarity index 91% rename from tutorial/2.DataFlow/CMakeLists.txt rename to tutorial/Chapter.1.DataFlow/2.DataFlow/CMakeLists.txt index 7bc4da8c..17209ed1 100644 --- a/tutorial/2.DataFlow/CMakeLists.txt +++ b/tutorial/Chapter.1.DataFlow/2.DataFlow/CMakeLists.txt @@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 3.20) -cmake_policy(SET CMP0204 NEW) +cmake_policy(SET CMP0104 NEW) # Define the project project(EX2 LANGUAGES CXX C) @@ -16,7 +16,7 @@ set(AMS_SOL_SRC ex2.cpp) option(WITH_MPI "Option to enable MPI" OFF) option(WITH_CALIPER "Use Caliper for Profiling" OFF) -set(CMAKE_CXX_STANDARD 24) # Enable C++24 +set(CMAKE_CXX_STANDARD 14) # Enable C++14 set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard find_package(AMS REQUIRED) diff --git a/tutorial/2.DataFlow/README.md b/tutorial/Chapter.1.DataFlow/2.DataFlow/README.md similarity index 100% rename from tutorial/2.DataFlow/README.md rename to tutorial/Chapter.1.DataFlow/2.DataFlow/README.md diff --git a/tutorial/2.DataFlow/common.hpp b/tutorial/Chapter.1.DataFlow/2.DataFlow/common.hpp similarity index 100% rename from tutorial/2.DataFlow/common.hpp rename to tutorial/Chapter.1.DataFlow/2.DataFlow/common.hpp diff --git a/tutorial/2.DataFlow/sol2.cpp b/tutorial/Chapter.1.DataFlow/2.DataFlow/ex2.cpp similarity index 65% rename from tutorial/2.DataFlow/sol2.cpp rename to tutorial/Chapter.1.DataFlow/2.DataFlow/ex2.cpp index 857d09bd..1d3ddf61 100644 --- a/tutorial/2.DataFlow/sol2.cpp +++ b/tutorial/Chapter.1.DataFlow/2.DataFlow/ex2.cpp @@ -18,11 +18,9 @@ void ExampleCompute(double* in, double* out, int size) } } -void ExampleComputeTensors(double* in, double* out, int size) +void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out) { - for (int i = 0; i < size; i++) { - out[i] = in[i]; - } + ExampleCompute(in.data(), out.data(), in.shape()[0]); } double ComputeSum(double* out, int size) @@ -36,7 +34,6 @@ double ComputeSum(double* out, int size) int main(int argc, char* argv[]) { - using namespace ams; int length; ExampleArgs args; args.AddOption(&length, @@ -55,9 +52,25 @@ int main(int argc, char* argv[]) double* input = new double[length]; double* output = new double[length]; - InitMemBlob(input, length); - ExampleCompute(input, output, length); + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + ams::AMSTensor InT = ams::AMSTensor::view(input, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); + + ams::AMSTensor OutT = ams::AMSTensor::view(output, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); + + + ExampleAMSTensorCompute(InT, OutT); auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 diff --git a/tutorial/Chapter.1.DataFlow/2.DataFlow/sol2.cpp b/tutorial/Chapter.1.DataFlow/2.DataFlow/sol2.cpp new file mode 100644 index 00000000..60316b88 --- /dev/null +++ b/tutorial/Chapter.1.DataFlow/2.DataFlow/sol2.cpp @@ -0,0 +1,95 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out) +{ + ExampleCompute(in.data(), out.data(), in.shape()[0]); +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + int length; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + InitMemBlob(input, length); + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + input_tensors.push_back(ams::AMSTensor::view(input, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST)); + + output_tensors.push_back(ams::AMSTensor::view(output, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST)); + + auto Computation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + } + Computation(input_tensors, output_tensors); + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} diff --git a/tutorial/2.DataFlow/ex2.cpp b/tutorial/Chapter.2.CompoundModel/1.CompoundModel/ex3.cpp similarity index 58% rename from tutorial/2.DataFlow/ex2.cpp rename to tutorial/Chapter.2.CompoundModel/1.CompoundModel/ex3.cpp index af8ffe31..1d3ddf61 100644 --- a/tutorial/2.DataFlow/ex2.cpp +++ b/tutorial/Chapter.2.CompoundModel/1.CompoundModel/ex3.cpp @@ -18,11 +18,9 @@ void ExampleCompute(double* in, double* out, int size) } } -void ExampleComputeTensors(double* in, double* out, int size) +void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out) { - for (int i = 0; i < size; i++) { - out[i] = in[i]; - } + ExampleCompute(in.data(), out.data(), in.shape()[0]); } double ComputeSum(double* out, int size) @@ -36,13 +34,12 @@ double ComputeSum(double* out, int size) int main(int argc, char* argv[]) { - using namespace ams; int length; ExampleArgs args; args.AddOption(&length, - "-l", - "--length", - "The size of the vectors to be initialized"); + "-l", + "--length", + "The size of the vectors to be initialized"); args.Parse(argc, argv); if (!args.Good()) { std::cout << "Wrong command line arguments\n"; @@ -55,21 +52,29 @@ int main(int argc, char* argv[]) double* input = new double[length]; double* output = new double[length]; - InitMemBlob(input, length); - auto Computation = - [&](const ams::SmallVector &ams_ins, - ams::SmallVector &ams_inouts, - ams::SmallVector &ams_outs){ - ExampleCompute(input, output, length); - }; - Computation( /* inputs */ {input}, - /* inouts */, {} - /*outputs */, {output}); + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + ams::AMSTensor InT = ams::AMSTensor::view(input, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); + + ams::AMSTensor OutT = ams::AMSTensor::view(output, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST); + + + ExampleAMSTensorCompute(InT, OutT); auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 - << " and computed " << sum << "\n"; + << " and computed " << sum << "\n"; delete[] input; From 1e192e57fa7289dff617d9ec23b3b1f29171ce3f Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 14:13:02 -0700 Subject: [PATCH 107/136] Adding files --- .../1.CompoundModel/CMakeLists.txt | 38 ++++++++ .../1.CompoundModel/README.md | 14 +++ .../1.CompoundModel/sol3.cpp | 95 +++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 tutorial/Chapter.2.CompoundModel/1.CompoundModel/CMakeLists.txt create mode 100644 tutorial/Chapter.2.CompoundModel/1.CompoundModel/README.md create mode 100644 tutorial/Chapter.2.CompoundModel/1.CompoundModel/sol3.cpp diff --git a/tutorial/Chapter.2.CompoundModel/1.CompoundModel/CMakeLists.txt b/tutorial/Chapter.2.CompoundModel/1.CompoundModel/CMakeLists.txt new file mode 100644 index 00000000..0de9bbe2 --- /dev/null +++ b/tutorial/Chapter.2.CompoundModel/1.CompoundModel/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright 2022-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +cmake_minimum_required(VERSION 3.20) +cmake_policy(SET CMP0104 NEW) + +# Define the project +project(EX2 LANGUAGES CXX C) + +set(AMS_EXAMPLE_SRC ex3.cpp) +set(AMS_SOL_SRC ex3.cpp) + +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +find_package(AMS REQUIRED) + +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + + +add_executable(EX3 ${AMS_EXAMPLE_SRC}) +target_link_libraries(EX3 PRIVATE AMS::AMS) + +add_executable(SOL3 ${AMS_SOL_SRC}) +target_link_libraries(SOL3 PRIVATE AMS::AMS) + diff --git a/tutorial/Chapter.2.CompoundModel/1.CompoundModel/README.md b/tutorial/Chapter.2.CompoundModel/1.CompoundModel/README.md new file mode 100644 index 00000000..f8d6d6e1 --- /dev/null +++ b/tutorial/Chapter.2.CompoundModel/1.CompoundModel/README.md @@ -0,0 +1,14 @@ +# AMS Compound Model + +AMS (partially) replaces some arbitary function with a surrogate ML (torch) model. However, AMS does more than that, it is reponsible to perform: +1. Data collection for that specific function +2. Uncertainty quantification +3. Model inference. + +To model all these 3 entities AMS provides a simple mapping between the original computation (the function to be replaced) with an *AMSCompoundModel*. The *AMSCompoundModel* enapuslates all these 3 capabilities and the AMS API associates the application function (referred in AMS terminology as domain) with the respective compound model. *In AMS API we represent a function with a user provided string, this is necessary to refer to the same function with a user provided string*. + +## Create an empty Compound Model and associate it with a domain. + +Use the AMS API to create a AMS Compound model and register it with AMS. + + diff --git a/tutorial/Chapter.2.CompoundModel/1.CompoundModel/sol3.cpp b/tutorial/Chapter.2.CompoundModel/1.CompoundModel/sol3.cpp new file mode 100644 index 00000000..60316b88 --- /dev/null +++ b/tutorial/Chapter.2.CompoundModel/1.CompoundModel/sol3.cpp @@ -0,0 +1,95 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out) +{ + ExampleCompute(in.data(), out.data(), in.shape()[0]); +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + int length; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + InitMemBlob(input, length); + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + input_tensors.push_back(ams::AMSTensor::view(input, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST)); + + output_tensors.push_back(ams::AMSTensor::view(output, + {length, 1}, + {1, 1}, + ams::AMSResourceType::AMS_HOST)); + + auto Computation = + [&](const ams::SmallVector &ams_ins, + ams::SmallVector &ams_inouts, + ams::SmallVector &ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + } + Computation(input_tensors, output_tensors); + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} From 029e22e176fda87b9e2872edba1df4a6596e37f7 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 14:25:42 -0700 Subject: [PATCH 108/136] Adding 0 step --- .../CMakeLists.txt | 0 .../README.md | 0 .../0.CompoundModel/common.hpp | 132 ++++++++++++++++++ .../sol3.cpp => 0.CompoundModel/ex3.cpp} | 36 ++--- .../ex3.cpp => 0.CompoundModel/sol3.cpp} | 36 +++-- 5 files changed, 170 insertions(+), 34 deletions(-) rename tutorial/Chapter.2.CompoundModel/{1.CompoundModel => 0.CompoundModel}/CMakeLists.txt (100%) rename tutorial/Chapter.2.CompoundModel/{1.CompoundModel => 0.CompoundModel}/README.md (100%) create mode 100644 tutorial/Chapter.2.CompoundModel/0.CompoundModel/common.hpp rename tutorial/Chapter.2.CompoundModel/{1.CompoundModel/sol3.cpp => 0.CompoundModel/ex3.cpp} (66%) rename tutorial/Chapter.2.CompoundModel/{1.CompoundModel/ex3.cpp => 0.CompoundModel/sol3.cpp} (56%) diff --git a/tutorial/Chapter.2.CompoundModel/1.CompoundModel/CMakeLists.txt b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/CMakeLists.txt similarity index 100% rename from tutorial/Chapter.2.CompoundModel/1.CompoundModel/CMakeLists.txt rename to tutorial/Chapter.2.CompoundModel/0.CompoundModel/CMakeLists.txt diff --git a/tutorial/Chapter.2.CompoundModel/1.CompoundModel/README.md b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/README.md similarity index 100% rename from tutorial/Chapter.2.CompoundModel/1.CompoundModel/README.md rename to tutorial/Chapter.2.CompoundModel/0.CompoundModel/README.md diff --git a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/common.hpp b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/common.hpp new file mode 100644 index 00000000..ae8ef4f3 --- /dev/null +++ b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/common.hpp @@ -0,0 +1,132 @@ +#include +#include +#include +#include + +class ExampleArgs +{ +public: + void PrintOptions() const + { + std::cout << "Available options:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << "\n " << opt.help << "\n"; + } + } + + void Parse(int argc, char** argv) + { + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg[0] != '-') continue; + + std::string key = arg; + std::string value; + + // If the next item isn't an option, treat it as a value + if (i + 1 < argc && argv[i + 1][0] != '-') { + value = argv[++i]; + } else { + value = "true"; // Boolean flag + } + + options_[key] = value; + } + + // Set parsed values into variables + for (auto& opt : registered_) { + const auto& keys = opt.keys; + for (const auto& key : keys) { + if (options_.count(key)) { + opt.setter(options_[key]); + opt.wasset = true; + break; + } + } + } + } + + template + void AddOption(T* out, + std::string short_opt, + std::string long_opt, + std::string help, + bool required = true) + { + registered_.push_back( + {{short_opt, long_opt}, + [out](const std::string& val) { parseValue(val, out); }, + [out]() { return toString(*out); }, + help, + required, + false}); + } + + bool Good() const + { + for (const auto& opt : registered_) { + if (opt.required && !opt.wasset) { + return false; + } + } + return true; + } + + void PrintUsage() const + { + std::cout << "Parsed arguments:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << " = " << opt.getter() << "\n"; + } + } + +private: + struct RegisteredOption { + std::vector keys; + std::function setter; + std::function getter; + std::string help; + bool required; + bool wasset; + }; + + std::vector registered_; + std::unordered_map options_; + + // Parser helper + template + static void parseValue(const std::string& s, T* out); + + static void parseValue(const std::string& s, std::string* out) { *out = s; } + + static void parseValue(const std::string& s, int* out) + { + *out = std::stoi(s); + } + + static void parseValue(const std::string& s, bool* out) + { + *out = (s == "true" || s == "1"); + } + + static void parseValue(const std::string& s, double* out) + { + *out = std::stod(s); + } + + + static std::string toString(const std::string& val) { return val; } + static std::string toString(bool val) { return val ? "true" : "false"; } + static std::string toString(int val) { return std::to_string(val); } + static std::string toString(double val) { return std::to_string(val); } +}; diff --git a/tutorial/Chapter.2.CompoundModel/1.CompoundModel/sol3.cpp b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp similarity index 66% rename from tutorial/Chapter.2.CompoundModel/1.CompoundModel/sol3.cpp rename to tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp index 60316b88..cb9283b3 100644 --- a/tutorial/Chapter.2.CompoundModel/1.CompoundModel/sol3.cpp +++ b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp @@ -37,9 +37,9 @@ int main(int argc, char* argv[]) int length; ExampleArgs args; args.AddOption(&length, - "-l", - "--length", - "The size of the vectors to be initialized"); + "-l", + "--length", + "The size of the vectors to be initialized"); args.Parse(argc, argv); if (!args.Good()) { std::cout << "Wrong command line arguments\n"; @@ -63,27 +63,21 @@ int main(int argc, char* argv[]) SmallVector inout_tensors; SmallVector output_tensors; - input_tensors.push_back(ams::AMSTensor::view(input, - {length, 1}, - {1, 1}, - ams::AMSResourceType::AMS_HOST)); - - output_tensors.push_back(ams::AMSTensor::view(output, - {length, 1}, - {1, 1}, - ams::AMSResourceType::AMS_HOST)); - - auto Computation = - [&](const ams::SmallVector &ams_ins, - ams::SmallVector &ams_inouts, - ams::SmallVector &ams_outs) { - ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); - } - Computation(input_tensors, output_tensors); + input_tensors.push_back(ams::AMSTensor::view( + input, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + output_tensors.push_back(ams::AMSTensor::view( + output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + auto Computation = [&](const ams::SmallVector& ams_ins, + ams::SmallVector& ams_inouts, + ams::SmallVector& ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + } Computation(input_tensors, output_tensors); auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 - << " and computed " << sum << "\n"; + << " and computed " << sum << "\n"; delete[] input; diff --git a/tutorial/Chapter.2.CompoundModel/1.CompoundModel/ex3.cpp b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp similarity index 56% rename from tutorial/Chapter.2.CompoundModel/1.CompoundModel/ex3.cpp rename to tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp index 1d3ddf61..b214a0fd 100644 --- a/tutorial/Chapter.2.CompoundModel/1.CompoundModel/ex3.cpp +++ b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp @@ -34,12 +34,13 @@ double ComputeSum(double* out, int size) int main(int argc, char* argv[]) { + using namespace ams; int length; ExampleArgs args; args.AddOption(&length, - "-l", - "--length", - "The size of the vectors to be initialized"); + "-l", + "--length", + "The size of the vectors to be initialized"); args.Parse(argc, argv); if (!args.Good()) { std::cout << "Wrong command line arguments\n"; @@ -54,27 +55,36 @@ int main(int argc, char* argv[]) InitMemBlob(input, length); + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "compute", ams::AMSUQPolicy::AMS_RANDOM, -1.0, "", "compute"); + + /* * Create AMS tensors for memory blobs */ // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. - ams::AMSTensor InT = ams::AMSTensor::view(input, - {length, 1}, - {1, 1}, - ams::AMSResourceType::AMS_HOST); + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + input_tensors.push_back(ams::AMSTensor::view( + input, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); - ams::AMSTensor OutT = ams::AMSTensor::view(output, - {length, 1}, - {1, 1}, - ams::AMSResourceType::AMS_HOST); + output_tensors.push_back(ams::AMSTensor::view( + output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + auto Computation = [&](const ams::SmallVector& ams_ins, + ams::SmallVector& ams_inouts, + ams::SmallVector& ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + }; - ExampleAMSTensorCompute(InT, OutT); + Computation(input_tensors, output_tensors); auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 - << " and computed " << sum << "\n"; + << " and computed " << sum << "\n"; delete[] input; From 2b7e656616c22fe1b0fb9c030c87fa1a49fae5ac Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 14:41:46 -0700 Subject: [PATCH 109/136] Adding compound model --- .../0.CompoundModel/README.md | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/README.md b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/README.md index f8d6d6e1..c91063d8 100644 --- a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/README.md +++ b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/README.md @@ -1,5 +1,7 @@ -# AMS Compound Model +# AMS Core Concepts + +## AMS Compound Model AMS (partially) replaces some arbitary function with a surrogate ML (torch) model. However, AMS does more than that, it is reponsible to perform: 1. Data collection for that specific function 2. Uncertainty quantification @@ -7,8 +9,28 @@ AMS (partially) replaces some arbitary function with a surrogate ML (torch) mode To model all these 3 entities AMS provides a simple mapping between the original computation (the function to be replaced) with an *AMSCompoundModel*. The *AMSCompoundModel* enapuslates all these 3 capabilities and the AMS API associates the application function (referred in AMS terminology as domain) with the respective compound model. *In AMS API we represent a function with a user provided string, this is necessary to refer to the same function with a user provided string*. -## Create an empty Compound Model and associate it with a domain. +The AMS Compound Model is a persistent data structure that will be persist inside the application during application execution time and does not define any computation. + + +### Create an empty Compound Model and associate it with a domain. Use the AMS API to create a AMS Compound model and register it with AMS. +#### Discussion about solution + + +In the solution we are using the following API call: + +```CPP + AMSCAbstrModel model_descr = + AMSRegisterAbstractModel( + "compute", ams::AMSUQPolicy::AMS_RANDOM, -1.0, "", "compute"); +``` + + +Most of the parameters passed to the `AMSRegisterAbstractModel` are place holders and in the next examples we will fill in accordingly. + +## AMS Executor +Besides the compound model, AMS provides the notion of the `AMSExecutor`, the executor is reponsible to perform all necessary actions described in the compound model and when uncertain it will fall back to the existing solution. +Essentially the executor associates the domain name, domain function with a compound model and performs the necessary actions. From afce0086b9d53ea9c77804df4e51c693024efc84 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 14:42:20 -0700 Subject: [PATCH 110/136] Adding missing examples and files --- tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp | 7 +++++-- tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp index cb9283b3..a67c0079 100644 --- a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp +++ b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp @@ -34,6 +34,7 @@ double ComputeSum(double* out, int size) int main(int argc, char* argv[]) { + using namespace ams; int length; ExampleArgs args; args.AddOption(&length, @@ -69,11 +70,13 @@ int main(int argc, char* argv[]) output_tensors.push_back(ams::AMSTensor::view( output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); - auto Computation = [&](const ams::SmallVector& ams_ins, + auto Computation = [&](ams::SmallVector& ams_ins, ams::SmallVector& ams_inouts, ams::SmallVector& ams_outs) { ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); - } Computation(input_tensors, output_tensors); + }; + + Computation(input_tensors, inout_tensors, output_tensors); auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 diff --git a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp index b214a0fd..9512c406 100644 --- a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp +++ b/tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp @@ -74,13 +74,16 @@ int main(int argc, char* argv[]) output_tensors.push_back(ams::AMSTensor::view( output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); - auto Computation = [&](const ams::SmallVector& ams_ins, + auto Computation = [&](ams::SmallVector& ams_ins, ams::SmallVector& ams_inouts, ams::SmallVector& ams_outs) { ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); }; - Computation(input_tensors, output_tensors); + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + + AMSExecute(wf, Computation, input_tensors, inout_tensors, output_tensors); + auto sum = ComputeSum(output, length); std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 From 0db91f7d8838a66dc903d6702bd321db8835aa8e Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 14:45:00 -0700 Subject: [PATCH 111/136] Moving files around --- .../3.CompoundModel}/CMakeLists.txt | 0 .../3.CompoundModel}/README.md | 0 .../3.CompoundModel}/common.hpp | 0 .../3.CompoundModel}/ex3.cpp | 0 .../3.CompoundModel}/sol3.cpp | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename tutorial/{Chapter.2.CompoundModel/0.CompoundModel => Chapter.1.DataFlow/3.CompoundModel}/CMakeLists.txt (100%) rename tutorial/{Chapter.2.CompoundModel/0.CompoundModel => Chapter.1.DataFlow/3.CompoundModel}/README.md (100%) rename tutorial/{Chapter.2.CompoundModel/0.CompoundModel => Chapter.1.DataFlow/3.CompoundModel}/common.hpp (100%) rename tutorial/{Chapter.2.CompoundModel/0.CompoundModel => Chapter.1.DataFlow/3.CompoundModel}/ex3.cpp (100%) rename tutorial/{Chapter.2.CompoundModel/0.CompoundModel => Chapter.1.DataFlow/3.CompoundModel}/sol3.cpp (100%) diff --git a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/CMakeLists.txt b/tutorial/Chapter.1.DataFlow/3.CompoundModel/CMakeLists.txt similarity index 100% rename from tutorial/Chapter.2.CompoundModel/0.CompoundModel/CMakeLists.txt rename to tutorial/Chapter.1.DataFlow/3.CompoundModel/CMakeLists.txt diff --git a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/README.md b/tutorial/Chapter.1.DataFlow/3.CompoundModel/README.md similarity index 100% rename from tutorial/Chapter.2.CompoundModel/0.CompoundModel/README.md rename to tutorial/Chapter.1.DataFlow/3.CompoundModel/README.md diff --git a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/common.hpp b/tutorial/Chapter.1.DataFlow/3.CompoundModel/common.hpp similarity index 100% rename from tutorial/Chapter.2.CompoundModel/0.CompoundModel/common.hpp rename to tutorial/Chapter.1.DataFlow/3.CompoundModel/common.hpp diff --git a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp b/tutorial/Chapter.1.DataFlow/3.CompoundModel/ex3.cpp similarity index 100% rename from tutorial/Chapter.2.CompoundModel/0.CompoundModel/ex3.cpp rename to tutorial/Chapter.1.DataFlow/3.CompoundModel/ex3.cpp diff --git a/tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp b/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp similarity index 100% rename from tutorial/Chapter.2.CompoundModel/0.CompoundModel/sol3.cpp rename to tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp From 42727a9e96c20b399ca7badd51231eabf87b922e Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 14:56:18 -0700 Subject: [PATCH 112/136] Adding solution --- .../Chapter.1.DataFlow/3.CompoundModel/CMakeLists.txt | 2 +- tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tutorial/Chapter.1.DataFlow/3.CompoundModel/CMakeLists.txt b/tutorial/Chapter.1.DataFlow/3.CompoundModel/CMakeLists.txt index 0de9bbe2..e4b51d05 100644 --- a/tutorial/Chapter.1.DataFlow/3.CompoundModel/CMakeLists.txt +++ b/tutorial/Chapter.1.DataFlow/3.CompoundModel/CMakeLists.txt @@ -11,7 +11,7 @@ cmake_policy(SET CMP0104 NEW) project(EX2 LANGUAGES CXX C) set(AMS_EXAMPLE_SRC ex3.cpp) -set(AMS_SOL_SRC ex3.cpp) +set(AMS_SOL_SRC sol3.cpp) option(WITH_MPI "Option to enable MPI" OFF) option(WITH_CALIPER "Use Caliper for Profiling" OFF) diff --git a/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp b/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp index 9512c406..24e37013 100644 --- a/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp +++ b/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp @@ -18,7 +18,7 @@ void ExampleCompute(double* in, double* out, int size) } } -void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out) +void ExampleAMSTensorCompute(const ams::AMSTensor& in, ams::AMSTensor& out) { ExampleCompute(in.data(), out.data(), in.shape()[0]); } @@ -74,15 +74,16 @@ int main(int argc, char* argv[]) output_tensors.push_back(ams::AMSTensor::view( output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); - auto Computation = [&](ams::SmallVector& ams_ins, - ams::SmallVector& ams_inouts, - ams::SmallVector& ams_outs) { + EOSLambda Computation = [&](const ams::SmallVector& ams_ins, + ams::SmallVector& ams_inouts, + ams::SmallVector& ams_outs) { ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); }; AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); - + std::cout << "Calling AMS Execute\n"; AMSExecute(wf, Computation, input_tensors, inout_tensors, output_tensors); + std::cout << "Called AMS Execute\n"; auto sum = ComputeSum(output, length); From 2752b4f3db9e2a6523c2a9f0937522efe1cc727e Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 16:58:41 -0700 Subject: [PATCH 113/136] Adding None as a dataase --- tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp b/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp index 24e37013..22a47278 100644 --- a/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp +++ b/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp @@ -53,10 +53,11 @@ int main(int argc, char* argv[]) double* input = new double[length]; double* output = new double[length]; + AMSConfigureFSDatabase(ams::AMSDBType::AMS_NONE, ""); InitMemBlob(input, length); AMSCAbstrModel model_descr = AMSRegisterAbstractModel( - "compute", ams::AMSUQPolicy::AMS_RANDOM, -1.0, "", "compute"); + "compute", ams::AMSUQPolicy::AMS_RANDOM, -1.0, "", ""); /* From 80e6606776c27f13d58225172223d8eb46a5c9b7 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 17:16:32 -0700 Subject: [PATCH 114/136] HDF5 DB example --- tutorial/Chapter.2.DB/1.HDF5/CMakeLists.txt | 38 ++++++ tutorial/Chapter.2.DB/1.HDF5/README.md | 14 +++ tutorial/Chapter.2.DB/1.HDF5/common.hpp | 132 ++++++++++++++++++++ tutorial/Chapter.2.DB/1.HDF5/ex4.cpp | 101 +++++++++++++++ tutorial/Chapter.2.DB/1.HDF5/sol4.cpp | 112 +++++++++++++++++ tutorial/Chapter.2.DB/2.RMQ/README.md | 1 + 6 files changed, 398 insertions(+) create mode 100644 tutorial/Chapter.2.DB/1.HDF5/CMakeLists.txt create mode 100644 tutorial/Chapter.2.DB/1.HDF5/README.md create mode 100644 tutorial/Chapter.2.DB/1.HDF5/common.hpp create mode 100644 tutorial/Chapter.2.DB/1.HDF5/ex4.cpp create mode 100644 tutorial/Chapter.2.DB/1.HDF5/sol4.cpp create mode 100644 tutorial/Chapter.2.DB/2.RMQ/README.md diff --git a/tutorial/Chapter.2.DB/1.HDF5/CMakeLists.txt b/tutorial/Chapter.2.DB/1.HDF5/CMakeLists.txt new file mode 100644 index 00000000..7417eb8b --- /dev/null +++ b/tutorial/Chapter.2.DB/1.HDF5/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright 2022-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +cmake_minimum_required(VERSION 3.20) +cmake_policy(SET CMP0104 NEW) + +# Define the project +project(EX4 LANGUAGES CXX C) + +set(AMS_EXAMPLE_SRC ex4.cpp) +set(AMS_SOL_SRC sol4.cpp) + +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +find_package(AMS REQUIRED) + +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + + +add_executable(EX4 ${AMS_EXAMPLE_SRC}) +target_link_libraries(EX4 PRIVATE AMS::AMS) + +add_executable(SOL4 ${AMS_SOL_SRC}) +target_link_libraries(SOL4 PRIVATE AMS::AMS) + diff --git a/tutorial/Chapter.2.DB/1.HDF5/README.md b/tutorial/Chapter.2.DB/1.HDF5/README.md new file mode 100644 index 00000000..d23e3b18 --- /dev/null +++ b/tutorial/Chapter.2.DB/1.HDF5/README.md @@ -0,0 +1,14 @@ +# Data collection through the hdf5 interface + +AMS provides file system databases and in-situ data processing capabilities. File system databases are created in an existing directory and files follow the hdf5 file format. + +Within the hdf5 files there will exist 2 *datasets* the inputs and the outputs. +1. Inputs will contain all input tensors and inout tensors as defined by the application executor. +2. Outputs contain both output tensors and inout tensors as defined by the application executor. + +Please extend the example code to perform data collection through the AMS interface. + +## Extend the solution cli to accept a directory to store all data to and the file name prefix. + +You will need to instantiate a file system database and assign a database label to the compound model. The database label will act as the prefix of the filename. + diff --git a/tutorial/Chapter.2.DB/1.HDF5/common.hpp b/tutorial/Chapter.2.DB/1.HDF5/common.hpp new file mode 100644 index 00000000..ae8ef4f3 --- /dev/null +++ b/tutorial/Chapter.2.DB/1.HDF5/common.hpp @@ -0,0 +1,132 @@ +#include +#include +#include +#include + +class ExampleArgs +{ +public: + void PrintOptions() const + { + std::cout << "Available options:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << "\n " << opt.help << "\n"; + } + } + + void Parse(int argc, char** argv) + { + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg[0] != '-') continue; + + std::string key = arg; + std::string value; + + // If the next item isn't an option, treat it as a value + if (i + 1 < argc && argv[i + 1][0] != '-') { + value = argv[++i]; + } else { + value = "true"; // Boolean flag + } + + options_[key] = value; + } + + // Set parsed values into variables + for (auto& opt : registered_) { + const auto& keys = opt.keys; + for (const auto& key : keys) { + if (options_.count(key)) { + opt.setter(options_[key]); + opt.wasset = true; + break; + } + } + } + } + + template + void AddOption(T* out, + std::string short_opt, + std::string long_opt, + std::string help, + bool required = true) + { + registered_.push_back( + {{short_opt, long_opt}, + [out](const std::string& val) { parseValue(val, out); }, + [out]() { return toString(*out); }, + help, + required, + false}); + } + + bool Good() const + { + for (const auto& opt : registered_) { + if (opt.required && !opt.wasset) { + return false; + } + } + return true; + } + + void PrintUsage() const + { + std::cout << "Parsed arguments:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << " = " << opt.getter() << "\n"; + } + } + +private: + struct RegisteredOption { + std::vector keys; + std::function setter; + std::function getter; + std::string help; + bool required; + bool wasset; + }; + + std::vector registered_; + std::unordered_map options_; + + // Parser helper + template + static void parseValue(const std::string& s, T* out); + + static void parseValue(const std::string& s, std::string* out) { *out = s; } + + static void parseValue(const std::string& s, int* out) + { + *out = std::stoi(s); + } + + static void parseValue(const std::string& s, bool* out) + { + *out = (s == "true" || s == "1"); + } + + static void parseValue(const std::string& s, double* out) + { + *out = std::stod(s); + } + + + static std::string toString(const std::string& val) { return val; } + static std::string toString(bool val) { return val ? "true" : "false"; } + static std::string toString(int val) { return std::to_string(val); } + static std::string toString(double val) { return std::to_string(val); } +}; diff --git a/tutorial/Chapter.2.DB/1.HDF5/ex4.cpp b/tutorial/Chapter.2.DB/1.HDF5/ex4.cpp new file mode 100644 index 00000000..22a47278 --- /dev/null +++ b/tutorial/Chapter.2.DB/1.HDF5/ex4.cpp @@ -0,0 +1,101 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleAMSTensorCompute(const ams::AMSTensor& in, ams::AMSTensor& out) +{ + ExampleCompute(in.data(), out.data(), in.shape()[0]); +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + using namespace ams; + int length; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + AMSConfigureFSDatabase(ams::AMSDBType::AMS_NONE, ""); + InitMemBlob(input, length); + + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "compute", ams::AMSUQPolicy::AMS_RANDOM, -1.0, "", ""); + + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + input_tensors.push_back(ams::AMSTensor::view( + input, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + output_tensors.push_back(ams::AMSTensor::view( + output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + EOSLambda Computation = [&](const ams::SmallVector& ams_ins, + ams::SmallVector& ams_inouts, + ams::SmallVector& ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + }; + + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + std::cout << "Calling AMS Execute\n"; + AMSExecute(wf, Computation, input_tensors, inout_tensors, output_tensors); + std::cout << "Called AMS Execute\n"; + + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} diff --git a/tutorial/Chapter.2.DB/1.HDF5/sol4.cpp b/tutorial/Chapter.2.DB/1.HDF5/sol4.cpp new file mode 100644 index 00000000..dabf228e --- /dev/null +++ b/tutorial/Chapter.2.DB/1.HDF5/sol4.cpp @@ -0,0 +1,112 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleAMSTensorCompute(const ams::AMSTensor& in, ams::AMSTensor& out) +{ + ExampleCompute(in.data(), out.data(), in.shape()[0]); +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + using namespace ams; + int length; + std::string db_path; + std::string fn; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.AddOption(&db_path, + "-p", + "--db-path", + "The path of the file system database to store data to"); + args.AddOption(&fn, + "-f", + "--filename-prefix", + "The path of the file system database to store data to"); + + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + AMSConfigureFSDatabase(ams::AMSDBType::AMS_HDF5, db_path.c_str()); + InitMemBlob(input, length); + + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "compute", ams::AMSUQPolicy::AMS_RANDOM, -1.0, "", fn.c_str()); + + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + input_tensors.push_back(ams::AMSTensor::view( + input, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + output_tensors.push_back(ams::AMSTensor::view( + output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + EOSLambda Computation = [&](const ams::SmallVector& ams_ins, + ams::SmallVector& ams_inouts, + ams::SmallVector& ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + }; + + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + std::cout << "Calling AMS Execute\n"; + AMSExecute(wf, Computation, input_tensors, inout_tensors, output_tensors); + std::cout << "Called AMS Execute\n"; + + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} diff --git a/tutorial/Chapter.2.DB/2.RMQ/README.md b/tutorial/Chapter.2.DB/2.RMQ/README.md new file mode 100644 index 00000000..77fc024a --- /dev/null +++ b/tutorial/Chapter.2.DB/2.RMQ/README.md @@ -0,0 +1 @@ +#TBD From c8c580861553ad778fe493f32092b663e5d04563 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 17:39:56 -0700 Subject: [PATCH 115/136] Data collection for training --- .../Chapter.3.Inference/1.HDF5/CMakeLists.txt | 33 +++++ tutorial/Chapter.3.Inference/1.HDF5/README.md | 11 ++ .../Chapter.3.Inference/1.HDF5/common.hpp | 132 ++++++++++++++++++ tutorial/Chapter.3.Inference/1.HDF5/ex5.cpp | 112 +++++++++++++++ 4 files changed, 288 insertions(+) create mode 100644 tutorial/Chapter.3.Inference/1.HDF5/CMakeLists.txt create mode 100644 tutorial/Chapter.3.Inference/1.HDF5/README.md create mode 100644 tutorial/Chapter.3.Inference/1.HDF5/common.hpp create mode 100644 tutorial/Chapter.3.Inference/1.HDF5/ex5.cpp diff --git a/tutorial/Chapter.3.Inference/1.HDF5/CMakeLists.txt b/tutorial/Chapter.3.Inference/1.HDF5/CMakeLists.txt new file mode 100644 index 00000000..9e7f0bdd --- /dev/null +++ b/tutorial/Chapter.3.Inference/1.HDF5/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright 2022-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +cmake_minimum_required(VERSION 3.20) +cmake_policy(SET CMP0104 NEW) + +# Define the project +project(EX5 LANGUAGES CXX C) + +set(AMS_EXAMPLE_SRC ex5.cpp) + +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +find_package(AMS REQUIRED) + +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + + +add_executable(EX5 ${AMS_EXAMPLE_SRC}) +target_link_libraries(EX5 PRIVATE AMS::AMS) diff --git a/tutorial/Chapter.3.Inference/1.HDF5/README.md b/tutorial/Chapter.3.Inference/1.HDF5/README.md new file mode 100644 index 00000000..c8201a62 --- /dev/null +++ b/tutorial/Chapter.3.Inference/1.HDF5/README.md @@ -0,0 +1,11 @@ +# Data collection through the hdf5 interface + +This example uses the solution of the data collection hdf5 chapter to create data to train our model on. + +Please execute the following: + +``` +AMS_LOG_LEVEL=debug ./EX5 -l 100 -f db -p ../../ +``` + +to generate a file `db_0.h5` 2 directories above the current one that will contain 1000 samples. diff --git a/tutorial/Chapter.3.Inference/1.HDF5/common.hpp b/tutorial/Chapter.3.Inference/1.HDF5/common.hpp new file mode 100644 index 00000000..ae8ef4f3 --- /dev/null +++ b/tutorial/Chapter.3.Inference/1.HDF5/common.hpp @@ -0,0 +1,132 @@ +#include +#include +#include +#include + +class ExampleArgs +{ +public: + void PrintOptions() const + { + std::cout << "Available options:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << "\n " << opt.help << "\n"; + } + } + + void Parse(int argc, char** argv) + { + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg[0] != '-') continue; + + std::string key = arg; + std::string value; + + // If the next item isn't an option, treat it as a value + if (i + 1 < argc && argv[i + 1][0] != '-') { + value = argv[++i]; + } else { + value = "true"; // Boolean flag + } + + options_[key] = value; + } + + // Set parsed values into variables + for (auto& opt : registered_) { + const auto& keys = opt.keys; + for (const auto& key : keys) { + if (options_.count(key)) { + opt.setter(options_[key]); + opt.wasset = true; + break; + } + } + } + } + + template + void AddOption(T* out, + std::string short_opt, + std::string long_opt, + std::string help, + bool required = true) + { + registered_.push_back( + {{short_opt, long_opt}, + [out](const std::string& val) { parseValue(val, out); }, + [out]() { return toString(*out); }, + help, + required, + false}); + } + + bool Good() const + { + for (const auto& opt : registered_) { + if (opt.required && !opt.wasset) { + return false; + } + } + return true; + } + + void PrintUsage() const + { + std::cout << "Parsed arguments:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << " = " << opt.getter() << "\n"; + } + } + +private: + struct RegisteredOption { + std::vector keys; + std::function setter; + std::function getter; + std::string help; + bool required; + bool wasset; + }; + + std::vector registered_; + std::unordered_map options_; + + // Parser helper + template + static void parseValue(const std::string& s, T* out); + + static void parseValue(const std::string& s, std::string* out) { *out = s; } + + static void parseValue(const std::string& s, int* out) + { + *out = std::stoi(s); + } + + static void parseValue(const std::string& s, bool* out) + { + *out = (s == "true" || s == "1"); + } + + static void parseValue(const std::string& s, double* out) + { + *out = std::stod(s); + } + + + static std::string toString(const std::string& val) { return val; } + static std::string toString(bool val) { return val ? "true" : "false"; } + static std::string toString(int val) { return std::to_string(val); } + static std::string toString(double val) { return std::to_string(val); } +}; diff --git a/tutorial/Chapter.3.Inference/1.HDF5/ex5.cpp b/tutorial/Chapter.3.Inference/1.HDF5/ex5.cpp new file mode 100644 index 00000000..dabf228e --- /dev/null +++ b/tutorial/Chapter.3.Inference/1.HDF5/ex5.cpp @@ -0,0 +1,112 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleAMSTensorCompute(const ams::AMSTensor& in, ams::AMSTensor& out) +{ + ExampleCompute(in.data(), out.data(), in.shape()[0]); +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + using namespace ams; + int length; + std::string db_path; + std::string fn; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.AddOption(&db_path, + "-p", + "--db-path", + "The path of the file system database to store data to"); + args.AddOption(&fn, + "-f", + "--filename-prefix", + "The path of the file system database to store data to"); + + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + AMSConfigureFSDatabase(ams::AMSDBType::AMS_HDF5, db_path.c_str()); + InitMemBlob(input, length); + + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "compute", ams::AMSUQPolicy::AMS_RANDOM, -1.0, "", fn.c_str()); + + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + input_tensors.push_back(ams::AMSTensor::view( + input, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + output_tensors.push_back(ams::AMSTensor::view( + output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + EOSLambda Computation = [&](const ams::SmallVector& ams_ins, + ams::SmallVector& ams_inouts, + ams::SmallVector& ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + }; + + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + std::cout << "Calling AMS Execute\n"; + AMSExecute(wf, Computation, input_tensors, inout_tensors, output_tensors); + std::cout << "Called AMS Execute\n"; + + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} From 4d776b4fea4fb539fa3508bd3930233546015328 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 18:04:59 -0700 Subject: [PATCH 116/136] Train scripts --- .../Chapter.3.Inference/2.Train/README.md | 4 + tutorial/Chapter.3.Inference/2.Train/train.py | 82 +++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 tutorial/Chapter.3.Inference/2.Train/README.md create mode 100644 tutorial/Chapter.3.Inference/2.Train/train.py diff --git a/tutorial/Chapter.3.Inference/2.Train/README.md b/tutorial/Chapter.3.Inference/2.Train/README.md new file mode 100644 index 00000000..24c1642b --- /dev/null +++ b/tutorial/Chapter.3.Inference/2.Train/README.md @@ -0,0 +1,4 @@ +# Data collection through the hdf5 interface + +Please write a python script to train a model using the data produced by the previous step. The script needs to store the final model into a torch::jit file. +We provide as an example the [train](train.py) script which trains a model and properly stores it into a file. diff --git a/tutorial/Chapter.3.Inference/2.Train/train.py b/tutorial/Chapter.3.Inference/2.Train/train.py new file mode 100644 index 00000000..ec76735a --- /dev/null +++ b/tutorial/Chapter.3.Inference/2.Train/train.py @@ -0,0 +1,82 @@ +import argparse +from pathlib import Path +import h5py +import torch +from torch import nn, optim +from torch.utils.data import TensorDataset, DataLoader + + +class SimpleModel(nn.Module): + # A simple model that contains a single linear layer + def __init__(self, in_features, out_features): + super(SimpleModel, self).__init__() + self.fc = nn.Linear(in_features, out_features, False) + # self.initialize_weights() + + def initialize_weights(self): + # Check if in_features == out_features for identity initialization + if self.fc.weight.shape[0] == self.fc.weight.shape[1]: + nn.init.eye_(self.fc.weight) # Initialize with identity matrix + else: + raise ValueError("Identity initialization requires in_features == out_features") + + def forward(self, x): + return self.fc(x) + + +def main(): + # Parse command-line arguments + parser = argparse.ArgumentParser(description="Train and store a model.") + parser.add_argument("--filename", "-fn", type=str, required=True, help="The file containing the data to train on") + parser.add_argument("--epochs", "-e", help="Number of epochs", default=10) + parser.add_argument("--model-file", "-m", help="Filename of model", default="model") + args = parser.parse_args() + if not Path(args.filename).exists(): + raise RuntimeError(f"Please provide an existing file, file {args.filename} does not exist") + device = "cpu" + + with h5py.File(args.filename, "r") as fd: + X, y = fd["input_data"][:], fd["output_data"][:] + dataset = TensorDataset( + torch.from_numpy(X), + torch.from_numpy(y), + ) + model = SimpleModel(X.shape[-1], y.shape[-1]) + optimizer = optim.Adam(model.parameters(), lr=1e-3) + criterion = nn.MSELoss() + loader = DataLoader(dataset, batch_size=64, shuffle=True) + + for epoch in range(1, args.epochs + 1): + model.train() + running_loss = 0.0 + + for xb, yb in loader: + xb, yb = xb.to(device), yb.to(device) + + optimizer.zero_grad() + preds = model(xb) + loss = criterion(preds, yb) + loss.backward() + optimizer.step() + + running_loss += loss.item() * xb.size(0) + + epoch_loss = running_loss / len(loader.dataset) + print(f"Epoch {epoch:2d}/{args.epochs} — Loss: {epoch_loss:.4f}") + model = model.double() # Set to double precision (float64) + prec = torch.float64 + example_input = torch.randn(1, 1, device=device, dtype=prec) + + # Trace the model + scripted_model = torch.jit.trace(model, example_input) + + # Generate the file name + file_path = f"{args.model_file}.pt" + # Save the scripted model + scripted_model.save(file_path) + + print(f"Model saved to {file_path}") + + +if __name__ == "__main__": + main() From 9fb743a2011f73584b4e63d22204c6625030ed5f Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 18:26:05 -0700 Subject: [PATCH 117/136] Adding random serving --- .../3.Serve/CMakeLists.txt | 38 +++++ .../Chapter.3.Inference/3.Serve/README.md | 14 ++ .../Chapter.3.Inference/3.Serve/common.hpp | 137 ++++++++++++++++++ tutorial/Chapter.3.Inference/3.Serve/ex6.cpp | 112 ++++++++++++++ tutorial/Chapter.3.Inference/3.Serve/model.pt | Bin 0 -> 3891 bytes tutorial/Chapter.3.Inference/3.Serve/sol6.cpp | 124 ++++++++++++++++ tutorial/Chapter.3.Inference/3.Serve/train.py | 82 +++++++++++ 7 files changed, 507 insertions(+) create mode 100644 tutorial/Chapter.3.Inference/3.Serve/CMakeLists.txt create mode 100644 tutorial/Chapter.3.Inference/3.Serve/README.md create mode 100644 tutorial/Chapter.3.Inference/3.Serve/common.hpp create mode 100644 tutorial/Chapter.3.Inference/3.Serve/ex6.cpp create mode 100644 tutorial/Chapter.3.Inference/3.Serve/model.pt create mode 100644 tutorial/Chapter.3.Inference/3.Serve/sol6.cpp create mode 100644 tutorial/Chapter.3.Inference/3.Serve/train.py diff --git a/tutorial/Chapter.3.Inference/3.Serve/CMakeLists.txt b/tutorial/Chapter.3.Inference/3.Serve/CMakeLists.txt new file mode 100644 index 00000000..d4752b09 --- /dev/null +++ b/tutorial/Chapter.3.Inference/3.Serve/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright 2022-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +cmake_minimum_required(VERSION 3.20) +cmake_policy(SET CMP0104 NEW) + +# Define the project +project(EX6 LANGUAGES CXX C) + +set(AMS_EXAMPLE_SRC ex6.cpp) +set(AMS_SOL_SRC sol6.cpp) + +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +find_package(AMS REQUIRED) + +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + + +add_executable(EX6 ${AMS_EXAMPLE_SRC}) +target_link_libraries(EX6 PRIVATE AMS::AMS) + +add_executable(SOL6 ${AMS_SOL_SRC}) +target_link_libraries(SOL6 PRIVATE AMS::AMS) + diff --git a/tutorial/Chapter.3.Inference/3.Serve/README.md b/tutorial/Chapter.3.Inference/3.Serve/README.md new file mode 100644 index 00000000..175970cd --- /dev/null +++ b/tutorial/Chapter.3.Inference/3.Serve/README.md @@ -0,0 +1,14 @@ +# Model inference through AMS interface. + +Please modify the example code to create a AMSCompoundModel with the model trained on the previous example. Since we have already defined compounding and the matching of the executors with the underlying function. The changes should be minimal. + +## Threshold and Uncertainty. + +In AMS every compound model is accompanied by some UQ method. When models do not define their own uncertainty approach, we will define by default *random* uncertainty. Although the implementation of the ML UQ mechanism will be different the implementation remains the same. + + +### Random Uncertainty + +In the case of random uncertainty *AMS* computes a random value in the interval [0,1] for every computed sample. When the uncertainty (the randomly generated value) is higher than a user provided threshold, AMS considers this as a highly uncertain inference and only computes the underlying function for that specific sample. + +In the provided [solution](./sol6.cpp) there is an extra cli parameter that defines the uncertainty threshold for the compound model. Use the parameter and explore both the reported values and how the size of the database increases. diff --git a/tutorial/Chapter.3.Inference/3.Serve/common.hpp b/tutorial/Chapter.3.Inference/3.Serve/common.hpp new file mode 100644 index 00000000..253bb0b8 --- /dev/null +++ b/tutorial/Chapter.3.Inference/3.Serve/common.hpp @@ -0,0 +1,137 @@ +#include +#include +#include +#include + +class ExampleArgs +{ +public: + void PrintOptions() const + { + std::cout << "Available options:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << "\n " << opt.help << "\n"; + } + } + + void Parse(int argc, char** argv) + { + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg[0] != '-') continue; + + std::string key = arg; + std::string value; + + // If the next item isn't an option, treat it as a value + if (i + 1 < argc && argv[i + 1][0] != '-') { + value = argv[++i]; + } else { + value = "true"; // Boolean flag + } + + options_[key] = value; + } + + // Set parsed values into variables + for (auto& opt : registered_) { + const auto& keys = opt.keys; + for (const auto& key : keys) { + if (options_.count(key)) { + opt.setter(options_[key]); + opt.wasset = true; + break; + } + } + } + } + + template + void AddOption(T* out, + std::string short_opt, + std::string long_opt, + std::string help, + bool required = true) + { + registered_.push_back( + {{short_opt, long_opt}, + [out](const std::string& val) { parseValue(val, out); }, + [out]() { return toString(*out); }, + help, + required, + false}); + } + + bool Good() const + { + for (const auto& opt : registered_) { + if (opt.required && !opt.wasset) { + return false; + } + } + return true; + } + + void PrintUsage() const + { + std::cout << "Parsed arguments:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << " = " << opt.getter() << "\n"; + } + } + +private: + struct RegisteredOption { + std::vector keys; + std::function setter; + std::function getter; + std::string help; + bool required; + bool wasset; + }; + + std::vector registered_; + std::unordered_map options_; + + // Parser helper + template + static void parseValue(const std::string& s, T* out); + + static void parseValue(const std::string& s, std::string* out) { *out = s; } + + static void parseValue(const std::string& s, int* out) + { + *out = std::stoi(s); + } + + static void parseValue(const std::string& s, float* out) + { + *out = std::atof(s.c_str()); + } + + static void parseValue(const std::string& s, bool* out) + { + *out = (s == "true" || s == "1"); + } + + static void parseValue(const std::string& s, double* out) + { + *out = std::stod(s); + } + + + static std::string toString(const std::string& val) { return val; } + static std::string toString(bool val) { return val ? "true" : "false"; } + static std::string toString(int val) { return std::to_string(val); } + static std::string toString(double val) { return std::to_string(val); } +}; diff --git a/tutorial/Chapter.3.Inference/3.Serve/ex6.cpp b/tutorial/Chapter.3.Inference/3.Serve/ex6.cpp new file mode 100644 index 00000000..dabf228e --- /dev/null +++ b/tutorial/Chapter.3.Inference/3.Serve/ex6.cpp @@ -0,0 +1,112 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleAMSTensorCompute(const ams::AMSTensor& in, ams::AMSTensor& out) +{ + ExampleCompute(in.data(), out.data(), in.shape()[0]); +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + using namespace ams; + int length; + std::string db_path; + std::string fn; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.AddOption(&db_path, + "-p", + "--db-path", + "The path of the file system database to store data to"); + args.AddOption(&fn, + "-f", + "--filename-prefix", + "The path of the file system database to store data to"); + + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + AMSConfigureFSDatabase(ams::AMSDBType::AMS_HDF5, db_path.c_str()); + InitMemBlob(input, length); + + AMSCAbstrModel model_descr = AMSRegisterAbstractModel( + "compute", ams::AMSUQPolicy::AMS_RANDOM, -1.0, "", fn.c_str()); + + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + input_tensors.push_back(ams::AMSTensor::view( + input, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + output_tensors.push_back(ams::AMSTensor::view( + output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + EOSLambda Computation = [&](const ams::SmallVector& ams_ins, + ams::SmallVector& ams_inouts, + ams::SmallVector& ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + }; + + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + std::cout << "Calling AMS Execute\n"; + AMSExecute(wf, Computation, input_tensors, inout_tensors, output_tensors); + std::cout << "Called AMS Execute\n"; + + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} diff --git a/tutorial/Chapter.3.Inference/3.Serve/model.pt b/tutorial/Chapter.3.Inference/3.Serve/model.pt new file mode 100644 index 0000000000000000000000000000000000000000..ca3ebb8e31b4ff0c62120b87525c1ad1975a75fe GIT binary patch literal 3891 zcmbtX3se(V8lEIPLkKF5V8PcBO907(@JJRBND+j9AdfcS(%F!VFc6YVGDva7phpB& zu~wzkQ+#xlR+mcQ)Kw6zfY!$Erauv$^wkMLQDovS4%Os3slxlcQ5EZjy zGR5{lLId8E#qPCCM@bR@)md{&9Td(owKr_OW>+6Ic&g`>!_|vv; z!iQbcuUv5Jc1h&aC%AsS_0*R8gJ*x~xxJBbqu@d0@mV1yf-uRj`Ys{}5KeU}u_jzc?W!)IR=+lOX=;3hs9FBkM zB2WI-ANOg)JKlRiA^cEwY5pHh0q-s}`oVH7EPz6+`GF+^@y&(xY0Q27G%h2HJ;C;| z$*D=v>F_)8>C54?^wjtjad3LHFmV|MiNR9{Bb8%h5oFA)d=zKFDpXn^N2rF}LKV0i z)qsFgnAuDOPZdETr~5&1wLF|9|P4GAosmaR{0wnD)+)&kp5 z3;JvbdHu5!1s(Ceh~B}W#XPU=$hncQ$o{a6FVrNd*j{s-UhTkDr?x-6^jTv%$H_mRiwq2;q?NL+fJd^}jX?KWLe?y`le-Cg&$Pb!>#ZQHSn zd26lir+Ba3*>k@nb@qGH*RDJD*F-)qa#rM-KO|7RSbkS>`dRts5zn_vGfLg(yD^@obQj2mAHS__{gq6l zkX?n(>X5=aujF-+c5~_pl>>A+NB?ZUiA;++|ZA!^%h?Q$LJP@L5^F z8Tzd3++WgY?C@RtIeUKItv(vngGC&0ty9g@F7>=0J@3mB-{rg+i%3;b=f0nxt>g6V z>(-IJ4u0b1|Br2tO_{Z^$9rS6y7P}}-fr-TPdnLs@nreEy-jnI z?vD9wY2Y2aeC6g<;f{R&Iag;7Oa1-Aiic|bYJA=D;yu}P^-G2*-)r<#(7dHw=f*y& zKjlte+x8kk!@8zrPNRn%@7-@aP(RdNd^7qxU4Qn8+Y!Uxc(mrJt9}U@oc*BJ=Xhh+ zOOe}BRrSvUKh*8-&2cHMzwt1j0mbHIMYnWt*N5|w_Uq{nmPotEyoQCJ9t%_)i#&E@ zUzAf;OLL}O_iy3Vjk`BE_ipl1xhnRaFYMhIu43G}=D+4iJG-UXHgN3SfQsrn+FpmN zA!;nV_+KO<(~6OQHarGdb{fEqb%1r90B$J&1YDxPH3pQmgx_UkKYeE?WIMhChyX-P zgK9mDgI}h@eWEh}OqC)s7*(i>a1B8Y{>S>aehdcWWGoo7y$naOA1?=h{|2}gLoUu^YHW!1*c-u3kKU;$b%Cv^f={>7&<~0Q-?a zVi421N1dU!j2>Nss5O8s#0n$F{b-R~{TDZRR3b6E_T^>}+=-ah_jiG!jr-@6;E0kS zDzUgV_Rlf#bkm^9>lb;olVVvu7gfxu*29) zrtWWAk1l4Ssnl`Ni9Rq@*tAr<&4j<55Vl;vDIz<&#YTy_l)wqu@uC`EGl~CHV7%vK dSb-b?5Kxz~hCn9;MQTfQ6Nm;r#QTPK{|%nra^wI2 literal 0 HcmV?d00001 diff --git a/tutorial/Chapter.3.Inference/3.Serve/sol6.cpp b/tutorial/Chapter.3.Inference/3.Serve/sol6.cpp new file mode 100644 index 00000000..4c3bbc3c --- /dev/null +++ b/tutorial/Chapter.3.Inference/3.Serve/sol6.cpp @@ -0,0 +1,124 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleAMSTensorCompute(const ams::AMSTensor& in, ams::AMSTensor& out) +{ + ExampleCompute(in.data(), out.data(), in.shape()[0]); +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + using namespace ams; + int length; + std::string db_path; + std::string fn; + std::string model_path; + float threshold; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.AddOption(&db_path, + "-p", + "--db-path", + "The path of the file system database to store data to"); + args.AddOption(&fn, + "-f", + "--filename-prefix", + "The path of the file system database to store data to"); + args.AddOption(&model_path, + "-m", + "--model-path", + "The path to a torchscript model"); + args.AddOption(&threshold, "-t", "--threshold", "Model uncertainty"); + + + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + AMSConfigureFSDatabase(ams::AMSDBType::AMS_HDF5, db_path.c_str()); + InitMemBlob(input, length); + + AMSCAbstrModel model_descr = + AMSRegisterAbstractModel("compute", + ams::AMSUQPolicy::AMS_RANDOM, + threshold, + model_path.c_str(), + fn.c_str()); + + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + input_tensors.push_back(ams::AMSTensor::view( + input, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + output_tensors.push_back(ams::AMSTensor::view( + output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + EOSLambda Computation = [&](const ams::SmallVector& ams_ins, + ams::SmallVector& ams_inouts, + ams::SmallVector& ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + }; + + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + std::cout << "Calling AMS Execute\n"; + AMSExecute(wf, Computation, input_tensors, inout_tensors, output_tensors); + std::cout << "Called AMS Execute\n"; + + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} diff --git a/tutorial/Chapter.3.Inference/3.Serve/train.py b/tutorial/Chapter.3.Inference/3.Serve/train.py new file mode 100644 index 00000000..ec76735a --- /dev/null +++ b/tutorial/Chapter.3.Inference/3.Serve/train.py @@ -0,0 +1,82 @@ +import argparse +from pathlib import Path +import h5py +import torch +from torch import nn, optim +from torch.utils.data import TensorDataset, DataLoader + + +class SimpleModel(nn.Module): + # A simple model that contains a single linear layer + def __init__(self, in_features, out_features): + super(SimpleModel, self).__init__() + self.fc = nn.Linear(in_features, out_features, False) + # self.initialize_weights() + + def initialize_weights(self): + # Check if in_features == out_features for identity initialization + if self.fc.weight.shape[0] == self.fc.weight.shape[1]: + nn.init.eye_(self.fc.weight) # Initialize with identity matrix + else: + raise ValueError("Identity initialization requires in_features == out_features") + + def forward(self, x): + return self.fc(x) + + +def main(): + # Parse command-line arguments + parser = argparse.ArgumentParser(description="Train and store a model.") + parser.add_argument("--filename", "-fn", type=str, required=True, help="The file containing the data to train on") + parser.add_argument("--epochs", "-e", help="Number of epochs", default=10) + parser.add_argument("--model-file", "-m", help="Filename of model", default="model") + args = parser.parse_args() + if not Path(args.filename).exists(): + raise RuntimeError(f"Please provide an existing file, file {args.filename} does not exist") + device = "cpu" + + with h5py.File(args.filename, "r") as fd: + X, y = fd["input_data"][:], fd["output_data"][:] + dataset = TensorDataset( + torch.from_numpy(X), + torch.from_numpy(y), + ) + model = SimpleModel(X.shape[-1], y.shape[-1]) + optimizer = optim.Adam(model.parameters(), lr=1e-3) + criterion = nn.MSELoss() + loader = DataLoader(dataset, batch_size=64, shuffle=True) + + for epoch in range(1, args.epochs + 1): + model.train() + running_loss = 0.0 + + for xb, yb in loader: + xb, yb = xb.to(device), yb.to(device) + + optimizer.zero_grad() + preds = model(xb) + loss = criterion(preds, yb) + loss.backward() + optimizer.step() + + running_loss += loss.item() * xb.size(0) + + epoch_loss = running_loss / len(loader.dataset) + print(f"Epoch {epoch:2d}/{args.epochs} — Loss: {epoch_loss:.4f}") + model = model.double() # Set to double precision (float64) + prec = torch.float64 + example_input = torch.randn(1, 1, device=device, dtype=prec) + + # Trace the model + scripted_model = torch.jit.trace(model, example_input) + + # Generate the file name + file_path = f"{args.model_file}.pt" + # Save the scripted model + scripted_model.save(file_path) + + print(f"Model saved to {file_path}") + + +if __name__ == "__main__": + main() From 59e4d09fe65c592d4612e8bc9c706531b498c173 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 18:27:10 -0700 Subject: [PATCH 118/136] Guard DB --- src/AMSlib/wf/workflow.hpp | 4 +++- tutorial/Chapter.3.Inference/2.Train/train.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/AMSlib/wf/workflow.hpp b/src/AMSlib/wf/workflow.hpp index 7185fafb..bcdbb17d 100644 --- a/src/AMSlib/wf/workflow.hpp +++ b/src/AMSlib/wf/workflow.hpp @@ -321,7 +321,9 @@ class AMSWorkflow callApplication(CallBack, Ins, InOuts, Outs); CALIPER(CALI_MARK_END("PHYSICS MODULE");) - storeComputedData(Ins, PhysicInOutsBefore, Outs, InOuts); + if (DB) { + storeComputedData(Ins, PhysicInOutsBefore, Outs, InOuts); + } CALIPER(CALI_MARK_END("AMSEvaluate");) return; } diff --git a/tutorial/Chapter.3.Inference/2.Train/train.py b/tutorial/Chapter.3.Inference/2.Train/train.py index ec76735a..d1d42ce1 100644 --- a/tutorial/Chapter.3.Inference/2.Train/train.py +++ b/tutorial/Chapter.3.Inference/2.Train/train.py @@ -63,8 +63,8 @@ def main(): epoch_loss = running_loss / len(loader.dataset) print(f"Epoch {epoch:2d}/{args.epochs} — Loss: {epoch_loss:.4f}") - model = model.double() # Set to double precision (float64) - prec = torch.float64 + model = model.float() # Set to double precision (float64) + prec = torch.float32 example_input = torch.randn(1, 1, device=device, dtype=prec) # Trace the model From 1c638412720e23de2b04d78b65e130a6005d5f64 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 18:28:10 -0700 Subject: [PATCH 119/136] Deleting model --- tutorial/Chapter.3.Inference/3.Serve/model.pt | Bin 3891 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tutorial/Chapter.3.Inference/3.Serve/model.pt diff --git a/tutorial/Chapter.3.Inference/3.Serve/model.pt b/tutorial/Chapter.3.Inference/3.Serve/model.pt deleted file mode 100644 index ca3ebb8e31b4ff0c62120b87525c1ad1975a75fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3891 zcmbtX3se(V8lEIPLkKF5V8PcBO907(@JJRBND+j9AdfcS(%F!VFc6YVGDva7phpB& zu~wzkQ+#xlR+mcQ)Kw6zfY!$Erauv$^wkMLQDovS4%Os3slxlcQ5EZjy zGR5{lLId8E#qPCCM@bR@)md{&9Td(owKr_OW>+6Ic&g`>!_|vv; z!iQbcuUv5Jc1h&aC%AsS_0*R8gJ*x~xxJBbqu@d0@mV1yf-uRj`Ys{}5KeU}u_jzc?W!)IR=+lOX=;3hs9FBkM zB2WI-ANOg)JKlRiA^cEwY5pHh0q-s}`oVH7EPz6+`GF+^@y&(xY0Q27G%h2HJ;C;| z$*D=v>F_)8>C54?^wjtjad3LHFmV|MiNR9{Bb8%h5oFA)d=zKFDpXn^N2rF}LKV0i z)qsFgnAuDOPZdETr~5&1wLF|9|P4GAosmaR{0wnD)+)&kp5 z3;JvbdHu5!1s(Ceh~B}W#XPU=$hncQ$o{a6FVrNd*j{s-UhTkDr?x-6^jTv%$H_mRiwq2;q?NL+fJd^}jX?KWLe?y`le-Cg&$Pb!>#ZQHSn zd26lir+Ba3*>k@nb@qGH*RDJD*F-)qa#rM-KO|7RSbkS>`dRts5zn_vGfLg(yD^@obQj2mAHS__{gq6l zkX?n(>X5=aujF-+c5~_pl>>A+NB?ZUiA;++|ZA!^%h?Q$LJP@L5^F z8Tzd3++WgY?C@RtIeUKItv(vngGC&0ty9g@F7>=0J@3mB-{rg+i%3;b=f0nxt>g6V z>(-IJ4u0b1|Br2tO_{Z^$9rS6y7P}}-fr-TPdnLs@nreEy-jnI z?vD9wY2Y2aeC6g<;f{R&Iag;7Oa1-Aiic|bYJA=D;yu}P^-G2*-)r<#(7dHw=f*y& zKjlte+x8kk!@8zrPNRn%@7-@aP(RdNd^7qxU4Qn8+Y!Uxc(mrJt9}U@oc*BJ=Xhh+ zOOe}BRrSvUKh*8-&2cHMzwt1j0mbHIMYnWt*N5|w_Uq{nmPotEyoQCJ9t%_)i#&E@ zUzAf;OLL}O_iy3Vjk`BE_ipl1xhnRaFYMhIu43G}=D+4iJG-UXHgN3SfQsrn+FpmN zA!;nV_+KO<(~6OQHarGdb{fEqb%1r90B$J&1YDxPH3pQmgx_UkKYeE?WIMhChyX-P zgK9mDgI}h@eWEh}OqC)s7*(i>a1B8Y{>S>aehdcWWGoo7y$naOA1?=h{|2}gLoUu^YHW!1*c-u3kKU;$b%Cv^f={>7&<~0Q-?a zVi421N1dU!j2>Nss5O8s#0n$F{b-R~{TDZRR3b6E_T^>}+=-ah_jiG!jr-@6;E0kS zDzUgV_Rlf#bkm^9>lb;olVVvu7gfxu*29) zrtWWAk1l4Ssnl`Ni9Rq@*tAr<&4j<55Vl;vDIz<&#YTy_l)wqu@uC`EGl~CHV7%vK dSb-b?5Kxz~hCn9;MQTfQ6Nm;r#QTPK{|%nra^wI2 From 65d555963f3b93ec7b271d2ab4395c0db60d1c81 Mon Sep 17 00:00:00 2001 From: koparasy Date: Mon, 28 Apr 2025 18:44:35 -0700 Subject: [PATCH 120/136] Final UQ example --- .../Chapter.3.Inference/4.UQ/CMakeLists.txt | 34 +++++ tutorial/Chapter.3.Inference/4.UQ/README.md | 14 ++ tutorial/Chapter.3.Inference/4.UQ/common.hpp | 137 ++++++++++++++++++ tutorial/Chapter.3.Inference/4.UQ/ex7.cpp | 124 ++++++++++++++++ tutorial/Chapter.3.Inference/4.UQ/train.py | 94 ++++++++++++ 5 files changed, 403 insertions(+) create mode 100644 tutorial/Chapter.3.Inference/4.UQ/CMakeLists.txt create mode 100644 tutorial/Chapter.3.Inference/4.UQ/README.md create mode 100644 tutorial/Chapter.3.Inference/4.UQ/common.hpp create mode 100644 tutorial/Chapter.3.Inference/4.UQ/ex7.cpp create mode 100644 tutorial/Chapter.3.Inference/4.UQ/train.py diff --git a/tutorial/Chapter.3.Inference/4.UQ/CMakeLists.txt b/tutorial/Chapter.3.Inference/4.UQ/CMakeLists.txt new file mode 100644 index 00000000..8b3ba2ae --- /dev/null +++ b/tutorial/Chapter.3.Inference/4.UQ/CMakeLists.txt @@ -0,0 +1,34 @@ +# Copyright 2022-2023 Lawrence Livermore National Security, LLC and other +# AMSLib Project Developers +# +# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + + +cmake_minimum_required(VERSION 3.20) +cmake_policy(SET CMP0104 NEW) + +# Define the project +project(EX6 LANGUAGES CXX C) + +set(AMS_EXAMPLE_SRC ex7.cpp) + +option(WITH_MPI "Option to enable MPI" OFF) +option(WITH_CALIPER "Use Caliper for Profiling" OFF) + +set(CMAKE_CXX_STANDARD 14) # Enable C++14 +set(CMAKE_CXX_STANDARD_REQUIRED ON) # Require the specified standard + +find_package(AMS REQUIRED) + +if (WITH_CALIPER) + find_package(caliper REQUIRED) +endif() + +if (WITH_MPI) + find_package(MPI REQUIRED) +endif() + + +add_executable(EX7 ${AMS_EXAMPLE_SRC}) +target_link_libraries(EX7 PRIVATE AMS::AMS) + diff --git a/tutorial/Chapter.3.Inference/4.UQ/README.md b/tutorial/Chapter.3.Inference/4.UQ/README.md new file mode 100644 index 00000000..175970cd --- /dev/null +++ b/tutorial/Chapter.3.Inference/4.UQ/README.md @@ -0,0 +1,14 @@ +# Model inference through AMS interface. + +Please modify the example code to create a AMSCompoundModel with the model trained on the previous example. Since we have already defined compounding and the matching of the executors with the underlying function. The changes should be minimal. + +## Threshold and Uncertainty. + +In AMS every compound model is accompanied by some UQ method. When models do not define their own uncertainty approach, we will define by default *random* uncertainty. Although the implementation of the ML UQ mechanism will be different the implementation remains the same. + + +### Random Uncertainty + +In the case of random uncertainty *AMS* computes a random value in the interval [0,1] for every computed sample. When the uncertainty (the randomly generated value) is higher than a user provided threshold, AMS considers this as a highly uncertain inference and only computes the underlying function for that specific sample. + +In the provided [solution](./sol6.cpp) there is an extra cli parameter that defines the uncertainty threshold for the compound model. Use the parameter and explore both the reported values and how the size of the database increases. diff --git a/tutorial/Chapter.3.Inference/4.UQ/common.hpp b/tutorial/Chapter.3.Inference/4.UQ/common.hpp new file mode 100644 index 00000000..253bb0b8 --- /dev/null +++ b/tutorial/Chapter.3.Inference/4.UQ/common.hpp @@ -0,0 +1,137 @@ +#include +#include +#include +#include + +class ExampleArgs +{ +public: + void PrintOptions() const + { + std::cout << "Available options:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << "\n " << opt.help << "\n"; + } + } + + void Parse(int argc, char** argv) + { + for (int i = 1; i < argc; ++i) { + std::string arg = argv[i]; + if (arg[0] != '-') continue; + + std::string key = arg; + std::string value; + + // If the next item isn't an option, treat it as a value + if (i + 1 < argc && argv[i + 1][0] != '-') { + value = argv[++i]; + } else { + value = "true"; // Boolean flag + } + + options_[key] = value; + } + + // Set parsed values into variables + for (auto& opt : registered_) { + const auto& keys = opt.keys; + for (const auto& key : keys) { + if (options_.count(key)) { + opt.setter(options_[key]); + opt.wasset = true; + break; + } + } + } + } + + template + void AddOption(T* out, + std::string short_opt, + std::string long_opt, + std::string help, + bool required = true) + { + registered_.push_back( + {{short_opt, long_opt}, + [out](const std::string& val) { parseValue(val, out); }, + [out]() { return toString(*out); }, + help, + required, + false}); + } + + bool Good() const + { + for (const auto& opt : registered_) { + if (opt.required && !opt.wasset) { + return false; + } + } + return true; + } + + void PrintUsage() const + { + std::cout << "Parsed arguments:\n"; + for (const auto& opt : registered_) { + std::cout << " "; + for (size_t i = 0; i < opt.keys.size(); ++i) { + std::cout << opt.keys[i]; + if (i + 1 < opt.keys.size()) std::cout << ", "; + } + std::cout << " = " << opt.getter() << "\n"; + } + } + +private: + struct RegisteredOption { + std::vector keys; + std::function setter; + std::function getter; + std::string help; + bool required; + bool wasset; + }; + + std::vector registered_; + std::unordered_map options_; + + // Parser helper + template + static void parseValue(const std::string& s, T* out); + + static void parseValue(const std::string& s, std::string* out) { *out = s; } + + static void parseValue(const std::string& s, int* out) + { + *out = std::stoi(s); + } + + static void parseValue(const std::string& s, float* out) + { + *out = std::atof(s.c_str()); + } + + static void parseValue(const std::string& s, bool* out) + { + *out = (s == "true" || s == "1"); + } + + static void parseValue(const std::string& s, double* out) + { + *out = std::stod(s); + } + + + static std::string toString(const std::string& val) { return val; } + static std::string toString(bool val) { return val ? "true" : "false"; } + static std::string toString(int val) { return std::to_string(val); } + static std::string toString(double val) { return std::to_string(val); } +}; diff --git a/tutorial/Chapter.3.Inference/4.UQ/ex7.cpp b/tutorial/Chapter.3.Inference/4.UQ/ex7.cpp new file mode 100644 index 00000000..06df7e10 --- /dev/null +++ b/tutorial/Chapter.3.Inference/4.UQ/ex7.cpp @@ -0,0 +1,124 @@ +#include + +#include + +#include "common.hpp" + +void InitMemBlob(double* ptr, int size) +{ + for (int i = 0; i < size; i++) { + ptr[i] = i; + } +} + +void ExampleCompute(double* in, double* out, int size) +{ + for (int i = 0; i < size; i++) { + out[i] = in[i]; + } +} + +void ExampleAMSTensorCompute(const ams::AMSTensor& in, ams::AMSTensor& out) +{ + ExampleCompute(in.data(), out.data(), in.shape()[0]); +} + +double ComputeSum(double* out, int size) +{ + double sum = 0; + for (int i = 0; i < size; i++) { + sum += out[i]; + } + return sum; +} + +int main(int argc, char* argv[]) +{ + using namespace ams; + int length; + std::string db_path; + std::string fn; + std::string model_path; + float threshold; + ExampleArgs args; + args.AddOption(&length, + "-l", + "--length", + "The size of the vectors to be initialized"); + args.AddOption(&db_path, + "-p", + "--db-path", + "The path of the file system database to store data to"); + args.AddOption(&fn, + "-f", + "--filename-prefix", + "The path of the file system database to store data to"); + args.AddOption(&model_path, + "-m", + "--model-path", + "The path to a torchscript model"); + args.AddOption(&threshold, "-t", "--threshold", "Model uncertainty"); + + + args.Parse(argc, argv); + if (!args.Good()) { + std::cout << "Wrong command line arguments\n"; + args.PrintOptions(); + return -1; + } + + ams::AMSInit(); + + double* input = new double[length]; + double* output = new double[length]; + + AMSConfigureFSDatabase(ams::AMSDBType::AMS_HDF5, db_path.c_str()); + InitMemBlob(input, length); + + AMSCAbstrModel model_descr = + AMSRegisterAbstractModel("compute", + ams::AMSUQPolicy::AMS_DELTAUQ_MEAN, + threshold, + model_path.c_str(), + fn.c_str()); + + + /* + * Create AMS tensors for memory blobs + */ + + // We represet both input/output as blobs of lenth 'samples', each sample as 1 element. + SmallVector input_tensors; + SmallVector inout_tensors; + SmallVector output_tensors; + + input_tensors.push_back(ams::AMSTensor::view( + input, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + output_tensors.push_back(ams::AMSTensor::view( + output, {length, 1}, {1, 1}, ams::AMSResourceType::AMS_HOST)); + + EOSLambda Computation = [&](const ams::SmallVector& ams_ins, + ams::SmallVector& ams_inouts, + ams::SmallVector& ams_outs) { + ExampleAMSTensorCompute(ams_ins[0], ams_outs[0]); + }; + + AMSExecutor wf = AMSCreateExecutor(model_descr, 0, 1); + std::cout << "Calling AMS Execute\n"; + AMSExecute(wf, Computation, input_tensors, inout_tensors, output_tensors); + std::cout << "Called AMS Execute\n"; + + auto sum = ComputeSum(output, length); + + std::cout << "[Example] Expected output is " << (length * (length - 1)) / 2 + << " and computed " << sum << "\n"; + + + delete[] input; + delete[] output; + ams::AMSFinalize(); + + + return 0; +} diff --git a/tutorial/Chapter.3.Inference/4.UQ/train.py b/tutorial/Chapter.3.Inference/4.UQ/train.py new file mode 100644 index 00000000..945f8aeb --- /dev/null +++ b/tutorial/Chapter.3.Inference/4.UQ/train.py @@ -0,0 +1,94 @@ +import argparse +from pathlib import Path +import h5py +import torch +from torch import nn, optim +from torch.utils.data import TensorDataset, DataLoader + + +class SimpleModel(nn.Module): + # A simple model that contains a single linear layer + def __init__(self, in_features, out_features): + super(SimpleModel, self).__init__() + self.fc = nn.Linear(in_features, out_features, False) + self.initialize_weights() + + def initialize_weights(self): + # Check if in_features == out_features for identity initialization + if self.fc.weight.shape[0] == self.fc.weight.shape[1]: + nn.init.eye_(self.fc.weight) # Initialize with identity matrix + else: + raise ValueError("Identity initialization requires in_features == out_features") + + def forward(self, x): + return self.fc(x) + + +class UQModel(nn.Module): + def __init__(self, _base): + super(UQModel, self).__init__() + self.base = _base + + def forward(self, x): + uncertainty = x / 1000 + out = self.base(x) + return out, uncertainty + + +def main(): + # Parse command-line arguments + parser = argparse.ArgumentParser(description="Train and store a model.") + parser.add_argument("--filename", "-fn", type=str, required=True, help="The file containing the data to train on") + parser.add_argument("--epochs", "-e", help="Number of epochs", default=10) + parser.add_argument("--model-file", "-m", help="Filename of model", default="model") + args = parser.parse_args() + if not Path(args.filename).exists(): + raise RuntimeError(f"Please provide an existing file, file {args.filename} does not exist") + device = "cpu" + + with h5py.File(args.filename, "r") as fd: + X, y = fd["input_data"][:], fd["output_data"][:] + dataset = TensorDataset( + torch.from_numpy(X), + torch.from_numpy(y), + ) + model = SimpleModel(X.shape[-1], y.shape[-1]) + optimizer = optim.Adam(model.parameters(), lr=1e-3) + criterion = nn.MSELoss() + loader = DataLoader(dataset, batch_size=64, shuffle=True) + + for epoch in range(1, args.epochs + 1): + model.train() + running_loss = 0.0 + + for xb, yb in loader: + xb, yb = xb.to(device), yb.to(device) + + optimizer.zero_grad() + preds = model(xb) + loss = criterion(preds, yb) + loss.backward() + optimizer.step() + + running_loss += loss.item() * xb.size(0) + + epoch_loss = running_loss / len(loader.dataset) + print(f"Epoch {epoch:2d}/{args.epochs} — Loss: {epoch_loss:.4f}") + + model = UQModel(model) # Set to double precision (float64) + prec = torch.float32 + example_input = torch.from_numpy(X) + + # Trace the model + scripted_model = torch.jit.trace(model, example_input) + + # Generate the file name + file_path = f"{args.model_file}.pt" + # Save the scripted model + scripted_model.save(file_path) + + print(f"Model saved to {file_path}") + + +if __name__ == "__main__": + main() From 40c84671f210fcf070142cc14a0cd9ace981d232 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 21:56:36 -0700 Subject: [PATCH 121/136] Fix readme --- tutorial/Chapter.1.DataFlow/0.Build/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tutorial/Chapter.1.DataFlow/0.Build/README.md b/tutorial/Chapter.1.DataFlow/0.Build/README.md index c3b469b8..4e485628 100644 --- a/tutorial/Chapter.1.DataFlow/0.Build/README.md +++ b/tutorial/Chapter.1.DataFlow/0.Build/README.md @@ -11,7 +11,6 @@ To use AMS we need to `find_package(AMS REQUIRED)` ([here](./CMakeLists.txt#L22) The [example](./ex0.cpp) code is very simple. The user provides in the *cli* the length of 2 vectors, the example initializes the `input` vector from *0-length-1* values and then assigns these values to the [output vector](./ex0.cpp#L52) finally it computes the sum of all elements in the output vector and prints the sum at the terminal with the expected output value. - ## Configure and link To configure the example please provide these commands: @@ -56,3 +55,5 @@ The output should look like this: [AMS:DEBUG:AMS] Finalization of AMS [AMS:DEBUG:AMSDefaultDeviceAllocator] Destroying default host allocator ``` + +There are the following log levels, debug, info, warning. From b9c988755b3e0eb596e750d139c7d5d90552750e Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 21:57:22 -0700 Subject: [PATCH 122/136] README.md --- .../Chapter.1.DataFlow/1.AMSTensor/README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tutorial/Chapter.1.DataFlow/1.AMSTensor/README.md diff --git a/tutorial/Chapter.1.DataFlow/1.AMSTensor/README.md b/tutorial/Chapter.1.DataFlow/1.AMSTensor/README.md new file mode 100644 index 00000000..73ac323e --- /dev/null +++ b/tutorial/Chapter.1.DataFlow/1.AMSTensor/README.md @@ -0,0 +1,17 @@ +# AMS Tensors + +AMS (partially) replaces some arbitary function with Machine Learning (Torch) model. + +## The AMSTensor + +The AMSTensor is a C++ abstraction that associates a contineous memory blob with some access pattern and reshaping. In other words, it represents the memory as a tensor. The AMSTensor is a shim lay on top of the torch tensor representation and currently only isolates the binary linkage of the example/application code to the torch librarry. + +### Use AMSTensors in the example code + +Introduce a function that takes as arguments AMSTensor and performs the same computation as the original `ExampleCompute`. Modify the [example code](./ex1.cpp) accordingly. Here is the signature of the requested function: + +` +void ExampleAMSTensorCompute(ams::AMSTensor& in, ams::AMSTensor& out) +` + + From aa5c148d8f69e1df582d62da3958094ce33ddeed Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:00:08 -0700 Subject: [PATCH 123/136] Fix readme --- tutorial/Chapter.1.DataFlow/1.AMSTensor/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorial/Chapter.1.DataFlow/1.AMSTensor/README.md b/tutorial/Chapter.1.DataFlow/1.AMSTensor/README.md index 73ac323e..5a78a0b6 100644 --- a/tutorial/Chapter.1.DataFlow/1.AMSTensor/README.md +++ b/tutorial/Chapter.1.DataFlow/1.AMSTensor/README.md @@ -1,10 +1,10 @@ # AMS Tensors -AMS (partially) replaces some arbitary function with Machine Learning (Torch) model. +AMS (partially) replaces some arbitary function with Machine Learning (Torch) model. To properly perform the replacement AMS requires information regarding the memory accesses of the computational functions. The lower building block is the `AMSTensor` a simple abstraction that describes continuous blobs of memory and their access pattern. ## The AMSTensor -The AMSTensor is a C++ abstraction that associates a contineous memory blob with some access pattern and reshaping. In other words, it represents the memory as a tensor. The AMSTensor is a shim lay on top of the torch tensor representation and currently only isolates the binary linkage of the example/application code to the torch librarry. +The AMSTensor is a C++ abstraction that associates a contineous memory blob with some access pattern and reshaping. In other words, it represents the memory as a tensor. The AMSTensor is a shim layer on top of the torch tensor representation and currently only isolates the binary linkage of the example/application code to the torch librarry. ### Use AMSTensors in the example code From b094c725abac85e7750865698d72a3b77cabc023 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:09:40 -0700 Subject: [PATCH 124/136] Adding readme --- tutorial/Chapter.1.DataFlow/2.DataFlow/README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tutorial/Chapter.1.DataFlow/2.DataFlow/README.md b/tutorial/Chapter.1.DataFlow/2.DataFlow/README.md index d1fb43be..4dd0ef9e 100644 --- a/tutorial/Chapter.1.DataFlow/2.DataFlow/README.md +++ b/tutorial/Chapter.1.DataFlow/2.DataFlow/README.md @@ -11,7 +11,15 @@ However, an arbitary function can access multiple memory blobs with different in Multiple memory blobs of the same intention can be packed together in a vector. AMS instead of using the `std::vector` uses ams::SmallVector a lightweight C++ vector abstraction (originated from the LLVM project) that can be allocated in the stack and is more efficient. -### Create a C++ lambda that takes 3 input parameters (1 for each memory category), each of Smallvector type storing the AMSTensors. +### Extend the example code to define a EOSLambda. + +Create a C++ lambda that takes 3 input parameters (1 for each memory category), each of Smallvector type storing the AMSTensors. The signature of the lambda should look like this: + +```cpp +auto compute = [&](const ams::SmallVector &, + ams::SmallVector &, + ams::SmallVector &); +``` From 982530bc85e3a5074d5e9a539d7498aaeee48bd1 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:26:09 -0700 Subject: [PATCH 125/136] Minors --- .github/containers/x86_64-tutorial/Dockerfile | 8 ++++---- tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/containers/x86_64-tutorial/Dockerfile b/.github/containers/x86_64-tutorial/Dockerfile index 0943f510..c7092954 100644 --- a/.github/containers/x86_64-tutorial/Dockerfile +++ b/.github/containers/x86_64-tutorial/Dockerfile @@ -74,17 +74,17 @@ ENV AMS_TORCH_PATH=/app/venv/lib/python3.11/site-packages/torch/share/cmake/Torc RUN cd /opt/archives/ && \ source /app/venv/bin/activate && \ git clone --depth 1 https://github.com/LLNL/AMS.git -b features/tutorial && \ - mkdir -p /opt/archives/AMS/build-ams/ && \ - cd /opt/archives/AMS/build-ams/ && \ + mkdir -p /opt/archives/AMS/build/ && \ + cd /opt/archives/AMS/build/ && \ cmake \ - -DBUILD_SHARED_LIBS=On \ -DWITH_RMQ=On \ + -DBUILD_SHARED_LIBS=On \ -DWITH_CALIPER=On \ -DWITH_HDF5=On \ -DWITH_AMS_DEBUG=On \ -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=On \ - -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DCMAKE_BUILD_TYPE=Release \ -DWITH_CUDA=Off \ -DMFEM_DIR=$AMS_MFEM_PATH \ -DWITH_MPI=On \ diff --git a/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp b/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp index 22a47278..b773aaa5 100644 --- a/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp +++ b/tutorial/Chapter.1.DataFlow/3.CompoundModel/sol3.cpp @@ -59,7 +59,6 @@ int main(int argc, char* argv[]) AMSCAbstrModel model_descr = AMSRegisterAbstractModel( "compute", ams::AMSUQPolicy::AMS_RANDOM, -1.0, "", ""); - /* * Create AMS tensors for memory blobs */ From c8d4d9f326c51650a1818f1166eaa4295c31f0ad Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:32:47 -0700 Subject: [PATCH 126/136] Readme update --- tutorial/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tutorial/README.md b/tutorial/README.md index 26ee00b5..ece356ee 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -46,5 +46,8 @@ Root password set to 'root' ## Contents -1. [Build-Link-Logger](./0.Build) -2. [AMS Data Flow](./1.DataFlow) +1. [Basic API](./Chapter.1.DataFlow/) + a. [Build](./Chapter.1.DataFlow/0.Build) + b. [AMSTensor](./Chapter.1.DataFlow/2.Dataflow) + c. [AbstractCompoundModel](./Chapter.1.Dataflow/3.CompoundModel) +2. [AMS Data Collection](./Chapter.2.DB) From 57182a0dbcdb9af8f179a5454a918c4657c3f6ab Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:34:16 -0700 Subject: [PATCH 127/136] Numeric sublists --- tutorial/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutorial/README.md b/tutorial/README.md index ece356ee..89f8f07d 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -47,7 +47,7 @@ Root password set to 'root' ## Contents 1. [Basic API](./Chapter.1.DataFlow/) - a. [Build](./Chapter.1.DataFlow/0.Build) - b. [AMSTensor](./Chapter.1.DataFlow/2.Dataflow) - c. [AbstractCompoundModel](./Chapter.1.Dataflow/3.CompoundModel) + 1. [Build](./Chapter.1.DataFlow/0.Build) + 2. [AMSTensor](./Chapter.1.DataFlow/2.Dataflow) + 3. [AbstractCompoundModel](./Chapter.1.Dataflow/3.CompoundModel) 2. [AMS Data Collection](./Chapter.2.DB) From ff78309a66d3856eb527537ef97ec30a78f65f69 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:36:00 -0700 Subject: [PATCH 128/136] Update links --- tutorial/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tutorial/README.md b/tutorial/README.md index 89f8f07d..7f1234d8 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -48,6 +48,7 @@ Root password set to 'root' 1. [Basic API](./Chapter.1.DataFlow/) 1. [Build](./Chapter.1.DataFlow/0.Build) - 2. [AMSTensor](./Chapter.1.DataFlow/2.Dataflow) - 3. [AbstractCompoundModel](./Chapter.1.Dataflow/3.CompoundModel) + 2. [AMSTensor](./Chapter.1.DataFlow/1.AMSTensor) + 3. [DataFlow](./Chapter.1.DataFlow/2.DataFlow) + 4. [AbstractCompoundModel](./Chapter.1.Dataflow/3.CompoundModel) 2. [AMS Data Collection](./Chapter.2.DB) From 3654fb763ac63e9d56debb33c8b0ba5826bea634 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:38:37 -0700 Subject: [PATCH 129/136] file --- tutorial/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/README.md b/tutorial/README.md index 7f1234d8..757c4b48 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -50,5 +50,5 @@ Root password set to 'root' 1. [Build](./Chapter.1.DataFlow/0.Build) 2. [AMSTensor](./Chapter.1.DataFlow/1.AMSTensor) 3. [DataFlow](./Chapter.1.DataFlow/2.DataFlow) - 4. [AbstractCompoundModel](./Chapter.1.Dataflow/3.CompoundModel) + 4. [AbstractCompoundModel](./Chapter.1.Dataflow/3.CompoundModel/) 2. [AMS Data Collection](./Chapter.2.DB) From 254dd5984c60092e3d122047275b1aca5e3bfb12 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:39:42 -0700 Subject: [PATCH 130/136] lower to upper --- tutorial/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/README.md b/tutorial/README.md index 757c4b48..9b8840e8 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -50,5 +50,5 @@ Root password set to 'root' 1. [Build](./Chapter.1.DataFlow/0.Build) 2. [AMSTensor](./Chapter.1.DataFlow/1.AMSTensor) 3. [DataFlow](./Chapter.1.DataFlow/2.DataFlow) - 4. [AbstractCompoundModel](./Chapter.1.Dataflow/3.CompoundModel/) + 4. [AbstractCompoundModel](./Chapter.1.DataFlow/3.CompoundModel/) 2. [AMS Data Collection](./Chapter.2.DB) From 05eb17251e5559ba1077983ddff5aad8f36031be Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:41:35 -0700 Subject: [PATCH 131/136] Readme --- tutorial/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tutorial/README.md b/tutorial/README.md index 9b8840e8..c8a0387f 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -52,3 +52,4 @@ Root password set to 'root' 3. [DataFlow](./Chapter.1.DataFlow/2.DataFlow) 4. [AbstractCompoundModel](./Chapter.1.DataFlow/3.CompoundModel/) 2. [AMS Data Collection](./Chapter.2.DB) + 1. [HDF5](./Chapter.2.DB/1.HDF5/) From 8423df50f07f2f5417df6efdf58f10980daed1b8 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:49:31 -0700 Subject: [PATCH 132/136] Update readme --- tutorial/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tutorial/README.md b/tutorial/README.md index c8a0387f..65f9bfd5 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -53,3 +53,5 @@ Root password set to 'root' 4. [AbstractCompoundModel](./Chapter.1.DataFlow/3.CompoundModel/) 2. [AMS Data Collection](./Chapter.2.DB) 1. [HDF5](./Chapter.2.DB/1.HDF5/) +3. [AMS Model Serving](./Chapter.3.Inference) + 1. [Data Collection](./Chapter.3.Inference/1.HDF5) From b662d5654b66cb07490fe8a1ee79b0a7a4d8261c Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:50:58 -0700 Subject: [PATCH 133/136] Fixed readme --- tutorial/Chapter.3.Inference/1.HDF5/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/Chapter.3.Inference/1.HDF5/README.md b/tutorial/Chapter.3.Inference/1.HDF5/README.md index c8201a62..d27fd8d3 100644 --- a/tutorial/Chapter.3.Inference/1.HDF5/README.md +++ b/tutorial/Chapter.3.Inference/1.HDF5/README.md @@ -2,7 +2,7 @@ This example uses the solution of the data collection hdf5 chapter to create data to train our model on. -Please execute the following: +Please build the example code and execute the following: ``` AMS_LOG_LEVEL=debug ./EX5 -l 100 -f db -p ../../ From 0f5fe4c2a0446e9e0abdfe5bae95b9737bc3d902 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:54:19 -0700 Subject: [PATCH 134/136] Fixed readme --- tutorial/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tutorial/README.md b/tutorial/README.md index 65f9bfd5..11296e12 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -55,3 +55,6 @@ Root password set to 'root' 1. [HDF5](./Chapter.2.DB/1.HDF5/) 3. [AMS Model Serving](./Chapter.3.Inference) 1. [Data Collection](./Chapter.3.Inference/1.HDF5) + 2. [Train](./Chapter.3.Inference/2.Train) + 3. [Serve Inference](./Chapter.3.Inference/3.Serve) + 4. [UQ](./Chapter.3.Inference/4.UQ) From ad7a0939393f8a2b5eaa8d52cecdd044e5a58c9a Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 22:59:36 -0700 Subject: [PATCH 135/136] Update train --- tutorial/Chapter.3.Inference/2.Train/train.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tutorial/Chapter.3.Inference/2.Train/train.py b/tutorial/Chapter.3.Inference/2.Train/train.py index d1d42ce1..cc66c4e4 100644 --- a/tutorial/Chapter.3.Inference/2.Train/train.py +++ b/tutorial/Chapter.3.Inference/2.Train/train.py @@ -28,7 +28,7 @@ def main(): # Parse command-line arguments parser = argparse.ArgumentParser(description="Train and store a model.") parser.add_argument("--filename", "-fn", type=str, required=True, help="The file containing the data to train on") - parser.add_argument("--epochs", "-e", help="Number of epochs", default=10) + parser.add_argument("--epochs", "-e", type=int, help="Number of epochs", default=10) parser.add_argument("--model-file", "-m", help="Filename of model", default="model") args = parser.parse_args() if not Path(args.filename).exists(): @@ -63,7 +63,7 @@ def main(): epoch_loss = running_loss / len(loader.dataset) print(f"Epoch {epoch:2d}/{args.epochs} — Loss: {epoch_loss:.4f}") - model = model.float() # Set to double precision (float64) + model = model.float() prec = torch.float32 example_input = torch.randn(1, 1, device=device, dtype=prec) From 4b2ac395d97b0746c8e0ccaadd3ad49d843e2027 Mon Sep 17 00:00:00 2001 From: Konstantinos Parasyris Date: Mon, 28 Apr 2025 23:16:42 -0700 Subject: [PATCH 136/136] Adding uncertainty text --- tutorial/Chapter.3.Inference/4.UQ/README.md | 5 ++--- tutorial/Chapter.3.Inference/4.UQ/train.py | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/tutorial/Chapter.3.Inference/4.UQ/README.md b/tutorial/Chapter.3.Inference/4.UQ/README.md index 175970cd..7b54cd56 100644 --- a/tutorial/Chapter.3.Inference/4.UQ/README.md +++ b/tutorial/Chapter.3.Inference/4.UQ/README.md @@ -6,9 +6,8 @@ Please modify the example code to create a AMSCompoundModel with the model train In AMS every compound model is accompanied by some UQ method. When models do not define their own uncertainty approach, we will define by default *random* uncertainty. Although the implementation of the ML UQ mechanism will be different the implementation remains the same. - -### Random Uncertainty +### Torch Uncertainty In the case of random uncertainty *AMS* computes a random value in the interval [0,1] for every computed sample. When the uncertainty (the randomly generated value) is higher than a user provided threshold, AMS considers this as a highly uncertain inference and only computes the underlying function for that specific sample. -In the provided [solution](./sol6.cpp) there is an extra cli parameter that defines the uncertainty threshold for the compound model. Use the parameter and explore both the reported values and how the size of the database increases. +We can though implement our own uncertainty quantification mechanism and attach it on the torch trained model. diff --git a/tutorial/Chapter.3.Inference/4.UQ/train.py b/tutorial/Chapter.3.Inference/4.UQ/train.py index 945f8aeb..84f4aa05 100644 --- a/tutorial/Chapter.3.Inference/4.UQ/train.py +++ b/tutorial/Chapter.3.Inference/4.UQ/train.py @@ -32,7 +32,9 @@ def __init__(self, _base): def forward(self, x): uncertainty = x / 1000 out = self.base(x) - return out, uncertainty + # AMS Uncertainty requires that the uncertainty will have the same shape as + # the output. So we have a value for every partial component (dimension) of the output + return out, torch.abs(x-out) def main():

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∾4&*UnBI+FP|*!_(@j(#^KzS?-N|L=G5LXx+U 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ⅅ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 M51ewsBzyjj`h3us-lvoGd`8U1KE z`7sG8k$1Ioy0bsw_9H6Ibah?)JnBXyE3}66Me8s(7xL9SLH^{*BCg;2Zdn9>=Sm+X zz8ZT3cBaE^S2yQ!xwRk$jzXAP56MF7Pb^8h`If!U;bOic^ z{qTK$~| zb#jcMflc!z5Zdm!P}jET z6Y#|~_Z%nnvci3mvxqS)Z zI`HTiQU+FLKFJ4pxs=w!7Bfjoa3VPbU`H%GVqFN^i≫M3HhU6 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

}4 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