AWS EC2 볼륨 늘리기 + 가상환경(venv)으로 디스크 공간 사용해서 메모리 부족 해결하기
발생한 문제 및 배경
AI 모델 2개를 서빙하기위해 환경설정을 하고 라이브러리를 설치하는데
최초에 할당한 12G 메모리로는 용량이 턱없이 부족했다
AWS EC2 - g4dn.xlarge 인스턴스, ubuntu 22.04
Python 사용
해결 과정 1 - EBS 볼륨 늘리기
AWS EC2에서 해당 인스턴스를 '수정'하여 볼륨 크기를 늘린다.
=> AWS에서 볼륨 크기가 정상적으로 늘어난 것 확인 가능
인스턴스에 접속해서 df -h로 확인하면 /dev/root 에 12G만 존재함
lsblk 로 현재 EC2 인스턴스의 디스크 상태를 보면:
- nvme0n1: 전체 18GB EBS 볼륨
- nvme0n1p1: 11.9GB로 마운트된 루트 파티션
→ EBS는 18GB로 늘어났지만, 파티션(nvme0n1p1)이 여전히 12GB로 설정되어있다.
따라서 파티션(nvme0n1p1)의 크기를 조정해야한다.
1. growpart로 파티션 크기 확장
sudo growpart /dev/nvme0n1 1
2. resize2fs로 파일 시스템 확장
sudo resize2fs /dev/nvme0n1p1
디스크 크기를 늘렸다고 파일 시스템에도 그 내용이 바로 반영되진않는다.
따라서 디스크 확장 후에 파일 시스템에서도 디스크의 변화를 알 수 있도록 위 명령어를 수행해야한다.
성공적으로 EBS 디스크 → 파티션 → 파일시스템까지 모두 확장
된 것을 확인할 수 있다.
그럼에도 CUDA와 AI 모델 서빙을 위한 라이브러리를 install 하니까 용량이 부족했다.
해결 과정 2 - 디스크 메모리 사용하기
EBS 루트 볼륨만을 사용했기 떄문인데,
추가로 존재하는 116GB의 디스크를 활용하지 않아서였다. (디스크 용량도 있는지 처음 알았어요 .... 아무래도 AWS를 처음 써봄ㅜ)
디스크 공간을 설정한 과정은 아래와 같다.
1. 새로운 디스크 포맷 및 파일시스템 생성
2. 디스크 마운트 디렉터리 생성 및 마운트
3. CUDA 라이브러리 디스크로 이동
4. 재부팅 후에도 자동 마운트 설정
df -h 명령어를 통해
/dev/nvme1n1이 /mnt/fastdisk에 정상 마운트된 것을 확인할 수 있다.
이제 이 경로에 Python 가상환경인 venv를 생성하면 된다.
먼저, 경로로 이동한다.
cd /mnt/fastdisk
python3-venv를 사용하여 가상환경을 생성하고 활성화한다.
python3 -m venv venv
source venv/bin/activate
이제 (venv) ubuntu@ip-172-********:/mnt/fastdisk $ 와 같은 (venv)가 붙은 가상환경을 확인할 수 있다.
이곳에서 git clone 레포지토리도 하고,
필요한 라이브러리, 패키지도 받아서 환경을 설정하면 된다.
이후에 다시 ssh 로 인스턴스에 접속할 때에도 항상 source 명령어를 통해
source /mnt/fastdisk/venv/bin/activate
가상환경을 켜야한다는 점을 잊지말자.
마무리 - Swap을 사용하지 않은 이유
1. 메모리 몇기가 추가로 해결될 용량이 아니었다. 라이브러리의 용량과 지속적으로 저장되고 삭제될 영상의 용량까지 고려했을때 상당히 많은 (10G 이상) 용량이 필요했다.
2. 우리 프로젝트는 실시간성과 자원효율성을 매우 중요하게 여겼다. 따라서 AI 모델 서빙과 같은 고성능 작업에서는 계속 전환이 발생하는 Swap 방식이 비효율적이라고 생각했다. 따라서 성능 저하를 방지하기위해 가상환경을 택했다.