Python/Tensorflow: постоянное увеличение оперативной памяти в длительном цикле, несмотря на Clear_Session и Gc.collectPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Python/Tensorflow: постоянное увеличение оперативной памяти в длительном цикле, несмотря на Clear_Session и Gc.collect

Сообщение Anonymous »

Я запускаю сценарий Python на VPS в непрерывном цикле. Скрипт получает данные о запасах с ифинансированием, затем обучает новую модель Tensorflow/Keras для каждого акции. Это происходит, даже если я использую процедуру очистки после каждой итерации.import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Input # Aggiungi Input qui
from sklearn.preprocessing import MinMaxScaler
import gc
import time
import os
import psutil

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
tf.get_logger().setLevel('ERROR')

def get_ram_usage():
return psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024)

def download_stock_data(ticker, start_date="2020-01-01", end_date=None):
try:
stock_data = yf.download(ticker, start=start_date, end=end_date, progress=False)
return stock_data if not stock_data.empty else None
except Exception:
return None

def create_and_predict_model(data, n_past=30, n_future=3, epochs=10, batch_size=32):
if data is None or len(data) < n_past + n_future:
return None, None

scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data_values = data['Close'].values.reshape(-1, 1)
scaled_data = scaler.fit_transform(scaled_data_values)
del scaled_data_values

X_train, y_train = [], []
for i in range(n_past, len(scaled_data) - n_future + 1):
X_train.append(scaled_data[i - n_past:i, 0])
y_train.append(scaled_data[i:i + n_future, 0])

if not X_train:
del scaler, scaled_data
return None, None

X_train, y_train = np.array(X_train), np.array(y_train)

# --- MODIFICA QUI ---
model = Sequential([
Input(shape=(n_past,)), # Usa un layer Input esplicito
Dense(100, activation='relu'),
Dense(50, activation='relu'),
Dense(n_future)
])
# --- FINE MODIFICA ---
model.compile(optimizer='adam', loss='mean_squared_error')

tf.random.set_seed(int(time.time()))
np.random.seed(int(time.time()))
history = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, verbose=0)
print(f"RAM usage after training: {get_ram_usage():.2f} MB")

last_n_past_days_scaled = scaled_data[-n_past:].reshape(1, n_past)
predicted_scaled_prices = model.predict(last_n_past_days_scaled, verbose=0)
predicted_prices = scaler.inverse_transform(predicted_scaled_prices.reshape(-1,1))
print(f"RAM usage after prediction: {get_ram_usage():.2f} MB")

del X_train, y_train, scaled_data, scaler, last_n_past_days_scaled, predicted_scaled_prices, history
return predicted_prices.flatten(), model

def clean_ram(model_to_delete=None):
if model_to_delete is not None:
try: del model_to_delete
except: pass
tf.keras.backend.clear_session()
gc.collect()
print(f"RAM usage after cleaning: {get_ram_usage():.2f} MB")

if __name__ == "__main__":
stock_tickers = ["AAPL", "MSFT", "GOOGL", "AMZN", "TSLA"]
N_PAST_DAYS, N_FUTURE_DAYS, EPOCHS = 60, 3, 15
SECONDS_BETWEEN_TICKERS, SECONDS_BETWEEN_GLOBAL_CYCLES = 1, 5

print(f"INITIAL RAM USAGE: {get_ram_usage():.2f} MB")
main_cycle_count = 0

try:
while True:
main_cycle_count += 1
print(f"\n--- GLOBAL CYCLE {main_cycle_count} ---")
print(f"RAM at start of cycle {main_cycle_count}: {get_ram_usage():.2f} MB")

for ticker_index, ticker in enumerate(stock_tickers):
print(f"\nProcessing Ticker: {ticker} (Cycle {main_cycle_count})")
start_ticker_ram = get_ram_usage()
print(f"RAM before {ticker}: {start_ticker_ram:.2f} MB")

historical_data = download_stock_data(ticker, start_date="2018-01-01")
print(f"RAM after download for {ticker}: {get_ram_usage():.2f} MB")

predictions = None
model_for_this_ticker = None

if historical_data is not None:
predictions, model_for_this_ticker = create_and_predict_model(
historical_data.copy(), N_PAST_DAYS, N_FUTURE_DAYS, EPOCHS
)
del historical_data
print(f"RAM after deleting historical_data for {ticker}: {get_ram_usage():.2f} MB")

if predictions is not None:
del predictions

clean_ram(model_for_this_ticker)
if model_for_this_ticker is not None:
del model_for_this_ticker

end_ticker_ram = get_ram_usage()
print(f"RAM after full processing of {ticker}: {end_ticker_ram:.2f} MB (Change: {end_ticker_ram - start_ticker_ram:+.2f} MB)")

if ticker_index < len(stock_tickers) - 1:
time.sleep(SECONDS_BETWEEN_TICKERS)

print(f"RAM at end of cycle {main_cycle_count}: {get_ram_usage():.2f} MB")
time.sleep(SECONDS_BETWEEN_GLOBAL_CYCLES)

except KeyboardInterrupt:
print("\n\nExiting program...")
except Exception as e:
print(f"\n\nUNHANDLED ERROR: {e}")
import traceback
traceback.print_exc()
finally:
print(f"\nFINAL RAM USAGE: {get_ram_usage():.2f} MB")
print("Script terminated.")
< /code>
Что я пробовал: < /strong>
Calling tf.keras.backend.clear_session () после обработки каждой модели.
Явно удаляя модель, DataFrames и Numpy Matry с использованием Del.
Offing Girbage с Gc.collect (). Причина этого увеличения памяти на 6 МБ на тикер? Выход < /p>
Обработка тикер: Googl (цикл 1)
RAM до Googl: 1081.62 MB
RAM после загрузки для Googl: 1082.94 MB
RAM Использование после тренировки: 1088,64 MB
RAM USAGE After Prodect 1088,72 МБ
использование оперативной памяти после очистки: 1088,71 МБ
RAM после полной обработки Googl: 1088,71 МБ (изменение: +7,08 мб) < /p>
Обработка тикера: Amzn (цикл 1)
ram перед Amzn: 1088.711 MB
ram. 1090,71 МБ
Использование оперативной памяти после обучения: 1092,92 МБ
Использование оперативной памяти после прогноза: 1092,98 МБ
RAM после удаления Historical_data для AMZN: 1092,98 МБ
RAM -использование после очистки: 1092,96 MB
ram после полной обработки Amzn: 1092.66. MB) < /p>
Обработка тикера: TSLA (цикл 1)
RAM перед TSLA: 1092.96 MB
RAM после загрузки для TSLA: 1094,91 МБ
RAM Использование после обучения: 1098,49 MB
ram usage после прогнозирования: 1098.57 MB
ram dame stameting stamediting for astermic TSLA: 1098,57 МБ
использование оперативной памяти после очистки: 1098,56 МБ
RAM после полной обработки TSLA: 1098,56 МБ (изменение: +5,59 МБ)
RAM в конце цикла 1: 1098,56 МБ < /p>
--- Глобальный цикл 2 ---
ram. MB < /p>
Обработка тикера: AAPL (цикл 2)
RAM до AAPL: 1098,56 МБ
RAM после загрузки для AAPL: 1100,55 МБ
RAM Использование. 1103,26 МБ
Использование оперативной памяти после очистки: 1103,25 МБ после полной обработки AAPL: 1103,25 МБ (изменение: +4,69 МБ)
.....

Подробнее здесь: https://stackoverflow.com/questions/796 ... pite-clear
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»