안녕하세요:)
혹시 여러분들은 RAM의 부족으로 인해 python으로 돌리려던 모델이 killed된 경우를 경험하신 적이 있으신가요? 최근 LLM이 점점 거대해지면서 이 LLM을 활용하다보면 RAM 메모리를 초과해 컴퓨터가 자동으로 실행을 중지시키는 일이 생기곤 합니다.
저 역시도 Flamingo를 돌려보던 중에 한국어 LLM이 너무 거대해 모델이 로드 되다 중간에 killed가 출력되면서 실행이 중단된 경험을 했습니다.
이런 문제를 해결하기 위해서는 다양한 방법이 있습니다.
1. 작은 모델을 사용한다.
2. FP16이나 huggingface 모델의 경우에는 load_in_8bit=True를 설정하면 8비트의 모델도 불러올 수 있습니다.
예시
from transformers import AutoModelForCausalLM
model_name = "EleutherAI/gpt-neo-2.7B"
model = AutoModelForCausalLM.from_pretrained(model_name, load_in_8bit=True, device_map="auto")
이러한 방법들 외에도 다양한 방법들이 있겠지만 제가 오늘 소개하고자 하는 방법은 바로 스왑(Swap)을 이용하는 것입니다.
스왑(Swap)은 운영 체제에서 RAM 부족 문제를 완화하기 위해 사용하는 메커니즘입니다. 이를 통해 활성 상태가 아닌 데이터를 디스크로 이동함으로써 RAM의 여유 공간을 확보하는 원리입니다.
스왑 공간
RAM이 가득 찼을 때, 사용하지 않는 데이터(예: 백그라운드에서 대기 중인 프로세스나 현재 비활성화된 프로그램의 메모리)를 하드 디스크(HDD)나 SSD의 스왑 공간으로 이동시킵니다.
이 스왑 공간은 디스크에 할당된 가상의 메모리로 동작합니다.
RAM에서 스왑으로 전환
RAM에서 당장 필요하지 않은 데이터를 스왑 공간으로 옮기고, 새로 필요한 데이터를 RAM에 로드합니다.
이를 통해 RAM에는 활성 상태의 데이터만 유지하게 됩니다.
스왑과 실제 메모리 사용
스왑은 느린 디스크 I/O를 사용하는 대신 RAM처럼 작동하므로, 메모리 부족으로 인해 발생하는 프로그램 중단(Killed) 을 방지합니다.
메모리 부족 상황 완화
큰 모델이나 데이터셋을 사용하는 상황에서 RAM이 부족하면, 일부 데이터를 디스크로 옮겨 추가 메모리를 확보합니다.
프로세스 종료 방지
RAM이 가득 차서 더 이상 데이터를 처리할 수 없을 때, 운영 체제가 메모리 부족을 이유로 프로세스를 강제 종료합니다.
스왑이 활성화되면, 비활성 데이터를 디스크로 옮기기 때문에 프로세스가 종료되지 않고 계속 실행됩니다.
GPU 메모리 관리와 병행
GPU가 모델 학습을 수행하는 동안 CPU에서 RAM이 부족할 경우, 스왑을 통해 메모리 부족 문제를 해결할 수 있습니다.
특히, Hugging Face 같은 대형 모델을 사용할 때 RAM 부담이 크기 때문에 스왑이 유용합니다.
속도 저하
디스크는 RAM보다 훨씬 느리기 때문에, 스왑 공간을 사용하는 동안 시스템 성능이 저하될 수 있습니다.
특히, HDD는 속도가 더 느리며, SSD를 사용하면 비교적 속도 저하가 덜합니다.
I/O 병목 현상
디스크 접근이 잦아지면, 디스크의 읽기/쓰기 속도가 느려져 병목 현상이 발생할 수 있습니다.
연속적 데이터 처리의 비효율
자주 사용하는 데이터를 디스크로 옮겼다가 다시 가져오는 과정에서 비효율이 발생합니다.
# 4GB 스왑 파일 생성 예시
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
스왑 크기 조정: RAM 부족 정도에 따라 스왑 공간의 크기를 적절히 설정합니다.
SSD 사용: 스왑을 HDD 대신 SSD에 설정하면 속도 저하를 줄일 수 있습니다.
필요 없는 프로세스 종료: 현재 실행 중인 불필요한 프로세스를 종료하여 RAM 사용량을 줄입니다.
메모리 효율 최적화:
모델을 효율적으로 로드하거나, 데이터 배치를 줄여 RAM 사용량을 최소화합니다.
예: Hugging Face의 max_memory 옵션을 사용해 모델의 메모리 사용량을 제어.
저는 스왑을 이용해 한국어 Bllossom 모델을 무사히 load하고 학습을 돌릴 수 있었습니다. 혹시나 위의 정보에 오류가 있다면 댓글로 피드백 주시면 반영하겠습니다. 감사합니다 :)