Jupyter Lab đóng băng máy tính khi hết RAM - làm thế nào để ngăn chặn nó?


12

Gần đây tôi đã bắt đầu sử dụng Jupyter Lab và vấn đề của tôi là tôi làm việc với các bộ dữ liệu khá lớn (thường thì bộ dữ liệu chỉ bằng khoảng 1/4 RAM máy tính của tôi). Sau vài lần biến đổi, được lưu dưới dạng đối tượng Python mới, tôi có xu hướng hết bộ nhớ. Vấn đề là khi tôi đạt đến giới hạn RAM khả dụng và thực hiện bất kỳ thao tác nào cần dung lượng RAM khác, máy tính của tôi sẽ bị đóng băng và cách duy nhất để khắc phục là khởi động lại nó. Đây có phải là hành vi mặc định trong Jupyter Lab / Notebook hay đây là một số cài đặt tôi nên đặt? Thông thường, tôi sẽ mong đợi chương trình bị sập (ví dụ như trong RStudio), chứ không phải toàn bộ máy tính


Tôi đã có cùng một vấn đề trước đây, nó thực sự khó chịu. Tôi đã có một cái nhìn nhanh chóng trong các vấn đề jupyter và không tìm thấy gì. Nó cũng xảy ra nếu bạn chạy qua giao diện điều khiển IPython (không phải python)?
Bzazz

Những gói / mô-đun bạn đã sử dụng? Nó là hệ điều hành gì? Bạn đã trao đổi? Phiên bản nào của Jupyter Lab? Nếu là Linux thì phiên bản kernel là gì?
Nizam Mohamed

Nó chủ yếu là gấu trúc, nhưng tôi không nghĩ nó liên quan đến gói. HĐH là Ubuntu 16.04.6 LTS và phiên bản kernel là 4.15.0-65-generic. Phiên bản Jupyter Lab là 1.0.2. Tôi có bộ SWAP được đặt thành 12 GB (được gán cho 2 tệp) bằng 1,5 RAM của tôi.
bắt đầu

Câu trả lời:


5

Giải pháp tuyệt đối nhất cho vấn đề này sẽ là sử dụng các container Docker. Bạn có thể chỉ định dung lượng bộ nhớ để phân bổ cho Jupyter và nếu bộ chứa hết bộ nhớ thì đơn giản đó không phải là vấn đề lớn (chỉ cần nhớ lưu thường xuyên, nhưng không cần phải nói).

Blog này sẽ giúp bạn có được hầu hết các cách đó. Ngoài ra còn có một số hướng dẫn phù hợp khi thiết lập Jupyter Lab từ một trong những hình ảnh Jupyter miễn phí, được bảo trì chính thức tại đây:

https://medium.com/fundbox-engineering/overview-d3759e83969c

và sau đó bạn có thể sửa đổi docker runlệnh như được mô tả trong hướng dẫn như (ví dụ: 3GB):

docker run --memory 3g <other docker run args from tutorial here>

Để biết cú pháp trên các tùy chọn bộ nhớ docker, hãy xem câu hỏi này:

Đơn vị nào mà docker chạy tùy chọn "--memory" mong đợi?


4

Nếu bạn đang sử dụng Ubuntu, hãy xem những kẻ giết người OOM, bạn có thể lấy thông tin từ đây

Bạn có thể sử dụng Earlyoom . Nó có thể được cấu hình như bạn muốn, ví dụ như earlyoom -s 90 -m 15sẽ khởi động earlyoomvà khi kích thước trao đổi nhỏ hơn% 90 và bộ nhớ nhỏ hơn% 15, nó sẽ giết quá trình gây ra OOM và ngăn toàn bộ hệ thống đóng băng. Bạn cũng có thể cấu hình mức độ ưu tiên của các quy trình.


2

Tôi cũng làm việc với các bộ dữ liệu rất lớn (3 GB) trên Jupyter Lab và đã gặp phải vấn đề tương tự trên Labs. Không rõ liệu bạn có cần duy trì quyền truy cập vào dữ liệu được chuyển đổi trước hay không, nếu không, tôi đã bắt đầu sử dụng delcác biến dữ liệu khung dữ liệu lớn không sử dụng nếu tôi không cần chúng. delloại bỏ các biến khỏi bộ nhớ của bạn. Chỉnh sửa **: có nhiều khả năng cho vấn đề tôi gặp phải. Tôi gặp điều này thường xuyên hơn khi tôi đang sử dụng một ví dụ jupyter từ xa, và trong trình gián điệp cũng như khi tôi thực hiện các biến đổi lớn.

ví dụ

df = pd.read('some_giant_dataframe') # or whatever your import is
new_df = my_transform(df)
del df # if unneeded.

Bạn cũng có thể tìm thấy chủ đề này trên quy trình công việc dữ liệu lớn hữu ích. Tôi đã xem xét Dask để giúp lưu trữ bộ nhớ.

Tôi đã nhận thấy trong spyder và jupyter rằng việc đóng băng thường sẽ xảy ra khi làm việc trong một giao diện điều khiển khác trong khi một giao diện điều khiển bộ nhớ lớn chạy. Về lý do tại sao nó chỉ đóng băng thay vì sụp đổ, tôi nghĩ rằng điều này có liên quan đến kernel. Có một số vấn đề về bộ nhớ mở trong IPython github - # 10082 và # 10117 có vẻ phù hợp nhất. Một người dùng ở đây đề nghị vô hiệu hóa hoàn thành tab trong jedihoặc cập nhật jedi.

Năm 10117 họ đề xuất kiểm tra đầu ra của get_ipython().history_manager.db_log_output. Tôi có cùng một vấn đề và cài đặt của tôi là chính xác, nhưng nó đáng để kiểm tra


1

Bạn cũng có thể sử dụng sổ ghi chép trên đám mây, chẳng hạn như Google Colab tại đây . Họ đã cung cấp cơ sở cho RAM được đề xuất và hỗ trợ cho máy tính xách tay Jupyter theo mặc định.


0

Tôi nghĩ bạn nên sử dụng chunk. Như thế

df_chunk = pd.read_csv(r'../input/data.csv', chunksize=1000000)
chunk_list = []  # append each chunk df here 

# Each chunk is in df format
for chunk in df_chunk:  
    # perform data filtering 
    chunk_filter = chunk_preprocessing(chunk)

    # Once the data filtering is done, append the chunk to list
    chunk_list.append(chunk_filter)

# concat the list into dataframe 
df_concat = pd.concat(chunk_list)

Để biết thêm thông tin kiểm tra xem nó: https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c

Tôi đề nghị không nối lại danh sách (có thể RAM sẽ quá tải trở lại). Bạn nên hoàn thành công việc của mình trong vòng lặp đó.


Tôi nghĩ vấn đề ở đây không phải là làm thế nào để không hết bộ nhớ, mà là làm thế nào để tránh máy tính bị sập và cần khởi động lại. Python nên sập hoặc ném bộ nhớ, nhưng không làm mọi thứ rối tung lên.
Bzazz

0

Tôi sẽ tóm tắt các câu trả lời từ câu hỏi sau đây . Bạn có thể giới hạn việc sử dụng bộ nhớ của chương trình của bạn. Sau đây sẽ là chức năng ram_intense_foo(). Trước khi gọi bạn cần gọi hàmlimit_memory(10)

import resource
import platform
import sys
import numpy as np 

def memory_limit(percent_of_free):
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    resource.setrlimit(resource.RLIMIT_AS, (get_memory() * 1024 * percent_of_free / 100, hard))

def get_memory():
    with open('/proc/meminfo', 'r') as mem:
        free_memory = 0
        for i in mem:
            sline = i.split()
            if str(sline[0]) == 'MemAvailable:':
                free_memory = int(sline[1])
                break
    return free_memory

def ram_intense_foo(a,b):
    A = np.random.rand(a,b)
    return A.T@A

if __name__ == '__main__':
    memory_limit(95)
    try:
        temp = ram_intense_foo(4000,10000)
        print(temp.shape)
    except MemoryError:
        sys.stderr.write('\n\nERROR: Memory Exception\n')
        sys.exit(1)

-4

Không có lý do để xem toàn bộ đầu ra của một khung dữ liệu lớn. Xem hoặc thao tác các tệp dữ liệu lớn sẽ không cần thiết sử dụng một lượng lớn tài nguyên máy tính của bạn.

Bất cứ điều gì bạn đang làm có thể được thực hiện trong thu nhỏ. Nó dễ dàng hơn nhiều khi làm việc về mã hóa và thao tác dữ liệu khi khung dữ liệu nhỏ. Cách tốt nhất để làm việc với dữ liệu lớn là tạo một khung dữ liệu mới chỉ chiếm một phần nhỏ hoặc một mẫu nhỏ của khung dữ liệu lớn. Sau đó, bạn có thể khám phá dữ liệu và thực hiện mã hóa trên khung dữ liệu nhỏ hơn. Khi bạn đã khám phá dữ liệu và làm cho mã của bạn hoạt động, sau đó chỉ cần sử dụng mã đó trên khung dữ liệu lớn hơn.

Cách dễ nhất chỉ đơn giản là lấy n, số hàng đầu tiên từ khung dữ liệu bằng hàm head (). Hàm đầu chỉ in n, số hàng. Bạn có thể tạo khung dữ liệu nhỏ bằng cách sử dụng chức năng đầu trên khung dữ liệu lớn. Dưới đây tôi đã chọn chọn 50 hàng đầu tiên và chuyển giá trị của chúng cho small_df. Điều này giả định BigData là một tệp dữ liệu đến từ thư viện bạn đã mở cho dự án này.

library(namedPackage) 

df <- data.frame(BigData)                #  Assign big data to df
small_df <- head(df, 50)         #  Assign the first 50 rows to small_df

Điều này sẽ làm việc hầu hết thời gian, nhưng đôi khi khung dữ liệu lớn đi kèm với các biến được định sẵn hoặc với các biến đã được nhóm. Nếu dữ liệu lớn là như thế này, thì bạn sẽ cần lấy một mẫu ngẫu nhiên của các hàng từ dữ liệu lớn. Sau đó sử dụng mã sau:

df <- data.frame(BigData)

set.seed(1016)                                          # set your own seed

df_small <- df[sample(nrow(df),replace=F,size=.03*nrow(df)),]     # samples 3% rows
df_small                                                         # much smaller df
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.