Go Bindings
To facilitate the use of vAccel, we provide bindings for popular languages,
apart from C
. Essentially, the vAccel C
API can be called from any language
that interacts with C
libraries. Building on this, we are thrilled to present
support for Go.
Essentially, the C
/Go
interaction is already pretty smooth, given the
native CGO
support available. We introduce v0.1 of the vAccel-go bindings,
pending a feature-full update in the coming months. In this post, we go
through the initial implementation details, as well as a hands-on tutorial on
how to write your first vAccel program in Go
!
Golang overview
The Go
Programming Language is designed for scalability,
making it suitable for cloud computing and large-scale servers.
Go enhances development speed and efficiency, since it compiles
quickly (compared to other languages), and provides a great
Standard Library, along with built-in concurrency tools. Golang
is also a cloud-native Programming Language. Information
about Go installation can be found here,
but there are also instructions on how to install Go
in the
vAccel-go bindings installation guide.
vAccel Go package
The vaccel package in Golang provides access to vAccel operations, which
can be used by the developers on their own Go
programs. The vaccel package uses
the native C
bindings in order to use the vAccel C
API. The following diagram
demonstrates the functionality of the vaccel package:
Installation Guide
vAccel Installation
First of all, a vAccel installation is required before proceeding to the next sections.
Build from source
In Ubuntu-based systems, you need to have the following packages to build vaccelrt:
1. cmake
2. build-essential
You can install them using the following command:
sudo apt-get install -y cmake build-essential
Get the source code for vaccelrt:
git clone https://github.com/nubificus/vaccel --recursive
Prepare the build directory:
cd vaccelrt
mkdir build
cd build
Building the core runtime library
# This sets the installation path to /usr/local, and the current build
# type to 'Release'. The other option is the 'Debug' build
cmake ../ -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_BUILD_TYPE=Release -DBUILD_EXAMPLES=ON -DBUILD_PLUGIN_EXEC=ON -DBUILD_PLUGIN_NOOP=ON
make
sudo make install
vAccel-Go Bindings Installation
Go Installation
Of course, prior to installing the bindings, we have to make sure that Golang 1.20 or newer is installed in our system. We can check this using the following command:
go version
Otherwise, go 1.20
needs to be installed. You can find instructions on how to install Go here.
Build the Bindings from source
Download the source code:
git clone https://github.com/nubificus/go-vaccel.git
First, you can build the examples:
# Set vaccel location
export PKG_CONFIG_PATH=/usr/local/share/
cd go-vaccel
make all
Now you have successfully built some vaccel programs using Go. The executables are located in go-vaccel/bin. You can run the noop
example:
export VACCEL_BACKENDS=/usr/local/lib/libvaccel-noop.so
./bin/noop
Or the exec
example, providing a path for the shared object and an integer:
export VACCEL_BACKENDS=/usr/local/lib/libvaccel-exec.so
./bin/exec /usr/local/lib/libmytestlib.so 100
# if everything go as expected, the
# plugin will probably double the integer
Tutorial
The following example demonstrates the usage of the vaccel
package to build vaccel-enabled Go
programs. The tutorial will perform an image classification operation, using the no-op plugin.
Keep in mind the following three conditions before building:
1. Make sure to import the package in your programs:
import "github.com/nubificus/go-vaccel/vaccel"
2. Define vaccel
location:
export PKG_CONFIG_PATH=/usr/local/share
3. And finally, always define the location of the vaccel-plugin
you are willing to use:
# In case of No-Op for testing:
export VACCEL_BACKENDS=/usr/local/lib/libvaccel-noop.so
Example
Create the project directory
cd ~
mkdir go-vaccel-test
cd go-vaccel-test
Initialize the Module
go mod init go-vaccel-test
Download the bindings
go get github.com/nubificus/go-vaccel
And create a Go
file
touch main.go
Add the following lines to perform Image Classification
package main
import (
"fmt"
"os"
"github.com/nubificus/go-vaccel/vaccel"
)
func main() {
if len(os.Args) < 2 {
fmt.Println("Usage: ./main <filename>")
return
}
/* Get the filename from command line argument */
filePath := os.Args[1]
/* Session */
var session vaccel.Session
err := vaccel.SessionInit(&session, 0)
if err != 0 {
fmt.Println("error initializing session")
os.Exit(err)
}
var outText string
/* Read the image-bytes */
imageBytes, e := os.ReadFile(filePath)
if e != nil {
fmt.Printf("Error reading file: %s\n", e)
os.Exit(1)
}
/* Perform Image Classification */
outText, err = vaccel.ImageClassification(&session, imageBytes)
if err != 0 {
fmt.Println("Image Classification failed")
os.Exit(err)
}
fmt.Println("Output: ", outText)
/* Free Session */
if vaccel.SessionFree(&session) != 0 {
fmt.Println("An error occurred while freeing the session")
}
}
Then, specify vaccel location:
export PKG_CONFIG_PATH=/usr/local/share
Define the location of the plugin:
export VACCEL_BACKENDS=/usr/local/lib/libvaccel-noop.so
Build the source file:
go build main.go
And run:
./main </path/to/image>
You must see the following message:
[noop] Calling Image classification for session 1
[noop] Dumping arguments for Image classification:
[noop] len_img: <numBytes>
[noop] will return a dummy result
Output: This is a dummy classification tag!
Conclusion
The above example shows how to use the vaccel
package in Go
to use various vaccel features. As you can see, the example doesn't run an actual image classification operation, since we use the no-op plugin for testing purposes. However, we could use a vaccel backend that performs the operation. Here, you can find more vaccel tools and operations that you could possibly use in your Go
programs. For example, except image classification, you can write programs that use the exec plugin, which gives you the opportunity to use functions contained in a shared object. Or, finally, you could also use the noop
example if you just want to test the installation of the package.