DeepSeek DeepInfer 사용법: 설치 조건·오프라인 추론과 성능 검증
DeepInfer는 DeepSeek가 실제 대규모 서비스에서 사용한다고 밝힌 추론 엔진을 Apache 2.0으로 공개한 프로젝트다. 핵심은 새 모델을 학습하는 것이 아니라, 이미 학습된 DeepSeek-V4.1-Flash를 여러 가속기에 나눠 더 많은 요청을 처리하고 결과를 재현 가능하게 검증하는 데 있다. 다만 일반 PC에 설치하는 로컬 실행 도구와는 거리가 멀다. 현재 공식 지원 하드웨어는 NVIDIA SM100 GPU와 Huawei Ascend 950 NPU이며, 완전한 온라인 서비스에 필요한 KV 캐시 시스템과 단계 분리, 복제본 간 로드 밸런싱은 공개판에 포함되지 않았다.
따라서 이 글의 목표는 “바로 운영에 넣기”가 아니다. 설치 가능 여부를 먼저 판단하고, 공식 오프라인 예제로 빌드 상태를 확인한 뒤, 결정적 출력·구조화 출력·벤치마크를 어떤 순서로 검증해야 하는지 정리한다.
먼저 결론: 누가 지금 써볼 수 있나
| 상황 | 판단 | 이유 |
|---|---|---|
| 일반 노트북·소비자용 GPU | 현재는 부적합 | 공식 지원 목록에 없고, 대상 모델과 병렬 구성이 대규모 인프라를 전제로 한다. |
| SM100 또는 Ascend 950 클러스터 | 검토 가능 | 공식 빌드 경로와 오프라인 추론·벤치마크 예제가 제공된다. |
| vLLM·SGLang 운영팀 | 비교 실험 가치 있음 | DeepInfer는 vLLM에서 출발했고 DeepGEMM·DeepEP·FlashMLA 등 DeepSeek 커널을 통합한다. |
| 즉시 쓸 완성형 API 서버가 필요한 팀 | 추가 구성 필요 | 공개판은 오프라인 추론 중심이며 서비스 핵심 구성 일부가 빠져 있다. |

DeepInfer에서 달라지는 것
1. 프리필과 디코드를 각각 최적화한다
대형 언어 모델 추론은 입력 토큰을 한꺼번에 처리하는 프리필과, 이후 토큰을 순차 생성하는 디코드의 성격이 다르다. DeepInfer 예제는 두 단계의 배치 크기와 측정 항목을 분리한다. 프리필에서는 GPU당 입력 처리량과 지연을, 디코드에서는 사용자별 속도와 GPU당 출력 처리량을 함께 본다. 숫자 하나만 최고로 만드는 대신, 서비스가 허용할 지연 안에서 얼마나 많은 요청을 처리하는지 판단하는 구조다.
2. DeepSeek의 병렬·커널 구성요소를 함께 사용한다
공개 저장소는 Attention DP, balanced CP, MoE EP와 EPLB를 지원한다고 설명한다. 여기에 FlashMLA, DeepGEMM, DeepEP, TileKernels, DeepSelect 및 TileLang 기반 커널이 연결된다. 이는 단일 GPU에서 실행 버튼을 누르는 제품이 아니라, 여러 장치의 메모리와 통신을 설계하는 운영팀용 엔진이라는 뜻이다.
3. 같은 입력을 다시 확인할 수 있는 기능이 있다
배치 구성이 바뀌어도 결과를 유지하는 batch-invariant inference, 같은 입력 토큰·샘플링 값·시드에서 동일 출력을 만드는 deterministic sampling, 정규식·JSON Schema·EBNF로 출력을 제한하는 structured outputs가 포함됐다. 에이전트가 API 호출 인수를 JSON으로 만들어야 하거나 회귀 테스트에서 결과 변화를 추적할 때 특히 중요한 기능이다. NVIDIA 경로에서 결정적 샘플링을 쓰려면 batch invariant를 켜고 가변 길이 MTP를 끈 뒤 고정 seq_seed를 전달해야 한다.
설치 전 준비사항
- 운영체제: Linux
- 컴파일러: GCC 13 이상
- 파이썬: Python 3.12의 빈 가상환경
- NVIDIA: SM100 GPU와 CUDA 13
- Ascend: Ascend 950 NPU와 CANN 9.2
- 모델 저장공간: 기본 체크포인트 DeepSeek-V4.1-Flash-1017을 Hugging Face 캐시에 받을 공간, 또는 이미 내려받은 로컬 디렉터리
여기서 가장 중요한 확인 항목은 GPU 이름이 아니라 지원 아키텍처다. “CUDA가 설치되어 있다”는 것만으로 충분하지 않다. 또한 공식 성능 그래프는 프리필 4개 SM100, 디코드 64개 SM100을 각각 하나의 scale-up domain에서 측정했다. 그 수치를 소규모 장비의 예상 성능으로 그대로 읽으면 안 된다.
빌드와 첫 오프라인 추론
1단계: 저장소와 빈 Python 3.12 환경 준비
git clone https://github.com/deepseek-ai/DeepInfer.git
cd DeepInfer
python3.12 -m venv .venv
source .venv/bin/activate
완료 확인은 python --version이 3.12 계열인지, 현재 경로에 build.sh와 examples 디렉터리가 있는지 보는 것이다.
2단계: 가속기 경로 선택 후 빌드
# NVIDIA 경로. Ascend라면 nvidia 대신 ascend
export DEEPINFER_ACCELERATOR=nvidia
./build.sh
이 환경변수는 빌드할 때만이 아니라 DeepInfer를 실행하는 셸에서도 유지해야 한다. 빌드 스크립트는 백엔드별 요구 패키지와 저장소에 포함된 연산자, DeepInfer 확장을 설치한다. 오류가 나면 먼저 GCC·Python·CUDA 또는 CANN 버전과 장치 아키텍처를 확인한다. 지원되지 않는 GPU에서 패키지 옵션만 바꿔 통과시키는 방식은 공식 검증 범위를 벗어난다.
3단계: 공식 오프라인 예제 실행
python examples/offline_inference.py
모델 ID를 사용하면 첫 실행에서 Hugging Face 캐시로 체크포인트를 받는다. 네트워크가 제한된 환경은 로컬 모델 경로를 지정할 수 있다.
export DEEPINFER_HF_MODEL_DIR=/models/DeepSeek-V4.1-Flash-1017
python examples/offline_inference.py
완료 여부는 단순히 프로세스가 시작됐는지가 아니라 샘플 출력과 decode_ppl 검사가 끝났는지로 판단한다. 구조화 출력까지 함께 검사하려면 공식 예제의 --check_structured_output 옵션을 사용한다.
세 가지 실용적인 검증 흐름
예시 1: 장비·빌드 상태를 빠르게 확인하는 스모크 테스트
목적은 성능 경쟁이 아니라 “현재 클러스터에서 엔진과 모델이 정상 연결되는가”를 확인하는 것이다. 먼저 가장 단순한 오프라인 예제를 실행하고, 모델 다운로드 위치, 장치 인식, 샘플 생성, PPL 비교가 모두 끝나는지 기록한다. 실패하면 모델 자체의 품질을 논하기 전에 빌드 로그와 장치별 의존성을 고친다.
예시 2: 에이전트의 JSON 출력을 회귀 테스트하기
도구 호출 인수나 업무 시스템 입력처럼 형식 오류가 치명적인 작업은 JSON Schema 제약을 적용하고 고정 시드로 반복한다. NVIDIA에서는 DEEPINFER_BATCH_INVARIANT=1, DEEPINFER_ENABLE_MTP_VARLEN=0 조건과 고정 seq_seed를 함께 맞춘다. 검토 기준은 JSON 파싱 성공만이 아니다. 동일 입력을 다른 배치 구성에 넣어도 값이 유지되는지, 정상 EOS로 끝나는지, 스키마 밖 필드가 생기지 않는지 확인한다.
예시 3: 처리량과 사용자 체감 속도의 균형 찾기
examples/benchmark.py는 디코드 요청 수와 컨텍스트 길이 등을 바꾸어 측정할 수 있다. 많은 요청을 한꺼번에 처리하면 GPU당 총 처리량은 높아질 수 있지만 사용자별 토큰 속도는 낮아질 수 있다. 서비스 목표가 대화형 응답인지, 야간 배치 처리인지에 따라 선택점이 달라진다. 프로파일러가 켜진 구간은 즉시 오버헤드가 포함되므로, 공식 문서도 그 스텝 시간을 SPS 계산에 쓰지 말라고 명시한다.

벤치마크 숫자를 읽을 때 주의할 점
공식 디코드 그래프의 점 라벨은 DP rank당 요청 수다. 그래프는 131,072 컨텍스트와 특정 expert·nextn·acceptance 설정에서 측정됐으므로 다른 모델, 장치 수, 컨텍스트 길이에 그대로 적용할 수 없다. decode throughput도 실제 승인율을 직접 측정한 값이 아니라 문서가 설명한 full-acceptance 계산을 따른다. 따라서 재현 실험에서는 원시 설정과 결과를 JSONL로 함께 보존하고, 비용·전력·지연을 자체 환경에서 별도로 계산해야 한다.
평가 스크립트는 AIME 2026, HLE, GPQA Diamond를 지원하지만 데이터셋을 자동으로 내려받지 않는다. HLE와 일부 GPQA 데이터는 사용 조건 동의가 필요할 수 있다. 생성과 채점을 분리하므로 같은 출력에 다른 judge를 적용할 수 있고, AIME·GPQA는 규칙 기반 채점도 제공한다. 결과의 coverage_complete가 true가 아닐 때는 일부 rank나 샘플이 빠진 것이므로 Pass@1을 완성된 수치로 보고하면 안 된다.
온라인 서비스로 확장하기 전 체크리스트
- KV 캐시 저장·회수 계층을 누가 제공하는가?
- VE·prefill·decode 분리와 장애 복구를 어떻게 구성할 것인가?
- 데이터 병렬 복제본 사이의 프리필·디코드 로드 밸런싱은 어디에서 처리하는가?
- 모델 파일과 Hugging Face 캐시의 접근 권한·무결성을 어떻게 확인하는가?
- 프롬프트·출력·평가 데이터에 개인정보나 비밀정보가 섞이지 않는가?
- DeepInfer, 모델 체크포인트, 데이터셋의 라이선스를 각각 확인했는가?
DeepInfer 코드는 Apache 2.0이지만 DeepSeek-V4.1-Flash-1017 모델 카드에는 별도의 모델 라이선스가 표시된다. 코드 라이선스만 보고 모델·데이터의 사용 조건까지 같다고 가정하면 안 된다.
자주 막히는 문제와 해결 순서
빌드 단계에서 연산자 컴파일이 실패한다
Python 가상환경이 비어 있는지, GCC 13 이상인지, NVIDIA는 CUDA 13과 SM100인지, Ascend는 CANN 9.2와 Ascend 950인지 순서대로 확인한다. 그다음 DEEPINFER_ACCELERATOR 값과 실행 셸의 환경변수를 확인한다.
첫 실행에서 모델 다운로드가 중단된다
캐시 용량과 네트워크 정책을 확인하고, 별도 환경에서 체크포인트를 내려받았다면 DEEPINFER_HF_MODEL_DIR로 로컬 디렉터리를 지정한다. 명시적으로 --model_name을 넘기면 이 환경변수보다 해당 인수가 우선한다.
벤치마크 결과가 공식 그래프와 크게 다르다
장치 수, EP·DP·CP, 컨텍스트 길이, non-cached tokens, nextn, 중복 expert 수를 먼저 비교한다. 멀티노드에서는 WORLD_SIZE, RANK, 가시 장치 목록도 확인한다. 공식 수치가 다른 하드웨어 규모에서 나온 경우 동일 성능을 기대하지 않는다.
평가 점수가 비정상적으로 낮거나 일부만 나온다
데이터 JSONL 필드와 이미지의 <image> 자리표시자, judge 설정, rank별 원시 출력 존재 여부를 확인한다. 마지막으로 summary.json의 coverage_complete를 본다.
정리
DeepInfer의 의미는 “누구나 노트북에서 DeepSeek를 더 빠르게 실행한다”가 아니다. DeepSeek가 대규모 추론에 사용하는 커널·병렬 처리·스케줄링·재현성 기능을 공개해, 적합한 인프라를 가진 팀이 내부 엔진을 비교하고 검증할 수 있게 한 데 있다. 지금 시작한다면 지원 하드웨어 확인, 빈 Python 3.12 환경에서 빌드, 오프라인 추론과 구조화 출력 검사, 자체 조건의 파레토 곡선 작성, 빠진 서비스 계층 설계 순서가 안전하다.
Read the English version of this guide.
공식 자료
- DeepSeek DeepInfer 저장소와 README
- DeepInfer 공식 예제·벤치마크 문서
- DeepInfer 공식 평가 문서
- DeepSeek-V4.1-Flash-1017 모델 카드
자료 확인일: 2026년 10월 22일
댓글
댓글 쓰기