From 86b224ebb626233fb1e4cc1645e7bb6259b79fba Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:30:25 +0530 Subject: [PATCH 01/76] Logistic Regression-patch2 --- extras/iris_pipeline_project/Dockerfile | 16 ++ .../client/client_inference.py | 25 +++ .../client/client_train.py | 26 +++ .../data/Iris (copy).csv | 151 ++++++++++++++++++ .../iris_pipeline_project/data/data_slit.py | 9 ++ .../iris_pipeline_project/data/iris_test.csv | 31 ++++ .../iris_pipeline_project/data/iris_train.csv | 121 ++++++++++++++ .../model/iris_logreg/1/model.onnx | Bin 0 -> 684 bytes .../iris_pipeline_project/model_config.json | 10 ++ .../pipeline/graph.pbtxt | 31 ++++ .../pipeline/ovmsmodel.py | 41 +++++ 11 files changed, 461 insertions(+) create mode 100644 extras/iris_pipeline_project/Dockerfile create mode 100644 extras/iris_pipeline_project/client/client_inference.py create mode 100644 extras/iris_pipeline_project/client/client_train.py create mode 100644 extras/iris_pipeline_project/data/Iris (copy).csv create mode 100644 extras/iris_pipeline_project/data/data_slit.py create mode 100644 extras/iris_pipeline_project/data/iris_test.csv create mode 100644 extras/iris_pipeline_project/data/iris_train.csv create mode 100644 extras/iris_pipeline_project/model/iris_logreg/1/model.onnx create mode 100644 extras/iris_pipeline_project/model_config.json create mode 100644 extras/iris_pipeline_project/pipeline/graph.pbtxt create mode 100644 extras/iris_pipeline_project/pipeline/ovmsmodel.py diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile new file mode 100644 index 0000000000..9028e545ff --- /dev/null +++ b/extras/iris_pipeline_project/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/iris_pipeline_project/client/client_inference.py b/extras/iris_pipeline_project/client/client_inference.py new file mode 100644 index 0000000000..cd356133db --- /dev/null +++ b/extras/iris_pipeline_project/client/client_inference.py @@ -0,0 +1,25 @@ +import numpy as np +import tritonclient.grpc as grpcclient +import pandas as pd + + +X_test = pd.read_csv("/home/harshitha/iris_pipeline_project/data/iris_test.csv") +X_test = X_test.values.astype(np.float32) + +input_name = "input" +output_name = "output_label" + +inputs = [] +infer_input = grpcclient.InferInput(input_name, X_test.shape, "FP32") +infer_input.set_data_from_numpy(X_test) +inputs.append(infer_input) + +outputs = [grpcclient.InferRequestedOutput(output_name)] + +client = grpcclient.InferenceServerClient(url="localhost:9000") + +model_name = "iris_logreg" +response = client.infer(model_name=model_name, inputs=inputs, outputs=outputs) + +predictions = response.as_numpy(output_name) +print("Predictions:", predictions) \ No newline at end of file diff --git a/extras/iris_pipeline_project/client/client_train.py b/extras/iris_pipeline_project/client/client_train.py new file mode 100644 index 0000000000..31807441e0 --- /dev/null +++ b/extras/iris_pipeline_project/client/client_train.py @@ -0,0 +1,26 @@ +import numpy as np +import pandas as pd +import tritonclient.grpc as grpcclient + +data = pd.read_csv("/home/harshitha/iris_pipeline_project/data/iris_train.csv") +df = pd.DataFrame(data) + +csv_str = df.to_csv(index=False) +csv_bytes = np.frombuffer(csv_str.encode('utf-8'), dtype=np.uint8) + +input_name = "input" +input = [] +infer_input = grpcclient.InferInput(input_name, csv_bytes.shape, "UINT8") +infer_input.set_data_from_numpy(csv_bytes) +input.append(infer_input) + +output_name = "output_label" +output_label = [grpcclient.InferRequestedOutput(output_name)] + +client = grpcclient.InferenceServerClient(url="localhost:9000") + +model_name = "iris_pipeline" +response = client.infer(model_name=model_name, inputs=input, outputs=output_label) + +result = response.as_numpy(output_name) +print("Training result:", result) \ No newline at end of file diff --git a/extras/iris_pipeline_project/data/Iris (copy).csv b/extras/iris_pipeline_project/data/Iris (copy).csv new file mode 100644 index 0000000000..1bf42f2549 --- /dev/null +++ b/extras/iris_pipeline_project/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/iris_pipeline_project/data/data_slit.py b/extras/iris_pipeline_project/data/data_slit.py new file mode 100644 index 0000000000..93686ae0ac --- /dev/null +++ b/extras/iris_pipeline_project/data/data_slit.py @@ -0,0 +1,9 @@ +import pandas as pd +from sklearn.model_selection import train_test_split + +df = pd.read_csv('data/Iris (copy).csv') + +train_df, test_df = train_test_split(df, test_size=0.2, random_state=42, shuffle=True) + +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/iris_pipeline_project/data/iris_test.csv b/extras/iris_pipeline_project/data/iris_test.csv new file mode 100644 index 0000000000..c70ca719dc --- /dev/null +++ b/extras/iris_pipeline_project/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/iris_pipeline_project/data/iris_train.csv b/extras/iris_pipeline_project/data/iris_train.csv new file mode 100644 index 0000000000..0baf242fb0 --- /dev/null +++ b/extras/iris_pipeline_project/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/iris_pipeline_project/model/iris_logreg/1/model.onnx b/extras/iris_pipeline_project/model/iris_logreg/1/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/extras/iris_pipeline_project/model_config.json b/extras/iris_pipeline_project/model_config.json new file mode 100644 index 0000000000..271fd984a1 --- /dev/null +++ b/extras/iris_pipeline_project/model_config.json @@ -0,0 +1,10 @@ +{ + "model_config_list": [ + { + "config": { + "name": "iris_pipeline", + "base_path": "/models/iris_pipeline" + } + } + ] +} diff --git a/extras/iris_pipeline_project/pipeline/graph.pbtxt b/extras/iris_pipeline_project/pipeline/graph.pbtxt new file mode 100644 index 0000000000..e4c684b144 --- /dev/null +++ b/extras/iris_pipeline_project/pipeline/graph.pbtxt @@ -0,0 +1,31 @@ +input_stream: "pipeline_input" +output_stream: "pipeline_output" + +node { + calculator: "OpenVINOModelServerSessionCalculator" + output_side_packet: "SESSION:session" + node_options { + [type.googleapis.com/mediapipe.OpenVINOModelServerSessionCalculatorOptions] { + servable_name: "iris_pipeline" + } + } +} + +node { + calculator: "OpenVINOInferenceCalculator" + input_side_packet: "SESSION:session" + input_stream: "A:pipeline_input" + output_stream: "B:pipeline_output" + node_options { + [type.googleapis.com/mediapipe.OpenVINOInferenceCalculatorOptions] { + tag_to_input_tensor_names { + key: "A" + value: "input" + } + tag_to_output_tensor_names { + key: "B" + value: "output" + } + } + } +} \ No newline at end of file diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py new file mode 100644 index 0000000000..74a4bc65b5 --- /dev/null +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -0,0 +1,41 @@ +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) + + output_dir = "/model/iris_logreg/1" + os.makedirs(output_dir, exist_ok=True) + + 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 From 297909d25d5245836aea2d2b20c2f2b5f8f9757f Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 26 Jun 2025 15:08:54 +0530 Subject: [PATCH 02/76] Update extras/iris_pipeline_project/model_config.json MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Miłosz Żeglarski --- extras/iris_pipeline_project/model_config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/model_config.json b/extras/iris_pipeline_project/model_config.json index 271fd984a1..f6aa379edf 100644 --- a/extras/iris_pipeline_project/model_config.json +++ b/extras/iris_pipeline_project/model_config.json @@ -3,7 +3,7 @@ { "config": { "name": "iris_pipeline", - "base_path": "/models/iris_pipeline" + "base_path": "/models/iris_logreg" } } ] From 620ae6093533f10d08640d40db1e11e4ecfae0b2 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 26 Jun 2025 15:11:29 +0530 Subject: [PATCH 03/76] Update extras/iris_pipeline_project/pipeline/ovmsmodel.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Miłosz Żeglarski --- extras/iris_pipeline_project/pipeline/ovmsmodel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 74a4bc65b5..49c85cbc8f 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -35,7 +35,7 @@ def execute(self, inputs): f.write(onx.SerializeToString()) print(f"Model saved to {output_path}") - return [Tensor.from_numpy(np.array([True]))] + return [Tensor("output", (np.array([True]))] def finalize(self): print("Training handler finalized.") \ No newline at end of file From e5af86b5bc8223084e17ab8d0a0285aa8d45d5f6 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:32:09 +0530 Subject: [PATCH 04/76] Update model_config.json --- extras/iris_pipeline_project/model_config.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/extras/iris_pipeline_project/model_config.json b/extras/iris_pipeline_project/model_config.json index f6aa379edf..2cfe59cfd2 100644 --- a/extras/iris_pipeline_project/model_config.json +++ b/extras/iris_pipeline_project/model_config.json @@ -1,10 +1,9 @@ { - "model_config_list": [ + "model_config_list": [], + "mediapipe_config_list": [ { - "config": { - "name": "iris_pipeline", - "base_path": "/models/iris_logreg" - } + "name": "pipeline", + "graph_path": "/workspace/pipeline/graph.pbtxt" } ] } From 96c19532ce89f93e134f96ffbc9b5e05d5c38cba Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:32:35 +0530 Subject: [PATCH 05/76] Update Dockerfile --- extras/iris_pipeline_project/Dockerfile | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile index 9028e545ff..20bea32da2 100644 --- a/extras/iris_pipeline_project/Dockerfile +++ b/extras/iris_pipeline_project/Dockerfile @@ -5,12 +5,9 @@ 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 +RUN pip3 install --break-system-packages pandas numpy scikit-learn joblib skl2onnx onnx onnxruntime + -ENTRYPOINT ["/ovms/bin/ovms", "--config_path", "/model_config.json"] \ No newline at end of file +WORKDIR /workspace +ENTRYPOINT ["/ovms/bin/ovms", "--config_path", "/model_config.json", "--grpc_port", "9000"] From e64e7a1877d2d3ade1b213e19be47691c629b888 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:33:05 +0530 Subject: [PATCH 06/76] Update graph.pbtxt --- .../pipeline/graph.pbtxt | 36 ++++++------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/graph.pbtxt b/extras/iris_pipeline_project/pipeline/graph.pbtxt index e4c684b144..7eb12f8593 100644 --- a/extras/iris_pipeline_project/pipeline/graph.pbtxt +++ b/extras/iris_pipeline_project/pipeline/graph.pbtxt @@ -1,31 +1,15 @@ -input_stream: "pipeline_input" -output_stream: "pipeline_output" +input_stream: "OVMS_PY_TENSOR:pipeline_input" +output_stream: "OVMS_PY_TENSOR:pipeline_output" node { - calculator: "OpenVINOModelServerSessionCalculator" - output_side_packet: "SESSION:session" - node_options { - [type.googleapis.com/mediapipe.OpenVINOModelServerSessionCalculatorOptions] { - servable_name: "iris_pipeline" + name: "python_node" + calculator: "PythonExecutorCalculator" + input_side_packet: "PYTHON_NODE_RESOURCES:py" + input_stream: "PIPELINE_INPUT:pipeline_input" + output_stream: "PIPELINE_OUTPUT:pipeline_output" + node_options: { + [type.googleapis.com/mediapipe.PythonExecutorCalculatorOptions]: { + handler_path: "/workspace/pipeline/ovmsmodel.py" } } } - -node { - calculator: "OpenVINOInferenceCalculator" - input_side_packet: "SESSION:session" - input_stream: "A:pipeline_input" - output_stream: "B:pipeline_output" - node_options { - [type.googleapis.com/mediapipe.OpenVINOInferenceCalculatorOptions] { - tag_to_input_tensor_names { - key: "A" - value: "input" - } - tag_to_output_tensor_names { - key: "B" - value: "output" - } - } - } -} \ No newline at end of file From 5e1439e47f1d5dd27e99943fdce0df8132364b5e Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:33:34 +0530 Subject: [PATCH 07/76] Update ovmsmodel.py --- .../pipeline/ovmsmodel.py | 83 ++++++++++++------- 1 file changed, 52 insertions(+), 31 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 49c85cbc8f..37c2ba45eb 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -1,41 +1,62 @@ -import pandas as pd import numpy as np -import joblib +import pandas as pd import os -import io -from pyovms import Tensor +import json +from skl2onnx import convert_sklearn +from skl2onnx.common.data_types import FloatTensorType from sklearn.linear_model import LogisticRegression -from skl2onnx import to_onnx -import onnx +import onnxruntime as ort + +MODEL_PATH = "/workspace/model/iris_logreg/1/model.onnx" +LABEL_COLUMN = "species" 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) - - output_dir = "/model/iris_logreg/1" - os.makedirs(output_dir, exist_ok=True) - - 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("output", (np.array([True]))] + def execute(self, inputs, outputs, parameters, context): + # Expecting a dict: {"mode": "train" or "infer", "data": } + input_bytes = inputs["pipeline_input"] + try: + input_str = input_bytes.tobytes().decode('utf-8') + input_obj = json.loads(input_str) + mode = input_obj.get("mode") + csv_str = input_obj.get("data") + except Exception as e: + outputs["pipeline_output"] = np.array([f"ERROR: Invalid input format: {e}"], dtype=object) + return + + try: + df = pd.read_csv(pd.compat.StringIO(csv_str)) + except Exception as e: + outputs["pipeline_output"] = np.array([f"ERROR: Could not parse CSV: {e}"], dtype=object) + return + + if mode == "train": + if LABEL_COLUMN not in df.columns: + outputs["pipeline_output"] = np.array([f"ERROR: Training data must include label column '{LABEL_COLUMN}'"], dtype=object) + return + X = df.drop(columns=[LABEL_COLUMN]) + y = df[LABEL_COLUMN] + model = LogisticRegression(max_iter=200) + model.fit(X, y) + os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True) + initial_type = [('float_input', FloatTensorType([None, X.shape[1]]))] + onnx_model = convert_sklearn(model, initial_types=initial_type) + with open(MODEL_PATH, "wb") as f: + f.write(onnx_model.SerializeToString()) + outputs["pipeline_output"] = np.array(["training complete"], dtype=object) + elif mode == "infer": + if not os.path.exists(MODEL_PATH): + outputs["pipeline_output"] = np.array(["ERROR: Model not trained yet"], dtype=object) + return + X = df.values.astype(np.float32) + sess = ort.InferenceSession(MODEL_PATH) + input_name = sess.get_inputs()[0].name + preds = sess.run(None, {input_name: X})[0] + outputs["pipeline_output"] = preds + else: + outputs["pipeline_output"] = np.array([f"ERROR: Unknown mode '{mode}'"], dtype=object) def finalize(self): - print("Training handler finalized.") \ No newline at end of file + print("Training handler finalized.") From 930aaa885024a5c5db27222731ee1ce5a5c90462 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Fri, 27 Jun 2025 12:54:54 +0530 Subject: [PATCH 08/76] Create .gitignore --- extras/iris_pipeline_project/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 extras/iris_pipeline_project/.gitignore diff --git a/extras/iris_pipeline_project/.gitignore b/extras/iris_pipeline_project/.gitignore new file mode 100644 index 0000000000..c59be3231e --- /dev/null +++ b/extras/iris_pipeline_project/.gitignore @@ -0,0 +1,2 @@ +iris_train.csv +iris_test.csv From ca366cad01cd977164ca2d01a398ea3b5d48dd9c Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Fri, 27 Jun 2025 13:04:32 +0530 Subject: [PATCH 09/76] Delete extras/iris_pipeline_project/data directory --- .../data/Iris (copy).csv | 151 ------------------ .../iris_pipeline_project/data/data_slit.py | 9 -- .../iris_pipeline_project/data/iris_test.csv | 31 ---- .../iris_pipeline_project/data/iris_train.csv | 121 -------------- 4 files changed, 312 deletions(-) delete mode 100644 extras/iris_pipeline_project/data/Iris (copy).csv delete mode 100644 extras/iris_pipeline_project/data/data_slit.py delete mode 100644 extras/iris_pipeline_project/data/iris_test.csv delete mode 100644 extras/iris_pipeline_project/data/iris_train.csv diff --git a/extras/iris_pipeline_project/data/Iris (copy).csv b/extras/iris_pipeline_project/data/Iris (copy).csv deleted file mode 100644 index 1bf42f2549..0000000000 --- a/extras/iris_pipeline_project/data/Iris (copy).csv +++ /dev/null @@ -1,151 +0,0 @@ -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/iris_pipeline_project/data/data_slit.py b/extras/iris_pipeline_project/data/data_slit.py deleted file mode 100644 index 93686ae0ac..0000000000 --- a/extras/iris_pipeline_project/data/data_slit.py +++ /dev/null @@ -1,9 +0,0 @@ -import pandas as pd -from sklearn.model_selection import train_test_split - -df = pd.read_csv('data/Iris (copy).csv') - -train_df, test_df = train_test_split(df, test_size=0.2, random_state=42, shuffle=True) - -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/iris_pipeline_project/data/iris_test.csv b/extras/iris_pipeline_project/data/iris_test.csv deleted file mode 100644 index c70ca719dc..0000000000 --- a/extras/iris_pipeline_project/data/iris_test.csv +++ /dev/null @@ -1,31 +0,0 @@ -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/iris_pipeline_project/data/iris_train.csv b/extras/iris_pipeline_project/data/iris_train.csv deleted file mode 100644 index 0baf242fb0..0000000000 --- a/extras/iris_pipeline_project/data/iris_train.csv +++ /dev/null @@ -1,121 +0,0 @@ -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 From 8a3097d1de130a635b5883b1ae6dd48544553477 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sat, 28 Jun 2025 23:01:41 +0530 Subject: [PATCH 10/76] Update .gitignore --- extras/iris_pipeline_project/.gitignore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extras/iris_pipeline_project/.gitignore b/extras/iris_pipeline_project/.gitignore index c59be3231e..8fce603003 100644 --- a/extras/iris_pipeline_project/.gitignore +++ b/extras/iris_pipeline_project/.gitignore @@ -1,2 +1 @@ -iris_train.csv -iris_test.csv +data/ From 3cdf97c1d184eaa7467d8a694c03d399abb2dd1b Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sat, 28 Jun 2025 23:03:50 +0530 Subject: [PATCH 11/76] Add files via upload --- .../data/Iris (copy).csv | 151 ++++++++++++++++++ .../iris_pipeline_project/data/data_slit.py | 9 ++ .../iris_pipeline_project/data/iris_test.csv | 31 ++++ .../iris_pipeline_project/data/iris_train.csv | 121 ++++++++++++++ 4 files changed, 312 insertions(+) create mode 100644 extras/iris_pipeline_project/data/Iris (copy).csv create mode 100644 extras/iris_pipeline_project/data/data_slit.py create mode 100644 extras/iris_pipeline_project/data/iris_test.csv create mode 100644 extras/iris_pipeline_project/data/iris_train.csv diff --git a/extras/iris_pipeline_project/data/Iris (copy).csv b/extras/iris_pipeline_project/data/Iris (copy).csv new file mode 100644 index 0000000000..1bf42f2549 --- /dev/null +++ b/extras/iris_pipeline_project/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/iris_pipeline_project/data/data_slit.py b/extras/iris_pipeline_project/data/data_slit.py new file mode 100644 index 0000000000..93686ae0ac --- /dev/null +++ b/extras/iris_pipeline_project/data/data_slit.py @@ -0,0 +1,9 @@ +import pandas as pd +from sklearn.model_selection import train_test_split + +df = pd.read_csv('data/Iris (copy).csv') + +train_df, test_df = train_test_split(df, test_size=0.2, random_state=42, shuffle=True) + +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/iris_pipeline_project/data/iris_test.csv b/extras/iris_pipeline_project/data/iris_test.csv new file mode 100644 index 0000000000..c70ca719dc --- /dev/null +++ b/extras/iris_pipeline_project/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/iris_pipeline_project/data/iris_train.csv b/extras/iris_pipeline_project/data/iris_train.csv new file mode 100644 index 0000000000..0baf242fb0 --- /dev/null +++ b/extras/iris_pipeline_project/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 From f9387405b706b6f915e37f97312295cee9e8a41a Mon Sep 17 00:00:00 2001 From: darksapien23151 Date: Sun, 29 Jun 2025 02:36:31 +0530 Subject: [PATCH 12/76] Removed data folder --- .../data/Iris (copy).csv | 151 ------------------ .../iris_pipeline_project/data/data_slit.py | 9 -- .../iris_pipeline_project/data/iris_test.csv | 31 ---- .../iris_pipeline_project/data/iris_train.csv | 121 -------------- 4 files changed, 312 deletions(-) delete mode 100644 extras/iris_pipeline_project/data/Iris (copy).csv delete mode 100644 extras/iris_pipeline_project/data/data_slit.py delete mode 100644 extras/iris_pipeline_project/data/iris_test.csv delete mode 100644 extras/iris_pipeline_project/data/iris_train.csv diff --git a/extras/iris_pipeline_project/data/Iris (copy).csv b/extras/iris_pipeline_project/data/Iris (copy).csv deleted file mode 100644 index 1bf42f2549..0000000000 --- a/extras/iris_pipeline_project/data/Iris (copy).csv +++ /dev/null @@ -1,151 +0,0 @@ -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/iris_pipeline_project/data/data_slit.py b/extras/iris_pipeline_project/data/data_slit.py deleted file mode 100644 index 93686ae0ac..0000000000 --- a/extras/iris_pipeline_project/data/data_slit.py +++ /dev/null @@ -1,9 +0,0 @@ -import pandas as pd -from sklearn.model_selection import train_test_split - -df = pd.read_csv('data/Iris (copy).csv') - -train_df, test_df = train_test_split(df, test_size=0.2, random_state=42, shuffle=True) - -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/iris_pipeline_project/data/iris_test.csv b/extras/iris_pipeline_project/data/iris_test.csv deleted file mode 100644 index c70ca719dc..0000000000 --- a/extras/iris_pipeline_project/data/iris_test.csv +++ /dev/null @@ -1,31 +0,0 @@ -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/iris_pipeline_project/data/iris_train.csv b/extras/iris_pipeline_project/data/iris_train.csv deleted file mode 100644 index 0baf242fb0..0000000000 --- a/extras/iris_pipeline_project/data/iris_train.csv +++ /dev/null @@ -1,121 +0,0 @@ -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 From b28a63eae29daa8c42db757c30c7c60ff5397054 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 1 Jul 2025 13:13:43 +0530 Subject: [PATCH 13/76] Create README.md --- extras/iris_pipeline_project/README.md | 115 +++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 extras/iris_pipeline_project/README.md diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md new file mode 100644 index 0000000000..bd000f67a7 --- /dev/null +++ b/extras/iris_pipeline_project/README.md @@ -0,0 +1,115 @@ +# OVMS Iris Pipeline Example + +This repository demonstrates how to use OpenVINO Model Server (OVMS) with a custom Mediapipe pipeline for the Iris dataset, including both model training and inference through a Python client. + +--- + +## Step 1: Clone the Repository + +```bash +git clone https://github.com/openvinotoolkit/model_server.git +cd [need to fix] +``` +--- + + +## Step 2: Build and Run OVMS Docker Image + +### 2.1. Build the Docker Image + +```bash +docker build -t ovms-iris-pipeline . +``` + +### 2.2. Run the OVMS Container + +```bash +docker run docker run --rm -it --name iris_6 -v "$PWD:/workspace" -p 9000:9000 iris_6 --config_path /workspace/model_config.json --port 9000 +``` +- **Note:** Adjust `$(pwd)` if you are running from a different working directory. + +--- + +## Step 3: Project Structure + +``` +client/ + ├── client_inference.py + └── client_train.py +model/ + └── iris_logreg/1/model.onnx +pipeline/ + ├── __pycache__/ + ├── graph.pbtxt + └── ovmsmodel.py +Dockerfile +model_config.json +``` + +--- + +## Step 4: Run Training and Inference + +### 4.1. Training + +```bash +python client/client_train.py train data/iris_train.csv +``` + +### 4.2. Inference + +```bash +python client/client_train.py infer data/iris_test.csv +# OR +python client/client_inference.py infer data/iris_test.csv +``` + +--- + +## Input Format + +The pipeline expects input as a JSON object, sent as a single-element numpy array of bytes (`dtype=object`): + +```json +{ + "mode": "train" | "infer", + "data": "" +} +``` + +--- + +## Troubleshooting + +- **Logs:** + For debugging, check OVMS container logs: + ```bash + docker logs iris_6 + ``` +- **Code Changes:** + After editing `pipeline/ovmsmodel.py`, **restart the OVMS container** for changes to take effect. + +- **If nothing prints from your Python node:** + - Use `flush=True` in your print statements. + - Print to `sys.stderr`. + - Try writing to a file inside the container for debug. + +--- + +## Example Output + +``` +read CSV file successfully +Training mode detected. Preparing data for training... +prepped payload +Connected to OVMS at localhost:9000 +MODEL_NAME: pipeline +infer_input: pipeline_input [1] +Server response: [...] +``` + +--- + +## 📄 License + +MIT License From e7a6f1f253097900c984fc649a1320b501f39b64 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:08:58 +0530 Subject: [PATCH 14/76] Update client_train.py --- .../client/client_train.py | 83 +++++++++++++++---- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/extras/iris_pipeline_project/client/client_train.py b/extras/iris_pipeline_project/client/client_train.py index 31807441e0..fe5e3237da 100644 --- a/extras/iris_pipeline_project/client/client_train.py +++ b/extras/iris_pipeline_project/client/client_train.py @@ -1,26 +1,75 @@ -import numpy as np +import os +import sys import pandas as pd +import numpy as np import tritonclient.grpc as grpcclient +import json + +def main(): + DEFAULT_CSV = "workspace/data/iris_train.csv" + SERVER_URL = "localhost:9000" + MODEL_NAME = "pipeline" + + if len(sys.argv) < 3 or sys.argv[1] not in ("train", "infer"): + print("Usage: python client_train.py ") + sys.exit(1) + + mode = sys.argv[1] + csv_path = sys.argv[2] + + if not os.path.isfile(csv_path): + print(f"ERROR: Could not find CSV file: {csv_path}") + print("Please check your path and try again.") + sys.exit(1) + + try: + df = pd.read_csv(csv_path) + print("read CSV file successfully") + except Exception as e: + print(f"ERROR: Could not read CSV file: {e}") + sys.exit(1) + + if mode == "train": + if "Species" not in df.columns: + print("ERROR: Training CSV must contain a 'species' column as the label.") + sys.exit(1) + print("Training mode detected. Preparing data for training...") + + csv_str = df.to_csv(index=False) -data = pd.read_csv("/home/harshitha/iris_pipeline_project/data/iris_train.csv") -df = pd.DataFrame(data) + input_dict = { + "mode": mode, + "data": csv_str + } -csv_str = df.to_csv(index=False) -csv_bytes = np.frombuffer(csv_str.encode('utf-8'), dtype=np.uint8) + input_bytes = json.dumps(input_dict).encode("utf-8") -input_name = "input" -input = [] -infer_input = grpcclient.InferInput(input_name, csv_bytes.shape, "UINT8") -infer_input.set_data_from_numpy(csv_bytes) -input.append(infer_input) + pipeline_input = np.array([input_bytes], dtype=object) -output_name = "output_label" -output_label = [grpcclient.InferRequestedOutput(output_name)] + inputs = {"pipeline_input": pipeline_input} + print("prepped payload") -client = grpcclient.InferenceServerClient(url="localhost:9000") + try: + client = grpcclient.InferenceServerClient(url=SERVER_URL) + print(f"Connected to OVMS at {SERVER_URL}") + except Exception as e: + print(f"ERROR: Could not connect to OVMS at {SERVER_URL}: {e}") + sys.exit(1) -model_name = "iris_pipeline" -response = client.infer(model_name=model_name, inputs=input, outputs=output_label) + infer_input = grpcclient.InferInput("pipeline_input", pipeline_input.shape, "BYTES") + infer_input.set_data_from_numpy(pipeline_input) + print("MODEL_NAME:", MODEL_NAME) + print("infer_input:", infer_input.name(), infer_input.shape()) + try: + response = client.infer( + model_name=MODEL_NAME, + inputs=[infer_input] + ) + result = response.as_numpy("pipeline_output") + print("Server response:", result) + except Exception as e: + print(f"ERROR: Inference call failed: {e}") + sys.exit(1) -result = response.as_numpy(output_name) -print("Training result:", result) \ No newline at end of file +if __name__ == "__main__": + main() From d70052ef629b575f688c61562b29893800de9ac7 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 3 Jul 2025 08:25:57 +0530 Subject: [PATCH 15/76] Update ovmsmodel.py --- .../pipeline/ovmsmodel.py | 108 ++++++++++-------- 1 file changed, 62 insertions(+), 46 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 37c2ba45eb..5c8170c430 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -1,62 +1,78 @@ -import numpy as np -import pandas as pd import os +import sys import json +import numpy as np +import pandas as pd +from sklearn.linear_model import LogisticRegression from skl2onnx import convert_sklearn from skl2onnx.common.data_types import FloatTensorType -from sklearn.linear_model import LogisticRegression import onnxruntime as ort +from pyovms import Tensor + +from io import StringIO # Use this for reading CSV from string MODEL_PATH = "/workspace/model/iris_logreg/1/model.onnx" -LABEL_COLUMN = "species" +LABEL_COLUMN = "Species" class OvmsPythonModel: def initialize(self, kwargs): - print("Training handler initialized.") + print("[initialize] Python node initialized", file=sys.stderr, flush=True) - def execute(self, inputs, outputs, parameters, context): - # Expecting a dict: {"mode": "train" or "infer", "data": } - input_bytes = inputs["pipeline_input"] - try: - input_str = input_bytes.tobytes().decode('utf-8') - input_obj = json.loads(input_str) - mode = input_obj.get("mode") - csv_str = input_obj.get("data") - except Exception as e: - outputs["pipeline_output"] = np.array([f"ERROR: Invalid input format: {e}"], dtype=object) - return + def execute(self, inputs): + print("==== [execute] Python node called ====", file=sys.stderr, flush=True) try: - df = pd.read_csv(pd.compat.StringIO(csv_str)) + input_tensor = inputs[0] # pyovms.Tensor + input_data = input_tensor.data # Raw bytes + payload = json.loads(input_data.decode("utf-8")) + + mode = payload.get("mode") + csv_str = payload.get("data") + if not isinstance(csv_str, str): + raise ValueError("Missing or invalid 'data' field") + + df = pd.read_csv(StringIO(csv_str)) + + if mode == "train": + if LABEL_COLUMN not in df.columns: + raise ValueError(f"Missing label column '{LABEL_COLUMN}' in input data") + + X = df.drop(columns=[LABEL_COLUMN]).values.astype(np.float32) + y = df[LABEL_COLUMN].values + + model = LogisticRegression(max_iter=200) + model.fit(X, y) + + os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True) + initial_type = [('float_input', FloatTensorType([None, X.shape[1]]))] + onnx_model = convert_sklearn(model, initial_types=initial_type) + with open(MODEL_PATH, "wb") as f: + f.write(onnx_model.SerializeToString()) + + result = "training complete".encode("utf-8") + return [Tensor("pipeline_output", result)] + + elif mode == "infer": + if not os.path.exists(MODEL_PATH): + raise FileNotFoundError("Model not trained yet") + + X = df.values.astype(np.float32) + sess = ort.InferenceSession(MODEL_PATH) + input_name = sess.get_inputs()[0].name + preds = sess.run(None, {input_name: X})[0] + + result = json.dumps(preds.tolist()).encode("utf-8") + return [Tensor("pipeline_output", result)] + + else: + raise ValueError(f"Unknown mode '{mode}'") + except Exception as e: - outputs["pipeline_output"] = np.array([f"ERROR: Could not parse CSV: {e}"], dtype=object) - return - - if mode == "train": - if LABEL_COLUMN not in df.columns: - outputs["pipeline_output"] = np.array([f"ERROR: Training data must include label column '{LABEL_COLUMN}'"], dtype=object) - return - X = df.drop(columns=[LABEL_COLUMN]) - y = df[LABEL_COLUMN] - model = LogisticRegression(max_iter=200) - model.fit(X, y) - os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True) - initial_type = [('float_input', FloatTensorType([None, X.shape[1]]))] - onnx_model = convert_sklearn(model, initial_types=initial_type) - with open(MODEL_PATH, "wb") as f: - f.write(onnx_model.SerializeToString()) - outputs["pipeline_output"] = np.array(["training complete"], dtype=object) - elif mode == "infer": - if not os.path.exists(MODEL_PATH): - outputs["pipeline_output"] = np.array(["ERROR: Model not trained yet"], dtype=object) - return - X = df.values.astype(np.float32) - sess = ort.InferenceSession(MODEL_PATH) - input_name = sess.get_inputs()[0].name - preds = sess.run(None, {input_name: X})[0] - outputs["pipeline_output"] = preds - else: - outputs["pipeline_output"] = np.array([f"ERROR: Unknown mode '{mode}'"], dtype=object) + print(f"[ERROR] Exception in execute: {e}", file=sys.stderr) + import traceback + traceback.print_exc(file=sys.stderr) + error_msg = f"ERROR: {str(e)}".encode("utf-8") + return [Tensor("pipeline_output", error_msg)] def finalize(self): - print("Training handler finalized.") + print("[finalize] Python node finalized", file=sys.stderr, flush=True) From 0bf9bee3f6de9c15ae3c29ab6f68264ced8efb0b Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 3 Jul 2025 08:27:31 +0530 Subject: [PATCH 16/76] Update ovmsmodel.py --- extras/iris_pipeline_project/pipeline/ovmsmodel.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 5c8170c430..895586a3a5 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -9,7 +9,7 @@ import onnxruntime as ort from pyovms import Tensor -from io import StringIO # Use this for reading CSV from string +from io import StringIO MODEL_PATH = "/workspace/model/iris_logreg/1/model.onnx" LABEL_COLUMN = "Species" @@ -22,12 +22,14 @@ def execute(self, inputs): print("==== [execute] Python node called ====", file=sys.stderr, flush=True) try: - input_tensor = inputs[0] # pyovms.Tensor - input_data = input_tensor.data # Raw bytes + input_tensor = inputs[0] + input_data = input_tensor.data payload = json.loads(input_data.decode("utf-8")) + print("received data" , flush=True) mode = payload.get("mode") csv_str = payload.get("data") + if not isinstance(csv_str, str): raise ValueError("Missing or invalid 'data' field") @@ -60,6 +62,7 @@ def execute(self, inputs): sess = ort.InferenceSession(MODEL_PATH) input_name = sess.get_inputs()[0].name preds = sess.run(None, {input_name: X})[0] + print("inference made", flush = True) result = json.dumps(preds.tolist()).encode("utf-8") return [Tensor("pipeline_output", result)] From 1053f5fe8f6a719d0caeba6f686b6f975b72d9f0 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 3 Jul 2025 17:09:46 +0530 Subject: [PATCH 17/76] Update README.md --- extras/iris_pipeline_project/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index bd000f67a7..88dea66b05 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -18,13 +18,13 @@ cd [need to fix] ### 2.1. Build the Docker Image ```bash -docker build -t ovms-iris-pipeline . +docker build --no-cache -t iris_7 . ``` ### 2.2. Run the OVMS Container ```bash -docker run docker run --rm -it --name iris_6 -v "$PWD:/workspace" -p 9000:9000 iris_6 --config_path /workspace/model_config.json --port 9000 +docker run --rm -it -v "$PWD:/workspace" -p 9000:9000 -p 8000:8000 iris_7 --config_path /workspace/model_config.json --port 9000 --rest_port 8000 ``` - **Note:** Adjust `$(pwd)` if you are running from a different working directory. @@ -84,7 +84,7 @@ The pipeline expects input as a JSON object, sent as a single-element numpy arra - **Logs:** For debugging, check OVMS container logs: ```bash - docker logs iris_6 + docker logs iris_7 ``` - **Code Changes:** After editing `pipeline/ovmsmodel.py`, **restart the OVMS container** for changes to take effect. From 860a88911cbc0524892c5fab4e38251f1da50280 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Thu, 3 Jul 2025 17:10:16 +0530 Subject: [PATCH 18/76] Update Dockerfile --- extras/iris_pipeline_project/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile index 20bea32da2..31e6313d10 100644 --- a/extras/iris_pipeline_project/Dockerfile +++ b/extras/iris_pipeline_project/Dockerfile @@ -6,8 +6,8 @@ ENV LD_LIBRARY_PATH=/ovms/lib ENV PYTHONPATH=/ovms/lib/python RUN apt-get update && apt-get install -y python3-pip -RUN pip3 install --break-system-packages pandas numpy scikit-learn joblib skl2onnx onnx onnxruntime +RUN pip install --break-system-packages pandas numpy scikit-learn joblib skl2onnx onnx onnxruntime WORKDIR /workspace -ENTRYPOINT ["/ovms/bin/ovms", "--config_path", "/model_config.json", "--grpc_port", "9000"] +ENTRYPOINT ["/ovms/bin/ovms"] From f56008b47ab9e84cf74113b59719479c1bf71876 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sun, 6 Jul 2025 22:24:07 +0530 Subject: [PATCH 19/76] Update .gitignore --- extras/iris_pipeline_project/.gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/extras/iris_pipeline_project/.gitignore b/extras/iris_pipeline_project/.gitignore index 8fce603003..dc37c42dba 100644 --- a/extras/iris_pipeline_project/.gitignore +++ b/extras/iris_pipeline_project/.gitignore @@ -1 +1,4 @@ data/ +model/ +client/ + From dc5f52e9fe32b77c3915a6d662b97e16739416fd Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 7 Jul 2025 23:00:10 +0530 Subject: [PATCH 20/76] Update client_train.py --- .../client/client_train.py | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/extras/iris_pipeline_project/client/client_train.py b/extras/iris_pipeline_project/client/client_train.py index fe5e3237da..aacf1f76ef 100644 --- a/extras/iris_pipeline_project/client/client_train.py +++ b/extras/iris_pipeline_project/client/client_train.py @@ -6,9 +6,8 @@ import json def main(): - DEFAULT_CSV = "workspace/data/iris_train.csv" SERVER_URL = "localhost:9000" - MODEL_NAME = "pipeline" + MODEL_NAME = "pipeline" if len(sys.argv) < 3 or sys.argv[1] not in ("train", "infer"): print("Usage: python client_train.py ") @@ -19,36 +18,27 @@ def main(): if not os.path.isfile(csv_path): print(f"ERROR: Could not find CSV file: {csv_path}") - print("Please check your path and try again.") sys.exit(1) - + try: df = pd.read_csv(csv_path) - print("read CSV file successfully") + print("Read CSV file successfully") except Exception as e: print(f"ERROR: Could not read CSV file: {e}") sys.exit(1) if mode == "train": if "Species" not in df.columns: - print("ERROR: Training CSV must contain a 'species' column as the label.") + print("ERROR: Training CSV must contain a 'Species' column as the label.") sys.exit(1) print("Training mode detected. Preparing data for training...") csv_str = df.to_csv(index=False) - - input_dict = { - "mode": mode, - "data": csv_str - } - - input_bytes = json.dumps(input_dict).encode("utf-8") + input_dict = {"mode": mode, "data": csv_str} + input_bytes = json.dumps(input_dict).encode() pipeline_input = np.array([input_bytes], dtype=object) - inputs = {"pipeline_input": pipeline_input} - print("prepped payload") - try: client = grpcclient.InferenceServerClient(url=SERVER_URL) print(f"Connected to OVMS at {SERVER_URL}") @@ -58,17 +48,25 @@ def main(): infer_input = grpcclient.InferInput("pipeline_input", pipeline_input.shape, "BYTES") infer_input.set_data_from_numpy(pipeline_input) - print("MODEL_NAME:", MODEL_NAME) - print("infer_input:", infer_input.name(), infer_input.shape()) + try: response = client.infer( model_name=MODEL_NAME, inputs=[infer_input] ) result = response.as_numpy("pipeline_output") - print("Server response:", result) + print("Raw server response:", result) + + if isinstance(result, np.ndarray) and result.dtype == object: + print("Server response decoded obj:", result[0].decode()) + elif isinstance(result, np.ndarray) and result.dtype == np.uint8: + print("Server response decoded int8:", bytes(result).decode()) + elif isinstance(result, (bytes, bytearray)): + print("Server response decoded bytarray:", result.decode()) + else: + print("Server response decoded: string", str(result)) except Exception as e: - print(f"ERROR: Inference call failed: {e}") + print(f"ERROR: Inference call failed or output decoding failed: {e}") sys.exit(1) if __name__ == "__main__": From 66d5966d2838e18ab782dd27cf1bf10015346d83 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 7 Jul 2025 23:00:49 +0530 Subject: [PATCH 21/76] Update client_inference.py --- .../client/client_inference.py | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/extras/iris_pipeline_project/client/client_inference.py b/extras/iris_pipeline_project/client/client_inference.py index cd356133db..1a3f923e9a 100644 --- a/extras/iris_pipeline_project/client/client_inference.py +++ b/extras/iris_pipeline_project/client/client_inference.py @@ -1,25 +1,24 @@ import numpy as np import tritonclient.grpc as grpcclient import pandas as pd +import json +df = pd.read_csv("data/iris_test_stripped.csv") +if "Species" in df.columns: + df = df.drop(columns=["Species"]) +csv_str = df.to_csv(index=False) +input_dict = {"mode": "infer", "data": csv_str} +input_bytes = json.dumps(input_dict).encode("utf-8") +pipeline_input = np.array([input_bytes], dtype=object) -X_test = pd.read_csv("/home/harshitha/iris_pipeline_project/data/iris_test.csv") -X_test = X_test.values.astype(np.float32) - -input_name = "input" -output_name = "output_label" - -inputs = [] -infer_input = grpcclient.InferInput(input_name, X_test.shape, "FP32") -infer_input.set_data_from_numpy(X_test) -inputs.append(infer_input) - -outputs = [grpcclient.InferRequestedOutput(output_name)] +input_name = "pipeline_input" +infer_input = grpcclient.InferInput(input_name, pipeline_input.shape, "BYTES") +infer_input.set_data_from_numpy(pipeline_input) client = grpcclient.InferenceServerClient(url="localhost:9000") +model_name = "pipeline" -model_name = "iris_logreg" -response = client.infer(model_name=model_name, inputs=inputs, outputs=outputs) +response = client.infer(model_name, [infer_input]) +preds = response.as_numpy("pipeline_output") -predictions = response.as_numpy(output_name) -print("Predictions:", predictions) \ No newline at end of file +print("Inference predictions:", preds) From 0b6cbc03793ff2869682e4402d200cb5f47b152b Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 7 Jul 2025 23:01:46 +0530 Subject: [PATCH 22/76] Update ovmsmodel.py --- .../pipeline/ovmsmodel.py | 90 +++++++++++++++---- 1 file changed, 75 insertions(+), 15 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 895586a3a5..9b4869e8fc 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -8,11 +8,13 @@ from skl2onnx.common.data_types import FloatTensorType import onnxruntime as ort from pyovms import Tensor +from io import StringIO -from io import StringIO +from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report MODEL_PATH = "/workspace/model/iris_logreg/1/model.onnx" LABEL_COLUMN = "Species" +DROP_COLUMNS = ["Id"] class OvmsPythonModel: def initialize(self, kwargs): @@ -20,21 +22,37 @@ def initialize(self, kwargs): def execute(self, inputs): print("==== [execute] Python node called ====", file=sys.stderr, flush=True) - try: - input_tensor = inputs[0] - input_data = input_tensor.data - payload = json.loads(input_data.decode("utf-8")) - print("received data" , flush=True) - + input_tensor = inputs[0] + input_data = input_tensor.data + if isinstance(input_data, memoryview): + inp_bytes = bytes(input_data) + elif isinstance(input_data, (bytes, bytearray)): + inp_bytes = input_data + elif isinstance(input_data, np.ndarray): + if input_data.dtype == object: + inp_bytes = input_data[0] + else: + inp_bytes = bytes(input_data) + else: + raise TypeError(f"Unsupported type for input_data: {type(input_data)}") + + print("input_data preview:", inp_bytes[:40], file=sys.stderr) + if inp_bytes[:1] != b'{' and inp_bytes.find(b'{') > 0: + first_brace = inp_bytes.find(b'{') + inp_bytes = inp_bytes[first_brace:] + print("RAW BYTES:", inp_bytes[:100], file=sys.stderr) + payload = json.loads(inp_bytes.decode("utf-8")) mode = payload.get("mode") csv_str = payload.get("data") - if not isinstance(csv_str, str): raise ValueError("Missing or invalid 'data' field") df = pd.read_csv(StringIO(csv_str)) + if "Id" in df.columns: + df = df.drop(columns=DROP_COLUMNS) + if mode == "train": if LABEL_COLUMN not in df.columns: raise ValueError(f"Missing label column '{LABEL_COLUMN}' in input data") @@ -51,31 +69,73 @@ def execute(self, inputs): with open(MODEL_PATH, "wb") as f: f.write(onnx_model.SerializeToString()) - result = "training complete".encode("utf-8") + y_pred = model.predict(X) + acc = accuracy_score(y, y_pred) + prec = precision_score(y, y_pred, average='weighted', zero_division=0) + rec = recall_score(y, y_pred, average='weighted', zero_division=0) + f1 = f1_score(y, y_pred, average='weighted', zero_division=0) + report = classification_report(y, y_pred) + print(f"[METRICS][train] accuracy={acc}, precision={prec}, recall={rec}, f1={f1}", file=sys.stderr) + print(f"[METRICS][train] classification_report:\n{report}", file=sys.stderr, flush=True) + + metrics_str = f"acc={acc:.4f}, prec={prec:.4f}, rec={rec:.4f}, f1={f1:.4f}" + result = np.array([1.0, acc, prec, rec, f1], dtype=np.float32) return [Tensor("pipeline_output", result)] elif mode == "infer": if not os.path.exists(MODEL_PATH): raise FileNotFoundError("Model not trained yet") + y_true = None + if LABEL_COLUMN in df.columns: + y_true = df[LABEL_COLUMN].values + df = df.drop(columns=[LABEL_COLUMN]) + X = df.values.astype(np.float32) sess = ort.InferenceSession(MODEL_PATH) input_name = sess.get_inputs()[0].name preds = sess.run(None, {input_name: X})[0] - print("inference made", flush = True) - result = json.dumps(preds.tolist()).encode("utf-8") - return [Tensor("pipeline_output", result)] + if preds.ndim > 1 and preds.shape[1] == 1: + preds = preds.ravel() + + label_map = { + "Iris-setosa": 0, + "Iris-versicolor": 1, + "Iris-virginica": 2 + } + if isinstance(preds, str): + preds = np.array([preds]) + if preds.dtype.type is np.str_ or preds.dtype.type is np.object_: + res_int = np.vectorize(label_map.get)(preds) + else: + res_int = preds + + result = res_int.astype(np.float32) + + if y_true is not None: + if y_true.dtype.type is np.str_ or y_true.dtype.type is np.object_: + y_true_mapped = np.vectorize(label_map.get)(y_true) + else: + y_true_mapped = y_true + + acc = accuracy_score(y_true_mapped, res_int) + prec = precision_score(y_true_mapped, res_int, average='weighted', zero_division=0) + rec = recall_score(y_true_mapped, res_int, average='weighted', zero_division=0) + f1 = f1_score(y_true_mapped, res_int, average='weighted', zero_division=0) + report = classification_report(y_true_mapped, res_int) + print(f"[METRICS][infer] accuracy={acc}, precision={prec}, recall={rec}, f1={f1}", file=sys.stderr) + print(f"[METRICS][infer] classification_report:\n{report}", file=sys.stderr, flush=True) + return [Tensor("pipeline_output", result)] else: raise ValueError(f"Unknown mode '{mode}'") - except Exception as e: print(f"[ERROR] Exception in execute: {e}", file=sys.stderr) import traceback traceback.print_exc(file=sys.stderr) - error_msg = f"ERROR: {str(e)}".encode("utf-8") - return [Tensor("pipeline_output", error_msg)] + error_msg = f"ERROR: {str(e)}".encode() + return [Tensor("pipeline_output", np.array([error_msg], dtype=object))] def finalize(self): print("[finalize] Python node finalized", file=sys.stderr, flush=True) From daaf52253fb1db532d703515ed68bab83f01cbf2 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:20:05 +0530 Subject: [PATCH 23/76] Update ovmsmodel.py --- extras/iris_pipeline_project/pipeline/ovmsmodel.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 9b4869e8fc..a4eb8914c9 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -25,17 +25,7 @@ def execute(self, inputs): try: input_tensor = inputs[0] input_data = input_tensor.data - if isinstance(input_data, memoryview): - inp_bytes = bytes(input_data) - elif isinstance(input_data, (bytes, bytearray)): - inp_bytes = input_data - elif isinstance(input_data, np.ndarray): - if input_data.dtype == object: - inp_bytes = input_data[0] - else: - inp_bytes = bytes(input_data) - else: - raise TypeError(f"Unsupported type for input_data: {type(input_data)}") + inp_bytes = bytes(input_tensor.data) print("input_data preview:", inp_bytes[:40], file=sys.stderr) if inp_bytes[:1] != b'{' and inp_bytes.find(b'{') > 0: From 3dd60cc96b46729def4353dcd1d24b045461b40d Mon Sep 17 00:00:00 2001 From: darksapien23151 Date: Wed, 9 Jul 2025 11:01:56 +0530 Subject: [PATCH 24/76] Modified files and removed model/ --- extras/iris_pipeline_project/.gitignore | 2 + extras/iris_pipeline_project/Dockerfile | 2 +- .../client/client_inference.py | 71 +++++--- .../client/client_train.py | 81 +++++++-- .../model/iris_logreg/1/model.onnx | Bin 684 -> 0 bytes .../pipeline/ovmsmodel.py | 161 +++++++++++++----- 6 files changed, 234 insertions(+), 83 deletions(-) delete mode 100644 extras/iris_pipeline_project/model/iris_logreg/1/model.onnx diff --git a/extras/iris_pipeline_project/.gitignore b/extras/iris_pipeline_project/.gitignore index 8fce603003..8b3cc93669 100644 --- a/extras/iris_pipeline_project/.gitignore +++ b/extras/iris_pipeline_project/.gitignore @@ -1 +1,3 @@ data/ +model/ +Dockerfile diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile index 20bea32da2..9ffc9a18b1 100644 --- a/extras/iris_pipeline_project/Dockerfile +++ b/extras/iris_pipeline_project/Dockerfile @@ -10,4 +10,4 @@ RUN pip3 install --break-system-packages pandas numpy scikit-learn joblib skl2on WORKDIR /workspace -ENTRYPOINT ["/ovms/bin/ovms", "--config_path", "/model_config.json", "--grpc_port", "9000"] +ENTRYPOINT ["/ovms/bin/ovms"] diff --git a/extras/iris_pipeline_project/client/client_inference.py b/extras/iris_pipeline_project/client/client_inference.py index cd356133db..1040de5078 100644 --- a/extras/iris_pipeline_project/client/client_inference.py +++ b/extras/iris_pipeline_project/client/client_inference.py @@ -1,25 +1,58 @@ import numpy as np import tritonclient.grpc as grpcclient import pandas as pd - - -X_test = pd.read_csv("/home/harshitha/iris_pipeline_project/data/iris_test.csv") -X_test = X_test.values.astype(np.float32) - -input_name = "input" -output_name = "output_label" - -inputs = [] -infer_input = grpcclient.InferInput(input_name, X_test.shape, "FP32") -infer_input.set_data_from_numpy(X_test) -inputs.append(infer_input) - -outputs = [grpcclient.InferRequestedOutput(output_name)] - +import json +import sys +import os + + +if len(sys.argv) < 3 or sys.argv[1] not in ("train", "infer"): + print("Usage: python client_inference.py ") + sys.exit(1) + +mode = sys.argv[1] +csv_path = sys.argv[2] + +if not os.path.isfile(csv_path): + print(f"ERROR: Could not find CSV file: {csv_path}") + sys.exit(1) + +try: + df = pd.read_csv(csv_path) + print("Read CSV file successfully") +except Exception as e: + print(f"ERROR: Could not read CSV file: {e}") + sys.exit(1) + +if mode == "train": + if "Species" not in df.columns: + print("ERROR: Training CSV must contain a 'Species' column as the label.") + sys.exit(1) + print("Training mode detected. Preparing data for training...") + +csv_str = df.to_csv(index=False) +if "Species" in df.columns: + df = df.drop(columns=["Species"]) +input_dict = {"mode": mode, "data": csv_str} +input_bytes = json.dumps(input_dict).encode("utf-8") +pipeline_input = np.array([input_bytes], dtype=object) + +input_name = "pipeline_input" +infer_input = grpcclient.InferInput(input_name, pipeline_input.shape, "BYTES") +infer_input.set_data_from_numpy(pipeline_input) + +print("Inference mode detected.") client = grpcclient.InferenceServerClient(url="localhost:9000") +model_name = "pipeline" + +response = client.infer(model_name, [infer_input]) +preds = response.as_numpy("pipeline_output") -model_name = "iris_logreg" -response = client.infer(model_name=model_name, inputs=inputs, outputs=outputs) +if preds == 0.0: + result_string = "Iris-setosa" +elif preds == 1.0: + result_string = "Iris-versicolor" +else: + result_string = "Iris-virginica" -predictions = response.as_numpy(output_name) -print("Predictions:", predictions) \ No newline at end of file +print("Inference predictions:", result_string) \ No newline at end of file diff --git a/extras/iris_pipeline_project/client/client_train.py b/extras/iris_pipeline_project/client/client_train.py index 31807441e0..2c6433791e 100644 --- a/extras/iris_pipeline_project/client/client_train.py +++ b/extras/iris_pipeline_project/client/client_train.py @@ -1,26 +1,73 @@ -import numpy as np +import os +import sys import pandas as pd +import numpy as np import tritonclient.grpc as grpcclient +import json + +def main(): + SERVER_URL = "localhost:9000" + MODEL_NAME = "pipeline" + + if len(sys.argv) < 3 or sys.argv[1] not in ("train", "infer"): + print("Usage: python client_train.py ") + sys.exit(1) + + mode = sys.argv[1] + csv_path = sys.argv[2] + + if not os.path.isfile(csv_path): + print(f"ERROR: Could not find CSV file: {csv_path}") + sys.exit(1) + + try: + df = pd.read_csv(csv_path) + print("Read CSV file successfully") + except Exception as e: + print(f"ERROR: Could not read CSV file: {e}") + sys.exit(1) -data = pd.read_csv("/home/harshitha/iris_pipeline_project/data/iris_train.csv") -df = pd.DataFrame(data) + if mode == "train": + if "Species" not in df.columns: + print("ERROR: Training CSV must contain a 'Species' column as the label.") + sys.exit(1) + print("Training mode detected. Preparing data for training...") -csv_str = df.to_csv(index=False) -csv_bytes = np.frombuffer(csv_str.encode('utf-8'), dtype=np.uint8) + csv_str = df.to_csv(index=False) + input_dict = {"mode": mode, "data": csv_str} + input_bytes = json.dumps(input_dict).encode() -input_name = "input" -input = [] -infer_input = grpcclient.InferInput(input_name, csv_bytes.shape, "UINT8") -infer_input.set_data_from_numpy(csv_bytes) -input.append(infer_input) + pipeline_input = np.array([input_bytes], dtype=object) -output_name = "output_label" -output_label = [grpcclient.InferRequestedOutput(output_name)] + try: + client = grpcclient.InferenceServerClient(url=SERVER_URL) + print(f"Connected to OVMS at {SERVER_URL}") + except Exception as e: + print(f"ERROR: Could not connect to OVMS at {SERVER_URL}: {e}") + sys.exit(1) -client = grpcclient.InferenceServerClient(url="localhost:9000") + infer_input = grpcclient.InferInput("pipeline_input", pipeline_input.shape, "BYTES") + infer_input.set_data_from_numpy(pipeline_input) -model_name = "iris_pipeline" -response = client.infer(model_name=model_name, inputs=input, outputs=output_label) + try: + response = client.infer( + model_name=MODEL_NAME, + inputs=[infer_input] + ) + result = response.as_numpy("pipeline_output") + + if isinstance(result, np.ndarray) and result.dtype == object: + print("Server response decoded obj:", result[0].decode()) + elif isinstance(result, np.ndarray) and result.dtype == np.uint8: + print("Server response decoded int8:", bytes(result).decode()) + elif isinstance(result, (bytes, bytearray)): + print("Server response decoded bytarray:", result.decode()) + else: + print("Server response decoded: string - ", str(result)) + print("The output string formatted as: [<1 - Model trained successfully | 0 - Otherwise> ]") + except Exception as e: + print(f"ERROR: Inference call failed or output decoding failed: {e}") + sys.exit(1) -result = response.as_numpy(output_name) -print("Training result:", result) \ No newline at end of file +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/extras/iris_pipeline_project/model/iris_logreg/1/model.onnx b/extras/iris_pipeline_project/model/iris_logreg/1/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/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 37c2ba45eb..196fad090c 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -1,62 +1,131 @@ -import numpy as np -import pandas as pd import os +import sys import json +import numpy as np +import pandas as pd +from sklearn.linear_model import LogisticRegression from skl2onnx import convert_sklearn from skl2onnx.common.data_types import FloatTensorType -from sklearn.linear_model import LogisticRegression import onnxruntime as ort +from pyovms import Tensor +from io import StringIO + +from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report MODEL_PATH = "/workspace/model/iris_logreg/1/model.onnx" -LABEL_COLUMN = "species" +LABEL_COLUMN = "Species" +DROP_COLUMNS = ["Id"] class OvmsPythonModel: def initialize(self, kwargs): - print("Training handler initialized.") + print("[initialize] Python node initialized", file=sys.stderr, flush=True) - def execute(self, inputs, outputs, parameters, context): - # Expecting a dict: {"mode": "train" or "infer", "data": } - input_bytes = inputs["pipeline_input"] + def execute(self, inputs): + print("==== [execute] Python node called ====", file=sys.stderr, flush=True) try: - input_str = input_bytes.tobytes().decode('utf-8') - input_obj = json.loads(input_str) - mode = input_obj.get("mode") - csv_str = input_obj.get("data") - except Exception as e: - outputs["pipeline_output"] = np.array([f"ERROR: Invalid input format: {e}"], dtype=object) - return + input_tensor = inputs[0] + input_data = input_tensor.data + inp_bytes = bytes(input_tensor.data) - try: - df = pd.read_csv(pd.compat.StringIO(csv_str)) + print("input_data preview:", inp_bytes[:40], file=sys.stderr) + if inp_bytes[:1] != b'{' and inp_bytes.find(b'{') > 0: + first_brace = inp_bytes.find(b'{') + inp_bytes = inp_bytes[first_brace:] + print("RAW BYTES:", inp_bytes[:100], file=sys.stderr) + payload = json.loads(inp_bytes.decode("utf-8")) + mode = payload.get("mode") + csv_str = payload.get("data") + if not isinstance(csv_str, str): + raise ValueError("Missing or invalid 'data' field") + + df = pd.read_csv(StringIO(csv_str)) + + if "Id" in df.columns: + df = df.drop(columns=DROP_COLUMNS) + + if mode == "train": + if LABEL_COLUMN not in df.columns: + raise ValueError(f"Missing label column '{LABEL_COLUMN}' in input data") + + X = df.drop(columns=[LABEL_COLUMN]).values.astype(np.float32) + y = df[LABEL_COLUMN].values + + model = LogisticRegression(max_iter=200) + model.fit(X, y) + + os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True) + initial_type = [('float_input', FloatTensorType([None, X.shape[1]]))] + onnx_model = convert_sklearn(model, initial_types=initial_type) + with open(MODEL_PATH, "wb") as f: + f.write(onnx_model.SerializeToString()) + + y_pred = model.predict(X) + acc = accuracy_score(y, y_pred) + prec = precision_score(y, y_pred, average='weighted', zero_division=0) + rec = recall_score(y, y_pred, average='weighted', zero_division=0) + f1 = f1_score(y, y_pred, average='weighted', zero_division=0) + report = classification_report(y, y_pred) + print(f"[METRICS][train] accuracy={acc}, precision={prec}, recall={rec}, f1={f1}", file=sys.stderr) + print(f"[METRICS][train] classification_report:\n{report}", file=sys.stderr, flush=True) + + metrics_str = f"acc={acc:.4f}, prec={prec:.4f}, rec={rec:.4f}, f1={f1:.4f}" + result = np.array([1.0, acc, prec, rec, f1], dtype=np.float32) + return [Tensor("pipeline_output", result)] + + elif mode == "infer": + if not os.path.exists(MODEL_PATH): + raise FileNotFoundError("Model not trained yet") + + y_true = None + if LABEL_COLUMN in df.columns: + y_true = df[LABEL_COLUMN].values + df = df.drop(columns=[LABEL_COLUMN]) + + X = df.values.astype(np.float32) + sess = ort.InferenceSession(MODEL_PATH) + input_name = sess.get_inputs()[0].name + preds = sess.run(None, {input_name: X})[0] + + if preds.ndim > 1 and preds.shape[1] == 1: + preds = preds.ravel() + + label_map = { + "Iris-setosa": 0, + "Iris-versicolor": 1, + "Iris-virginica": 2 + } + if isinstance(preds, str): + preds = np.array([preds]) + if preds.dtype.type is np.str_ or preds.dtype.type is np.object_: + res_int = np.vectorize(label_map.get)(preds) + else: + res_int = preds + + result = res_int.astype(np.float32) + + if y_true is not None: + if y_true.dtype.type is np.str_ or y_true.dtype.type is np.object_: + y_true_mapped = np.vectorize(label_map.get)(y_true) + else: + y_true_mapped = y_true + + acc = accuracy_score(y_true_mapped, res_int) + prec = precision_score(y_true_mapped, res_int, average='weighted', zero_division=0) + rec = recall_score(y_true_mapped, res_int, average='weighted', zero_division=0) + f1 = f1_score(y_true_mapped, res_int, average='weighted', zero_division=0) + report = classification_report(y_true_mapped, res_int) + print(f"[METRICS][infer] accuracy={acc}, precision={prec}, recall={rec}, f1={f1}", file=sys.stderr) + print(f"[METRICS][infer] classification_report:\n{report}", file=sys.stderr, flush=True) + + return [Tensor("pipeline_output", result)] + else: + raise ValueError(f"Unknown mode '{mode}'") except Exception as e: - outputs["pipeline_output"] = np.array([f"ERROR: Could not parse CSV: {e}"], dtype=object) - return - - if mode == "train": - if LABEL_COLUMN not in df.columns: - outputs["pipeline_output"] = np.array([f"ERROR: Training data must include label column '{LABEL_COLUMN}'"], dtype=object) - return - X = df.drop(columns=[LABEL_COLUMN]) - y = df[LABEL_COLUMN] - model = LogisticRegression(max_iter=200) - model.fit(X, y) - os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True) - initial_type = [('float_input', FloatTensorType([None, X.shape[1]]))] - onnx_model = convert_sklearn(model, initial_types=initial_type) - with open(MODEL_PATH, "wb") as f: - f.write(onnx_model.SerializeToString()) - outputs["pipeline_output"] = np.array(["training complete"], dtype=object) - elif mode == "infer": - if not os.path.exists(MODEL_PATH): - outputs["pipeline_output"] = np.array(["ERROR: Model not trained yet"], dtype=object) - return - X = df.values.astype(np.float32) - sess = ort.InferenceSession(MODEL_PATH) - input_name = sess.get_inputs()[0].name - preds = sess.run(None, {input_name: X})[0] - outputs["pipeline_output"] = preds - else: - outputs["pipeline_output"] = np.array([f"ERROR: Unknown mode '{mode}'"], dtype=object) + print(f"[ERROR] Exception in execute: {e}", file=sys.stderr) + import traceback + traceback.print_exc(file=sys.stderr) + error_msg = f"ERROR: {str(e)}".encode() + return [Tensor("pipeline_output", np.array([error_msg], dtype=object))] def finalize(self): - print("Training handler finalized.") + print("[finalize] Python node finalized", file=sys.stderr, flush=True) \ No newline at end of file From c49bf22131bda4722e198c65713121351057c1ca Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 9 Jul 2025 11:52:35 +0530 Subject: [PATCH 25/76] Update README.md --- extras/iris_pipeline_project/README.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 88dea66b05..7fa32ceab4 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -36,8 +36,6 @@ docker run --rm -it -v "$PWD:/workspace" -p 9000:9000 -p 8000:8000 iris_7 --c client/ ├── client_inference.py └── client_train.py -model/ - └── iris_logreg/1/model.onnx pipeline/ ├── __pycache__/ ├── graph.pbtxt @@ -59,8 +57,6 @@ python client/client_train.py train data/iris_train.csv ### 4.2. Inference ```bash -python client/client_train.py infer data/iris_test.csv -# OR python client/client_inference.py infer data/iris_test.csv ``` @@ -97,15 +93,22 @@ The pipeline expects input as a JSON object, sent as a single-element numpy arra --- ## Example Output +For Training: ``` -read CSV file successfully +Read CSV file successfully Training mode detected. Preparing data for training... -prepped payload Connected to OVMS at localhost:9000 -MODEL_NAME: pipeline -infer_input: pipeline_input [1] -Server response: [...] +Server response decoded: string - [...] +The output string formatted as: [<1 - Model trained successfully | 0 - Otherwise> ] +``` +For Inference: + +``` +Read CSV file successfully +Inference mode detected. +Inference predictions: [...] + ``` --- From a31c177b1f78f364232bb2640ed422a568fa3dea Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 9 Jul 2025 11:53:15 +0530 Subject: [PATCH 26/76] Update README.md --- extras/iris_pipeline_project/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 7fa32ceab4..34d605ec23 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -112,7 +112,3 @@ Inference predictions: [...] ``` --- - -## 📄 License - -MIT License From 59a66a0547c00808c6a596c1a1f0c50edef520fb Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 9 Jul 2025 22:52:00 +0530 Subject: [PATCH 27/76] Update README.md --- extras/iris_pipeline_project/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 34d605ec23..1ef2a13ceb 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -8,7 +8,7 @@ This repository demonstrates how to use OpenVINO Model Server (OVMS) with a cust ```bash git clone https://github.com/openvinotoolkit/model_server.git -cd [need to fix] +cd model_server/extras/iris_pipeline_project ``` --- From b1e6ad09cfdbc1c77df34e6d495b31a994901830 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 9 Jul 2025 23:30:16 +0530 Subject: [PATCH 28/76] Update README.md --- extras/iris_pipeline_project/README.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 1ef2a13ceb..dbe2cfdac3 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -18,13 +18,13 @@ cd model_server/extras/iris_pipeline_project ### 2.1. Build the Docker Image ```bash -docker build --no-cache -t iris_7 . +docker build --no-cache -t iris_logisticreg_ovms . ``` ### 2.2. Run the OVMS Container ```bash -docker run --rm -it -v "$PWD:/workspace" -p 9000:9000 -p 8000:8000 iris_7 --config_path /workspace/model_config.json --port 9000 --rest_port 8000 +docker run --rm -it -v "$PWD:/workspace" -p 9000:9000 -p 8000:8000 iris_logisticreg_ovms --config_path /workspace/model_config.json --port 9000 --rest_port 8000 ``` - **Note:** Adjust `$(pwd)` if you are running from a different working directory. @@ -62,6 +62,18 @@ python client/client_inference.py infer data/iris_test.csv --- +## Instructions for preparing the data +Run the command to download the Iris dataset, which is taken to be the hello-world dataset of classification datasets. + +```bash +curl -o iris.csv https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data +``` +Run the following file to prepare the data and split it into data for training and for inferencing. + +```bash +python data_preprocess.py +``` + ## Input Format The pipeline expects input as a JSON object, sent as a single-element numpy array of bytes (`dtype=object`): @@ -80,7 +92,7 @@ The pipeline expects input as a JSON object, sent as a single-element numpy arra - **Logs:** For debugging, check OVMS container logs: ```bash - docker logs iris_7 + docker logs iris_logisticreg_ovms ``` - **Code Changes:** After editing `pipeline/ovmsmodel.py`, **restart the OVMS container** for changes to take effect. From 36689ab8e18e7b3fde877a9308bb63863472e445 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 9 Jul 2025 23:31:20 +0530 Subject: [PATCH 29/76] Create data_preprocess.py --- extras/iris_pipeline_project/data_preprocess.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 extras/iris_pipeline_project/data_preprocess.py diff --git a/extras/iris_pipeline_project/data_preprocess.py b/extras/iris_pipeline_project/data_preprocess.py new file mode 100644 index 0000000000..1efdf27b85 --- /dev/null +++ b/extras/iris_pipeline_project/data_preprocess.py @@ -0,0 +1,17 @@ +import pandas as pd +from sklearn.utils import shuffle +import os + +os.makedirs("data_folder", exist_ok=True) + +columns = ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth", "Species"] + +df = pd.read_csv("iris.csv", header=None, names=columns) +df.dropna(inplace=True) +df = shuffle(df, random_state=42).reset_index(drop=True) + +df.to_csv("data_folder/iris_train.csv", index=False) +inference_sample = df.drop(columns=["Species"]).iloc[[0]] +inference_sample.to_csv("data_folder/iris_test.csv", index=False) + +print("Cleaned and saved iris_train.csv and iris_test.csv to the 'data_folder/'") From f2049be07a1b83ecd37f017e51e4fc582ba53e18 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 9 Jul 2025 23:32:21 +0530 Subject: [PATCH 30/76] Update .gitignore --- extras/iris_pipeline_project/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/.gitignore b/extras/iris_pipeline_project/.gitignore index 39ca5e4588..3cb1349d42 100644 --- a/extras/iris_pipeline_project/.gitignore +++ b/extras/iris_pipeline_project/.gitignore @@ -1,5 +1,5 @@ data/ model/ -Dockerfile + From ffcb534e6b492b936e021a9e8ab6982c5323c01d Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 9 Jul 2025 23:48:16 +0530 Subject: [PATCH 31/76] Update ovmsmodel.py --- extras/iris_pipeline_project/pipeline/ovmsmodel.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 93b22100f4..a4eb8914c9 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -128,8 +128,4 @@ def execute(self, inputs): return [Tensor("pipeline_output", np.array([error_msg], dtype=object))] def finalize(self): -<<<<<<< HEAD print("[finalize] Python node finalized", file=sys.stderr, flush=True) -======= - print("[finalize] Python node finalized", file=sys.stderr, flush=True) ->>>>>>> a783d99cf19173676d14303ce0ccb1299f8c6805 From 7c00c27a815ece1e6d65fec5becfcd2bc888c56e Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:47:24 +0530 Subject: [PATCH 32/76] Update ovmsmodel.py --- extras/iris_pipeline_project/pipeline/ovmsmodel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index a4eb8914c9..287390aff5 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -3,6 +3,8 @@ import json import numpy as np import pandas as pd +from sklearnex import patch_sklearn +patch_sklearn() from sklearn.linear_model import LogisticRegression from skl2onnx import convert_sklearn from skl2onnx.common.data_types import FloatTensorType From bc42ce733e2e76beb37df6fdf12ea18b151dc99e Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:48:08 +0530 Subject: [PATCH 33/76] Update Dockerfile --- extras/iris_pipeline_project/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile index 31e6313d10..5e891d5c70 100644 --- a/extras/iris_pipeline_project/Dockerfile +++ b/extras/iris_pipeline_project/Dockerfile @@ -6,7 +6,7 @@ ENV LD_LIBRARY_PATH=/ovms/lib ENV PYTHONPATH=/ovms/lib/python RUN apt-get update && apt-get install -y python3-pip -RUN pip install --break-system-packages pandas numpy scikit-learn joblib skl2onnx onnx onnxruntime +RUN pip install --break-system-packages pandas numpy scikit-learn==1.3.2 joblib skl2onnx onnx onnxruntime scikit-learn-intelex==2024.0.0 WORKDIR /workspace From f102453b45232d4a8f48e807c53a68d66332548a Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:52:00 +0530 Subject: [PATCH 34/76] Update ovmsmodel.py --- extras/iris_pipeline_project/pipeline/ovmsmodel.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 287390aff5..edd804da44 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -52,7 +52,14 @@ def execute(self, inputs): X = df.drop(columns=[LABEL_COLUMN]).values.astype(np.float32) y = df[LABEL_COLUMN].values - model = LogisticRegression(max_iter=200) + params = payload.get("params", {}) + print(f"[TRAIN] Using hyperparameters: {params}", file=sys.stderr) + + try: + model = LogisticRegression(max_iter=200, **params) + except Exception as e: + raise ValueError(f"Invalid training hyperparameters: {e}") + model.fit(X, y) os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True) @@ -67,6 +74,7 @@ def execute(self, inputs): rec = recall_score(y, y_pred, average='weighted', zero_division=0) f1 = f1_score(y, y_pred, average='weighted', zero_division=0) report = classification_report(y, y_pred) + print(f"[METRICS][train] accuracy={acc}, precision={prec}, recall={rec}, f1={f1}", file=sys.stderr) print(f"[METRICS][train] classification_report:\n{report}", file=sys.stderr, flush=True) From 82d5f0c1020db0c727280faf6a0a99071bde372c Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:52:28 +0530 Subject: [PATCH 35/76] Update client_train.py --- .../client/client_train.py | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/extras/iris_pipeline_project/client/client_train.py b/extras/iris_pipeline_project/client/client_train.py index 2c6433791e..ca9da0ea29 100644 --- a/extras/iris_pipeline_project/client/client_train.py +++ b/extras/iris_pipeline_project/client/client_train.py @@ -1,20 +1,29 @@ import os import sys +import json import pandas as pd import numpy as np import tritonclient.grpc as grpcclient -import json def main(): SERVER_URL = "localhost:9000" MODEL_NAME = "pipeline" if len(sys.argv) < 3 or sys.argv[1] not in ("train", "infer"): - print("Usage: python client_train.py ") + print("Usage: python client_train.py [--params ]") sys.exit(1) mode = sys.argv[1] csv_path = sys.argv[2] + params_path = None + + if "--params" in sys.argv: + params_index = sys.argv.index("--params") + if params_index + 1 < len(sys.argv): + params_path = sys.argv[params_index + 1] + else: + print("ERROR: '--params' specified but no file given.") + sys.exit(1) if not os.path.isfile(csv_path): print(f"ERROR: Could not find CSV file: {csv_path}") @@ -33,10 +42,25 @@ def main(): sys.exit(1) print("Training mode detected. Preparing data for training...") + # Optional hyperparameter dictionary + params = {} + if params_path: + try: + with open(params_path, "r") as f: + params = json.load(f) + print(f"Loaded training hyperparameters: {params}") + except Exception as e: + print(f"ERROR: Could not read params JSON: {e}") + sys.exit(1) + csv_str = df.to_csv(index=False) - input_dict = {"mode": mode, "data": csv_str} - input_bytes = json.dumps(input_dict).encode() + input_dict = { + "mode": mode, + "data": csv_str, + "params": params # Include params in the JSON + } + input_bytes = json.dumps(input_dict).encode() pipeline_input = np.array([input_bytes], dtype=object) try: @@ -55,7 +79,7 @@ def main(): inputs=[infer_input] ) result = response.as_numpy("pipeline_output") - + if isinstance(result, np.ndarray) and result.dtype == object: print("Server response decoded obj:", result[0].decode()) elif isinstance(result, np.ndarray) and result.dtype == np.uint8: @@ -70,4 +94,4 @@ def main(): sys.exit(1) if __name__ == "__main__": - main() \ No newline at end of file + main() From 8821147c33b4193e6d0c1811cd3149380db0e577 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:54:15 +0530 Subject: [PATCH 36/76] Add files via upload --- extras/iris_pipeline_project/hyperparams.json | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 extras/iris_pipeline_project/hyperparams.json diff --git a/extras/iris_pipeline_project/hyperparams.json b/extras/iris_pipeline_project/hyperparams.json new file mode 100644 index 0000000000..b0a9b77e79 --- /dev/null +++ b/extras/iris_pipeline_project/hyperparams.json @@ -0,0 +1,5 @@ +{ + "max_iter": 500, + "C": 0.8, + "solver": "liblinear" +} From a614ae51a03c6ce9d0a57e4bcdb009e2679a9f3f Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:42:11 +0530 Subject: [PATCH 37/76] Update extras/iris_pipeline_project/Dockerfile MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Miłosz Żeglarski --- extras/iris_pipeline_project/Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile index 5e891d5c70..cc125c313e 100644 --- a/extras/iris_pipeline_project/Dockerfile +++ b/extras/iris_pipeline_project/Dockerfile @@ -8,6 +8,4 @@ ENV PYTHONPATH=/ovms/lib/python RUN apt-get update && apt-get install -y python3-pip RUN pip install --break-system-packages pandas numpy scikit-learn==1.3.2 joblib skl2onnx onnx onnxruntime scikit-learn-intelex==2024.0.0 - -WORKDIR /workspace ENTRYPOINT ["/ovms/bin/ovms"] From 49ee303c3aec7257377713f504af54f706bd8aef Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:45:11 +0530 Subject: [PATCH 38/76] Update .gitignore --- extras/iris_pipeline_project/.gitignore | 3 --- 1 file changed, 3 deletions(-) diff --git a/extras/iris_pipeline_project/.gitignore b/extras/iris_pipeline_project/.gitignore index 3cb1349d42..5ac07612fb 100644 --- a/extras/iris_pipeline_project/.gitignore +++ b/extras/iris_pipeline_project/.gitignore @@ -1,5 +1,2 @@ data/ model/ - - - From 1f1b8b4a39347433e6c64d18259080869045b24a Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 12:49:42 +0530 Subject: [PATCH 39/76] Update ovmsmodel.py --- extras/iris_pipeline_project/pipeline/ovmsmodel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index edd804da44..5f64a3de44 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -30,8 +30,8 @@ def execute(self, inputs): inp_bytes = bytes(input_tensor.data) print("input_data preview:", inp_bytes[:40], file=sys.stderr) - if inp_bytes[:1] != b'{' and inp_bytes.find(b'{') > 0: - first_brace = inp_bytes.find(b'{') + first_brace = inp_bytes.find(b'{') + if first_brace > 0: inp_bytes = inp_bytes[first_brace:] print("RAW BYTES:", inp_bytes[:100], file=sys.stderr) payload = json.loads(inp_bytes.decode("utf-8")) From b61cbe14c976b7373d493f493415c939370ab516 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:00:09 +0530 Subject: [PATCH 40/76] Update data_preprocess.py --- .../iris_pipeline_project/data_preprocess.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/extras/iris_pipeline_project/data_preprocess.py b/extras/iris_pipeline_project/data_preprocess.py index 1efdf27b85..ae69093936 100644 --- a/extras/iris_pipeline_project/data_preprocess.py +++ b/extras/iris_pipeline_project/data_preprocess.py @@ -1,8 +1,15 @@ import pandas as pd from sklearn.utils import shuffle import os +import sys -os.makedirs("data_folder", exist_ok=True) +if len(sys.argv) < 2: + print("Usage: python datapreprocess.py ") + sys.exit(1) + +output_dir = sys.argv[1] + +os.makedirs(output_dir, exist_ok=True) columns = ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth", "Species"] @@ -10,8 +17,10 @@ df.dropna(inplace=True) df = shuffle(df, random_state=42).reset_index(drop=True) -df.to_csv("data_folder/iris_train.csv", index=False) -inference_sample = df.drop(columns=["Species"]).iloc[[0]] -inference_sample.to_csv("data_folder/iris_test.csv", index=False) +train_path = os.path.join(output_dir, "iris_train.csv") +test_path = os.path.join(output_dir, "iris_test.csv") + +df.to_csv(train_path, index=False) +df.drop(columns=["Species"]).iloc[[0]].to_csv(test_path, index=False) -print("Cleaned and saved iris_train.csv and iris_test.csv to the 'data_folder/'") +print(f"Cleaned and saved iris_train.csv and iris_test.csv to '{output_dir}/'") From 4c68c8bf0b3a52837c3714ef0c7f24b86485681a Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:00:44 +0530 Subject: [PATCH 41/76] Update data_preprocess.py --- extras/iris_pipeline_project/data_preprocess.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/data_preprocess.py b/extras/iris_pipeline_project/data_preprocess.py index ae69093936..c9f1694485 100644 --- a/extras/iris_pipeline_project/data_preprocess.py +++ b/extras/iris_pipeline_project/data_preprocess.py @@ -9,7 +9,7 @@ output_dir = sys.argv[1] -os.makedirs(output_dir, exist_ok=True) +#os.makedirs(output_dir, exist_ok=True) columns = ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth", "Species"] From 60db5be05e2852b8f44ff0f617986a03ec0b90a7 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:40:26 +0530 Subject: [PATCH 42/76] Update client_inference.py --- extras/iris_pipeline_project/client/client_inference.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/extras/iris_pipeline_project/client/client_inference.py b/extras/iris_pipeline_project/client/client_inference.py index 111c2ddb33..58013f4f00 100644 --- a/extras/iris_pipeline_project/client/client_inference.py +++ b/extras/iris_pipeline_project/client/client_inference.py @@ -5,14 +5,6 @@ import sys import os -df = pd.read_csv("data/iris_test_stripped.csv") -if "Species" in df.columns: - df = df.drop(columns=["Species"]) -csv_str = df.to_csv(index=False) -input_dict = {"mode": "infer", "data": csv_str} -input_bytes = json.dumps(input_dict).encode("utf-8") -pipeline_input = np.array([input_bytes], dtype=object) - if len(sys.argv) < 3 or sys.argv[1] not in ("train", "infer"): print("Usage: python client_inference.py ") sys.exit(1) From c16a94c6f966c4e177f0defbe3dd4446e95abf79 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 13:57:13 +0530 Subject: [PATCH 43/76] Update client_train.py --- extras/iris_pipeline_project/client/client_train.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/extras/iris_pipeline_project/client/client_train.py b/extras/iris_pipeline_project/client/client_train.py index ca9da0ea29..bc24d5d7eb 100644 --- a/extras/iris_pipeline_project/client/client_train.py +++ b/extras/iris_pipeline_project/client/client_train.py @@ -42,7 +42,6 @@ def main(): sys.exit(1) print("Training mode detected. Preparing data for training...") - # Optional hyperparameter dictionary params = {} if params_path: try: @@ -57,7 +56,7 @@ def main(): input_dict = { "mode": mode, "data": csv_str, - "params": params # Include params in the JSON + "params": params } input_bytes = json.dumps(input_dict).encode() From c2174e9e1dbb205fa747c4328cfa5d43fe28d16c Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 14:35:15 +0530 Subject: [PATCH 44/76] Update README.md --- extras/iris_pipeline_project/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index dbe2cfdac3..6a5617b891 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -71,7 +71,7 @@ curl -o iris.csv https://archive.ics.uci.edu/ml/machine-learning-databases/iris/ Run the following file to prepare the data and split it into data for training and for inferencing. ```bash -python data_preprocess.py +python data_preprocess.py ``` ## Input Format From 1a21d726b167c06d703f77dfafa4d5292ed41147 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 14:35:55 +0530 Subject: [PATCH 45/76] Update README.md --- extras/iris_pipeline_project/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 6a5617b891..0214550560 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -71,7 +71,7 @@ curl -o iris.csv https://archive.ics.uci.edu/ml/machine-learning-databases/iris/ Run the following file to prepare the data and split it into data for training and for inferencing. ```bash -python data_preprocess.py +python data_preprocess.py ``` ## Input Format From 17f77b73f9b74fd1334eff95cc49290de75f02d8 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:07:04 +0530 Subject: [PATCH 46/76] Update README.md --- extras/iris_pipeline_project/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 0214550560..81a4257e94 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -51,13 +51,13 @@ model_config.json ### 4.1. Training ```bash -python client/client_train.py train data/iris_train.csv +python client/client_train.py train ``` ### 4.2. Inference ```bash -python client/client_inference.py infer data/iris_test.csv +python client/client_inference.py infer ``` --- From d0b01cf563ee714339cbb4f6c10f247066ca4fab Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 16 Jul 2025 11:16:26 +0530 Subject: [PATCH 47/76] Update Dockerfile --- extras/iris_pipeline_project/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile index cc125c313e..8f3ed9bc89 100644 --- a/extras/iris_pipeline_project/Dockerfile +++ b/extras/iris_pipeline_project/Dockerfile @@ -6,6 +6,7 @@ ENV LD_LIBRARY_PATH=/ovms/lib ENV PYTHONPATH=/ovms/lib/python RUN apt-get update && apt-get install -y python3-pip +RUN rm /ovms/lib/libtbb.so* && cp /usr/local/lib/libtbb.so* /ovms/lib/ RUN pip install --break-system-packages pandas numpy scikit-learn==1.3.2 joblib skl2onnx onnx onnxruntime scikit-learn-intelex==2024.0.0 ENTRYPOINT ["/ovms/bin/ovms"] From 43b985e64814b3e51e98d563d80dae49ad09ed6d Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 23 Jul 2025 23:27:21 +0530 Subject: [PATCH 48/76] Update client_train.py --- .../client/client_train.py | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/extras/iris_pipeline_project/client/client_train.py b/extras/iris_pipeline_project/client/client_train.py index bc24d5d7eb..65583a84ca 100644 --- a/extras/iris_pipeline_project/client/client_train.py +++ b/extras/iris_pipeline_project/client/client_train.py @@ -1,3 +1,4 @@ + import os import sys import json @@ -9,21 +10,27 @@ def main(): SERVER_URL = "localhost:9000" MODEL_NAME = "pipeline" - if len(sys.argv) < 3 or sys.argv[1] not in ("train", "infer"): - print("Usage: python client_train.py [--params ]") + if len(sys.argv) < 4 or sys.argv[1] not in ("train", "infer"): + print("Usage: python client_train.py " + "[--params ] [--encode ]") sys.exit(1) mode = sys.argv[1] csv_path = sys.argv[2] + target_column = sys.argv[3] + params_path = None + encode_cols = [] if "--params" in sys.argv: - params_index = sys.argv.index("--params") - if params_index + 1 < len(sys.argv): - params_path = sys.argv[params_index + 1] - else: - print("ERROR: '--params' specified but no file given.") - sys.exit(1) + idx = sys.argv.index("--params") + if idx + 1 < len(sys.argv): + params_path = sys.argv[idx + 1] + + if "--encode" in sys.argv: + idx = sys.argv.index("--encode") + if idx + 1 < len(sys.argv): + encode_cols = sys.argv[idx + 1].split(",") if not os.path.isfile(csv_path): print(f"ERROR: Could not find CSV file: {csv_path}") @@ -37,17 +44,14 @@ def main(): sys.exit(1) if mode == "train": - if "Species" not in df.columns: - print("ERROR: Training CSV must contain a 'Species' column as the label.") - sys.exit(1) - print("Training mode detected. Preparing data for training...") + print(" Training mode detected. Preparing dataset...") params = {} if params_path: try: with open(params_path, "r") as f: params = json.load(f) - print(f"Loaded training hyperparameters: {params}") + print(f" Loaded hyperparameters: {params}") except Exception as e: print(f"ERROR: Could not read params JSON: {e}") sys.exit(1) @@ -56,7 +60,9 @@ def main(): input_dict = { "mode": mode, "data": csv_str, - "params": params + "params": params, + "target_column": target_column, + "encode_columns": encode_cols } input_bytes = json.dumps(input_dict).encode() @@ -80,16 +86,12 @@ def main(): result = response.as_numpy("pipeline_output") if isinstance(result, np.ndarray) and result.dtype == object: - print("Server response decoded obj:", result[0].decode()) - elif isinstance(result, np.ndarray) and result.dtype == np.uint8: - print("Server response decoded int8:", bytes(result).decode()) - elif isinstance(result, (bytes, bytearray)): - print("Server response decoded bytarray:", result.decode()) + print("Server response:", result[0].decode()) else: - print("Server response decoded: string - ", str(result)) - print("The output string formatted as: [<1 - Model trained successfully | 0 - Otherwise> ]") + print("Server response (raw):", str(result)) + except Exception as e: - print(f"ERROR: Inference call failed or output decoding failed: {e}") + print(f"ERROR: Inference call failed: {e}") sys.exit(1) if __name__ == "__main__": From f616db799a4c85a03ee18bc48a6fb3da00715e90 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 23 Jul 2025 23:27:59 +0530 Subject: [PATCH 49/76] Update ovmsmodel.py --- .../pipeline/ovmsmodel.py | 167 +++++++++--------- 1 file changed, 88 insertions(+), 79 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 5f64a3de44..fd440b4def 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -11,12 +11,14 @@ import onnxruntime as ort from pyovms import Tensor from io import StringIO +from sklearn.preprocessing import LabelEncoder +from sklearn.impute import SimpleImputer +from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score +import joblib -from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report - -MODEL_PATH = "/workspace/model/iris_logreg/1/model.onnx" -LABEL_COLUMN = "Species" -DROP_COLUMNS = ["Id"] +MODEL_PATH = "/workspace/model/generic_model/1/model.onnx" +ENCODER_PATH = "/workspace/model/generic_model/1/label_encoder.joblib" +META_PATH = "/workspace/model/generic_model/1/meta.json" class OvmsPythonModel: def initialize(self, kwargs): @@ -26,116 +28,123 @@ def execute(self, inputs): print("==== [execute] Python node called ====", file=sys.stderr, flush=True) try: input_tensor = inputs[0] - input_data = input_tensor.data - inp_bytes = bytes(input_tensor.data) - - print("input_data preview:", inp_bytes[:40], file=sys.stderr) + inp_bytes = bytes(input_tensor.data) first_brace = inp_bytes.find(b'{') if first_brace > 0: inp_bytes = inp_bytes[first_brace:] - print("RAW BYTES:", inp_bytes[:100], file=sys.stderr) + payload = json.loads(inp_bytes.decode("utf-8")) mode = payload.get("mode") csv_str = payload.get("data") + target_column = payload.get("target_column") + print("Received payload:", csv_str) + if not isinstance(csv_str, str): raise ValueError("Missing or invalid 'data' field") df = pd.read_csv(StringIO(csv_str)) - if "Id" in df.columns: - df = df.drop(columns=DROP_COLUMNS) - if mode == "train": - if LABEL_COLUMN not in df.columns: - raise ValueError(f"Missing label column '{LABEL_COLUMN}' in input data") - - X = df.drop(columns=[LABEL_COLUMN]).values.astype(np.float32) - y = df[LABEL_COLUMN].values - - params = payload.get("params", {}) - print(f"[TRAIN] Using hyperparameters: {params}", file=sys.stderr) - - try: - model = LogisticRegression(max_iter=200, **params) - except Exception as e: - raise ValueError(f"Invalid training hyperparameters: {e}") + if target_column not in df.columns: + raise ValueError(f"Label column '{target_column}' not found") + + X_df = df.drop(columns=[target_column]) + y = df[target_column].values + feature_names = list(X_df.columns) + + print("Handling missing values...") + imp = SimpleImputer(strategy='mean') + X = imp.fit_transform(X_df).astype(np.float32) + + le = LabelEncoder() + y_enc = le.fit_transform(y) + class_names = list(le.classes_) + + os.makedirs(os.path.dirname(ENCODER_PATH), exist_ok=True) + joblib.dump(le, ENCODER_PATH) + meta = { + "target_column": target_column, + "feature_names": feature_names, + "class_names": class_names + } + with open(META_PATH, "w") as f: + json.dump(meta, f) - model.fit(X, y) + model = LogisticRegression(**payload.get("params", {})) + model.fit(X, y_enc) + print("Intercept:", model.intercept_) + print("Coefficients:", model.coef_) - os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True) initial_type = [('float_input', FloatTensorType([None, X.shape[1]]))] onnx_model = convert_sklearn(model, initial_types=initial_type) + os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True) with open(MODEL_PATH, "wb") as f: f.write(onnx_model.SerializeToString()) + print("[DEBUG] Training complete. Saved model to:", MODEL_PATH) y_pred = model.predict(X) - acc = accuracy_score(y, y_pred) - prec = precision_score(y, y_pred, average='weighted', zero_division=0) - rec = recall_score(y, y_pred, average='weighted', zero_division=0) - f1 = f1_score(y, y_pred, average='weighted', zero_division=0) - report = classification_report(y, y_pred) - - print(f"[METRICS][train] accuracy={acc}, precision={prec}, recall={rec}, f1={f1}", file=sys.stderr) - print(f"[METRICS][train] classification_report:\n{report}", file=sys.stderr, flush=True) + acc = accuracy_score(y_enc, y_pred) + prec = precision_score(y_enc, y_pred, average='weighted', zero_division=0) + rec = recall_score(y_enc, y_pred, average='weighted', zero_division=0) + f1 = f1_score(y_enc, y_pred, average='weighted', zero_division=0) - metrics_str = f"acc={acc:.4f}, prec={prec:.4f}, rec={rec:.4f}, f1={f1:.4f}" + print(f"[TRAIN METRICS] acc={acc}, prec={prec}, rec={rec}, f1={f1}", file=sys.stderr) result = np.array([1.0, acc, prec, rec, f1], dtype=np.float32) return [Tensor("pipeline_output", result)] elif mode == "infer": if not os.path.exists(MODEL_PATH): - raise FileNotFoundError("Model not trained yet") + raise FileNotFoundError("Trained model not found") + if not os.path.exists(META_PATH): + raise FileNotFoundError("Metadata file missing") + + with open(META_PATH, "r") as f: + meta = json.load(f) + feature_names = meta["feature_names"] + class_names = meta.get("class_names", []) + + if any(f not in df.columns for f in feature_names): + missing = [f for f in feature_names if f not in df.columns] + raise ValueError(f"Missing required feature(s): {missing}") + + X_df = df[feature_names] + imp = SimpleImputer(strategy='mean') + X = imp.fit_transform(X_df).astype(np.float32) - y_true = None - if LABEL_COLUMN in df.columns: - y_true = df[LABEL_COLUMN].values - df = df.drop(columns=[LABEL_COLUMN]) - - X = df.values.astype(np.float32) sess = ort.InferenceSession(MODEL_PATH) input_name = sess.get_inputs()[0].name - preds = sess.run(None, {input_name: X})[0] - - if preds.ndim > 1 and preds.shape[1] == 1: - preds = preds.ravel() - - label_map = { - "Iris-setosa": 0, - "Iris-versicolor": 1, - "Iris-virginica": 2 - } - if isinstance(preds, str): - preds = np.array([preds]) - if preds.dtype.type is np.str_ or preds.dtype.type is np.object_: - res_int = np.vectorize(label_map.get)(preds) - else: - res_int = preds - - result = res_int.astype(np.float32) - - if y_true is not None: - if y_true.dtype.type is np.str_ or y_true.dtype.type is np.object_: - y_true_mapped = np.vectorize(label_map.get)(y_true) + output_names = [output.name for output in sess.get_outputs()] + outputs = sess.run(output_names, {input_name: X}) + print("[DEBUG] Model inference outputs:", output_names) + + if len(outputs) == 2: + label_indices, probs = outputs + label_indices = label_indices.ravel().astype(int) + if os.path.exists(ENCODER_PATH): + le = joblib.load(ENCODER_PATH) + labels = le.inverse_transform(label_indices) else: - y_true_mapped = y_true - - acc = accuracy_score(y_true_mapped, res_int) - prec = precision_score(y_true_mapped, res_int, average='weighted', zero_division=0) - rec = recall_score(y_true_mapped, res_int, average='weighted', zero_division=0) - f1 = f1_score(y_true_mapped, res_int, average='weighted', zero_division=0) - report = classification_report(y_true_mapped, res_int) - print(f"[METRICS][infer] accuracy={acc}, precision={prec}, recall={rec}, f1={f1}", file=sys.stderr) - print(f"[METRICS][infer] classification_report:\n{report}", file=sys.stderr, flush=True) + labels = label_indices + response = [] + for label, prob in zip(labels, probs): + label_prob_dict = {class_names[i]: float(p) for i, p in enumerate(prob)} + response.append({"label": label, "probabilities": label_prob_dict}) + + encoded_response = [json.dumps(item).encode("utf-8") for item in response] + return [Tensor("pipeline_output", np.array(encoded_response, dtype=object))] + + else: + raise RuntimeError("Unexpected ONNX model output structure.") - return [Tensor("pipeline_output", result)] else: raise ValueError(f"Unknown mode '{mode}'") + except Exception as e: - print(f"[ERROR] Exception in execute: {e}", file=sys.stderr) + print(f"[ERROR] {e}", file=sys.stderr) import traceback traceback.print_exc(file=sys.stderr) - error_msg = f"ERROR: {str(e)}".encode() - return [Tensor("pipeline_output", np.array([error_msg], dtype=object))] + err = f"ERROR: {str(e)}".encode() + return [Tensor("pipeline_output", np.array([err], dtype=object))] def finalize(self): print("[finalize] Python node finalized", file=sys.stderr, flush=True) From 701ef29d06ef156926dc684a1db9b703dd184ca0 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 23 Jul 2025 23:28:59 +0530 Subject: [PATCH 50/76] Create labelmap.json --- extras/iris_pipeline_project/labelmap.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 extras/iris_pipeline_project/labelmap.json diff --git a/extras/iris_pipeline_project/labelmap.json b/extras/iris_pipeline_project/labelmap.json new file mode 100644 index 0000000000..c9fe009386 --- /dev/null +++ b/extras/iris_pipeline_project/labelmap.json @@ -0,0 +1,6 @@ +{ + "1": "Iris-versicolor", + "0": "Iris-setosa", + "2": "Iris-virginica" +} + From b76cbdad38acca1cd896c88c63397e3bc89fea3d Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Wed, 23 Jul 2025 23:29:22 +0530 Subject: [PATCH 51/76] Update model_config.json --- extras/iris_pipeline_project/model_config.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/model_config.json b/extras/iris_pipeline_project/model_config.json index 2cfe59cfd2..c36f0df598 100644 --- a/extras/iris_pipeline_project/model_config.json +++ b/extras/iris_pipeline_project/model_config.json @@ -1,5 +1,12 @@ { - "model_config_list": [], + "model_config_list": [ + { + "config": { + "name": "infer_pipeline", + "base_path": "/workspace/model/generic_model" + } + } + ], "mediapipe_config_list": [ { "name": "pipeline", From 673704718b0edfa248df37ceeb2525c774bffff5 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sat, 26 Jul 2025 20:03:10 +0530 Subject: [PATCH 52/76] Update client_inference.py --- .../client/client_inference.py | 125 +++++++++++------- 1 file changed, 78 insertions(+), 47 deletions(-) diff --git a/extras/iris_pipeline_project/client/client_inference.py b/extras/iris_pipeline_project/client/client_inference.py index 58013f4f00..98b5027a39 100644 --- a/extras/iris_pipeline_project/client/client_inference.py +++ b/extras/iris_pipeline_project/client/client_inference.py @@ -5,56 +5,87 @@ import sys import os -if len(sys.argv) < 3 or sys.argv[1] not in ("train", "infer"): - print("Usage: python client_inference.py ") +SERVER_URL = "localhost:9000" +MODEL_NAME = "pipeline" + +def print_usage(): + print("Usage: python client_inference.py infer [--target_column ] [--labelmap ]") sys.exit(1) -mode = sys.argv[1] -csv_path = sys.argv[2] +def main(): + if len(sys.argv) < 3 or sys.argv[1] != "infer": + print_usage() -if not os.path.isfile(csv_path): - print(f"ERROR: Could not find CSV file: {csv_path}") - sys.exit(1) + mode = sys.argv[1] + csv_path = sys.argv[2] + target_column = None + labelmap_path = None -try: - df = pd.read_csv(csv_path) - print("Read CSV file successfully") -except Exception as e: - print(f"ERROR: Could not read CSV file: {e}") - sys.exit(1) -input_name = "pipeline_input" -infer_input = grpcclient.InferInput(input_name, pipeline_input.shape, "BYTES") -infer_input.set_data_from_numpy(pipeline_input) + for i in range(3, len(sys.argv)): + if sys.argv[i] == "--target_column" and i+1 < len(sys.argv): + target_column = sys.argv[i+1] + elif sys.argv[i] == "--labelmap" and i+1 < len(sys.argv): + labelmap_path = sys.argv[i+1] + + if not os.path.isfile(csv_path): + print(f"ERROR: Could not find CSV file: {csv_path}") + sys.exit(1) -if mode == "train": - if "Species" not in df.columns: - print("ERROR: Training CSV must contain a 'Species' column as the label.") + try: + df = pd.read_csv(csv_path) + print("CSV loaded successfully.") + except Exception as e: + print(f"ERROR: Failed to read CSV: {e}") sys.exit(1) - print("Training mode detected. Preparing data for training...") - -csv_str = df.to_csv(index=False) -if "Species" in df.columns: - df = df.drop(columns=["Species"]) -input_dict = {"mode": mode, "data": csv_str} -input_bytes = json.dumps(input_dict).encode("utf-8") -pipeline_input = np.array([input_bytes], dtype=object) - -input_name = "pipeline_input" -infer_input = grpcclient.InferInput(input_name, pipeline_input.shape, "BYTES") -infer_input.set_data_from_numpy(pipeline_input) - -print("Inference mode detected.") -client = grpcclient.InferenceServerClient(url="localhost:9000") -model_name = "pipeline" - -response = client.infer(model_name, [infer_input]) -preds = response.as_numpy("pipeline_output") - -if preds == 0.0: - result_string = "Iris-setosa" -elif preds == 1.0: - result_string = "Iris-versicolor" -else: - result_string = "Iris-virginica" - -print("Inference predictions:", result_string) + + if target_column and target_column in df.columns: + df = df.drop(columns=[target_column]) + + csv_str = df.to_csv(index=False) + input_dict = { + "mode": mode, + "data": csv_str, + "target_column": target_column + } + + input_bytes = json.dumps(input_dict).encode() + pipeline_input = np.array([input_bytes], dtype=object) + + try: + client = grpcclient.InferenceServerClient(url=SERVER_URL) + print(f"Connected to OVMS at {SERVER_URL}") + except Exception as e: + print(f"ERROR: Could not connect to OVMS at {SERVER_URL}: {e}") + sys.exit(1) + + infer_input = grpcclient.InferInput("pipeline_input", pipeline_input.shape, "BYTES") + infer_input.set_data_from_numpy(pipeline_input) + + try: + response = client.infer( + model_name=MODEL_NAME, + inputs=[infer_input] + ) + + result = response.as_numpy("pipeline_output") + + if isinstance(result, np.ndarray) and result.dtype == np.float32: + print(" Server responded with float32 array.") + # format: [1.0, label, confidence] + if len(result) >= 3: + status = result[0] + label = int(result[1]) + confidence = float(result[2]) + print(f" Inference Result:") + print(f"Prediction: {label} (Confidence: {confidence:.2f})") + else: + print(" Unexpected result shape:", result) + else: + print(" Server response (raw):", str(result)) + + except Exception as e: + print(f"ERROR: Inference call failed: {e}") + sys.exit(1) + +if __name__ == "__main__": + main() From 7845c64131f478dd6d0367f474af6068b5b9abd9 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Sat, 26 Jul 2025 20:03:51 +0530 Subject: [PATCH 53/76] Update ovmsmodel.py --- .../pipeline/ovmsmodel.py | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index fd440b4def..5b217a717e 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -91,13 +91,12 @@ def execute(self, inputs): print(f"[TRAIN METRICS] acc={acc}, prec={prec}, rec={rec}, f1={f1}", file=sys.stderr) result = np.array([1.0, acc, prec, rec, f1], dtype=np.float32) return [Tensor("pipeline_output", result)] - elif mode == "infer": if not os.path.exists(MODEL_PATH): raise FileNotFoundError("Trained model not found") if not os.path.exists(META_PATH): raise FileNotFoundError("Metadata file missing") - + with open(META_PATH, "r") as f: meta = json.load(f) feature_names = meta["feature_names"] @@ -116,25 +115,28 @@ def execute(self, inputs): output_names = [output.name for output in sess.get_outputs()] outputs = sess.run(output_names, {input_name: X}) print("[DEBUG] Model inference outputs:", output_names) + print("outputs: ", outputs) if len(outputs) == 2: label_indices, probs = outputs - label_indices = label_indices.ravel().astype(int) - if os.path.exists(ENCODER_PATH): - le = joblib.load(ENCODER_PATH) - labels = le.inverse_transform(label_indices) - else: - labels = label_indices - response = [] - for label, prob in zip(labels, probs): - label_prob_dict = {class_names[i]: float(p) for i, p in enumerate(prob)} - response.append({"label": label, "probabilities": label_prob_dict}) - - encoded_response = [json.dumps(item).encode("utf-8") for item in response] - return [Tensor("pipeline_output", np.array(encoded_response, dtype=object))] - - else: - raise RuntimeError("Unexpected ONNX model output structure.") + result_array = [] + + for i in range(len(label_indices)): + pred_index = int(label_indices[i]) + + prob_dict = probs[i] + + confidence = float(prob_dict[pred_index]) + + result_array.append([1.0, pred_index, confidence]) + + label_name = class_names[pred_index] if class_names else str(pred_index) + print(f"Sample {i} => Predicted Label: {label_name} (index: {pred_index}), Confidence: {confidence}", file=sys.stderr) + + return [Tensor("pipeline_output", np.array(result_array, dtype=np.float32))] + + + raise RuntimeError("Unexpected ONNX model output structure.") else: raise ValueError(f"Unknown mode '{mode}'") From e1dd8cb93f12cc9bfb2db1cf994342cff5ca2fd8 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Tue, 29 Jul 2025 00:32:01 +0530 Subject: [PATCH 54/76] Update Dockerfile --- extras/iris_pipeline_project/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile index 8f3ed9bc89..fde23ae9de 100644 --- a/extras/iris_pipeline_project/Dockerfile +++ b/extras/iris_pipeline_project/Dockerfile @@ -6,7 +6,7 @@ ENV LD_LIBRARY_PATH=/ovms/lib ENV PYTHONPATH=/ovms/lib/python RUN apt-get update && apt-get install -y python3-pip +RUN pip install --break-system-packages pandas numpy scikit-learn joblib skl2onnx onnx onnxruntime scikit-learn-intelex==2025.7.0 RUN rm /ovms/lib/libtbb.so* && cp /usr/local/lib/libtbb.so* /ovms/lib/ -RUN pip install --break-system-packages pandas numpy scikit-learn==1.3.2 joblib skl2onnx onnx onnxruntime scikit-learn-intelex==2024.0.0 ENTRYPOINT ["/ovms/bin/ovms"] From 2c28d8bea7bd7d88b8e2a88f1a5267777091928d Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Fri, 15 Aug 2025 14:25:13 +0530 Subject: [PATCH 55/76] Update Dockerfile --- extras/iris_pipeline_project/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile index fde23ae9de..f93031deb9 100644 --- a/extras/iris_pipeline_project/Dockerfile +++ b/extras/iris_pipeline_project/Dockerfile @@ -6,7 +6,10 @@ ENV LD_LIBRARY_PATH=/ovms/lib ENV PYTHONPATH=/ovms/lib/python RUN apt-get update && apt-get install -y python3-pip -RUN pip install --break-system-packages pandas numpy scikit-learn joblib skl2onnx onnx onnxruntime scikit-learn-intelex==2025.7.0 +RUN pip install --no-cache-dir --break-system-packages \ + torch==2.3.1+cpu --index-url https://download.pytorch.org/whl/cpu \ + pandas numpy scikit-learn joblib skl2onnx onnx onnxruntime \ + scikit-learn-intelex==2025.7.0 intel-extension-for-pytorch tritonclient[all] RUN rm /ovms/lib/libtbb.so* && cp /usr/local/lib/libtbb.so* /ovms/lib/ ENTRYPOINT ["/ovms/bin/ovms"] From 35aada3ea0c1fa9c67be185cfdbdc28ce9ec95e7 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Fri, 15 Aug 2025 14:26:11 +0530 Subject: [PATCH 56/76] Create model.py --- .../iris_pipeline_project/pipeline/model.py | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 extras/iris_pipeline_project/pipeline/model.py diff --git a/extras/iris_pipeline_project/pipeline/model.py b/extras/iris_pipeline_project/pipeline/model.py new file mode 100644 index 0000000000..3c4f7afb46 --- /dev/null +++ b/extras/iris_pipeline_project/pipeline/model.py @@ -0,0 +1,84 @@ +import abc +import numpy as np +import torch +import torch.nn as nn +from sklearn.cluster import KMeans + + +class ModelClass(abc.ABC): + @abc.abstractmethod + def fit(self, X: np.ndarray, y: np.ndarray, params: dict): + """ + Train the model and return a serializable trained object (could be self or something to export). + """ + pass + + @abc.abstractmethod + def predict(self, X: np.ndarray): + """ + Return predictions for X. + """ + pass + + +class LogisticRegressionTorch(ModelClass): + def __init__(self): + self.model = None + self.device = torch.device("cpu") + + def fit(self, X: np.ndarray, y: np.ndarray, params: dict): + try: + import intel_extension_for_pytorch as ipex + use_ipex = True + except ImportError: + use_ipex = False + + X_tensor = torch.from_numpy(X).float().to(self.device) + y_tensor = torch.from_numpy(y).long().to(self.device) + + input_dim = X.shape[1] + num_classes = len(np.unique(y)) + self.model = nn.Linear(input_dim, num_classes) + + criterion = nn.CrossEntropyLoss() + lr = params.get("lr", 0.01) + epochs = params.get("epochs", 100) + optimizer = torch.optim.SGD(self.model.parameters(), lr=lr) + + if use_ipex: + self.model, optimizer = ipex.optimize(self.model, optimizer=optimizer, dtype=torch.float32) + + self.model.train() + for _ in range(epochs): + optimizer.zero_grad() + outputs = self.model(X_tensor) + loss = criterion(outputs, y_tensor) + loss.backward() + optimizer.step() + return self + + def predict(self, X: np.ndarray): + if self.model is None: + raise RuntimeError("Model not trained") + self.model.eval() + X_tensor = torch.from_numpy(X).float() + with torch.no_grad(): + logits = self.model(X_tensor) + probs = torch.softmax(logits, dim=1) + preds = torch.argmax(probs, dim=1).cpu().numpy() + return preds, probs.cpu().numpy() + +class KMeansSkLearn(ModelClass): + def __init__(self): + self.model = None + + def fit(self, X: np.ndarray, y: np.ndarray, params: dict): + n_clusters = params.get("n_clusters", 3) + self.model = KMeans(n_clusters=n_clusters, random_state=42) + self.model.fit(X) + return self + + def predict(self, X: np.ndarray): + if self.model is None: + raise RuntimeError("Model not trained") + return self.model.predict(X) From 4b9784bc48a884685e137756c0fad63b94e9711e Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Fri, 15 Aug 2025 14:29:42 +0530 Subject: [PATCH 57/76] Update ovmsmodel.py --- .../pipeline/ovmsmodel.py | 165 ++++++------------ 1 file changed, 56 insertions(+), 109 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index 5b217a717e..d2ae283584 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -1,152 +1,99 @@ import os -import sys import json import numpy as np -import pandas as pd -from sklearnex import patch_sklearn -patch_sklearn() -from sklearn.linear_model import LogisticRegression -from skl2onnx import convert_sklearn -from skl2onnx.common.data_types import FloatTensorType -import onnxruntime as ort +import torch +import torch.nn as nn +import joblib from pyovms import Tensor -from io import StringIO +from model import LogisticRegressionTorch, ModelClass from sklearn.preprocessing import LabelEncoder -from sklearn.impute import SimpleImputer from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score -import joblib -MODEL_PATH = "/workspace/model/generic_model/1/model.onnx" -ENCODER_PATH = "/workspace/model/generic_model/1/label_encoder.joblib" -META_PATH = "/workspace/model/generic_model/1/meta.json" +MODEL_PATH = "/workspace/model/generic_model/model.pt" +ENCODER_PATH = "/workspace/model/generic_model/label_encoder.joblib" +META_PATH = "/workspace/model/generic_model/meta.json" + +AVAILABLE_MODEL_CLASSES = { + "LogisticRegressionTorch": LogisticRegressionTorch + "KMeansSKLearn" : KMeansSKLearn +} class OvmsPythonModel: def initialize(self, kwargs): - print("[initialize] Python node initialized", file=sys.stderr, flush=True) + print("[initialize] Python node initialized", flush=True) + self.model_obj = None def execute(self, inputs): - print("==== [execute] Python node called ====", file=sys.stderr, flush=True) try: - input_tensor = inputs[0] - inp_bytes = bytes(input_tensor.data) + inp_bytes = bytes(inputs[0].data) first_brace = inp_bytes.find(b'{') if first_brace > 0: inp_bytes = inp_bytes[first_brace:] - payload = json.loads(inp_bytes.decode("utf-8")) + mode = payload.get("mode") - csv_str = payload.get("data") - target_column = payload.get("target_column") - print("Received payload:", csv_str) + X = np.array(payload.get("X"), dtype=np.float32) + y = payload.get("y", None) + params = payload.get("params", {}) + model_class_name = payload.get("model_class", "LogisticRegressionTorch") - if not isinstance(csv_str, str): - raise ValueError("Missing or invalid 'data' field") + if model_class_name not in AVAILABLE_MODEL_CLASSES: + raise ValueError(f"Unknown model: {model_class_name}") - df = pd.read_csv(StringIO(csv_str)) + model_obj = AVAILABLE_MODEL_CLASSES[model_class_name]() if mode == "train": - if target_column not in df.columns: - raise ValueError(f"Label column '{target_column}' not found") - - X_df = df.drop(columns=[target_column]) - y = df[target_column].values - feature_names = list(X_df.columns) - - print("Handling missing values...") - imp = SimpleImputer(strategy='mean') - X = imp.fit_transform(X_df).astype(np.float32) - + if y is None: + raise ValueError("y labels are required for training") + y = np.array(y) le = LabelEncoder() y_enc = le.fit_transform(y) - class_names = list(le.classes_) - os.makedirs(os.path.dirname(ENCODER_PATH), exist_ok=True) + trained = model_obj.fit(X, y_enc, params.get("train_params", {})) + + torch.save(trained.model.state_dict(), MODEL_PATH) joblib.dump(le, ENCODER_PATH) - meta = { - "target_column": target_column, - "feature_names": feature_names, - "class_names": class_names - } with open(META_PATH, "w") as f: - json.dump(meta, f) - - model = LogisticRegression(**payload.get("params", {})) - model.fit(X, y_enc) - print("Intercept:", model.intercept_) - print("Coefficients:", model.coef_) - - initial_type = [('float_input', FloatTensorType([None, X.shape[1]]))] - onnx_model = convert_sklearn(model, initial_types=initial_type) - os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True) - with open(MODEL_PATH, "wb") as f: - f.write(onnx_model.SerializeToString()) - print("[DEBUG] Training complete. Saved model to:", MODEL_PATH) - - y_pred = model.predict(X) - acc = accuracy_score(y_enc, y_pred) - prec = precision_score(y_enc, y_pred, average='weighted', zero_division=0) - rec = recall_score(y_enc, y_pred, average='weighted', zero_division=0) - f1 = f1_score(y_enc, y_pred, average='weighted', zero_division=0) - - print(f"[TRAIN METRICS] acc={acc}, prec={prec}, rec={rec}, f1={f1}", file=sys.stderr) - result = np.array([1.0, acc, prec, rec, f1], dtype=np.float32) - return [Tensor("pipeline_output", result)] + json.dump({"num_features": X.shape[1], "num_classes": len(le.classes_)}, f) + + preds, _ = trained.predict(X) + acc = accuracy_score(y_enc, preds) + prec = precision_score(y_enc, preds, average='weighted', zero_division=0) + rec = recall_score(y_enc, preds, average='weighted', zero_division=0) + f1 = f1_score(y_enc, preds, average='weighted', zero_division=0) + + return [Tensor("pipeline_output", np.array([1.0, acc, prec, rec, f1], dtype=np.float32))] + elif mode == "infer": if not os.path.exists(MODEL_PATH): - raise FileNotFoundError("Trained model not found") - if not os.path.exists(META_PATH): - raise FileNotFoundError("Metadata file missing") + raise FileNotFoundError("No model checkpoint found") with open(META_PATH, "r") as f: meta = json.load(f) - feature_names = meta["feature_names"] - class_names = meta.get("class_names", []) - - if any(f not in df.columns for f in feature_names): - missing = [f for f in feature_names if f not in df.columns] - raise ValueError(f"Missing required feature(s): {missing}") - - X_df = df[feature_names] - imp = SimpleImputer(strategy='mean') - X = imp.fit_transform(X_df).astype(np.float32) - - sess = ort.InferenceSession(MODEL_PATH) - input_name = sess.get_inputs()[0].name - output_names = [output.name for output in sess.get_outputs()] - outputs = sess.run(output_names, {input_name: X}) - print("[DEBUG] Model inference outputs:", output_names) - print("outputs: ", outputs) - - if len(outputs) == 2: - label_indices, probs = outputs - result_array = [] - - for i in range(len(label_indices)): - pred_index = int(label_indices[i]) - - prob_dict = probs[i] - - confidence = float(prob_dict[pred_index]) - - result_array.append([1.0, pred_index, confidence]) + num_features = meta["num_features"] + num_classes = meta["num_classes"] - label_name = class_names[pred_index] if class_names else str(pred_index) - print(f"Sample {i} => Predicted Label: {label_name} (index: {pred_index}), Confidence: {confidence}", file=sys.stderr) + model_obj.model = nn.Linear(num_features, num_classes) + model_obj.model.load_state_dict(torch.load(MODEL_PATH)) + model_obj.model.eval() - return [Tensor("pipeline_output", np.array(result_array, dtype=np.float32))] + preds, probs = model_obj.predict(X) + le = joblib.load(ENCODER_PATH) + labels = le.inverse_transform(preds) + response = [] + for label, prob in zip(labels, probs): + prob_dict = {le.classes_[i]: float(p) for i, p in enumerate(prob)} + response.append({"label": label, "probabilities": prob_dict}) - raise RuntimeError("Unexpected ONNX model output structure.") + return [Tensor("pipeline_output", np.array(response, dtype=object))] else: raise ValueError(f"Unknown mode '{mode}'") except Exception as e: - print(f"[ERROR] {e}", file=sys.stderr) - import traceback - traceback.print_exc(file=sys.stderr) - err = f"ERROR: {str(e)}".encode() - return [Tensor("pipeline_output", np.array([err], dtype=object))] + print(f"[ERROR] {e}") + return [Tensor("pipeline_output", np.array([f"ERROR: {e}"], dtype=object))] def finalize(self): - print("[finalize] Python node finalized", file=sys.stderr, flush=True) + print("[finalize] Python node finalized", flush=True) From 0c1202f39a96aa693f0bdc37b2b6fe83ccf30ae8 Mon Sep 17 00:00:00 2001 From: darksapien23151 Date: Sat, 30 Aug 2025 22:12:54 +0530 Subject: [PATCH 58/76] Add hyperparameters --- extras/iris_pipeline_project/kmeans_param.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 extras/iris_pipeline_project/kmeans_param.json diff --git a/extras/iris_pipeline_project/kmeans_param.json b/extras/iris_pipeline_project/kmeans_param.json new file mode 100644 index 0000000000..119a724807 --- /dev/null +++ b/extras/iris_pipeline_project/kmeans_param.json @@ -0,0 +1,4 @@ +{ + "n_clusters": 3, + "random_state": 42 +} \ No newline at end of file From 11e367327a7ebfe59a6f992bf4003ad5ae579ada Mon Sep 17 00:00:00 2001 From: darksapien23151 Date: Sat, 30 Aug 2025 23:35:43 +0530 Subject: [PATCH 59/76] Add KMeans support --- extras/iris_pipeline_project/Dockerfile | 12 +- .../client/client_inference.py | 169 +++++- .../client/client_train.py | 63 ++- .../data_folder/iris_test.csv | 2 + .../data_folder/iris_train.csv | 508 ++++++++++++++++++ .../iris_pipeline_project/pipeline/model.py | 57 +- .../pipeline/ovmsmodel.py | 137 +++-- 7 files changed, 842 insertions(+), 106 deletions(-) create mode 100644 extras/iris_pipeline_project/data_folder/iris_test.csv create mode 100644 extras/iris_pipeline_project/data_folder/iris_train.csv diff --git a/extras/iris_pipeline_project/Dockerfile b/extras/iris_pipeline_project/Dockerfile index f93031deb9..5d0dd8ef5f 100644 --- a/extras/iris_pipeline_project/Dockerfile +++ b/extras/iris_pipeline_project/Dockerfile @@ -7,9 +7,17 @@ ENV PYTHONPATH=/ovms/lib/python RUN apt-get update && apt-get install -y python3-pip RUN pip install --no-cache-dir --break-system-packages \ - torch==2.3.1+cpu --index-url https://download.pytorch.org/whl/cpu \ pandas numpy scikit-learn joblib skl2onnx onnx onnxruntime \ - scikit-learn-intelex==2025.7.0 intel-extension-for-pytorch tritonclient[all] + scikit-learn-intelex==2025.7.0 \ + tritonclient[all] +RUN python3 -m pip install --no-cache-dir --break-system-packages \ + torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu && \ + python3 -m pip install --no-cache-dir --break-system-packages \ + intel-extension-for-pytorch oneccl_bind_pt \ + --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/cpu/us/ + RUN rm /ovms/lib/libtbb.so* && cp /usr/local/lib/libtbb.so* /ovms/lib/ ENTRYPOINT ["/ovms/bin/ovms"] + + diff --git a/extras/iris_pipeline_project/client/client_inference.py b/extras/iris_pipeline_project/client/client_inference.py index 98b5027a39..76f24ab95a 100644 --- a/extras/iris_pipeline_project/client/client_inference.py +++ b/extras/iris_pipeline_project/client/client_inference.py @@ -4,12 +4,13 @@ import json import sys import os - +import matplotlib.pyplot as plt +import numpy as np SERVER_URL = "localhost:9000" MODEL_NAME = "pipeline" def print_usage(): - print("Usage: python client_inference.py infer [--target_column ] [--labelmap ]") + print("Usage: python client_inference.py infer [--target_column ] [--encode ] [--model_class ]") sys.exit(1) def main(): @@ -19,13 +20,19 @@ def main(): mode = sys.argv[1] csv_path = sys.argv[2] target_column = None - labelmap_path = None + encode_cols = [] + model_class_name = "LogisticRegressionTorch" for i in range(3, len(sys.argv)): if sys.argv[i] == "--target_column" and i+1 < len(sys.argv): target_column = sys.argv[i+1] - elif sys.argv[i] == "--labelmap" and i+1 < len(sys.argv): - labelmap_path = sys.argv[i+1] + elif sys.argv[i] == "--encode" and i+1 < len(sys.argv): + encode_cols = sys.argv[i+1].split(",") + elif sys.argv[i] == "--model_class" and i+1 < len(sys.argv): + model_class_name = sys.argv[i+1] + + if "KMeans" in model_class_name or (target_column and target_column.lower() == "none"): + target_column = None if not os.path.isfile(csv_path): print(f"ERROR: Could not find CSV file: {csv_path}") @@ -33,22 +40,34 @@ def main(): try: df = pd.read_csv(csv_path) - print("CSV loaded successfully.") + print("CSV loaded successfully. kmeans") except Exception as e: print(f"ERROR: Failed to read CSV: {e}") sys.exit(1) - if target_column and target_column in df.columns: + if "KMeans" not in model_class_name and target_column and target_column in df.columns: df = df.drop(columns=[target_column]) - csv_str = df.to_csv(index=False) - input_dict = { + if encode_cols: + for col in encode_cols: + if col in df.columns: + from sklearn.preprocessing import LabelEncoder + le = LabelEncoder() + df[col] = le.fit_transform(df[col]) + else: + print(f"WARNING: Encode column '{col}' not found in CSV") + + X = df.values + + payload = { "mode": mode, - "data": csv_str, - "target_column": target_column + "X": X.tolist(), + "y": None, + "params": {}, + "model_class": model_class_name } - input_bytes = json.dumps(input_dict).encode() + input_bytes = json.dumps(payload).encode("utf-8") pipeline_input = np.array([input_bytes], dtype=object) try: @@ -69,23 +88,123 @@ def main(): result = response.as_numpy("pipeline_output") - if isinstance(result, np.ndarray) and result.dtype == np.float32: - print(" Server responded with float32 array.") - # format: [1.0, label, confidence] - if len(result) >= 3: - status = result[0] - label = int(result[1]) - confidence = float(result[2]) - print(f" Inference Result:") - print(f"Prediction: {label} (Confidence: {confidence:.2f})") - else: - print(" Unexpected result shape:", result) + if result.dtype == object: + for item in result: + if isinstance(item, (bytes, bytearray)): + item = item.decode("utf-8") + parsed = json.loads(item) + print("Cluster assignments:", parsed["labels"]) + print("Cluster centroids:", parsed["centroids"]) + else: + pass + + if result.dtype in [np.float64, np.float32]: + raw_bytes = result.view(np.uint8).tobytes() + decoded = raw_bytes.decode("utf-8", errors="ignore").strip("\x00") + decoded_items = [decoded] + + + print("DEBUG result type:", type(result)) + if isinstance(result, np.ndarray): + print("DEBUG result dtype:", result.dtype) + print("DEBUG result shape:", result.shape) + + if "KMeans" in model_class_name: + decoded_items = [] + if isinstance(result, np.ndarray): + if result.dtype == object: + decoded_items = result + elif result.dtype in [np.float64, np.float32]: + raw_bytes = result.tobytes() + try: + decoded = raw_bytes.decode("utf-8").strip("\x00") + decoded_items = [decoded] + except Exception as e: + pass + + for item in decoded_items: + if isinstance(item, (bytes, bytearray)): + item = item.decode() + try: + response_data = json.loads(item) + except Exception: + response_data = item + + print("KMeans clustering result:") + if isinstance(response_data, dict) and "labels" in response_data and "centroids" in response_data: + labels = response_data["labels"] + centroids = np.array(response_data["centroids"]) + + print("Cluster assignments:", labels[:20], "...") + print("Cluster centroids:") + for i, centroid in enumerate(centroids): + print(f" Centroid {i}: {centroid}") + + X = df.drop(columns=[target_column]) if target_column else df + X = X.values + plt.figure(figsize=(8, 6)) + plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="viridis", s=30, alpha=0.7, label="Points") + plt.scatter(centroids[:, 0], centroids[:, 1], c="red", s=200, marker="X", label="Centroids") + plt.title("KMeans Clustering Result") + plt.xlabel("Feature 1") + plt.ylabel("Feature 2") + plt.legend() + plt.show() + else: + print("Unexpected response:", response_data) + + elif isinstance(result, np.ndarray) and result.dtype == object: + print("Server responded with object array.") + for item in result: + if isinstance(item, (bytes, bytearray)): + try: + item = item.decode() + except Exception: + pass + try: + response_data = json.loads(item) + except Exception: + response_data = item + if isinstance(response_data, list): + for entry in response_data: + label = entry.get("label") + probs = entry.get("probabilities", {}) + print(f"Prediction: {label}") + print("Probabilities:") + for k, v in probs.items(): + print(f" {k}: {v:.4f}") + print("-" * 30) + elif isinstance(response_data, dict): + label = response_data.get("label") + probs = response_data.get("probabilities", {}) + print(f"Prediction: {label}") + print("Probabilities:") + for k, v in probs.items(): + print(f" {k}: {v:.4f}") + print("-" * 30) + else: + print(response_data) + elif isinstance(result, (bytes, bytearray)): + try: + decoded = result.decode() + print("Decoded result:", decoded) + try: + response_data = json.loads(decoded) + print(json.dumps(response_data, indent=2)) + except Exception: + print(decoded) + except Exception: + print("Raw bytes result:", result) + elif isinstance(result, np.ndarray) and result.dtype in [np.float32, np.float64]: + print("Server responded with numeric array.") + print("Values:", result) else: - print(" Server response (raw):", str(result)) + print("Server response (raw):", str(result)) + except Exception as e: print(f"ERROR: Inference call failed: {e}") sys.exit(1) if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/extras/iris_pipeline_project/client/client_train.py b/extras/iris_pipeline_project/client/client_train.py index 65583a84ca..11e8944c44 100644 --- a/extras/iris_pipeline_project/client/client_train.py +++ b/extras/iris_pipeline_project/client/client_train.py @@ -5,22 +5,25 @@ import pandas as pd import numpy as np import tritonclient.grpc as grpcclient +from sklearn.preprocessing import LabelEncoder + def main(): SERVER_URL = "localhost:9000" MODEL_NAME = "pipeline" if len(sys.argv) < 4 or sys.argv[1] not in ("train", "infer"): - print("Usage: python client_train.py " - "[--params ] [--encode ]") + print("Usage: python client_train.py " + "[--params ] [--encode ] [--model_class ]") sys.exit(1) mode = sys.argv[1] csv_path = sys.argv[2] - target_column = sys.argv[3] + target_column = sys.argv[3] if sys.argv[3] != "NONE" else None params_path = None encode_cols = [] + model_class_name = "LogisticRegressionTorch" if "--params" in sys.argv: idx = sys.argv.index("--params") @@ -32,6 +35,11 @@ def main(): if idx + 1 < len(sys.argv): encode_cols = sys.argv[idx + 1].split(",") + if "--model_class" in sys.argv: + idx = sys.argv.index("--model_class") + if idx + 1 < len(sys.argv): + model_class_name = sys.argv[idx + 1] + if not os.path.isfile(csv_path): print(f"ERROR: Could not find CSV file: {csv_path}") sys.exit(1) @@ -43,29 +51,43 @@ def main(): print(f"ERROR: Could not read CSV file: {e}") sys.exit(1) - if mode == "train": - print(" Training mode detected. Preparing dataset...") + if encode_cols: + for col in encode_cols: + if col in df.columns: + le = LabelEncoder() + df[col] = le.fit_transform(df[col]) + else: + print(f"WARNING: Encode column '{col}' not found in CSV") + + if model_class_name == "KMeans": + X = df.values + y = None + else: + if not target_column or target_column not in df.columns: + print(f"ERROR: Target column '{target_column}' not found in CSV") + sys.exit(1) + X = df.drop(columns=[target_column]).values + y = df[target_column].values.tolist() if mode == "train" else None params = {} if params_path: try: with open(params_path, "r") as f: params = json.load(f) - print(f" Loaded hyperparameters: {params}") + print(f"Loaded hyperparameters: {params}") except Exception as e: print(f"ERROR: Could not read params JSON: {e}") sys.exit(1) - csv_str = df.to_csv(index=False) - input_dict = { + payload = { "mode": mode, - "data": csv_str, + "X": X.tolist(), + "y": y, "params": params, - "target_column": target_column, - "encode_columns": encode_cols + "model_class": model_class_name } - input_bytes = json.dumps(input_dict).encode() + input_bytes = json.dumps(payload).encode("utf-8") pipeline_input = np.array([input_bytes], dtype=object) try: @@ -86,13 +108,24 @@ def main(): result = response.as_numpy("pipeline_output") if isinstance(result, np.ndarray) and result.dtype == object: - print("Server response:", result[0].decode()) + print("Server response:") + for item in result: + if isinstance(item, (bytes, bytearray)): + try: + item = item.decode() + except Exception: + pass + try: + response_data = json.loads(item) + print(json.dumps(response_data, indent=2)) + except Exception: + print(item) else: - print("Server response (raw):", str(result)) + print("Model trained successfully") except Exception as e: print(f"ERROR: Inference call failed: {e}") sys.exit(1) if __name__ == "__main__": - main() + main() \ No newline at end of file diff --git a/extras/iris_pipeline_project/data_folder/iris_test.csv b/extras/iris_pipeline_project/data_folder/iris_test.csv new file mode 100644 index 0000000000..aa74f99149 --- /dev/null +++ b/extras/iris_pipeline_project/data_folder/iris_test.csv @@ -0,0 +1,2 @@ +SepalLength,SepalWidth,PetalLength,PetalWidth +6.1,2.8,4.7,1.2 diff --git a/extras/iris_pipeline_project/data_folder/iris_train.csv b/extras/iris_pipeline_project/data_folder/iris_train.csv new file mode 100644 index 0000000000..94775782c1 --- /dev/null +++ b/extras/iris_pipeline_project/data_folder/iris_train.csv @@ -0,0 +1,508 @@ +SepalLength,SepalWidth,PetalLength,PetalWidth,Species +6.1,2.8,4.7,1.2,Iris-versicolor +5.7,3.8,1.7,0.3,Iris-setosa +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.9,4.5,1.5,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +5.4,3.4,1.5,0.4,Iris-setosa +5.6,2.9,3.6,1.3,Iris-versicolor +6.9,3.1,5.1,2.3,Iris-virginica +6.2,2.2,4.5,1.5,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.5,3.2,5.1,2.0,Iris-virginica +4.8,3.0,1.4,0.1,Iris-setosa +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +6.3,3.3,4.7,1.6,Iris-versicolor +6.5,3.0,5.8,2.2,Iris-virginica +5.6,2.5,3.9,1.1,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.4,2.8,5.6,2.2,Iris-virginica +4.7,3.2,1.6,0.2,Iris-setosa +6.1,3.0,4.9,1.8,Iris-virginica +5.0,3.4,1.6,0.4,Iris-setosa +6.4,2.8,5.6,2.1,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +4.8,3.0,1.4,0.3,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +6.7,3.1,4.4,1.4,Iris-versicolor +4.8,3.4,1.6,0.2,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +6.3,2.5,5.0,1.9,Iris-virginica +6.4,3.2,4.5,1.5,Iris-versicolor +5.2,3.5,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.8,2.7,5.1,1.9,Iris-virginica +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +5.4,3.9,1.3,0.4,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +5.5,2.4,3.7,1.0,Iris-versicolor +6.3,2.8,5.1,1.5,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.6,3.0,4.4,1.4,Iris-versicolor +7.2,3.6,6.1,2.5,Iris-virginica +5.7,2.9,4.2,1.3,Iris-versicolor +7.6,3.0,6.6,2.1,Iris-virginica +5.6,3.0,4.5,1.5,Iris-versicolor +5.1,3.5,1.4,0.2,Iris-setosa +7.7,2.8,6.7,2.0,Iris-virginica +5.8,2.7,4.1,1.0,Iris-versicolor +5.2,3.4,1.4,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +5.0,2.0,3.5,1.0,Iris-versicolor +6.3,2.7,4.9,1.8,Iris-virginica +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +5.6,2.7,4.2,1.3,Iris-versicolor +5.1,3.4,1.5,0.2,Iris-setosa +5.7,3.0,4.2,1.2,Iris-versicolor +7.7,3.8,6.7,2.2,Iris-virginica +4.6,3.2,1.4,0.2,Iris-setosa +6.2,2.9,4.3,1.3,Iris-versicolor +5.7,2.5,5.0,2.0,Iris-virginica +5.5,4.2,1.4,0.2,Iris-setosa +6.0,3.0,4.8,1.8,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.0,2.2,4.0,1.0,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.2,3.4,5.4,2.3,Iris-virginica +5.5,2.3,4.0,1.3,Iris-versicolor +5.4,3.9,1.7,0.4,Iris-setosa +5.0,2.3,3.3,1.0,Iris-versicolor +6.4,2.7,5.3,1.9,Iris-virginica +5.0,3.3,1.4,0.2,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,2.4,3.8,1.1,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +4.9,3.1,1.5,0.1,Iris-setosa +5.8,2.8,5.1,2.4,Iris-virginica +5.0,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.9,3.2,4.8,1.8,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +6.9,3.2,5.7,2.3,Iris-virginica +6.0,2.7,5.1,1.6,Iris-versicolor +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +5.5,2.5,4.0,1.3,Iris-versicolor +4.4,2.9,1.4,0.2,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +6.0,2.2,5.0,1.5,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +4.6,3.1,1.5,0.2,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +6.3,2.5,4.9,1.5,Iris-versicolor +6.3,3.4,5.6,2.4,Iris-virginica +4.6,3.4,1.4,0.3,Iris-setosa +6.8,3.0,5.5,2.1,Iris-virginica +6.3,3.3,6.0,2.5,Iris-virginica +4.7,3.2,1.3,0.2,Iris-setosa +6.1,2.9,4.7,1.4,Iris-versicolor +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +6.2,2.8,4.8,1.8,Iris-virginica +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,5.3,2.3,Iris-virginica +5.1,3.8,1.6,0.2,Iris-setosa +6.9,3.1,5.4,2.1,Iris-virginica +5.9,3.0,4.2,1.5,Iris-versicolor +6.5,3.0,5.2,2.0,Iris-virginica +5.7,2.6,3.5,1.0,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +4.5,2.3,1.3,0.3,Iris-setosa +6.6,2.9,4.6,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +5.3,3.7,1.5,0.2,Iris-setosa +5.6,3.0,4.1,1.3,Iris-versicolor +7.3,2.9,6.3,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +5.1,3.7,1.5,0.4,Iris-setosa +4.9,2.4,3.3,1.0,Iris-versicolor +6.7,3.3,5.7,2.5,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +4.9,3.1,1.5,0.1,Iris-setosa +6.7,3.1,5.6,2.4,Iris-virginica +4.9,3.0,1.4,0.2,Iris-setosa +6.9,3.1,4.9,1.5,Iris-versicolor +7.4,2.8,6.1,1.9,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +5.7,2.8,4.1,1.3,Iris-versicolor +6.5,3.0,5.5,1.8,Iris-virginica +6.3,2.3,4.4,1.3,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +5.6,2.8,4.9,2.0,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica +5.4,3.4,1.7,0.2,Iris-setosa +6.1,2.8,4.0,1.3,Iris-versicolor +4.9,2.5,4.5,1.7,Iris-virginica +5.8,4.0,1.2,0.2,Iris-setosa +5.8,2.6,4.0,1.2,Iris-versicolor +7.1,3.0,5.9,2.1,Iris-virginica +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +7.3,2.9,6.3,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +5.1,3.7,1.5,0.4,Iris-setosa +4.9,2.4,3.3,1.0,Iris-versicolor +6.7,3.3,5.7,2.5,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +4.9,3.1,1.5,0.1,Iris-setosa +6.7,3.1,5.6,2.4,Iris-virginica +4.9,3.0,1.4,0.2,Iris-setosa +6.9,3.1,4.9,1.5,Iris-versicolor +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +7.4,2.8,6.1,1.9,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +5.7,2.8,4.1,1.3,Iris-versicolor +6.5,3.0,5.5,1.8,Iris-virginica +6.3,2.3,4.4,1.3,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +5.6,2.8,4.9,2.0,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica +5.4,3.4,1.7,0.2,Iris-setosa +6.1,2.8,4.0,1.3,Iris-versicolor +4.9,2.5,4.5,1.7,Iris-virginica +5.8,4.0,1.2,0.2,Iris-setosa +5.8,2.6,4.0,1.2,Iris-versicolor +7.1,3.0,5.9,2.1,Iris-virginica +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa \ No newline at end of file diff --git a/extras/iris_pipeline_project/pipeline/model.py b/extras/iris_pipeline_project/pipeline/model.py index 3c4f7afb46..8c1c2fca6b 100644 --- a/extras/iris_pipeline_project/pipeline/model.py +++ b/extras/iris_pipeline_project/pipeline/model.py @@ -1,35 +1,36 @@ import abc +import time import numpy as np import torch import torch.nn as nn from sklearn.cluster import KMeans +from sklearnex import patch_sklearn, unpatch_sklearn +import intel_extension_for_pytorch as ipex class ModelClass(abc.ABC): @abc.abstractmethod def fit(self, X: np.ndarray, y: np.ndarray, params: dict): - """ - Train the model and return a serializable trained object (could be self or something to export). - """ pass @abc.abstractmethod def predict(self, X: np.ndarray): - """ - Return predictions for X. - """ pass class LogisticRegressionTorch(ModelClass): - def __init__(self): + def __init__(self, use_ipex=False): self.model = None self.device = torch.device("cpu") + self.use_ipex = True def fit(self, X: np.ndarray, y: np.ndarray, params: dict): try: - import intel_extension_for_pytorch as ipex - use_ipex = True + if self.use_ipex: + import intel_extension_for_pytorch as ipex + use_ipex = True + else: + use_ipex = False except ImportError: use_ipex = False @@ -48,6 +49,7 @@ def fit(self, X: np.ndarray, y: np.ndarray, params: dict): if use_ipex: self.model, optimizer = ipex.optimize(self.model, optimizer=optimizer, dtype=torch.float32) + start = time.perf_counter() self.model.train() for _ in range(epochs): optimizer.zero_grad() @@ -55,30 +57,61 @@ def fit(self, X: np.ndarray, y: np.ndarray, params: dict): loss = criterion(outputs, y_tensor) loss.backward() optimizer.step() + end = time.perf_counter() + + print(f"[Torch LogisticRegression] Training time (IPEX={use_ipex}): {end - start:.4f} sec") return self def predict(self, X: np.ndarray): if self.model is None: raise RuntimeError("Model not trained") + + X_tensor = torch.from_numpy(X).float().to(self.device) + start = time.perf_counter() self.model.eval() - X_tensor = torch.from_numpy(X).float() with torch.no_grad(): logits = self.model(X_tensor) probs = torch.softmax(logits, dim=1) preds = torch.argmax(probs, dim=1).cpu().numpy() + end = time.perf_counter() + + print(f"[Torch LogisticRegression] Inference time: {end - start:.4f} sec") return preds, probs.cpu().numpy() + class KMeansSkLearn(ModelClass): - def __init__(self): + def __init__(self, use_onedal=False): self.model = None + self.use_onedal = use_onedal def fit(self, X: np.ndarray, y: np.ndarray, params: dict): + if self.use_onedal: + patch_sklearn() + else: + unpatch_sklearn() + n_clusters = params.get("n_clusters", 3) self.model = KMeans(n_clusters=n_clusters, random_state=42) + + start = time.perf_counter() self.model.fit(X) + end = time.perf_counter() + + print(f"[Sklearn KMeans] Training time (oneDAL={self.use_onedal}): {end - start:.4f} sec") return self def predict(self, X: np.ndarray): if self.model is None: raise RuntimeError("Model not trained") - return self.model.predict(X) + + start = time.perf_counter() + labels = self.model.predict(X) + centroids = self.model.cluster_centers_ + end = time.perf_counter() + print(f"[Sklearn KMeans] Inference time (oneDAL={self.use_onedal}): {end - start:.4f} sec") + return labels, centroids + + def get_inertia(self): + if self.model is None: + raise RuntimeError("Model not trained") + return self.model.inertia_ diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index d2ae283584..f8b7563cac 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -5,17 +5,18 @@ import torch.nn as nn import joblib from pyovms import Tensor -from model import LogisticRegressionTorch, ModelClass +from model import LogisticRegressionTorch, KMeansSkLearn, ModelClass from sklearn.preprocessing import LabelEncoder from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score + MODEL_PATH = "/workspace/model/generic_model/model.pt" ENCODER_PATH = "/workspace/model/generic_model/label_encoder.joblib" META_PATH = "/workspace/model/generic_model/meta.json" AVAILABLE_MODEL_CLASSES = { - "LogisticRegressionTorch": LogisticRegressionTorch - "KMeansSKLearn" : KMeansSKLearn + "LogisticRegressionTorch": LogisticRegressionTorch, + "KMeansSkLearn": KMeansSkLearn } class OvmsPythonModel: @@ -42,58 +43,90 @@ def execute(self, inputs): model_obj = AVAILABLE_MODEL_CLASSES[model_class_name]() - if mode == "train": - if y is None: - raise ValueError("y labels are required for training") - y = np.array(y) - le = LabelEncoder() - y_enc = le.fit_transform(y) - - trained = model_obj.fit(X, y_enc, params.get("train_params", {})) - - torch.save(trained.model.state_dict(), MODEL_PATH) - joblib.dump(le, ENCODER_PATH) - with open(META_PATH, "w") as f: - json.dump({"num_features": X.shape[1], "num_classes": len(le.classes_)}, f) - - preds, _ = trained.predict(X) - acc = accuracy_score(y_enc, preds) - prec = precision_score(y_enc, preds, average='weighted', zero_division=0) - rec = recall_score(y_enc, preds, average='weighted', zero_division=0) - f1 = f1_score(y_enc, preds, average='weighted', zero_division=0) - - return [Tensor("pipeline_output", np.array([1.0, acc, prec, rec, f1], dtype=np.float32))] - - elif mode == "infer": - if not os.path.exists(MODEL_PATH): - raise FileNotFoundError("No model checkpoint found") - - with open(META_PATH, "r") as f: - meta = json.load(f) - num_features = meta["num_features"] - num_classes = meta["num_classes"] - - model_obj.model = nn.Linear(num_features, num_classes) - model_obj.model.load_state_dict(torch.load(MODEL_PATH)) - model_obj.model.eval() - - preds, probs = model_obj.predict(X) - le = joblib.load(ENCODER_PATH) - labels = le.inverse_transform(preds) - - response = [] - for label, prob in zip(labels, probs): - prob_dict = {le.classes_[i]: float(p) for i, p in enumerate(prob)} - response.append({"label": label, "probabilities": prob_dict}) - - return [Tensor("pipeline_output", np.array(response, dtype=object))] - + if model_class_name == "KMeansSkLearn": + if mode == "train": + trained = model_obj.fit(X, None, params.get("train_params", {})) + joblib.dump(trained.model, MODEL_PATH) + with open(META_PATH, "w") as f: + json.dump({ + "num_features": X.shape[1], + "n_clusters": trained.model.n_clusters + }, f) + inertia = trained.model.inertia_ + return [Tensor("pipeline_output", np.array([1.0, inertia], dtype=np.float32))] + elif mode == "infer": + if not os.path.exists(META_PATH) or not os.path.exists(MODEL_PATH): + raise FileNotFoundError("No model checkpoint found") + with open(META_PATH, "r") as f: + meta = json.load(f) + model_obj.model = joblib.load(MODEL_PATH) + labels = model_obj.model.predict(X) + centroids = model_obj.model.cluster_centers_ + response = { + "labels": labels.tolist(), + "centroids": centroids.tolist() + } + print(response, flush=True) + json_bytes = json.dumps(response).encode("utf-8") + + output = np.array([json_bytes], dtype=object) + + return [Tensor("pipeline_output", output)] + else: + raise ValueError(f"Unknown mode '{mode}' for KMeansSkLearn") else: - raise ValueError(f"Unknown mode '{mode}'") - + if mode == "train": + if y is None: + raise ValueError("y labels are required for training") + y = np.array(y) + le = LabelEncoder() + y_enc = le.fit_transform(y) + + trained = model_obj.fit(X, y_enc, params.get("train_params", {})) + + torch.save(trained.model.state_dict(), MODEL_PATH) + joblib.dump(le, ENCODER_PATH) + with open(META_PATH, "w") as f: + json.dump({"num_features": X.shape[1], "num_classes": len(le.classes_)}, f) + + preds, _ = trained.predict(X) + acc = accuracy_score(y_enc, preds) + prec = precision_score(y_enc, preds, average='weighted', zero_division=0) + rec = recall_score(y_enc, preds, average='weighted', zero_division=0) + f1 = f1_score(y_enc, preds, average='weighted', zero_division=0) + + return [Tensor("pipeline_output", np.array([1.0, acc, prec, rec, f1], dtype=np.float32))] + + elif mode == "infer": + if not os.path.exists(MODEL_PATH): + raise FileNotFoundError("No model checkpoint found") + + with open(META_PATH, "r") as f: + meta = json.load(f) + num_features = meta["num_features"] + num_classes = meta["num_classes"] + + model_obj.model = nn.Linear(num_features, num_classes) + model_obj.model.load_state_dict(torch.load(MODEL_PATH)) + model_obj.model.eval() + + preds, probs = model_obj.predict(X) + le = joblib.load(ENCODER_PATH) + labels = le.inverse_transform(preds) + + response = [] + for label, prob in zip(labels, probs): + prob_dict = {str(le.classes_[i]): float(p) for i, p in enumerate(prob)} + response.append({"label": str(label), "probabilities": prob_dict}) + + print(response, flush=True) + + return [Tensor("pipeline_output", np.array([float(label)], dtype=np.float64))] + else: + raise ValueError(f"Unknown mode '{mode}'") except Exception as e: print(f"[ERROR] {e}") return [Tensor("pipeline_output", np.array([f"ERROR: {e}"], dtype=object))] def finalize(self): - print("[finalize] Python node finalized", flush=True) + print("[finalize] Python node finalized", flush=True) \ No newline at end of file From 02915c8c83b518c31eee742288d720c55cee49b0 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 1 Sep 2025 21:53:17 +0530 Subject: [PATCH 60/76] Update README.md --- extras/iris_pipeline_project/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 81a4257e94..4dcf712c1c 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -62,6 +62,15 @@ python client/client_inference.py infer --- +Input Format + +The pipeline expects input as a JSON object, sent as a single-element numpy array of bytes (dtype=object): + +{ + "mode": "train_logreg" | "infer_logreg" | "train_kmeans" | "infer_kmeans", + "data": "" +} + ## Instructions for preparing the data Run the command to download the Iris dataset, which is taken to be the hello-world dataset of classification datasets. From bd2e78070fd32bba0c7d1d371a16143ad0981c60 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 1 Sep 2025 22:29:11 +0530 Subject: [PATCH 61/76] Update README.md --- extras/iris_pipeline_project/README.md | 87 +++++++++++++++++++++----- 1 file changed, 70 insertions(+), 17 deletions(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 4dcf712c1c..5e71a4bcc8 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -1,6 +1,7 @@ # OVMS Iris Pipeline Example This repository demonstrates how to use OpenVINO Model Server (OVMS) with a custom Mediapipe pipeline for the Iris dataset, including both model training and inference through a Python client. +At the moment, it supports Logistic regression and KMeans. --- @@ -18,13 +19,13 @@ cd model_server/extras/iris_pipeline_project ### 2.1. Build the Docker Image ```bash -docker build --no-cache -t iris_logisticreg_ovms . +docker build --no-cache -t prototype_iris . ``` ### 2.2. Run the OVMS Container ```bash -docker run --rm -it -v "$PWD:/workspace" -p 9000:9000 -p 8000:8000 iris_logisticreg_ovms --config_path /workspace/model_config.json --port 9000 --rest_port 8000 + docker run --rm -it -v $(pwd):/workspace -p 9000:9000 -p 8000:8000 prototype_iris --config_path /workspace/model_config.json --port 9000 --rest_port 8000 --log_level DEBUG ``` - **Note:** Adjust `$(pwd)` if you are running from a different working directory. @@ -36,12 +37,19 @@ docker run --rm -it -v "$PWD:/workspace" -p 9000:9000 -p 8000:8000 iris_logis client/ ├── client_inference.py └── client_train.py +data_folder/ + ├── iris_train.csv + └── iris_test.csv pipeline/ ├── __pycache__/ ├── graph.pbtxt + ├── model.py └── ovmsmodel.py Dockerfile model_config.json +kmeans_params.json +hyperparams.json + ``` --- @@ -51,13 +59,20 @@ model_config.json ### 4.1. Training ```bash -python client/client_train.py train +python client/client_train.py train iris_train.csv Species --params hyperparams.json --encode Species --model_class LogisticRegressionTorch + +python client/client_train.py train iris_train.csv Species --params kmeans_params.json --encode Species --model_class KMeansSkLearn + + ``` ### 4.2. Inference ```bash -python client/client_inference.py infer +python client/client_inference.py infer data_folder/iris_test.csv --target_column Species --model_class LogisticRegressionTorch + +python client/client_inference.py infer iris_train_nolabel.csv --target_column Species --model_class KMeansSkLearn + ``` --- @@ -77,22 +92,58 @@ Run the command to download the Iris dataset, which is taken to be the hello-wor ```bash curl -o iris.csv https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data ``` -Run the following file to prepare the data and split it into data for training and for inferencing. -```bash -python data_preprocess.py -``` -## Input Format +Command-Line Usage + +The training and inference client supports flexible options for both Logistic Regression and KMeans models. + +Usage +python client/client_train.py \ + [--params ] [--encode ] [--model_class ] + +Arguments + + train|infer + Mode of operation. + + train: Train a new model with the provided dataset. + + infer: Run inference using a trained model. -The pipeline expects input as a JSON object, sent as a single-element numpy array of bytes (`dtype=object`): + + Path to the dataset in CSV format. + + + + For classification (Logistic Regression): name of the target column. + + For clustering (KMeans): use NONE. + + --params (optional) + Path to a JSON file containing model hyperparameters. + Example: -```json { - "mode": "train" | "infer", - "data": "" + "max_iter": 300, + "solver": "lbfgs", + "random_state": 42, + "n_clusters": 3 } -``` + + If not provided, default parameters are used. + +--encode (optional) +Comma-separated list of categorical column names to encode. + + Encoding can also be performed client-side before sending data to the server. + + If omitted, no encoding is applied. + +--model_class (optional) +Specify the model class explicitly (e.g., LogisticRegression, KMeans). + + Defaults are inferred from the mode and target column. --- @@ -101,7 +152,7 @@ The pipeline expects input as a JSON object, sent as a single-element numpy arra - **Logs:** For debugging, check OVMS container logs: ```bash - docker logs iris_logisticreg_ovms + docker logs prototype_iris ``` - **Code Changes:** After editing `pipeline/ovmsmodel.py`, **restart the OVMS container** for changes to take effect. @@ -120,8 +171,8 @@ For Training: Read CSV file successfully Training mode detected. Preparing data for training... Connected to OVMS at localhost:9000 -Server response decoded: string - [...] -The output string formatted as: [<1 - Model trained successfully | 0 - Otherwise> ] +Model trained successfully + ``` For Inference: @@ -133,3 +184,5 @@ Inference predictions: [...] ``` --- + +NOTE: Cluster assignments and centroid details are available in the container logs. Since the terminal is non-GUI, .show() visualization is not supported. From e566762e912dc1803579538e98d3f5f46369c39c Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 1 Sep 2025 22:32:32 +0530 Subject: [PATCH 62/76] Update README.md --- extras/iris_pipeline_project/README.md | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 5e71a4bcc8..7e7cff9d16 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -77,14 +77,8 @@ python client/client_inference.py infer iris_train_nolabel.csv --target_column --- -Input Format - -The pipeline expects input as a JSON object, sent as a single-element numpy array of bytes (dtype=object): - -{ - "mode": "train_logreg" | "infer_logreg" | "train_kmeans" | "infer_kmeans", - "data": "" -} +For Enabling accelerator support: +Manually set the ```bool - (use_ipex/use_oneDAL)``` in model.py file under "pipeline" directory to either True/False depending on the necessity. ## Instructions for preparing the data Run the command to download the Iris dataset, which is taken to be the hello-world dataset of classification datasets. From 79e0d3bfbb5dcb81878fc7355abaa16b5aa1c789 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 1 Sep 2025 22:41:44 +0530 Subject: [PATCH 63/76] Update extras/iris_pipeline_project/pipeline/ovmsmodel.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- extras/iris_pipeline_project/pipeline/ovmsmodel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index f8b7563cac..fc733fb80b 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -121,7 +121,7 @@ def execute(self, inputs): print(response, flush=True) - return [Tensor("pipeline_output", np.array([float(label)], dtype=np.float64))] + return [Tensor("pipeline_output", np.array([json.dumps(response)], dtype=object))] else: raise ValueError(f"Unknown mode '{mode}'") except Exception as e: From 95447f3d05307d69cc77f9fdc4257681b09ce0cb Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 1 Sep 2025 22:42:04 +0530 Subject: [PATCH 64/76] Update extras/iris_pipeline_project/pipeline/model.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- extras/iris_pipeline_project/pipeline/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/pipeline/model.py b/extras/iris_pipeline_project/pipeline/model.py index 8c1c2fca6b..3f3ab071b7 100644 --- a/extras/iris_pipeline_project/pipeline/model.py +++ b/extras/iris_pipeline_project/pipeline/model.py @@ -22,7 +22,7 @@ class LogisticRegressionTorch(ModelClass): def __init__(self, use_ipex=False): self.model = None self.device = torch.device("cpu") - self.use_ipex = True + self.use_ipex = use_ipex def fit(self, X: np.ndarray, y: np.ndarray, params: dict): try: From b7db42106209dd6a7092c3225bd6a52e973167d8 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 1 Sep 2025 22:42:19 +0530 Subject: [PATCH 65/76] Update extras/iris_pipeline_project/client/client_inference.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- extras/iris_pipeline_project/client/client_inference.py | 1 - 1 file changed, 1 deletion(-) diff --git a/extras/iris_pipeline_project/client/client_inference.py b/extras/iris_pipeline_project/client/client_inference.py index 76f24ab95a..13828a1a78 100644 --- a/extras/iris_pipeline_project/client/client_inference.py +++ b/extras/iris_pipeline_project/client/client_inference.py @@ -5,7 +5,6 @@ import sys import os import matplotlib.pyplot as plt -import numpy as np SERVER_URL = "localhost:9000" MODEL_NAME = "pipeline" From 040f0c5ab71d14223011a89286774790050ed54d Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 1 Sep 2025 22:42:43 +0530 Subject: [PATCH 66/76] Update extras/iris_pipeline_project/client/client_inference.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- extras/iris_pipeline_project/client/client_inference.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/client/client_inference.py b/extras/iris_pipeline_project/client/client_inference.py index 13828a1a78..e9ef62e352 100644 --- a/extras/iris_pipeline_project/client/client_inference.py +++ b/extras/iris_pipeline_project/client/client_inference.py @@ -139,7 +139,7 @@ def main(): for i, centroid in enumerate(centroids): print(f" Centroid {i}: {centroid}") - X = df.drop(columns=[target_column]) if target_column else df + X = df.drop(columns=[target_column]) if (target_column is not None and target_column in df.columns) else df X = X.values plt.figure(figsize=(8, 6)) plt.scatter(X[:, 0], X[:, 1], c=labels, cmap="viridis", s=30, alpha=0.7, label="Points") From 9f7d3a0906261353bb1cc4b4996b9500351fbed3 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 1 Sep 2025 22:45:10 +0530 Subject: [PATCH 67/76] Update README.md --- extras/iris_pipeline_project/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 7e7cff9d16..c25350d9ec 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -25,7 +25,7 @@ docker build --no-cache -t prototype_iris . ### 2.2. Run the OVMS Container ```bash - docker run --rm -it -v $(pwd):/workspace -p 9000:9000 -p 8000:8000 prototype_iris --config_path /workspace/model_config.json --port 9000 --rest_port 8000 --log_level DEBUG + docker run --rm -it -v $(pwd):/workspace -p 9000:9000 prototype_iris --config_path /workspace/model_config.json --port 9000 --log_level DEBUG ``` - **Note:** Adjust `$(pwd)` if you are running from a different working directory. From f026bd3e6b995c659d9f918d4fe3a77a6375db4e Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:08:52 +0530 Subject: [PATCH 68/76] Update README.md --- extras/iris_pipeline_project/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index c25350d9ec..3c9d5d7262 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -1,7 +1,8 @@ -# OVMS Iris Pipeline Example +# Optimized serving endpoint for Classical Machine Learning Models This repository demonstrates how to use OpenVINO Model Server (OVMS) with a custom Mediapipe pipeline for the Iris dataset, including both model training and inference through a Python client. -At the moment, it supports Logistic regression and KMeans. + +At the moment, for demonstrating purposes of the established project structure, we'll be demonstrating the Logistic Regression Model in pytorch and KMeans algorithm using scikit-Learn . --- From e896515aff00e5b22091a4ea414d6682198aeb22 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:17:24 +0530 Subject: [PATCH 69/76] Update ovmsmodel.py --- .../pipeline/ovmsmodel.py | 114 +++++------------- 1 file changed, 27 insertions(+), 87 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/ovmsmodel.py b/extras/iris_pipeline_project/pipeline/ovmsmodel.py index fc733fb80b..ff33598b07 100644 --- a/extras/iris_pipeline_project/pipeline/ovmsmodel.py +++ b/extras/iris_pipeline_project/pipeline/ovmsmodel.py @@ -1,22 +1,16 @@ import os import json import numpy as np -import torch -import torch.nn as nn import joblib from pyovms import Tensor -from model import LogisticRegressionTorch, KMeansSkLearn, ModelClass -from sklearn.preprocessing import LabelEncoder -from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score +from model import LogisticRegressionTorch, KMeansSkLearn # add more in future - -MODEL_PATH = "/workspace/model/generic_model/model.pt" -ENCODER_PATH = "/workspace/model/generic_model/label_encoder.joblib" +MODEL_PATH = "/workspace/model/generic_model/model.bin" META_PATH = "/workspace/model/generic_model/meta.json" AVAILABLE_MODEL_CLASSES = { "LogisticRegressionTorch": LogisticRegressionTorch, - "KMeansSkLearn": KMeansSkLearn + "KMeansSkLearn": KMeansSkLearn, } class OvmsPythonModel: @@ -41,92 +35,38 @@ def execute(self, inputs): if model_class_name not in AVAILABLE_MODEL_CLASSES: raise ValueError(f"Unknown model: {model_class_name}") - model_obj = AVAILABLE_MODEL_CLASSES[model_class_name]() - - if model_class_name == "KMeansSkLearn": - if mode == "train": - trained = model_obj.fit(X, None, params.get("train_params", {})) - joblib.dump(trained.model, MODEL_PATH) - with open(META_PATH, "w") as f: - json.dump({ - "num_features": X.shape[1], - "n_clusters": trained.model.n_clusters - }, f) - inertia = trained.model.inertia_ - return [Tensor("pipeline_output", np.array([1.0, inertia], dtype=np.float32))] - elif mode == "infer": - if not os.path.exists(META_PATH) or not os.path.exists(MODEL_PATH): - raise FileNotFoundError("No model checkpoint found") - with open(META_PATH, "r") as f: - meta = json.load(f) - model_obj.model = joblib.load(MODEL_PATH) - labels = model_obj.model.predict(X) - centroids = model_obj.model.cluster_centers_ - response = { - "labels": labels.tolist(), - "centroids": centroids.tolist() - } - print(response, flush=True) - json_bytes = json.dumps(response).encode("utf-8") - - output = np.array([json_bytes], dtype=object) - - return [Tensor("pipeline_output", output)] - else: - raise ValueError(f"Unknown mode '{mode}' for KMeansSkLearn") - else: - if mode == "train": - if y is None: - raise ValueError("y labels are required for training") - y = np.array(y) - le = LabelEncoder() - y_enc = le.fit_transform(y) - - trained = model_obj.fit(X, y_enc, params.get("train_params", {})) - - torch.save(trained.model.state_dict(), MODEL_PATH) - joblib.dump(le, ENCODER_PATH) - with open(META_PATH, "w") as f: - json.dump({"num_features": X.shape[1], "num_classes": len(le.classes_)}, f) - - preds, _ = trained.predict(X) - acc = accuracy_score(y_enc, preds) - prec = precision_score(y_enc, preds, average='weighted', zero_division=0) - rec = recall_score(y_enc, preds, average='weighted', zero_division=0) - f1 = f1_score(y_enc, preds, average='weighted', zero_division=0) + ModelClass = AVAILABLE_MODEL_CLASSES[model_class_name] + model_obj = ModelClass() - return [Tensor("pipeline_output", np.array([1.0, acc, prec, rec, f1], dtype=np.float32))] + if mode == "train": + trained = model_obj.fit(X, y, params.get("train_params", {})) + model_obj.save(MODEL_PATH, META_PATH) + + metrics = {} + if hasattr(model_obj, "evaluate") and y is not None: + metrics = model_obj.evaluate(X, y) - elif mode == "infer": - if not os.path.exists(MODEL_PATH): - raise FileNotFoundError("No model checkpoint found") + response = {"status": "trained", "metrics": metrics} + json_bytes = json.dumps(response).encode("utf-8") + return [Tensor("pipeline_output", np.array([json_bytes], dtype=object))] - with open(META_PATH, "r") as f: - meta = json.load(f) - num_features = meta["num_features"] - num_classes = meta["num_classes"] + elif mode == "infer": + if not os.path.exists(MODEL_PATH): + raise FileNotFoundError("No model checkpoint found") - model_obj.model = nn.Linear(num_features, num_classes) - model_obj.model.load_state_dict(torch.load(MODEL_PATH)) - model_obj.model.eval() + model_obj.load(MODEL_PATH, META_PATH) + predictions = model_obj.predict(X) - preds, probs = model_obj.predict(X) - le = joblib.load(ENCODER_PATH) - labels = le.inverse_transform(preds) + response = {"predictions": predictions} + json_bytes = json.dumps(response).encode("utf-8") + return [Tensor("pipeline_output", np.array([json_bytes], dtype=object))] - response = [] - for label, prob in zip(labels, probs): - prob_dict = {str(le.classes_[i]): float(p) for i, p in enumerate(prob)} - response.append({"label": str(label), "probabilities": prob_dict}) - - print(response, flush=True) + else: + raise ValueError(f"Unknown mode '{mode}'") - return [Tensor("pipeline_output", np.array([json.dumps(response)], dtype=object))] - else: - raise ValueError(f"Unknown mode '{mode}'") except Exception as e: - print(f"[ERROR] {e}") + print(f"[ERROR] {e}", flush=True) return [Tensor("pipeline_output", np.array([f"ERROR: {e}"], dtype=object))] def finalize(self): - print("[finalize] Python node finalized", flush=True) \ No newline at end of file + print("[finalize] Python node finalized", flush=True) From 4dec517daeed7abcb2e39b4dd4f20b424a707098 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:18:35 +0530 Subject: [PATCH 70/76] Update model.py --- .../iris_pipeline_project/pipeline/model.py | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/model.py b/extras/iris_pipeline_project/pipeline/model.py index 3f3ab071b7..0c06e6eb5d 100644 --- a/extras/iris_pipeline_project/pipeline/model.py +++ b/extras/iris_pipeline_project/pipeline/model.py @@ -4,35 +4,40 @@ import torch import torch.nn as nn from sklearn.cluster import KMeans -from sklearnex import patch_sklearn, unpatch_sklearn -import intel_extension_for_pytorch as ipex +from sklearnex import patch_sklearn, unpatch_sklearn class ModelClass(abc.ABC): @abc.abstractmethod def fit(self, X: np.ndarray, y: np.ndarray, params: dict): + """Train the model with given data and hyperparameters.""" pass @abc.abstractmethod def predict(self, X: np.ndarray): + """Run inference on the given data.""" pass class LogisticRegressionTorch(ModelClass): - def __init__(self, use_ipex=False): + def __init__(self): self.model = None self.device = torch.device("cpu") - self.use_ipex = use_ipex + self.use_ipex = False def fit(self, X: np.ndarray, y: np.ndarray, params: dict): + # pull accelerator flag from params + self.use_ipex = bool(params.get("use_ipex", False)) + try: if self.use_ipex: - import intel_extension_for_pytorch as ipex - use_ipex = True + import intel_extension_for_pytorch as ipex else: - use_ipex = False + ipex = None except ImportError: - use_ipex = False + print("[Torch LogisticRegression] IPEX not available, falling back to native PyTorch.") + self.use_ipex = False + ipex = None X_tensor = torch.from_numpy(X).float().to(self.device) y_tensor = torch.from_numpy(y).long().to(self.device) @@ -46,7 +51,7 @@ def fit(self, X: np.ndarray, y: np.ndarray, params: dict): epochs = params.get("epochs", 100) optimizer = torch.optim.SGD(self.model.parameters(), lr=lr) - if use_ipex: + if self.use_ipex and ipex is not None: self.model, optimizer = ipex.optimize(self.model, optimizer=optimizer, dtype=torch.float32) start = time.perf_counter() @@ -59,8 +64,8 @@ def fit(self, X: np.ndarray, y: np.ndarray, params: dict): optimizer.step() end = time.perf_counter() - print(f"[Torch LogisticRegression] Training time (IPEX={use_ipex}): {end - start:.4f} sec") - return self + print(f"[Torch LogisticRegression] Training time (IPEX={self.use_ipex}): {end - start:.4f} sec") + return self def predict(self, X: np.ndarray): if self.model is None: @@ -80,15 +85,18 @@ def predict(self, X: np.ndarray): class KMeansSkLearn(ModelClass): - def __init__(self, use_onedal=False): + def __init__(self): self.model = None - self.use_onedal = use_onedal + self.use_onedal = False def fit(self, X: np.ndarray, y: np.ndarray, params: dict): + # pull accelerator flag from params + self.use_onedal = bool(params.get("use_onedal", False)) + if self.use_onedal: - patch_sklearn() + patch_sklearn() else: - unpatch_sklearn() + unpatch_sklearn() n_clusters = params.get("n_clusters", 3) self.model = KMeans(n_clusters=n_clusters, random_state=42) From 35bf4a9b6106f13c23c889ab0c33a2bd3433c523 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:19:07 +0530 Subject: [PATCH 71/76] Update model.py --- extras/iris_pipeline_project/pipeline/model.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/extras/iris_pipeline_project/pipeline/model.py b/extras/iris_pipeline_project/pipeline/model.py index 0c06e6eb5d..3c9b08ff1e 100644 --- a/extras/iris_pipeline_project/pipeline/model.py +++ b/extras/iris_pipeline_project/pipeline/model.py @@ -26,7 +26,6 @@ def __init__(self): self.use_ipex = False def fit(self, X: np.ndarray, y: np.ndarray, params: dict): - # pull accelerator flag from params self.use_ipex = bool(params.get("use_ipex", False)) try: @@ -90,7 +89,6 @@ def __init__(self): self.use_onedal = False def fit(self, X: np.ndarray, y: np.ndarray, params: dict): - # pull accelerator flag from params self.use_onedal = bool(params.get("use_onedal", False)) if self.use_onedal: From abaa7cf36059827932dde3e036a4f3c662d3bc41 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:19:55 +0530 Subject: [PATCH 72/76] Delete extras/iris_pipeline_project/data_folder directory --- .../data_folder/iris_test.csv | 2 - .../data_folder/iris_train.csv | 508 ------------------ 2 files changed, 510 deletions(-) delete mode 100644 extras/iris_pipeline_project/data_folder/iris_test.csv delete mode 100644 extras/iris_pipeline_project/data_folder/iris_train.csv diff --git a/extras/iris_pipeline_project/data_folder/iris_test.csv b/extras/iris_pipeline_project/data_folder/iris_test.csv deleted file mode 100644 index aa74f99149..0000000000 --- a/extras/iris_pipeline_project/data_folder/iris_test.csv +++ /dev/null @@ -1,2 +0,0 @@ -SepalLength,SepalWidth,PetalLength,PetalWidth -6.1,2.8,4.7,1.2 diff --git a/extras/iris_pipeline_project/data_folder/iris_train.csv b/extras/iris_pipeline_project/data_folder/iris_train.csv deleted file mode 100644 index 94775782c1..0000000000 --- a/extras/iris_pipeline_project/data_folder/iris_train.csv +++ /dev/null @@ -1,508 +0,0 @@ -SepalLength,SepalWidth,PetalLength,PetalWidth,Species -6.1,2.8,4.7,1.2,Iris-versicolor -5.7,3.8,1.7,0.3,Iris-setosa -7.7,2.6,6.9,2.3,Iris-virginica -6.0,2.9,4.5,1.5,Iris-versicolor -6.8,2.8,4.8,1.4,Iris-versicolor -5.4,3.4,1.5,0.4,Iris-setosa -5.6,2.9,3.6,1.3,Iris-versicolor -6.9,3.1,5.1,2.3,Iris-virginica -6.2,2.2,4.5,1.5,Iris-versicolor -5.8,2.7,3.9,1.2,Iris-versicolor -6.5,3.2,5.1,2.0,Iris-virginica -4.8,3.0,1.4,0.1,Iris-setosa -6.2,2.2,4.5,1.5,Iris-versicolor -5.6,2.5,3.9,1.1,Iris-versicolor -5.9,3.2,4.8,1.8,Iris-versicolor -6.1,2.8,4.0,1.3,Iris-versicolor -6.3,2.5,4.9,1.5,Iris-versicolor -6.1,2.8,4.7,1.2,Iris-versicolor -6.4,2.9,4.3,1.3,Iris-versicolor -6.6,3.0,4.4,1.4,Iris-versicolor -6.8,2.8,4.8,1.4,Iris-versicolor -6.7,3.0,5.0,1.7,Iris-versicolor -6.0,2.9,4.5,1.5,Iris-versicolor -5.7,2.6,3.5,1.0,Iris-versicolor -5.5,2.4,3.8,1.1,Iris-versicolor -5.5,2.4,3.7,1.0,Iris-versicolor -5.8,2.7,3.9,1.2,Iris-versicolor -6.0,2.7,5.1,1.6,Iris-versicolor -5.4,3.0,4.5,1.5,Iris-versicolor -6.0,3.4,4.5,1.6,Iris-versicolor -6.7,3.1,4.7,1.5,Iris-versicolor -6.3,2.3,4.4,1.3,Iris-versicolor -5.6,3.0,4.1,1.3,Iris-versicolor -5.5,2.5,4.0,1.3,Iris-versicolor -5.5,2.6,4.4,1.2,Iris-versicolor -6.1,3.0,4.6,1.4,Iris-versicolor -5.8,2.6,4.0,1.2,Iris-versicolor -5.0,2.3,3.3,1.0,Iris-versicolor -5.6,2.7,4.2,1.3,Iris-versicolor -5.7,3.0,4.2,1.2,Iris-versicolor -5.7,2.9,4.2,1.3,Iris-versicolor -6.2,2.9,4.3,1.3,Iris-versicolor -5.1,2.5,3.0,1.1,Iris-versicolor -5.7,2.8,4.1,1.3,Iris-versicolor -6.3,3.3,6.0,2.5,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -7.1,3.0,5.9,2.1,Iris-virginica -6.3,2.9,5.6,1.8,Iris-virginica -6.5,3.0,5.8,2.2,Iris-virginica -7.6,3.0,6.6,2.1,Iris-virginica -4.9,2.5,4.5,1.7,Iris-virginica -7.3,2.9,6.3,1.8,Iris-virginica -6.7,2.5,5.8,1.8,Iris-virginica -7.2,3.6,6.1,2.5,Iris-virginica -6.5,3.2,5.1,2.0,Iris-virginica -6.4,2.7,5.3,1.9,Iris-virginica -6.8,3.0,5.5,2.1,Iris-virginica -5.7,2.5,5.0,2.0,Iris-virginica -5.8,2.8,5.1,2.4,Iris-virginica -6.4,3.2,5.3,2.3,Iris-virginica -6.5,3.0,5.5,1.8,Iris-virginica -7.7,3.8,6.7,2.2,Iris-virginica -7.7,2.6,6.9,2.3,Iris-virginica -6.0,2.2,5.0,1.5,Iris-virginica -6.9,3.2,5.7,2.3,Iris-virginica -5.6,2.8,4.9,2.0,Iris-virginica -7.7,2.8,6.7,2.0,Iris-virginica -6.3,2.7,4.9,1.8,Iris-virginica -6.7,3.3,5.7,2.1,Iris-virginica -7.2,3.2,6.0,1.8,Iris-virginica -6.2,2.8,4.8,1.8,Iris-virginica -6.1,3.0,4.9,1.8,Iris-virginica -6.4,2.8,5.6,2.1,Iris-virginica -7.2,3.0,5.8,1.6,Iris-virginica -7.4,2.8,6.1,1.9,Iris-virginica -7.9,3.8,6.4,2.0,Iris-virginica -6.4,2.8,5.6,2.2,Iris-virginica -6.3,2.8,5.1,1.5,Iris-virginica -6.1,2.6,5.6,1.4,Iris-virginica -7.7,3.0,6.1,2.3,Iris-virginica -6.3,3.4,5.6,2.4,Iris-virginica -6.4,3.1,5.5,1.8,Iris-virginica -6.0,3.0,4.8,1.8,Iris-virginica -6.9,3.1,5.4,2.1,Iris-virginica -6.7,3.1,5.6,2.4,Iris-virginica -6.9,3.1,5.1,2.3,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -6.8,3.2,5.9,2.3,Iris-virginica -4.9,3.1,1.5,0.1,Iris-setosa -5.4,3.7,1.5,0.2,Iris-setosa -4.8,3.4,1.6,0.2,Iris-setosa -4.8,3.0,1.4,0.1,Iris-setosa -4.3,3.0,1.1,0.1,Iris-setosa -5.8,4.0,1.2,0.2,Iris-setosa -5.7,4.4,1.5,0.4,Iris-setosa -5.4,3.9,1.3,0.4,Iris-setosa -5.1,3.5,1.4,0.3,Iris-setosa -5.7,3.8,1.7,0.3,Iris-setosa -5.1,3.8,1.5,0.3,Iris-setosa -5.4,3.4,1.7,0.2,Iris-setosa -5.1,3.7,1.5,0.4,Iris-setosa -4.6,3.6,1.0,0.2,Iris-setosa -5.1,3.3,1.7,0.5,Iris-setosa -4.8,3.4,1.9,0.2,Iris-setosa -5.0,3.0,1.6,0.2,Iris-setosa -5.0,3.4,1.6,0.4,Iris-setosa -5.2,3.5,1.5,0.2,Iris-setosa -5.2,3.4,1.4,0.2,Iris-setosa -4.7,3.2,1.6,0.2,Iris-setosa -4.8,3.1,1.6,0.2,Iris-setosa -5.4,3.4,1.5,0.4,Iris-setosa -5.2,4.1,1.5,0.1,Iris-setosa -5.5,4.2,1.4,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -5.0,3.2,1.2,0.2,Iris-setosa -5.5,3.5,1.3,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -6.7,3.3,5.7,2.5,Iris-virginica -6.7,3.0,5.2,2.3,Iris-virginica -6.3,2.5,5.0,1.9,Iris-virginica -6.5,3.0,5.2,2.0,Iris-virginica -6.2,3.4,5.4,2.3,Iris-virginica -5.9,3.0,5.1,1.8,Iris-virginica -6.1,2.6,5.6,1.4,Iris-virginica -7.7,3.0,6.1,2.3,Iris-virginica -6.3,3.4,5.6,2.4,Iris-virginica -6.4,3.1,5.5,1.8,Iris-virginica -6.0,3.0,4.8,1.8,Iris-virginica -6.9,3.1,5.4,2.1,Iris-virginica -6.7,3.1,5.6,2.4,Iris-virginica -6.9,3.1,5.1,2.3,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -6.8,3.2,5.9,2.3,Iris-virginica -6.7,3.3,5.7,2.5,Iris-virginica -6.7,3.0,5.2,2.3,Iris-virginica -6.3,2.5,5.0,1.9,Iris-virginica -6.5,3.0,5.2,2.0,Iris-virginica -6.2,3.4,5.4,2.3,Iris-virginica -5.9,3.0,5.1,1.8,Iris-virginica -6.2,2.2,4.5,1.5,Iris-versicolor -5.6,2.5,3.9,1.1,Iris-versicolor -5.9,3.2,4.8,1.8,Iris-versicolor -6.1,2.8,4.0,1.3,Iris-versicolor -6.3,2.5,4.9,1.5,Iris-versicolor -6.1,2.8,4.7,1.2,Iris-versicolor -6.4,2.9,4.3,1.3,Iris-versicolor -6.6,3.0,4.4,1.4,Iris-versicolor -6.8,2.8,4.8,1.4,Iris-versicolor -6.7,3.0,5.0,1.7,Iris-versicolor -6.0,2.9,4.5,1.5,Iris-versicolor -5.7,2.6,3.5,1.0,Iris-versicolor -5.5,2.4,3.8,1.1,Iris-versicolor -5.5,2.4,3.7,1.0,Iris-versicolor -5.8,2.7,3.9,1.2,Iris-versicolor -6.0,2.7,5.1,1.6,Iris-versicolor -5.4,3.0,4.5,1.5,Iris-versicolor -6.0,3.4,4.5,1.6,Iris-versicolor -6.7,3.1,4.7,1.5,Iris-versicolor -6.3,2.3,4.4,1.3,Iris-versicolor -5.6,3.0,4.1,1.3,Iris-versicolor -5.5,2.5,4.0,1.3,Iris-versicolor -5.5,2.6,4.4,1.2,Iris-versicolor -5.5,3.5,1.3,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -5.1,3.8,1.5,0.3,Iris-setosa -6.3,3.3,4.7,1.6,Iris-versicolor -6.5,3.0,5.8,2.2,Iris-virginica -5.6,2.5,3.9,1.1,Iris-versicolor -5.7,2.8,4.5,1.3,Iris-versicolor -6.4,2.8,5.6,2.2,Iris-virginica -4.7,3.2,1.6,0.2,Iris-setosa -6.1,3.0,4.9,1.8,Iris-virginica -5.0,3.4,1.6,0.4,Iris-setosa -6.4,2.8,5.6,2.1,Iris-virginica -7.9,3.8,6.4,2.0,Iris-virginica -6.7,3.0,5.2,2.3,Iris-virginica -6.7,2.5,5.8,1.8,Iris-virginica -6.8,3.2,5.9,2.3,Iris-virginica -4.8,3.0,1.4,0.3,Iris-setosa -4.8,3.1,1.6,0.2,Iris-setosa -4.6,3.6,1.0,0.2,Iris-setosa -5.7,4.4,1.5,0.4,Iris-setosa -6.7,3.1,4.4,1.4,Iris-versicolor -4.8,3.4,1.6,0.2,Iris-setosa -4.4,3.2,1.3,0.2,Iris-setosa -6.3,2.5,5.0,1.9,Iris-virginica -6.4,3.2,4.5,1.5,Iris-versicolor -5.2,3.5,1.5,0.2,Iris-setosa -5.0,3.6,1.4,0.2,Iris-setosa -5.2,4.1,1.5,0.1,Iris-setosa -5.8,2.7,5.1,1.9,Iris-virginica -6.0,3.4,4.5,1.6,Iris-versicolor -6.7,3.1,4.7,1.5,Iris-versicolor -5.4,3.9,1.3,0.4,Iris-setosa -5.4,3.7,1.5,0.2,Iris-setosa -5.5,2.4,3.7,1.0,Iris-versicolor -6.3,2.8,5.1,1.5,Iris-virginica -6.4,3.1,5.5,1.8,Iris-virginica -6.6,3.0,4.4,1.4,Iris-versicolor -7.2,3.6,6.1,2.5,Iris-virginica -5.7,2.9,4.2,1.3,Iris-versicolor -7.6,3.0,6.6,2.1,Iris-virginica -5.6,3.0,4.5,1.5,Iris-versicolor -5.1,3.5,1.4,0.2,Iris-setosa -7.7,2.8,6.7,2.0,Iris-virginica -5.8,2.7,4.1,1.0,Iris-versicolor -5.2,3.4,1.4,0.2,Iris-setosa -5.0,3.5,1.3,0.3,Iris-setosa -5.1,3.8,1.9,0.4,Iris-setosa -5.0,2.0,3.5,1.0,Iris-versicolor -6.3,2.7,4.9,1.8,Iris-virginica -4.8,3.4,1.9,0.2,Iris-setosa -5.0,3.0,1.6,0.2,Iris-setosa -5.1,3.3,1.7,0.5,Iris-setosa -5.6,2.7,4.2,1.3,Iris-versicolor -5.1,3.4,1.5,0.2,Iris-setosa -5.7,3.0,4.2,1.2,Iris-versicolor -7.7,3.8,6.7,2.2,Iris-virginica -4.6,3.2,1.4,0.2,Iris-setosa -6.2,2.9,4.3,1.3,Iris-versicolor -5.7,2.5,5.0,2.0,Iris-virginica -5.5,4.2,1.4,0.2,Iris-setosa -6.0,3.0,4.8,1.8,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -6.0,2.2,4.0,1.0,Iris-versicolor -5.4,3.0,4.5,1.5,Iris-versicolor -6.2,3.4,5.4,2.3,Iris-virginica -5.5,2.3,4.0,1.3,Iris-versicolor -5.4,3.9,1.7,0.4,Iris-setosa -5.0,2.3,3.3,1.0,Iris-versicolor -6.4,2.7,5.3,1.9,Iris-virginica -5.0,3.3,1.4,0.2,Iris-setosa -5.0,3.2,1.2,0.2,Iris-setosa -5.5,2.4,3.8,1.1,Iris-versicolor -6.7,3.0,5.0,1.7,Iris-versicolor -4.9,3.1,1.5,0.1,Iris-setosa -5.8,2.8,5.1,2.4,Iris-virginica -5.0,3.4,1.5,0.2,Iris-setosa -5.0,3.5,1.6,0.6,Iris-setosa -5.9,3.2,4.8,1.8,Iris-versicolor -5.1,2.5,3.0,1.1,Iris-versicolor -6.9,3.2,5.7,2.3,Iris-virginica -6.0,2.7,5.1,1.6,Iris-versicolor -6.1,2.6,5.6,1.4,Iris-virginica -7.7,3.0,6.1,2.3,Iris-virginica -5.5,2.5,4.0,1.3,Iris-versicolor -4.4,2.9,1.4,0.2,Iris-setosa -4.3,3.0,1.1,0.1,Iris-setosa -6.0,2.2,5.0,1.5,Iris-virginica -7.2,3.2,6.0,1.8,Iris-virginica -4.6,3.1,1.5,0.2,Iris-setosa -5.1,3.5,1.4,0.3,Iris-setosa -4.4,3.0,1.3,0.2,Iris-setosa -6.3,2.5,4.9,1.5,Iris-versicolor -6.3,3.4,5.6,2.4,Iris-virginica -4.6,3.4,1.4,0.3,Iris-setosa -6.8,3.0,5.5,2.1,Iris-virginica -6.3,3.3,6.0,2.5,Iris-virginica -4.7,3.2,1.3,0.2,Iris-setosa -6.1,2.9,4.7,1.4,Iris-versicolor -5.0,3.6,1.4,0.2,Iris-setosa -5.4,3.9,1.7,0.4,Iris-setosa -4.6,3.4,1.4,0.3,Iris-setosa -5.0,3.4,1.5,0.2,Iris-setosa -4.4,2.9,1.4,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -5.4,3.7,1.5,0.2,Iris-setosa -4.8,3.4,1.6,0.2,Iris-setosa -6.9,3.1,4.9,1.5,Iris-versicolor -5.5,2.3,4.0,1.3,Iris-versicolor -6.5,2.8,4.6,1.5,Iris-versicolor -5.7,2.8,4.5,1.3,Iris-versicolor -6.3,3.3,4.7,1.6,Iris-versicolor -4.9,2.4,3.3,1.0,Iris-versicolor -6.6,2.9,4.6,1.3,Iris-versicolor -5.2,2.7,3.9,1.4,Iris-versicolor -5.0,2.0,3.5,1.0,Iris-versicolor -5.9,3.0,4.2,1.5,Iris-versicolor -6.0,2.2,4.0,1.0,Iris-versicolor -6.1,2.9,4.7,1.4,Iris-versicolor -6.5,2.8,4.6,1.5,Iris-versicolor -6.2,2.8,4.8,1.8,Iris-virginica -7.0,3.2,4.7,1.4,Iris-versicolor -6.4,3.2,5.3,2.3,Iris-virginica -5.1,3.8,1.6,0.2,Iris-setosa -6.9,3.1,5.4,2.1,Iris-virginica -5.9,3.0,4.2,1.5,Iris-versicolor -6.5,3.0,5.2,2.0,Iris-virginica -5.7,2.6,3.5,1.0,Iris-versicolor -5.2,2.7,3.9,1.4,Iris-versicolor -6.1,3.0,4.6,1.4,Iris-versicolor -4.5,2.3,1.3,0.3,Iris-setosa -6.6,2.9,4.6,1.3,Iris-versicolor -5.5,2.6,4.4,1.2,Iris-versicolor -5.3,3.7,1.5,0.2,Iris-setosa -5.6,3.0,4.1,1.3,Iris-versicolor -7.3,2.9,6.3,1.8,Iris-virginica -6.7,3.3,5.7,2.1,Iris-virginica -5.1,3.7,1.5,0.4,Iris-setosa -4.9,2.4,3.3,1.0,Iris-versicolor -6.7,3.3,5.7,2.5,Iris-virginica -7.2,3.0,5.8,1.6,Iris-virginica -4.9,3.1,1.5,0.1,Iris-setosa -6.7,3.1,5.6,2.4,Iris-virginica -4.9,3.0,1.4,0.2,Iris-setosa -6.9,3.1,4.9,1.5,Iris-versicolor -7.4,2.8,6.1,1.9,Iris-virginica -6.3,2.9,5.6,1.8,Iris-virginica -5.7,2.8,4.1,1.3,Iris-versicolor -6.5,3.0,5.5,1.8,Iris-virginica -6.3,2.3,4.4,1.3,Iris-versicolor -6.4,2.9,4.3,1.3,Iris-versicolor -5.6,2.8,4.9,2.0,Iris-virginica -5.9,3.0,5.1,1.8,Iris-virginica -5.4,3.4,1.7,0.2,Iris-setosa -6.1,2.8,4.0,1.3,Iris-versicolor -4.9,2.5,4.5,1.7,Iris-virginica -5.8,4.0,1.2,0.2,Iris-setosa -5.8,2.6,4.0,1.2,Iris-versicolor -7.1,3.0,5.9,2.1,Iris-virginica -5.1,3.5,1.4,0.2,Iris-setosa -4.9,3.0,1.4,0.2,Iris-setosa -4.7,3.2,1.3,0.2,Iris-setosa -4.6,3.1,1.5,0.2,Iris-setosa -5.0,3.6,1.4,0.2,Iris-setosa -5.4,3.9,1.7,0.4,Iris-setosa -4.6,3.4,1.4,0.3,Iris-setosa -5.0,3.4,1.5,0.2,Iris-setosa -4.4,2.9,1.4,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -5.4,3.7,1.5,0.2,Iris-setosa -4.8,3.4,1.6,0.2,Iris-setosa -6.9,3.1,4.9,1.5,Iris-versicolor -5.5,2.3,4.0,1.3,Iris-versicolor -6.5,2.8,4.6,1.5,Iris-versicolor -5.7,2.8,4.5,1.3,Iris-versicolor -6.3,3.3,4.7,1.6,Iris-versicolor -4.9,2.4,3.3,1.0,Iris-versicolor -6.6,2.9,4.6,1.3,Iris-versicolor -5.2,2.7,3.9,1.4,Iris-versicolor -5.0,2.0,3.5,1.0,Iris-versicolor -5.9,3.0,4.2,1.5,Iris-versicolor -6.0,2.2,4.0,1.0,Iris-versicolor -6.1,2.9,4.7,1.4,Iris-versicolor -5.6,2.9,3.6,1.3,Iris-versicolor -6.7,3.1,4.4,1.4,Iris-versicolor -5.6,3.0,4.5,1.5,Iris-versicolor -5.8,2.7,4.1,1.0,Iris-versicolor -6.2,2.2,4.5,1.5,Iris-versicolor -5.6,2.5,3.9,1.1,Iris-versicolor -5.9,3.2,4.8,1.8,Iris-versicolor -6.1,2.8,4.0,1.3,Iris-versicolor -6.3,2.5,4.9,1.5,Iris-versicolor -6.1,2.8,4.7,1.2,Iris-versicolor -6.3,3.3,6.0,2.5,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -7.1,3.0,5.9,2.1,Iris-virginica -6.3,2.9,5.6,1.8,Iris-virginica -6.5,3.0,5.8,2.2,Iris-virginica -7.6,3.0,6.6,2.1,Iris-virginica -4.9,2.5,4.5,1.7,Iris-virginica -7.3,2.9,6.3,1.8,Iris-virginica -6.7,2.5,5.8,1.8,Iris-virginica -7.2,3.6,6.1,2.5,Iris-virginica -6.5,3.2,5.1,2.0,Iris-virginica -6.4,2.7,5.3,1.9,Iris-virginica -6.8,3.0,5.5,2.1,Iris-virginica -5.7,2.5,5.0,2.0,Iris-virginica -5.8,2.8,5.1,2.4,Iris-virginica -6.4,3.2,5.3,2.3,Iris-virginica -6.5,3.0,5.5,1.8,Iris-virginica -7.7,3.8,6.7,2.2,Iris-virginica -7.7,2.6,6.9,2.3,Iris-virginica -4.8,3.0,1.4,0.1,Iris-setosa -4.3,3.0,1.1,0.1,Iris-setosa -5.8,4.0,1.2,0.2,Iris-setosa -5.7,4.4,1.5,0.4,Iris-setosa -5.4,3.9,1.3,0.4,Iris-setosa -5.1,3.5,1.4,0.3,Iris-setosa -5.7,3.8,1.7,0.3,Iris-setosa -7.0,3.2,4.7,1.4,Iris-versicolor -6.4,3.2,4.5,1.5,Iris-versicolor -6.9,3.1,4.9,1.5,Iris-versicolor -5.5,2.3,4.0,1.3,Iris-versicolor -6.5,2.8,4.6,1.5,Iris-versicolor -5.7,2.8,4.5,1.3,Iris-versicolor -6.3,3.3,4.7,1.6,Iris-versicolor -4.9,2.4,3.3,1.0,Iris-versicolor -6.6,2.9,4.6,1.3,Iris-versicolor -5.2,2.7,3.9,1.4,Iris-versicolor -5.0,2.0,3.5,1.0,Iris-versicolor -5.9,3.0,4.2,1.5,Iris-versicolor -6.0,2.2,4.0,1.0,Iris-versicolor -7.3,2.9,6.3,1.8,Iris-virginica -6.7,3.3,5.7,2.1,Iris-virginica -5.1,3.7,1.5,0.4,Iris-setosa -4.9,2.4,3.3,1.0,Iris-versicolor -6.7,3.3,5.7,2.5,Iris-virginica -7.2,3.0,5.8,1.6,Iris-virginica -4.9,3.1,1.5,0.1,Iris-setosa -6.7,3.1,5.6,2.4,Iris-virginica -4.9,3.0,1.4,0.2,Iris-setosa -6.9,3.1,4.9,1.5,Iris-versicolor -4.3,3.0,1.1,0.1,Iris-setosa -5.8,4.0,1.2,0.2,Iris-setosa -5.7,4.4,1.5,0.4,Iris-setosa -5.4,3.9,1.3,0.4,Iris-setosa -5.1,3.5,1.4,0.3,Iris-setosa -5.7,3.8,1.7,0.3,Iris-setosa -7.0,3.2,4.7,1.4,Iris-versicolor -6.4,3.2,4.5,1.5,Iris-versicolor -6.9,3.1,4.9,1.5,Iris-versicolor -5.5,2.3,4.0,1.3,Iris-versicolor -6.5,2.8,4.6,1.5,Iris-versicolor -5.7,2.8,4.5,1.3,Iris-versicolor -6.3,3.3,4.7,1.6,Iris-versicolor -4.9,2.4,3.3,1.0,Iris-versicolor -6.6,2.9,4.6,1.3,Iris-versicolor -5.2,2.7,3.9,1.4,Iris-versicolor -7.4,2.8,6.1,1.9,Iris-virginica -6.3,2.9,5.6,1.8,Iris-virginica -5.7,2.8,4.1,1.3,Iris-versicolor -6.5,3.0,5.5,1.8,Iris-virginica -6.3,2.3,4.4,1.3,Iris-versicolor -6.4,2.9,4.3,1.3,Iris-versicolor -5.6,2.8,4.9,2.0,Iris-virginica -5.9,3.0,5.1,1.8,Iris-virginica -5.4,3.4,1.7,0.2,Iris-setosa -6.1,2.8,4.0,1.3,Iris-versicolor -4.9,2.5,4.5,1.7,Iris-virginica -5.8,4.0,1.2,0.2,Iris-setosa -5.8,2.6,4.0,1.2,Iris-versicolor -7.1,3.0,5.9,2.1,Iris-virginica -5.1,3.5,1.4,0.2,Iris-setosa -4.9,3.0,1.4,0.2,Iris-setosa -4.7,3.2,1.3,0.2,Iris-setosa -4.6,3.1,1.5,0.2,Iris-setosa -5.0,3.6,1.4,0.2,Iris-setosa -5.4,3.9,1.7,0.4,Iris-setosa -4.6,3.4,1.4,0.3,Iris-setosa -5.0,3.4,1.5,0.2,Iris-setosa -4.4,2.9,1.4,0.2,Iris-setosa -4.9,3.1,1.5,0.1,Iris-setosa -6.1,2.9,4.7,1.4,Iris-versicolor -5.6,2.9,3.6,1.3,Iris-versicolor -6.7,3.1,4.4,1.4,Iris-versicolor -5.6,3.0,4.5,1.5,Iris-versicolor -5.8,2.7,4.1,1.0,Iris-versicolor -6.2,2.2,4.5,1.5,Iris-versicolor -5.6,2.5,3.9,1.1,Iris-versicolor -5.9,3.2,4.8,1.8,Iris-versicolor -6.1,2.8,4.0,1.3,Iris-versicolor -6.3,2.5,4.9,1.5,Iris-versicolor -6.1,2.8,4.7,1.2,Iris-versicolor -6.3,3.3,6.0,2.5,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -7.1,3.0,5.9,2.1,Iris-virginica -6.3,2.9,5.6,1.8,Iris-virginica -6.5,3.0,5.8,2.2,Iris-virginica -7.6,3.0,6.6,2.1,Iris-virginica -4.9,2.5,4.5,1.7,Iris-virginica -7.3,2.9,6.3,1.8,Iris-virginica -6.7,2.5,5.8,1.8,Iris-virginica -7.2,3.6,6.1,2.5,Iris-virginica -6.5,3.2,5.1,2.0,Iris-virginica -6.4,2.7,5.3,1.9,Iris-virginica -6.8,3.0,5.5,2.1,Iris-virginica -5.7,2.5,5.0,2.0,Iris-virginica -5.8,2.8,5.1,2.4,Iris-virginica -6.4,3.2,5.3,2.3,Iris-virginica -6.5,3.0,5.5,1.8,Iris-virginica -7.7,3.8,6.7,2.2,Iris-virginica -7.7,2.6,6.9,2.3,Iris-virginica -6.0,2.2,5.0,1.5,Iris-virginica -6.9,3.2,5.7,2.3,Iris-virginica -5.6,2.8,4.9,2.0,Iris-virginica -7.7,2.8,6.7,2.0,Iris-virginica -6.3,2.7,4.9,1.8,Iris-virginica -6.7,3.3,5.7,2.1,Iris-virginica -7.2,3.2,6.0,1.8,Iris-virginica -6.2,2.8,4.8,1.8,Iris-virginica -6.1,3.0,4.9,1.8,Iris-virginica -6.4,2.8,5.6,2.1,Iris-virginica -7.2,3.0,5.8,1.6,Iris-virginica -7.4,2.8,6.1,1.9,Iris-virginica -7.9,3.8,6.4,2.0,Iris-virginica -6.4,2.8,5.6,2.2,Iris-virginica -6.3,2.8,5.1,1.5,Iris-virginica -6.1,2.6,5.6,1.4,Iris-virginica -7.7,3.0,6.1,2.3,Iris-virginica -6.3,3.4,5.6,2.4,Iris-virginica -6.4,3.1,5.5,1.8,Iris-virginica -6.0,3.0,4.8,1.8,Iris-virginica -6.9,3.1,5.4,2.1,Iris-virginica -6.7,3.1,5.6,2.4,Iris-virginica -6.9,3.1,5.1,2.3,Iris-virginica -5.8,2.7,5.1,1.9,Iris-virginica -6.8,3.2,5.9,2.3,Iris-virginica -4.9,3.1,1.5,0.1,Iris-setosa -5.4,3.7,1.5,0.2,Iris-setosa -4.8,3.4,1.6,0.2,Iris-setosa -4.8,3.0,1.4,0.1,Iris-setosa -4.3,3.0,1.1,0.1,Iris-setosa -5.8,4.0,1.2,0.2,Iris-setosa -5.7,4.4,1.5,0.4,Iris-setosa -5.4,3.9,1.3,0.4,Iris-setosa -5.1,3.5,1.4,0.3,Iris-setosa \ No newline at end of file From 26446a1911532e57a3ffd9b8b690aa88381ea90e Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:20:39 +0530 Subject: [PATCH 73/76] Update kmeans_param.json --- extras/iris_pipeline_project/kmeans_param.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extras/iris_pipeline_project/kmeans_param.json b/extras/iris_pipeline_project/kmeans_param.json index 119a724807..33d2c3c288 100644 --- a/extras/iris_pipeline_project/kmeans_param.json +++ b/extras/iris_pipeline_project/kmeans_param.json @@ -1,4 +1,5 @@ { "n_clusters": 3, - "random_state": 42 -} \ No newline at end of file + "random_state": 42, + "use_oneDAL": True +} From d41dcad5bf369ebb062f8d09c0814f5b40af7d10 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:21:09 +0530 Subject: [PATCH 74/76] Update hyperparams.json --- extras/iris_pipeline_project/hyperparams.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/hyperparams.json b/extras/iris_pipeline_project/hyperparams.json index b0a9b77e79..6a4815cb2f 100644 --- a/extras/iris_pipeline_project/hyperparams.json +++ b/extras/iris_pipeline_project/hyperparams.json @@ -1,5 +1,6 @@ { "max_iter": 500, "C": 0.8, - "solver": "liblinear" + "solver": "liblinear", + "use_ipex": False } From ef748ab93adf1ea3e9ba533ce6e43c58d1a16950 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:24:50 +0530 Subject: [PATCH 75/76] Update README.md --- extras/iris_pipeline_project/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index 3c9d5d7262..bc4e02db6a 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -1,6 +1,6 @@ # Optimized serving endpoint for Classical Machine Learning Models -This repository demonstrates how to use OpenVINO Model Server (OVMS) with a custom Mediapipe pipeline for the Iris dataset, including both model training and inference through a Python client. +This project presents a versatile framework for training and deploying classical machine learning models on the OpenVINO Model Server (OVMS), leveraging accelerators(oneDAL for scikit-learn and IPEX for pytorch algorithms) to boost inference performance. The architecture is designed as a general solution, accommodating various machine learning algorithms and providing a consistent structure for both model development and production deployment. At the moment, for demonstrating purposes of the established project structure, we'll be demonstrating the Logistic Regression Model in pytorch and KMeans algorithm using scikit-Learn . From 344b8f19d49411ab7e6babe0c37ccd59b5782418 Mon Sep 17 00:00:00 2001 From: Harshitha Manne <141660450+darksapien23151@users.noreply.github.com> Date: Mon, 8 Sep 2025 19:30:42 +0530 Subject: [PATCH 76/76] Update README.md --- extras/iris_pipeline_project/README.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/extras/iris_pipeline_project/README.md b/extras/iris_pipeline_project/README.md index bc4e02db6a..7e4e353717 100644 --- a/extras/iris_pipeline_project/README.md +++ b/extras/iris_pipeline_project/README.md @@ -6,6 +6,16 @@ At the moment, for demonstrating purposes of the established project structure, --- +## Instructions for preparing the data +Run the command to download the Iris dataset, which is taken to be the hello-world dataset of classification datasets for simplicity purposes. +Split and preprocess(label encoding, normalization and Cross validation) accordingly. + +```bash +curl -o iris.csv https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data +``` + +--- + ## Step 1: Clone the Repository ```bash @@ -38,11 +48,7 @@ docker build --no-cache -t prototype_iris . client/ ├── client_inference.py └── client_train.py -data_folder/ - ├── iris_train.csv - └── iris_test.csv pipeline/ - ├── __pycache__/ ├── graph.pbtxt ├── model.py └── ovmsmodel.py @@ -79,17 +85,10 @@ python client/client_inference.py infer iris_train_nolabel.csv --target_column --- For Enabling accelerator support: -Manually set the ```bool - (use_ipex/use_oneDAL)``` in model.py file under "pipeline" directory to either True/False depending on the necessity. - -## Instructions for preparing the data -Run the command to download the Iris dataset, which is taken to be the hello-world dataset of classification datasets. - -```bash -curl -o iris.csv https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data -``` +You can pass the ```bool - (use_ipex/use_oneDAL)``` in the "hyperparams.json"/ "kmeans_params.json" file as a key variable pair to either True/False depending on the necessity. -Command-Line Usage +Command-Line Usage: The training and inference client supports flexible options for both Logistic Regression and KMeans models.