70B 모델 전체를 파인튜닝하려면 700억 개 매개변수의 기울기를 계산하고, Adam의 모멘트처럼 매개변수 수의 2배가 더 드는 옵티마이저 상태를 들고, 순전파 동안 활성값도 저장해야 해. 추론 때보다 약 4–6배의 메모리가 필요하니 수백 GB의 GPU 메모리가 들어.
LoRA는 이 문제를 비켜가. 원래 가중치는 모두 얼리고 선택한 층에 작은 학습 가능 어댑터 행렬만 붙여. 학습할 매개변수가 99% 이상 줄면서 메모리도 함께 줄어 16 GB MacBook에서 7B, 사무실 Mac에서 70B 모델까지 파인튜닝할 수 있어.
핵심 수학은 행렬 둘이야
모양이 (d × d)인 가중치 W의 변화 ΔW를 ΔW ≈ A · B로 근사해. A는 (d × r), B는 (r × d)이고 LoRA 순위 r은 보통 8이나 16처럼 작아. d²개를 학습하는 대신 2 · d · r개만 학습하니 원래의 일부면 돼.
추론에서는 (W + A · B) · x를 계산해. 원래 W는 그대로고 어댑터 A · B가 학습한 보정을 더해. 두 행렬과 작은 순위, 구조 변경은 그게 전부야.
작은 어댑터가 충분한 이유
파인튜닝이 사전 학습 모델에 만들고 싶은 변화는 경험적으로 낮은 차원의 부분 공간에 모여 있어. 가능한 d² 공간 전체를 쓰는 건 대부분의 후속 작업에 지나쳐. 순위 16의 공간만으로도 필요한 변화를 거의 담아, 많은 벤치마크에서 LoRA는 매개변수 비용 1%로 전체 파인튜닝 품질의 90% 이상을 내.
이 수치가 전체 가중치 학습을 밀어낸 이유야. 보통의 지시 따르기와 도메인 적응에는 수학상 전체 파인튜닝을 고집할 이유가 거의 없어.
여섯 레슨의 길
데이터 준비, 학습 설정, 필요할 때 QLoRA와 DoRA로 올리는 법, 어댑터 결합, 자기 자료로 파인튜닝·결합·서빙하는 전체 흐름을 차례로 갈 거야. 32 GB Mac에서 7B 기반 모델로 전 과정을 편하게 돌릴 수 있어.
시작하기 전에 설치 하나만 챙겨. Hugging Face Hub에 올라간 데이터셋으로 학습하려면 pip install "mlx-lm[train]"이 필요해. 그냥 pip install mlx-lm만 하면 datasets 패키지가 빠져서, 아래 첫 명령이 ModuleNotFoundError: No module named 'datasets'로 멈춰.
Code
최소 LoRA 학습 명령·bash
# Train a LoRA adapter on a small base model with a HF-hosted dataset.
# This is the literal minimum to start; lesson 3 walks through every flag.
# A Hub dataset needs the training extra: pip install "mlx-lm[train]"
python -m mlx_lm lora \
--model mlx-community/Llama-3.2-1B-Instruct-4bit \
--train \
--data mlx-community/wikisql \
--iters 100 \
--adapter-path ./my-adapter
# Verified output (2026-09-15, mlx-lm 0.31.3, M3 Ultra Studio, abridged):
# Trainable parameters: 0.456% (5.636M/1235.814M)
# Iter 1: Val loss 3.424, Val took 3.459s
# Iter 10: Train loss 2.294, Learning Rate 1.000e-05, It/sec 1.554, ...
# Iter 50: Train loss 1.422, ...
# Iter 100: Val loss 1.398, Val took 2.035s
# Saved final weights to my-adapter/adapters.safetensors.
학습 뒤 어댑터 폴더 살피기·bash
ls ./my-adapter/
# adapters.safetensors — the trained LoRA weights (small file!)
# adapter_config.json — rank, alpha, layers, fine-tune type, etc.
# 0000100_adapters.safetensors — checkpoint at iter 100 (if --save-every fired)
# The adapter file is tiny compared to the base model:
du -sh ~/.cache/huggingface/hub/models--mlx-community--Llama-3.2-1B-Instruct-4bit/ # base
du -sh ./my-adapter/ # adapter
# Verified (2026-09-15): 680M base, 43M adapter after the 100-iter run above.
실행하기 전에 Llama-3.2-1B 기반 모델의 기본 16개 층에 순위 8 LoRA를 붙이면 학습 가능한 매개변수가 얼마나 될지 예측해. 어댑터가 붙는 각 선형 투영의 입력·출력 차원을 확인하고, 투영마다 r · (d_in + d_out)을 더해. 짧게 학습한 뒤 mlx-lm이 보고한 실제 학습 가능 매개변수 수와 비교하고 차이가 난 이유를 두 문장으로 적어.
Progress
Progress is local-only — sign in to sync across devices.