I was trying to run a python file named api.py
. In this file, I'm loading the pickle file of the Deep Learning model that was built and trained using PyTorch.
api.py
In api.py
the below-given functions are the most important ones.
def load_model_weights(model_architecture, weights_path):
if os.path.isfile(weights_path):
cherrypy.log("CHERRYPYLOG Loading model from: {}".format(weights_path))
model_architecture.load_state_dict(torch.load(weights_path))
else:
raise ValueError("Path not found {}".format(weights_path))
def load_recommender(vector_dim, hidden, activation, dropout, weights_path):
rencoder_api = model.AutoEncoder(layer_sizes=[vector_dim] + [int(l) for l in hidden.split(',')],
nl_type=activation,
is_constrained=False,
dp_drop_prob=dropout,
last_layer_activations=False)
load_model_weights(rencoder_api, weights_path)
rencoder_api.eval()
rencoder_api = rencoder_api.cuda()
return rencoder_api
The directory structure
π¦MP1
β£ π.ipynb_checkpoints
β β πRS_netflix3months_100epochs_64,128,128-checkpoint.ipynb
β£ πdata
β β£ πAutoEncoder.png
β β£ πcollaborative_filtering.gif
β β£ πmovie_titles.txt
β β πshut_up.gif
β£ πDeepRecommender
β β£ πdata_utils
β β β£ πmovielens_data_convert.py
β β β πnetflix_data_convert.py
β β£ πreco_encoder
β β β£ πdata
β β β β£ π__pycache__
β β β β β£ πinput_layer.cpython-37.pyc
β β β β β£ πinput_layer_api.cpython-37.pyc
β β β β β π__init__.cpython-37.pyc
β β β β£ πinput_layer.py
β β β β£ πinput_layer_api.py
β β β β π__init__.py
β β β£ πmodel
β β β β£ π__pycache__
β β β β β£ πmodel.cpython-37.pyc
β β β β β π__init__.cpython-37.pyc
β β β β£ πmodel.py
β β β β π__init__.py
β β β£ π__pycache__
β β β β π__init__.cpython-37.pyc
β β β π__init__.py
β β£ π__pycache__
β β β π__init__.cpython-37.pyc
β β£ πcompute_RMSE.py
β β£ πinfer.py
β β£ πrun.py
β β π__init__.py
β£ πmodel_save
β β£ πmodel.epoch_99
β β β πarchive
β β β β£ πdata
β β β β β£ π92901648
β β β β β£ π92901728
β β β β β£ π92901808
β β β β β£ π92901888
β β β β β£ π92901968
β β β β β£ π92902048
β β β β β£ π92902128
β β β β β£ π92902208
β β β β β£ π92902288
β β β β β£ π92902368
β β β β β£ π92902448
β β β β β π92902608
β β β β£ πdata.pkl
β β β β πversion
β β£ πmodel.epoch_99.zip
β β πmodel.onnx
β£ πNetflix
β β£ πN1Y_TEST
β β β πn1y.test.txt
β β£ πN1Y_TRAIN
β β β πn1y.train.txt
β β£ πN1Y_VALID
β β β πn1y.valid.txt
β β£ πN3M_TEST
β β β πn3m.test.txt
β β£ πN3M_TRAIN
β β β πn3m.train.txt
β β£ πN3M_VALID
β β β πn3m.valid.txt
β β£ πN6M_TEST
β β β πn6m.test.txt
β β£ πN6M_TRAIN
β β β πn6m.train.txt
β β£ πN6M_VALID
β β β πn6m.valid.txt
β β£ πNF_TEST
β β β πnf.test.txt
β β£ πNF_TRAIN
β β β πnf.train.txt
β β πNF_VALID
β β β πnf.valid.txt
β£ πtest
β β£ πtestData_iRec
β β β£ π.part-00199-f683aa3b-8840-4835-b8bc-a8d1eaa11c78.txt.crc
β β β£ πpart-00000-f683aa3b-8840-4835-b8bc-a8d1eaa11c78.txt
β β β£ πpart-00003-f683aa3b-8840-4835-b8bc-a8d1eaa11c78.txt
β β β π_SUCCESS
β β£ πtestData_uRec
β β β£ π.part-00000-4a844096-8dd9-425e-9d9d-bd9062cc6940.txt.crc
β β β£ π._SUCCESS.crc
β β β£ πpart-00161-4a844096-8dd9-425e-9d9d-bd9062cc6940.txt
β β β£ πpart-00196-4a844096-8dd9-425e-9d9d-bd9062cc6940.txt
β β β πpart-00199-4a844096-8dd9-425e-9d9d-bd9062cc6940.txt
β β£ πdata_layer_tests.py
β β£ πtest_model.py
β β π__init__.py
β£ π__pycache__
β β£ πapi.cpython-37.pyc
β β£ πload_test.cpython-37.pyc
β β£ πparameters.cpython-37.pyc
β β πutils.cpython-37.pyc
β£ πapi.py
β£ πcompute_RMSE.py
β£ πload_test.py
β£ πlogger.py
β£ πnetflix_1y_test.csv
β£ πnetflix_1y_train.csv
β£ πnetflix_1y_valid.csv
β£ πnetflix_3m_test.csv
β£ πnetflix_3m_train.csv
β£ πnetflix_3m_valid.csv
β£ πnetflix_6m_test.csv
β£ πnetflix_6m_train.csv
β£ πnetflix_6m_valid.csv
β£ πnetflix_full_test.csv
β£ πnetflix_full_train.csv
β£ πnetflix_full_valid.csv
β£ πparameters.py
β£ πpreds.txt
β£ πRS_netflix3months_100epochs_64,128,128.ipynb
β πutils.py
I am getting such an error (serialization.py). Can someone help me with this error?
D:\Anaconda\envs\practise\lib\site-packages\torch\serialization.py in _legacy_load(f, map_location, pickle_module, **pickle_load_args)
762 "functionality.")
763
--> 764 magic_number = pickle_module.load(f, **pickle_load_args)
765 if magic_number != MAGIC_NUMBER:
766 raise RuntimeError("Invalid magic number; corrupt file?")
UnpicklingError: A load persistent id instruction was encountered,
but no persistent_load function was specified.
After searching through PyTorch documentation, I ended up saving the model in the ONNX format and later loaded that ONNX model into PyTorch model and used it for inference.
import onnx
from onnx2pytorch import ConvertModel
def load_model_weights(model_architecture, weights_path):
if os.path.isfile("model.onnx"):
cherrypy.log("CHERRYPYLOG Loading model from: {}".format(weights_path))
onnx_model = onnx.load("model.onnx")
pytorch_model = ConvertModel(onnx_model)
## model_architecture.load_state_dict(torch.load(weights_path))
else:
raise ValueError("Path not found {}".format(weights_path))
def load_recommender(vector_dim, hidden, activation, dropout, weights_path):
rencoder_api = model.AutoEncoder(layer_sizes=[vector_dim] + [int(l) for l in hidden.split(',')],
nl_type=activation,
is_constrained=False,
dp_drop_prob=dropout,
last_layer_activations=False)
load_model_weights(rencoder_api, weights_path)
rencoder_api.eval()
rencoder_api = rencoder_api.cuda()
return rencoder_api
Some useful resources: