휴대폰 NPU로 LoRA 학습의 고정 가중치 역전파를 처리한다

First-Order LoRA Training with Phone NPUs

arXiv2610.24816v1

Xu Zheng2026-10-17

무엇인가

이 논문은 스마트폰에서 LLM을 개인 데이터로 파인튜닝할 때, LoRA를 써도 매 학습 스텝마다 고정된 베이스 모델 가중치와의 행렬곱이 세 번 발생한다는 점을 문제로 잡는다. 순전파의 XW^T, 활성 재계산, 역전파의 입력 기울기 dYW가 모두 같은 동결 가중치를 읽는다. 스마트폰 NPU는 추론을 위해 이 가중치를 이미 상주시키지만 추론 API는 입력 기울기를 지원하지 않는다. 저자들은 이 세 곱을 NPU에서 처리하고 학습 그래프·어댑터·옵티마이저는 CPU에 남기는 분할 구조를 제안한다.

어떻게 동작하나

구조의 핵심은 동결 투영마다 방향 플래그가 있는 하나의 연산을 NPU 서비스에 노출하는 것이다. CPU 쪽 커널 플래너가 지원 가능한 형상과 토큰 버킷을 시작 시 검증하고, 지원하지 않는 형상은 완전한 순전파·역전파를 제공하는 CPU 부동소수점 구현으로 보낸다. 이렇게 하면 동적 학습 그래프와 순환 레이어, 옵티마이저를 NPU 컴파일러로 옮기지 않아도 된다.

무엇과 다른가

FP16 역전파 커널은 상주 W를 복사해 전치하지 않고 DMA로 행 윈도를 VTCM에 스트리밍한 뒤 HVX로 전치 타일을 만든다. Q8 타일에서는 별도 양자화 전치본을 만들지 않고 HMX의 두 피연산자 역할을 맞바꿔 (dX_base)^T = W^T dY^T를 계산한다. 이때 순전파 디퀀타이저를 그대로 재사용해 순전파와 역전파가 같은 유효 가중치를 보게 한다. 정밀도는 기울기 민감도에 따라 투영 유형별로 고른다. 순환 GDN 상태가 양자화 오차를 이후 토큰으로 전파하므로 순환 투영은 FP16, 어텐션·MLP는 Q8로 두고, 어텐션만 있는 모델은 전부 Q8을 쓴다. 가중치가 양자화되어도 활성은 부동소수점으로 유지한다. FP16 출력의 언더플로·오버플로에는 행별로 2의 거듭제곱 배율을 적용해 최대 절댓값을 2^12 근처로 맞추고, 부분합이 비유한이거나 60,000에 닿으면 해당 행만 2^-8씩 최대 세 번 재전송한다.

어떻게 쓰나

CPU-NPU 런타임은 GDN 순환, LoRA 분기, vocabulary head를 각각 융합한 autograd 노드로 묶어 남은 CPU 작업을 줄인다. GDN 노드는 causal convolution, SiLU, normalization, gate, delta update, gated RMS normalization을 합치고 순환 상태는 FP32로 유지하며 16토큰마다 체크포인트한다. LoRA 노드는 rank-16 곱, dropout, scaling, addition을 합쳐 NPU 요청과 겹쳐 실행한다. 활성 저장량은 설정 상한과 가용 메모리 중 작은 값으로 제한하고, 예산을 넘는 레이어는 같은 NPU 인터페이스로 재계산한다. 한 번에 NPU 요청 하나만 비행 중이며, 옵티마이저 스텝 경계에서 CPU 상태를 저장해 일시정지·재시작 후 마지막 커밋부터 재개한다. 열 제어는 Android 열 상태 2 또는 배터리 40도에서 멈추고 상태 1 이하이면서 38도 이하일 때 재개한다.

전제와 한계

평가는 Snapdragon 8 Elite의 Hexagon V79를 쓰는 OnePlus 13T(P1)와 Snapdragon 8 Elite Gen 5의 V81을 쓰는 OnePlus 15(P2)에서 했다. Qwen3.5-4B/2B/0.8B, Qwen3-4B, Llama-3.2-3B를 대상으로 온폰 라벨을 쓰는 야간 개인화와 LaMP-2 영화 태깅을 실험했다. 두 휴대폰 모두 야간 업데이트 222 옵티마이저 스텝을 완료했고, 겹침 실행 시 P1에서 7.82·7.87시간, P2에서 8.09시간이 걸렸다. LaMP-2 전체 에폭은 모델 크기에 따라 3.09~9.06 활성 시간이었다. 여섯 번의 야간 실행은 모든 스텝 손실과 최종 어댑터가 비트 단위로 같았고 서비스 재시작·행 재시도·융합 연산 폴백이 없었다. LaMP-2에서 휴대폰 학습 어댑터는 세 모델 모두 GPU 학습 어댑터와 1.01%p 이내였고 베이스 모델보다 21~29점 높았다. 175개 다음날 세트에서는 103개(58.9%)를 맞혀 GPU 참조 108개(61.7%)와 p=0.23으로 유의차가 없었다.

성능 분해에서는 P1의 3,431토큰 배치에서 GDN·LoRA·헤드 융합이 CPU 스텝을 361.0초에서 251.4초로 줄였고, 동기 NPU 오프로드가 62.4초까지 낮춰 전체 5.79배, 오프로드만 4.03배 개선을 냈다. 같은 형상에서 HMX는 FP16 가중치로 P1 4.65 TFLOPS, P2 약 5.3 TFLOPS를 냈고 CPU는 0.178·0.780 TFLOPS였다. 겹침 실행은 P1 스텝을 65.3초에서 59.8초, P2에서 60.2초에서 52.4초로 줄였고 손실은 동일했다. 에너지는 같은 배치에서 토큰당 0.2275J로 최적화 CPU C3의 32.2%, C0의 25.3%였다. 정밀도 정책으로 Q3.5-4B 상주 가중치는 4.74GB(FP16 순환 2.02GB, Q8 2.72GB)로 전부 FP16일 때 7.14GB보다 작아졌다. 휴대폰 GPU LoRA 학습인 Fabric과 비교하면 L3.2-3B에서 P1 72.9토큰/초, P2 65.1토큰/초로 각각 18.7배·12.8배 빨랐다. 순전파만 쓰는 MeZO는 최대 37.86%·36.99%·34.83%에 그친 반면 휴대폰 역전파 1에폭은 58.96%·57.51%·61.13%를 냈다.

개발자 입장에서 이 논문은 NPU를 추론 전용으로만 두지 않고, 추론 엔진이 이미 상주시킨 가중치와 디퀀타이저를 역전파에 재사용하는 설계를 보여준다. 다만 구현은 수정한 llama.cpp ggml Hexagon 백엔드와 Qualcomm Snapdragon V79/V81에 묶여 있고, 모델별 투영 목록·체크포인트 이름·비투영 CPU 연산·정밀도 설정을 제공해야 한다. 지원하지 않는 형상은 CPU로 떨어지고, Q8의 기울기 오차를 피하려면 순환 투영을 FP16으로 올려 상주 메모리를 더 써야 한다. 저자들도 4B 모델의 전체 야간 업데이트는 외부 쿨러가 있는 P1·P2에서 완료했고, 쿨러 없이 P2에서는 열 페이싱으로 313,592토큰·46스텝을 3.22시간에 처리하는 배경 작업 경로를 보였다고 밝힌다. Qwen3.5-9B는 P1에서 248개 투영 8.87GB를 적재하고 232개 시작 검사를 통과했지만 가용 메모리가 10.2GB에서 1.5GB로 줄어, 대형 모델 학습의 메모리 여유는 별도 확인이 필요하다.