You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
GovOn 아키텍처에서 EXAONE 4.0-32B를 planner/오케스트레이터 베이스 모델로 사용하려 합니다. 32B 모델은 tool calling을 네이티브 지원하지만 GPU 메모리(~64GB VRAM) 부담이 큽니다.
AirLLM은 **레이어별 순차 추론(layer-by-layer inference)**으로 70B 모델을 4GB GPU에서 실행하는 오픈소스입니다. 이를 EXAONE 4.0에 마이그레이션할 수 있는지 분석했습니다.
AirLLM 핵심 메커니즘
전체 모델을 GPU에 올리지 않고, 한 번에 1개 레이어만 GPU에 로드 → 연산 → 해제를 반복합니다.
1. 모델을 레이어 단위로 분할 저장 (safetensors)
2. forward pass 시:
for layer in [embed, layer.0, layer.1, ..., norm, lm_head]:
- 디스크/RAM → GPU 로드
- layer(hidden_states) 연산
- GPU → meta device 해제
3. ThreadPoolExecutor로 다음 레이어 prefetch
핵심 파일: airllm_base.py의 AirLLMBaseModel 클래스
소스코드 구조 (GovOn-Org/airllm 포크)
air_llm/airllm/
├── auto_model.py # architectures → 클래스 매핑
├── airllm_base.py # 핵심 base 클래스 (layer-by-layer forward)
├── airllm.py # AirLLMLlama2 (Llama 구현)
├── airllm_qwen2.py # Qwen2 구현
├── airllm_mistral.py # Mistral 구현
├── airllm_chatglm.py # ChatGLM 구현
├── airllm_internlm.py # InternLM 구현
├── airllm_baichuan.py # Baichuan 구현
├── airllm_mixtral.py # Mixtral 구현
└── persist/ # 레이어 분할 저장 로직
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
배경
GovOn 아키텍처에서 EXAONE 4.0-32B를 planner/오케스트레이터 베이스 모델로 사용하려 합니다. 32B 모델은 tool calling을 네이티브 지원하지만 GPU 메모리(~64GB VRAM) 부담이 큽니다.
AirLLM은 **레이어별 순차 추론(layer-by-layer inference)**으로 70B 모델을 4GB GPU에서 실행하는 오픈소스입니다. 이를 EXAONE 4.0에 마이그레이션할 수 있는지 분석했습니다.
AirLLM 핵심 메커니즘
전체 모델을 GPU에 올리지 않고, 한 번에 1개 레이어만 GPU에 로드 → 연산 → 해제를 반복합니다.
핵심 파일:
airllm_base.py의AirLLMBaseModel클래스소스코드 구조 (GovOn-Org/airllm 포크)
EXAONE 4.0-32B 아키텍처 분석
config.json핵심 파라미터:model_typeexaone4architectures["Exaone4ForCausalLM"]num_hidden_layershidden_sizenum_attention_headsnum_key_value_headsintermediate_sizesliding_windowsliding_window_pattern"LLLG"max_position_embeddingsvocab_size마이그레이션 난이도 분석
1단계:
auto_model.py— 아키텍처 매핑 추가 (쉬움 ✅)2단계:⚠️ )
airllm_exaone4.py— EXAONE4 전용 클래스 생성 (중간AirLLMBaseModel을 상속하고set_layer_names_dict()를 오버라이드:EXAONE 4.0의 레이어 이름 규칙이 Llama와 동일한
model.layers.{i}패턴이면 이것만으로 충분합니다.3단계: 하이브리드 어텐션 처리 (어려움 ❌)
이것이 핵심 난제입니다.
EXAONE 4.0은
sliding_window_pattern: "LLLG"— 레이어 0,1,2는 로컬 어텐션(sliding window 4096), 레이어 3은 **글로벌 어텐션(full attention)**을 반복합니다.AirLLM의
forward()메서드는 모든 레이어에 동일한attention_mask를 전달합니다:이는 causal full attention mask이며, EXAONE 4.0의 로컬/글로벌 하이브리드 패턴을 처리하지 못합니다. 수정 필요:
4단계: QK-Reorder-Norm 처리 (중간⚠️ )
EXAONE 4.0은 표준 Pre-LN 대신 QK-Reorder-Norm을 사용합니다:
이는
transformers의Exaone4ForCausalLM구현에 이미 포함되어 있으므로, AirLLM이AutoModelForCausalLM.from_config()으로 모델 구조를 생성하면 자동 적용됩니다. 단, transformers >= 4.54.0 필요.5단계: RoPE 없는 글로벌 어텐션 (어려움 ❌)
EXAONE 4.0은 글로벌 어텐션 레이어에서 RoPE를 사용하지 않습니다. AirLLM의 position embedding 처리가 이를 감안해야 합니다.
예상 GPU 메모리 사용량
주의: AirLLM은 매 토큰 생성마다 64개 레이어를 순차 로드하므로 추론 속도가 매우 느립니다. planner용(도구 선택 JSON 1회 생성)에는 허용 가능하지만, 실시간 대화에는 부적합합니다.
결론 및 제안
마이그레이션 가능성: 가능하지만 비자명한 작업 필요
대안 검토
다음 단계 제안
관련 리소스
Beta Was this translation helpful? Give feedback.
All reactions