본문 바로가기

IT 개발자의 창고

ML 프로젝트 수행 시 allocate memory Error

머신러닝 프로젝트를 진행하여 학습을 진행하는 과정에서 다음과 같은 오류가 출력되었을 때, 해결 방법에 대해 정리한다.

 

$ CUDA_VISIBLE_DEVICES=0 python train_torch.py --train --max_epochs 3
.. 초반 생략 ..
RuntimeError: [enforce fail at CPUAllocator.cpp:68] . DefaultCPUAllocator: can't allocate memory: you tried to allocate 629145600 bytes. Error code 12 (Cannot allocate memory)

약 600Mb의 메모리 할당을 할 수 없어서 에러가 출력되었다.

 

현재 메모리 사이즈를 조회하면, Swap Memory가 충분하지 않음을 알 수 있다.

$ free -h
                total        used          free      shared  buff/cache   available
Mem:    801Mi        90Mi       137Mi       2.0Mi          573Mi       589Mi
Swap:         0B             0B           0B

 

본래 Swap은 OS가 RAM에 저장할 수 없는 데이터를 임시로 저장하기 위한 하드 드라이브의 영역이다. 대체로 RAM에 더 이상 사용할 공간이 없을 때 사용한다. OS는 오래 유지해야 하는 데이터에 대해 Swap memory 사용을 더 선호하며, CUDA 프로그래밍에서도 Swap memory 사용이 불가하여 상기와 같은 에러가 발생하게 된 것으로 판단된다.

 

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
... 중간 생략 ...
/dev/xvda2       30G   12G   18G  40% /

현재 "/" 파티션의 여유공간이 많으므로 Swap으로 생성할 수 있는 최대 size인 4GB의 공간을 생성해 보도록 한다.

 

Swap 생성

Swap file을 만드는 가장 좋은 방법은 지정된 크기의 파일을 즉시 생성하는 fallocate 프로그램을 사용하는 것이다.

 

$ sudo fallocate -l 4G /swapfile
$ ls -lh /swapfile
-rw-r--r--. 1 root root 4.0G 7월 13 05:25 /swapfile
$ sudo chmod 600 /swapfile
-rw-------. 1 root root 4.0G 7월 13 05:25 /swapfile

4GB의 용량의 swap file 이 생성되었고, 보안상 root 권한만 접근할 수 있도록 변경하였다.

 

생성된 Swap file을 실제 Swap 공간으로 마킹하여 활성화하도록 한다.

 

$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
no label, UUID=44e7ab8b-ee7d-485c-954a-3c0ec5b94754
$ sudo swapon /swapfile
$ sudo swapon --show
NAME            TYPE SIZE USED PRIO
/swapfile file      4G   0B       -2
$ free -h
                      total        used        free      shared  buff/cache   available
Mem:          801Mi       128Mi   534Mi        16Mi       138Mi       541Mi
Swap:         4.0Gi          0B         4.0Gi

Swap이 성공적으로 설정되어 사용이 가능하다.

 

그러나, 여기까지의 설정만으로는 재부팅 이 후 Swap 설정이 유지되지 않는다. 영구적인 설정을 위해 다음과 같이 작업한다. (기존 파일은 backup)

$ sudo cp /etc/fstab /etc/fstab.bak
$ echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
/swapfile none swap sw 0 0

 

Swap 속성값 조정

Swap file은 RAM 대비 시간이 훨씬 오래 걸리고 성능이 크게 저하될 수 있기 때문에 Swap을 최대한 사용하지 않게 하면 시스템이 더욱 빨라진다.

swappiness 속성 (0% ~ 100% 범위)은 Ram의 여유공간을 지정하는 값으로 을 0에 가깝게 설정하면 커널은 절대적으로 필요한 상황이 아니면 Swap을 사용하지 않고 최대한 RAM을 사용한다. RAM을 최대한 사용하기 위해 다음과 같이 10%로 설정한다.

$ sudo sysctl vm.swappiness=10
vm.swappiness = 10
 

영구적으로 적용하기 위해 다음과 같이 "/etc/sysctl.conf" 파일에 직접 다음 라인을 추가한다.

... 상단 생략 ...
vm.swappiness=10

 

이제 다시 머신러닝 프로젝트를 수행하면 Memory 문제가 깔끔하게 해결된 것을 확인할 수 있다.