Added cython bindings for model runners and commonmodel (#29607)
* Added cython bindings for model runners and commonmodel * Removed cython language_level=3 * loop to set CXXFLAGS for both envspull/29618/head
parent
8205590624
commit
e2e39d100b
16 changed files with 232 additions and 3 deletions
@ -0,0 +1,23 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
|
||||||
|
from cereal.visionipc.visionipc cimport cl_device_id, cl_context, cl_mem |
||||||
|
|
||||||
|
cdef extern from "common/mat.h": |
||||||
|
cdef struct mat3: |
||||||
|
float v[9] |
||||||
|
|
||||||
|
cdef extern from "common/clutil.h": |
||||||
|
cdef unsigned long CL_DEVICE_TYPE_DEFAULT |
||||||
|
cl_device_id cl_get_device_id(unsigned long) |
||||||
|
cl_context cl_create_context(cl_device_id) |
||||||
|
|
||||||
|
cdef extern from "selfdrive/modeld/models/commonmodel.h": |
||||||
|
cppclass ModelFrame: |
||||||
|
int buf_size |
||||||
|
ModelFrame(cl_device_id, cl_context) |
||||||
|
float * prepare(cl_mem, int, int, int, int, mat3, cl_mem*) |
||||||
|
|
||||||
|
cdef extern from "selfdrive/modeld/runners/runmodel.h": |
||||||
|
cdef int USE_CPU_RUNTIME |
||||||
|
cdef int USE_GPU_RUNTIME |
||||||
|
cdef int USE_DSP_RUNTIME |
@ -0,0 +1,13 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
|
||||||
|
from cereal.visionipc.visionipc cimport cl_mem |
||||||
|
from cereal.visionipc.visionipc_pyx cimport CLContext as BaseCLContext |
||||||
|
|
||||||
|
cdef class CLContext(BaseCLContext): |
||||||
|
pass |
||||||
|
|
||||||
|
cdef class CLMem: |
||||||
|
cdef cl_mem * mem; |
||||||
|
|
||||||
|
@staticmethod |
||||||
|
cdef create(void*) |
@ -0,0 +1,46 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
# cython: c_string_encoding=ascii |
||||||
|
|
||||||
|
import numpy as np |
||||||
|
cimport numpy as cnp |
||||||
|
from libc.string cimport memcpy |
||||||
|
|
||||||
|
from cereal.visionipc.visionipc cimport cl_mem |
||||||
|
from cereal.visionipc.visionipc_pyx cimport VisionBuf, CLContext as BaseCLContext |
||||||
|
from .commonmodel cimport CL_DEVICE_TYPE_DEFAULT, cl_get_device_id, cl_create_context |
||||||
|
from .commonmodel cimport USE_CPU_RUNTIME, USE_GPU_RUNTIME, USE_DSP_RUNTIME |
||||||
|
from .commonmodel cimport mat3, ModelFrame as cppModelFrame |
||||||
|
|
||||||
|
class Runtime: |
||||||
|
CPU = USE_CPU_RUNTIME |
||||||
|
GPU = USE_GPU_RUNTIME |
||||||
|
DSP = USE_DSP_RUNTIME |
||||||
|
|
||||||
|
cdef class CLContext(BaseCLContext): |
||||||
|
def __cinit__(self): |
||||||
|
self.device_id = cl_get_device_id(CL_DEVICE_TYPE_DEFAULT) |
||||||
|
self.context = cl_create_context(self.device_id) |
||||||
|
|
||||||
|
cdef class CLMem: |
||||||
|
@staticmethod |
||||||
|
cdef create(void * cmem): |
||||||
|
mem = CLMem() |
||||||
|
mem.mem = <cl_mem*> cmem |
||||||
|
return mem |
||||||
|
|
||||||
|
cdef class ModelFrame: |
||||||
|
cdef cppModelFrame * frame |
||||||
|
|
||||||
|
def __cinit__(self, CLContext context): |
||||||
|
self.frame = new cppModelFrame(context.device_id, context.context) |
||||||
|
|
||||||
|
def __dealloc__(self): |
||||||
|
del self.frame |
||||||
|
|
||||||
|
def prepare(self, VisionBuf buf, float[:] projection, CLMem output): |
||||||
|
cdef mat3 cprojection |
||||||
|
memcpy(cprojection.v, &projection[0], 9*sizeof(float)) |
||||||
|
cdef float * data = self.frame.prepare(buf.buf.buf_cl, buf.width, buf.height, buf.stride, buf.uv_offset, cprojection, output.mem) |
||||||
|
if not data: |
||||||
|
return None |
||||||
|
return np.asarray(<cnp.float32_t[:self.frame.buf_size]> data) |
@ -0,0 +1,9 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
|
||||||
|
from libcpp.string cimport string |
||||||
|
|
||||||
|
from cereal.visionipc.visionipc cimport cl_context |
||||||
|
|
||||||
|
cdef extern from "selfdrive/modeld/runners/onnxmodel.h": |
||||||
|
cdef cppclass ONNXModel: |
||||||
|
ONNXModel(string, float*, size_t, int, bool, cl_context) |
@ -0,0 +1,14 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
# cython: c_string_encoding=ascii |
||||||
|
|
||||||
|
from libcpp cimport bool |
||||||
|
from libcpp.string cimport string |
||||||
|
|
||||||
|
from .onnxmodel cimport ONNXModel as cppONNXModel |
||||||
|
from selfdrive.modeld.models.commonmodel_pyx cimport CLContext |
||||||
|
from selfdrive.modeld.runners.runmodel_pyx cimport RunModel |
||||||
|
from selfdrive.modeld.runners.runmodel cimport RunModel as cppRunModel |
||||||
|
|
||||||
|
cdef class ONNXModel(RunModel): |
||||||
|
def __cinit__(self, string path, float[:] output, int runtime, bool use_tf8, CLContext context): |
||||||
|
self.model = <cppRunModel *> new cppONNXModel(path, &output[0], len(output), runtime, use_tf8, context.context) |
@ -0,0 +1,10 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
|
||||||
|
from libcpp.string cimport string |
||||||
|
|
||||||
|
cdef extern from "selfdrive/modeld/runners/runmodel.h": |
||||||
|
cdef cppclass RunModel: |
||||||
|
void addInput(string, float*, int) |
||||||
|
void setInputBuffer(string, float*, int) |
||||||
|
void * getCLBuffer(string) |
||||||
|
void execute() |
@ -0,0 +1,6 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
|
||||||
|
from .runmodel cimport RunModel as cppRunModel |
||||||
|
|
||||||
|
cdef class RunModel: |
||||||
|
cdef cppRunModel * model |
@ -0,0 +1,32 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
# cython: c_string_encoding=ascii |
||||||
|
|
||||||
|
from libcpp.string cimport string |
||||||
|
from libc.string cimport memcpy |
||||||
|
|
||||||
|
from selfdrive.modeld.models.commonmodel_pyx cimport CLMem |
||||||
|
|
||||||
|
cdef class RunModel: |
||||||
|
def __dealloc__(self): |
||||||
|
del self.model |
||||||
|
|
||||||
|
def addInput(self, string name, float[:] buffer): |
||||||
|
if buffer is not None: |
||||||
|
self.model.addInput(name, &buffer[0], len(buffer)) |
||||||
|
else: |
||||||
|
self.model.addInput(name, NULL, 0) |
||||||
|
|
||||||
|
def setInputBuffer(self, string name, float[:] buffer): |
||||||
|
if buffer is not None: |
||||||
|
self.model.setInputBuffer(name, &buffer[0], len(buffer)) |
||||||
|
else: |
||||||
|
self.model.setInputBuffer(name, NULL, 0) |
||||||
|
|
||||||
|
def getCLBuffer(self, string name): |
||||||
|
cdef void * cl_buf = self.model.getCLBuffer(name) |
||||||
|
if not cl_buf: |
||||||
|
return None |
||||||
|
return CLMem.create(cl_buf) |
||||||
|
|
||||||
|
def execute(self): |
||||||
|
self.model.execute() |
@ -0,0 +1,9 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
|
||||||
|
from libcpp.string cimport string |
||||||
|
|
||||||
|
from cereal.visionipc.visionipc cimport cl_context |
||||||
|
|
||||||
|
cdef extern from "selfdrive/modeld/runners/snpemodel.h": |
||||||
|
cdef cppclass SNPEModel: |
||||||
|
SNPEModel(string, float*, size_t, int, bool, cl_context) |
@ -0,0 +1,14 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
# cython: c_string_encoding=ascii |
||||||
|
|
||||||
|
from libcpp cimport bool |
||||||
|
from libcpp.string cimport string |
||||||
|
|
||||||
|
from .snpemodel cimport SNPEModel as cppSNPEModel |
||||||
|
from selfdrive.modeld.models.commonmodel_pyx cimport CLContext |
||||||
|
from selfdrive.modeld.runners.runmodel_pyx cimport RunModel |
||||||
|
from selfdrive.modeld.runners.runmodel cimport RunModel as cppRunModel |
||||||
|
|
||||||
|
cdef class SNPEModel(RunModel): |
||||||
|
def __cinit__(self, string path, float[:] output, int runtime, bool use_tf8, CLContext context): |
||||||
|
self.model = <cppRunModel *> new cppSNPEModel(path, &output[0], len(output), runtime, use_tf8, context.context) |
@ -0,0 +1,9 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
|
||||||
|
from libcpp.string cimport string |
||||||
|
|
||||||
|
from cereal.visionipc.visionipc cimport cl_context |
||||||
|
|
||||||
|
cdef extern from "selfdrive/modeld/runners/thneedmodel.h": |
||||||
|
cdef cppclass ThneedModel: |
||||||
|
ThneedModel(string, float*, size_t, int, bool, cl_context) |
@ -0,0 +1,14 @@ |
|||||||
|
# distutils: language = c++ |
||||||
|
# cython: c_string_encoding=ascii |
||||||
|
|
||||||
|
from libcpp cimport bool |
||||||
|
from libcpp.string cimport string |
||||||
|
|
||||||
|
from .thneedmodel cimport ThneedModel as cppThneedModel |
||||||
|
from selfdrive.modeld.models.commonmodel_pyx cimport CLContext |
||||||
|
from selfdrive.modeld.runners.runmodel_pyx cimport RunModel |
||||||
|
from selfdrive.modeld.runners.runmodel cimport RunModel as cppRunModel |
||||||
|
|
||||||
|
cdef class ThneedModel(RunModel): |
||||||
|
def __cinit__(self, string path, float[:] output, int runtime, bool use_tf8, CLContext context): |
||||||
|
self.model = <cppRunModel *> new cppThneedModel(path, &output[0], len(output), runtime, use_tf8, context.context) |
Loading…
Reference in new issue