레이블이 Mac Cluster인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Mac Cluster인 게시물을 표시합니다. 모든 게시물 표시

2026/06/16

MacBook Pro M4 Max + Mac Studio M4 Max => RDMA 클러스터로 로컬 LLM 실행하기

서문

Apple Silicon Mac 두 대를 연결하면 강력한 로컬 LLM 클러스터를 구축할 수 있습니다. MacBook Pro M4 Max 64GB와 Mac Studio M4 Max 64GB를 Thunderbolt 케이블로 연결하고, Apple의 MLX 프레임워크에서 제공하는 JACCL 백엔드(RDMA over Thunderbolt)를 활용하면 두 기기의 GPU 성능을 합쳐 70B급 대형 모델을 로컬에서 실행할 수 있습니다.

이 가이드는 하드웨어 준비부터 SSH 설정, Thunderbolt RDMA 활성화, MLX 분산 추론 환경 구축, 그리고 mlx-lm을 통한 LLM 실행까지 전 과정을 단계별로 설명합니다.


1. 하드웨어 구성

사용 장비

두 기기의 주요 스펙은 다음과 같습니다.

구분 MacBook Pro M4 Max Mac Studio M4 Max
CPU 16코어 (12P+4E) 16코어 (12P+4E)
GPU 40코어 40코어
RAM 64GB 64GB
메모리 대역폭 546GB/s 546GB/s
Thunderbolt Thunderbolt 5 × 3 (최대 120Gb/s) Thunderbolt 5 × 4 (최대 120Gb/s)
이더넷 없음 (Thunderbolt 네트워크 사용) 10Gb Ethernet 내장
Wi-Fi Wi-Fi 6E Wi-Fi 6E

총 합산 메모리: 128GB, 총 GPU 코어: 80코어, 합산 메모리 대역폭: 1,092GB/s

이 사양은 70B급 모델을 4bit 양자화하여 두 기기에 분산 배치하기에 충분한 성능을 제공합니다.

필요한 장비

  • Thunderbolt 5 케이블 1개 (양쪽 USB-C to USB-C, 120Gb/s 지원)
  • 두 Mac 모두 같은 로컬 네트워크에 연결되어 있어야 함 (SSH 설정용)
  • Mac Studio: 10Gb Ethernet 포트가 있으므로 이더넷 케이블로도 연결 가능


2. 사전 준비

macOS 버전 확인

JACCL 백엔드(RDMA over Thunderbolt)를 사용하려면 macOS 26.2 (Sequoia 26.2) 이상이 필요합니다. 현재 macOS 버전을 확인하세요:

sw_vers

macOS 26.2 미만인 경우 Ring 백엔드(Thunderbolt over TCP)를 사용할 수 있습니다. 두 방식 모두 이 가이드에서 다룹니다.

SSH 키 설정 (비밀번호 없는 상호 인증)

두 Mac 간에 비밀번호 없이 SSH로 접속할 수 있어야 합니다. MacBook Pro에서 Mac Studio로, Mac Studio에서 MacBook Pro로 양방향 설정이 필요합니다.

MacBook Pro에서 실행

# SSH 키 생성 (아직 없다면)
ssh-keygen -t ed25519 -C "macbook-pro"

# Mac Studio의 IP 또는 호스트명으로 복사
ssh-copy-id user@mac-studio.local

# 연결 테스트
ssh mac-studio.local "hostname"
exit

Mac Studio에서 실행

# SSH 키 생성 (아직 없다면)
ssh-keygen -t ed25519 -C "mac-studio"

# MacBook Pro의 IP 또는 호스트명으로 복사
ssh-copy-id user@macbook-pro.local

# 연결 테스트
ssh macbook-pro.local "hostname"
exit

⚠️ 양방향 연결이 모두 정상 동작하는지 반드시 확인하세요. 양쪽 기기에서 서로의 호스트명으로 SSH 접속이 비밀번호 없이 되어야 합니다.


3. Thunderbolt RDMA 활성화 (JACCL용)

macOS 26.2 이상에서 RDMA over Thunderbolt를 활성화하려면 Recovery Mode에서 설정해야 합니다. 이 작업은 각 Mac에서 개별적으로 진행합니다.

  • Mac을 Recovery Mode로 부팅하기: 전원을 끈 후, 전원 버튼을 길게 누르고 '로딩 옵션을 표시하는 중...'이 나타날 때까지 유지한 후 놓기
  • 설정에서 현재 사용자의 디스크 암호 인증을 진행 (Apple Silicon은 이 단계 필요)
  • 메뉴 바에서 Utilities → Terminal 클릭
  • 터미널에서 다음 명령어 실행:
  • rdma_ctl enable
  • 정상적으로 실행되면 재부팅
# Recovery Mode 터미널에서 실행
rdma_ctl enable

# 재부팅 후 일반 macOS에서 확인
ibv_devices

성공 시 M4 Max 칩에서 다음과 같은 출력이 표시됩니다:

device         	node GUID
------         	----------------
rdma_en2       	8096a9d9edbaac05
rdma_en3       	8196a9d9edbaac05
rdma_en4       	8296a9d9edbaac05
rdma_en5       	8396a9d9edbaac05

⚠️ ibv_devices가 아무것도 출력하지 않거나 명령을 찾을 수 없다면 RDMA 활성화가 제대로 되지 않았습니다. Recovery Mode에서 다시 시도하세요.


4. MLX 및 mlx-lm 설치

두 Mac 모두에서 동일한 환경으로 설치해야 합니다. Python 가상 환경을 사용하는 것을 권장합니다.

# 두 Mac 모두에서 실행

# Python 가상 환경 생성
python3 -m venv ~/mlx-cluster
source ~/mlx-cluster/bin/activate

# MLX 및 mlx-lm 설치
pip install --upgrade pip
pip install mlx-lm

# 설치 확인
python -c "import mlx.core as mx; print(mx.__version__)"
mlx_lm.chat --help

⚠️ 두 기기의 MLX 버전이 정확히 동일해야 합니다. pip freeze로 버전 차이 없는지 확인하세요.


5. 클러스터 설정

두 가지 백엔드를 사용할 수 있습니다:

  • JACCL (권장): RDMA over Thunderbolt — 초저지연, 최대 성능
  • Ring: TCP over Thunderbolt — macOS 26.2 미만에서도 사용 가능

6. JACCL 백엔드 설정 (권장)

6-1. Thunderbolt 케이블 연결

MacBook Pro와 Mac Studio를 Thunderbolt 5 케이블로 직접 연결합니다. JACCL은 완전 연결(mesh) 토폴로지를 요구하므로, 2대의 경우 서로 1개 케이블로 충분합니다.

6-2. 연결 확인 및 자동 설정

MLX에서 제공하는 mlx.distributed_config 유틸리티로 연결을 확인하고 자동으로 설정할 수 있습니다. MacBook Pro에서 다음 명령어를 실행하세요:

# 연결 시각화 (GraphViz 필요)
mlx.distributed_config --verbose \
    --hosts macbook-pro.local,mac-studio.local \
    --over thunderbolt --dot | dot -Tpng | open -f -a Preview

# 자동 설정 + hostfile 생성
mlx.distributed_config --verbose \
    --hosts macbook-pro.local,mac-studio.local \
    --over thunderbolt --backend jaccl \
    --auto-setup --output cluster-jaccl.json

⚠️ --auto-setup 사용 시 sudo 비밀번호 없이 실행 가능해야 합니다. sudoers 설정이 되어 있지 않으면 명령어를 수동으로 따라야 합니다.

6-3. 수동 설정 (sudo 비밀번호 없는 경우)

--auto-setup 없이 실행하면 각 노드에서 실행해야 할 명령어가 표시됩니다. 각 Mac에서 해당 명령어를 sudo로 실행한 후 생성된 hostfile을 사용합니다.

# 자동 설정 없이 실행 → 명령어 출력
mlx.distributed_config --verbose \
    --hosts macbook-pro.local,mac-studio.local \
    --over thunderbolt --backend jaccl --output cluster-jaccl.json

6-4. 생성된 hostfile 확인

cluster-jaccl.json은 다음과 같은 구조를 가집니다:

[
    {
        "ssh": "macbook-pro.local",
        "ips": ["192.168.1.100"],
        "rdma": [null, "rdma_en2"]
    },
    {
        "ssh": "mac-studio.local",
        "ips": [],
        "rdma": ["rdma_en2", null]
    }
]

rdma 배열은 각 노드가 서로 어떤 RDMA 인터페이스로 연결되는지를 정의합니다. null은 자기 자신을 의미합니다.


7. Ring 백엔드 설정 (대안)

macOS 26.2 미만이거나 RDMA 활성화가 어려운 경우 Ring 백엔드를 사용할 수 있습니다. Ring은 TCP 소켓을 사용하므로 설정이 더 간단합니다.

# Thunderbolt over TCP 자동 설정
mlx.distributed_config --verbose \
    --hosts macbook-pro.local,mac-studio.local \
    --over thunderbolt --backend ring \
    --auto-setup --output cluster-ring.json

# 또는 Ethernet만 사용 (Thunderbolt 케이블 없이)
mlx.distributed_config --verbose \
    --hosts macbook-pro.local,mac-studio.local \
    --over ethernet --backend ring --output cluster-ring.json

Ring 백엔드는 JACCL보다 대역폭이 낮지만, 10Gb Ethernet이나 Thunderbolt over TCP로도 충분한 성능을 낼 수 있습니다.


8. 클러스터 테스트

실제 LLM을 실행하기 전에 클러스터 통신이 정상인지 테스트하세요.

import mlx.core as mx

world = mx.distributed.init()
x = mx.distributed.all_sum(mx.ones(10))
print(f"Rank {world.rank()}: all_sum result = {x}")

JACCL로 테스트

source ~/mlx-cluster/bin/activate
mlx.launch --verbose --backend jaccl \
    --hostfile cluster-jaccl.json \
    --env MLX_METAL_FAST_SYNCH=1 -- \
    python test_cluster.py

Ring으로 테스트

source ~/mlx-cluster/bin/activate
mlx.launch --verbose --backend ring \
    --hostfile cluster-ring.json \
    python test_cluster.py

두 노드 모두에서 Rank 0: all_sum result = [2, 2, 2, ..., 2]Rank 1: all_sum result = [2, 2, 2, ..., 2]가 출력되면 성공입니다.


9. 분산 LLM 추론 실행

9-1. mlx-lm을 통한 추론

mlx-lm은 MLX의 분산 기능을 자동으로 활용합니다. mlx.launch로 실행하면 각 노드의 GPU에 모델이 분산 배치됩니다.

# JACCL 백엔드로 70B 모델 분산 추론
source ~/mlx-cluster/bin/activate

mlx.launch --verbose --backend jaccl \
    --hostfile cluster-jaccl.json \
    --env MLX_METAL_FAST_SYNCH=1 -- \
    python -m mlx_lm chat \
    --model mlx-community/Meta-Llama-3.1-70B-Instruct-4bit

9-2. 권장 모델

128GB 총 메모리(64GB × 2) 환경에서 실행 가능한 모델:

모델 양자화 크기 비고
Llama 3.1 70B Instruct 4bit ~42GB 안정적 실행 가능
Qwen 2.5 72B Instruct 4bit ~43GB 한국어 지원 우수
Mistral Large 2 4bit ~46GB 고성능 추론
Llama 3.3 70B 4bit ~42GB 하이브리드 아키텍처
DeepSeek R1 0528 4bit ~47GB 추론형 모델

9-3. HTTP API 서버 실행

OpenAI 호환 API 서버를 클러스터에서 실행할 수 있습니다:

source ~/mlx-cluster/bin/activate

mlx.launch --verbose --backend jaccl \
    --hostfile cluster-jaccl.json \
    --env MLX_METAL_FAST_SYNCH=1 -- \
    python -m mlx_lm serve \
    --model mlx-community/Meta-Llama-3.1-70B-Instruct-4bit

서버가 시작되면 http://localhost:8080/v1/chat/completions 엔드포인트로 OpenAI 호환 API를 사용할 수 있습니다.

curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Llama-3.1-70B-Instruct",
    "messages": [
      {"role": "user", "content": "안녕하세요!介绍一下你自己"}
    ],
    "max_tokens": 512
  }'

10. 성능 최적화 팁

  • MLX_METAL_FAST_SYNCH=1 필수 설정: CPU-GPU 간 동기화 속도를 높여 분산 통신 성능을 크게 개선
  • 모델은 mlx-community에서 4bit 양자화된 버전을 사용: 메모리 효율이 가장 좋음
  • MacBook Pro는 전원에 연결한 상태로 실행: 성능 제한 방지
  • --max-kv-size 4096 또는 더 큰 값을 설정하여 긴 컨텍스트 처리 성능 향상
  • 모델을 로컬에 미리 다운로드: mlx_lm.download --model ~로 사전 다운로드

wired_limit_mb 설정 (대형 모델용)

모델 크기가 시스템 RAM을 초과할 수 있는 경우 macOS의 wired memory 제한을 늘려야 합니다:

# 현재 제한 확인
sysctl iogpu.wired_limit_mb

# 64GB Mac에서 55GB로 설정 (모델 + 캐치 용량 고려)
sudo sysctl iogpu.wired_limit_mb=56320

이 설정은 재부팅 시 초기화되므로 ~/.zshrc에 추가하거나 launchd plist로 영구 설정할 수 있습니다.


11. 문제 해결

SSH 연결 실패

mlx.launch가 SSH 연결에 실패하면 다음을 확인하세요:

  • 양방향 SSH 키 인증이 설정되었는지 확인 (ssh hostname 테스트)
  • .ssh/config에 각 Mac의 호스트명 설정이 올바른지 확인
  • 방화벽 설정에서 SSH 포트(22)가 열려 있는지 확인

JACCL 초기화 실패

  • ibv_devices가 RDMA 장치를 표시하는지 확인
  • Thunderbolt 케이블이 양쪽 포트에 제대로 연결되었는지 확인
  • mlx.distributed_config --hosts ~ --over thunderbolt --dot으로 연결 상태 시각화
  • macOS 26.2 이상인지 확인 (sw_vers)

모델 로드 실패

  • iogpu.wired_limit_mb가 모델 크기보다 충분한지 확인
  • 모델 파일이 두 기기에 모두 동일한 경로에 있는지 확인
  • mlx_lm.download로 모델을 사전 다운로드

Ring 백엔드에서 느린 성능

  • --connections-per-ip 4 이상으로 설정하여 TCP 연결 수 증가
  • 10Gb Ethernet 포트가 있다면 --over ethernet으로 설정
  • JACCL로 전환하는 것이 가장 확실한 해결책

12. 전체 아키텍처

┌─────────────────────────────┐         Thunderbolt 5          ┌─────────────────────────────┐
│    MacBook Pro M4 Max       │         (120Gb/s)              │    Mac Studio M4 Max        │
│    64GB RAM / 40-core GPU   │◄──────────────────────────────►│    64GB RAM / 40-core GPU   │
│                              │         JACCL (RDMA)           │                              │
│  ┌──────────────────────┐   │   ┌─────────────────────────┐  │  ┌──────────────────────┐   │
│  │   mlx.launch (rank 0)│   │   │                         │  │  │   mlx.launch (rank 1)│   │
│  │                      │   │   │   mlx.distributed       │  │  │                      │   │
│  │  mlx_lm.chat         │   │   │   init(backend="jaccl") │  │  │  mlx_lm.chat         │   │
│  │  --model 70B-4bit    │   │   │                         │  │  │  --model 70B-4bit    │   │
│  └──────────┬───────────┘   │   │  all_sum / all_gather  │  │  └──────────┬───────────┘   │
│             │               │   │  all_reduce / broadcast │  │             │              │
│    Metal GPU│               │   └─────────────────────────┘  │    Metal GPU│              │
│   (40 cores)│               │                                 │   (40 cores)│              │
└─────────────┘               └─────────────────────────────────┘  └─────────────┘
                           │
              ┌────────────┴────────────┐
              │   hostfile.json         │
              │   cluster-jaccl.json    │
              └─────────────────────────┘

┌──────────────────────────────────────────────────────────────────┐
│                    클러스터 통신 흐름                              │
│                                                                    │
│  사용자 → MacBook Pro (rank 0)                                     │
│    ↓                                                                │
│  mlx_lm.chat (交互式 REPL)                                         │
│    ↓  tensor parallelism                                           │
│  Layer 0-N → MacBook Pro GPU    Layer N+1-End → Mac Studio GPU   │
│    ↓                          RDMA 통신                          ↓
│  MacBook Pro GPU ◄──────────────────────────────────► Mac Studio GPU
│    ↓                                                                │
│  all_reduce (gradient / attention)                                  │
│    ↓                                                                │
│  생성된 토큰 → 사용자에게 반환                                      │
└──────────────────────────────────────────────────────────────────┘

13. 요약

  • JACCL 백엔드는 RDMA over Thunderbolt를 사용하며, Ring 백엔드 대비 10배 낮은 지연 시간 제공
  • macOS 26.2 이상 필요 (Recovery Mode에서 rdma_ctl enable 필수)
  • mlx.distributed_config로 자동 설정 가능 (--auto-setup 사용 시 sudo 비밀번호 없이 실행 필요)
  • mlx.launch --backend jaccl로 분산 추론 실행, MLX_METAL_FAST_SYNCH=1 필수
  • 두 Mac의 총 128GB 메모리로 70B급 모델을 4bit 양자화하여 분산 실행 가능
  • Ring 백엔드는 macOS 26.2 미만에서도 사용 가능 (TCP over Thunderbolt/Ethernet)

참고 링크

  • MLX 공식 문서: https://ml-explore.github.io/mlx/
  • mlx-lm GitHub: https://github.com/ml-explore/mlx-lm
  • mlx-examples (분산 예제): https://github.com/ml-explore/mlx-examples
  • MLX Community Hugging Face: https://huggingface.co/mlx-community
  • Apple Support - Recovery Mode: https://support.apple.com/en-us/102518

이 가이드에서 설명한 설정은 로컬 환경에서 대규모 LLM을 실행하는 가장 효율적인 방법 중 하나입니다. 클라우드 GPU 대여 비용 없이 Apple Silicon Mac 두 대로 70B급 모델을 실시간 추론할 수 있습니다.

SK하이닉스 ADR 상장 이후 한국 증시 급락의 원인 분석

분류: 증시분석 SK하이닉스 ADR 상장 이후 한국 증시 급락의 원인 분석 지난 7월 10일, SK하이닉스가 미국 나스닥에 미국주식예탁증서(ADR)를 상장했다. 공모가 149달러로 상장한 하이닉스 ADR은 첫 거래일인 13일 기준 약 168달...