vllm-project/vllm · error · Error

unsupported multimodal content

Error message

unsupported multimodal content: {0}

What it means

The nixl EPLB backend registers GPU memory with a NIXL agent for one-sided RDMA-style transfers, which requires a CUDA-like platform and expert weights resident on the device. Either the platform is not CUDA-like or the expert weight tensors are on CPU.

Solutions

  1. Ensure expert weights are on the GPU before the EPLB communicator is created
  2. On CPU or unsupported platforms, use 'torch_gloo' (CPU) or 'torch_nccl' instead
  3. On ROCM/other accelerators, confirm the platform reports is_cuda_alike() or wait for platform support

Example fix

# before
backend = "nixl"  # expert weights on CPU

# after
weights = [w.cuda() for w in weights]
backend = "nixl"
Defensive patterns

Strategy: validation

Validate before calling

from vllm.platforms import current_platform
device_ok = current_platform.is_cuda_alike() and expert_weights[0][0].device.type != 'cpu'
backend = 'nixl' if device_ok else 'torch_gloo'

Prevention

When it happens

Trigger: Requesting backend='nixl' on non-CUDA platforms (e.g. ROCM without cuda-alike platform detection, CPU inference) or when expert weights are still on CPU (offloading or pre-H2D initialization).

Common situations: CPU-offloaded MoE deployments wanting NIXL; running on accelerator platforms not covered by current_platform.is_cuda_alike(); creating the communicator before weights are moved to GPU.

Related errors


AI-assisted analysis of vllm-project/vllm@c794754062 (2026-08-14). Data as JSON: /api/errors/abd8998d51e3e887. Report an issue: GitHub.

Appendix: source

Thrown at rust/src/chat/src/error.rs:22

use thiserror::Error;
use thiserror_ext::{AsReport as _, Macro};

type BoxedError = Box<dyn std::error::Error + Send + Sync>;

#[derive(Debug, Error, Macro)]
#[thiserror_ext(macro(path = "crate::error"))]
pub enum Error {
    #[error("chat request must contain at least one message")]
    EmptyMessages,
    #[error("cannot continue the final message when the last message is not from the assistant")]
    ContinueFinalAssistantWithoutFinalAssistant,
    #[error("chat template is required but none was configured")]
    MissingChatTemplate,
    #[error("chat template error: {0}")]
    ChatTemplate(String),
    #[error("multimodal input is not supported by this chat renderer")]
    UnsupportedMultimodalRenderer,
    #[error("unsupported multimodal content: {0}")]
    UnsupportedMultimodalContent(&'static str),
    #[error("`{modality}` input is not supported by this model")]
    UnsupportedModality { modality: String },
    #[error("At most {limit} {modality}(s) may be provided in one prompt.")]
    MmLimitExceeded { modality: String, limit: usize },
    #[error("multimodal preprocessing error: {0}")]
    Multimodal(#[message] String),
    #[error("{kind} parsing is not available for model `{model_id}`")]
    ParserUnavailableForModel {
        kind: &'static str,
        model_id: String,
    },
    #[error("{kind} parsing is disabled by frontend configuration")]
    ParserDisabled { kind: &'static str },
    #[error(
        "{kind} parser `{name}` is not registered{}",
        available_parser_hint(.available_names)
    )]

View on GitHub (pinned to c794754062)