Interpretacja błędu pamięci

0

Na czym polega błąd

---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
Cell In[14], line 43
     40     agglo_labels = agglomerative.fit_predict(X)
     41     return kmeans_labels, dbscan_labels, agglo_labels
---> 43 kmeans_labels, dbscan_labels, agglo_labels = cluster_data(X_train, 5)
     45 # Wybór optymalnej liczby klastrów dla K-means
     46 def determine_optimal_clusters(X):

Cell In[14], line 36
     34 def cluster_data(X, n_clusters):
     35     kmeans = KMeans(n_clusters=n_clusters, random_state=42)
---> 36     kmeans_labels = kmeans.fit_predict(X)
     37     dbscan = DBSCAN(eps=0.5, min_samples=5)
     38     dbscan_labels = dbscan.fit_predict(X)

File c:\Users\Dariusz\AppData\Local\Programs\Python\Python312\Lib\site-packages\sklearn\cluster\_kmeans.py:1070, in _BaseKMeans.fit_predict(self, X, y, sample_weight)
   1047 def fit_predict(self, X, y=None, sample_weight=None):
   1048     """Compute cluster centers and predict cluster index for each sample.
   1049 
   1050     Convenience method; equivalent to calling fit(X) followed by
   (...)
   1068         Index of the cluster each sample belongs to.
   1069     """
-> 1070     return self.fit(X, sample_weight=sample_weight).labels_
...
--> 749         array = numpy.array(array, order=order, dtype=dtype)
    750     else:
    751         array = numpy.asarray(array, order=order, dtype=dtype)

MemoryError: Unable to allocate 34.8 GiB for an array with shape (34028, 137325) and data type float64
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

i jak go naprawić?

4

Unable to allocate 34.8 GiB for an array with shape (34028, 137325) and data type float64 Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output setting
Brzmi jakbyś zaalokował 35GB ram i tyle nie miał dostępnego.

1

float64? Po co aż tak? Daj przez pół mniejsze, albo nawet 16.

1

Dobry pomysł, w AI dużych modelach daje się nawet 4 bity kwantyzacji i są badania naukowe co potwierdzają, że starczy 1,56 bita do inferencji, ale do nauki jest potrzebne więcej precyzja nauki wag musi być wyższa, ale inferencja 1,56 bita starczy, są na to papiery naukowe i sam w llm modelach uruchamiam je jako 4 bitową kwantyzację działa z taką samą dokładnością.

0

Tak, przyznam, że mnie to trochę zszokowało, jak pierwszy raz zobaczylem

0

Zbiór treningowy wymaga zbyt dużo pamięci.

Podejścia:
a) wspomniane prze @lion137 i @.GodOfCode. użycie węższych typów danych czy kwantyzacja
b) używasz mniejszego zbioru treningowego
c) robisz feature engineering - np. liczysz korelację między Ficzerami i masz np. F1 skorelowane z F30, F50, F70 (wywalasz F30, F50, F70, F2 skorelowane z F12, F15, F31 (wywalasz itd.)
d) możesz spróbować użyć KFolda z połączeniem z KMeans

0

@.GodOfCode., @lion137 Jak to zrobić? Jak zmienić typ danych z float64 na mniej pojemny typ danych?

0

@darek88 zależy gdzie dokładnie bo jak masz jakieś input wartości to masz ten dtype= tutaj możesz podać jaki typ ma mieć macierz/tensor.

array = np.array([1.,2.,3.], dtype=np.float16)
Też musisz sobie porównać jak wybada niższa dokładność floata w danym zadaniu.
Dane wejściowe możesz sobie tak zredukować, podać z niższą dokładnością, czasem to nie ma za dużego znaczenia.
Ale twój problem to ponad 35GB to i tak może ci tego ramu zabraknąć mimo wszystko.

Ja bym polecał poza zmniejszeniem precyzji, zrobić batch size, czyli zamiast jednego dużego 35GB pliku robisz kilka wiele mniejszych po 1GB.
Zamiast raz fit całe 35GB, to robisz jakimś generatorem po 5GB, 7 podejść.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.