xref: /dpdk/app/test-mldev/test_model_common.c (revision 38e884b5ad3ccd006f3614350d52adc78d1948df)
1f6661e6dSSrikanth Yalavarthi /* SPDX-License-Identifier: BSD-3-Clause
2f6661e6dSSrikanth Yalavarthi  * Copyright (c) 2022 Marvell.
3f6661e6dSSrikanth Yalavarthi  */
4f6661e6dSSrikanth Yalavarthi 
5f6661e6dSSrikanth Yalavarthi #include <errno.h>
6f6661e6dSSrikanth Yalavarthi 
7f6661e6dSSrikanth Yalavarthi #include <rte_common.h>
8f6661e6dSSrikanth Yalavarthi #include <rte_malloc.h>
9f6661e6dSSrikanth Yalavarthi #include <rte_mldev.h>
10f6661e6dSSrikanth Yalavarthi 
11f6661e6dSSrikanth Yalavarthi #include "ml_common.h"
12f6661e6dSSrikanth Yalavarthi #include "test_model_common.h"
13f6661e6dSSrikanth Yalavarthi 
14f6661e6dSSrikanth Yalavarthi int
15f6661e6dSSrikanth Yalavarthi ml_model_load(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid)
16f6661e6dSSrikanth Yalavarthi {
17f6661e6dSSrikanth Yalavarthi 	struct test_common *t = ml_test_priv(test);
18f6661e6dSSrikanth Yalavarthi 	struct rte_ml_model_params model_params;
19f6661e6dSSrikanth Yalavarthi 	FILE *fp;
20f6661e6dSSrikanth Yalavarthi 	int ret;
21f6661e6dSSrikanth Yalavarthi 
22f6661e6dSSrikanth Yalavarthi 	if (model->state == MODEL_LOADED)
23f6661e6dSSrikanth Yalavarthi 		return 0;
24f6661e6dSSrikanth Yalavarthi 
25f6661e6dSSrikanth Yalavarthi 	if (model->state != MODEL_INITIAL)
26f6661e6dSSrikanth Yalavarthi 		return -EINVAL;
27f6661e6dSSrikanth Yalavarthi 
28f6661e6dSSrikanth Yalavarthi 	/* read model binary */
29f6661e6dSSrikanth Yalavarthi 	fp = fopen(opt->filelist[fid].model, "r");
30f6661e6dSSrikanth Yalavarthi 	if (fp == NULL) {
31f6661e6dSSrikanth Yalavarthi 		ml_err("Failed to open model file : %s\n", opt->filelist[fid].model);
32f6661e6dSSrikanth Yalavarthi 		return -1;
33f6661e6dSSrikanth Yalavarthi 	}
34f6661e6dSSrikanth Yalavarthi 
35f6661e6dSSrikanth Yalavarthi 	fseek(fp, 0, SEEK_END);
36f6661e6dSSrikanth Yalavarthi 	model_params.size = ftell(fp);
37f6661e6dSSrikanth Yalavarthi 	fseek(fp, 0, SEEK_SET);
38f6661e6dSSrikanth Yalavarthi 
39f6661e6dSSrikanth Yalavarthi 	model_params.addr = rte_malloc_socket("ml_model", model_params.size,
40f6661e6dSSrikanth Yalavarthi 					      t->dev_info.min_align_size, opt->socket_id);
41f6661e6dSSrikanth Yalavarthi 	if (model_params.addr == NULL) {
42f6661e6dSSrikanth Yalavarthi 		ml_err("Failed to allocate memory for model: %s\n", opt->filelist[fid].model);
43f6661e6dSSrikanth Yalavarthi 		fclose(fp);
44f6661e6dSSrikanth Yalavarthi 		return -ENOMEM;
45f6661e6dSSrikanth Yalavarthi 	}
46f6661e6dSSrikanth Yalavarthi 
47f6661e6dSSrikanth Yalavarthi 	if (fread(model_params.addr, 1, model_params.size, fp) != model_params.size) {
48f6661e6dSSrikanth Yalavarthi 		ml_err("Failed to read model file : %s\n", opt->filelist[fid].model);
49f6661e6dSSrikanth Yalavarthi 		rte_free(model_params.addr);
50f6661e6dSSrikanth Yalavarthi 		fclose(fp);
51f6661e6dSSrikanth Yalavarthi 		return -1;
52f6661e6dSSrikanth Yalavarthi 	}
53f6661e6dSSrikanth Yalavarthi 	fclose(fp);
54f6661e6dSSrikanth Yalavarthi 
55f6661e6dSSrikanth Yalavarthi 	/* load model to device */
56f6661e6dSSrikanth Yalavarthi 	ret = rte_ml_model_load(opt->dev_id, &model_params, &model->id);
57f6661e6dSSrikanth Yalavarthi 	if (ret != 0) {
58f6661e6dSSrikanth Yalavarthi 		ml_err("Failed to load model : %s\n", opt->filelist[fid].model);
59f6661e6dSSrikanth Yalavarthi 		model->state = MODEL_ERROR;
60f6661e6dSSrikanth Yalavarthi 		rte_free(model_params.addr);
61f6661e6dSSrikanth Yalavarthi 		return ret;
62f6661e6dSSrikanth Yalavarthi 	}
63f6661e6dSSrikanth Yalavarthi 
64f6661e6dSSrikanth Yalavarthi 	/* release mz */
65f6661e6dSSrikanth Yalavarthi 	rte_free(model_params.addr);
66f6661e6dSSrikanth Yalavarthi 
67f6661e6dSSrikanth Yalavarthi 	/* get model info */
68f6661e6dSSrikanth Yalavarthi 	ret = rte_ml_model_info_get(opt->dev_id, model->id, &model->info);
69f6661e6dSSrikanth Yalavarthi 	if (ret != 0) {
70f6661e6dSSrikanth Yalavarthi 		ml_err("Failed to get model info : %s\n", opt->filelist[fid].model);
71f6661e6dSSrikanth Yalavarthi 		return ret;
72f6661e6dSSrikanth Yalavarthi 	}
73f6661e6dSSrikanth Yalavarthi 
74*38e884b5SSrikanth Yalavarthi 	/* Update number of batches */
75*38e884b5SSrikanth Yalavarthi 	if (opt->batches == 0)
76*38e884b5SSrikanth Yalavarthi 		model->nb_batches = model->info.batch_size;
77*38e884b5SSrikanth Yalavarthi 	else
78*38e884b5SSrikanth Yalavarthi 		model->nb_batches = opt->batches;
79*38e884b5SSrikanth Yalavarthi 
80f6661e6dSSrikanth Yalavarthi 	model->state = MODEL_LOADED;
81f6661e6dSSrikanth Yalavarthi 
82f6661e6dSSrikanth Yalavarthi 	return 0;
83f6661e6dSSrikanth Yalavarthi }
84f6661e6dSSrikanth Yalavarthi 
85f6661e6dSSrikanth Yalavarthi int
86f6661e6dSSrikanth Yalavarthi ml_model_unload(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid)
87f6661e6dSSrikanth Yalavarthi {
88f6661e6dSSrikanth Yalavarthi 	struct test_common *t = ml_test_priv(test);
89f6661e6dSSrikanth Yalavarthi 	int ret;
90f6661e6dSSrikanth Yalavarthi 
91f6661e6dSSrikanth Yalavarthi 	RTE_SET_USED(t);
92f6661e6dSSrikanth Yalavarthi 
93f6661e6dSSrikanth Yalavarthi 	if (model->state == MODEL_INITIAL)
94f6661e6dSSrikanth Yalavarthi 		return 0;
95f6661e6dSSrikanth Yalavarthi 
96f6661e6dSSrikanth Yalavarthi 	if (model->state != MODEL_LOADED)
97f6661e6dSSrikanth Yalavarthi 		return -EINVAL;
98f6661e6dSSrikanth Yalavarthi 
99f6661e6dSSrikanth Yalavarthi 	/* unload model */
100f6661e6dSSrikanth Yalavarthi 	ret = rte_ml_model_unload(opt->dev_id, model->id);
101f6661e6dSSrikanth Yalavarthi 	if (ret != 0) {
102f6661e6dSSrikanth Yalavarthi 		ml_err("Failed to unload model: %s\n", opt->filelist[fid].model);
103f6661e6dSSrikanth Yalavarthi 		model->state = MODEL_ERROR;
104f6661e6dSSrikanth Yalavarthi 		return ret;
105f6661e6dSSrikanth Yalavarthi 	}
106f6661e6dSSrikanth Yalavarthi 
107f6661e6dSSrikanth Yalavarthi 	model->state = MODEL_INITIAL;
108f6661e6dSSrikanth Yalavarthi 
109f6661e6dSSrikanth Yalavarthi 	return 0;
110f6661e6dSSrikanth Yalavarthi }
111f6661e6dSSrikanth Yalavarthi 
112f6661e6dSSrikanth Yalavarthi int
113f6661e6dSSrikanth Yalavarthi ml_model_start(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid)
114f6661e6dSSrikanth Yalavarthi {
115f6661e6dSSrikanth Yalavarthi 	struct test_common *t = ml_test_priv(test);
116f6661e6dSSrikanth Yalavarthi 	int ret;
117f6661e6dSSrikanth Yalavarthi 
118f6661e6dSSrikanth Yalavarthi 	RTE_SET_USED(t);
119f6661e6dSSrikanth Yalavarthi 
120f6661e6dSSrikanth Yalavarthi 	if (model->state == MODEL_STARTED)
121f6661e6dSSrikanth Yalavarthi 		return 0;
122f6661e6dSSrikanth Yalavarthi 
123f6661e6dSSrikanth Yalavarthi 	if (model->state != MODEL_LOADED)
124f6661e6dSSrikanth Yalavarthi 		return -EINVAL;
125f6661e6dSSrikanth Yalavarthi 
126f6661e6dSSrikanth Yalavarthi 	/* start model */
127f6661e6dSSrikanth Yalavarthi 	ret = rte_ml_model_start(opt->dev_id, model->id);
128f6661e6dSSrikanth Yalavarthi 	if (ret != 0) {
129f6661e6dSSrikanth Yalavarthi 		ml_err("Failed to start model : %s\n", opt->filelist[fid].model);
130f6661e6dSSrikanth Yalavarthi 		model->state = MODEL_ERROR;
131f6661e6dSSrikanth Yalavarthi 		return ret;
132f6661e6dSSrikanth Yalavarthi 	}
133f6661e6dSSrikanth Yalavarthi 
134f6661e6dSSrikanth Yalavarthi 	model->state = MODEL_STARTED;
135f6661e6dSSrikanth Yalavarthi 
136f6661e6dSSrikanth Yalavarthi 	return 0;
137f6661e6dSSrikanth Yalavarthi }
138f6661e6dSSrikanth Yalavarthi 
139f6661e6dSSrikanth Yalavarthi int
140f6661e6dSSrikanth Yalavarthi ml_model_stop(struct ml_test *test, struct ml_options *opt, struct ml_model *model, uint16_t fid)
141f6661e6dSSrikanth Yalavarthi {
142f6661e6dSSrikanth Yalavarthi 	struct test_common *t = ml_test_priv(test);
143f6661e6dSSrikanth Yalavarthi 	int ret;
144f6661e6dSSrikanth Yalavarthi 
145f6661e6dSSrikanth Yalavarthi 	RTE_SET_USED(t);
146f6661e6dSSrikanth Yalavarthi 
147f6661e6dSSrikanth Yalavarthi 	if (model->state == MODEL_LOADED)
148f6661e6dSSrikanth Yalavarthi 		return 0;
149f6661e6dSSrikanth Yalavarthi 
150f6661e6dSSrikanth Yalavarthi 	if (model->state != MODEL_STARTED)
151f6661e6dSSrikanth Yalavarthi 		return -EINVAL;
152f6661e6dSSrikanth Yalavarthi 
153f6661e6dSSrikanth Yalavarthi 	/* stop model */
154f6661e6dSSrikanth Yalavarthi 	ret = rte_ml_model_stop(opt->dev_id, model->id);
155f6661e6dSSrikanth Yalavarthi 	if (ret != 0) {
156f6661e6dSSrikanth Yalavarthi 		ml_err("Failed to stop model: %s\n", opt->filelist[fid].model);
157f6661e6dSSrikanth Yalavarthi 		model->state = MODEL_ERROR;
158f6661e6dSSrikanth Yalavarthi 		return ret;
159f6661e6dSSrikanth Yalavarthi 	}
160f6661e6dSSrikanth Yalavarthi 
161f6661e6dSSrikanth Yalavarthi 	model->state = MODEL_LOADED;
162f6661e6dSSrikanth Yalavarthi 
163f6661e6dSSrikanth Yalavarthi 	return 0;
164f6661e6dSSrikanth Yalavarthi }
165