memopro
프로젝트 소개
제가 학업용으로 사용 중인 8GB 맥북에서 7B 모델과 같이 물리적으로 불가능한 모델 구동을 양자화 없이 학습, 개발 등을 해보고 싶어서 개발한 라이브러리입니다.
https://crates.io/crates/memopro
https://pypi.org/project/memopro/
개발자가 사용 중인 메모리(하드웨어)보다 크면 보통 양자화(출력이 바뀜)나 OS 스왑(상한 없음, 디스크 쓰기, 시스템 멈춤, 결과적으로 쓰기 작업으로 인해 SSD 수명이 감소함) 중 하나를 고를 수밖에 없게 되는 것 같습니다. 이런 불편함과 하드웨어의 한계를 극복해보고자 memopro는 지금 안 쓰는 데이터를 메모리에서 비우고 필요할 때 무손실로 되돌립니다. 가중치는 원본 파일에서 다시 읽고(해시 검증), 나머지는 무손실 압축합니다.
memopro 라이브러리로 달성하고자 한 궁극적인 목표들입니다.
- 결과 불변: 생성·추론 출력이 일반 실행과 비트 단위로 같고, 학습 손실은 예산과 관계없이 같음 (제한적인 메모리 하드웨어 환경 속에서 OOM 없이 원활한 구동을 위해서 보통 양자화를 진행하는데, 양자화를 하게 되면 손실이나 출력 등의 결과물에 손실이 발생하거나 원본 대비 성능 하락의 문제가 발생)
- 메모리 상한: 지킬 수 없는 예산이면 시작 전에 거부, 메모리 전체를 쓰는 것이 아니라 메모리 상한선을 직접 설정해주고 그 상한선 안에서 구동
- 디스크 쓰기 없음: 스왑이나 캐시 파일을 만들지 않음, SSD 쓰기를 하지 않음으로 인해 SSD의 수명이 줄어들지 않음
memopro 라이브러리의 사용법
- memopro.finetune(model, texts, budget="2.5GiB"): 메모리보다 큰 LLM의 16비트 LoRA 학습 (결과는 표준 PEFT 어댑터)
- memopro.generate(model, prompt, draft=...): 작은 초안 모델로 속도를 높여도 출력은 큰 모델 단독과 동일
- memopro run --budget 1GB script.py: 기존 NumPy/PyTorch 스크립트를 수정 없이 상한 안에서 실행
- memopro check MODEL: 실행 전에 예산에 들어가는지 진단
제가 테스트해본 memopro 측정 결과들은 다음과 같습니다.
- Qwen2.5-7B LoRA, M1 8GB: 예산 2.5GiB, batch=4에서 15.5토큰/초
- Qwen2.5-3B LoRA, M1 8GB: 20토큰/초 (같은 조건에서 mlx-tune은 메모리 부족으로 실행 불가)
- Qwen2.5-7B 생성, M1 8GB: 초안 모델 사용 시 8.95 → 2.37초/토큰, 출력 동일
- NumPy·scikit-learn 스크립트, 필요 메모리의 50
75% 상한(Linux): 결과 동일, 1.13.4배 시간
memopro 라이브러리의 한계
- 느립니다. 모델이 메모리에 들어가면 Unsloth·mlx-tune이 훨씬 빠르고, 정확도 손실이 괜찮다면 QLoRA가 낫습니다. memopro는 "아예 못 돌리던 크기"나 "양자화 없는 기준선"이 필요할 때를 위한 도구입니다.
- 메모리를 크게 넘을수록 저장 장치 속도에 묶입니다 (T4에서 14B 16비트 LoRA 약 1토큰/초).
- 무작위 접근이 많은 데이터 작업(정렬, 조인 등)은 크게 느려질 수 있습니다.
- 알파 버전입니다. macOS(Apple silicon), Linux(CUDA/CPU)를 지원하고 Windows는 일부 기능만 됩니다.
설치: pip install "memopro[llm]"
README에 0.5B 모델로 1~2분 안에 돌려 볼 수 있는 예제가 있습니다.
라이선스 MIT/Apache-2.0. 써 보시고 막히는 부분이나 이런 작업에도 쓸 수 있으면 좋겠다는 의견 주시면 감사하겠습니다. 그리고 많은 피드백이나 기능에 대한 조언 해주시면 향후 지속적으로 업데이트하겠습니다!
memopro
imhyensuk/memopro
him21176@gmail.com