RAM이 없을 때 Jupyter Lab이 컴퓨터를 정지시킵니다. 어떻게 방지 할 수 있습니까?


12

나는 최근 Jupyter Lab을 사용하기 시작했으며 문제는 상당히 큰 데이터 세트로 작업한다는 것입니다 (일반적으로 데이터 세트 자체는 컴퓨터 RAM의 약 1/4입니다). 새로운 파이썬 객체로 저장된 몇 가지 변환 후에 메모리가 부족합니다. 문제는 사용 가능한 RAM 제한에 접근하고 컴퓨터가 정지하는 다른 RAM 공간이 필요한 작업을 수행 할 때이 문제를 해결하는 유일한 방법은 다시 시작하는 것입니다. Jupyter Lab / 노트북의 기본 동작입니까, 아니면 설정해야합니까? 일반적으로 전체 컴퓨터가 아닌 RStudio와 같이 프로그램이 중단 될 것으로 예상합니다.


나는 전에 같은 문제가 있었는데 정말 불쾌합니다. 나는 jupyter 문제를 간략히 살펴 보았고 아무것도 발견하지 못했습니다. IPython (일반 파이썬이 아닌) 콘솔을 통해 실행되는 경우에도 발생합니까?
Bzazz

어떤 패키지 / 모듈을 사용 했습니까? 어떤 OS입니까? 교환 했습니까? Jupyter Lab의 버전은 무엇입니까? 리눅스라면 커널 버전은 무엇입니까?
Nizam Mohamed

주로 팬더이지만 패키지와 관련이 있다고 생각하지 않습니다. OS는 Ubuntu 16.04.6 LTS이고 커널 버전은 4.15.0-65-generic입니다. Jupyter Lab 버전은 1.0.2입니다. RAM의 1.5 인 SWAP를 12GB (2 개의 파일에 할당)로 설정했습니다.
jakes

답변:


5

이 문제에 대한 가장 강력한 해결책은 Docker 컨테이너를 사용하는 것입니다. Jupyter에 할당 할 메모리 양을 지정할 수 있으며, 컨테이너에 메모리가 부족한 경우에는 큰 문제가 아닙니다 (자주 저장하는 것을 기억하십시오).

이 블로그 는 가장 많은 정보를 제공합니다. 또한 무료로 제공되고 공식적으로 유지 관리되는 Jupyter 이미지 중 하나에서 Jupyter Lab을 설정하는 적절한 지침이 있습니다.

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

docker run튜토리얼에서 설명한대로 명령을 수정할 수 있습니다 (예 : 3GB).

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

도커 메모리 옵션에 대한 구문은 다음 질문을 참조하십시오.

docker는 "--memory"옵션을 실행하는 단위는 무엇입니까?


4

Ubuntu를 사용하는 경우 OOM 킬러를 확인 하십시오. 여기 에서 정보를 얻을 수 있습니다

earlyoom 을 사용할 수 있습니다 . 당신이 원하는대로 예를 들어, 구성 할 수 있습니다 earlyoom -s 90 -m 15시작됩니다 earlyoom및 스왑 크기가 작은 90 % 이상을하고 메모리가 적은 15 % 이상, 그 원인은 OOM하는 프로세스를 종료하고 동결 전체 시스템을 방지 할 수있을 때. 프로세스의 우선 순위를 구성 할 수도 있습니다.


2

또한 Jupyter Lab에서 매우 큰 데이터 세트 (3GB)로 작업하며 Labs에서도 동일한 문제가 발생했습니다. 사전 변환 된 데이터에 대한 액세스를 유지해야하는지 확실하지 않습니다. 그렇지 않은 경우 필요없는 del미사용 큰 데이터 프레임 변수를 사용 하기 시작 했습니다. del메모리에서 변수를 제거합니다. 편집 ** : 내가 겪고있는 문제에 대한 여러 가능성이 있습니다. 원격 jupyter 인스턴스를 사용할 때와 대규모 변환을 수행 할 때 스파이더 에서도이 문제가 더 자주 발생합니다.

예 :

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

Jakes 대규모 데이터 워크 플로 에서이 스레드가 도움 이 될 수도 있습니다. 메모리 저장을 돕기 위해 Dask 를 살펴 보았습니다 .

스파이더와 jupyter에서 대형 메모리 콘솔이 실행되는 동안 다른 콘솔에서 작업 할 때 일반적으로 정지가 발생한다는 것을 알았습니다. 왜 충돌하지 않고 멈추는 지에 관해서는 이것이 커널과 관련이 있다고 생각합니다. IPython github에 몇 가지 메모리 문제가 있습니다 -# 10082 및 # 10117 이 가장 관련이있는 것 같습니다. 여기에서 한 명의 사용자가 jedijedi 에서 탭 완성 기능을 비활성화 하거나 업데이트 할 것을 제안 합니다.

10117에서 그들은의 출력을 검사 할 것을 제안한다 get_ipython().history_manager.db_log_output. 동일한 문제가 있고 설정이 정확하지만 확인할 가치가 있습니다.


1

Google Colab과 같은 클라우드에서도 노트북을 사용할 수도 있습니다 . 권장 RAM을위한 기능을 제공했으며 Jupyter 노트북 지원이 기본적으로 제공됩니다.


0

덩어리를 사용해야한다고 생각합니다. 그렇게 :

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)

자세한 내용은 https://towardsdatascience.com/why-and-how-to-use-pandas-with-large-data-9594dda2ea4c를 확인 하십시오.

목록을 다시 추가하지 않는 것이 좋습니다 (RAM이 다시 과부하 될 것입니다). for 루프에서 작업을 완료해야합니다.


여기서 문제는 메모리 부족이 아니라 컴퓨터 충돌을 피하고 다시 시작 해야하는 방법입니다. 파이썬은 충돌하거나 메모리 오류를 발생 시키지만 모든 것을 망칠 수는 없습니다.
Bzazz

0

다음 질문에 대한 답변을 요약 하겠습니다 . 프로그램의 메모리 사용량을 제한 할 수 있습니다. 다음은이 기능 ram_intense_foo()입니다. 호출하기 전에 함수를 호출해야합니다limit_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

큰 데이터 프레임의 전체 출력을 볼 이유가 없습니다. 큰 데이터 프레임을 보거나 조작하면 불필요하게 많은 양의 컴퓨터 리소스가 사용됩니다.

당신이 무엇을하든 미니어처로 할 수 있습니다. 데이터 프레임이 작을 때 데이터 코딩 및 조작 작업이 훨씬 쉽습니다. 빅 데이터를 사용하는 가장 좋은 방법은 큰 데이터 프레임의 일부 또는 작은 샘플 만 가져 오는 새 데이터 프레임을 만드는 것입니다. 그런 다음 작은 데이터 프레임에서 데이터를 탐색하고 코딩을 수행 할 수 있습니다. 데이터를 탐색하고 코드가 작동하게되면 더 큰 데이터 프레임에서 해당 코드를 사용하십시오.

가장 쉬운 방법은 head () 함수를 사용하여 데이터 프레임에서 첫 n 행의 첫 번째 행 수를 가져 오는 것입니다. head 함수는 n 개의 행 수만 인쇄합니다. 큰 데이터 프레임에서 헤드 기능을 사용하여 미니 데이터 프레임을 만들 수 있습니다. 아래에서 처음 50 행을 선택하고 그 값을 small_df에 전달하기로 선택했습니다. 이는 BigData가이 프로젝트를 위해 연 라이브러리에서 가져온 데이터 파일이라고 가정합니다.

library(namedPackage) 

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

대부분의 경우 작동하지만 때로는 큰 데이터 프레임에 미리 정렬 된 변수가 있거나 이미 그룹화 된 변수가 있습니다. 빅 데이터가 이와 같으면 빅 데이터에서 임의의 행 샘플을 가져와야합니다. 그런 다음 다음 코드를 사용하십시오.

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.