아이폰에서 35B 파라미터 모델을 돌려봤습니다 (로컬 AI)

BBetter Stack
Computing/SoftwareConsumer ElectronicsCell Phones

Transcript

00:00:00이 350억 매개변수 모델은 제 아이폰에서 직접 구동되고 있으며, 초당 11개의 토큰을
00:00:06생성할 수 있습니다. 스마트한 엔지니어링 덕분에 원래 의도되지 않았던 환경에서 구동되는 것이죠. 이번 영상에서는
00:00:11여러분도 똑같이 할 수 있는 방법을 정확히 보여드리겠습니다. 제가 여기서 실행 중인 것은 전문가 혼합(MoE) 모델입니다.
00:00:21350억 개의 매개변수를 가지며, 일반적인 4비트 파일 기준으로 약 20GB 크기라 RAM에 상주해야 하지만
00:00:28필요에 따라 SSD에서 전문가를 스트리밍하는 기법 등을 통해, 실제로
00:00:33메모리에 상주해야 하는 가중치는 1.4GB에 불과합니다. 이 작동 원리를 설명한 뒤,
00:00:39아이폰 설정 과정을 직접 살펴보겠습니다. 대부분의 모델은 RAM에 전체가 상주하지만, 전문가 혼합
00:00:45모델의 뛰어난 점은 특정 시점에 일부분만 활성화된다는 것입니다. 즉, 비활성화된 부분은
00:00:51SSD에 대기하고 있다가 필요한 순간에 사용될 수 있습니다. 제한된 메모리에서 대형 모델을 구동하는 비결은
00:00:56필요할 때만 해당 전문가를 메모리로 스트리밍하는 것입니다. 우리는 Qwen
00:01:022.5 350억 매개변수 변형을 구동 중이며, 뒤의 'A3B'는 약 30억 개의 매개변수만
00:01:10단일 토큰 생성 시 활성화됨을 의미합니다. 40개 레이어로 구성되며, 각 레이어에는 256개의 소형 전문가와 1개의 공유 전문가가 있습니다. 라우터는
00:01:19토큰당 8개의 전문가를선택하므로, 단일 토큰은 전체 350억 개 중 약 30억 개의
00:01:26매개변수만 실행합니다. 모델 전체는 분할되어 작동합니다. 보통은 메모리에 다 올라가지만, 이는
00:01:32아이폰 용량에 들어가지 않습니다. 대신 모든 토큰에 필요한 부분, 즉 임베딩, 어텐션, 라우터,
00:01:39공유 전문가는 한 번만 로드되어 실행 내내 RAM에 상주합니다. 이는 약
00:01:441.4GB입니다. 그리고 각 300MB 정도인 40개 파일의 전문가들(총 12GB)은 SSD에 위치합니다. 따라서 각 토큰마다
00:01:53어텐션이 GPU에서 실행된 다음, 라우터가 8개의 전문가를 선택하면 엔진이 SSD에서 GPU 메모리로 직접 읽어와
00:02:00공유 전문가와 함께 실행합니다. 이 작업이 40개
00:02:06레이어 각각에서 일어나므로, 단 한 토큰마다 320번의 소규모 읽기가 발생합니다. 어텐션 개념이 생소하시다면,
00:02:14어텐션은 지금까지의 대화 내용을 다시 살펴보고
00:02:19다음 단어를 예측하는 데 이전의 어떤 단어가 중요한지 파악하는 부분입니다. 어텐션은 조건 없이 모든 토큰에서 실행되므로
00:02:25반드시 메모리에 유지되어야 합니다. 전문가는 어텐션이 맥락을 파악한 후,
00:02:31토큰에 대한 실제 사고를 담당하는 부분입니다. 하지만 전문가 중 8개만 사용되므로 나머지 전문가들은
00:02:36디스크에 그대로 두면 됩니다. 앱 내에는 전문가 캐시가 전혀 없습니다. 모든 읽기는 운영체제를 거치며
00:02:42iOS는 여유 RAM이 있는 한 최근 사용된 전문가를 자체 페이지 캐시에 유지합니다. 개발자들은
00:02:49원래 9.8GB 규모의 자체 캐시를 만들었다가 삭제했는데, 그 덕분에 속도가 38%나 향상되었습니다. 왜냐하면
00:02:55맥이나 아이폰에서는 앱이 확보하는 모든 RAM이 GPU와 페이지 캐시 모두로부터 빼앗아 온 것이기 때문입니다.
00:03:03이 캐시가 핵심적인 역할을 수행합니다. 초당 11개의 토큰 환경에서 모든 전문가를 플래시 메모리에서 가져온다면
00:03:09스마트폰은 초당 5GB 이상의 읽기 속도가 필요하지만, 아이폰 플래시는 초당 약 1.6GB만 지원합니다.
00:03:15따라서 대부분의 전문가는 OS가 관리해 주는 RAM에서 로드됩니다. 다음 기법은 계층형
00:03:22양자화입니다. 양자화는 모델의 가중치를 압축해 용량을 줄여주지만, 가중치의
00:03:29정확도를 떨어뜨려 성능에 영향을 줍니다. 그러나 이 모델에서는 약 25%의
00:03:35전문가가 작업의 약 80%를 처리합니다. 따라서 자주 쓰이는 전문가는 4비트로 유지하고, 자주 쓰이지 않는 전문가는
00:03:412비트로 양자화하여 용량을 44% 줄입니다. 전체 파일 크기는 약 19GB에서 13GB로 34% 축소되어
00:03:50아이폰의 페이지 캐시에 더 많이 상주할 수 있게 됩니다. 제 아이폰 17에서 이 모델은 생각 모드로 초당 11토큰을 처리합니다.
00:03:57다만, 단순히 안녕이라고 인사하는 것만으로도 스마트폰이 실제로 뜨거워집니다.
00:04:03손 안에서 열기가 느껴질 정도이니, 직접 테스트하실 때는 발열에 주의하세요. 사실 저는
00:04:08너무 복잡한 내용을 입력하기가 약간 두려운데, 이러다 손이 녹아내릴지도 모르니까요.
00:04:14현재 구동 중인 엔진은 Dan Woods의 FlashMoE 프로젝트입니다. 맥북용으로
00:04:19작성되었으며, 동일한 엔진을 아이폰 앱으로 감싼 FlashIOS라는 소형 iOS 포트 덕분에
00:04:26스마트폰에서 이 전체 프로세스를 구동할 수 있었습니다. 처음에는 모델의
00:04:31추론이 루프에 갇히는 버그를 겪었습니다. 처음엔 정상 작동하다가 10단어 정도 지나면 동일한 두 토큰을
00:04:35무한 반복했습니다. 이를 해결하기 위해 `async_preread_weight` 함수를 업데이트하여
00:04:41각 전문가의 읽기 크기를 해당 전문가의 용량과 비교하도록 했습니다. 2비트 전문가는 4비트의 절반 크기이므로
00:04:48수정 전에는 모든 2비트 전문가가 크기 검사에 실패하여 무시되었습니다. 결과적으로 모델이 전문가의
00:04:54절반만으로 구동되어 무한 루프에 빠졌던 것입니다. 이번 영상이 마음에 드셨다면 채널을
00:04:59구독해 주세요. 매일 무료 콘텐츠를 제작하는 데 큰 도움이 됩니다. 이제
00:05:05아이폰에 설정하려면, 저장소를 클론하고 앞서 언급한 미리 읽기 수정 사항을
00:05:11`metal_infer/infer.m`에 적용한 후 Xcode 프로젝트의 팀 및 번들 ID를 설정해야 합니다. 유료 애플
00:05:18개발자 계정이 필요합니다. 릴리스 빌드를 만들어 아이폰에 설치한 뒤, 약 13GB 크기의 패키징된
00:05:24계층형 모델을 다운로드합니다. USB를 통해 앱으로 전송하면 약 7분 정도 걸립니다.
00:05:30스마트폰에서 FlashMoE 앱을 열고 모델을 탭한 뒤 대화를 시작하세요. 만약 맥에서
00:05:36로컬 모델을 구동하여 더 빠른 초당 토큰 속도를 경험하고 싶다면 다음 영상을 확인해 보세요. 지금까지 Better Stack의 Warren이었습니다.
00:05:43시청해 주셔서 정말 감사드리며, 다음 영상에서 다시 뵙겠습니다.

Key Takeaway

MoE 구조의 필요한 부분만 RAM에 로드하는 스트리밍 기법과 계층형 양자화를 조합하여, 아이폰의 1.4GB RAM 상주 공간만으로 350억 매개변수 모델을 초당 11토큰 속도로 구동한다.

Highlights

  • FlashMoE 및 FlashIOS 엔진을 통해 아이폰에서 350억 매개변수(35B) 크기의 Qwen 2.5 MoE 모델을 구동할 수 있다.

  • 모든 토큰 생성 시 활성화되는 매개변수는 약 30억 개(A3B)이며, 필수 가중치 1.4GB만 RAM에 상주하고 나머지 12GB 전문가는 SSD에서 스트리밍한다.

  • 앱의 자체 캐시를 제거하고 iOS 페이지 캐시에 의존함으로써 모델 실행 속도를 38% 향상시켰다.

  • 자주 쓰이는 전문가는 4비트, 비선호 전문가는 2비트로 낮추는 계층형 양자화를 통해 모델 용량을 19GB에서 13GB로 34% 줄였다.

  • 아이폰 17에서 생각 모드 기준 초당 11개의 토큰을 생성하지만, 상당한 발열이 발생한다.

Timeline

아이폰 내 35B MoE 모델 구동 원리 및 메모리 구조

  • Qwen 2.5 35B A3B 모델은 단일 토큰을 생성할 때 350억 개 중 약 30억 개의 매개변수만 활성화한다.
  • 임베딩, 어텐션, 라우터, 공유 전문가 등 필수 요소 1.4GB만 RAM에 상주한다.
  • 40개 레이어의 256개 소형 전문가 가중치(총 12GB)는 SSD에 대기하다가 필요 시 GPU 메모리로 스트리밍된다.

일반적인 4비트 35B 모델은 약 20GB 용량이라 스마트폰 RAM에 전부 올릴 수 없다. 그러나 MoE(전문가 혼합) 구조에서는 라우터가 토큰당 8개의 전문가만 선택하므로 전체 가중치를 한 번에 메모리에 올릴 필요가 없다. 40개 레이어에서 매 토큰마다 8개의 전문가를 SSD에서 직접 읽어오며, 단일 토큰 생성 시 총 320회의 소규모 읽기 작업이 발생한다.

OS 페이지 캐시 활용 및 계층형 양자화 기법

  • 앱 자체 9.8GB 캐시를 삭제하고 iOS 페이지 캐시를 직접 활용하여 속도를 38% 개선했다.
  • 전체 작업의 80%를 처리하는 25%의 주요 전문가는 4비트로 유지하고 나머지는 2비트로 양자화한다.
  • 계층형 양자화 적용 시 모델 용량이 19GB에서 13GB로 34% 줄어들어 OS 캐시 상주 비율이 높아진다.

아이폰 플래시 메모리의 읽기 속도는 초당 1.6GB에 불과하므로 초당 11토큰을 처리하려면 OS 수준의 RAM 페이지 캐시 활용이 필수적이다. 앱이 메모리를 많이 차지하면 GPU와 페이지 캐시 용량을 모두 압축하기 때문에 자체 캐시를 제거하는 것이 속도 향상에 이롭다. 또한 전문가별 사용 빈도에 차등을 두는 계층형 양자화를 통해 가중치 용량을 크게 축소시켰다.

구동 성능, 무한 루프 버그 수정 및 Xcode 설치 과정

  • 아이폰 17에서 초당 11토큰 생성 속도를 기록하지만 높은 발열이 동반된다.
  • 2비트 전문가 크기 검사 오류로 발생하던 무한 반복 버그를 async_preread_weight 함수 수정으로 해결했다.
  • FlashMoE 저장소 클론 후 infer.m 코드 수정 및 유료 개발자 계정을 통한 Xcode 빌드가 필요하다.

Dan Woods의 맥북용 FlashMoE 엔진을 iOS용 FlashIOS 포트로 감싸 아이폰 구동을 구현했다. 초기에 발생한 토큰 무한 반복 현상은 2비트 전문가의 용량이 4비트의 절반이라 읽기 크기 검사에서 무시되었기 때문이며, 이를 수정하여 전체 전문가가 정상 로드되도록 만들었다. 13GB 크기의 모델 파일은 USB 전송을 통해 약 7분 만에 아이폰 앱 내부로 이식할 수 있다.

Community Posts

No posts yet. Be the first to write about this video!

Write about this video