We provide (so far experimental) bindings to PyTorch. The bindings are specified in bindings.cc, usage examples can be found in example.py.
We provide bindings for the main primitives of AdaPM: pull
, push
, intent
, advance_clock
, prepare_sample
, and pull_sample
. They further provide a set
variant of the push
primitive that sets parameter to specific values (instead of adding to the values, as push
does).
keys = torch.LongTensor([1,2,3,4])
values = torch.ones((len(keys)*10), dtype=torch.float32)
# pull
kv.pull(keys, values)
# push
kv.push(keys, values)
# set (variant of push)
kv.set(keys, values)
# signal intent and advance clock
kv.intent(keys, 2, 3)
kv.advance_clock()
The bindings also accept numpy arrays:
keys = np.array([1,2,3,4])
values = np.ones(len(keys)*10, dtype=np.float32)
# pull
kv.pull(keys, values)
# push
kv.push(keys, values)
# set (variant of push)
kv.set(keys, values)
# signal intent and advance clock
kv.intent(keys, 2, 3)
kv.advance_clock()
By default, operations run synchronously. To run asynchronously, pass async=True
to the operation:
kv.pull(keys, values, True)
kv.push(keys, values, True)
In particular, push
is often executed asynchronously.
kv.wait()
explicitly waits for the execution of a specific operation:
timestamp = kv.pull(keys, values, True)
# do something else
kv.wait(timestamp) # wait for pull to finish
Parameter access operations (pull
, push
, set
, and pull_sample
) return a timestamp that can be used this way.
To compile working bindings, it is important that AdaPM is built with a key
data type that matches PyTorch and NumPy default integer data types (int64
)
and that AdaPM is built with the the same C++ ABI as the installed PyTorch. If
you installed PyTorch in a normal way (e.g., pip or conda), it is likely that
this PyTorch installation uses the old pre-C++11 ABI (apparently, this is done
to ensure compatibility to old Python versions). If you are on a recent OS, this
will be incompatible with system-provided Protocol Buffers. Thus, you will
probably have to install Protocol Buffers manually. To check the ABI of your
installed PyTorch, run python bindings/lookup_torch_abi.py
(0
means
pre-C++11 ABI, 1
means C++ ABI). If that script returns 0
and you are on a
recent OS with C++ ABI (e.g., compare echo '#include <string>' | g++ -x c++ -E -dM - | fgrep _GLIBCXX_USE_CXX11_ABI
), you have to install Protocol Buffers
manually. (Sorry :/)
To manually install protocol buffers with the pre-c++11 ABI, use:
# (in the root folder of this repository)
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-cpp-3.6.1.tar.gz
tar zxf protobuf-cpp-3.6.1.tar.gz
cd protobuf-3.6.1
mkdir release && cd release
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$(pwd)/../../deps/ -D CMAKE_CXX_FLAGS="-fPIC -D_GLIBCXX_USE_CXX11_ABI=0" -D protobuf_BUILD_TESTS=OFF ../cmake/
make -j # this can take a while
make install
Then to compile AdaPM with the matching key type and the ABI of the installed PyTorch:
# (in the root folder of this repository)
cmake -S . -B build_bindings -D PS_KEY_TYPE=int64_t -DPROTOBUF_PATH=$(pwd)/deps/lib/cmake/protobuf/ -D CMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=$(python bindings/lookup_torch_abi.py)"
cmake --build build_bindings --target adapm
Note Make sure that PyTorch is installed before you build AdaPM. Otherwise, the ABI read-out (
$(python bindings/lookup_torch_abi.py)
above) will fail. Also make sure that you run the read-out with the python that you are using (i.e., potentiallypython3
orpython3.9
rather thanpython
).
And finally, to compile the bindings:
cd bindings
python setup.py install --user
Note If you built AdaPM to another path than
build_bindings/
or you installed Protocol Buffers to a folder other thandeps/
, you need to pass these paths tosetup.py
explicitly via environment variablesBUILD_PATH
andDEPS_PATH
(using absolute paths). E.g.:BUILD_PATH=[ABSOLUTE_PATH_TO_BUILD] DEPS_PATH=[ABSOLUTE_PATH_TO_PROTOBUF_INSTALL] python setup.py install --user
If successful, you can now use AdaPM from Python
#!/usr/bin/python
import torch
import adapm
You should also be able to run python bindings/example.py
without error messages.
These bindings have an experimental status. If you run into any problems or have questions, please don't hesitate to contact us.