@@ -714,3 +714,14 @@ cn10k_ml_layer_print(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_layer *layer
cnxk_ml_print_line(fp, LINE_LEN);
fprintf(fp, "\n");
}
+
+int
+cn10k_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name, uint16_t *layer_id)
+{
+ if (model->type == ML_CNXK_MODEL_TYPE_TVM)
+ return mvtvm_ml_model_get_layer_id(model, layer_name, layer_id);
+
+ *layer_id = 0;
+
+ return 0;
+}
@@ -461,5 +461,7 @@ void cn10k_ml_model_info_set(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_mode
struct cnxk_ml_io_info *io_info,
struct cn10k_ml_model_metadata *metadata);
void cn10k_ml_layer_print(struct cnxk_ml_dev *cnxk_mldev, struct cnxk_ml_layer *layer, FILE *fp);
+int cn10k_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name,
+ uint16_t *layer_id);
#endif /* _CN10K_ML_MODEL_H_ */
@@ -576,7 +576,7 @@ cn10k_ml_layer_load(void *device, uint16_t model_id, const char *layer_name, uin
size_t layer_xstats_size;
uint8_t *base_dma_addr;
uint16_t scratch_pages;
- uint16_t layer_id = 0;
+ uint16_t layer_id;
uint16_t wb_pages;
uint64_t mz_size;
uint16_t idx;
@@ -584,7 +584,6 @@ cn10k_ml_layer_load(void *device, uint16_t model_id, const char *layer_name, uin
int ret;
PLT_SET_USED(size);
- PLT_SET_USED(layer_name);
cnxk_mldev = (struct cnxk_ml_dev *)device;
if (cnxk_mldev == NULL) {
@@ -598,6 +597,10 @@ cn10k_ml_layer_load(void *device, uint16_t model_id, const char *layer_name, uin
return -EINVAL;
}
+ ret = cn10k_ml_model_get_layer_id(model, layer_name, &layer_id);
+ if (ret != 0)
+ return ret;
+
layer = &model->layer[layer_id];
ret = cn10k_ml_model_metadata_check(buffer, size);
@@ -110,3 +110,28 @@ mvtvm_ml_model_blob_parse(struct rte_ml_model_params *params, struct mvtvm_ml_mo
return -EINVAL;
}
+
+int
+mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name, uint16_t *layer_id)
+{
+ uint16_t i;
+
+ for (i = 0; i < model->mvtvm.metadata.model.nb_layers; i++) {
+ if (strcmp(model->layer[i].name, layer_name) == 0)
+ break;
+ }
+
+ if (i == model->mvtvm.metadata.model.nb_layers) {
+ plt_err("Invalid layer name: %s", layer_name);
+ return -EINVAL;
+ }
+
+ if (model->layer[i].type != ML_CNXK_LAYER_TYPE_MRVL) {
+ plt_err("Invalid layer type, name: %s type: %d", layer_name, model->layer[i].type);
+ return -EINVAL;
+ }
+
+ *layer_id = i;
+
+ return 0;
+}
@@ -11,6 +11,8 @@
#include "cnxk_ml_io.h"
+struct cnxk_ml_model;
+
/* Maximum number of objects per model */
#define ML_MVTVM_MODEL_OBJECT_MAX 3
@@ -46,5 +48,7 @@ struct mvtvm_ml_model_data {
enum cnxk_ml_model_type mvtvm_ml_model_type_get(struct rte_ml_model_params *params);
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);
#endif /* _MVTVM_ML_MODEL_H_ */
@@ -49,9 +49,13 @@ mvtvm_ml_model_load(struct cnxk_ml_dev *cnxk_mldev, struct rte_ml_model_params *
struct cnxk_ml_model *model)
{
struct mvtvm_ml_model_object object[ML_MVTVM_MODEL_OBJECT_MAX];
+ struct tvmrt_glow_callback *callback;
char str[RTE_MEMZONE_NAMESIZE];
const struct plt_memzone *mz;
size_t model_object_size = 0;
+ uint16_t nb_mrvl_layers;
+ uint16_t nb_llvm_layers;
+ uint8_t layer_id = 0;
uint64_t mz_size = 0;
int ret;
@@ -99,5 +103,82 @@ mvtvm_ml_model_load(struct cnxk_ml_dev *cnxk_mldev, struct rte_ml_model_params *
rte_memcpy(model->mvtvm.object.params.addr, object[2].buffer, object[2].size);
rte_free(object[2].buffer);
+ /* Get metadata - stage 1 */
+ ret = tvmdp_model_metadata_get_stage1(model->mvtvm.object.json.addr,
+ model->mvtvm.object.json.size,
+ &model->mvtvm.metadata);
+ if (ret != 0) {
+ plt_err("TVMDP: Failed to parse metadata - stage 1, model_id = %u, error = %d",
+ model->model_id, ret);
+ goto error;
+ }
+
+ /* Set model fields */
+ plt_strlcpy(model->name, model->mvtvm.metadata.model.name, TVMDP_NAME_STRLEN);
+ model->batch_size = 1;
+ model->nb_layers = model->mvtvm.metadata.model.nb_layers;
+
+ /* Update layer info */
+ nb_mrvl_layers = 0;
+ nb_llvm_layers = 0;
+ for (layer_id = 0; layer_id < model->mvtvm.metadata.model.nb_layers; layer_id++) {
+ strncpy(model->layer[layer_id].name,
+ model->mvtvm.metadata.model.layer[layer_id].name, TVMDP_NAME_STRLEN);
+ if (strcmp(model->mvtvm.metadata.model.layer[layer_id].type, "mrvl") == 0 ||
+ strcmp(model->mvtvm.metadata.model.layer[layer_id].type, "MRVL") == 0) {
+ model->layer[layer_id].type = ML_CNXK_LAYER_TYPE_MRVL;
+ nb_mrvl_layers++;
+ } else if (strcmp(model->mvtvm.metadata.model.layer[layer_id].type, "llvm") == 0 ||
+ strcmp(model->mvtvm.metadata.model.layer[layer_id].type, "LLVM") == 0) {
+ model->layer[layer_id].type = ML_CNXK_LAYER_TYPE_LLVM;
+ nb_llvm_layers++;
+ }
+ }
+
+ if ((nb_llvm_layers == 0) && (nb_mrvl_layers == 0)) {
+ plt_err("Invalid model, nb_llvm_layers = %u, nb_mrvl_layers = %u", nb_llvm_layers,
+ nb_mrvl_layers);
+ goto error;
+ }
+
+ /* Set model subtype */
+ if ((nb_llvm_layers == 0) && (nb_mrvl_layers == 1))
+ model->subtype = ML_CNXK_MODEL_SUBTYPE_TVM_MRVL;
+ else if ((nb_llvm_layers > 0) && (nb_mrvl_layers == 0))
+ model->subtype = ML_CNXK_MODEL_SUBTYPE_TVM_LLVM;
+ else
+ model->subtype = ML_CNXK_MODEL_SUBTYPE_TVM_HYBRID;
+
+ /* Set callback function array */
+ if (model->subtype != ML_CNXK_MODEL_SUBTYPE_TVM_LLVM) {
+ callback = &model->mvtvm.cb;
+ callback->tvmrt_glow_layer_load = cn10k_ml_layer_load;
+ callback->tvmrt_glow_layer_unload = cn10k_ml_layer_unload;
+ } else {
+ callback = NULL;
+ }
+
+ /* Initialize model in TVMDP */
+ ret = tvmdp_model_load(cnxk_mldev, model->model_id, (void *)(&model->mvtvm.object),
+ callback);
+ if (ret != 0) {
+ plt_err("TVMDP: Model load failed, model_id = %u, error = %d", model->model_id,
+ ret);
+ goto error;
+ }
+
+ /* Get model metadata - stage 2 */
+ ret = tvmdp_model_metadata_get_stage2(model->model_id, &model->mvtvm.metadata);
+ if (ret != 0) {
+ plt_err("TVMDP: Failed to get metadata, model_id = %u, error = %d\n",
+ model->model_id, ret);
+ goto error;
+ }
+
return 0;
+
+error:
+ rte_memzone_free(mz);
+
+ return ret;
}
@@ -17,6 +17,16 @@ mvtvm_ml_model_type_get(struct rte_ml_model_params *params)
return ML_CNXK_MODEL_TYPE_UNKNOWN;
}
+int
+mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name, uint16_t *layer_id)
+{
+ RTE_SET_USED(model);
+ RTE_SET_USED(layer_name);
+ RTE_SET_USED(layer_id);
+
+ return -EINVAL;
+}
+
int
mvtvm_ml_dev_configure(struct cnxk_ml_dev *cnxk_mldev, const struct rte_ml_dev_config *conf)
{
@@ -16,4 +16,7 @@ int mvtvm_ml_dev_close(struct cnxk_ml_dev *cnxk_mldev);
int mvtvm_ml_model_load(struct cnxk_ml_dev *cnxk_mldev, struct rte_ml_model_params *params,
struct cnxk_ml_model *model);
+int mvtvm_ml_model_get_layer_id(struct cnxk_ml_model *model, const char *layer_name,
+ uint16_t *layer_id);
+
#endif /* _MVTVM_ML_STUBS_H_ */