Skip to content

Latest commit

 

History

History
 
 

client_lib

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

SwitchML Client Library

The SwitchML client is a static library that bridges the gap between the end-hosts and the programmable switch through a simple to use API.

This document shows how to setup and use the library.

1. Backends

First of all you should know that the client library has multiple backends which perform the collective communication primitives.

1.1 Dummy Backend

The dummy backend is a backend that does not perform any actual communication but is just used for debugging purposes. It helps ensure that the software stack is operating correctly down to the backend.

1.2 DPDK Backend

The DPDK backend uses the DPDK library to perform collective operations with the UDP transport. Thus it supports all of the NICs and drivers that DPDK supports (we tested only Intel and Mellanox NICs so far).

1.3 RDMA Backend

The RDMA Backend uses ibverbs directly to perform communication using RDMA as a transport and it usually outperforms DPDK on more than 10Gbps NICs because of the additional hardware offloads. However, you must have a NIC that supports RDMA.

2. Required Libraries

Listed below are the system packages that are needed for the client library.

2.1 General requirements

These are dependencies that are required regardless of the backend you choose.

Package (Debian/Ubuntu) Tested Versions
gcc 7.5.0-3ubuntu1~18.04
make 4.1-9.1ubuntu1
build-essential
libboost-program-options-dev 1.65.1.0ubuntu1
libgoogle-glog-dev 0.3.5-1

On Debian/Ubuntu you can run the following command to install them:

sudo apt install -y \
gcc \
make \
libboost-program-options-dev \
libgoogle-glog-dev

1.2 DPDK Backend Requirements

These are dependencies that are required only for the DPDK backend.

Package (Debian/Ubuntu) Tested Versions
libnuma-dev 2.0.11-2.1ubuntu0.1
libibverbs-dev 46mlnx1-1.46101
libmnl-dev 1.0.4-2
autoconf
libtool
pkg-config
cmake 3.17.0
libhugetlbfs-dev
libssl-dev
linux-headers
linux-modules

The cmake version required to compile grpc must be at least 3.13 which is not available by default. Thus you will need to add kitware's repository to your build system by following this guide. Or you can choose to compile cmake from source.

On Debian/Ubuntu you can run the following command to install all dependencies (Assuming you added kitware's repo) :

sudo apt install -y \
libnuma-dev \
libibverbs-dev \
libhugetlbfs-dev \
libmnl-dev \
autoconf \
libtool \
pkg-config \
cmake \
libssl-dev \
linux-headers-$(uname -r) \
linux-modules-$(uname -r)

Important The DPDK backend requires root access. So whether you are running a benchmark, an example, or using it through pytorch, you must give your application root privileges.

1.3 RDMA Backend Requirements

These are dependencies that are required only for the RDMA backend.

Package (Debian/Ubuntu) Tested Versions
autoconf
libtool
pkg-config
libibverbs-dev 46mlnx1-1.46101
cmake 3.17.0
libhugetlbfs-dev
libssl-dev

The cmake version required to compile grpc must be at least 3.13 which is not available by default. Thus you will need to add kitware's repository to your build system by following this guide. Or you can choose to compile cmake from source.

On Debian/Ubuntu you can run the following command to install all dependencies (Assuming you added kitware's repo):

sudo apt install -y \
autoconf \
libtool \
pkg-config \
libibverbs-dev \
libhugetlbfs-dev \
cmake \
libssl-dev

Important The RDMA backend requires that you disable ICRC checking on the NIC that you will use. We provide a template for a script that does just that in the scripts directory.

2. Compiling the Library

To build the library with only the dummy backend for testing purposes you can simply run (Assuming you are in the client_lib directory)

make

To build the library with DPDK support, add DPDK=1 to the make command.

make DPDK=1

To build the library with RDMA support, add RDMA=1 to the make command.

make RDMA=1

By default the library will be found in:

dev_root/build/lib/libswitchml-client.a

Include files will be found in

dev_root/build/include

And finally the configuration file will be found in

dev_root/build/switchml.cfg

Read through the other options to control the build below.

2.1 Build Variables

The following variables can all be passed to the client_lib makefile to control the build.

Variable Type Default Usage
DEBUG boolean 0 Disable optimizations, add debug symbols, and enable detailed debugging messages.
DPDK boolean 0 Compile and include the dpdk backend.
RDMA boolean 0 Compile and include the rdma backend.
DUMMY boolean 1 Compile and include the dummy backend.
VCL boolean 1 Compile with the vector class library (Used to speedup quantization on the CPU)
TIMEOUTS boolean 1 Compile with timeouts and retransmissions support.
BUILDDIR path dev_root/build Where to store generated objects/include files/libraries/binaries...etc.
GRPC_HOME path dev_root/third_party/grpc/build Where to look for the GRPC installation
DPDK_HOME path dev_root/third_party/dpdk/build Where to look for the DPDK installation
DPDK_SDK path dev_root/third_party/dpdk Where to look for the DPDK SDK
VCL_HOME path dev_root/third_party/vcl Where to look for the VCL headers

3. Using the library

Important Before trying to use the library's API directly in your project, take a look at our Frameworks Integration directory to see if you can simply use one of the provided methods to integrate SwitchML into your DNN software stack.

What follows is intended to give you a high level overview of what needs to be done. For a more detailed step by step guide look at the examples

After building the library and getting a copy of the include files, you can now use SwitchML in your project to perform collective communication. Follow these simple steps:

  1. Edit your program
    1. Include the context.h file in your program.
    2. Call switchml::Context::GetInstance() to retrieve the singleton instance of the Context class.
    3. Call the Start() method of the context to start the SwitchML context.
    4. Use the API provided through the context instance reference.
    5. Call the Stop() method of the context to stop and cleanup the context.
  2. Compile your program
    1. Add the following to your compiler arguments
      1. -I path_to_includes
      2. -L path_to_library
      3. -l switchml_client
  3. Configure the SwitchML clients
    1. Before you can run your program you need to edit the configuration file that was generated after you built the library.
    2. After editing the switchml.cfg configuration file, copy it to where your program binary is.
  4. Run your program

Notes:

  • You can choose to create a Config object programmatically, edit its members, and pass it to the context as a parameter of the Start() method, instead of using the switchml.cfg file.
  • For information on how to setup the switch, look at the P4 and controller documentation.