Как сохранить решение Pyomo и перезагрузить его в отдельную среду выполнения?

Моя оптимизация занимает несколько часов на высокопроизводительном сервере. Я хочу сохранить решения на диск, а затем перезагрузить их на свой ноутбук в экземпляр модели. Это позволило бы мне интерактивно исследовать результаты в командной строке python и разрабатывать или тестировать только что написанный код экспорта. Библиотека pyomo имеет множество функций для сброса данных на диск, но не предоставляет четкого решения для их загрузки обратно в другую среду выполнения.

Моим идеальным решением было бы обработать экземпляр после загрузки решения, чтобы он инкапсулировал входные данные, решение и все состояние времени выполнения. К сожалению, к экземпляру прикреплены методы, которые нельзя мариновать, а команда pyomo не написала собственных функций травления. Рекомендуемый обходной путь в ветке форума 2015 г.: засолить объект результатов. В объект результатов не загружено решение по умолчанию в v5.1.1, но другой пост объясняет, как это решить.

Мне удалось собрать решение, которое работает в pyomo v5.1.1, но интересно, есть ли способ лучше.

Сохранить

# ...Define abstract model
# ...Load data from input directory and create model instance

# Solve, get a results object that only contains execution metadata
results = opt.solve(instance)

# Load solution data into results object
instance.solutions.store_to(results)

# Archive results: solution & execution metadata
pickle.dump(results, open("results.pickle", "wb"))

Перезагрузить

... синхронизировать код, каталог входов и файл results.pickle с сервера на мой ноутбук.

# ...Define abstract model
# ...Load data from input directory and create model instance

# Load results from pickle: metadata & solution
results = pickle.load(open("results.pickle", "wb"))

# Load solution data into instance object
instance.solutions.load_from(results)

person JosiahJohnston    schedule 09.11.2017    source источник


Ответы (1)


Как упоминалось в этом вопросе, решением является мариновать экземпляр использовать cloudpickle:

import cloudpickle

with open('test.pkl', mode='wb') as file:
    cloudpickle.dump(instance, file)


with open('test.pkl', mode='rb') as file:
    instance = cloudpickle.load(file)

Я провел базовое тестирование, и похоже, что приведенное выше способствовало восстановлению экземпляра вместе с ожидаемыми результатами.

person insys    schedule 12.11.2018