[v5,23/34] ml/cnxk: update internal info for TVM model

Message ID 20231018064806.24145-24-syalavarthi@marvell.com (mailing list archive)
State Superseded, 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. 18, 2023, 6:47 a.m. UTC
  Enabled updating internal IO info structures for TVM model.
Compute static fields related to the model I/O.

Signed-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>
---
 drivers/ml/cnxk/cnxk_ml_ops.c    |   4 ++
 drivers/ml/cnxk/mvtvm_ml_model.c | 111 +++++++++++++++++++++++++++++++
 drivers/ml/cnxk/mvtvm_ml_model.h |   2 +
 drivers/ml/cnxk/mvtvm_ml_ops.c   |   3 +
 drivers/ml/cnxk/mvtvm_ml_stubs.c |   9 +++
 drivers/ml/cnxk/mvtvm_ml_stubs.h |   1 +
 6 files changed, 130 insertions(+)
  

Patch

diff --git a/drivers/ml/cnxk/cnxk_ml_ops.c b/drivers/ml/cnxk/cnxk_ml_ops.c
index b18271545d..90b23d9c1c 100644
--- a/drivers/ml/cnxk/cnxk_ml_ops.c
+++ b/drivers/ml/cnxk/cnxk_ml_ops.c
@@ -1244,6 +1244,8 @@  cnxk_ml_io_quantize(struct rte_ml_dev *dev, uint16_t model_id, struct rte_ml_buf
 
 	if (model->type == ML_CNXK_MODEL_TYPE_GLOW)
 		info = cn10k_ml_model_io_info_get(model, 0);
+	else
+		info = mvtvm_ml_model_io_info_get(model, 0);
 
 	if (info == NULL)
 		return -EINVAL;
@@ -1296,6 +1298,8 @@  cnxk_ml_io_dequantize(struct rte_ml_dev *dev, uint16_t model_id, struct rte_ml_b
 
 	if (model->type == ML_CNXK_MODEL_TYPE_GLOW)
 		info = cn10k_ml_model_io_info_get(model, model->nb_layers - 1);
+	else
+		info = mvtvm_ml_model_io_info_get(model, model->nb_layers - 1);
 
 	if (info == NULL)
 		return -EINVAL;
diff --git a/drivers/ml/cnxk/mvtvm_ml_model.c b/drivers/ml/cnxk/mvtvm_ml_model.c
index 8536fd8927..14f4b258d8 100644
--- a/drivers/ml/cnxk/mvtvm_ml_model.c
+++ b/drivers/ml/cnxk/mvtvm_ml_model.c
@@ -7,6 +7,8 @@ 
 
 #include <rte_mldev.h>
 
+#include <mldev_utils.h>
+
 #include <roc_api.h>
 
 #include "cnxk_ml_model.h"
@@ -135,3 +137,112 @@  mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name,
 
 	return 0;
 }
+
+static enum rte_ml_io_type
+mvtvm_ml_io_type_map(uint8_t type)
+{
+	switch (type) {
+	case kDLInt:
+		return RTE_ML_IO_TYPE_INT32;
+	case kDLUInt:
+		return RTE_ML_IO_TYPE_UINT32;
+	case kDLFloat:
+		return RTE_ML_IO_TYPE_FP32;
+	case kDLBfloat:
+		return RTE_ML_IO_TYPE_BFLOAT16;
+	}
+
+	return RTE_ML_IO_TYPE_UNKNOWN;
+}
+
+void
+mvtvm_ml_model_io_info_set(struct cnxk_ml_model *model)
+{
+	struct tvmdp_model_metadata *metadata;
+	int32_t i;
+	int32_t j;
+
+	if (model->subtype == ML_CNXK_MODEL_SUBTYPE_TVM_MRVL)
+		goto tvm_mrvl_model;
+
+	metadata = &model->mvtvm.metadata;
+
+	/* Inputs, set for layer_id = 0 */
+	model->mvtvm.info.nb_inputs = metadata->model.num_input;
+	model->mvtvm.info.total_input_sz_d = 0;
+	model->mvtvm.info.total_input_sz_q = 0;
+	for (i = 0; i < metadata->model.num_input; i++) {
+		strncpy(model->mvtvm.info.input[i].name, metadata->input[i].name,
+			TVMDP_NAME_STRLEN);
+		model->mvtvm.info.input[i].dtype =
+			mvtvm_ml_io_type_map(metadata->input[i].datatype.code);
+		model->mvtvm.info.input[i].qtype =
+			mvtvm_ml_io_type_map(metadata->input[i].model_datatype.code);
+		model->mvtvm.info.input[i].nb_dims = metadata->input[i].ndim;
+
+		model->mvtvm.info.input[i].nb_elements = 1;
+		for (j = 0; j < metadata->input[i].ndim; j++) {
+			model->mvtvm.info.input[i].shape[j] = metadata->input[i].shape[j];
+			model->mvtvm.info.input[i].nb_elements *= metadata->input[i].shape[j];
+		}
+
+		model->mvtvm.info.input[i].sz_d =
+			model->mvtvm.info.input[i].nb_elements *
+			rte_ml_io_type_size_get(model->mvtvm.info.input[i].dtype);
+		model->mvtvm.info.input[i].sz_q =
+			model->mvtvm.info.input[i].nb_elements *
+			rte_ml_io_type_size_get(model->mvtvm.info.input[i].qtype);
+
+		model->mvtvm.info.total_input_sz_d += model->mvtvm.info.input[i].sz_d;
+		model->mvtvm.info.total_input_sz_q += model->mvtvm.info.input[i].sz_q;
+
+		plt_ml_dbg("model_id = %u, input[%u] - sz_d = %u sz_q = %u", model->model_id, i,
+			   model->mvtvm.info.input[i].sz_d, model->mvtvm.info.input[i].sz_q);
+	}
+
+	/* Outputs, set for nb_layers - 1 */
+	model->mvtvm.info.nb_outputs = metadata->model.num_output;
+	model->mvtvm.info.total_output_sz_d = 0;
+	model->mvtvm.info.total_output_sz_q = 0;
+	for (i = 0; i < metadata->model.num_output; i++) {
+		strncpy(model->mvtvm.info.output[i].name, metadata->output[i].name,
+			TVMDP_NAME_STRLEN);
+		model->mvtvm.info.output[i].dtype =
+			mvtvm_ml_io_type_map(metadata->output[i].datatype.code);
+		model->mvtvm.info.output[i].qtype =
+			mvtvm_ml_io_type_map(metadata->output[i].model_datatype.code);
+		model->mvtvm.info.output[i].nb_dims = metadata->output[i].ndim;
+
+		model->mvtvm.info.output[i].nb_elements = 1;
+		for (j = 0; j < metadata->output[i].ndim; j++) {
+			model->mvtvm.info.output[i].shape[j] = metadata->output[i].shape[j];
+			model->mvtvm.info.output[i].nb_elements *= metadata->output[i].shape[j];
+		}
+
+		model->mvtvm.info.output[i].sz_d =
+			model->mvtvm.info.output[i].nb_elements *
+			rte_ml_io_type_size_get(model->mvtvm.info.output[i].dtype);
+		model->mvtvm.info.output[i].sz_q =
+			model->mvtvm.info.output[i].nb_elements *
+			rte_ml_io_type_size_get(model->mvtvm.info.output[i].qtype);
+
+		model->mvtvm.info.total_output_sz_d += model->mvtvm.info.output[i].sz_d;
+		model->mvtvm.info.total_output_sz_q += model->mvtvm.info.output[i].sz_q;
+
+		plt_ml_dbg("model_id = %u, output[%u] - sz_d = %u sz_q = %u", model->model_id, i,
+			   model->mvtvm.info.output[i].sz_d, model->mvtvm.info.output[i].sz_q);
+	}
+
+	return;
+
+tvm_mrvl_model:
+	cn10k_ml_layer_io_info_set(&model->mvtvm.info, &model->layer[0].glow.metadata);
+}
+
+struct cnxk_ml_io_info *
+mvtvm_ml_model_io_info_get(struct cnxk_ml_model *model, uint16_t layer_id)
+{
+	RTE_SET_USED(layer_id);
+
+	return &model->mvtvm.info;
+}
diff --git a/drivers/ml/cnxk/mvtvm_ml_model.h b/drivers/ml/cnxk/mvtvm_ml_model.h
index 6cb2639876..e86581bc6a 100644
--- a/drivers/ml/cnxk/mvtvm_ml_model.h
+++ b/drivers/ml/cnxk/mvtvm_ml_model.h
@@ -50,5 +50,7 @@  int mvtvm_ml_model_blob_parse(struct rte_ml_model_params *params,
 			      struct mvtvm_ml_model_object *object);
 int mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name,
 				uint16_t *layer_id);
+void mvtvm_ml_model_io_info_set(struct cnxk_ml_model *model);
+struct cnxk_ml_io_info *mvtvm_ml_model_io_info_get(struct cnxk_ml_model *model, uint16_t layer_id);
 
 #endif /* _MVTVM_ML_MODEL_H_ */
diff --git a/drivers/ml/cnxk/mvtvm_ml_ops.c b/drivers/ml/cnxk/mvtvm_ml_ops.c
index 1fe0a04301..e248310cb3 100644
--- a/drivers/ml/cnxk/mvtvm_ml_ops.c
+++ b/drivers/ml/cnxk/mvtvm_ml_ops.c
@@ -175,6 +175,9 @@  mvtvm_ml_model_load(struct cnxk_ml_dev *cnxk_mldev, struct rte_ml_model_params *
 		goto error;
 	}
 
+	/* Update model I/O data */
+	mvtvm_ml_model_io_info_set(model);
+
 	return 0;
 
 error:
diff --git a/drivers/ml/cnxk/mvtvm_ml_stubs.c b/drivers/ml/cnxk/mvtvm_ml_stubs.c
index d621dbc897..80a9a90b4e 100644
--- a/drivers/ml/cnxk/mvtvm_ml_stubs.c
+++ b/drivers/ml/cnxk/mvtvm_ml_stubs.c
@@ -27,6 +27,15 @@  mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name,
 	return -EINVAL;
 }
 
+struct cnxk_ml_io_info *
+mvtvm_ml_model_io_info_get(struct cnxk_ml_model *model, uint16_t layer_id)
+{
+	RTE_SET_USED(model);
+	RTE_SET_USED(layer_id);
+
+	return NULL;
+}
+
 int
 mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf)
 {
diff --git a/drivers/ml/cnxk/mvtvm_ml_stubs.h b/drivers/ml/cnxk/mvtvm_ml_stubs.h
index 23fdfdc4cd..29f721072a 100644
--- a/drivers/ml/cnxk/mvtvm_ml_stubs.h
+++ b/drivers/ml/cnxk/mvtvm_ml_stubs.h
@@ -18,5 +18,6 @@  int mvtvm_ml_model_load(struct cnxk_ml_dev *cnxk_mldev, struct rte_ml_model_para
 
 int mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name,
 				uint16_t *layer_id);
+struct cnxk_ml_io_info *mvtvm_ml_model_io_info_get(struct cnxk_ml_model *model, uint16_t layer_id);
 
 #endif /* _MVTVM_ML_STUBS_H_ */