From 19fcec84d8d7d21e796c7624e521b60d28ee21ed Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 20:45:59 +0200 Subject: Adding upstream version 16.2.11+ds. Signed-off-by: Daniel Baumann --- src/pybind/mgr/diskprediction_local/__init__.py | 1 + .../models/prophetstor/config.json | 77 ++++ .../models/prophetstor/svm_1.pkl | Bin 0 -> 281292 bytes .../models/prophetstor/svm_10.pkl | Bin 0 -> 217792 bytes .../models/prophetstor/svm_104.pkl | Bin 0 -> 492492 bytes .../models/prophetstor/svm_105.pkl | Bin 0 -> 217192 bytes .../models/prophetstor/svm_109.pkl | Bin 0 -> 256392 bytes .../models/prophetstor/svm_112.pkl | Bin 0 -> 499492 bytes .../models/prophetstor/svm_114.pkl | Bin 0 -> 276492 bytes .../models/prophetstor/svm_115.pkl | Bin 0 -> 509592 bytes .../models/prophetstor/svm_118.pkl | Bin 0 -> 315192 bytes .../models/prophetstor/svm_119.pkl | Bin 0 -> 485992 bytes .../models/prophetstor/svm_12.pkl | Bin 0 -> 275692 bytes .../models/prophetstor/svm_120.pkl | Bin 0 -> 307592 bytes .../models/prophetstor/svm_123.pkl | Bin 0 -> 246792 bytes .../models/prophetstor/svm_124.pkl | Bin 0 -> 310292 bytes .../models/prophetstor/svm_125.pkl | Bin 0 -> 452492 bytes .../models/prophetstor/svm_128.pkl | Bin 0 -> 550492 bytes .../models/prophetstor/svm_131.pkl | Bin 0 -> 493192 bytes .../models/prophetstor/svm_134.pkl | Bin 0 -> 266692 bytes .../models/prophetstor/svm_138.pkl | Bin 0 -> 488292 bytes .../models/prophetstor/svm_14.pkl | Bin 0 -> 244892 bytes .../models/prophetstor/svm_141.pkl | Bin 0 -> 422368 bytes .../models/prophetstor/svm_145.pkl | Bin 0 -> 359512 bytes .../models/prophetstor/svm_151.pkl | Bin 0 -> 305944 bytes .../models/prophetstor/svm_16.pkl | Bin 0 -> 308192 bytes .../models/prophetstor/svm_161.pkl | Bin 0 -> 305188 bytes .../models/prophetstor/svm_168.pkl | Bin 0 -> 301516 bytes .../models/prophetstor/svm_169.pkl | Bin 0 -> 363400 bytes .../models/prophetstor/svm_174.pkl | Bin 0 -> 323764 bytes .../models/prophetstor/svm_18.pkl | Bin 0 -> 312692 bytes .../models/prophetstor/svm_182.pkl | Bin 0 -> 354652 bytes .../models/prophetstor/svm_185.pkl | Bin 0 -> 317176 bytes .../models/prophetstor/svm_186.pkl | Bin 0 -> 276352 bytes .../models/prophetstor/svm_195.pkl | Bin 0 -> 489544 bytes .../models/prophetstor/svm_201.pkl | Bin 0 -> 307888 bytes .../models/prophetstor/svm_204.pkl | Bin 0 -> 567088 bytes .../models/prophetstor/svm_206.pkl | Bin 0 -> 474856 bytes .../models/prophetstor/svm_208.pkl | Bin 0 -> 283588 bytes .../models/prophetstor/svm_210.pkl | Bin 0 -> 617200 bytes .../models/prophetstor/svm_212.pkl | Bin 0 -> 345148 bytes .../models/prophetstor/svm_213.pkl | Bin 0 -> 357568 bytes .../models/prophetstor/svm_219.pkl | Bin 0 -> 342232 bytes .../models/prophetstor/svm_221.pkl | Bin 0 -> 365128 bytes .../models/prophetstor/svm_222.pkl | Bin 0 -> 314800 bytes .../models/prophetstor/svm_223.pkl | Bin 0 -> 342124 bytes .../models/prophetstor/svm_225.pkl | Bin 0 -> 329812 bytes .../models/prophetstor/svm_227.pkl | Bin 0 -> 296440 bytes .../models/prophetstor/svm_229.pkl | Bin 0 -> 572380 bytes .../models/prophetstor/svm_230.pkl | Bin 0 -> 251188 bytes .../models/prophetstor/svm_234.pkl | Bin 0 -> 277972 bytes .../models/prophetstor/svm_235.pkl | Bin 0 -> 243736 bytes .../models/prophetstor/svm_236.pkl | Bin 0 -> 377872 bytes .../models/prophetstor/svm_239.pkl | Bin 0 -> 571732 bytes .../models/prophetstor/svm_243.pkl | Bin 0 -> 534148 bytes .../models/prophetstor/svm_27.pkl | Bin 0 -> 504592 bytes .../models/prophetstor/svm_3.pkl | Bin 0 -> 557192 bytes .../models/prophetstor/svm_33.pkl | Bin 0 -> 547392 bytes .../models/prophetstor/svm_36.pkl | Bin 0 -> 516692 bytes .../models/prophetstor/svm_44.pkl | Bin 0 -> 546592 bytes .../models/prophetstor/svm_50.pkl | Bin 0 -> 448292 bytes .../models/prophetstor/svm_57.pkl | Bin 0 -> 328292 bytes .../models/prophetstor/svm_59.pkl | Bin 0 -> 494292 bytes .../models/prophetstor/svm_6.pkl | Bin 0 -> 314092 bytes .../models/prophetstor/svm_61.pkl | Bin 0 -> 499492 bytes .../models/prophetstor/svm_62.pkl | Bin 0 -> 483492 bytes .../models/prophetstor/svm_67.pkl | Bin 0 -> 492592 bytes .../models/prophetstor/svm_69.pkl | Bin 0 -> 288292 bytes .../models/prophetstor/svm_71.pkl | Bin 0 -> 228792 bytes .../models/prophetstor/svm_72.pkl | Bin 0 -> 489492 bytes .../models/prophetstor/svm_78.pkl | Bin 0 -> 491392 bytes .../models/prophetstor/svm_79.pkl | Bin 0 -> 284992 bytes .../models/prophetstor/svm_82.pkl | Bin 0 -> 255292 bytes .../models/prophetstor/svm_85.pkl | Bin 0 -> 522092 bytes .../models/prophetstor/svm_88.pkl | Bin 0 -> 502392 bytes .../models/prophetstor/svm_93.pkl | Bin 0 -> 302592 bytes .../models/prophetstor/svm_97.pkl | Bin 0 -> 272392 bytes .../diskprediction_local/models/redhat/config.json | 4 + .../models/redhat/hgst_predictor.pkl | Bin 0 -> 2860606 bytes .../models/redhat/hgst_scaler.pkl | Bin 0 -> 1865 bytes .../models/redhat/seagate_predictor.pkl | Bin 0 -> 37062936 bytes .../models/redhat/seagate_scaler.pkl | Bin 0 -> 1481 bytes src/pybind/mgr/diskprediction_local/module.py | 319 ++++++++++++++ src/pybind/mgr/diskprediction_local/predictor.py | 466 +++++++++++++++++++++ .../mgr/diskprediction_local/requirements.txt | 3 + 85 files changed, 870 insertions(+) create mode 100644 src/pybind/mgr/diskprediction_local/__init__.py create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/config.json create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_1.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_10.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_104.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_105.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_109.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_112.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_114.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_115.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_118.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_119.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_12.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_120.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_123.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_124.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_125.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_128.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_131.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_134.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_138.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_14.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_141.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_145.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_151.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_16.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_161.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_168.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_169.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_174.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_18.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_182.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_185.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_186.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_195.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_201.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_204.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_206.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_208.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_210.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_212.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_213.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_219.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_221.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_222.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_223.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_225.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_227.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_229.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_230.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_234.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_235.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_236.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_239.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_243.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_27.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_3.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_33.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_36.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_44.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_50.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_57.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_59.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_6.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_61.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_62.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_67.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_69.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_71.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_72.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_78.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_79.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_82.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_85.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_88.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_93.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/prophetstor/svm_97.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/redhat/config.json create mode 100644 src/pybind/mgr/diskprediction_local/models/redhat/hgst_predictor.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/redhat/hgst_scaler.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/redhat/seagate_predictor.pkl create mode 100644 src/pybind/mgr/diskprediction_local/models/redhat/seagate_scaler.pkl create mode 100644 src/pybind/mgr/diskprediction_local/module.py create mode 100644 src/pybind/mgr/diskprediction_local/predictor.py create mode 100644 src/pybind/mgr/diskprediction_local/requirements.txt (limited to 'src/pybind/mgr/diskprediction_local') diff --git a/src/pybind/mgr/diskprediction_local/__init__.py b/src/pybind/mgr/diskprediction_local/__init__.py new file mode 100644 index 000000000..8f210ac92 --- /dev/null +++ b/src/pybind/mgr/diskprediction_local/__init__.py @@ -0,0 +1 @@ +from .module import Module diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/config.json b/src/pybind/mgr/diskprediction_local/models/prophetstor/config.json new file mode 100644 index 000000000..9a1485ca3 --- /dev/null +++ b/src/pybind/mgr/diskprediction_local/models/prophetstor/config.json @@ -0,0 +1,77 @@ +{ +"svm_123.pkl": ["smart_197_raw", "smart_183_raw", "smart_200_raw", "smart_194_raw", "smart_254_raw", "smart_252_raw", "smart_4_raw", "smart_222_raw", "smart_187_raw", "smart_184_raw"], +"svm_105.pkl": ["smart_197_raw", "smart_4_raw", "smart_5_raw", "smart_252_raw", "smart_184_raw", "smart_223_raw", "smart_198_raw", "smart_10_raw", "smart_189_raw", "smart_222_raw"], +"svm_82.pkl":["smart_184_raw", "smart_2_raw", "smart_187_raw", "smart_225_raw", "smart_198_raw", "smart_197_raw", "smart_4_raw", "smart_13_raw", "smart_188_raw", "smart_251_raw"], +"svm_186.pkl":["smart_3_raw", "smart_11_raw", "smart_198_raw", "smart_250_raw", "smart_13_raw", "smart_200_raw", "smart_224_raw", "smart_187_raw", "smart_22_raw", "smart_4_raw", "smart_220_raw"], +"svm_14.pkl":["smart_12_raw", "smart_226_raw", "smart_187_raw", "smart_196_raw", "smart_5_raw", "smart_183_raw", "smart_255_raw", "smart_250_raw", "smart_201_raw", "smart_8_raw"], +"svm_10.pkl":["smart_251_raw", "smart_4_raw", "smart_223_raw", "smart_13_raw", "smart_255_raw", "smart_188_raw", "smart_197_raw", "smart_201_raw", "smart_250_raw", "smart_15_raw"], +"svm_235.pkl":["smart_15_raw", "smart_255_raw", "smart_252_raw", "smart_197_raw", "smart_250_raw", "smart_254_raw", "smart_13_raw", "smart_251_raw", "smart_198_raw", "smart_189_raw", "smart_191_raw"], +"svm_234.pkl":["smart_187_raw", "smart_183_raw", "smart_3_raw", "smart_4_raw", "smart_222_raw", "smart_184_raw", "smart_5_raw", "smart_198_raw", "smart_200_raw", "smart_8_raw", "smart_10_raw"], +"svm_119.pkl":["smart_254_raw", "smart_8_raw", "smart_183_raw", "smart_184_raw", "smart_195_raw", "smart_252_raw", "smart_191_raw", "smart_10_raw", "smart_200_raw", "smart_197_raw"], +"svm_227.pkl":["smart_254_raw", "smart_189_raw", "smart_225_raw", "smart_224_raw", "smart_197_raw", "smart_223_raw", "smart_4_raw", "smart_183_raw", "smart_11_raw", "smart_184_raw", "smart_13_raw"], +"svm_18.pkl":["smart_197_raw", "smart_3_raw", "smart_220_raw", "smart_193_raw", "smart_10_raw", "smart_187_raw", "smart_188_raw", "smart_225_raw", "smart_194_raw", "smart_13_raw"], +"svm_78.pkl":["smart_10_raw", "smart_183_raw", "smart_191_raw", "smart_13_raw", "smart_198_raw", "smart_22_raw", "smart_195_raw", "smart_12_raw", "smart_224_raw", "smart_200_raw"], +"svm_239.pkl":["smart_3_raw", "smart_254_raw", "smart_199_raw", "smart_225_raw", "smart_187_raw", "smart_195_raw", "smart_197_raw", "smart_2_raw", "smart_193_raw", "smart_220_raw", "smart_183_raw"], +"svm_174.pkl":["smart_183_raw", "smart_196_raw", "smart_225_raw", "smart_189_raw", "smart_4_raw", "smart_3_raw", "smart_9_raw", "smart_198_raw", "smart_15_raw", "smart_5_raw", "smart_194_raw"], +"svm_104.pkl":["smart_12_raw", "smart_198_raw", "smart_197_raw", "smart_4_raw", "smart_240_raw", "smart_187_raw", "smart_225_raw", "smart_8_raw", "smart_3_raw", "smart_2_raw"], +"svm_12.pkl":["smart_222_raw", "smart_251_raw", "smart_194_raw", "smart_9_raw", "smart_184_raw", "smart_191_raw", "smart_187_raw", "smart_255_raw", "smart_4_raw", "smart_11_raw"], +"svm_97.pkl":["smart_15_raw", "smart_197_raw", "smart_190_raw", "smart_199_raw", "smart_200_raw", "smart_12_raw", "smart_191_raw", "smart_254_raw", "smart_194_raw", "smart_201_raw"], +"svm_118.pkl":["smart_11_raw", "smart_225_raw", "smart_196_raw", "smart_197_raw", "smart_198_raw", "smart_200_raw", "smart_3_raw", "smart_10_raw", "smart_191_raw", "smart_22_raw"], +"svm_185.pkl":["smart_191_raw", "smart_254_raw", "smart_3_raw", "smart_190_raw", "smart_15_raw", "smart_22_raw", "smart_2_raw", "smart_198_raw", "smart_13_raw", "smart_226_raw", "smart_225_raw"], +"svm_206.pkl":["smart_183_raw", "smart_192_raw", "smart_197_raw", "smart_255_raw", "smart_187_raw", "smart_254_raw", "smart_198_raw", "smart_13_raw", "smart_226_raw", "smart_240_raw", "smart_8_raw"], +"svm_225.pkl":["smart_224_raw", "smart_11_raw", "smart_5_raw", "smart_4_raw", "smart_225_raw", "smart_197_raw", "smart_15_raw", "smart_183_raw", "smart_193_raw", "smart_190_raw", "smart_187_raw"], +"svm_169.pkl":["smart_252_raw", "smart_183_raw", "smart_254_raw", "smart_11_raw", "smart_193_raw", "smart_22_raw", "smart_226_raw", "smart_189_raw", "smart_225_raw", "smart_198_raw", "smart_200_raw"], +"svm_79.pkl":["smart_184_raw", "smart_196_raw", "smart_4_raw", "smart_226_raw", "smart_199_raw", "smart_187_raw", "smart_193_raw", "smart_188_raw", "smart_12_raw", "smart_250_raw"], +"svm_69.pkl":["smart_187_raw", "smart_9_raw", "smart_200_raw", "smart_11_raw", "smart_252_raw", "smart_189_raw", "smart_4_raw", "smart_188_raw", "smart_255_raw", "smart_201_raw"], +"svm_201.pkl":["smart_224_raw", "smart_8_raw", "smart_250_raw", "smart_2_raw", "smart_198_raw", "smart_15_raw", "smart_193_raw", "smart_223_raw", "smart_3_raw", "smart_11_raw", "smart_191_raw"], +"svm_114.pkl":["smart_226_raw", "smart_188_raw", "smart_2_raw", "smart_11_raw", "smart_4_raw", "smart_193_raw", "smart_184_raw", "smart_194_raw", "smart_198_raw", "smart_13_raw"], +"svm_219.pkl":["smart_12_raw", "smart_22_raw", "smart_8_raw", "smart_191_raw", "smart_197_raw", "smart_254_raw", "smart_15_raw", "smart_193_raw", "smart_199_raw", "smart_225_raw", "smart_192_raw"], +"svm_168.pkl":["smart_255_raw", "smart_191_raw", "smart_193_raw", "smart_220_raw", "smart_5_raw", "smart_3_raw", "smart_222_raw", "smart_223_raw", "smart_197_raw", "smart_196_raw", "smart_22_raw"], +"svm_243.pkl":["smart_11_raw", "smart_255_raw", "smart_10_raw", "smart_189_raw", "smart_225_raw", "smart_240_raw", "smart_222_raw", "smart_197_raw", "smart_183_raw", "smart_198_raw", "smart_12_raw"], +"svm_195.pkl":["smart_183_raw", "smart_5_raw", "smart_11_raw", "smart_197_raw", "smart_15_raw", "smart_9_raw", "smart_4_raw", "smart_220_raw", "smart_12_raw", "smart_192_raw", "smart_240_raw"], +"svm_222.pkl":["smart_10_raw", "smart_13_raw", "smart_188_raw", "smart_15_raw", "smart_192_raw", "smart_224_raw", "smart_225_raw", "smart_187_raw", "smart_222_raw", "smart_220_raw", "smart_252_raw"], +"svm_62.pkl":["smart_196_raw", "smart_251_raw", "smart_187_raw", "smart_224_raw", "smart_11_raw", "smart_12_raw", "smart_8_raw", "smart_199_raw", "smart_220_raw", "smart_195_raw"], +"svm_151.pkl":["smart_187_raw", "smart_223_raw", "smart_200_raw", "smart_189_raw", "smart_251_raw", "smart_255_raw", "smart_222_raw", "smart_192_raw", "smart_12_raw", "smart_183_raw", "smart_22_raw"], +"svm_125.pkl":["smart_9_raw", "smart_252_raw", "smart_197_raw", "smart_251_raw", "smart_11_raw", "smart_12_raw", "smart_188_raw", "smart_240_raw", "smart_10_raw", "smart_223_raw"], +"svm_124.pkl":["smart_193_raw", "smart_187_raw", "smart_183_raw", "smart_11_raw", "smart_10_raw", "smart_8_raw", "smart_194_raw", "smart_189_raw", "smart_222_raw", "smart_191_raw"], +"svm_67.pkl":["smart_2_raw", "smart_8_raw", "smart_225_raw", "smart_240_raw", "smart_13_raw", "smart_5_raw", "smart_187_raw", "smart_198_raw", "smart_199_raw", "smart_3_raw"], +"svm_115.pkl":["smart_222_raw", "smart_193_raw", "smart_223_raw", "smart_195_raw", "smart_252_raw", "smart_189_raw", "smart_199_raw", "smart_187_raw", "smart_15_raw", "smart_184_raw"], +"svm_1.pkl":["smart_201_raw", "smart_8_raw", "smart_200_raw", "smart_252_raw", "smart_251_raw", "smart_187_raw", "smart_9_raw", "smart_188_raw", "smart_15_raw", "smart_184_raw"], +"svm_112.pkl":["smart_220_raw", "smart_197_raw", "smart_10_raw", "smart_188_raw", "smart_12_raw", "smart_4_raw", "smart_196_raw", "smart_3_raw", "smart_240_raw", "smart_225_raw"], +"svm_138.pkl":["smart_183_raw", "smart_10_raw", "smart_191_raw", "smart_195_raw", "smart_223_raw", "smart_189_raw", "smart_187_raw", "smart_255_raw", "smart_226_raw", "smart_8_raw"], +"svm_229.pkl":["smart_224_raw", "smart_8_raw", "smart_192_raw", "smart_220_raw", "smart_195_raw", "smart_183_raw", "smart_250_raw", "smart_187_raw", "smart_225_raw", "smart_4_raw", "smart_252_raw"], +"svm_145.pkl":["smart_190_raw", "smart_8_raw", "smart_226_raw", "smart_184_raw", "smart_225_raw", "smart_220_raw", "smart_193_raw", "smart_183_raw", "smart_201_raw", "smart_187_raw", "smart_2_raw"], +"svm_59.pkl":["smart_188_raw", "smart_11_raw", "smart_184_raw", "smart_2_raw", "smart_220_raw", "smart_198_raw", "smart_225_raw", "smart_240_raw", "smart_197_raw", "smart_251_raw"], +"svm_204.pkl":["smart_15_raw", "smart_240_raw", "smart_225_raw", "smart_223_raw", "smart_252_raw", "smart_22_raw", "smart_200_raw", "smart_13_raw", "smart_220_raw", "smart_198_raw", "smart_191_raw"], +"svm_88.pkl":["smart_198_raw", "smart_3_raw", "smart_8_raw", "smart_225_raw", "smart_251_raw", "smart_222_raw", "smart_188_raw", "smart_10_raw", "smart_240_raw", "smart_189_raw"], +"svm_182.pkl":["smart_10_raw", "smart_190_raw", "smart_250_raw", "smart_15_raw", "smart_193_raw", "smart_22_raw", "smart_200_raw", "smart_8_raw", "smart_4_raw", "smart_187_raw", "smart_9_raw"], +"svm_61.pkl":["smart_5_raw", "smart_12_raw", "smart_9_raw", "smart_198_raw", "smart_195_raw", "smart_252_raw", "smart_15_raw", "smart_240_raw", "smart_255_raw", "smart_224_raw"], +"svm_50.pkl":["smart_220_raw", "smart_5_raw", "smart_194_raw", "smart_250_raw", "smart_15_raw", "smart_240_raw", "smart_8_raw", "smart_198_raw", "smart_224_raw", "smart_191_raw"], +"svm_210.pkl":["smart_8_raw", "smart_15_raw", "smart_195_raw", "smart_224_raw", "smart_5_raw", "smart_191_raw", "smart_198_raw", "smart_225_raw", "smart_200_raw", "smart_251_raw", "smart_240_raw"], +"svm_16.pkl":["smart_222_raw", "smart_10_raw", "smart_250_raw", "smart_189_raw", "smart_191_raw", "smart_2_raw", "smart_5_raw", "smart_193_raw", "smart_9_raw", "smart_187_raw"], +"svm_85.pkl":["smart_252_raw", "smart_184_raw", "smart_9_raw", "smart_5_raw", "smart_254_raw", "smart_3_raw", "smart_195_raw", "smart_10_raw", "smart_12_raw", "smart_222_raw"], +"svm_36.pkl":["smart_201_raw", "smart_251_raw", "smart_184_raw", "smart_3_raw", "smart_5_raw", "smart_183_raw", "smart_194_raw", "smart_195_raw", "smart_224_raw", "smart_2_raw"], +"svm_33.pkl":["smart_223_raw", "smart_254_raw", "smart_225_raw", "smart_9_raw", "smart_199_raw", "smart_5_raw", "smart_189_raw", "smart_194_raw", "smart_240_raw", "smart_4_raw"], +"svm_3.pkl":["smart_225_raw", "smart_194_raw", "smart_3_raw", "smart_189_raw", "smart_9_raw", "smart_254_raw", "smart_240_raw", "smart_5_raw", "smart_255_raw", "smart_223_raw"], +"svm_93.pkl":["smart_8_raw", "smart_188_raw", "smart_5_raw", "smart_10_raw", "smart_222_raw", "smart_2_raw", "smart_254_raw", "smart_12_raw", "smart_193_raw", "smart_224_raw"], +"svm_120.pkl":["smart_189_raw", "smart_224_raw", "smart_222_raw", "smart_193_raw", "smart_5_raw", "smart_201_raw", "smart_8_raw", "smart_254_raw", "smart_194_raw", "smart_22_raw"], +"svm_128.pkl":["smart_195_raw", "smart_184_raw", "smart_251_raw", "smart_8_raw", "smart_5_raw", "smart_196_raw", "smart_10_raw", "smart_4_raw", "smart_225_raw", "smart_191_raw"], +"svm_212.pkl":["smart_225_raw", "smart_192_raw", "smart_10_raw", "smart_12_raw", "smart_222_raw", "smart_184_raw", "smart_13_raw", "smart_226_raw", "smart_5_raw", "smart_201_raw", "smart_22_raw"], +"svm_221.pkl":["smart_255_raw", "smart_2_raw", "smart_224_raw", "smart_192_raw", "smart_252_raw", "smart_13_raw", "smart_183_raw", "smart_193_raw", "smart_15_raw", "smart_199_raw", "smart_200_raw"], +"svm_223.pkl":["smart_4_raw", "smart_194_raw", "smart_9_raw", "smart_255_raw", "smart_188_raw", "smart_201_raw", "smart_3_raw", "smart_226_raw", "smart_192_raw", "smart_251_raw", "smart_191_raw"], +"svm_44.pkl":["smart_255_raw", "smart_11_raw", "smart_200_raw", "smart_3_raw", "smart_195_raw", "smart_201_raw", "smart_4_raw", "smart_5_raw", "smart_10_raw", "smart_191_raw"], +"svm_213.pkl":["smart_22_raw", "smart_191_raw", "smart_183_raw", "smart_4_raw", "smart_194_raw", "smart_255_raw", "smart_254_raw", "smart_193_raw", "smart_11_raw", "smart_10_raw", "smart_220_raw"], +"svm_131.pkl":["smart_22_raw", "smart_194_raw", "smart_184_raw", "smart_250_raw", "smart_10_raw", "smart_189_raw", "smart_183_raw", "smart_240_raw", "smart_12_raw", "smart_252_raw"], +"svm_6.pkl":["smart_194_raw", "smart_250_raw", "smart_223_raw", "smart_224_raw", "smart_184_raw", "smart_191_raw", "smart_201_raw", "smart_9_raw", "smart_252_raw", "smart_3_raw"], +"svm_161.pkl":["smart_255_raw", "smart_222_raw", "smart_226_raw", "smart_254_raw", "smart_183_raw", "smart_22_raw", "smart_12_raw", "smart_190_raw", "smart_11_raw", "smart_192_raw", "smart_251_raw"], +"svm_72.pkl":["smart_13_raw", "smart_184_raw", "smart_223_raw", "smart_240_raw", "smart_250_raw", "smart_251_raw", "smart_201_raw", "smart_196_raw", "smart_5_raw", "smart_4_raw"], +"svm_27.pkl":["smart_189_raw", "smart_188_raw", "smart_255_raw", "smart_251_raw", "smart_240_raw", "smart_15_raw", "smart_9_raw", "smart_191_raw", "smart_226_raw", "smart_10_raw"], +"svm_141.pkl":["smart_9_raw", "smart_191_raw", "smart_2_raw", "smart_226_raw", "smart_13_raw", "smart_22_raw", "smart_193_raw", "smart_222_raw", "smart_220_raw", "smart_225_raw", "smart_3_raw"], +"svm_57.pkl":["smart_12_raw", "smart_252_raw", "smart_190_raw", "smart_226_raw", "smart_10_raw", "smart_189_raw", "smart_193_raw", "smart_2_raw", "smart_9_raw", "smart_223_raw"], +"svm_236.pkl":["smart_200_raw", "smart_189_raw", "smart_226_raw", "smart_252_raw", "smart_250_raw", "smart_193_raw", "smart_13_raw", "smart_2_raw", "smart_254_raw", "smart_22_raw", "smart_9_raww"], +"svm_208.pkl":["smart_223_raw", "smart_15_raw", "smart_251_raw", "smart_5_raw", "smart_198_raw", "smart_252_raw", "smart_4_raw", "smart_8_raw", "smart_220_raw", "smart_254_raw", "smart_193_raw"], +"svm_230.pkl":["smart_184_raw", "smart_5_raw", "smart_191_raw", "smart_198_raw", "smart_11_raw", "smart_255_raw", "smart_189_raw", "smart_254_raw", "smart_196_raw", "smart_199_raw", "smart_223_raw"], +"svm_134.pkl":["smart_8_raw", "smart_194_raw", "smart_4_raw", "smart_189_raw", "smart_223_raw", "smart_5_raw", "smart_187_raw", "smart_9_raw", "smart_192_raw", "smart_220_raw"], +"svm_71.pkl":["smart_220_raw", "smart_13_raw", "smart_194_raw", "smart_197_raw", "smart_192_raw", "smart_22_raw", "smart_184_raw", "smart_199_raw", "smart_222_raw", "smart_183_raw"], +"svm_109.pkl":["smart_224_raw", "smart_252_raw", "smart_2_raw", "smart_200_raw", "smart_5_raw", "smart_194_raw", "smart_222_raw", "smart_198_raw", "smart_4_raw", "smart_13_raw"] +} diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_1.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_1.pkl new file mode 100644 index 000000000..5eb30f300 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_1.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_10.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_10.pkl new file mode 100644 index 000000000..9259c1e74 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_10.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_104.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_104.pkl new file mode 100644 index 000000000..d5d5cf5b7 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_104.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_105.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_105.pkl new file mode 100644 index 000000000..4aadc3cfb Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_105.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_109.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_109.pkl new file mode 100644 index 000000000..c99c353be Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_109.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_112.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_112.pkl new file mode 100644 index 000000000..367a3304a Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_112.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_114.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_114.pkl new file mode 100644 index 000000000..946d5cef1 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_114.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_115.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_115.pkl new file mode 100644 index 000000000..ff834929e Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_115.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_118.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_118.pkl new file mode 100644 index 000000000..eec8689ea Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_118.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_119.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_119.pkl new file mode 100644 index 000000000..6a26c0502 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_119.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_12.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_12.pkl new file mode 100644 index 000000000..5cbe9775a Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_12.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_120.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_120.pkl new file mode 100644 index 000000000..d2041c267 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_120.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_123.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_123.pkl new file mode 100644 index 000000000..0ab6187e9 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_123.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_124.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_124.pkl new file mode 100644 index 000000000..8f9ea4ec7 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_124.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_125.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_125.pkl new file mode 100644 index 000000000..4d49900f9 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_125.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_128.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_128.pkl new file mode 100644 index 000000000..6a18726de Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_128.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_131.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_131.pkl new file mode 100644 index 000000000..e6a55dcae Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_131.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_134.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_134.pkl new file mode 100644 index 000000000..51171e00c Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_134.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_138.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_138.pkl new file mode 100644 index 000000000..bc98e0c72 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_138.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_14.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_14.pkl new file mode 100644 index 000000000..c4547dc63 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_14.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_141.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_141.pkl new file mode 100644 index 000000000..86d9f38de Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_141.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_145.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_145.pkl new file mode 100644 index 000000000..24ff96231 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_145.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_151.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_151.pkl new file mode 100644 index 000000000..92bfd3f1b Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_151.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_16.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_16.pkl new file mode 100644 index 000000000..11664b3dd Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_16.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_161.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_161.pkl new file mode 100644 index 000000000..2d421685e Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_161.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_168.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_168.pkl new file mode 100644 index 000000000..12a811cfa Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_168.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_169.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_169.pkl new file mode 100644 index 000000000..0c51446c6 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_169.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_174.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_174.pkl new file mode 100644 index 000000000..d2945ce9f Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_174.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_18.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_18.pkl new file mode 100644 index 000000000..d05520ccd Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_18.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_182.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_182.pkl new file mode 100644 index 000000000..7fcfb3cbd Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_182.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_185.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_185.pkl new file mode 100644 index 000000000..785301c17 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_185.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_186.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_186.pkl new file mode 100644 index 000000000..4ea83da77 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_186.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_195.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_195.pkl new file mode 100644 index 000000000..12273f7ce Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_195.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_201.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_201.pkl new file mode 100644 index 000000000..c866cf00e Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_201.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_204.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_204.pkl new file mode 100644 index 000000000..8cf1c3aa2 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_204.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_206.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_206.pkl new file mode 100644 index 000000000..cba64e800 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_206.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_208.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_208.pkl new file mode 100644 index 000000000..ba0df0abd Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_208.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_210.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_210.pkl new file mode 100644 index 000000000..6b5bee219 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_210.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_212.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_212.pkl new file mode 100644 index 000000000..11eafc64c Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_212.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_213.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_213.pkl new file mode 100644 index 000000000..0b8475c58 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_213.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_219.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_219.pkl new file mode 100644 index 000000000..4a248c14c Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_219.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_221.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_221.pkl new file mode 100644 index 000000000..e37c6b4fb Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_221.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_222.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_222.pkl new file mode 100644 index 000000000..e54303863 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_222.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_223.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_223.pkl new file mode 100644 index 000000000..8b208f4e8 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_223.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_225.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_225.pkl new file mode 100644 index 000000000..3f2b62984 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_225.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_227.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_227.pkl new file mode 100644 index 000000000..5e4fb56f4 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_227.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_229.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_229.pkl new file mode 100644 index 000000000..1e9c33599 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_229.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_230.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_230.pkl new file mode 100644 index 000000000..36f8205ce Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_230.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_234.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_234.pkl new file mode 100644 index 000000000..199f9ba51 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_234.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_235.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_235.pkl new file mode 100644 index 000000000..d986526ec Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_235.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_236.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_236.pkl new file mode 100644 index 000000000..160e22fae Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_236.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_239.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_239.pkl new file mode 100644 index 000000000..8d98572ac Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_239.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_243.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_243.pkl new file mode 100644 index 000000000..4fca95e1d Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_243.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_27.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_27.pkl new file mode 100644 index 000000000..011974ed1 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_27.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_3.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_3.pkl new file mode 100644 index 000000000..e5e97a888 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_3.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_33.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_33.pkl new file mode 100644 index 000000000..e709d7b46 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_33.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_36.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_36.pkl new file mode 100644 index 000000000..3d87b8bd9 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_36.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_44.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_44.pkl new file mode 100644 index 000000000..9abcece92 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_44.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_50.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_50.pkl new file mode 100644 index 000000000..b7ce5eda9 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_50.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_57.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_57.pkl new file mode 100644 index 000000000..fe7832894 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_57.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_59.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_59.pkl new file mode 100644 index 000000000..76217777b Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_59.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_6.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_6.pkl new file mode 100644 index 000000000..4fb09d374 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_6.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_61.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_61.pkl new file mode 100644 index 000000000..319fc5f45 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_61.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_62.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_62.pkl new file mode 100644 index 000000000..25b21aed6 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_62.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_67.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_67.pkl new file mode 100644 index 000000000..1e6e7383a Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_67.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_69.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_69.pkl new file mode 100644 index 000000000..22d349a7c Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_69.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_71.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_71.pkl new file mode 100644 index 000000000..e0760add9 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_71.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_72.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_72.pkl new file mode 100644 index 000000000..5096aa8e4 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_72.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_78.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_78.pkl new file mode 100644 index 000000000..7958f3b6c Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_78.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_79.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_79.pkl new file mode 100644 index 000000000..2ed3a0fe9 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_79.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_82.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_82.pkl new file mode 100644 index 000000000..2e1884094 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_82.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_85.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_85.pkl new file mode 100644 index 000000000..88161af56 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_85.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_88.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_88.pkl new file mode 100644 index 000000000..715633982 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_88.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_93.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_93.pkl new file mode 100644 index 000000000..703429fe3 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_93.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_97.pkl b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_97.pkl new file mode 100644 index 000000000..9653d20f3 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/prophetstor/svm_97.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/redhat/config.json b/src/pybind/mgr/diskprediction_local/models/redhat/config.json new file mode 100644 index 000000000..62a0d8282 --- /dev/null +++ b/src/pybind/mgr/diskprediction_local/models/redhat/config.json @@ -0,0 +1,4 @@ +{ +"seagate": ["user_capacity", "smart_1_raw", "smart_5_raw", "smart_7_raw", "smart_10_raw", "smart_187_raw", "smart_188_raw", "smart_190_raw", "smart_193_raw", "smart_197_raw", "smart_198_raw", "smart_241_raw", "smart_1_normalized", "smart_5_normalized", "smart_7_normalized", "smart_10_normalized", "smart_187_normalized", "smart_188_normalized", "smart_190_normalized", "smart_193_normalized", "smart_197_normalized", "smart_198_normalized", "smart_241_normalized"], +"hgst": ["user_capacity", "smart_1_normalized", "smart_1_raw", "smart_2_normalized", "smart_2_raw", "smart_3_normalized", "smart_3_raw", "smart_4_raw", "smart_5_normalized", "smart_5_raw", "smart_7_normalized", "smart_7_raw", "smart_8_normalized", "smart_8_raw", "smart_9_normalized", "smart_9_raw", "smart_10_normalized", "smart_10_raw", "smart_12_raw", "smart_192_normalized", "smart_192_raw", "smart_193_normalized", "smart_193_raw", "smart_194_normalized", "smart_194_raw", "smart_196_normalized", "smart_196_raw", "smart_197_normalized", "smart_197_raw", "smart_198_raw", "smart_199_raw"] +} diff --git a/src/pybind/mgr/diskprediction_local/models/redhat/hgst_predictor.pkl b/src/pybind/mgr/diskprediction_local/models/redhat/hgst_predictor.pkl new file mode 100644 index 000000000..9894d9f55 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/redhat/hgst_predictor.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/redhat/hgst_scaler.pkl b/src/pybind/mgr/diskprediction_local/models/redhat/hgst_scaler.pkl new file mode 100644 index 000000000..6f77b85cc Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/redhat/hgst_scaler.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/redhat/seagate_predictor.pkl b/src/pybind/mgr/diskprediction_local/models/redhat/seagate_predictor.pkl new file mode 100644 index 000000000..280d59a08 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/redhat/seagate_predictor.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/models/redhat/seagate_scaler.pkl b/src/pybind/mgr/diskprediction_local/models/redhat/seagate_scaler.pkl new file mode 100644 index 000000000..691bb03c5 Binary files /dev/null and b/src/pybind/mgr/diskprediction_local/models/redhat/seagate_scaler.pkl differ diff --git a/src/pybind/mgr/diskprediction_local/module.py b/src/pybind/mgr/diskprediction_local/module.py new file mode 100644 index 000000000..948c59bd7 --- /dev/null +++ b/src/pybind/mgr/diskprediction_local/module.py @@ -0,0 +1,319 @@ +""" +diskprediction with local predictor +""" +import json +import datetime +import _strptime +from threading import Event +import time + +from mgr_module import MgrModule, CommandResult + +# Importing scipy early appears to avoid a future deadlock when +# we try to do +# +# from .predictor import get_diskfailurepredictor_path +# +# in a command thread. See https://tracker.ceph.com/issues/42764 +import scipy + + +TIME_FORMAT = '%Y%m%d-%H%M%S' +TIME_DAYS = 24*60*60 +TIME_WEEK = TIME_DAYS * 7 + + +class Module(MgrModule): + MODULE_OPTIONS = [ + { + 'name': 'sleep_interval', + 'default': str(600), + }, + { + 'name': 'predict_interval', + 'default': str(86400), + }, + { + 'name': 'predictor_model', + 'default': 'prophetstor', + }, + ] + + COMMANDS = [] + + def __init__(self, *args, **kwargs): + super(Module, self).__init__(*args, **kwargs) + # options + for opt in self.MODULE_OPTIONS: + setattr(self, opt['name'], opt['default']) + # other + self._run = True + self._event = Event() + + def config_notify(self): + for opt in self.MODULE_OPTIONS: + setattr(self, + opt['name'], + self.get_module_option(opt['name'])) + self.log.debug(' %s = %s', opt['name'], getattr(self, opt['name'])) + if self.get_ceph_option('device_failure_prediction_mode') == 'local': + self._event.set() + + def refresh_config(self): + for opt in self.MODULE_OPTIONS: + setattr(self, + opt['name'], + self.get_module_option(opt['name'])) + self.log.debug(' %s = %s', opt['name'], getattr(self, opt['name'])) + + def handle_command(self, _, cmd): + self.log.debug('handle_command cmd: %s', cmd) + raise NotImplementedError(cmd['prefix']) + + def self_test(self): + self.log.debug('self_test enter') + ret, out, err = self.predict_all_devices() + assert ret == 0 + return 0, 'self test succeed', '' + + def serve(self): + self.log.info('Starting diskprediction local module') + self.config_notify() + last_predicted = None + ls = self.get_store('last_predicted') + if ls: + try: + last_predicted = datetime.datetime.strptime(ls, TIME_FORMAT) + except ValueError: + pass + self.log.debug('Last predicted %s', last_predicted) + + while self._run: + self.refresh_config() + mode = self.get_ceph_option('device_failure_prediction_mode') + if mode == 'local': + now = datetime.datetime.utcnow() + if not last_predicted: + next_predicted = now + else: + predicted_frequency = int(self.predict_interval) or 86400 + seconds = (last_predicted - datetime.datetime.utcfromtimestamp(0)).total_seconds() + seconds -= seconds % predicted_frequency + seconds += predicted_frequency + next_predicted = datetime.datetime.utcfromtimestamp(seconds) + if last_predicted: + self.log.debug('Last scrape %s, next scrape due %s', + last_predicted.strftime(TIME_FORMAT), + next_predicted.strftime(TIME_FORMAT)) + else: + self.log.debug('Last scrape never, next scrape due %s', + next_predicted.strftime(TIME_FORMAT)) + if now >= next_predicted: + self.predict_all_devices() + last_predicted = now + self.set_store('last_predicted', last_predicted.strftime(TIME_FORMAT)) + + sleep_interval = int(self.sleep_interval) or 60 + self.log.debug('Sleeping for %d seconds', sleep_interval) + self._event.wait(sleep_interval) + self._event.clear() + + def shutdown(self): + self.log.info('Stopping') + self._run = False + self._event.set() + + @staticmethod + def _convert_timestamp(predicted_timestamp, life_expectancy_day): + """ + :param predicted_timestamp: unit is nanoseconds + :param life_expectancy_day: unit is seconds + :return: + date format '%Y-%m-%d' ex. 2018-01-01 + """ + return datetime.datetime.fromtimestamp( + predicted_timestamp / (1000 ** 3) + life_expectancy_day).strftime('%Y-%m-%d') + + def _predict_life_expentancy(self, devid): + predicted_result = '' + health_data = {} + predict_datas = [] + try: + r, outb, outs = self.remote('devicehealth', 'show_device_metrics', devid=devid, sample='') + if r != 0: + self.log.error('failed to get device %s health', devid) + health_data = {} + else: + health_data = json.loads(outb) + except Exception as e: + self.log.error('failed to get device %s health data due to %s', devid, str(e)) + + # initialize appropriate disk failure predictor model + from .predictor import get_diskfailurepredictor_path + if self.predictor_model == 'prophetstor': + from .predictor import PSDiskFailurePredictor + obj_predictor = PSDiskFailurePredictor() + ret = obj_predictor.initialize("{}/models/{}".format(get_diskfailurepredictor_path(), self.predictor_model)) + if ret is not None: + self.log.error('Error initializing predictor') + return predicted_result + elif self.predictor_model == 'redhat': + from .predictor import RHDiskFailurePredictor + obj_predictor = RHDiskFailurePredictor() + ret = obj_predictor.initialize("{}/models/{}".format(get_diskfailurepredictor_path(), self.predictor_model)) + if ret is not None: + self.log.error('Error initializing predictor') + return predicted_result + else: + self.log.error('invalid value received for MODULE_OPTIONS.predictor_model') + return predicted_result + + if len(health_data) >= 6: + o_keys = sorted(health_data.keys(), reverse=True) + for o_key in o_keys: + # get values for current day (?) + dev_smart = {} + s_val = health_data[o_key] + + # add all smart attributes + ata_smart = s_val.get('ata_smart_attributes', {}) + for attr in ata_smart.get('table', []): + # get raw smart values + if attr.get('raw', {}).get('string') is not None: + if str(attr.get('raw', {}).get('string', '0')).isdigit(): + dev_smart['smart_%s_raw' % attr.get('id')] = \ + int(attr.get('raw', {}).get('string', '0')) + else: + if str(attr.get('raw', {}).get('string', '0')).split(' ')[0].isdigit(): + dev_smart['smart_%s_raw' % attr.get('id')] = \ + int(attr.get('raw', {}).get('string', + '0').split(' ')[0]) + else: + dev_smart['smart_%s_raw' % attr.get('id')] = \ + attr.get('raw', {}).get('value', 0) + # get normalized smart values + if attr.get('value') is not None: + dev_smart['smart_%s_normalized' % attr.get('id')] = \ + attr.get('value') + # add power on hours manually if not available in smart attributes + if s_val.get('power_on_time', {}).get('hours') is not None: + dev_smart['smart_9_raw'] = int(s_val['power_on_time']['hours']) + # add device capacity + if s_val.get('user_capacity') is not None: + if s_val.get('user_capacity').get('bytes') is not None: + dev_smart['user_capacity'] = s_val.get('user_capacity').get('bytes') + else: + self.log.debug('user_capacity not found in smart attributes list') + # add device model + if s_val.get('model_name') is not None: + dev_smart['model_name'] = s_val.get('model_name') + # add vendor + if s_val.get('vendor') is not None: + dev_smart['vendor'] = s_val.get('vendor') + # if smart data was found, then add that to list + if dev_smart: + predict_datas.append(dev_smart) + if len(predict_datas) >= 12: + break + else: + self.log.error('unable to predict device due to health data records less than 6 days') + + if len(predict_datas) >= 6: + predicted_result = obj_predictor.predict(predict_datas) + return predicted_result + + def predict_life_expectancy(self, devid): + result = self._predict_life_expentancy(devid) + if result.lower() == 'good': + return 0, '>6w', '' + elif result.lower() == 'warning': + return 0, '>=2w and <=6w', '' + elif result.lower() == 'bad': + return 0, '<2w', '' + else: + return 0, 'unknown', '' + + def _reset_device_life_expectancy(self, device_id): + result = CommandResult('') + self.send_command(result, 'mon', '', json.dumps({ + 'prefix': 'device rm-life-expectancy', + 'devid': device_id + }), '') + ret, _, outs = result.wait() + if ret != 0: + self.log.error( + 'failed to reset device life expectancy, %s' % outs) + return ret + + def _set_device_life_expectancy(self, device_id, from_date, to_date=None): + result = CommandResult('') + + if to_date is None: + self.send_command(result, 'mon', '', json.dumps({ + 'prefix': 'device set-life-expectancy', + 'devid': device_id, + 'from': from_date + }), '') + else: + self.send_command(result, 'mon', '', json.dumps({ + 'prefix': 'device set-life-expectancy', + 'devid': device_id, + 'from': from_date, + 'to': to_date + }), '') + ret, _, outs = result.wait() + if ret != 0: + self.log.error( + 'failed to set device life expectancy, %s' % outs) + return ret + + def predict_all_devices(self): + self.log.debug('predict_all_devices') + devices = self.get('devices').get('devices', []) + for devInfo in devices: + if not devInfo.get('daemons'): + continue + if not devInfo.get('devid'): + continue + self.log.debug('%s' % devInfo) + result = self._predict_life_expentancy(devInfo['devid']) + if result == 'unknown': + self._reset_device_life_expectancy(devInfo['devid']) + continue + predicted = int(time.time() * (1000 ** 3)) + + if result.lower() == 'good': + life_expectancy_day_min = (TIME_WEEK * 6) + TIME_DAYS + life_expectancy_day_max = None + elif result.lower() == 'warning': + life_expectancy_day_min = (TIME_WEEK * 2) + life_expectancy_day_max = (TIME_WEEK * 6) + elif result.lower() == 'bad': + life_expectancy_day_min = 0 + life_expectancy_day_max = (TIME_WEEK * 2) - TIME_DAYS + else: + predicted = None + life_expectancy_day_min = None + life_expectancy_day_max = None + + if predicted and devInfo['devid'] and life_expectancy_day_min: + from_date = None + to_date = None + try: + if life_expectancy_day_min: + from_date = self._convert_timestamp(predicted, life_expectancy_day_min) + + if life_expectancy_day_max: + to_date = self._convert_timestamp(predicted, life_expectancy_day_max) + + self._set_device_life_expectancy(devInfo['devid'], from_date, to_date) + self._logger.info( + 'succeed to set device {} life expectancy from: {}, to: {}'.format( + devInfo['devid'], from_date, to_date)) + except Exception as e: + self._logger.error( + 'failed to set device {} life expectancy from: {}, to: {}, {}'.format( + devInfo['devid'], from_date, to_date, str(e))) + else: + self._reset_device_life_expectancy(devInfo['devid']) + return 0, 'succeed to predicted all devices', '' diff --git a/src/pybind/mgr/diskprediction_local/predictor.py b/src/pybind/mgr/diskprediction_local/predictor.py new file mode 100644 index 000000000..548454145 --- /dev/null +++ b/src/pybind/mgr/diskprediction_local/predictor.py @@ -0,0 +1,466 @@ +"""Machine learning model for disk failure prediction. + +This classes defined here provide the disk failure prediction module. +RHDiskFailurePredictor uses the models developed at the AICoE in the +Office of the CTO at Red Hat. These models were built using the open +source Backblaze SMART metrics dataset. +PSDiskFailurePredictor uses the models developed by ProphetStor as an +example. + +An instance of the predictor is initialized by providing the path to trained +models. Then, to predict hard drive health and deduce time to failure, the +predict function is called with 6 days worth of SMART data from the hard drive. +It will return a string to indicate disk failure status: "Good", "Warning", +"Bad", or "Unknown". + +An example code is as follows: + +>>> model = disk_failure_predictor.RHDiskFailurePredictor() +>>> status = model.initialize("./models") +>>> if status: +>>> model.predict(disk_days) +'Bad' +""" +import os +import json +import pickle +import logging + +import numpy as np +from scipy import stats + + +def get_diskfailurepredictor_path(): + path = os.path.abspath(__file__) + dir_path = os.path.dirname(path) + return dir_path + + +class RHDiskFailurePredictor(object): + """Disk failure prediction module developed at Red Hat + + This class implements a disk failure prediction module. + """ + + # json with manufacturer names as keys + # and features used for prediction as values + CONFIG_FILE = "config.json" + PREDICTION_CLASSES = {-1: "Unknown", 0: "Good", 1: "Warning", 2: "Bad"} + + # model name prefixes to identify vendor + MANUFACTURER_MODELNAME_PREFIXES = { + "WDC": "WDC", + "Toshiba": "Toshiba", # for cases like "Toshiba xxx" + "TOSHIBA": "Toshiba", # for cases like "TOSHIBA xxx" + "toshiba": "Toshiba", # for cases like "toshiba xxx" + "S": "Seagate", # for cases like "STxxxx" and "Seagate BarraCuda ZAxxx" + "ZA": "Seagate", # for cases like "ZAxxxx" + "Hitachi": "Hitachi", + "HGST": "HGST", + } + + LOGGER = logging.getLogger() + + def __init__(self): + """ + This function may throw exception due to wrong file operation. + """ + self.model_dirpath = "" + self.model_context = {} + + def initialize(self, model_dirpath): + """Initialize all models. Save paths of all trained model files to list + + Arguments: + model_dirpath {str} -- path to directory of trained models + + Returns: + str -- Error message. If all goes well, return None + """ + # read config file as json, if it exists + config_path = os.path.join(model_dirpath, self.CONFIG_FILE) + if not os.path.isfile(config_path): + return "Missing config file: " + config_path + else: + with open(config_path) as f_conf: + self.model_context = json.load(f_conf) + + # ensure all manufacturers whose context is defined in config file + # have models and scalers saved inside model_dirpath + for manufacturer in self.model_context: + scaler_path = os.path.join(model_dirpath, manufacturer + "_scaler.pkl") + if not os.path.isfile(scaler_path): + return "Missing scaler file: {}".format(scaler_path) + model_path = os.path.join(model_dirpath, manufacturer + "_predictor.pkl") + if not os.path.isfile(model_path): + return "Missing model file: {}".format(model_path) + + self.model_dirpath = model_dirpath + + def __preprocess(self, disk_days, manufacturer): + """Scales and transforms input dataframe to feed it to prediction model + + Arguments: + disk_days {list} -- list in which each element is a dictionary with key,val + as feature name,value respectively. + e.g.[{'smart_1_raw': 0, 'user_capacity': 512 ...}, ...] + manufacturer {str} -- manufacturer of the hard drive + + Returns: + numpy.ndarray -- (n, d) shaped array of n days worth of data and d + features, scaled + """ + # get the attributes that were used to train model for current manufacturer + try: + model_smart_attr = self.model_context[manufacturer] + except KeyError as e: + RHDiskFailurePredictor.LOGGER.debug( + "No context (SMART attributes on which model has been trained) found for manufacturer: {}".format( + manufacturer + ) + ) + return None + + # convert to structured array, keeping only the required features + # assumes all data is in float64 dtype + try: + struc_dtypes = [(attr, np.float64) for attr in model_smart_attr] + values = [tuple(day[attr] for attr in model_smart_attr) for day in disk_days] + disk_days_sa = np.array(values, dtype=struc_dtypes) + except KeyError as e: + RHDiskFailurePredictor.LOGGER.debug( + "Mismatch in SMART attributes used to train model and SMART attributes available" + ) + return None + + # view structured array as 2d array for applying rolling window transforms + # do not include capacity_bytes in this. only use smart_attrs + disk_days_attrs = disk_days_sa[[attr for attr in model_smart_attr if 'smart_' in attr]]\ + .view(np.float64).reshape(disk_days_sa.shape + (-1,)) + + # featurize n (6 to 12) days data - mean,std,coefficient of variation + # current model is trained on 6 days of data because that is what will be + # available at runtime + + # rolling time window interval size in days + roll_window_size = 6 + + # rolling means generator + gen = (disk_days_attrs[i: i + roll_window_size, ...].mean(axis=0) \ + for i in range(0, disk_days_attrs.shape[0] - roll_window_size + 1)) + means = np.vstack(gen) + + # rolling stds generator + gen = (disk_days_attrs[i: i + roll_window_size, ...].std(axis=0, ddof=1) \ + for i in range(0, disk_days_attrs.shape[0] - roll_window_size + 1)) + stds = np.vstack(gen) + + # coefficient of variation + cvs = stds / means + cvs[np.isnan(cvs)] = 0 + featurized = np.hstack(( + means, + stds, + cvs, + disk_days_sa['user_capacity'][: disk_days_attrs.shape[0] - roll_window_size + 1].reshape(-1, 1) + )) + + # scale features + scaler_path = os.path.join(self.model_dirpath, manufacturer + "_scaler.pkl") + with open(scaler_path, 'rb') as f: + scaler = pickle.load(f) + featurized = scaler.transform(featurized) + return featurized + + @staticmethod + def __get_manufacturer(model_name): + """Returns the manufacturer name for a given hard drive model name + + Arguments: + model_name {str} -- hard drive model name + + Returns: + str -- manufacturer name + """ + for prefix, manufacturer in RHDiskFailurePredictor.MANUFACTURER_MODELNAME_PREFIXES.items(): + if model_name.startswith(prefix): + return manufacturer + # print error message + RHDiskFailurePredictor.LOGGER.debug( + "Could not infer manufacturer from model name {}".format(model_name) + ) + + def predict(self, disk_days): + # get manufacturer preferably as a smartctl attribute + # if not available then infer using model name + manufacturer = disk_days[0].get("vendor") + if manufacturer is None: + RHDiskFailurePredictor.LOGGER.debug( + '"vendor" field not found in smartctl output. Will try to infer manufacturer from model name.' + ) + manufacturer = RHDiskFailurePredictor.__get_manufacturer( + disk_days[0].get("model_name", "") + ).lower() + + # print error message, return Unknown, and continue execution + if manufacturer is None: + RHDiskFailurePredictor.LOGGER.debug( + "Manufacturer could not be determiend. This may be because \ + DiskPredictor has never encountered this manufacturer before, \ + or the model name is not according to the manufacturer's \ + naming conventions known to DiskPredictor" + ) + return RHDiskFailurePredictor.PREDICTION_CLASSES[-1] + + # preprocess for feeding to model + preprocessed_data = self.__preprocess(disk_days, manufacturer) + if preprocessed_data is None: + return RHDiskFailurePredictor.PREDICTION_CLASSES[-1] + + # get model for current manufacturer + model_path = os.path.join( + self.model_dirpath, manufacturer + "_predictor.pkl" + ) + with open(model_path, 'rb') as f: + model = pickle.load(f) + + # use prediction for most recent day + # TODO: ensure that most recent day is last element and most previous day + # is first element in input disk_days + pred_class_id = model.predict(preprocessed_data)[-1] + return RHDiskFailurePredictor.PREDICTION_CLASSES[pred_class_id] + + +class PSDiskFailurePredictor(object): + """Disk failure prediction developed at ProphetStor + + This class implements a disk failure prediction module. + """ + + CONFIG_FILE = "config.json" + EXCLUDED_ATTRS = ["smart_9_raw", "smart_241_raw", "smart_242_raw"] + + def __init__(self): + """ + This function may throw exception due to wrong file operation. + """ + + self.model_dirpath = "" + self.model_context = {} + + def initialize(self, model_dirpath): + """ + Initialize all models. + + Args: None + + Returns: + Error message. If all goes well, return an empty string. + + Raises: + """ + + config_path = os.path.join(model_dirpath, self.CONFIG_FILE) + if not os.path.isfile(config_path): + return "Missing config file: " + config_path + else: + with open(config_path) as f_conf: + self.model_context = json.load(f_conf) + + for model_name in self.model_context: + model_path = os.path.join(model_dirpath, model_name) + + if not os.path.isfile(model_path): + return "Missing model file: " + model_path + + self.model_dirpath = model_dirpath + + def __preprocess(self, disk_days): + """ + Preprocess disk attributes. + + Args: + disk_days: Refer to function predict(...). + + Returns: + new_disk_days: Processed disk days. + """ + + req_attrs = [] + new_disk_days = [] + + attr_list = set.intersection(*[set(disk_day.keys()) for disk_day in disk_days]) + for attr in attr_list: + if ( + attr.startswith("smart_") and attr.endswith("_raw") + ) and attr not in self.EXCLUDED_ATTRS: + req_attrs.append(attr) + + for disk_day in disk_days: + new_disk_day = {} + for attr in req_attrs: + if float(disk_day[attr]) >= 0.0: + new_disk_day[attr] = disk_day[attr] + + new_disk_days.append(new_disk_day) + + return new_disk_days + + @staticmethod + def __get_diff_attrs(disk_days): + """ + Get 5 days differential attributes. + + Args: + disk_days: Refer to function predict(...). + + Returns: + attr_list: All S.M.A.R.T. attributes used in given disk. Here we + use intersection set of all disk days. + + diff_disk_days: A list struct comprises 5 dictionaries, each + dictionary contains differential attributes. + + Raises: + Exceptions of wrong list/dict operations. + """ + + all_attrs = [set(disk_day.keys()) for disk_day in disk_days] + attr_list = list(set.intersection(*all_attrs)) + attr_list = disk_days[0].keys() + prev_days = disk_days[:-1] + curr_days = disk_days[1:] + diff_disk_days = [] + # TODO: ensure that this ordering is correct + for prev, cur in zip(prev_days, curr_days): + diff_disk_days.append( + {attr: (int(cur[attr]) - int(prev[attr])) for attr in attr_list} + ) + + return attr_list, diff_disk_days + + def __get_best_models(self, attr_list): + """ + Find the best model from model list according to given attribute list. + + Args: + attr_list: All S.M.A.R.T. attributes used in given disk. + + Returns: + modelpath: The best model for the given attribute list. + model_attrlist: 'Ordered' attribute list of the returned model. + Must be aware that SMART attributes is in order. + + Raises: + """ + + models = self.model_context.keys() + + scores = [] + for model_name in models: + scores.append( + sum(attr in attr_list for attr in self.model_context[model_name]) + ) + max_score = max(scores) + + # Skip if too few matched attributes. + if max_score < 3: + print("Too few matched attributes") + return None + + best_models = {} + best_model_indices = [ + idx for idx, score in enumerate(scores) if score > max_score - 2 + ] + for model_idx in best_model_indices: + model_name = list(models)[model_idx] + model_path = os.path.join(self.model_dirpath, model_name) + model_attrlist = self.model_context[model_name] + best_models[model_path] = model_attrlist + + return best_models + # return os.path.join(self.model_dirpath, model_name), model_attrlist + + @staticmethod + def __get_ordered_attrs(disk_days, model_attrlist): + """ + Return ordered attributes of given disk days. + + Args: + disk_days: Unordered disk days. + model_attrlist: Model's ordered attribute list. + + Returns: + ordered_attrs: Ordered disk days. + + Raises: None + """ + + ordered_attrs = [] + + for one_day in disk_days: + one_day_attrs = [] + + for attr in model_attrlist: + if attr in one_day: + one_day_attrs.append(one_day[attr]) + else: + one_day_attrs.append(0) + + ordered_attrs.append(one_day_attrs) + + return ordered_attrs + + def predict(self, disk_days): + """ + Predict using given 6-days disk S.M.A.R.T. attributes. + + Args: + disk_days: A list struct comprises 6 dictionaries. These + dictionaries store 'consecutive' days of disk SMART + attributes. + Returns: + A string indicates prediction result. One of following four strings + will be returned according to disk failure status: + (1) Good : Disk is health + (2) Warning : Disk has some symptoms but may not fail immediately + (3) Bad : Disk is in danger and data backup is highly recommended + (4) Unknown : Not enough data for prediction. + + Raises: + Pickle exceptions + """ + + all_pred = [] + + proc_disk_days = self.__preprocess(disk_days) + attr_list, diff_data = PSDiskFailurePredictor.__get_diff_attrs(proc_disk_days) + modellist = self.__get_best_models(attr_list) + if modellist is None: + return "Unknown" + + for modelpath in modellist: + model_attrlist = modellist[modelpath] + ordered_data = PSDiskFailurePredictor.__get_ordered_attrs( + diff_data, model_attrlist + ) + + try: + with open(modelpath, "rb") as f_model: + clf = pickle.load(f_model) + + except UnicodeDecodeError: + # Compatibility for python3 + with open(modelpath, "rb") as f_model: + clf = pickle.load(f_model, encoding="latin1") + + pred = clf.predict(ordered_data) + + all_pred.append(1 if any(pred) else 0) + + score = 2 ** sum(all_pred) - len(modellist) + if score > 10: + return "Bad" + if score > 4: + return "Warning" + return "Good" diff --git a/src/pybind/mgr/diskprediction_local/requirements.txt b/src/pybind/mgr/diskprediction_local/requirements.txt new file mode 100644 index 000000000..d9c3157fd --- /dev/null +++ b/src/pybind/mgr/diskprediction_local/requirements.txt @@ -0,0 +1,3 @@ +numpy==1.15.1 +scipy==1.1.0 +scikit-learn==0.19.2 -- cgit v1.2.3