관심분야/생성형AI

Qwen의 Long Context 성능저하에 대한 극복 전략

을량 2025. 8. 12. 10:11

저희팀 개발자의 고민이 녹여있는 문서라 인사이트가 있을거라 생각합니다. 

 

Qwen3-235B-Thinking-2507 모델에는 DCA와 MInference 전략이 도입되었음

 

1. DCA (Dual Chunk Attention)
긴 입력(100K~1M 토큰 이상)을 처리 가능하게 만드는 방법
LLM은 훈련 당시 최대 컨텍스트 길이 (예: 4K, 8K, 32K 토큰)를 넘어가는 입력이 들어오면 문맥 추적 능력이 급격히 떨어짐.
이를 늘리려면 보통 다시 긴 길이로 재학습(파인튜닝) 해야 함.

 

왜 “Dualˮ인가?
단순청크 처리만 하면 전역 일관성(Global Coherence) 이 깨짐.
예를 들어, 1M 토큰의 앞부분 내용이 뒷부분 답변에 반영되지 않거나, 연결이 느슨해짐.
DCA는 두 종류의 어텐션(Intra + Inter) 을 병행해서 “청크 내부 세부 정보 + 청크 간 연결ˮ 둘 다 놓치지 않게 함.

 

동작구조
입력을 청크(Chunk)로 나눕니다.
예: 1M 토큰 입력 → 4K~8K 단위로 쪼갬. 이중 어텐션 구조(Dual Attention)
Intra-Chunk Attention: 청크 내부 토큰끼리의 관계를 계산 → 로컬 문맥을 정확히 이해
Inter-Chunk Attention: 청크끼리의 연결 관계를 계산 → 전역 문맥을 유지

이렇게 하면 청크 내·청크 간 문맥을 모두 보존할 수 있음.
Flash Attention과 호환, 효율적인 GPU 메모리 사용 및 속도 유지.

 

예시
엄청 긴소설(1M) 를 읽고 요약해야 하는 상황
일반모델: 한 번에 다 읽으려다 머리가 터짐(OOM).
단순청크 처리: 각 장(chapter)별로 따로 읽고 요약 → 장과 장 사이의 연결이 어색해짐.
DCA: 각 장을 읽을 때, 해당 장의 내용(Intra)을 꼼꼼히 이해하면서, 동시에 이전 장들과 연결된 핵심 흐름(Inter)을 계속 추적 → 끝까지 일관된 스토리 유지.

 

DCA VS prefill
개념: Context를 chunk로 나눠서 던진다.

 

2. MInference
중요 내용만 attention 계산

 

중요한 토큰만 선택
 - 모든토큰에서 토큰조합을 계산하는 대신, 모델이 판단하기에 의미상 중요한 토큰 쌍에 대해서만 Attention을 수행.
 - 예: “본문 내용”과 직접 연결되는 “질문 토큰” 위주로 연산.
 - MInference는 각 헤드별로 A-Shape/ Vertical-Slash / Block-Sparse같은 희소패턴을 정하고, 
   추론 시 그 패턴에 맞는 인덱스만 동적으로 계산하는 방식. 
   그래서 Prefill 단계 가 크게 빨라짐.
   (참고) Prefill 단계
   LLM 추론은 보통 두 단계:
   - Prefill(프롬프트 처리): 입력토큰 전부를 한 번에 병렬 처리해 각 층의 KV 캐시를 만듦. 
   - Decode(토큰생성) : KV캐시를 재사용해 한 토큰씩 생성. 메모리 접근이 병목발생

 

정밀도 보정
처음에 선택한 토큰관계가 너무 단순해서 의미가 깨지지 않도록,
필요 시 일부 토큰 간 관계를 재계산하여 품질 유지.

 

효과
계산량 : O(n²) --> O(n·k) 수준으로 감소 (k = 중요한 토큰 수)
속도 : 긴 문맥에서 최대, 3~7배 prefill 속도 향상
메모리 사용량 : 대폭 감소 → 1M 토큰도 가능
품질 : 불필요한 계산을 줄였지만, 중요한 관계는 보존해서 성능 하락 최소화

 

중요 토큰만 고르는 방식 
긴 문맥에서 실제로 관측되는 어텐션 희소 패턴을 헤드별로 정하고, 그 패턴에 맞춘 인덱스만 계산함.
사전단계 : 각 어텐션 헤드가 따르는 희소 패턴 (A-shape / Vertical-Slash / Block-Sparse)을 결정.
추론단계 : 해당 패턴에 맞춰 스파스 인덱스를 동적으로 근사해서, 그 위치들만 연산함.

 

희소패턴 정하는 방식 
장문 맥락의 어텐션 행렬이 매우 희소하다는 관찰에서 출발
사전단계에서 각 어텐션 헤드마다 어떤 희소패턴(예: Vertical-Slash / A-shape / Block-sparse)을 쓸지 탐색해 구성을 정함.
추론단계에서 그 패턴에 맞는 인덱스만 동적으로 생성해서 계산(커스텀 커널). 이로써 프리필(prefill) 단계가 최대 10배 가속

 

3. 사용법
1M 토큰 컨텍스트를 활성화하는 방법
1단계: 구성 파일 업데이트
모델을 다운로드하고 길이 외삽 및 희소 주의에 대한 구성을 포함하는 내용을 변경 --> config.json에서 config_1m.json
2단계: 모델서버 시작
구성을 업데이트한 후 모델 제공을 위해 vLLM 진행


vLLM 주요매개변수

 

context가 증가해도 768k까지는 90점대를 유지함

 

Context가 길어도 LLM 성능이 잘 나와야 하는 경우 1M 모드활용 필요 
- Qwen3 235B Thinking모델은 기본적으로 256K(기본 262,144 토큰) 
- 1M모드는 KV 캐시/활성 메모리 때문에 총 GPU 메모리 1TB급을 요구
- 실 환경에선 현실적인 길이로 운용하는 게 일반적