Distributing LLM inference in DwarfStar

Salvatore Sanfilippo

DwarfStar에서 LLM 추론 분산하기

원문은 Salvatore Sanfilippo님이 에 게재했습니다. 이 블로그 구독하기

고성능 NVIDIA 카드와 이를 구동하는 데 필요한 서버, 전력 비용은 엄청나다. 특히 초대형 모델을 돌릴 만큼의 VRAM을 확보하려 한다면 더더욱 그렇다. 지금까지 대안은 Apple 하드웨어 아니면 DGX Spark 정도였다. DGX Spark는 메모리 대역폭 때문에 심각하게 제약이 있긴 하지만, 그럼에도 LLM의 프롬프트 처리(prefill)는 충분히 빠르게 돌릴 수 있다. Mac Studio는 최대 512GB 통합 메모리를 제공했다. 메모리 대역폭은 다소 아쉽지만(Spark보다는 훨씬 낫고) 연산 성능을 감안하면, 지금 상황을 고려했을 때 가격은 그럭저럭 합리적인 편이었다.

예를 들어 DwarfStar에서 Mac Studio M3 Ultra 512GB 모델은 DeepSeek v4 PRO를 프리필 150 t/s, 디코딩 약 10~13 t/s 속도로 구동할 수 있다. 훌륭한 수준은 아니지만 특정 용도에서는 쓸 만한 정도다. 2비트로 양자화해도 DeepSeek v4 PRO는 매우 잘 버틴다. 같은 양자화 수준의 Flash처럼 말이다(오늘 PRO에게 C 컴파일러를 작성하게 해봤는데, 영상은 곧 공개할 예정이다). 약 1만 2천 달러 정도의 비용으로 프론티어 모델을 집에서 돌릴 수 있다는 것 자체가 결코 사소한 일이 아니라고 본다.

앞으로 점점 더 나아지리라 기대할 수도 있겠지만, 전망은 흐릿해 보인다. NVIDIA 구성이 더 저렴해질 가능성은 거의 없고, 작은 회사조차 로컬 추론을 위해 소규모 데이터센터를 들이고 운영하는 걸 쉽게 감당할 수 없다. 동시에 RAM 공급 부족으로 인해 M5 Ultra를 탑재한 Mac Studio, 이를테면 1.2T/s 메모리 대역폭과 더 강력한 연산을 갖춘 모델을 보게 될 가능성은 그리 높지 않아 보인다(M5 Max만 해도 이미 연산 성능은 더 빠르고, 각 GPU 코어 안에 특정 모델에 도움이 되는 Neural Accelerator를 탑재하고 있다).

결국 지금 로컬 추론 상황에서 가장 좋은 머신은 아마도 노트북일 것이다. M5 Max 128GB 모델은 DeepSeek v4 Flash와 Mimo V2.5를 2비트 양자화 상태로도 꽤 준수한 프리필 및 디코딩 속도로 구동할 수 있다. 프리필 약 500 t/s, 디코딩 약 35~40 t/s 정도를 말하는 것으로, 컨텍스트 길이가 길어질 때의 성능 저하 곡선도 매우 양호한 편이다. 구성에 따라 6천~7천 달러 정도의 비용으로, 현재로서는 가장 가성비 좋은 선택 중 하나다.

상황이 이렇다면, 일반적인 로컬 추론 프로젝트에서, 특히 DwarfStart의 경우 분산 추론을 고민해 볼 만하다. MacBook M5 Max 시스템이 두 대, 세 대, 네 대 있다면 무엇을 할 수 있을까? 혹은 512GB RAM을 탑재한 M3 Ultra 두 대가 있다면?

전통적으로 분산 추론을 하는 방식은 크게 두 가지가 있다. 하나는 메모리를 분할하는 방식으로, 컴퓨터 A에 트랜스포머 레이어의 50%를, 나머지 50%를 컴퓨터 B에 올려 추론을 순차적으로 실행하는 것이다. 이 경우 주고받아야 할 것은 활성화값(activation)뿐이라 개념적으로 매우 단순하다. 약간의 마이크로 배칭 트릭을 더하면 단순히 메모리를 두 배로 늘리는 것을 넘어 이론상 프롬프트 처리 속도까지 크게 높일 수 있다(다만 디코딩은 해당하지 않는다. 단일 토큰을 생성할 때는 머신 A의 앞쪽 레이어를 기다렸다가 머신 B의 나머지 레이어를 기다리는 식으로 순차 진행해야 하기 때문이다 — 그래도 발열이 줄어드는 만큼 지속적인 부하를 걸 수 있다는 장점은 있다). 이는 결코 나쁘지 않은 방식이다. 예를 들어 운 좋게 Mac Studio 512GB 두 대를 가진 사람이라면 DeepSeek v4 PRO 풀사이즈 모델을 돌릴 수 있고(물론 2비트 양자화 모델도 이미 아주 잘 동작하긴 하지만), 마이크로 배칭을 통해 더 빠른 프리필 속도까지 누릴 수 있다는 뜻이다.

다른 접근법은 Apple RDMA를 이용해 두 머신에 걸쳐 실행을 병렬화하는 것으로, 사실상 수직 분할(vertical split)이다. 예를 들어 머신 A와 B에 동일한 2비트 양자화 모델을 올려 양쪽 모두에 들어가도록 하고, 각 머신이 모든 routed expert를 갖게 하는 방식을 시도해 볼 수 있다. 그러고 나서 각 레이어마다 필요한 조율을 통해 절반의 expert는 머신 A에서, 나머지 절반은 머신 B에서 실행하는 식이다(두 머신 모두 모든 expert를 가지고 있으므로 라우터가 무엇을 선택하든 연산의 50%를 다른 머신으로 보낼 수 있고, 이때 주고받는 활성화값은 매우 작다). 이 방식은 routed expert의 크기가 훨씬 큰 PRO 모델에서 더 현실적이어서 통신 비용 부담이 덜하다. 다만 이걸 정말 잘 동작하게 만들 수 있을지는 아직 지켜봐야 할 일이다.

텐서 병렬성(tensor parallelism)도 있지 않냐고 생각할 수도 있겠다, 맞나? 하지만 두 대의 Apple 컴퓨터, 혹은 두 대의 DGX Spark 사이에서 확보할 수 있는 통신 속도로는 전혀 현실성이 없다고 장담한다(NVLink 속도를 한번 찾아보라). 위 두 방식의 묘미는 주고받아야 할 데이터가 매우 적다는 데 있다.

자, 여기까지 읽으면 ‘이건 LLM을 병렬로 돌리는 것에 대해 누구나 다 아는 뻔한 얘기 아니냐’고 생각할 것이다. 실제로 그렇다. 하지만 이 글은 바로 이 지점에 도달하기 위해 쓰였다. 두 대의 Mac이나 DGX를 완전히 다른 방식으로 병렬화할 수 있다면 어떨까? 오픈 가중치 모델들은 지금 황금기를 맞고 있다. 선택지는 풍부하고, 그중 상당수는 매우 강력하다. 128GB 환경의 2비트 양자화 모델 중에도 흥미로운 모델이 많다. Minimax M2.7, Mimo V2.5, DeepSeek v4 Flash 등 몇 가지가 그렇다. 동시에 최근에는 LLM 앙상블(https://arxiv.org/abs/2502.18036)이 거의 연구되지 않은 가능성으로 주목받았다. 두 모델을 두 머신에서 완전히 독립적인(shared-nothing) 방식으로 실행한 뒤, 마지막에 로짓(logits)을 결합하거나 더 나은 이어짐을 선택하기만 하면 되는 방식이다. 방법은 여러 가지가 있고, 두 모델의 어휘(vocabulary)가 달라도 동작한다. 당혹도(perplexity)가 더 낮은 쪽의 이어짐을 고르는 방식이 있는데, 즉 더 확신하는 모델을 선택하는 것으로, 라우팅이 암시적으로 이루어지는 2개 전문가 MoE와 비슷하다고 볼 수 있다. 서로 다른 어휘 때문에 약간의 복잡성은 있지만 로짓을 결합해 거기서 샘플링하는 것도 가능하다. 더 최근 논문들은 두 기법을 섞는 것이 가장 좋다고 제안한다. 어쨌든 이 기법들은 실제로 효과가 있는 것으로 보인다. 모델들이 단독으로 동작할 때보다 더 나은 성능을 낸다. 각자 다음에 무슨 말을 할지에 대한 자신만의 관점을 가져와 지식이 보완되는 것처럼 느껴진다.

아마도 이것이 기존의 두 가지 외에 시도해 볼 만한 가장 논리적인 세 번째 접근법일 것이다. 앞으로 몇 달 안에 이 모든 것을 더 실험해 볼 시간을 꼭 내고 싶다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글