GPT-OSS on Day 0

FP8, 싱크 어텐션 및 MoE 최적화를 통한 ROSE 조정으로 H200에서 GPT-OSS에 대한 Day-0 지원

작성자Perplexity Engineering

Perplexity는 정확하고 신뢰할 수 있는 답변과 에이전트 기반의 행동을 요구하는 호기심 많은 사용자들에게 최고의 AI 모델을 제공하기 위해 최선을 다하고 있습니다. OpenAI는 최근 오픈 웨이트 모델(gpt-oss-20b 및 gpt-oss-120b)을 발표했습니다. 주요 선도 모델들과 마찬가지로, Perplexity는 gpt-oss-20b 및 gpt-oss-120b를 평가하는 첫 번째 조직 중 하나입니다.

이 게시물에서는 Day-0 지원을 가능하게 했던 자체 추론 스택의 인프라 결정 사항을 공유합니다. NVIDIA H200 GPU에서 이러한 모델을 서비스하는 데 초점을 맞추어 커널 변경, 배포 선택, 그리고 속도와 비용 간의 균형을 상세히 설명합니다.

Hopper에서의 GPT-OSS

오픈 웨이트 모델은 MXFP4 양자화를 사용하여 제공되며, 이는 소비자용 하드웨어의 메모리에 맞추거나 NVIDIA Blackwell에서 최고의 처리량을 달성하는 데 도움이 됩니다. 그러나 초기 평가를 위해 최소한의 추론 엔진 변경만으로 기존 H200 Hopper 클러스터에서 모델을 실행하고자 했습니다. Hopper에는 Blackwell에 도입된 전용 FP4 텐서 코어가 없습니다. 결과적으로, 맞춤형 커널에 대한 필요성을 최소화하고 가용 하드웨어를 최대한 활용하기 위해 FP8 정밀도로 모델을 서비스하기로 결정했습니다.

개괄적으로 볼 때, 트랜스포머 LLM은 구조적으로 단순합니다:

입력 임베딩

트랜스포머 레이어 시퀀스. 각 레이어에는 어텐션 블록과 밀집 MLP 또는 희소 MoE 블록이 포함되어 있습니다.

출력 로짓 프로젝션

새로운 트랜스포머 모델을 도입할 때, 우리는 주로 기존 모델과 어느 정도 일치하는지 파악하여 필요한 변경 사항을 식별하는 데 관심이 있습니다. OpenAI는 모델에 대한 개요를 사전에 친절하게 공유해주었으며, 덕분에 그에 맞춰 추론 설정을 조정할 수 있었습니다. 모델에 꽤 많은 작은 변경 사항이 필요함을 확인했습니다.

어텐션: 어텐션 싱크(Attention Sinks)를 포함한 GQA

각 어텐션 헤드에는 소프트맥스(Softmax)에 고려되는 사전 학습된 싱크 매개변수가 있습니다.

DeepSeek-V3와 유사한 YaRN 위치 인코딩

Qwen 2와 유사하게 QKV 프로젝션에 편향(bias) 적용

출력 프로젝션에 편향 적용

MLP: 희소 전문가 혼합(Sparse Mixture-of-Expert, MoE)

대부분의 오픈 웨이트 모델과는 다른 SwiGLU 활성화 함수

전문가 가중치를 위한 Top-K 이후의 소프트맥스

전문가 모델에 편향 적용

매개변수 수가 약 100B~200B일 것으로 예상하여 다음과 같이 결정했습니다:

어텐션 싱크를 지원하도록 FlashInfer 확장

DeepSeek-V3 모델 제품군을 위해 이미 구축된 MoE 구현 재사용

양자화 방식으로 FP8 128x128 블록 스케일링을 선택하고, 편향 항을 지원하도록 DeepGEMM 커널을 확장했습니다.

자체 추론 엔진

우리의 추론 노력은 자체 추론 엔진인 ROSE에 의해 뒷받침됩니다. 우리는 ROSE를 새로운 모델을 신속하게 도입할 수 있는 유연한 프레임워크로 구축하고 있습니다. 또한 대규모 서비스에 전념하게 되면, 성능을 최적화하고 향상시켜 최첨단 수준에 도달할 수 있는 플랫폼을 제공합니다.

ROSE는 LLM 엔진을 노출하여 모델을 로드하고, 추측 디코딩 및 MTP 디코더를 포함한 여러 디코더를 통해 디코딩된 토큰을 생성할 수 있습니다. 모델 자체는 맞춤형 레이어 세트로 구성되어 있으며, 양자화 및 병렬 처리를 위한 다양한 구성 노드를 지원합니다. 레이어 하단에는 개별 레이어에서 수행되는 계산을 효율적으로 구현하고 융합하는 Triton 및 CUDA 커널이 번들로 제공됩니다.

ROSE는 주로 Python으로 구축되었으며 모델 정의를 위해 PyTorch에 의존합니다. Python은 유연성을 제공하여 새로운 모델에 적응할 수 있게 해주지만, 서비스 및 배치 스케줄링과 같이 성능에 민감한 대부분의 구성 요소를 Rust로 마이그레이션하고 있습니다.

새로운 모델을 도입하기 위해 먼저 모델 계층 구조를 정의하고 가중치 변환기를 구축합니다. 모든 가중치가 고려된 후, 가장 간단한 TP=1 유스케이스에 대한 순방향 패스를 정의하고 엔드 투 엔드로 작동하는지 확인합니다. 마지막으로, 새로운 컨테이너를 출시하고 평가를 위해 클러스터에 모델을 배포하기 전에 다양한 형태의 병렬 처리 지원을 구현하고 테스트합니다. 그런 다음 대시보드와 더 세분화된 벤치마크로부터의 피드백을 바탕으로 성능을 반복 개선합니다.

ROSE는 숫자 토큰으로 작동하며, 통합 테스트 외의 채팅 형식에 대한 정보는 거의 없습니다. 이와 병행하여, Harmony 토크나이저를 지원하고 요청을 입력 토큰 시퀀스에 올바르게 매핑하기 위해 주변 인프라를 조정해야 했습니다.

GPT OSS 모델의 경우, 디코더, CUDA 그래프 하네스 또는 주변 인프라에 대한 변경이 필요하지 않음을 확인했으며, 이를 통해 모델을 지원하는 커널을 조정하는 데 노력을 집중할 수 있었습니다.

GPT-OSS용 커널

싱크 어텐션(Sink Attention)

싱크 어텐션은 Q와 K의 곱으로 누적된 소프트맥스 이전에 추가적인 편향 요소를 도입합니다:

plaintext
attn = softmax(q @ k^T * sm_scale + sink) * V

단순 구현은 매우 간단하지만, FlashInfer와 같은 효율적인 어텐션 구현은 독립적인 헤드와 KV 시퀀스 길이에 걸쳐 어텐션 계산을 병렬화합니다. 또한 수치적 안정성을 위해 소프트맥스는 최대 요소를 빼는 것과 동시에 온라인으로 계산됩니다:

plaintext
softmax(x) = e^x / sum(e^x) = e ^ (x - max(x)) / sum(e ^ (x - max(x))

온라인 구현은 -inf로 초기화된 실행 최대값 m과 1로 설정된 스케일 d를 추적합니다. 최대값을 현재 헤드의 싱크 값으로 초기화함으로써 소프트맥스에 올바르게 누적되도록 보장할 수 있습니다. 어텐션이 시퀀스 길이를 따라 여러 블록으로 분할된 경우, 이 최대값이 첫 번째 청크에만 포함되도록 주의를 기울여야 했습니다.

프리필과 디코드 모두에 사용되는 FlashInfer FA2 커널 템플릿을 싱크 매개변수를 포함하도록 조정했습니다.

MoE

다양한 모델의 MoE 레이어 간 주요 차이점은 일반적으로 라우팅 방식입니다. 상당한 가변성이 예상되므로 ROSE는 이 커널을 Triton으로 구현하여 새로운 모델에 쉽게 적응할 수 있도록 했습니다. GPT-OSS의 경우, 모든 전문가에 대해 소프트맥스를 계산하는 일부 DeepSeek 스타일 모델과 달리 Top-K 선택 전문가에 대해서만 소프트맥스를 수행하도록 가중치 채점을 조정해야 했습니다. 전문가 가중치를 bfloat16 정밀도로 계산하는 것이 정확도 측면에서 매우 중요함을 확인했습니다.

MoE 레이어의 문제는 편향 항 지원이 부족한 기존 DeepGEMM 커널을 재사용하기로 한 결정 때문이었습니다. 다행히 시간이 지나면서 커널과 긴밀하게 통합되어 커스텀 all-to-all 디스패치 커널과의 연결성을 개선하는 변경을 수행했습니다. 메모리에서 로드된 편향 값을 WGMMA 누산기 레지스터에 초기화하여 DeepGEMM에 편향 지원을 추가했습니다. 이는 MN 블록을 처리하는 동안 한 번만 수행되므로 비용은 무시할 수 있는 수준이며 L2 캐시를 통해 이러한 값에 효율적으로 접근할 수 있습니다.

이 모델들은 데이터 병렬 처리로부터 즉각적인 이점을 얻지 못하므로, TP 전용 디스패치 및 결합 커널을 재사용했습니다. 디스패치에 대한 입력은 모든 랭크에 복제되므로 디스패치는 로컬에서 사용할 수 있는 전문가를 위한 토큰을 선택합니다. 결합은 NVLink를 통해 가중 누적을 수행합니다.

성능 조정

모델을 빠르게 도입하는 것이 목표였지만, 성능이 합리적인 수준인지 확인하고자 했습니다. OpenAI가 제공한 참조 구현에 대해 정확성을 확인한 후, 기본 PyTorch 프로파일러를 사용하여 구현을 프로파일링하고 커널 전반의 블록 및 스레드 할당을 모니터링했습니다. 재사용된 기능은 GPT-OSS 모델의 2880보다 훨씬 큰 7168의 은닉 차원을 가진 모델용으로 구축된 것이었습니다. 더 나은 그리드 차원을 선택하도록 커널 런처를 전문화하여 처리량을 크게 향상시켰습니다.

토큰화 및 채널

Harmony의 채팅 형식에는 대화 구성, 추론 콘텐츠, 함수 호출을 위한 몇 가지 중요한 개념이 있습니다. 이 형식에서 각 메시지는 헤더와 콘텐츠로 구성됩니다:

plaintext
<|start|>{header}<|message|>{content}<|end|>

헤더에는 메타데이터가 포함됩니다. 가장 중요한 것은 역할(시스템, 개발자, 사용자, 어시스턴트, 도구), 채널, 그리고 도구 호출을 호출할 때의 to=functions.<function-name>과 같은 수신자입니다.

채널(분석, 논평, 최종 답변 등)은 모델의 출력을 더 투명하고 세분화되게 만듭니다. 형식이 이러한 분리를 강제하기 때문에, 모델은 사고 사슬이 프로덕션으로 유출되지 않으면서 투명하게 추론(및 디버깅을 위해 검사)할 수 있습니다. 수신자 태그(to= 헤더)는 함수, 모델 자체, 최종 사용자 등 다음 페이로드를 수신해야 하는 액터를 런타임에 정확히 알려줍니다.

당사의 추론 엔진 ROSE는 형식에 구애받지 않습니다. 입력 토큰 배치를 수신하고 출력 토큰을 스트리밍합니다. 당사의 추론 스택에서 입력을 토큰화된 프롬프트로 형식화하고 LLM 결과를 다시 구조화된 메시지로 파싱하는 작업은 전용 JSON API 프런트엔드 서비스에서 처리합니다. 이 프런트엔드에 새로운 플러그형 포맷터/파서를 추가하여 Harmony를 통합했으며, 덕분에 백엔드는 변경하지 않으면서 프런트엔드가 채팅 형식 규칙, 도구 호출 및 스트리밍을 깔끔하게 관리할 수 있게 되었습니다. 이러한 관심사 분리는 아키텍처를 모듈화된 상태로 유지하여 최소한의 백엔드 변경만으로 새로운 형식과 응답 기능을 빠르게 채택할 수 있게 해줍니다.

비용 및 성능

GPT-OSS 모델의 상대적으로 작은 크기를 고려하여, 노드 간 통신 오버헤드를 피하기 위해 복제본 배포를 단일 노드로 제한합니다. 당사의 구현은 전문가 병렬 처리(EP), 데이터 병렬 처리(DP) 및 텐서 병렬 처리(TP)의 유연한 조합을 지원합니다. 최적의 배포 설정을 결정하기 위해 1에서 128까지의 배치 크기에 걸쳐 모든 샤딩 전략 조합을 벤치마킹했습니다. 프리필-디코드 분리(Prefill-Decode Disaggregation) 덕분에 프리필과 디코드에 대한 성능-비용 균형을 별도로 논의할 수 있습니다.

비용 추정을 위해 명목상 H200 시장 가격을 시간당 $3.00로 가정합니다(참고: 이는 실제 GPU 가격이 아닙니다).

batch_size=1 및 DP=1 설정이 최고의 프리필 성능을 제공함을 발견했습니다. 다양한 TP 구성은 첫 번째 토큰 지연 시간과 비용 간의 다양한 균형을 제공합니다. 아래 표는 다양한 구성 및 입력 길이에 대한 프리필 지연 시간과 백만 입력 토큰당 비용을 보여줍니다.

GPT-OSS 120B:

입력 길이

8192

32768

65536

128000

EP1 DP1 TP1

0.364초, $0.037

2.421초, $0.062

7.375초, $0.094

23.902초, $0.156

EP2 DP1 TP2

0.190초, $0.039

1.245초, $0.063

3.786초, $0.096

12.116초, $0.158

EP4 DP1 TP4

0.165초, $0.067

0.900초, $0.092

2.449초, $0.125

7.165초, $0.187

EP8 DP1 TP8

0.179초, $0.145

0.839초, $0.171

2.003초, $0.204

5.119초, $0.267

GPT-OSS 120B의 병렬 구성 및 입력 길이에 따른 백만 입력 토큰당 프리필 지연 시간과 비용.

GPT-OSS 20B:

입력 길이

8192

32768

65536

128000

EP1 DP1 TP1

0.239초, $0.024

1.610초, $0.041

4.895초, $0.062

16.037초, $0.104

EP2 DP1 TP2

0.127초, $0.026

0.833초, $0.042

2.522초, $0.064

8.143초, $0.106

EP4 DP1 TP4

0.108초, $0.044

0.593초, $0.060

1.616초, $0.082

4.766초, $0.124

EP8 DP1 TP8

0.116초, $0.094

0.547초, $0.111

1.310초, $0.133

3.365초, $0.175

GPT-OSS 20B의 병렬 구성 및 입력 길이에 따른 백만 입력 토큰당 프리필 지연 시간과 비용.

디코드의 경우, 대부분의 경우 EP4 DP1 TP4가 최상의 구성임을 확인했습니다. 아래의 4개 플롯은 시퀀스 길이 8192 및 32768에서 120B 및 20B 모델 모두에 대한 디코드 속도와 백만 출력 토큰당 비용 간의 균형을 보여줍니다.

시퀀스 길이 8,192에서 GPT-OSS 120B의 디코드 전용 백만 출력 토큰당 비용과 디코딩 속도의 비교이며, EP1, EP2, EP4, EP8 구성을 비교합니다.
시퀀스 길이 32,768에서 GPT-OSS 120B의 디코드 전용 백만 출력 토큰당 비용과 디코딩 속도의 비교이며, EP1, EP2, EP4, EP8 구성을 비교합니다.
시퀀스 길이 8,192에서 GPT-OSS 20B의 디코드 전용 백만 출력 토큰당 비용과 디코딩 속도의 비교이며, EP1, EP2, EP4, EP8 구성을 비교합니다.
시퀀스 길이 32,768에서 GPT-OSS 20B의 디코드 전용 백만 출력 토큰당 비용과 디코딩 속도의 비교이며, EP1, EP2, EP4, EP8 구성을 비교합니다.

더 작은 20B 모델을 더 큰 120B 모델을 위한 추측 디코딩(speculative decoding) 초안 모델로 사용하는 것도 고려했습니다. 그러나 활성화된 매개변수 수가 유사(3B 대 5B)하기 때문에 결과적인 속도 향상은 미미했습니다.

참조

분리된 프리필 및 디코드

추측을 통한 Sonar 가속화

멀티 노드 DeepSeek 배포를 통한 낮은 지연 시간 및 높은 처리량

효율적이고 이식 가능한 전문가 혼합 통신

pplx-커널

DeepGEMM

FlashInfer: LLM 추론 서비스를 위한 효율적이고 사용자 정의 가능한 어텐션 엔진

어텐션 싱크를 사용한 효율적인 스트리밍 언어 모델

DeepSeek-V3 기술 보고서

OpenAI Harmony 응답 형식 | OpenAI 쿡북

인용

BibTeX
@online{perplexity2025GptOssOnDay0,
  author = {{Perplexity} and Nandor Licker and Lequn Chen and Vladimir Zaytsev and Kevin Hu and Lauren Kolm and Jesse Dwyer},
  title = {{GPT-OSS on day 0}},
  date = {2025-08-08},
  url = {https://www.perplexity.ai/hub/blog/gpt-oss-on-day-0}
}