콘텐츠로 이동

세부 디바이스 할당

Model implementation 지원

이 페이지에서 설명하는 설정은 transformers(optimum) model implementation에 적용됩니다.

개요

transformers(optimum) model implementation에서는 비전 인코더나 언어 모델처럼 서브모듈이라고 부르는 모델 구성 요소에 서로 다른 RBLN NPU 디바이스 집합을 할당할 수 있습니다. 겹치지 않는 디바이스 집합을 사용하면 서브모듈의 메모리를 서로 다른 NPU에 분산할 수 있습니다.

torch.device를 통해 텐서 단위로 디바이스를 지정하려면 vllm model implementation을 사용해야 합니다.

디바이스 할당 설정

Python에서는 additional_config["optimum_overrides"], CLI에서는 --rbln-optimum-overrides로 디바이스 ID를 지정합니다. 디바이스 설정에서는 몇 개를 사용할지와 어느 디바이스에서 실행할지를 구분합니다.

서브모듈 이름은 모델 아키텍처마다 다릅니다. 해당 모델의 RBLN Optimum API에 정의된 설정 키를 사용해야 합니다. 아래 표의 <submodule>은 이 설정 키를 의미합니다.

Python 열은 additional_config 내부의 설정 키를 나타냅니다.

설정 대상 Python 키
최상위 디바이스 수 ["num_devices_per_local_rank"]
최상위 디바이스 ID ["optimum_overrides"]["device"]
서브모듈 디바이스 수 ["optimum_overrides"]["<submodule>"]["num_devices"]
서브모듈 디바이스 ID ["optimum_overrides"]["<submodule>"]["device"]

CLI에서는 최상위 디바이스 수를 --rbln-num-devices-per-local-rank로 지정하고, 나머지 설정은 JSON 형식으로 --rbln-optimum-overrides에 전달합니다.

  • device를 별도로 지정하지 않은 서브모듈은 최상위 device 설정을 사용합니다.
  • 특정 서브모듈에 다른 디바이스를 할당하려면 해당 서브모듈의 설정 키 아래에 device를 지정합니다.
  • 모델을 컴파일할 때 서브모듈의 num_devices는 명시적으로 지정한 device 리스트의 길이로 자동 설정되므로 별도로 지정할 필요가 없습니다.

미리 컴파일된 모델은 model에 산출물 디렉터리를 지정합니다. optimum_overrides의 device 항목만 적용되며, 각 디바이스 리스트의 길이는 해당 서브모듈의 컴파일된 디바이스 수와 일치해야 합니다.

Note

Rebel100™에서는 NPU 카드 한 장이 하나의 디바이스에 해당하며, 카드 내부에는 여러 칩렛이 있습니다. num_devices_per_local_rank에는 1만 지정할 수 있지만, 디바이스 하나 내부의 여러 칩렛은 컴파일러가 자동으로 활용합니다. 디바이스 수에 관한 규칙은 모델 병렬화에서 확인할 수 있습니다.

모델 로딩이나 디바이스 메모리 문제는 멀티 모듈 모델 문제 해결에서 확인할 수 있습니다.

예제

Qwen3-VL은 비전 인코더와 언어 모델로 구성됩니다. 비전 인코더의 설정 키는 visual입니다. 이 모델에서는 최상위 device가 언어 모델에, visual.device가 비전 인코더에 적용됩니다.

다음 예제에서는 ATOM™ 디바이스 16개 중 0–7은 언어 모델에, 8–15는 비전 인코더에 할당합니다. 이 예제에서 num_devices_per_local_rank=8은 언어 모델의 디바이스 수를, visual.num_devices=8은 비전 인코더의 디바이스 수를 지정합니다. 여기서는 디바이스 수를 명확히 보여주기 위해 visual.num_devices를 명시적으로 지정합니다. rbln-smi로 시스템에서 사용할 수 있는 디바이스를 확인합니다.

모델 컴파일 및 서빙

다음 예제는 모델 ID를 지정하고, 언어 모델과 비전 인코더에 서로 다른 디바이스를 할당합니다.

from vllm import LLM

llm = LLM(
    model="Qwen/Qwen3-VL-2B-Instruct",
    model_impl="transformers",
    block_size=16_384,
    max_model_len=262_144,
    max_num_seqs=8,
    additional_config={
        "num_devices_per_local_rank": 8,
        "optimum_overrides": {
            "device": [0, 1, 2, 3, 4, 5, 6, 7],
            "visual": {
                "device": [8, 9, 10, 11, 12, 13, 14, 15],
                "num_devices": 8,
                "max_seq_len": 16_384,
            },
        },
    },
)

OpenAI 호환 서버에서도 같은 설정을 사용할 수 있습니다.

1
2
3
4
5
6
7
vllm serve Qwen/Qwen3-VL-2B-Instruct \
  --model-impl transformers \
  --block-size 16384 \
  --max-model-len 262144 \
  --max-num-seqs 8 \
  --rbln-num-devices-per-local-rank 8 \
  --rbln-optimum-overrides '{"device": [0, 1, 2, 3, 4, 5, 6, 7], "visual": {"device": [8, 9, 10, 11, 12, 13, 14, 15], "num_devices": 8, "max_seq_len": 16384}}'

미리 컴파일된 모델 서빙

다음 예제는 위 예제와 별도로 컴파일하고 저장한 모델을 사용합니다. 언어 모델과 visual을 각각 num_devices=8로 컴파일하고, 산출물을 rbln-Qwen3-VL-2B-Instruct에 저장했다고 가정합니다.

from vllm import LLM

llm = LLM(
    model="rbln-Qwen3-VL-2B-Instruct",
    model_impl="transformers",
    additional_config={
        "optimum_overrides": {
            "device": [0, 1, 2, 3, 4, 5, 6, 7],
            "visual": {
                "device": [8, 9, 10, 11, 12, 13, 14, 15],
            },
        },
    },
)