머신러닝 프로젝트를 진행하여 학습을 진행하는 과정에서 다음과 같은 오류가 출력되었을 때, 해결 방법에 대해 정리한다.
$ 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 문제가 깔끔하게 해결된 것을 확인할 수 있다.
'IT 개발자의 창고' 카테고리의 다른 글
Apple M1 Mac OS에 아나콘다 설치하기 (0) | 2022.07.25 |
---|---|
신규 mac으로 마이그레이션 이 후 기존 mac 공장 초기화 (0) | 2022.07.20 |
아나콘다 - 머신러닝 패키지 관리 및 배포 (0) | 2022.07.14 |
Machine Learning 이란? (0) | 2022.07.04 |
파이썬을 이용한 자료분석 (0) | 2022.06.07 |