Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,4 @@ PYTHON_VACCEL_PLUGIN=./libs/vaccelrt/build/plugins/noop/libvaccel-noop.so LD_LIB

# Test coverage
PYTHON_VACCEL_PLUGIN=./libs/vaccelrt/build/plugins/noop/libvaccel-noop.so LD_LIBRARY_PATH=./libs/install/lib PYTHONPATH=$PYTHONPATH:. pytest --cov=vaccel tests/
```
```
73 changes: 44 additions & 29 deletions builder.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
from cffi import FFI
import pathlib
import os


ffibuilder = FFI()

ffibuilder.set_source(
"vaccel._vaccel",
r"""
"vaccel._vaccel",
r"""
#include <session.h>
#include <tf_model.h>
#include <ops/tf.h>
#include <ops/noop.h>
#include <ops/genop.h>
#include <ops/image.h>
#include <resources/tf_saved_model.h>
#include <plugin.h>
""",
libraries=['vaccel-python', 'dl'],
libraries=['vaccel-python', 'dl'],
)

# Session API
Expand All @@ -40,7 +40,7 @@
struct vaccel_resource *resource
);
"""
)
)


# TensorFlow model
Expand All @@ -51,13 +51,19 @@
...;
};

struct vaccel_tf_saved_model {
struct vaccel_resource *resource;
...;
};

int vaccel_tf_model_new(struct vaccel_tf_model *model, const char *path);
int vaccel_tf_model_new_from_buffer(struct vaccel_tf_model *model,
const uint8_t *buff, size_t size);
int vaccel_tf_model_destroy(struct vaccel_tf_model *model);
int vaccel_tf_saved_model_destroy(struct vaccel_tf_saved_model *model);
vaccel_id_t vaccel_tf_model_get_id(const struct vaccel_tf_model *model);
"""
)
)

# TensorFlow inference
ffibuilder.cdef("""
Expand Down Expand Up @@ -117,6 +123,7 @@

/* Data type */
enum vaccel_tf_data_type data_type;
...;
};

struct vaccel_tf_status {
Expand All @@ -127,21 +134,29 @@
const char *message;
};

int vaccel_tf_saved_model_set_path(
struct vaccel_tf_saved_model *model,
const char *path
);


int vaccel_tf_session_load(
struct vaccel_session *session,
struct vaccel_tf_saved_model *model,
struct vaccel_tf_status *status
);

int vaccel_tf_saved_model_register(struct vaccel_tf_saved_model *model);

int vaccel_tf_session_run(
struct vaccel_session *session,
const struct vaccel_tf_saved_model *model, const struct vaccel_tf_buffer *run_options,
const struct vaccel_tf_node *in_nodes, struct vaccel_tf_tensor *const *in, int nr_inputs,
const struct vaccel_tf_node *in_nodes, struct vaccel_tf_tensor *const*in, int nr_inputs,
const struct vaccel_tf_node *out_nodes, struct vaccel_tf_tensor **out, int nr_outputs,
struct vaccel_tf_status *status
);
"""
)
)

# Plugin system
ffibuilder.cdef("""
Expand All @@ -153,62 +168,62 @@
int register_plugin_function(struct vaccel_op *plugin_op);
int register_plugin_functions(struct vaccel_op *plugin_ops, size_t nr_ops);
"""
)
)

# Noop API
ffibuilder.cdef("""
int vaccel_noop(struct vaccel_session *sess);
"""
)
)

# Genop API
ffibuilder.cdef("""
struct vaccel_arg {
uint32_t size;
void *buf;
};"""
)
)

ffibuilder.cdef("""
int vaccel_genop(struct vaccel_session *sess, struct vaccel_arg *read,
int nr_read, struct vaccel_arg *write, int nr_write);"""
)
int nr_read, struct vaccel_arg *write, int nr_write);"""
)

# Image API
ffibuilder.cdef("""
int vaccel_image_classification(struct vaccel_session *sess, const void *img,
unsigned char *out_text, unsigned char *out_imgname,
size_t len_img, size_t len_out_text, size_t len_out_imgname);
unsigned char *out_text, unsigned char *out_imgname,
size_t len_img, size_t len_out_text, size_t len_out_imgname);
"""
)
)

ffibuilder.cdef("""
int vaccel_image_detection(struct vaccel_session *sess, const void *img,
unsigned char *out_imgname, size_t len_img,
size_t len_out_imgname);
unsigned char *out_imgname, size_t len_img,
size_t len_out_imgname);
"""
)
)

ffibuilder.cdef("""
int vaccel_image_segmentation(struct vaccel_session *sess, const void *img,
unsigned char *out_imgname, size_t len_img,
size_t len_out_imgname);
unsigned char *out_imgname, size_t len_img,
size_t len_out_imgname);
"""
)
)

ffibuilder.cdef("""
int vaccel_image_pose(struct vaccel_session *sess, const void *img,
unsigned char *out_imgname, size_t len_img,
size_t len_out_imgname);
unsigned char *out_imgname, size_t len_img,
size_t len_out_imgname);
"""
)
)

ffibuilder.cdef("""
int vaccel_image_depth(struct vaccel_session *sess, const void *img,
unsigned char *out_imgname, size_t len_img,
size_t len_out_imgname);
unsigned char *out_imgname, size_t len_img,
size_t len_out_imgname);
"""
)
)

if __name__ == "__main__":
ffibuilder.compile(verbose=True)
21 changes: 10 additions & 11 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
from setuptools import setup, find_packages
from platform import uname
from datestamp import stamp
from cmake_build_extension import BuildExtension, CMakeExtension

package = 'vaccel'
platform = uname()

if platform.system != 'Linux':
_ = f'"(package.title())" only supported to run on Linux'
_ = f'"{package.title()}" only supported to run on Linux'
raise RuntimeError(_)

setup(name = 'vaccel',
url = 'https://github.com/nubificus/python-vaccel',
author = 'Nubificus Ltd.',
version = stamp(package),
packages = find_packages(),
description = ('Python bindings with CFFI for libvaccel'),
install_requires = ["cffi>=1.0.0"],
cffi_modules = ["builder.py:ffibuilder"],
)
setup(name='vaccel',
url='https://github.com/nubificus/python-vaccel',
author='Nubificus Ltd.',
version=stamp(package),
packages=find_packages(),
description=('Python bindings with CFFI for libvaccel'),
install_requires=["cffi>=1.0.0"],
cffi_modules=["builder.py:ffibuilder"],
)
15 changes: 2 additions & 13 deletions tests/test_general.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,14 @@
from vaccel.session import Session
from vaccel.noop import Noop
from vaccel.genop import Genop, VaccelArg


def test_session():
ses_a = Session(flags=0)
ses_b = Session(flags=1)
assert ses_a.id() != ses_b.id()


def test_noop():
ses = Session(flags=0)
res = Noop.noop(ses)
assert res == 0

##def test_genop():
# """
# should work, but it doesn't because the sanity check on vAccel
# regarding the number of arguments is not correct
# """
# ses = Session(flags=1)
# arg_read = []
# arg_read.append(VaccelArg(data=0))
# arg_write = []
# res = Genop.genop(ses, arg_read, arg_write)
# assert res == 22 #should this be 22?
32 changes: 17 additions & 15 deletions tests/test_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,32 @@

imgsource = "/usr/local/share/images/example.jpg"


def test_image_classify():
ses = Session(flags=3)
res = ImageClassify.classify_from_filename(session=ses, source=imgsource)
assert res == "This is a dummy classification tag!"
ses = Session(flags=3)
res = ImageClassify.classify_from_filename(session=ses, source=imgsource)
assert res == "This is a dummy classification tag!"


def test_image_detect():
ses = Session(flags=3)
res = ImageDetect.detect_from_filename(session=ses, source=imgsource)
assert res == 0
ses = Session(flags=3)
res = ImageDetect.detect_from_filename(session=ses, source=imgsource)
assert res == 0


def test_image_segment():
ses = Session(flags=3)
res = ImageSegment.segment_from_filename(session=ses, source=imgsource)
assert res == 0
ses = Session(flags=3)
res = ImageSegment.segment_from_filename(session=ses, source=imgsource)
assert res == 0


def test_image_pose():
ses = Session(flags=3)
res = ImagePose.pose_from_filename(session=ses, source=imgsource)
assert res == 0 # is this supposed to be 95?
ses = Session(flags=3)
res = ImagePose.pose_from_filename(session=ses, source=imgsource)
assert res == 0


def test_image_depth():
ses = Session(flags=3)
res = ImageDepth.depth_from_filename(session=ses, source=imgsource)
assert res == 0 # is this supposed to be 95?
ses = Session(flags=3)
res = ImageDepth.depth_from_filename(session=ses, source=imgsource)
assert res == 0
6 changes: 5 additions & 1 deletion tests/test_image_genop.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,28 @@

imgsource = "/usr/local/share/images/example.jpg"


def test_image_class_genop():
res = genimg.ImageClassify.classify(image=imgsource)
assert res == ("This is a dummy classification tag!")


def test_image_detect_genop():
res = genimg.ImageDetect.detect(image=imgsource)
assert res == ("")


def test_image_segme_genop():
res = genimg.ImageSegment.segment(image=imgsource)
assert res == ("")


def test_image_pose_genop():
res = genimg.ImagePose.pose(image=imgsource)
print(res)
assert res == ("")


def test_image_depth_genop():
res = genimg.ImageDepth.depth(image=imgsource)
assert res == ("")

37 changes: 37 additions & 0 deletions tests/test_tf.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from vaccel.session import Session
from vaccel.tensorflow import Tensor, TensorType, Node, TensorFlowModel


def test_tf():
session = Session(flags=0)
a = TensorFlowModel()

a.model_set_path("/usr/local/share/models/tf/lstm2")
a.model_register()
session.register_resource(a)
a.from_session(session, "/usr/local/share/models/tf/lstm2")

nname = "serving_default_input_1"
nid = 0
n1 = Node(nname, nid)
in_nodes = [n1]

nname = "StatefulPartitionedCall"
nid = 0
n2 = Node(nname, nid)
out_nodes = [n2]

t = Tensor([1, 30], TensorType.FLOAT)
t.data = [1.0] * 30
t.dims = [1, 30]

in_tensors = [t] # int64_t dims[] = {1, 30};

out = a.run(session, in_nodes, in_tensors, out_nodes)
for t in out:
print(t.__str__())

offset = t.data
print(offset)

session.unregister_resource(a)
4 changes: 3 additions & 1 deletion vaccel/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
__version__ = '2022.11.2'
__vaccel__ = '0.1.0'

import os, sys, ctypes
import os
import sys
import ctypes

flags = sys.getdlopenflags()

Expand Down
Loading