Снижение требований к памяти модели Pyomo - PullRequest
1 голос
/ 21 марта 2019

Я строю большую модель Pyomo с более чем 1 миллионом ограничений и 2 миллионами переменных.

И я ищу предложения по снижению требований к памяти для модели, которую я строю.

На данный момент требуется более 20gb ОЗУ.

Как бы я уменьшил это?

Я никогда не проверял определение переменных с / без within=pyomo.NonNegativeReals. Но я предполагаю, что это уменьшит объем памяти, необходимый для данной переменной. Есть ли другие вещи, которые я мог бы сделать, не уменьшая количество переменных или ограничений.

Например:

После var потребуется X байт памяти

m.var = pyomo.Var(
    m.index)

И, возможно, для следующих потребуется X-1 байтов памяти

m.var = pyomo.Var(
    m.index,
    within=pyomo.NonNegativeReals)

Конечно, это предположение. Без тестирования нельзя быть уверенным в этом. Тем не менее, я готов попробовать что угодно, если у some1 есть идея или больше опыта по этому вопросу.

Есть идеи?

Некоторые тесты:

Имейте в виду, что это не реальная модель, а пример, построенный на других данных. Но все тот же сценарий.

index=1000 // Full Consts         // 347580 KB (commit) // 370652 KB (working set)
              0 Const Full Rules  // 282416 KB (commit) // 305252 KB (working set)
              0 Const 0 Rule      // 282404 KB (commit) // 305200 KB (working set)
              1 Const 1 Rule      // 290408 KB (commit) // 313136 KB (working set)

index=8760 // Full Consts         // 1675860 KB (commit) // 1695676 KB (working set)

1 Ответ

0 голосов
/ 21 марта 2019

Я использовал pympler для анализа тестового примера, на который вы указали.Вот что я нашел:

После pyomo_model_prep (загружает данные и помещает их в пустые ConcreteModel):

  1. использование памяти составляет 13,2 МБ

После добавления всех объектов Set и Param:

использование памяти составляет 13,3 МБ

После добавления всех Var объектов:

использование памяти составляет 14,3 МБ

После добавления всех Constraint объектов:

использование памяти составляет 15,0 МБ

Когда я устанавливаю временные шаги на 60, результаты равны

  1. использование памяти составляет 13,2 МБ (данные)
  2. использование памяти составляет 13,3 МБ (после наборов, параметров)
  3. использование памяти составляет 19,6 МБ (после переменных)
  4. использование памяти составляет 23,6 МБ (после ограничений)

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

К сожалению, на самом деле не существует простого способа уменьшить объем памяти объявлений переменных.

Обновление 1: просто к сведению, почти все использование памяти для объявлений переменныхявляется результатом индексированных переменных e_pro_in и e_pro_out.

Обновление 2: Если большое количество индексов переменных e_pro_in и e_pro_out не используется в модели, вы можете уменьшитьтребования к памяти путем создания сокращенного набора индексов для каждого из них.Вот как это может выглядеть:

e_pro_in_index = []
for t in m.tm:
    for i,j in m.pro_tuples:
        for c in m.com:
            if ...:
                e_pro_in_index.append((t,i,j,c))
m.e_pro_in_index = Set(dimen=4, initialize=e_pro_in_index)
m.e_pro_in = pyomo.Var(
    m.e_pro_in_index,
    within=pyomo.NonNegativeReals,
    doc='Power flow of commodity into process (MW) per timestep')

Вам потребуется извлечь логику из правил ограничения, чтобы выяснить, какие индексы не нужны.

...