From 5afe06f4450cd0d570fa8dbf23928846b52aac36 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 2 Jun 2025 21:13:25 +0530 Subject: [PATCH 1/3] Logistic Regression Logisitic Regression trained on iris dataset --- iris_pipeline_project/Dockerfile | 19 ++++++++++++ iris_pipeline_project/convert.py | 24 +++++++++++++++ .../model/iris_logreg/1/logreg_model.onnx | Bin 0 -> 684 bytes iris_pipeline_project/model_config.json | 10 ++++++ iris_pipeline_project/ovmsmodel.py | 29 ++++++++++++++++++ iris_pipeline_project/pipeline/graph.pbtxt | 14 +++++++++ 6 files changed, 96 insertions(+) create mode 100644 iris_pipeline_project/Dockerfile create mode 100644 iris_pipeline_project/convert.py create mode 100644 iris_pipeline_project/model/iris_logreg/1/logreg_model.onnx create mode 100644 iris_pipeline_project/model_config.json create mode 100644 iris_pipeline_project/ovmsmodel.py create mode 100644 iris_pipeline_project/pipeline/graph.pbtxt diff --git a/iris_pipeline_project/Dockerfile b/iris_pipeline_project/Dockerfile new file mode 100644 index 0000000000..f86035d5b3 --- /dev/null +++ b/iris_pipeline_project/Dockerfile @@ -0,0 +1,19 @@ +FROM openvino/model_server:latest + +USER root + +ENV LD_LIBRARY_PATH=/ovms/lib +ENV PYTHONPATH=/ovms/lib/python + +RUN apt update && apt install -y python3-pip git \ + build-essential python3-dev libatlas-base-dev + +RUN pip3 install --break-system-packages numpy pandas scikit-learn + + +COPY pipeline/graph.pbtxt /models/iris_pipeline/ +COPY pipeline/ovmsmodel.py /models/iris_pipeline/ +COPY model/model.pkl /models/iris_pipeline/ +COPY model_config.json /model_config.json + +ENTRYPOINT [ "/ovms/bin/ovms" ] diff --git a/iris_pipeline_project/convert.py b/iris_pipeline_project/convert.py new file mode 100644 index 0000000000..e4153225c7 --- /dev/null +++ b/iris_pipeline_project/convert.py @@ -0,0 +1,24 @@ +from sklearn.datasets import load_iris +from sklearn.linear_model import LogisticRegression +from sklearn.model_selection import train_test_split +import joblib +import os +import openvino as ov + +X, y = load_iris(return_X_y=True) +X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) + +model = LogisticRegression(max_iter=200) +model.fit(X_train, y_train) + +joblib.dump(model, 'logreg_model.pkl') + +from skl2onnx import to_onnx + +onx = to_onnx(model, X_train[:1], target_opset=12) +ov.convert_model('logreg_model.onnx') + +import onnx +model = onnx.load("model/iris_logreg/1/logreg_model.onnx") +print("Inputs:", [i.name for i in model.graph.input]) +print("Outputs:", [o.name for o in model.graph.output]) diff --git a/iris_pipeline_project/model/iris_logreg/1/logreg_model.onnx b/iris_pipeline_project/model/iris_logreg/1/logreg_model.onnx new file mode 100644 index 0000000000000000000000000000000000000000..63837162e36b68189e330eb1f78e12ee634402fb GIT binary patch literal 684 zcmZvaO>5LZ7{`+|-DDrP%Q8?{Qr{XpNQBVMZkKgo+O!2Pc3Y&rlpY!;aRQ^+B+X>O zdK5egp1cYB1-yH4YmeeVFM=oa^M8KN=sME*{{K_2(yRV>yjh2f2r_Nfms%(y&TO(#HSHLX_olJXA#Q}y`088$&AV-iz&%ABEmTf z8O_Z9POJr}1jG19g?lW{xhuJ{tMp~f>Od(-Xc)49Q4zpz<&y#4{(5^A2M6=-F|nT= z;Twx@R`8cke+GE#=f`*0y!Yq`8^^^J{Ncyz0en%d6xt-GDI-M&22 zhA|eq8^L`zhXIIUJt zIU21ZD0x!Vgx|IV`*8YAgvNOjCx=F1kEI=wn&a8J1n5i~nvF>#rt3skYhf#RSYIN+ za--Rx%cRxv9p|PK(xqmrS*K)g{@>py0q8O+fCP%J`c*hp0n(wMYe)gfzXs=cL}gRt WTe`TTihOxp1*uY8FT)h{iu@NL64dkn literal 0 HcmV?d00001 diff --git a/iris_pipeline_project/model_config.json b/iris_pipeline_project/model_config.json new file mode 100644 index 0000000000..aeb362dbf6 --- /dev/null +++ b/iris_pipeline_project/model_config.json @@ -0,0 +1,10 @@ +{ + "custom_node_library_config_list": [], + "graph_config_list": [ + { + "name": "iris_pipeline", + "base_path": "/models/iris_pipeline", + "graph_path": "graph.pbtxt" + } + ] +} diff --git a/iris_pipeline_project/ovmsmodel.py b/iris_pipeline_project/ovmsmodel.py new file mode 100644 index 0000000000..1064a75d49 --- /dev/null +++ b/iris_pipeline_project/ovmsmodel.py @@ -0,0 +1,29 @@ +import pandas as pd +import numpy as np +import joblib +import os +from pyovms import Tensor + +class OvmsPythonModel: + def initialize(self, kwargs): + print("Initializing model") + model_path = os.path.join(os.path.dirname(__file__), 'model.pkl') + self.model = joblib.load(model_path) + print("Model loaded successfully.") + + def execute(self, inputs): + print("Executing inference...") + input_tensor = inputs[0] + input_data = input_tensor.as_numpy() + + csv_data = input_data.tobytes().decode('utf-8') + df = pd.read_csv(pd.compat.StringIO(csv_data)) + + features = df.iloc[:, :-1] + preds = self.model.predict(features) + + output = Tensor.from_numpy(np.array(preds, dtype=np.int32)) + return [output] + + def finalize(self): + print("Finalizing model") diff --git a/iris_pipeline_project/pipeline/graph.pbtxt b/iris_pipeline_project/pipeline/graph.pbtxt new file mode 100644 index 0000000000..95fb668db0 --- /dev/null +++ b/iris_pipeline_project/pipeline/graph.pbtxt @@ -0,0 +1,14 @@ +input_stream: "inference_input" +output_stream: "inference_output" + +node { + calculator: "InferenceCalculator" + input_stream: "inference_input" + output_stream: "inference_output" + options: { + [type.googleapis.com/openvino.CalculatorOptions] { + model_name: "iris_pipeline" + signature_name: "serving_default" + } + } +} From 78a812574bb2b1a8176f3440ac7586eb8cb5f919 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 9 Jun 2025 00:27:05 +0530 Subject: [PATCH 2/3] Delete iris_pipeline_project directory --- iris_pipeline_project/Dockerfile | 19 ------------ iris_pipeline_project/convert.py | 24 --------------- .../model/iris_logreg/1/logreg_model.onnx | Bin 684 -> 0 bytes iris_pipeline_project/model_config.json | 10 ------ iris_pipeline_project/ovmsmodel.py | 29 ------------------ iris_pipeline_project/pipeline/graph.pbtxt | 14 --------- 6 files changed, 96 deletions(-) delete mode 100644 iris_pipeline_project/Dockerfile delete mode 100644 iris_pipeline_project/convert.py delete mode 100644 iris_pipeline_project/model/iris_logreg/1/logreg_model.onnx delete mode 100644 iris_pipeline_project/model_config.json delete mode 100644 iris_pipeline_project/ovmsmodel.py delete mode 100644 iris_pipeline_project/pipeline/graph.pbtxt diff --git a/iris_pipeline_project/Dockerfile b/iris_pipeline_project/Dockerfile deleted file mode 100644 index f86035d5b3..0000000000 --- a/iris_pipeline_project/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM openvino/model_server:latest - -USER root - -ENV LD_LIBRARY_PATH=/ovms/lib -ENV PYTHONPATH=/ovms/lib/python - -RUN apt update && apt install -y python3-pip git \ - build-essential python3-dev libatlas-base-dev - -RUN pip3 install --break-system-packages numpy pandas scikit-learn - - -COPY pipeline/graph.pbtxt /models/iris_pipeline/ -COPY pipeline/ovmsmodel.py /models/iris_pipeline/ -COPY model/model.pkl /models/iris_pipeline/ -COPY model_config.json /model_config.json - -ENTRYPOINT [ "/ovms/bin/ovms" ] diff --git a/iris_pipeline_project/convert.py b/iris_pipeline_project/convert.py deleted file mode 100644 index e4153225c7..0000000000 --- a/iris_pipeline_project/convert.py +++ /dev/null @@ -1,24 +0,0 @@ -from sklearn.datasets import load_iris -from sklearn.linear_model import LogisticRegression -from sklearn.model_selection import train_test_split -import joblib -import os -import openvino as ov - -X, y = load_iris(return_X_y=True) -X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) - -model = LogisticRegression(max_iter=200) -model.fit(X_train, y_train) - -joblib.dump(model, 'logreg_model.pkl') - -from skl2onnx import to_onnx - -onx = to_onnx(model, X_train[:1], target_opset=12) -ov.convert_model('logreg_model.onnx') - -import onnx -model = onnx.load("model/iris_logreg/1/logreg_model.onnx") -print("Inputs:", [i.name for i in model.graph.input]) -print("Outputs:", [o.name for o in model.graph.output]) diff --git a/iris_pipeline_project/model/iris_logreg/1/logreg_model.onnx b/iris_pipeline_project/model/iris_logreg/1/logreg_model.onnx deleted file mode 100644 index 63837162e36b68189e330eb1f78e12ee634402fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 684 zcmZvaO>5LZ7{`+|-DDrP%Q8?{Qr{XpNQBVMZkKgo+O!2Pc3Y&rlpY!;aRQ^+B+X>O zdK5egp1cYB1-yH4YmeeVFM=oa^M8KN=sME*{{K_2(yRV>yjh2f2r_Nfms%(y&TO(#HSHLX_olJXA#Q}y`088$&AV-iz&%ABEmTf z8O_Z9POJr}1jG19g?lW{xhuJ{tMp~f>Od(-Xc)49Q4zpz<&y#4{(5^A2M6=-F|nT= z;Twx@R`8cke+GE#=f`*0y!Yq`8^^^J{Ncyz0en%d6xt-GDI-M&22 zhA|eq8^L`zhXIIUJt zIU21ZD0x!Vgx|IV`*8YAgvNOjCx=F1kEI=wn&a8J1n5i~nvF>#rt3skYhf#RSYIN+ za--Rx%cRxv9p|PK(xqmrS*K)g{@>py0q8O+fCP%J`c*hp0n(wMYe)gfzXs=cL}gRt WTe`TTihOxp1*uY8FT)h{iu@NL64dkn diff --git a/iris_pipeline_project/model_config.json b/iris_pipeline_project/model_config.json deleted file mode 100644 index aeb362dbf6..0000000000 --- a/iris_pipeline_project/model_config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "custom_node_library_config_list": [], - "graph_config_list": [ - { - "name": "iris_pipeline", - "base_path": "/models/iris_pipeline", - "graph_path": "graph.pbtxt" - } - ] -} diff --git a/iris_pipeline_project/ovmsmodel.py b/iris_pipeline_project/ovmsmodel.py deleted file mode 100644 index 1064a75d49..0000000000 --- a/iris_pipeline_project/ovmsmodel.py +++ /dev/null @@ -1,29 +0,0 @@ -import pandas as pd -import numpy as np -import joblib -import os -from pyovms import Tensor - -class OvmsPythonModel: - def initialize(self, kwargs): - print("Initializing model") - model_path = os.path.join(os.path.dirname(__file__), 'model.pkl') - self.model = joblib.load(model_path) - print("Model loaded successfully.") - - def execute(self, inputs): - print("Executing inference...") - input_tensor = inputs[0] - input_data = input_tensor.as_numpy() - - csv_data = input_data.tobytes().decode('utf-8') - df = pd.read_csv(pd.compat.StringIO(csv_data)) - - features = df.iloc[:, :-1] - preds = self.model.predict(features) - - output = Tensor.from_numpy(np.array(preds, dtype=np.int32)) - return [output] - - def finalize(self): - print("Finalizing model") diff --git a/iris_pipeline_project/pipeline/graph.pbtxt b/iris_pipeline_project/pipeline/graph.pbtxt deleted file mode 100644 index 95fb668db0..0000000000 --- a/iris_pipeline_project/pipeline/graph.pbtxt +++ /dev/null @@ -1,14 +0,0 @@ -input_stream: "inference_input" -output_stream: "inference_output" - -node { - calculator: "InferenceCalculator" - input_stream: "inference_input" - output_stream: "inference_output" - options: { - [type.googleapis.com/openvino.CalculatorOptions] { - model_name: "iris_pipeline" - signature_name: "serving_default" - } - } -} From aaf49812d455cd9d2754a9c169f57937a8a9f899 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 9 Jun 2025 00:32:03 +0530 Subject: [PATCH 3/3] Add files via upload --- extras/Dockerfile | 16 ++++ extras/data/Iris (copy).csv | 151 +++++++++++++++++++++++++++++++++++ extras/data/data_slit.py | 12 +++ extras/data/iris_test.csv | 31 +++++++ extras/data/iris_train.csv | 121 ++++++++++++++++++++++++++++ extras/model_config.json | 10 +++ extras/pipeline/graph.pbtxt | 26 ++++++ extras/pipeline/ovmsmodel.py | 43 ++++++++++ 8 files changed, 410 insertions(+) create mode 100644 extras/Dockerfile create mode 100644 extras/data/Iris (copy).csv create mode 100644 extras/data/data_slit.py create mode 100644 extras/data/iris_test.csv create mode 100644 extras/data/iris_train.csv create mode 100644 extras/model_config.json create mode 100644 extras/pipeline/graph.pbtxt create mode 100644 extras/pipeline/ovmsmodel.py diff --git a/extras/Dockerfile b/extras/Dockerfile new file mode 100644 index 0000000000..9028e545ff --- /dev/null +++ b/extras/Dockerfile @@ -0,0 +1,16 @@ +FROM openvino/model_server:latest + +USER root + +ENV LD_LIBRARY_PATH=/ovms/lib +ENV PYTHONPATH=/ovms/lib/python + +COPY model/iris_logreg /models/iris_logreg +COPY pipeline/graph.pbtxt /models/iris_pipeline/ +COPY pipeline/ovmsmodel.py /models/iris_pipeline/ +COPY model_config.json /model_config.json + +RUN apt-get update && apt-get install -y python3-pip +RUN pip3 install --break-system-packages pandas numpy scikit-learn joblib skl2onnx onnx + +ENTRYPOINT ["/ovms/bin/ovms", "--config_path", "/model_config.json"] \ No newline at end of file diff --git a/extras/data/Iris (copy).csv b/extras/data/Iris (copy).csv new file mode 100644 index 0000000000..1bf42f2549 --- /dev/null +++ b/extras/data/Iris (copy).csv @@ -0,0 +1,151 @@ +Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species +1,5.1,3.5,1.4,0.2,Iris-setosa +2,4.9,3.0,1.4,0.2,Iris-setosa +3,4.7,3.2,1.3,0.2,Iris-setosa +4,4.6,3.1,1.5,0.2,Iris-setosa +5,5.0,3.6,1.4,0.2,Iris-setosa +6,5.4,3.9,1.7,0.4,Iris-setosa +7,4.6,3.4,1.4,0.3,Iris-setosa +8,5.0,3.4,1.5,0.2,Iris-setosa +9,4.4,2.9,1.4,0.2,Iris-setosa +10,4.9,3.1,1.5,0.1,Iris-setosa +11,5.4,3.7,1.5,0.2,Iris-setosa +12,4.8,3.4,1.6,0.2,Iris-setosa +13,4.8,3.0,1.4,0.1,Iris-setosa +14,4.3,3.0,1.1,0.1,Iris-setosa +15,5.8,4.0,1.2,0.2,Iris-setosa +16,5.7,4.4,1.5,0.4,Iris-setosa +17,5.4,3.9,1.3,0.4,Iris-setosa +18,5.1,3.5,1.4,0.3,Iris-setosa +19,5.7,3.8,1.7,0.3,Iris-setosa +20,5.1,3.8,1.5,0.3,Iris-setosa +21,5.4,3.4,1.7,0.2,Iris-setosa +22,5.1,3.7,1.5,0.4,Iris-setosa +23,4.6,3.6,1.0,0.2,Iris-setosa +24,5.1,3.3,1.7,0.5,Iris-setosa +25,4.8,3.4,1.9,0.2,Iris-setosa +26,5.0,3.0,1.6,0.2,Iris-setosa +27,5.0,3.4,1.6,0.4,Iris-setosa +28,5.2,3.5,1.5,0.2,Iris-setosa +29,5.2,3.4,1.4,0.2,Iris-setosa +30,4.7,3.2,1.6,0.2,Iris-setosa +31,4.8,3.1,1.6,0.2,Iris-setosa +32,5.4,3.4,1.5,0.4,Iris-setosa +33,5.2,4.1,1.5,0.1,Iris-setosa +34,5.5,4.2,1.4,0.2,Iris-setosa +35,4.9,3.1,1.5,0.1,Iris-setosa +36,5.0,3.2,1.2,0.2,Iris-setosa +37,5.5,3.5,1.3,0.2,Iris-setosa +38,4.9,3.1,1.5,0.1,Iris-setosa +39,4.4,3.0,1.3,0.2,Iris-setosa +40,5.1,3.4,1.5,0.2,Iris-setosa +41,5.0,3.5,1.3,0.3,Iris-setosa +42,4.5,2.3,1.3,0.3,Iris-setosa +43,4.4,3.2,1.3,0.2,Iris-setosa +44,5.0,3.5,1.6,0.6,Iris-setosa +45,5.1,3.8,1.9,0.4,Iris-setosa +46,4.8,3.0,1.4,0.3,Iris-setosa +47,5.1,3.8,1.6,0.2,Iris-setosa +48,4.6,3.2,1.4,0.2,Iris-setosa +49,5.3,3.7,1.5,0.2,Iris-setosa +50,5.0,3.3,1.4,0.2,Iris-setosa +51,7.0,3.2,4.7,1.4,Iris-versicolor +52,6.4,3.2,4.5,1.5,Iris-versicolor +53,6.9,3.1,4.9,1.5,Iris-versicolor +54,5.5,2.3,4.0,1.3,Iris-versicolor +55,6.5,2.8,4.6,1.5,Iris-versicolor +56,5.7,2.8,4.5,1.3,Iris-versicolor +57,6.3,3.3,4.7,1.6,Iris-versicolor +58,4.9,2.4,3.3,1.0,Iris-versicolor +59,6.6,2.9,4.6,1.3,Iris-versicolor +60,5.2,2.7,3.9,1.4,Iris-versicolor +61,5.0,2.0,3.5,1.0,Iris-versicolor +62,5.9,3.0,4.2,1.5,Iris-versicolor +63,6.0,2.2,4.0,1.0,Iris-versicolor +64,6.1,2.9,4.7,1.4,Iris-versicolor +65,5.6,2.9,3.6,1.3,Iris-versicolor +66,6.7,3.1,4.4,1.4,Iris-versicolor +67,5.6,3.0,4.5,1.5,Iris-versicolor +68,5.8,2.7,4.1,1.0,Iris-versicolor +69,6.2,2.2,4.5,1.5,Iris-versicolor +70,5.6,2.5,3.9,1.1,Iris-versicolor +71,5.9,3.2,4.8,1.8,Iris-versicolor +72,6.1,2.8,4.0,1.3,Iris-versicolor +73,6.3,2.5,4.9,1.5,Iris-versicolor +74,6.1,2.8,4.7,1.2,Iris-versicolor +75,6.4,2.9,4.3,1.3,Iris-versicolor +76,6.6,3.0,4.4,1.4,Iris-versicolor +77,6.8,2.8,4.8,1.4,Iris-versicolor +78,6.7,3.0,5.0,1.7,Iris-versicolor +79,6.0,2.9,4.5,1.5,Iris-versicolor +80,5.7,2.6,3.5,1.0,Iris-versicolor +81,5.5,2.4,3.8,1.1,Iris-versicolor +82,5.5,2.4,3.7,1.0,Iris-versicolor +83,5.8,2.7,3.9,1.2,Iris-versicolor +84,6.0,2.7,5.1,1.6,Iris-versicolor +85,5.4,3.0,4.5,1.5,Iris-versicolor +86,6.0,3.4,4.5,1.6,Iris-versicolor +87,6.7,3.1,4.7,1.5,Iris-versicolor +88,6.3,2.3,4.4,1.3,Iris-versicolor +89,5.6,3.0,4.1,1.3,Iris-versicolor +90,5.5,2.5,4.0,1.3,Iris-versicolor +91,5.5,2.6,4.4,1.2,Iris-versicolor +92,6.1,3.0,4.6,1.4,Iris-versicolor +93,5.8,2.6,4.0,1.2,Iris-versicolor +94,5.0,2.3,3.3,1.0,Iris-versicolor +95,5.6,2.7,4.2,1.3,Iris-versicolor +96,5.7,3.0,4.2,1.2,Iris-versicolor +97,5.7,2.9,4.2,1.3,Iris-versicolor +98,6.2,2.9,4.3,1.3,Iris-versicolor +99,5.1,2.5,3.0,1.1,Iris-versicolor +100,5.7,2.8,4.1,1.3,Iris-versicolor +101,6.3,3.3,6.0,2.5,Iris-virginica +102,5.8,2.7,5.1,1.9,Iris-virginica +103,7.1,3.0,5.9,2.1,Iris-virginica +104,6.3,2.9,5.6,1.8,Iris-virginica +105,6.5,3.0,5.8,2.2,Iris-virginica +106,7.6,3.0,6.6,2.1,Iris-virginica +107,4.9,2.5,4.5,1.7,Iris-virginica +108,7.3,2.9,6.3,1.8,Iris-virginica +109,6.7,2.5,5.8,1.8,Iris-virginica +110,7.2,3.6,6.1,2.5,Iris-virginica +111,6.5,3.2,5.1,2.0,Iris-virginica +112,6.4,2.7,5.3,1.9,Iris-virginica +113,6.8,3.0,5.5,2.1,Iris-virginica +114,5.7,2.5,5.0,2.0,Iris-virginica +115,5.8,2.8,5.1,2.4,Iris-virginica +116,6.4,3.2,5.3,2.3,Iris-virginica +117,6.5,3.0,5.5,1.8,Iris-virginica +118,7.7,3.8,6.7,2.2,Iris-virginica +119,7.7,2.6,6.9,2.3,Iris-virginica +120,6.0,2.2,5.0,1.5,Iris-virginica +121,6.9,3.2,5.7,2.3,Iris-virginica +122,5.6,2.8,4.9,2.0,Iris-virginica +123,7.7,2.8,6.7,2.0,Iris-virginica +124,6.3,2.7,4.9,1.8,Iris-virginica +125,6.7,3.3,5.7,2.1,Iris-virginica +126,7.2,3.2,6.0,1.8,Iris-virginica +127,6.2,2.8,4.8,1.8,Iris-virginica +128,6.1,3.0,4.9,1.8,Iris-virginica +129,6.4,2.8,5.6,2.1,Iris-virginica +130,7.2,3.0,5.8,1.6,Iris-virginica +131,7.4,2.8,6.1,1.9,Iris-virginica +132,7.9,3.8,6.4,2.0,Iris-virginica +133,6.4,2.8,5.6,2.2,Iris-virginica +134,6.3,2.8,5.1,1.5,Iris-virginica +135,6.1,2.6,5.6,1.4,Iris-virginica +136,7.7,3.0,6.1,2.3,Iris-virginica +137,6.3,3.4,5.6,2.4,Iris-virginica +138,6.4,3.1,5.5,1.8,Iris-virginica +139,6.0,3.0,4.8,1.8,Iris-virginica +140,6.9,3.1,5.4,2.1,Iris-virginica +141,6.7,3.1,5.6,2.4,Iris-virginica +142,6.9,3.1,5.1,2.3,Iris-virginica +143,5.8,2.7,5.1,1.9,Iris-virginica +144,6.8,3.2,5.9,2.3,Iris-virginica +145,6.7,3.3,5.7,2.5,Iris-virginica +146,6.7,3.0,5.2,2.3,Iris-virginica +147,6.3,2.5,5.0,1.9,Iris-virginica +148,6.5,3.0,5.2,2.0,Iris-virginica +149,6.2,3.4,5.4,2.3,Iris-virginica +150,5.9,3.0,5.1,1.8,Iris-virginica diff --git a/extras/data/data_slit.py b/extras/data/data_slit.py new file mode 100644 index 0000000000..c645e76405 --- /dev/null +++ b/extras/data/data_slit.py @@ -0,0 +1,12 @@ +import pandas as pd +from sklearn.model_selection import train_test_split + +# Load the complete dataset +df = pd.read_csv('data/Iris (copy).csv') # Update this path as needed + +# Split the data (80% train, 20% test by default) +train_df, test_df = train_test_split(df, test_size=0.2, random_state=42, shuffle=True) + +# Save to new CSV files +train_df.to_csv('data/iris_train.csv', index=False) +test_df.to_csv('data/iris_test.csv', index=False) \ No newline at end of file diff --git a/extras/data/iris_test.csv b/extras/data/iris_test.csv new file mode 100644 index 0000000000..c70ca719dc --- /dev/null +++ b/extras/data/iris_test.csv @@ -0,0 +1,31 @@ +Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species +74,6.1,2.8,4.7,1.2,Iris-versicolor +19,5.7,3.8,1.7,0.3,Iris-setosa +119,7.7,2.6,6.9,2.3,Iris-virginica +79,6.0,2.9,4.5,1.5,Iris-versicolor +77,6.8,2.8,4.8,1.4,Iris-versicolor +32,5.4,3.4,1.5,0.4,Iris-setosa +65,5.6,2.9,3.6,1.3,Iris-versicolor +142,6.9,3.1,5.1,2.3,Iris-virginica +69,6.2,2.2,4.5,1.5,Iris-versicolor +83,5.8,2.7,3.9,1.2,Iris-versicolor +111,6.5,3.2,5.1,2.0,Iris-virginica +13,4.8,3.0,1.4,0.1,Iris-setosa +37,5.5,3.5,1.3,0.2,Iris-setosa +10,4.9,3.1,1.5,0.1,Iris-setosa +20,5.1,3.8,1.5,0.3,Iris-setosa +57,6.3,3.3,4.7,1.6,Iris-versicolor +105,6.5,3.0,5.8,2.2,Iris-virginica +70,5.6,2.5,3.9,1.1,Iris-versicolor +56,5.7,2.8,4.5,1.3,Iris-versicolor +133,6.4,2.8,5.6,2.2,Iris-virginica +30,4.7,3.2,1.6,0.2,Iris-setosa +128,6.1,3.0,4.9,1.8,Iris-virginica +27,5.0,3.4,1.6,0.4,Iris-setosa +129,6.4,2.8,5.6,2.1,Iris-virginica +132,7.9,3.8,6.4,2.0,Iris-virginica +146,6.7,3.0,5.2,2.3,Iris-virginica +109,6.7,2.5,5.8,1.8,Iris-virginica +144,6.8,3.2,5.9,2.3,Iris-virginica +46,4.8,3.0,1.4,0.3,Iris-setosa +31,4.8,3.1,1.6,0.2,Iris-setosa diff --git a/extras/data/iris_train.csv b/extras/data/iris_train.csv new file mode 100644 index 0000000000..0baf242fb0 --- /dev/null +++ b/extras/data/iris_train.csv @@ -0,0 +1,121 @@ +Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species +23,4.6,3.6,1.0,0.2,Iris-setosa +16,5.7,4.4,1.5,0.4,Iris-setosa +66,6.7,3.1,4.4,1.4,Iris-versicolor +12,4.8,3.4,1.6,0.2,Iris-setosa +43,4.4,3.2,1.3,0.2,Iris-setosa +147,6.3,2.5,5.0,1.9,Iris-virginica +52,6.4,3.2,4.5,1.5,Iris-versicolor +28,5.2,3.5,1.5,0.2,Iris-setosa +5,5.0,3.6,1.4,0.2,Iris-setosa +33,5.2,4.1,1.5,0.1,Iris-setosa +143,5.8,2.7,5.1,1.9,Iris-virginica +86,6.0,3.4,4.5,1.6,Iris-versicolor +87,6.7,3.1,4.7,1.5,Iris-versicolor +17,5.4,3.9,1.3,0.4,Iris-setosa +11,5.4,3.7,1.5,0.2,Iris-setosa +82,5.5,2.4,3.7,1.0,Iris-versicolor +134,6.3,2.8,5.1,1.5,Iris-virginica +138,6.4,3.1,5.5,1.8,Iris-virginica +76,6.6,3.0,4.4,1.4,Iris-versicolor +110,7.2,3.6,6.1,2.5,Iris-virginica +97,5.7,2.9,4.2,1.3,Iris-versicolor +106,7.6,3.0,6.6,2.1,Iris-virginica +67,5.6,3.0,4.5,1.5,Iris-versicolor +1,5.1,3.5,1.4,0.2,Iris-setosa +123,7.7,2.8,6.7,2.0,Iris-virginica +68,5.8,2.7,4.1,1.0,Iris-versicolor +29,5.2,3.4,1.4,0.2,Iris-setosa +41,5.0,3.5,1.3,0.3,Iris-setosa +45,5.1,3.8,1.9,0.4,Iris-setosa +61,5.0,2.0,3.5,1.0,Iris-versicolor +124,6.3,2.7,4.9,1.8,Iris-virginica +25,4.8,3.4,1.9,0.2,Iris-setosa +26,5.0,3.0,1.6,0.2,Iris-setosa +24,5.1,3.3,1.7,0.5,Iris-setosa +95,5.6,2.7,4.2,1.3,Iris-versicolor +40,5.1,3.4,1.5,0.2,Iris-setosa +96,5.7,3.0,4.2,1.2,Iris-versicolor +118,7.7,3.8,6.7,2.2,Iris-virginica +48,4.6,3.2,1.4,0.2,Iris-setosa +98,6.2,2.9,4.3,1.3,Iris-versicolor +114,5.7,2.5,5.0,2.0,Iris-virginica +34,5.5,4.2,1.4,0.2,Iris-setosa +139,6.0,3.0,4.8,1.8,Iris-virginica +102,5.8,2.7,5.1,1.9,Iris-virginica +63,6.0,2.2,4.0,1.0,Iris-versicolor +85,5.4,3.0,4.5,1.5,Iris-versicolor +149,6.2,3.4,5.4,2.3,Iris-virginica +54,5.5,2.3,4.0,1.3,Iris-versicolor +6,5.4,3.9,1.7,0.4,Iris-setosa +94,5.0,2.3,3.3,1.0,Iris-versicolor +112,6.4,2.7,5.3,1.9,Iris-virginica +50,5.0,3.3,1.4,0.2,Iris-setosa +36,5.0,3.2,1.2,0.2,Iris-setosa +81,5.5,2.4,3.8,1.1,Iris-versicolor +78,6.7,3.0,5.0,1.7,Iris-versicolor +35,4.9,3.1,1.5,0.1,Iris-setosa +115,5.8,2.8,5.1,2.4,Iris-virginica +8,5.0,3.4,1.5,0.2,Iris-setosa +44,5.0,3.5,1.6,0.6,Iris-setosa +71,5.9,3.2,4.8,1.8,Iris-versicolor +99,5.1,2.5,3.0,1.1,Iris-versicolor +121,6.9,3.2,5.7,2.3,Iris-virginica +84,6.0,2.7,5.1,1.6,Iris-versicolor +135,6.1,2.6,5.6,1.4,Iris-virginica +136,7.7,3.0,6.1,2.3,Iris-virginica +90,5.5,2.5,4.0,1.3,Iris-versicolor +9,4.4,2.9,1.4,0.2,Iris-setosa +14,4.3,3.0,1.1,0.1,Iris-setosa +120,6.0,2.2,5.0,1.5,Iris-virginica +126,7.2,3.2,6.0,1.8,Iris-virginica +4,4.6,3.1,1.5,0.2,Iris-setosa +18,5.1,3.5,1.4,0.3,Iris-setosa +39,4.4,3.0,1.3,0.2,Iris-setosa +73,6.3,2.5,4.9,1.5,Iris-versicolor +137,6.3,3.4,5.6,2.4,Iris-virginica +7,4.6,3.4,1.4,0.3,Iris-setosa +113,6.8,3.0,5.5,2.1,Iris-virginica +101,6.3,3.3,6.0,2.5,Iris-virginica +3,4.7,3.2,1.3,0.2,Iris-setosa +64,6.1,2.9,4.7,1.4,Iris-versicolor +55,6.5,2.8,4.6,1.5,Iris-versicolor +127,6.2,2.8,4.8,1.8,Iris-virginica +51,7.0,3.2,4.7,1.4,Iris-versicolor +116,6.4,3.2,5.3,2.3,Iris-virginica +47,5.1,3.8,1.6,0.2,Iris-setosa +140,6.9,3.1,5.4,2.1,Iris-virginica +62,5.9,3.0,4.2,1.5,Iris-versicolor +148,6.5,3.0,5.2,2.0,Iris-virginica +80,5.7,2.6,3.5,1.0,Iris-versicolor +60,5.2,2.7,3.9,1.4,Iris-versicolor +92,6.1,3.0,4.6,1.4,Iris-versicolor +42,4.5,2.3,1.3,0.3,Iris-setosa +59,6.6,2.9,4.6,1.3,Iris-versicolor +91,5.5,2.6,4.4,1.2,Iris-versicolor +49,5.3,3.7,1.5,0.2,Iris-setosa +89,5.6,3.0,4.1,1.3,Iris-versicolor +108,7.3,2.9,6.3,1.8,Iris-virginica +125,6.7,3.3,5.7,2.1,Iris-virginica +22,5.1,3.7,1.5,0.4,Iris-setosa +58,4.9,2.4,3.3,1.0,Iris-versicolor +145,6.7,3.3,5.7,2.5,Iris-virginica +130,7.2,3.0,5.8,1.6,Iris-virginica +38,4.9,3.1,1.5,0.1,Iris-setosa +141,6.7,3.1,5.6,2.4,Iris-virginica +2,4.9,3.0,1.4,0.2,Iris-setosa +53,6.9,3.1,4.9,1.5,Iris-versicolor +131,7.4,2.8,6.1,1.9,Iris-virginica +104,6.3,2.9,5.6,1.8,Iris-virginica +100,5.7,2.8,4.1,1.3,Iris-versicolor +117,6.5,3.0,5.5,1.8,Iris-virginica +88,6.3,2.3,4.4,1.3,Iris-versicolor +75,6.4,2.9,4.3,1.3,Iris-versicolor +122,5.6,2.8,4.9,2.0,Iris-virginica +150,5.9,3.0,5.1,1.8,Iris-virginica +21,5.4,3.4,1.7,0.2,Iris-setosa +72,6.1,2.8,4.0,1.3,Iris-versicolor +107,4.9,2.5,4.5,1.7,Iris-virginica +15,5.8,4.0,1.2,0.2,Iris-setosa +93,5.8,2.6,4.0,1.2,Iris-versicolor +103,7.1,3.0,5.9,2.1,Iris-virginica diff --git a/extras/model_config.json b/extras/model_config.json new file mode 100644 index 0000000000..271fd984a1 --- /dev/null +++ b/extras/model_config.json @@ -0,0 +1,10 @@ +{ + "model_config_list": [ + { + "config": { + "name": "iris_pipeline", + "base_path": "/models/iris_pipeline" + } + } + ] +} diff --git a/extras/pipeline/graph.pbtxt b/extras/pipeline/graph.pbtxt new file mode 100644 index 0000000000..8dfee9b121 --- /dev/null +++ b/extras/pipeline/graph.pbtxt @@ -0,0 +1,26 @@ +input_stream: "pipeline_input" +output_stream: "pipeline_output" + +node { + calculator: "InferenceCalculator" + input_stream: "pipeline_input" + output_stream: "trained_model_path" + options: { + [type.googleapis.com/openvino.CalculatorOptions] { + model_name: "iris_pipeline" + signature_name: "serving_default" + } + } +} + +node { + calculator: "InferenceCalculator" + input_stream: "trained_model_path" + output_stream: "pipeline_output" + options: { + [type.googleapis.com/openvino.CalculatorOptions] { + model_name: "iris_pipeline" + signature_name: "serving_default" + } + } +} \ No newline at end of file diff --git a/extras/pipeline/ovmsmodel.py b/extras/pipeline/ovmsmodel.py new file mode 100644 index 0000000000..c9eb7ee4e1 --- /dev/null +++ b/extras/pipeline/ovmsmodel.py @@ -0,0 +1,43 @@ +import pandas as pd +import numpy as np +import joblib +import os +import io +from pyovms import Tensor +from sklearn.linear_model import LogisticRegression +from skl2onnx import to_onnx +import onnx + +class OvmsPythonModel: + def initialize(self, kwargs): + print("Training handler initialized.") + + def execute(self, inputs): + print("Starting training...") + input_tensor = inputs[0] + input_data = input_tensor.as_numpy() + csv_str = input_data.tobytes().decode('utf-8') + + df = pd.read_csv(io.StringIO(csv_str)) + + X = df.iloc[:, :-1] + y = df.iloc[:, -1] + + model = LogisticRegression(max_iter=200) + model.fit(X, y) + + # Ensure output directory exists + output_dir = "/model/iris_logreg/1" + os.makedirs(output_dir, exist_ok=True) + + # Convert to ONNX and save to the versioned folder + onx = to_onnx(model, X[:1], target_opset=12) + output_path = os.path.join(output_dir, "logreg_model.onnx") + with open(output_path, "wb") as f: + f.write(onx.SerializeToString()) + + print(f"Model saved to {output_path}") + return [Tensor.from_numpy(np.array([True]))] + + def finalize(self): + print("Training handler finalized.") \ No newline at end of file