스크립트
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시청해 주셔서 정말 감사드리며, 다음 영상에서 다시 뵙겠습니다.
커뮤니티 글
아직 글이 없습니다. 이 영상에 대한 첫 번째 글을 작성해 보세요!
이 영상에 대해 글쓰기