히든 스테이트 추출

히든 스테이트 추출 (Hidden State Extraction)

EAGLE 스타일 드래프트 모델을 훈련하려면 타겟 모델의 중간 레이어 활성화(hidden state) 를 저장할 수 있어야 해요. vLLM의 Hidden State Extraction 기능은 추론 중 타겟 모델의 중간 레이어 활성화를 저장해 줘서, 드래프트 모델 훈련·지식 증류(knowledge distillation)·모델 내부의 오프라인 분석에 유용해요. 이 페이지에서 그 사용법을 살펴볼게요.

출처: vLLM 공식 문서 — Hidden State Extraction

개요 (Overview)

Hidden State Extraction은 추론 중 타겟 모델의 중간 레이어 활성화를 저장하는 기능이에요. EAGLE 스타일 드래프트 모델 훈련, 지식 증류, 모델 내부의 오프라인 분석에 쓸 수 있죠.

참고: 마지막 레이어의 출력 히든 스테이트를 저장하려면 num_hidden_layers를 레이어 ID로 넘기면 돼요. 다만 이 값들은 output norm으로 정규화되지 않는다는 점을 알아두세요.

오프라인 예시 (Offline example)

import tempfile
from vllm import LLM, SamplingParams
from vllm.config.kv_transfer import KVTransferConfig
from vllm.distributed.kv_transfer.kv_connector.v1 import (
    example_hidden_states_connector,
)

with tempfile.TemporaryDirectory() as tmpdir:
    llm = LLM(
        model="Qwen/Qwen3-8B",
        enable_chunked_prefill=False,
        speculative_config={
            "method": "extract_hidden_states",
            "num_speculative_tokens": 1,
            "draft_model_config": {
                "hf_config": {
                    "eagle_aux_hidden_state_layer_ids": [1, 2, 3, 4],
                },
            },
        },
        kv_transfer_config=KVTransferConfig(
            kv_connector="ExampleHiddenStatesConnector",
            kv_role="kv_producer",
            kv_connector_extra_config={
                "shared_storage_path": tmpdir,
            },
        ),
    )

    outputs = llm.generate(
        ["The future of AI is"],
        SamplingParams(max_tokens=1),
    )

    for output in outputs:
        path = output.kv_transfer_params["hidden_states_path"]
        obj = example_hidden_states_connector.load_hidden_states(path)
        print(f"token_ids: {obj['token_ids'].shape}")
        print(f"hidden_states: {obj['hidden_states'].shape}")

완전한 예시는 examples/features/speculative_decoding/extract_hidden_states_offline.py에 있어요.

온라인 예시 (Online example)

성능을 위해 온라인 사용에서는 클라이언트가 파일을 생성 직후 정리해 주는 /dev/shm/ 같은 RAM 마운트 파일시스템을 쓰는 걸 권장해요.

vllm serve Qwen/Qwen3-8B \
    --speculative_config '{"method": "extract_hidden_states", "num_speculative_tokens": 1, "draft_model_config": {"hf_config": {"eagle_aux_hidden_state_layer_ids": [1, 2, 3, 4]}}}' \
    --kv_transfer_config '{"kv_connector": "ExampleHiddenStatesConnector", "kv_role": "kv_producer", "kv_connector_extra_config": {"shared_storage_path": "/dev/shm/hidden_states"}}' \
    --no-enable-chunked-prefill

설정 (Configuration)

kv_connector_extra_config 딕셔너리는 다음 옵션을 받아요.

파라미터 기본값 설명
shared_storage_path /tmp 히든 스테이트 파일이 저장되는 디렉터리
num_writer_threads 8 비동기 디스크 쓰기용 스레드 풀 크기
use_synchronization_lock True 파일 잠금을 사용해 동시 읽기가 쓰기 완료까지 기다리게 함. 동기화가 필요 없는 배치 생성에서는 끌 수 있음

출력 형식 (Output format)

각 요청은 다음을 담은 .safetensors 파일 하나를 만들어요.

  • hidden_states — shape [num_tokens, num_extracted_layers, hidden_size]
  • token_ids — shape [num_tokens]

파일 경로는 output.kv_transfer_params["hidden_states_path"]에 반환돼요. 커넥터 모듈의 load_hidden_states()로 적절한 동기화와 함께 파일을 읽을 수 있어요.

참고: Chunked prefill은 이 기능과 호환되지 않아서 반드시 꺼야 해요.

더 알아보기 (Learn more)