Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Save and reload trained models #156

Open
ArioBattolla opened this issue Jun 28, 2019 · 17 comments
Open

Save and reload trained models #156

ArioBattolla opened this issue Jun 28, 2019 · 17 comments
Labels

Comments

@ArioBattolla
Copy link

How can I save and reload trained models?
I tried to pickle them, but it does not work.
I would like to train once and then use the trained model in another python file to predict data points.
Thank you very much, your package is incredible!

@relf
Copy link
Member

relf commented Jun 28, 2019

Could you show your code for pickling? Have you got an error?

@ArioBattolla
Copy link
Author

ArioBattolla commented Jun 28, 2019

I did:

sm = models[model](**par)
sm.set_training_values(X_train, y_train)
sm.train()
with open("best_models.pickle", "wb") as handle:
        pickle.dump(sm, handle)

I got this error:
PicklingError: Can't pickle <class 'function'>: attribute lookup function on builtins failed

@relf
Copy link
Member

relf commented Jun 28, 2019

Ok. That was fixed recently for Kriging based surrogates at least (see #154). So you have to install SMT from GitHub.

@ArioBattolla
Copy link
Author

Ah ok, thank you very much.
What can I do for other models, such as RBF or IDW?

@relf
Copy link
Member

relf commented Jun 28, 2019

I've just released SMT 0.3.3, you can try it with:

pip install -U smt

Regarding, IDW and RBF, do you get an error? I am not sure but I think it had worked for me.

@ArioBattolla
Copy link
Author

It gives me this error:

File "W:/17_Users/trainees/Battolla/manda\regression.py", line 647, in AutoInterpolation
pickle.dump(best_models, handle)

File "stringsource", line 2, in smt.surrogate_models.rbfclib.PyRBF.reduce_cython

TypeError: no default reduce due to non-trivial cinit

I have no clue what is about

@relf
Copy link
Member

relf commented Jul 1, 2019

My bad. Indeed it does not work for IDW and RBF and other surrogates using a Cython extensions. Those require special handling (see stackoverflow related question).

@ArioBattolla
Copy link
Author

But if I save KPLS, do I need to retrain the model or can I load directly to predict new points? Because I am not able to do that.

@bouhlelma
Copy link
Member

bouhlelma commented Jul 27, 2019 via email

@relf
Copy link
Member

relf commented Aug 19, 2019

But if I save KPLS, do I need to retrain the model or can I load directly to predict new points? Because I am not able to do that.

What is going on? After the dump, you should be able to load the KPLS surrogate using pickle.load() and retrieve the trained surrogate.

@ldallen-crrel
Copy link

Hello @relf ,
Is there an accepted method to saving trained surrogates that do use Cython? I followed the link you posted above, but I am still confused about how it is implemented. Specifically, I am trying to save an IDW model.

My bad. Indeed it does not work for IDW and RBF and other surrogates using a Cython extensions. Those require special handling (see stackoverflow related question).

My code is nearly the same as the OP, though I get a different error:
TypeError: no default __reduce__ due to non-trivial __cinit__

Thanks

@relf
Copy link
Member

relf commented Sep 17, 2019

@ldallen-crrel No, we have not work specifically on surrogates dump, I've just referenced the link I found after a 2-minutes search. I've started to make pickling work for kriging-based ones but as I said Cython extensions require special handling. I've not planned to work on that, but it would be a great contribution to SMT. What do you mean by OP?

@ldallen-crrel
Copy link

Thank you for the reply. By OP, I only meant the original poster (ArioBattolla).

@petrmanek
Copy link

Bumping this after some time passed. Has this been resolved? Or has anyone found a workaround? I still get the following error when saving some models (e.g. RBF): TypeError: no default __reduce__ due to non-trivial __cinit__

@relf
Copy link
Member

relf commented Apr 6, 2020

Nothing has evolved on this point. You get an error as it is not implemented (hence the open status of this issue). As far as I am concerned, I do not work on this but I will be happy to integrate a PR on this topic.

@relf
Copy link
Member

relf commented Oct 1, 2020

Bumping on this again, for future reference, note that even if they can not be pickled directly, RBF, IDW, RMTS (like QP and LS) training operation can be cached.

These surrogates have a data_dir option which allows to specify a directory to cache relevant data for each method. Provided you initialize the method with the same training data, cached data is loaded back from the previous run without running training operation again.

@relf
Copy link
Member

relf commented Apr 23, 2021

A section on this topic is added to the documentation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

5 participants