C++ Library API of Rabit¶
This page contains document of Library API of rabit.
-
namespace
rabit
¶ rabit namespace
Typedefs
-
typedef dmlc::Stream
Stream
¶ defines stream used in rabit see definition of Stream in dmlc/io.h
-
typedef dmlc::Serializable
Serializable
¶ defines serializable objects used in rabit see definition of Serializable in dmlc/io.h
Functions
-
void
Init
(int argc, char *argv[])¶ initializes rabit, call this once at the beginning of your program
- Parameters
argc
-number of arguments in argv
argv
-the array of input arguments
-
void
Finalize
(void)¶ finalizes the rabit engine, call this function after you finished with all the jobs
-
int
GetRank
(void)¶ gets rank of the current process
-
int
GetWorldSize
(void)¶ gets total number of processes
-
bool
IsDistributed
(void)¶ whether rabit env is in distributed mode
-
std::string
GetProcessorName
(void)¶ gets processor’s name
-
void
TrackerPrint
(const std::string &msg)¶ prints the msg to the tracker, this function can be used to communicate progress information to the user who monitors the tracker
- Parameters
msg
-the message to be printed
-
void
TrackerPrintf
(const char *fmt, ...)¶ prints the msg to the tracker, this function may not be available in very strict c++98 compilers, though it usually is. this function can be used to communicate progress information to the user who monitors the tracker
- Parameters
fmt
-the format string
-
void
Broadcast
(void *sendrecv_data, size_t size, int root)¶ broadcasts a memory region to every node from the root
Example: int a = 1; Broadcast(&a, sizeof(a), root);
- Parameters
sendrecv_data
-the pointer to the send/receive buffer,
size
-the data size
root
-the process root
- template <typename DType>
-
void
Broadcast
(std::vector<DType> *sendrecv_data, int root)¶ broadcasts an std::vector<DType> to every node from root
- Parameters
sendrecv_data
-the pointer to send/receive vector, for the receiver, the vector does not need to be pre-allocated
root
-the process root
- Template Parameters
DType
-the data type stored in the vector, has to be a simple data type that can be directly transmitted by sending the sizeof(DType)
-
void
Broadcast
(std::string *sendrecv_data, int root)¶ broadcasts a std::string to every node from the root
- Parameters
sendrecv_data
-the pointer to the send/receive buffer, for the receiver, the vector does not need to be pre-allocated
root
-the process root
- template <typename OP, typename DType>
-
void
Allreduce
(DType *sendrecvbuf, size_t count, void (*prepare_fun)(void *), void *prepare_arg, )¶ performs in-place Allreduce on sendrecvbuf this function is NOT thread-safe
Example Usage: the following code does an Allreduce and outputs the sum as the result
vector<int> data(10); ... Allreduce<op::Sum>(&data[0], data.size()); ...
- Parameters
sendrecvbuf
-buffer for both sending and receiving data
count
-number of elements to be reduced
prepare_fun
-Lazy preprocessing function, if it is not NULL, prepare_fun(prepare_arg) will be called by the function before performing Allreduce in order to initialize the data in sendrecvbuf. If the result of Allreduce can be recovered directly, then prepare_func will NOT be called
prepare_arg
-argument used to pass into the lazy preprocessing function
- Template Parameters
OP
-see namespace op, reduce operator
DType
-data type
- template <typename OP, typename DType>
-
void
Allreduce
(DType *sendrecvbuf, size_t count, std::function<void()> prepare_fun)¶ performs in-place Allreduce, on sendrecvbuf with a prepare function specified by a lambda function
Example Usage:
// the following code does an Allreduce and outputs the sum as the result vector<int> data(10); ... Allreduce<op::Sum>(&data[0], data.size(), [&]() { for (int i = 0; i < 10; ++i) { data[i] = i; } }); ...
- Parameters
sendrecvbuf
-buffer for both sending and receiving data
count
-number of elements to be reduced
prepare_fun
-Lazy lambda preprocessing function, prepare_fun() will be invoked by the function before performing Allreduce in order to initialize the data in sendrecvbuf. If the result of Allreduce can be recovered directly, then prepare_func will NOT be called
- Template Parameters
OP
-see namespace op, reduce operator
DType
-data type
-
int
LoadCheckPoint
(Serializable *global_model, Serializable *local_model)¶ loads the latest check point
// Example usage code of LoadCheckPoint int iter = rabit::LoadCheckPoint(&model); if (iter == 0) model.InitParameters(); for (i = iter; i < max_iter; ++i) { // do many things, include allreduce rabit::CheckPoint(model); }
- Return
- the version number of the check point loaded if returned version == 0, this means no model has been CheckPointed the p_model is not touched, users should do the necessary initialization by themselves
- See
- CheckPoint, VersionNumber
- Parameters
global_model
-pointer to the globally shared model/state when calling this function, the caller needs to guarantee that the global_model is the same in every node
local_model
-pointer to the local model that is specific to the current node/rank this can be NULL when no local model is needed
-
void
CheckPoint
(const Serializable *global_model, const Serializable *local_model)¶ checkpoints the model, meaning a stage of execution has finished. every time we call check point, a version number will be increased by one
- See
- LoadCheckPoint, VersionNumber
- Parameters
global_model
-pointer to the globally shared model/state when calling this function, the caller needs to guarantee that the global_model is the same in every node
local_model
-pointer to the local model that is specific to the current node/rank this can be NULL when no local state is needed NOTE: local_model requires explicit replication of the model for fault-tolerance, which will bring replication cost in the CheckPoint function. global_model does not need explicit replication. So, only CheckPoint with the global_model if possible
-
void
LazyCheckPoint
(const Serializable *global_model)¶ This function can be used to replace CheckPoint for global_model only, when certain condition is met (see detailed explanation).
This is a “lazy” checkpoint such that only the pointer to the global_model is remembered and no memory copy is taken. To use this function, the user MUST ensure that: The global_model must remain unchanged until the last call of Allreduce/Broadcast in the current version finishes. In other words, the global_model model can be changed only between the last call of Allreduce/Broadcast and LazyCheckPoint, both in the same version
For example, suppose the calling sequence is: LazyCheckPoint, code1, Allreduce, code2, Broadcast, code3, LazyCheckPoint/(or can be CheckPoint)
Then the user MUST only change the global_model in code3.
The use of LazyCheckPoint instead of CheckPoint will improve the efficiency of the program.
- See
- LoadCheckPoint, CheckPoint, VersionNumber
- Parameters
global_model
-pointer to the globally shared model/state when calling this function, the caller needs to guarantee that the global_model is the same in every node
-
int
VersionNumber
(void)¶ - Return
- version number of the current stored model, which means how many calls to CheckPoint we made so far
- See
- LoadCheckPoint, CheckPoint
- template <typename DType, void(*)(DType &dst, const DType &src) freduce>
-
class
Reducer
¶ - #include <rabit.h>
template class to make customized reduce and all reduce easy Do not use reducer directly in the function you call Finalize, because the destructor can execute after Finalize
- Template Parameters
DType
-data type that to be reduced
freduce
-the customized reduction function DType must be a struct, with no pointer
- template <typename DType>
-
class
SerializeReducer
¶ - #include <rabit.h>
template class to make customized reduce, this class defines complex reducer handles all the data structure that can be serialized/deserialized into fixed size buffer Do not use reducer directly in the function you call Finalize, because the destructor can execute after Finalize
- Template Parameters
DType
-data type that to be reduced, DType must contain the following functions:
freduce
-the customized reduction function (1) Save(IStream &fs) (2) Load(IStream &fs) (3) Reduce(const DType &src, size_t max_nbyte)
-
typedef dmlc::Stream