diff --git a/extras/Dockerfile b/extras/Dockerfile new file mode 100644 index 0000000000..9028e545ff --- /dev/null +++ b/extras/Dockerfile @@ -0,0 +1,16 @@ +FROM openvino/model_server:latest + +USER root + +ENV LD_LIBRARY_PATH=/ovms/lib +ENV PYTHONPATH=/ovms/lib/python + +COPY model/iris_logreg /models/iris_logreg +COPY pipeline/graph.pbtxt /models/iris_pipeline/ +COPY pipeline/ovmsmodel.py /models/iris_pipeline/ +COPY model_config.json /model_config.json + +RUN apt-get update && apt-get install -y python3-pip +RUN pip3 install --break-system-packages pandas numpy scikit-learn joblib skl2onnx onnx + +ENTRYPOINT ["/ovms/bin/ovms", "--config_path", "/model_config.json"] \ No newline at end of file diff --git a/extras/data/Iris (copy).csv b/extras/data/Iris (copy).csv new file mode 100644 index 0000000000..1bf42f2549 --- /dev/null +++ b/extras/data/Iris (copy).csv @@ -0,0 +1,151 @@ +Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species +1,5.1,3.5,1.4,0.2,Iris-setosa +2,4.9,3.0,1.4,0.2,Iris-setosa +3,4.7,3.2,1.3,0.2,Iris-setosa +4,4.6,3.1,1.5,0.2,Iris-setosa +5,5.0,3.6,1.4,0.2,Iris-setosa +6,5.4,3.9,1.7,0.4,Iris-setosa +7,4.6,3.4,1.4,0.3,Iris-setosa +8,5.0,3.4,1.5,0.2,Iris-setosa +9,4.4,2.9,1.4,0.2,Iris-setosa +10,4.9,3.1,1.5,0.1,Iris-setosa +11,5.4,3.7,1.5,0.2,Iris-setosa +12,4.8,3.4,1.6,0.2,Iris-setosa +13,4.8,3.0,1.4,0.1,Iris-setosa +14,4.3,3.0,1.1,0.1,Iris-setosa +15,5.8,4.0,1.2,0.2,Iris-setosa +16,5.7,4.4,1.5,0.4,Iris-setosa +17,5.4,3.9,1.3,0.4,Iris-setosa +18,5.1,3.5,1.4,0.3,Iris-setosa +19,5.7,3.8,1.7,0.3,Iris-setosa +20,5.1,3.8,1.5,0.3,Iris-setosa +21,5.4,3.4,1.7,0.2,Iris-setosa +22,5.1,3.7,1.5,0.4,Iris-setosa +23,4.6,3.6,1.0,0.2,Iris-setosa +24,5.1,3.3,1.7,0.5,Iris-setosa +25,4.8,3.4,1.9,0.2,Iris-setosa +26,5.0,3.0,1.6,0.2,Iris-setosa +27,5.0,3.4,1.6,0.4,Iris-setosa +28,5.2,3.5,1.5,0.2,Iris-setosa +29,5.2,3.4,1.4,0.2,Iris-setosa +30,4.7,3.2,1.6,0.2,Iris-setosa +31,4.8,3.1,1.6,0.2,Iris-setosa +32,5.4,3.4,1.5,0.4,Iris-setosa +33,5.2,4.1,1.5,0.1,Iris-setosa +34,5.5,4.2,1.4,0.2,Iris-setosa +35,4.9,3.1,1.5,0.1,Iris-setosa +36,5.0,3.2,1.2,0.2,Iris-setosa +37,5.5,3.5,1.3,0.2,Iris-setosa +38,4.9,3.1,1.5,0.1,Iris-setosa +39,4.4,3.0,1.3,0.2,Iris-setosa +40,5.1,3.4,1.5,0.2,Iris-setosa +41,5.0,3.5,1.3,0.3,Iris-setosa +42,4.5,2.3,1.3,0.3,Iris-setosa +43,4.4,3.2,1.3,0.2,Iris-setosa +44,5.0,3.5,1.6,0.6,Iris-setosa +45,5.1,3.8,1.9,0.4,Iris-setosa +46,4.8,3.0,1.4,0.3,Iris-setosa +47,5.1,3.8,1.6,0.2,Iris-setosa +48,4.6,3.2,1.4,0.2,Iris-setosa +49,5.3,3.7,1.5,0.2,Iris-setosa +50,5.0,3.3,1.4,0.2,Iris-setosa +51,7.0,3.2,4.7,1.4,Iris-versicolor +52,6.4,3.2,4.5,1.5,Iris-versicolor +53,6.9,3.1,4.9,1.5,Iris-versicolor +54,5.5,2.3,4.0,1.3,Iris-versicolor +55,6.5,2.8,4.6,1.5,Iris-versicolor +56,5.7,2.8,4.5,1.3,Iris-versicolor +57,6.3,3.3,4.7,1.6,Iris-versicolor +58,4.9,2.4,3.3,1.0,Iris-versicolor +59,6.6,2.9,4.6,1.3,Iris-versicolor +60,5.2,2.7,3.9,1.4,Iris-versicolor +61,5.0,2.0,3.5,1.0,Iris-versicolor +62,5.9,3.0,4.2,1.5,Iris-versicolor +63,6.0,2.2,4.0,1.0,Iris-versicolor +64,6.1,2.9,4.7,1.4,Iris-versicolor +65,5.6,2.9,3.6,1.3,Iris-versicolor +66,6.7,3.1,4.4,1.4,Iris-versicolor +67,5.6,3.0,4.5,1.5,Iris-versicolor +68,5.8,2.7,4.1,1.0,Iris-versicolor +69,6.2,2.2,4.5,1.5,Iris-versicolor +70,5.6,2.5,3.9,1.1,Iris-versicolor +71,5.9,3.2,4.8,1.8,Iris-versicolor +72,6.1,2.8,4.0,1.3,Iris-versicolor +73,6.3,2.5,4.9,1.5,Iris-versicolor +74,6.1,2.8,4.7,1.2,Iris-versicolor +75,6.4,2.9,4.3,1.3,Iris-versicolor +76,6.6,3.0,4.4,1.4,Iris-versicolor +77,6.8,2.8,4.8,1.4,Iris-versicolor +78,6.7,3.0,5.0,1.7,Iris-versicolor +79,6.0,2.9,4.5,1.5,Iris-versicolor +80,5.7,2.6,3.5,1.0,Iris-versicolor +81,5.5,2.4,3.8,1.1,Iris-versicolor +82,5.5,2.4,3.7,1.0,Iris-versicolor +83,5.8,2.7,3.9,1.2,Iris-versicolor +84,6.0,2.7,5.1,1.6,Iris-versicolor +85,5.4,3.0,4.5,1.5,Iris-versicolor +86,6.0,3.4,4.5,1.6,Iris-versicolor +87,6.7,3.1,4.7,1.5,Iris-versicolor +88,6.3,2.3,4.4,1.3,Iris-versicolor +89,5.6,3.0,4.1,1.3,Iris-versicolor +90,5.5,2.5,4.0,1.3,Iris-versicolor +91,5.5,2.6,4.4,1.2,Iris-versicolor +92,6.1,3.0,4.6,1.4,Iris-versicolor +93,5.8,2.6,4.0,1.2,Iris-versicolor +94,5.0,2.3,3.3,1.0,Iris-versicolor +95,5.6,2.7,4.2,1.3,Iris-versicolor +96,5.7,3.0,4.2,1.2,Iris-versicolor +97,5.7,2.9,4.2,1.3,Iris-versicolor +98,6.2,2.9,4.3,1.3,Iris-versicolor +99,5.1,2.5,3.0,1.1,Iris-versicolor +100,5.7,2.8,4.1,1.3,Iris-versicolor +101,6.3,3.3,6.0,2.5,Iris-virginica +102,5.8,2.7,5.1,1.9,Iris-virginica +103,7.1,3.0,5.9,2.1,Iris-virginica +104,6.3,2.9,5.6,1.8,Iris-virginica +105,6.5,3.0,5.8,2.2,Iris-virginica +106,7.6,3.0,6.6,2.1,Iris-virginica +107,4.9,2.5,4.5,1.7,Iris-virginica +108,7.3,2.9,6.3,1.8,Iris-virginica +109,6.7,2.5,5.8,1.8,Iris-virginica +110,7.2,3.6,6.1,2.5,Iris-virginica +111,6.5,3.2,5.1,2.0,Iris-virginica +112,6.4,2.7,5.3,1.9,Iris-virginica +113,6.8,3.0,5.5,2.1,Iris-virginica +114,5.7,2.5,5.0,2.0,Iris-virginica +115,5.8,2.8,5.1,2.4,Iris-virginica +116,6.4,3.2,5.3,2.3,Iris-virginica +117,6.5,3.0,5.5,1.8,Iris-virginica +118,7.7,3.8,6.7,2.2,Iris-virginica +119,7.7,2.6,6.9,2.3,Iris-virginica +120,6.0,2.2,5.0,1.5,Iris-virginica +121,6.9,3.2,5.7,2.3,Iris-virginica +122,5.6,2.8,4.9,2.0,Iris-virginica +123,7.7,2.8,6.7,2.0,Iris-virginica +124,6.3,2.7,4.9,1.8,Iris-virginica +125,6.7,3.3,5.7,2.1,Iris-virginica +126,7.2,3.2,6.0,1.8,Iris-virginica +127,6.2,2.8,4.8,1.8,Iris-virginica +128,6.1,3.0,4.9,1.8,Iris-virginica +129,6.4,2.8,5.6,2.1,Iris-virginica +130,7.2,3.0,5.8,1.6,Iris-virginica +131,7.4,2.8,6.1,1.9,Iris-virginica +132,7.9,3.8,6.4,2.0,Iris-virginica +133,6.4,2.8,5.6,2.2,Iris-virginica +134,6.3,2.8,5.1,1.5,Iris-virginica +135,6.1,2.6,5.6,1.4,Iris-virginica +136,7.7,3.0,6.1,2.3,Iris-virginica +137,6.3,3.4,5.6,2.4,Iris-virginica +138,6.4,3.1,5.5,1.8,Iris-virginica +139,6.0,3.0,4.8,1.8,Iris-virginica +140,6.9,3.1,5.4,2.1,Iris-virginica +141,6.7,3.1,5.6,2.4,Iris-virginica +142,6.9,3.1,5.1,2.3,Iris-virginica +143,5.8,2.7,5.1,1.9,Iris-virginica +144,6.8,3.2,5.9,2.3,Iris-virginica +145,6.7,3.3,5.7,2.5,Iris-virginica +146,6.7,3.0,5.2,2.3,Iris-virginica +147,6.3,2.5,5.0,1.9,Iris-virginica +148,6.5,3.0,5.2,2.0,Iris-virginica +149,6.2,3.4,5.4,2.3,Iris-virginica +150,5.9,3.0,5.1,1.8,Iris-virginica diff --git a/extras/data/data_slit.py b/extras/data/data_slit.py new file mode 100644 index 0000000000..c645e76405 --- /dev/null +++ b/extras/data/data_slit.py @@ -0,0 +1,12 @@ +import pandas as pd +from sklearn.model_selection import train_test_split + +# Load the complete dataset +df = pd.read_csv('data/Iris (copy).csv') # Update this path as needed + +# Split the data (80% train, 20% test by default) +train_df, test_df = train_test_split(df, test_size=0.2, random_state=42, shuffle=True) + +# Save to new CSV files +train_df.to_csv('data/iris_train.csv', index=False) +test_df.to_csv('data/iris_test.csv', index=False) \ No newline at end of file diff --git a/extras/data/iris_test.csv b/extras/data/iris_test.csv new file mode 100644 index 0000000000..c70ca719dc --- /dev/null +++ b/extras/data/iris_test.csv @@ -0,0 +1,31 @@ +Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species +74,6.1,2.8,4.7,1.2,Iris-versicolor +19,5.7,3.8,1.7,0.3,Iris-setosa +119,7.7,2.6,6.9,2.3,Iris-virginica +79,6.0,2.9,4.5,1.5,Iris-versicolor +77,6.8,2.8,4.8,1.4,Iris-versicolor +32,5.4,3.4,1.5,0.4,Iris-setosa +65,5.6,2.9,3.6,1.3,Iris-versicolor +142,6.9,3.1,5.1,2.3,Iris-virginica +69,6.2,2.2,4.5,1.5,Iris-versicolor +83,5.8,2.7,3.9,1.2,Iris-versicolor +111,6.5,3.2,5.1,2.0,Iris-virginica +13,4.8,3.0,1.4,0.1,Iris-setosa +37,5.5,3.5,1.3,0.2,Iris-setosa +10,4.9,3.1,1.5,0.1,Iris-setosa +20,5.1,3.8,1.5,0.3,Iris-setosa +57,6.3,3.3,4.7,1.6,Iris-versicolor +105,6.5,3.0,5.8,2.2,Iris-virginica +70,5.6,2.5,3.9,1.1,Iris-versicolor +56,5.7,2.8,4.5,1.3,Iris-versicolor +133,6.4,2.8,5.6,2.2,Iris-virginica +30,4.7,3.2,1.6,0.2,Iris-setosa +128,6.1,3.0,4.9,1.8,Iris-virginica +27,5.0,3.4,1.6,0.4,Iris-setosa +129,6.4,2.8,5.6,2.1,Iris-virginica +132,7.9,3.8,6.4,2.0,Iris-virginica +146,6.7,3.0,5.2,2.3,Iris-virginica +109,6.7,2.5,5.8,1.8,Iris-virginica +144,6.8,3.2,5.9,2.3,Iris-virginica +46,4.8,3.0,1.4,0.3,Iris-setosa +31,4.8,3.1,1.6,0.2,Iris-setosa diff --git a/extras/data/iris_train.csv b/extras/data/iris_train.csv new file mode 100644 index 0000000000..0baf242fb0 --- /dev/null +++ b/extras/data/iris_train.csv @@ -0,0 +1,121 @@ +Id,SepalLengthCm,SepalWidthCm,PetalLengthCm,PetalWidthCm,Species +23,4.6,3.6,1.0,0.2,Iris-setosa +16,5.7,4.4,1.5,0.4,Iris-setosa +66,6.7,3.1,4.4,1.4,Iris-versicolor +12,4.8,3.4,1.6,0.2,Iris-setosa +43,4.4,3.2,1.3,0.2,Iris-setosa +147,6.3,2.5,5.0,1.9,Iris-virginica +52,6.4,3.2,4.5,1.5,Iris-versicolor +28,5.2,3.5,1.5,0.2,Iris-setosa +5,5.0,3.6,1.4,0.2,Iris-setosa +33,5.2,4.1,1.5,0.1,Iris-setosa +143,5.8,2.7,5.1,1.9,Iris-virginica +86,6.0,3.4,4.5,1.6,Iris-versicolor +87,6.7,3.1,4.7,1.5,Iris-versicolor +17,5.4,3.9,1.3,0.4,Iris-setosa +11,5.4,3.7,1.5,0.2,Iris-setosa +82,5.5,2.4,3.7,1.0,Iris-versicolor +134,6.3,2.8,5.1,1.5,Iris-virginica +138,6.4,3.1,5.5,1.8,Iris-virginica +76,6.6,3.0,4.4,1.4,Iris-versicolor +110,7.2,3.6,6.1,2.5,Iris-virginica +97,5.7,2.9,4.2,1.3,Iris-versicolor +106,7.6,3.0,6.6,2.1,Iris-virginica +67,5.6,3.0,4.5,1.5,Iris-versicolor +1,5.1,3.5,1.4,0.2,Iris-setosa +123,7.7,2.8,6.7,2.0,Iris-virginica +68,5.8,2.7,4.1,1.0,Iris-versicolor +29,5.2,3.4,1.4,0.2,Iris-setosa +41,5.0,3.5,1.3,0.3,Iris-setosa +45,5.1,3.8,1.9,0.4,Iris-setosa +61,5.0,2.0,3.5,1.0,Iris-versicolor +124,6.3,2.7,4.9,1.8,Iris-virginica +25,4.8,3.4,1.9,0.2,Iris-setosa +26,5.0,3.0,1.6,0.2,Iris-setosa +24,5.1,3.3,1.7,0.5,Iris-setosa +95,5.6,2.7,4.2,1.3,Iris-versicolor +40,5.1,3.4,1.5,0.2,Iris-setosa +96,5.7,3.0,4.2,1.2,Iris-versicolor +118,7.7,3.8,6.7,2.2,Iris-virginica +48,4.6,3.2,1.4,0.2,Iris-setosa +98,6.2,2.9,4.3,1.3,Iris-versicolor +114,5.7,2.5,5.0,2.0,Iris-virginica +34,5.5,4.2,1.4,0.2,Iris-setosa +139,6.0,3.0,4.8,1.8,Iris-virginica +102,5.8,2.7,5.1,1.9,Iris-virginica +63,6.0,2.2,4.0,1.0,Iris-versicolor +85,5.4,3.0,4.5,1.5,Iris-versicolor +149,6.2,3.4,5.4,2.3,Iris-virginica +54,5.5,2.3,4.0,1.3,Iris-versicolor +6,5.4,3.9,1.7,0.4,Iris-setosa +94,5.0,2.3,3.3,1.0,Iris-versicolor +112,6.4,2.7,5.3,1.9,Iris-virginica +50,5.0,3.3,1.4,0.2,Iris-setosa +36,5.0,3.2,1.2,0.2,Iris-setosa +81,5.5,2.4,3.8,1.1,Iris-versicolor +78,6.7,3.0,5.0,1.7,Iris-versicolor +35,4.9,3.1,1.5,0.1,Iris-setosa +115,5.8,2.8,5.1,2.4,Iris-virginica +8,5.0,3.4,1.5,0.2,Iris-setosa +44,5.0,3.5,1.6,0.6,Iris-setosa +71,5.9,3.2,4.8,1.8,Iris-versicolor +99,5.1,2.5,3.0,1.1,Iris-versicolor +121,6.9,3.2,5.7,2.3,Iris-virginica +84,6.0,2.7,5.1,1.6,Iris-versicolor +135,6.1,2.6,5.6,1.4,Iris-virginica +136,7.7,3.0,6.1,2.3,Iris-virginica +90,5.5,2.5,4.0,1.3,Iris-versicolor +9,4.4,2.9,1.4,0.2,Iris-setosa +14,4.3,3.0,1.1,0.1,Iris-setosa +120,6.0,2.2,5.0,1.5,Iris-virginica +126,7.2,3.2,6.0,1.8,Iris-virginica +4,4.6,3.1,1.5,0.2,Iris-setosa +18,5.1,3.5,1.4,0.3,Iris-setosa +39,4.4,3.0,1.3,0.2,Iris-setosa +73,6.3,2.5,4.9,1.5,Iris-versicolor +137,6.3,3.4,5.6,2.4,Iris-virginica +7,4.6,3.4,1.4,0.3,Iris-setosa +113,6.8,3.0,5.5,2.1,Iris-virginica +101,6.3,3.3,6.0,2.5,Iris-virginica +3,4.7,3.2,1.3,0.2,Iris-setosa +64,6.1,2.9,4.7,1.4,Iris-versicolor +55,6.5,2.8,4.6,1.5,Iris-versicolor +127,6.2,2.8,4.8,1.8,Iris-virginica +51,7.0,3.2,4.7,1.4,Iris-versicolor +116,6.4,3.2,5.3,2.3,Iris-virginica +47,5.1,3.8,1.6,0.2,Iris-setosa +140,6.9,3.1,5.4,2.1,Iris-virginica +62,5.9,3.0,4.2,1.5,Iris-versicolor +148,6.5,3.0,5.2,2.0,Iris-virginica +80,5.7,2.6,3.5,1.0,Iris-versicolor +60,5.2,2.7,3.9,1.4,Iris-versicolor +92,6.1,3.0,4.6,1.4,Iris-versicolor +42,4.5,2.3,1.3,0.3,Iris-setosa +59,6.6,2.9,4.6,1.3,Iris-versicolor +91,5.5,2.6,4.4,1.2,Iris-versicolor +49,5.3,3.7,1.5,0.2,Iris-setosa +89,5.6,3.0,4.1,1.3,Iris-versicolor +108,7.3,2.9,6.3,1.8,Iris-virginica +125,6.7,3.3,5.7,2.1,Iris-virginica +22,5.1,3.7,1.5,0.4,Iris-setosa +58,4.9,2.4,3.3,1.0,Iris-versicolor +145,6.7,3.3,5.7,2.5,Iris-virginica +130,7.2,3.0,5.8,1.6,Iris-virginica +38,4.9,3.1,1.5,0.1,Iris-setosa +141,6.7,3.1,5.6,2.4,Iris-virginica +2,4.9,3.0,1.4,0.2,Iris-setosa +53,6.9,3.1,4.9,1.5,Iris-versicolor +131,7.4,2.8,6.1,1.9,Iris-virginica +104,6.3,2.9,5.6,1.8,Iris-virginica +100,5.7,2.8,4.1,1.3,Iris-versicolor +117,6.5,3.0,5.5,1.8,Iris-virginica +88,6.3,2.3,4.4,1.3,Iris-versicolor +75,6.4,2.9,4.3,1.3,Iris-versicolor +122,5.6,2.8,4.9,2.0,Iris-virginica +150,5.9,3.0,5.1,1.8,Iris-virginica +21,5.4,3.4,1.7,0.2,Iris-setosa +72,6.1,2.8,4.0,1.3,Iris-versicolor +107,4.9,2.5,4.5,1.7,Iris-virginica +15,5.8,4.0,1.2,0.2,Iris-setosa +93,5.8,2.6,4.0,1.2,Iris-versicolor +103,7.1,3.0,5.9,2.1,Iris-virginica diff --git a/extras/model_config.json b/extras/model_config.json new file mode 100644 index 0000000000..271fd984a1 --- /dev/null +++ b/extras/model_config.json @@ -0,0 +1,10 @@ +{ + "model_config_list": [ + { + "config": { + "name": "iris_pipeline", + "base_path": "/models/iris_pipeline" + } + } + ] +} diff --git a/extras/pipeline/graph.pbtxt b/extras/pipeline/graph.pbtxt new file mode 100644 index 0000000000..8dfee9b121 --- /dev/null +++ b/extras/pipeline/graph.pbtxt @@ -0,0 +1,26 @@ +input_stream: "pipeline_input" +output_stream: "pipeline_output" + +node { + calculator: "InferenceCalculator" + input_stream: "pipeline_input" + output_stream: "trained_model_path" + options: { + [type.googleapis.com/openvino.CalculatorOptions] { + model_name: "iris_pipeline" + signature_name: "serving_default" + } + } +} + +node { + calculator: "InferenceCalculator" + input_stream: "trained_model_path" + output_stream: "pipeline_output" + options: { + [type.googleapis.com/openvino.CalculatorOptions] { + model_name: "iris_pipeline" + signature_name: "serving_default" + } + } +} \ No newline at end of file diff --git a/extras/pipeline/ovmsmodel.py b/extras/pipeline/ovmsmodel.py new file mode 100644 index 0000000000..c9eb7ee4e1 --- /dev/null +++ b/extras/pipeline/ovmsmodel.py @@ -0,0 +1,43 @@ +import pandas as pd +import numpy as np +import joblib +import os +import io +from pyovms import Tensor +from sklearn.linear_model import LogisticRegression +from skl2onnx import to_onnx +import onnx + +class OvmsPythonModel: + def initialize(self, kwargs): + print("Training handler initialized.") + + def execute(self, inputs): + print("Starting training...") + input_tensor = inputs[0] + input_data = input_tensor.as_numpy() + csv_str = input_data.tobytes().decode('utf-8') + + df = pd.read_csv(io.StringIO(csv_str)) + + X = df.iloc[:, :-1] + y = df.iloc[:, -1] + + model = LogisticRegression(max_iter=200) + model.fit(X, y) + + # Ensure output directory exists + output_dir = "/model/iris_logreg/1" + os.makedirs(output_dir, exist_ok=True) + + # Convert to ONNX and save to the versioned folder + onx = to_onnx(model, X[:1], target_opset=12) + output_path = os.path.join(output_dir, "logreg_model.onnx") + with open(output_path, "wb") as f: + f.write(onx.SerializeToString()) + + print(f"Model saved to {output_path}") + return [Tensor.from_numpy(np.array([True]))] + + def finalize(self): + print("Training handler finalized.") \ No newline at end of file