[v9,18/34] ml/cnxk: support config and close of tvmdp library

Message ID 20231026124347.22477-19-syalavarthi@marvell.com (mailing list archive)
State Accepted, archived
Delegated to: Jerin Jacob
Headers
Series Implementation of revised ml/cnxk driver |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Srikanth Yalavarthi Oct. 26, 2023, 12:43 p.m. UTC
  Added support to configure and close TVMDP library based
on ML device configuration options.

Updated meson build to enable Jansson, TVM runtime, TVMDP
library as build dependencies.

Signed-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>
---
 config/arm/arm64_cn10k_linux_gcc |   1 +
 config/arm/arm64_cn9k_linux_gcc  |   1 +
 doc/guides/mldevs/cnxk.rst       | 169 +++++++++++++++++++++++++++++++
 drivers/ml/cnxk/cnxk_ml_ops.c    |   7 ++
 drivers/ml/cnxk/cnxk_ml_ops.h    |   6 ++
 drivers/ml/cnxk/meson.build      |  58 +++++++++++
 drivers/ml/cnxk/mvtvm_ml_ops.c   |  41 ++++++++
 drivers/ml/cnxk/mvtvm_ml_ops.h   |  19 ++++
 drivers/ml/cnxk/mvtvm_ml_stubs.c |  26 +++++
 drivers/ml/cnxk/mvtvm_ml_stubs.h |  15 +++
 10 files changed, 343 insertions(+)
 create mode 100644 drivers/ml/cnxk/mvtvm_ml_ops.c
 create mode 100644 drivers/ml/cnxk/mvtvm_ml_ops.h
 create mode 100644 drivers/ml/cnxk/mvtvm_ml_stubs.c
 create mode 100644 drivers/ml/cnxk/mvtvm_ml_stubs.h
  

Patch

diff --git a/config/arm/arm64_cn10k_linux_gcc b/config/arm/arm64_cn10k_linux_gcc
index 05d2d64cf2..fa904af5d0 100644
--- a/config/arm/arm64_cn10k_linux_gcc
+++ b/config/arm/arm64_cn10k_linux_gcc
@@ -5,6 +5,7 @@  ar = 'aarch64-linux-gnu-gcc-ar'
 strip = 'aarch64-linux-gnu-strip'
 pkgconfig = 'aarch64-linux-gnu-pkg-config'
 pcap-config = ''
+cmake = 'cmake'
 
 [host_machine]
 system = 'linux'
diff --git a/config/arm/arm64_cn9k_linux_gcc b/config/arm/arm64_cn9k_linux_gcc
index 7416454de0..646ce4b5d3 100644
--- a/config/arm/arm64_cn9k_linux_gcc
+++ b/config/arm/arm64_cn9k_linux_gcc
@@ -5,6 +5,7 @@  ar = 'aarch64-linux-gnu-gcc-ar'
 strip = 'aarch64-linux-gnu-strip'
 pkgconfig = 'aarch64-linux-gnu-pkg-config'
 pcap-config = ''
+cmake = 'cmake'
 
 [host_machine]
 system = 'linux'
diff --git a/doc/guides/mldevs/cnxk.rst b/doc/guides/mldevs/cnxk.rst
index 1834b1f905..a4d8903896 100644
--- a/doc/guides/mldevs/cnxk.rst
+++ b/doc/guides/mldevs/cnxk.rst
@@ -46,6 +46,175 @@  or cross-compiled on an x86 platform.
 
 Refer to :doc:`../platform/cnxk` for instructions to build your DPDK application.
 
+Compilation Prerequisites
+-------------------------
+
+This driver requires external libraries to optionally enable support for
+models compiled using Apache TVM framework. The following dependencies are
+not part of DPDK and must be installed separately:
+
+- **Jansson**
+
+  This library enables support to parse and read JSON files.
+
+- **DLPack**
+
+  This library provides headers for open in-memory tensor structures.
+
+.. note::
+
+    DPDK CNXK ML driver requires DLPack version 0.7
+
+.. code-block:: console
+
+    git clone https://github.com/dmlc/dlpack.git
+    cd dlpack
+    git checkout v0.7 -b v0.7
+    cmake -S ./ -B build \
+      -DCMAKE_INSTALL_PREFIX=<install_prefix> \
+      -DBUILD_MOCK=OFF
+    make -C build
+    make -C build install
+
+*Cross-compiling for AArch64*
+
+.. code-block:: console
+
+    git clone https://github.com/dmlc/dlpack.git
+    cd dlpack
+    git checkout v0.7 -b v0.7
+    cmake -S ./ -B build \
+      -DCMAKE_INSTALL_PREFIX=<install_prefix>
+      -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
+      -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
+      -DBUILD_MOCK=OFF
+    make -C build
+    make -C build install
+
+- **DMLC**
+
+  This is a common bricks library for building scalable and portable distributed
+  machine learning.
+
+.. code-block:: console
+
+    git clone https://github.com/dmlc/dmlc-core.git
+    cd dmlc-core
+    git checkout main
+    cmake -S ./ -B build \
+      -DCMAKE_INSTALL_PREFIX=<install_prefix> \
+      -DCMAKE_C_FLAGS="-fpermissive" \
+      -DCMAKE_CXX_FLAGS="-fpermissive" \
+      -DUSE_OPENMP=OFF
+    make -C build
+    make -C build install
+
+*Cross-compiling for AArch64*
+
+.. code-block:: console
+
+    git clone https://github.com/dmlc/dmlc-core.git
+    cd dmlc-core
+    git checkout main
+    cmake -S ./ -B build \
+      -DCMAKE_INSTALL_PREFIX=<install_prefix> \
+      -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
+      -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
+      -DCMAKE_C_FLAGS="-fpermissive" \
+      -DCMAKE_CXX_FLAGS="-fpermissive" \
+      -DUSE_OPENMP=OFF
+    make -C build
+    make -C build install
+
+- **TVM**
+
+  Apache TVM provides a runtime libraries used to execute models on CPU cores
+  or hardware accelerators.
+
+.. note::
+
+    DPDK CNXK ML driver requires TVM version 0.10.0
+
+.. code-block:: console
+
+    git clone https://github.com/apache/tvm.git
+    cd tvm
+    git checkout v0.11.0 -b v0.11.0
+    git submodule update --init
+    cmake -S ./ -B build \
+      -DCMAKE_INSTALL_PREFIX=<install_prefix> \
+      -DBUILD_STATIC_RUNTIME=OFF
+    make -C build
+    make -C build install
+
+*Cross-compiling for AArch64*
+
+.. code-block:: console
+
+    git clone https://github.com/apache/tvm.git
+    cd tvm
+    git checkout v0.11.0 -b v0.11.0
+    git submodule update --init
+    cmake -S ./ -B build \
+      -DCMAKE_INSTALL_PREFIX=<install_prefix> \
+      -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
+      -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
+      -DMACHINE_NAME=aarch64-linux-gnu \
+      -DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
+      -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
+      -DBUILD_STATIC_RUNTIME=OFF
+    make -C build
+    make -C build install
+
+- **TVMDP**
+
+  Marvell's `TVM Dataplane Library <https://github.com/MarvellEmbeddedProcessors/tvmdp>`_
+  works as an interface between TVM runtime and DPDK drivers. TVMDP library
+  provides a simplified C interface for TVM's runtime based on C++.
+
+.. note::
+
+    TVMDP library is dependent on TVM, dlpack, jansson and dmlc-core libraries.
+
+.. code-block:: console
+
+    git clone https://github.com/MarvellEmbeddedProcessors/tvmdp.git
+    cd tvmdp
+    git checkout main
+    cmake -S ./ -B build \
+      -DCMAKE_INSTALL_PREFIX=<install_prefix> \
+      -DBUILD_SHARED_LIBS=ON
+    make -C build
+    make -C build install
+
+*Cross-compiling for AArch64*
+
+.. code-block:: console
+
+    git clone https://github.com/MarvellEmbeddedProcessors/tvmdp.git
+    cd tvmdp
+    git checkout main
+    cmake -S ./ -B build \
+      -DCMAKE_INSTALL_PREFIX=<install_prefix> \
+      -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc \
+      -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
+      -DCMAKE_FIND_ROOT_PATH=<install_prefix> \
+      -DBUILD_SHARED_LIBS=ON
+    make -C build
+    make -C build install
+
+- **libarchive**
+
+  Apached TVM framework generates compiled models as tar archives. This
+  library enables support to decompress and read archive files in tar,
+  xz and other formats.
+
+.. note::
+
+    In order for meson to find the dependencies during the configure stage,
+    it is required to add the cmake paths <install_prefix>/lib/cmake/dlpack,
+    <install_prefix>/lib/cmake/dmlc and <install_prefix>/lib/cmake/tvm to
+    CMAKE_PREFIX_PATH and <install_prefix>/lib/pkgconfig to PKG_CONFIG_PATH.
 
 Initialization
 --------------
diff --git a/drivers/ml/cnxk/cnxk_ml_ops.c b/drivers/ml/cnxk/cnxk_ml_ops.c
index 3d21a31374..33d13d5514 100644
--- a/drivers/ml/cnxk/cnxk_ml_ops.c
+++ b/drivers/ml/cnxk/cnxk_ml_ops.c
@@ -564,6 +564,10 @@  cnxk_ml_dev_configure(struct rte_ml_dev *dev, const struct rte_ml_dev_config *co
 		goto error;
 	}
 
+	ret = mvtvm_ml_dev_configure(cnxk_mldev, conf);
+	if (ret != 0)
+		goto error;
+
 	/* Set device capabilities */
 	cnxk_mldev->max_nb_layers =
 		cnxk_mldev->cn10k_mldev.fw.req->cn10k_req.jd.fw_load.cap.s.max_models;
@@ -624,6 +628,9 @@  cnxk_ml_dev_close(struct rte_ml_dev *dev)
 	/* Un-initialize xstats */
 	cnxk_ml_xstats_uninit(cnxk_mldev);
 
+	if (mvtvm_ml_dev_close(cnxk_mldev) != 0)
+		plt_err("Failed to close MVTVM ML Device");
+
 	if (cn10k_ml_dev_close(cnxk_mldev) != 0)
 		plt_err("Failed to close CN10K ML Device");
 
diff --git a/drivers/ml/cnxk/cnxk_ml_ops.h b/drivers/ml/cnxk/cnxk_ml_ops.h
index d0c126f34b..b22a2b0d95 100644
--- a/drivers/ml/cnxk/cnxk_ml_ops.h
+++ b/drivers/ml/cnxk/cnxk_ml_ops.h
@@ -12,6 +12,12 @@ 
 
 #include "cn10k_ml_ops.h"
 
+#ifdef RTE_MLDEV_CNXK_ENABLE_MVTVM
+#include "mvtvm_ml_ops.h"
+#else
+#include "mvtvm_ml_stubs.h"
+#endif
+
 /* Request structure */
 struct cnxk_ml_req {
 	/* Device specific request */
diff --git a/drivers/ml/cnxk/meson.build b/drivers/ml/cnxk/meson.build
index 5d27a87d91..1ef2b3c335 100644
--- a/drivers/ml/cnxk/meson.build
+++ b/drivers/ml/cnxk/meson.build
@@ -7,6 +7,37 @@  if not is_linux or not dpdk_conf.get('RTE_ARCH_64')
     subdir_done()
 endif
 
+enable_mvtvm = true
+
+if not jansson_dep.found()
+        message('drivers/ml/cnxk: jansson not found')
+        enable_mvtvm = false
+endif
+
+dlpack_dep = dependency('dlpack', method: 'cmake', required: false, cmake_args: 'CONFIG')
+if not dlpack_dep.found()
+        message('drivers/ml/cnxk: dlpack not found')
+        enable_mvtvm = false
+endif
+
+dmlc_dep = dependency('dmlc', method: 'cmake', required: false, cmake_args: 'CONFIG')
+if not dmlc_dep.found()
+        message('drivers/ml/cnxk: dmlc not found')
+        enable_mvtvm = false
+endif
+
+tvm_dep = dependency('tvm', method: 'cmake', required: false, cmake_args: 'CONFIG', modules : ['tvm::tvm_runtime'])
+if not tvm_dep.found()
+        message('drivers/ml/cnxk: tvm_runtime not found')
+        enable_mvtvm = false
+endif
+
+tvmdp_dep = dependency('tvmdp', method: 'pkg-config', required: false)
+if not tvmdp_dep.found()
+        message('drivers/ml/cnxk: tvmdp not found')
+        enable_mvtvm = false
+endif
+
 sources = files(
         'cn10k_ml_dev.c',
         'cn10k_ml_ops.c',
@@ -21,6 +52,33 @@  sources = files(
 
 deps += ['mldev', 'common_cnxk', 'kvargs', 'hash']
 
+if enable_mvtvm
+
+dpdk_conf.set('RTE_MLDEV_CNXK_ENABLE_MVTVM', 1)
+
+sources += files(
+        'mvtvm_ml_ops.c',
+)
+
+ext_deps += jansson_dep
+ext_deps += dlpack_dep
+ext_deps += dmlc_dep
+ext_deps += tvm_dep
+ext_deps += tvmdp_dep
+ext_deps += cc.find_library('stdc++', required: true)
+
+deps += ['bus_vdev']
+
+message('drivers/ml/cnxk: Enabled TVM model support')
+else
+message('drivers/ml/cnxk: Disabled TVM model support')
+
+sources += files(
+        'mvtvm_ml_stubs.c',
+)
+
+endif
+
 require_iova_in_mbuf = false
 
 if get_option('buildtype').contains('debug')
diff --git a/drivers/ml/cnxk/mvtvm_ml_ops.c b/drivers/ml/cnxk/mvtvm_ml_ops.c
new file mode 100644
index 0000000000..88c6d5a864
--- /dev/null
+++ b/drivers/ml/cnxk/mvtvm_ml_ops.c
@@ -0,0 +1,41 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Marvell.
+ */
+
+#include <rte_common.h>
+#include <rte_cycles.h>
+#include <rte_mldev.h>
+#include <rte_mldev_pmd.h>
+
+#include "cnxk_ml_dev.h"
+#include "cnxk_ml_ops.h"
+
+int
+mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf)
+{
+	int ret;
+
+	RTE_SET_USED(conf);
+
+	/* Configure TVMDP library */
+	ret = tvmdp_configure(cnxk_mldev->mldev->data->nb_models, rte_get_tsc_cycles);
+	if (ret != 0)
+		plt_err("TVMDP configuration failed, error = %d\n", ret);
+
+	return ret;
+}
+
+int
+mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev)
+{
+	int ret;
+
+	RTE_SET_USED(cnxk_mldev);
+
+	/* Close TVMDP library configuration */
+	ret = tvmdp_close();
+	if (ret != 0)
+		plt_err("TVMDP close failed, error = %d\n", ret);
+
+	return ret;
+}
diff --git a/drivers/ml/cnxk/mvtvm_ml_ops.h b/drivers/ml/cnxk/mvtvm_ml_ops.h
new file mode 100644
index 0000000000..305b4681ed
--- /dev/null
+++ b/drivers/ml/cnxk/mvtvm_ml_ops.h
@@ -0,0 +1,19 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Marvell.
+ */
+
+#ifndef _MVTVM_ML_OPS_H_
+#define _MVTVM_ML_OPS_H_
+
+#include <dlpack/dlpack.h>
+
+#include <tvmdp.h>
+
+#include <rte_mldev.h>
+
+struct cnxk_ml_dev;
+
+int mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf);
+int mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev);
+
+#endif /* _MVTVM_ML_OPS_H_ */
diff --git a/drivers/ml/cnxk/mvtvm_ml_stubs.c b/drivers/ml/cnxk/mvtvm_ml_stubs.c
new file mode 100644
index 0000000000..a31cd39cfa
--- /dev/null
+++ b/drivers/ml/cnxk/mvtvm_ml_stubs.c
@@ -0,0 +1,26 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Marvell.
+ */
+
+#include <rte_mldev.h>
+
+#include "mvtvm_ml_stubs.h"
+
+#include "cnxk_ml_dev.h"
+
+int
+mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf)
+{
+	RTE_SET_USED(cnxk_mldev);
+	RTE_SET_USED(conf);
+
+	return 0;
+}
+
+int
+mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev)
+{
+	RTE_SET_USED(cnxk_mldev);
+
+	return 0;
+}
diff --git a/drivers/ml/cnxk/mvtvm_ml_stubs.h b/drivers/ml/cnxk/mvtvm_ml_stubs.h
new file mode 100644
index 0000000000..11c56e5144
--- /dev/null
+++ b/drivers/ml/cnxk/mvtvm_ml_stubs.h
@@ -0,0 +1,15 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2023 Marvell.
+ */
+
+#ifndef _MVTVM_ML_STUBS_H_
+#define _MVTVM_ML_STUBS_H_
+
+#include <rte_mldev.h>
+
+struct cnxk_ml_dev;
+
+int mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf);
+int mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev);
+
+#endif /* _MVTVM_ML_STUBS_H_ */