@@ -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;
@@ -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;
+}
@@ -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_ */
@@ -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:
@@ -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)
{
@@ -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_ */