Trainingsdatenerstellung parallelisieren führt zu CUDA_ERROR_OUT_OF_MEMORY
Verfasst: Mittwoch 2. März 2022, 17:52
Hallo, ich habe eine Liste von Beispieldaten und möchte diese jetzt in numpy-arrays umwandeln.
Die Funktionen, die alles starten und die Parallelisierung einleiten sind folgende:
Für die Eigentliche Umwandlung zuständig ist folgender Code, wobei erst einmal alle raw-samples in Sample-Klassen gemapped werde, wo auch die Normalisierung stattfindet und dann die np.Arrays erzeugt werden:
Wie schon im Titel gesagt, sorgt das Ganze bei mir dafür, dass ein CUDA_ERROR_OUT_OF_MEMORY geworfen wird. Dazu habe ich jetzt zwei Fragen:
1. Was an meinem Code sorgt überhaupt dafür, dass CUDA bzw. meine GPU genutzt wird?
2. Lässt sich der Code noch hinsichtlich des Speicherbedarfs optimieren? Wenn ja wie?
Vielen Dank!
Die Funktionen, die alles starten und die Parallelisierung einleiten sind folgende:
Code: Alles auswählen
def split(data, n):
k, m = divmod(len(data), n)
return list(data[i*k+min(i, m):(i+1)*k+min(i+1, m)] for i in range(n))
def start_sample_generation(args):
data, shape, cols = args
return to_samples(data, shape, cols)
def generate_samples(sample_shape, cols_no_normalization):
with open('raw_data.pickle', 'rb') as handle:
raw_data= pickle.load(handle)
pool = mp.Pool(mp.cpu_count())
data = pool.map(start_sample_generation, [(x, sample_shape, cols_no_normalization) for x in split(raw_data, mp.cpu_count())])
X, Y = [], []
for x, y in data:
print(x.shape, y.shape)
X.append(x)
Y.append(y)
X = np.concatenate(X, axis=0)
Y = np.concatenate(Y, axis=0)
return X, Y
if __name__ == '__main__':
generate_samples((25,5),['state'])
Code: Alles auswählen
class Sample:
def __init__(self, data, cols_no_normalization):
self.sample = normalize(data.history, cols_no_normalization)
self.label = ...
self.label = tf.one_hot(self.label, depth=3)
def to_samples(raw_data, input_shape, cols_no_normalization=[]):
samples = list(map(lambda x: Sample(x, cols_no_normalization), raw_data))
return samples_to_numpy(samples, input_shape)
def samples_to_numpy(samples : list[Sample], input_shape):
shuffle(samples)
x = []
y = []
count = 0
l = int(len(samples) / 10)
print(">>> creating numpy arrays --> started; len(samples) =", len(samples))
for i in range(len(samples)):
x_n = samples[i].sample.to_numpy()
if x_n.shape == input_shape:
x.append(x_n)
y.append(samples[i].label)
if (l + count * l) == i:
print(">>> creating numpy arrays --> progress:", (count+1)*10, '%')
count = count + 1
return np.stack(x, axis=0), np.stack(y, axis=0)
def normalize(df: pd.DataFrame, cols_no_normalization=[], drop_na=True) -> pd.DataFrame:
tmp = df
for col in tmp.columns:
if col not in cols_no_normalization:
tmp[col] = tmp[col].pct_change()
tmp = tmp.replace([np.inf, -np.inf], np.nan)
tmp[col] = preprocessing.scale(tmp[col].values) # scale values
if drop_na:
tmp.dropna(inplace=True)
return tmp
1. Was an meinem Code sorgt überhaupt dafür, dass CUDA bzw. meine GPU genutzt wird?
2. Lässt sich der Code noch hinsichtlich des Speicherbedarfs optimieren? Wenn ja wie?
Vielen Dank!