Skip to content

vllm.entrypoints.llm

LLM

Bases: BeamSearchOfflineMixin, PoolingOfflineMixin, OfflineInferenceMixin

An LLM for generating texts from given prompts and sampling parameters.

This class includes a tokenizer, a language model (possibly distributed across multiple GPUs), and GPU memory space allocated for intermediate states (aka KV cache). Given a batch of prompts and sampling parameters, this class generates texts from the model, using an intelligent batching mechanism and efficient memory management.

Parameters:

Name Type Description Default
model str

The name or path of a HuggingFace Transformers model.

required
tokenizer str | None

The name or path of a HuggingFace Transformers tokenizer.

None
tokenizer_mode TokenizerMode | str

The tokenizer mode. "auto" will use the fast tokenizer if available, and "slow" will always use the slow tokenizer.

'auto'
skip_tokenizer_init bool

If true, skip initialization of tokenizer and detokenizer. Expect valid prompt_token_ids and None for prompt from the input.

False
trust_remote_code bool

Trust remote code (e.g., from HuggingFace) when downloading the model and tokenizer.

False
allowed_local_media_path str

Allowing API requests to read local images or videos from directories specified by the server file system. This is a security risk. Should only be enabled in trusted environments.

''
allowed_media_domains list[str] | None

If set, only media URLs that belong to this domain can be used for multi-modal inputs.

None
tensor_parallel_size int

The number of GPUs to use for distributed execution with tensor parallelism.

1
dtype ModelDType

The data type for the model weights and activations. Currently, we support float32, float16, and bfloat16. If auto, we use the dtype attribute of the Transformers model's config. However, if the dtype in the config is float32, we will use float16 instead.

'auto'
quantization QuantizationMethods | None

The method used to quantize the model weights. Currently, we support "awq", "gptq", and "fp8" (experimental). If None, we first check the quantization_config attribute in the model config file. If that is None, we assume the model weights are not quantized and use dtype to determine the data type of the weights.

None
revision str | None

The specific model version to use. It can be a branch name, a tag name, or a commit id.

None
tokenizer_revision str | None

The specific tokenizer version to use. It can be a branch name, a tag name, or a commit id.

None
chat_template Path | str | None

The chat template to apply.

None
seed int

The seed to initialize the random number generator for sampling.

0
gpu_memory_utilization float

The ratio (between 0 and 1) of GPU memory to reserve for the model weights, activations, and KV cache. Higher values will increase the KV cache size and thus improve the model's throughput. However, if the value is too high, it may cause out-of- memory (OOM) errors.

0.92
kv_cache_memory_bytes int | None

Size of KV Cache per GPU in bytes. By default, this is set to None and vllm can automatically infer the kv cache size based on gpu_memory_utilization. However, users may want to manually specify the kv cache memory size. kv_cache_memory_bytes allows more fine-grain control of how much memory gets used when compared with using gpu_memory_utilization. Note that kv_cache_memory_bytes (when not-None) ignores gpu_memory_utilization

None
cpu_offload_gb float

The size (GiB) of CPU memory to use for offloading the model weights. This virtually increases the GPU memory space you can use to hold the model weights, at the cost of CPU-GPU data transfer for every forward pass.

0
offload_group_size int

Prefetch offloading: Group every N layers together. Offload last offload_num_in_group layers of each group. Default is 0 (disabled).

0
offload_num_in_group int

Prefetch offloading: Number of layers to offload per group. Default is 1.

1
offload_prefetch_step int

Prefetch offloading: Number of layers to prefetch ahead. Higher values hide more latency but use more GPU memory. Default is 1.

1
offload_params set[str] | None

Prefetch offloading: Set of parameter name segments to selectively offload. Only parameters whose names contain one of these segments will be offloaded (e.g., {"gate_up_proj", "down_proj"} for MLP weights, or {"w13_weight", "w2_weight"} for MoE expert weights). If None or empty, all parameters are offloaded.

None
enforce_eager bool

Whether to enforce eager execution. If True, we will disable CUDA graph and always execute the model in eager mode. If False, we will use CUDA graph and eager execution in hybrid.

False
enable_return_routed_experts bool

Whether to return routed experts.

False
disable_custom_all_reduce bool False
hf_token bool | str | None

The token to use as HTTP bearer authorization for remote files . If True, will use the token generated when running hf auth login (stored in ~/.cache/huggingface/token).

None
hf_overrides HfOverrides | None

If a dictionary, contains arguments to be forwarded to the HuggingFace config. If a callable, it is called to update the HuggingFace config.

None
mm_processor_kwargs dict[str, Any] | None

Arguments to be forwarded to the model's processor for multi-modal data, e.g., image processor. Overrides for the multi-modal processor obtained from AutoProcessor.from_pretrained. The available overrides depend on the model that is being run. For example, for Phi-3-Vision: {"num_crops": 4}.

None
pooler_config PoolerConfig | None

Initialize non-default pooling config for the pooling model, e.g., PoolerConfig(seq_pooling_type="MEAN", use_activation=False).

None
compilation_config int | dict[str, Any] | CompilationConfig | None

Either an integer or a dictionary. If it is an integer, it is used as the mode of compilation optimization. If it is a dictionary, it can specify the full compilation configuration.

None
attention_config dict[str, Any] | AttentionConfig | None

Configuration for attention mechanisms. Can be a dictionary or an AttentionConfig instance. If a dictionary, it will be converted to an AttentionConfig. Allows specifying the attention backend and other attention-related settings.

None
spec_method str | None

Top-level alias for speculative_config["method"].

None
spec_model str | None

Top-level alias for speculative_config["model"].

None
spec_tokens int | None

Top-level alias for speculative_config["num_speculative_tokens"].

None
**kwargs Any

Arguments for EngineArgs.

{}
Note

This class is intended to be used for offline inference. For online serving, use the AsyncLLMEngine class instead.

Source code in vllm/entrypoints/llm.py
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
class LLM(BeamSearchOfflineMixin, PoolingOfflineMixin, OfflineInferenceMixin):
    """An LLM for generating texts from given prompts and sampling parameters.

    This class includes a tokenizer, a language model (possibly distributed
    across multiple GPUs), and GPU memory space allocated for intermediate
    states (aka KV cache). Given a batch of prompts and sampling parameters,
    this class generates texts from the model, using an intelligent batching
    mechanism and efficient memory management.

    Args:
        model: The name or path of a HuggingFace Transformers model.
        tokenizer: The name or path of a HuggingFace Transformers tokenizer.
        tokenizer_mode: The tokenizer mode. "auto" will use the fast tokenizer
            if available, and "slow" will always use the slow tokenizer.
        skip_tokenizer_init: If true, skip initialization of tokenizer and
            detokenizer. Expect valid prompt_token_ids and None for prompt
            from the input.
        trust_remote_code: Trust remote code (e.g., from HuggingFace) when
            downloading the model and tokenizer.
        allowed_local_media_path: Allowing API requests to read local images
            or videos from directories specified by the server file system.
            This is a security risk. Should only be enabled in trusted
            environments.
        allowed_media_domains: If set, only media URLs that belong to this
            domain can be used for multi-modal inputs.
        tensor_parallel_size: The number of GPUs to use for distributed
            execution with tensor parallelism.
        dtype: The data type for the model weights and activations. Currently,
            we support `float32`, `float16`, and `bfloat16`. If `auto`, we use
            the `dtype` attribute of the Transformers model's config. However,
            if the `dtype` in the config is `float32`, we will use `float16` instead.
        quantization: The method used to quantize the model weights. Currently,
            we support "awq", "gptq", and "fp8" (experimental).
            If None, we first check the `quantization_config` attribute in the
            model config file. If that is None, we assume the model weights are
            not quantized and use `dtype` to determine the data type of
            the weights.
        revision: The specific model version to use. It can be a branch name,
            a tag name, or a commit id.
        tokenizer_revision: The specific tokenizer version to use. It can be a
            branch name, a tag name, or a commit id.
        chat_template: The chat template to apply.
        seed: The seed to initialize the random number generator for sampling.
        gpu_memory_utilization: The ratio (between 0 and 1) of GPU memory to
            reserve for the model weights, activations, and KV cache. Higher
            values will increase the KV cache size and thus improve the model's
            throughput. However, if the value is too high, it may cause out-of-
            memory (OOM) errors.
        kv_cache_memory_bytes: Size of KV Cache per GPU in bytes. By default,
            this is set to None and vllm can automatically infer the kv cache
            size based on gpu_memory_utilization. However, users may want to
            manually specify the kv cache memory size. kv_cache_memory_bytes
            allows more fine-grain control of how much memory gets used when
            compared with using gpu_memory_utilization. Note that
            kv_cache_memory_bytes (when not-None) ignores
            gpu_memory_utilization
        cpu_offload_gb: The size (GiB) of CPU memory to use for offloading
            the model weights. This virtually increases the GPU memory space
            you can use to hold the model weights, at the cost of CPU-GPU data
            transfer for every forward pass.
        offload_group_size: Prefetch offloading: Group every N layers
            together. Offload last `offload_num_in_group` layers of each group.
            Default is 0 (disabled).
        offload_num_in_group: Prefetch offloading: Number of layers to
            offload per group. Default is 1.
        offload_prefetch_step: Prefetch offloading: Number of layers to
            prefetch ahead. Higher values hide more latency but use more GPU
            memory. Default is 1.
        offload_params: Prefetch offloading: Set of parameter name segments
            to selectively offload. Only parameters whose names contain one of
            these segments will be offloaded (e.g., {"gate_up_proj", "down_proj"}
            for MLP weights, or {"w13_weight", "w2_weight"} for MoE expert
            weights). If None or empty, all parameters are offloaded.
        enforce_eager: Whether to enforce eager execution. If True, we will
            disable CUDA graph and always execute the model in eager mode.
            If False, we will use CUDA graph and eager execution in hybrid.
        enable_return_routed_experts: Whether to return routed experts.
        disable_custom_all_reduce: See
            [ParallelConfig][vllm.config.ParallelConfig].
        hf_token: The token to use as HTTP bearer authorization for remote files
            . If `True`, will use the token generated when running
            `hf auth login` (stored in `~/.cache/huggingface/token`).
        hf_overrides: If a dictionary, contains arguments to be forwarded to the
            HuggingFace config. If a callable, it is called to update the
            HuggingFace config.
        mm_processor_kwargs: Arguments to be forwarded to the model's processor
            for multi-modal data, e.g., image processor. Overrides for the
            multi-modal processor obtained from `AutoProcessor.from_pretrained`.
            The available overrides depend on the model that is being run.
            For example, for Phi-3-Vision: `{"num_crops": 4}`.
        pooler_config: Initialize non-default pooling config for the pooling model,
            e.g., `PoolerConfig(seq_pooling_type="MEAN", use_activation=False)`.
        compilation_config: Either an integer or a dictionary. If it is an
            integer, it is used as the mode of compilation optimization. If it
            is a dictionary, it can specify the full compilation configuration.
        attention_config: Configuration for attention mechanisms. Can be a
            dictionary or an AttentionConfig instance. If a dictionary, it will
            be converted to an AttentionConfig. Allows specifying the attention
            backend and other attention-related settings.
        spec_method: Top-level alias for `speculative_config["method"]`.
        spec_model: Top-level alias for `speculative_config["model"]`.
        spec_tokens: Top-level alias for
            `speculative_config["num_speculative_tokens"]`.
        **kwargs: Arguments for [`EngineArgs`][vllm.EngineArgs].

    Note:
        This class is intended to be used for offline inference. For online
        serving, use the [AsyncLLMEngine][vllm.AsyncLLMEngine] class instead.
    """

    def __init__(
        self,
        model: str,
        *,
        runner: RunnerOption = "auto",
        convert: ConvertOption = "auto",
        tokenizer: str | None = None,
        tokenizer_mode: TokenizerMode | str = "auto",
        skip_tokenizer_init: bool = False,
        trust_remote_code: bool = False,
        allowed_local_media_path: str = "",
        allowed_media_domains: list[str] | None = None,
        tensor_parallel_size: int = 1,
        dtype: ModelDType = "auto",
        quantization: QuantizationMethods | None = None,
        revision: str | None = None,
        tokenizer_revision: str | None = None,
        chat_template: Path | str | None = None,
        seed: int = 0,
        gpu_memory_utilization: float = 0.92,
        cpu_offload_gb: float = 0,
        offload_group_size: int = 0,
        offload_num_in_group: int = 1,
        offload_prefetch_step: int = 1,
        offload_params: set[str] | None = None,
        enforce_eager: bool = False,
        enable_return_routed_experts: bool = False,
        disable_custom_all_reduce: bool = False,
        hf_token: bool | str | None = None,
        hf_overrides: HfOverrides | None = None,
        mm_processor_kwargs: dict[str, Any] | None = None,
        pooler_config: PoolerConfig | None = None,
        structured_outputs_config: dict[str, Any]
        | StructuredOutputsConfig
        | None = None,
        profiler_config: dict[str, Any] | ProfilerConfig | None = None,
        attention_config: dict[str, Any] | AttentionConfig | None = None,
        kv_cache_memory_bytes: int | None = None,
        compilation_config: int | dict[str, Any] | CompilationConfig | None = None,
        quantization_config: dict[str, Any] | QuantizationConfigArgs | None = None,
        logits_processors: list[str | type[LogitsProcessor]] | None = None,
        spec_method: str | None = None,
        spec_model: str | None = None,
        spec_tokens: int | None = None,
        **kwargs: Any,
    ) -> None:
        """LLM constructor."""

        if "swap_space" in kwargs:
            kwargs.pop("swap_space")
            import warnings

            warnings.warn(
                "The 'swap_space' parameter is deprecated and ignored. "
                "It will be removed in a future version.",
                DeprecationWarning,
                stacklevel=2,
            )

        if "disable_log_stats" not in kwargs:
            kwargs["disable_log_stats"] = True

        if "worker_cls" in kwargs:
            worker_cls = kwargs["worker_cls"]
            # if the worker_cls is not qualified string name,
            # we serialize it using cloudpickle to avoid pickling issues
            if isinstance(worker_cls, type):
                kwargs["worker_cls"] = cloudpickle.dumps(worker_cls)

        if "kv_transfer_config" in kwargs and isinstance(
            kwargs["kv_transfer_config"], dict
        ):
            from vllm.config.kv_transfer import KVTransferConfig

            raw_config_dict = kwargs["kv_transfer_config"]
            try:
                kwargs["kv_transfer_config"] = KVTransferConfig(**raw_config_dict)
            except ValidationError as e:
                logger.error(
                    "Failed to convert 'kv_transfer_config' dict to "
                    "KVTransferConfig object. Dict: %s. Error: %s",
                    raw_config_dict,
                    e,
                )
                # Consider re-raising a more specific vLLM error or ValueError
                # to provide better context to the user.
                raise ValueError(f"Invalid 'kv_transfer_config' provided: {e}") from e

        if hf_overrides is None:
            hf_overrides = {}

        def _make_config(value: Any, cls: type[_R]) -> _R:
            """Convert dict/None/instance to a config instance."""
            if value is None:
                return cls()
            if isinstance(value, dict):
                return cls(**{k: v for k, v in value.items() if is_init_field(cls, k)})  # type: ignore[arg-type]
            return value

        if isinstance(compilation_config, int):
            compilation_config_instance = CompilationConfig(
                mode=CompilationMode(compilation_config)
            )
        else:
            compilation_config_instance = _make_config(
                compilation_config, CompilationConfig
            )

        structured_outputs_instance = _make_config(
            structured_outputs_config, StructuredOutputsConfig
        )
        profiler_config_instance = _make_config(profiler_config, ProfilerConfig)
        attention_config_instance = _make_config(attention_config, AttentionConfig)

        # warn about single-process data parallel usage.
        _dp_size = int(kwargs.get("data_parallel_size", 1))
        _distributed_executor_backend = kwargs.get("distributed_executor_backend")
        if (
            _dp_size > 1
            and not _distributed_executor_backend == "external_launcher"
            and not current_platform.is_tpu()
        ):
            raise ValueError(
                f"LLM(data_parallel_size={_dp_size}) is not supported for single-"
                "process usage and may hang. Please use "
                "the explicit multi-process data-parallel example at "
                "'examples/features/data_parallel/data_parallel_offline.py'."
            )

        engine_args = EngineArgs(
            model=model,
            runner=runner,
            convert=convert,
            tokenizer=tokenizer,
            tokenizer_mode=tokenizer_mode,
            skip_tokenizer_init=skip_tokenizer_init,
            trust_remote_code=trust_remote_code,
            allowed_local_media_path=allowed_local_media_path,
            allowed_media_domains=allowed_media_domains,
            tensor_parallel_size=tensor_parallel_size,
            dtype=dtype,
            quantization=quantization,
            revision=revision,
            tokenizer_revision=tokenizer_revision,
            seed=seed,
            gpu_memory_utilization=gpu_memory_utilization,
            kv_cache_memory_bytes=kv_cache_memory_bytes,
            cpu_offload_gb=cpu_offload_gb,
            offload_group_size=offload_group_size,
            offload_num_in_group=offload_num_in_group,
            offload_prefetch_step=offload_prefetch_step,
            offload_params=offload_params or set(),
            enforce_eager=enforce_eager,
            enable_return_routed_experts=enable_return_routed_experts,
            disable_custom_all_reduce=disable_custom_all_reduce,
            hf_token=hf_token,
            hf_overrides=hf_overrides,
            mm_processor_kwargs=mm_processor_kwargs,
            pooler_config=pooler_config,
            structured_outputs_config=structured_outputs_instance,
            profiler_config=profiler_config_instance,
            attention_config=attention_config_instance,
            compilation_config=compilation_config_instance,
            quantization_config=quantization_config,
            logits_processors=logits_processors,
            spec_method=spec_method,
            spec_model=spec_model,
            spec_tokens=spec_tokens,
            **kwargs,
        )

        log_non_default_args(engine_args)

        self.llm_engine = LLMEngine.from_engine_args(
            engine_args=engine_args, usage_context=UsageContext.LLM_CLASS
        )
        self.model_config = self.llm_engine.model_config
        self.engine_class = type(self.llm_engine)

        self.request_counter = Counter()
        self.default_sampling_params: dict[str, Any] | None = None

        supported_tasks = self.llm_engine.get_supported_tasks()
        self.supported_tasks = supported_tasks

        self.runner_type = self.model_config.runner_type
        self.renderer = self.llm_engine.renderer
        self.chat_template = load_chat_template(chat_template)
        self.input_processor = self.llm_engine.input_processor

        # The renderer thread pool is only consumed by the async renderer
        # path; the synchronous `LLM` entrypoint runs multimodal
        # preprocessing serially. Warn so the setting is not a silent
        # no-op. See vllm-project/vllm#42901.
        if self.model_config.renderer_num_workers > 1:
            logger.warning_once(
                "`renderer_num_workers=%d` was set, but the offline `LLM` "
                "entrypoint uses the synchronous renderer path and runs "
                "multimodal preprocessing serially across prompts. The "
                "renderer thread pool is only consumed by the async "
                "renderer path used by `vllm serve` / `AsyncLLM`, so this "
                "setting has no effect here.",
                self.model_config.renderer_num_workers,
            )

        PoolingOfflineMixin.__init__(self)

        # Cache for __repr__ to avoid repeated collective_rpc calls
        self._cached_repr: str | None = None

    @classmethod
    def from_engine_args(cls, engine_args: EngineArgs) -> "LLM":
        """Create an LLM instance from EngineArgs."""
        return cls(**vars(engine_args))

    def get_tokenizer(self) -> TokenizerLike:
        return self.llm_engine.get_tokenizer()

    def get_world_size(self, include_dp: bool = True) -> int:
        """Get the world size from the parallel config.

        Args:
            include_dp: If True (default), returns the world size including
                data parallelism (TP * PP * DP). If False, returns the world
                size without data parallelism (TP * PP).

        Returns:
            The world size (tensor_parallel_size * pipeline_parallel_size),
            optionally multiplied by data_parallel_size if include_dp is True.
        """
        parallel_config = self.llm_engine.vllm_config.parallel_config
        if include_dp:
            return parallel_config.world_size_across_dp
        return parallel_config.world_size

    def reset_mm_cache(self) -> None:
        self.renderer.clear_mm_cache()
        self.llm_engine.reset_mm_cache()

    def get_default_sampling_params(self) -> SamplingParams:
        if self.default_sampling_params is None:
            self.default_sampling_params = self.model_config.get_diff_sampling_param()
        if self.default_sampling_params:
            return SamplingParams.from_optional(**self.default_sampling_params)
        return SamplingParams()

    def generate(
        self,
        prompts: PromptType | Sequence[PromptType],
        sampling_params: SamplingParams | Sequence[SamplingParams] | None = None,
        *,
        use_tqdm: bool | Callable[..., tqdm] = True,
        lora_request: Sequence[LoRARequest] | LoRARequest | None = None,
        priority: list[int] | None = None,
        tokenization_kwargs: dict[str, Any] | None = None,
        mm_processor_kwargs: dict[str, Any] | None = None,
    ) -> list[RequestOutput]:
        """Generates the completions for the input prompts.

        This class automatically batches the given prompts, considering
        the memory constraint. For the best performance, put all of your prompts
        into a single list and pass it to this method.

        Args:
            prompts: The prompts to the LLM. You may pass a sequence of prompts
                for batch inference. See [PromptType][vllm.inputs.PromptType]
                for more details about the format of each prompt.
            sampling_params: The sampling parameters for text generation. If
                None, we use the default sampling parameters.
                When it is a single value, it is applied to every prompt.
                When it is a list, the list must have the same length as the
                prompts and it is paired one by one with the prompt.
            use_tqdm: If `True`, shows a tqdm progress bar.
                If a callable (e.g., `functools.partial(tqdm, leave=False)`),
                it is used to create the progress bar.
                If `False`, no progress bar is created.
            lora_request: LoRA request to use for generation, if any.
            priority: The priority of the requests, if any.
                Only applicable when priority scheduling policy is enabled.
                If provided, must be a list of integers matching the length
                of `prompts`, where each priority value corresponds to the prompt
                at the same index.
            tokenization_kwargs: Overrides for `tokenizer.encode`.
            mm_processor_kwargs: Overrides for `processor.__call__`.

        Returns:
            A list of `RequestOutput` objects containing the
            generated completions in the same order as the input prompts.
        """
        runner_type = self.model_config.runner_type
        if runner_type != "generate":
            raise ValueError(
                "LLM.generate() is only supported for generative models. "
                "Try passing `--runner generate` to use the model as a "
                "generative model."
            )

        if sampling_params is None:
            sampling_params = self.get_default_sampling_params()

        return self._run_completion(
            prompts=prompts,
            params=sampling_params,
            output_type=RequestOutput,
            use_tqdm=use_tqdm,
            lora_request=lora_request,
            tokenization_kwargs=tokenization_kwargs,
            priority=priority,
            mm_processor_kwargs=mm_processor_kwargs,
        )

    def enqueue(
        self,
        prompts: PromptType | Sequence[PromptType],
        sampling_params: SamplingParams | Sequence[SamplingParams] | None = None,
        lora_request: Sequence[LoRARequest] | LoRARequest | None = None,
        priority: list[int] | None = None,
        use_tqdm: bool | Callable[..., tqdm] = True,
        tokenization_kwargs: dict[str, Any] | None = None,
        mm_processor_kwargs: dict[str, Any] | None = None,
    ) -> list[str]:
        """Enqueue prompts for generation without waiting for completion.

        This method adds requests to the engine queue but does not start
        processing them. Use wait_for_completion() to process the queued
        requests and get results.

        Args:
            prompts: The prompts to the LLM. See generate() for details.
            sampling_params: The sampling parameters for text generation.
            lora_request: LoRA request to use for generation, if any.
            priority: The priority of the requests, if any.
            use_tqdm: If True, shows a tqdm progress bar while adding requests.
            tokenization_kwargs: Overrides for `tokenizer.encode`.
            mm_processor_kwargs: Overrides for `processor.__call__`.

        Returns:
            A list of request IDs for the enqueued requests.
        """
        runner_type = self.model_config.runner_type
        if runner_type != "generate":
            raise ValueError("LLM.enqueue() is only supported for generative models.")

        if sampling_params is None:
            sampling_params = self.get_default_sampling_params()

        return self._add_completion_requests(
            prompts=prompts,
            params=sampling_params,
            use_tqdm=use_tqdm,
            lora_request=lora_request,
            priority=priority,
            tokenization_kwargs=tokenization_kwargs,
            mm_processor_kwargs=mm_processor_kwargs,
        )

    @overload
    def wait_for_completion(
        self,
        *,
        use_tqdm: bool | Callable[..., tqdm] = True,
    ) -> list[RequestOutput | PoolingRequestOutput]: ...

    @overload
    def wait_for_completion(
        self,
        output_type: type[_O] | tuple[type[_O], ...],
        *,
        use_tqdm: bool | Callable[..., tqdm] = True,
    ) -> list[_O]: ...

    def wait_for_completion(
        self,
        output_type: type[Any] | tuple[type[Any], ...] | None = None,
        *,
        use_tqdm: bool | Callable[..., tqdm] = True,
    ) -> list[Any]:
        """Wait for all enqueued requests to complete and return results.

        This method processes all requests currently in the engine queue
        and returns their outputs. Use after enqueue() to get results.

        Args:
            output_type: The expected output type, defaults to RequestOutput.
            use_tqdm: If True, shows a tqdm progress bar.

        Returns:
            A list of output objects for all completed requests.
        """
        if output_type is None:
            output_type = (RequestOutput, PoolingRequestOutput)

        return self._run_engine(output_type, use_tqdm=use_tqdm)

    def collective_rpc(
        self,
        method: str | Callable[..., _R],
        timeout: float | None = None,
        args: tuple = (),
        kwargs: dict[str, Any] | None = None,
    ) -> list[_R]:
        """
        Execute an RPC call on all workers.

        Args:
            method: Name of the worker method to execute, or a callable that
                is serialized and sent to all workers to execute.

                If the method is a callable, it should accept an additional
                `self` argument, in addition to the arguments passed in `args`
                and `kwargs`. The `self` argument will be the worker object.
            timeout: Maximum time in seconds to wait for execution. Raises a
                [`TimeoutError`][] on timeout. `None` means wait indefinitely.
            args: Positional arguments to pass to the worker method.
            kwargs: Keyword arguments to pass to the worker method.

        Returns:
            A list containing the results from each worker.

        Note:
            It is recommended to use this API to only pass control messages,
            and set up data-plane communication to pass data.
        """

        return self.llm_engine.collective_rpc(method, timeout, args, kwargs)

    def apply_model(self, func: Callable[[nn.Module], _R]) -> list[_R]:
        """
        Run a function directly on the model inside each worker,
        returning the result for each of them.

        !!! warning
            To reduce the overhead of data transfer, avoid returning large
            arrays or tensors from this method. If you must return them,
            make sure you move them to CPU first to avoid taking up additional
            VRAM!
        """
        return self.llm_engine.apply_model(func)

    def chat(
        self,
        messages: list[ChatCompletionMessageParam]
        | Sequence[list[ChatCompletionMessageParam]],
        sampling_params: SamplingParams | Sequence[SamplingParams] | None = None,
        use_tqdm: bool | Callable[..., tqdm] = True,
        lora_request: Sequence[LoRARequest] | LoRARequest | None = None,
        chat_template: str | None = None,
        chat_template_content_format: ChatTemplateContentFormatOption = "auto",
        add_generation_prompt: bool = True,
        continue_final_message: bool = False,
        tools: list[dict[str, Any]] | None = None,
        chat_template_kwargs: dict[str, Any] | None = None,
        tokenization_kwargs: dict[str, Any] | None = None,
        mm_processor_kwargs: dict[str, Any] | None = None,
    ) -> list[RequestOutput]:
        """
        Generate responses for a chat conversation.

        The chat conversation is converted into a text prompt using the
        tokenizer and calls the [generate][vllm.LLM.generate] method to generate
        the responses.

        Multi-modal inputs can be passed in the same way you would pass them
        to the OpenAI API.

        Args:
            messages: A sequence of conversations or a single conversation.

                - Each conversation is represented as a list of messages.
                - Each message is a dictionary with 'role' and 'content' keys.

            sampling_params: The sampling parameters for text generation.
                If None, we use the default sampling parameters. When it
                is a single value, it is applied to every prompt. When it
                is a list, the list must have the same length as the
                prompts and it is paired one by one with the prompt.
            use_tqdm: If `True`, shows a tqdm progress bar.
                If a callable (e.g., `functools.partial(tqdm, leave=False)`),
                it is used to create the progress bar.
                If `False`, no progress bar is created.
            lora_request: LoRA request to use for generation, if any.
            chat_template: The template to use for structuring the chat.
                If not provided, the model's default chat template will be used.
            chat_template_content_format: The format to render message content.

                - "string" will render the content as a string.
                  Example: `"Who are you?"`
                - "openai" will render the content as a list of dictionaries,
                  similar to OpenAI schema.
                  Example: `[{"type": "text", "text": "Who are you?"}]`

            add_generation_prompt: If True, adds a generation template
                to each message.
            continue_final_message: If True, continues the final message in
                the conversation instead of starting a new one. Cannot be
                `True` if `add_generation_prompt` is also `True`.
            chat_template_kwargs: Additional kwargs to pass to the chat
                template.
            tokenization_kwargs: Overrides for `tokenizer.encode`.
            mm_processor_kwargs: Overrides for `processor.__call__`.

        Returns:
            A list of `RequestOutput` objects containing the generated
            responses in the same order as the input messages.
        """
        model_config = self.model_config
        runner_type = model_config.runner_type
        if runner_type != "generate":
            raise ValueError(
                "LLM.chat() is only supported for generative models. "
                "Try passing `--runner generate` to use the model as a "
                "generative model."
            )

        if sampling_params is None:
            sampling_params = self.get_default_sampling_params()

        return self._run_chat(
            messages=messages,
            params=sampling_params,
            output_type=RequestOutput,
            use_tqdm=use_tqdm,
            lora_request=lora_request,
            chat_template=chat_template,
            chat_template_content_format=chat_template_content_format,
            chat_template_kwargs=chat_template_kwargs,
            add_generation_prompt=add_generation_prompt,
            continue_final_message=continue_final_message,
            tools=tools,
            tokenization_kwargs=tokenization_kwargs,
            mm_processor_kwargs=mm_processor_kwargs,
        )

    def enqueue_chat(
        self,
        messages: list[ChatCompletionMessageParam]
        | Sequence[list[ChatCompletionMessageParam]],
        sampling_params: SamplingParams | Sequence[SamplingParams] | None = None,
        use_tqdm: bool | Callable[..., tqdm] = True,
        lora_request: Sequence[LoRARequest] | LoRARequest | None = None,
        priority: list[int] | None = None,
        chat_template: str | None = None,
        chat_template_content_format: ChatTemplateContentFormatOption = "auto",
        add_generation_prompt: bool = True,
        continue_final_message: bool = False,
        tools: list[dict[str, Any]] | None = None,
        chat_template_kwargs: dict[str, Any] | None = None,
        tokenization_kwargs: dict[str, Any] | None = None,
        mm_processor_kwargs: dict[str, Any] | None = None,
    ) -> list[str]:
        """Enqueue chat conversations for generation without waiting.

        This method renders chat conversations and adds the resulting requests
        to the engine queue. Use wait_for_completion() to get results. To
        guarantee that all requests are queued before scheduling starts, pause
        scheduling with sleep(level=0) before calling this method and resume it
        with wake_up(tags=["scheduling"]) afterward.

        Args:
            messages: A sequence of conversations or a single conversation.
                Each conversation is represented as a list of messages.
            sampling_params: The sampling parameters for text generation.
                If None, we use the default sampling parameters.
            use_tqdm: If `True`, shows a tqdm progress bar while rendering
                conversations.
            lora_request: LoRA request to use for generation, if any.
            priority: The priority of the requests, if any.
            chat_template: The template to use for structuring the chat.
            chat_template_content_format: The format to render message content.
            add_generation_prompt: If True, adds a generation template
                to each message.
            continue_final_message: If True, continues the final message in
                the conversation instead of starting a new one.
            tools: Tools to make available to the model, if any.
            chat_template_kwargs: Additional kwargs to pass to the chat
                template.
            tokenization_kwargs: Overrides for `tokenizer.encode`.
            mm_processor_kwargs: Overrides for `processor.__call__`.

        Returns:
            A list of request IDs for the enqueued requests.
        """
        model_config = self.model_config
        runner_type = model_config.runner_type
        if runner_type != "generate":
            raise ValueError(
                "LLM.enqueue_chat() is only supported for generative models. "
                "Try passing `--runner generate` to use the model as a "
                "generative model."
            )

        if sampling_params is None:
            sampling_params = self.get_default_sampling_params()

        return self._add_chat_requests(
            messages=messages,
            params=sampling_params,
            use_tqdm=use_tqdm,
            lora_request=lora_request,
            priority=priority,
            chat_template=chat_template,
            chat_template_content_format=chat_template_content_format,
            chat_template_kwargs=chat_template_kwargs,
            add_generation_prompt=add_generation_prompt,
            continue_final_message=continue_final_message,
            tools=tools,
            tokenization_kwargs=tokenization_kwargs,
            mm_processor_kwargs=mm_processor_kwargs,
        )

    def start_profile(self, profile_prefix: str | None = None) -> None:
        """Start profiling with optional custom trace prefix.

        Args:
            profile_prefix: Optional prefix for the trace file names. If provided,
                           trace files will be named as "<prefix>_dp<X>_pp<Y>_tp<Z>".
                           If not provided, default naming will be used.
        """
        self.llm_engine.start_profile(profile_prefix)

    def stop_profile(self) -> None:
        self.llm_engine.stop_profile()

    def reset_prefix_cache(
        self, reset_running_requests: bool = False, reset_connector: bool = False
    ) -> bool:
        return self.llm_engine.reset_prefix_cache(
            reset_running_requests, reset_connector
        )

    def sleep(self, level: int = 1, mode: PauseMode = "abort"):
        """
        Put the engine to sleep. The engine should not process any requests.
        The caller should guarantee that no requests are being processed
        during the sleep period, before `wake_up` is called.

        Args:
            level: The sleep level.
                - Level 0: Pause scheduling but continue accepting requests.
                           Requests are queued but not processed.
                - Level 1: Offload model weights to CPU, discard KV cache.
                           The content of kv cache is forgotten. Good for
                           sleeping and waking up the engine to run the same
                           model again. Please make sure there's enough CPU
                           memory to store the model weights.
                - Level 2: Discard all GPU memory (weights + KV cache).
                           Good for sleeping and waking up the engine to run
                           a different model or update the model, where
                           previous model weights are not needed. It reduces
                           CPU memory pressure.
            mode: How to handle any existing requests, can be "abort", "wait",
                or "keep".
        """
        self.llm_engine.sleep(level=level, mode=mode)

    def wake_up(self, tags: list[str] | None = None):
        """
        Wake up the engine from sleep mode. See the [sleep][vllm.LLM.sleep]
        method for more details.

        Args:
            tags: An optional list of tags to reallocate the engine memory
                for specific memory allocations. Values must be in
                `("weights", "kv_cache", "scheduling")`. If None, all memory
                is reallocated. wake_up should be called with all tags
                (or None) before the engine is used again.
                Use tags=["scheduling"] to resume from level 0 sleep.
        """
        self.llm_engine.wake_up(tags)

    def get_metrics(self) -> list["Metric"]:
        """Return a snapshot of aggregated metrics from Prometheus.

        Returns:
            A `MetricSnapshot` instance capturing the current state
            of all aggregated metrics from Prometheus.

        Note:
            This method is only available with the V1 LLM engine.
        """
        return self.llm_engine.get_metrics()

    def init_weight_transfer_engine(
        self, request: WeightTransferInitRequest | dict
    ) -> None:
        """
        Initialize weight transfer for RL training.

        Args:
            request: Weight transfer initialization request with backend-specific info
        """
        init_info_dict = (
            request["init_info"] if isinstance(request, dict) else request.init_info
        )

        self.llm_engine.collective_rpc(
            "init_weight_transfer_engine", kwargs={"init_info": init_info_dict}
        )

    def start_weight_update(self, is_checkpoint_format: bool = True) -> None:
        """
        Start a new weight update.

        Args:
            is_checkpoint_format: Whether incoming weights are in checkpoint
                format (need layerwise processing) or kernel format (direct
                copy).
        """
        self.llm_engine.collective_rpc(
            "start_weight_update",
            kwargs={"is_checkpoint_format": is_checkpoint_format},
        )

    def update_weights(self, request: WeightTransferUpdateRequest | dict) -> None:
        """
        Update the weights of the model.

        Args:
            request: Weight update request with backend-specific update info
        """
        update_info_dict = (
            request["update_info"] if isinstance(request, dict) else request.update_info
        )

        self.llm_engine.collective_rpc(
            "update_weights", kwargs={"update_info": update_info_dict}
        )

    def finish_weight_update(self) -> None:
        """
        Finish the current weight update.
        """
        self.llm_engine.collective_rpc("finish_weight_update")

    def __repr__(self) -> str:
        """Return a transformers-style hierarchical view of the model."""
        # Cache the result to avoid repeated collective_rpc calls
        if self._cached_repr is None:
            results = self.llm_engine.collective_rpc("get_model_inspection")
            # In distributed settings, we get results from all workers
            # Just return the first one (they should all be the same)
            if results:
                self._cached_repr = results[0]
            else:
                self._cached_repr = f"LLM(model={self.model_config.model!r})"
        return self._cached_repr

__init__

__init__(
    model: str,
    *,
    runner: RunnerOption = "auto",
    convert: ConvertOption = "auto",
    tokenizer: str | None = None,
    tokenizer_mode: TokenizerMode | str = "auto",
    skip_tokenizer_init: bool = False,
    trust_remote_code: bool = False,
    allowed_local_media_path: str = "",
    allowed_media_domains: list[str] | None = None,
    tensor_parallel_size: int = 1,
    dtype: ModelDType = "auto",
    quantization: QuantizationMethods | None = None,
    revision: str | None = None,
    tokenizer_revision: str | None = None,
    chat_template: Path | str | None = None,
    seed: int = 0,
    gpu_memory_utilization: float = 0.92,
    cpu_offload_gb: float = 0,
    offload_group_size: int = 0,
    offload_num_in_group: int = 1,
    offload_prefetch_step: int = 1,
    offload_params: set[str] | None = None,
    enforce_eager: bool = False,
    enable_return_routed_experts: bool = False,
    disable_custom_all_reduce: bool = False,
    hf_token: bool | str | None = None,
    hf_overrides: HfOverrides | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
    pooler_config: PoolerConfig | None = None,
    structured_outputs_config: dict[str, Any]
    | StructuredOutputsConfig
    | None = None,
    profiler_config: dict[str, Any]
    | ProfilerConfig
    | None = None,
    attention_config: dict[str, Any]
    | AttentionConfig
    | None = None,
    kv_cache_memory_bytes: int | None = None,
    compilation_config: int
    | dict[str, Any]
    | CompilationConfig
    | None = None,
    quantization_config: dict[str, Any]
    | QuantizationConfigArgs
    | None = None,
    logits_processors: list[str | type[LogitsProcessor]]
    | None = None,
    spec_method: str | None = None,
    spec_model: str | None = None,
    spec_tokens: int | None = None,
    **kwargs: Any,
) -> None

LLM constructor.

Source code in vllm/entrypoints/llm.py
def __init__(
    self,
    model: str,
    *,
    runner: RunnerOption = "auto",
    convert: ConvertOption = "auto",
    tokenizer: str | None = None,
    tokenizer_mode: TokenizerMode | str = "auto",
    skip_tokenizer_init: bool = False,
    trust_remote_code: bool = False,
    allowed_local_media_path: str = "",
    allowed_media_domains: list[str] | None = None,
    tensor_parallel_size: int = 1,
    dtype: ModelDType = "auto",
    quantization: QuantizationMethods | None = None,
    revision: str | None = None,
    tokenizer_revision: str | None = None,
    chat_template: Path | str | None = None,
    seed: int = 0,
    gpu_memory_utilization: float = 0.92,
    cpu_offload_gb: float = 0,
    offload_group_size: int = 0,
    offload_num_in_group: int = 1,
    offload_prefetch_step: int = 1,
    offload_params: set[str] | None = None,
    enforce_eager: bool = False,
    enable_return_routed_experts: bool = False,
    disable_custom_all_reduce: bool = False,
    hf_token: bool | str | None = None,
    hf_overrides: HfOverrides | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
    pooler_config: PoolerConfig | None = None,
    structured_outputs_config: dict[str, Any]
    | StructuredOutputsConfig
    | None = None,
    profiler_config: dict[str, Any] | ProfilerConfig | None = None,
    attention_config: dict[str, Any] | AttentionConfig | None = None,
    kv_cache_memory_bytes: int | None = None,
    compilation_config: int | dict[str, Any] | CompilationConfig | None = None,
    quantization_config: dict[str, Any] | QuantizationConfigArgs | None = None,
    logits_processors: list[str | type[LogitsProcessor]] | None = None,
    spec_method: str | None = None,
    spec_model: str | None = None,
    spec_tokens: int | None = None,
    **kwargs: Any,
) -> None:
    """LLM constructor."""

    if "swap_space" in kwargs:
        kwargs.pop("swap_space")
        import warnings

        warnings.warn(
            "The 'swap_space' parameter is deprecated and ignored. "
            "It will be removed in a future version.",
            DeprecationWarning,
            stacklevel=2,
        )

    if "disable_log_stats" not in kwargs:
        kwargs["disable_log_stats"] = True

    if "worker_cls" in kwargs:
        worker_cls = kwargs["worker_cls"]
        # if the worker_cls is not qualified string name,
        # we serialize it using cloudpickle to avoid pickling issues
        if isinstance(worker_cls, type):
            kwargs["worker_cls"] = cloudpickle.dumps(worker_cls)

    if "kv_transfer_config" in kwargs and isinstance(
        kwargs["kv_transfer_config"], dict
    ):
        from vllm.config.kv_transfer import KVTransferConfig

        raw_config_dict = kwargs["kv_transfer_config"]
        try:
            kwargs["kv_transfer_config"] = KVTransferConfig(**raw_config_dict)
        except ValidationError as e:
            logger.error(
                "Failed to convert 'kv_transfer_config' dict to "
                "KVTransferConfig object. Dict: %s. Error: %s",
                raw_config_dict,
                e,
            )
            # Consider re-raising a more specific vLLM error or ValueError
            # to provide better context to the user.
            raise ValueError(f"Invalid 'kv_transfer_config' provided: {e}") from e

    if hf_overrides is None:
        hf_overrides = {}

    def _make_config(value: Any, cls: type[_R]) -> _R:
        """Convert dict/None/instance to a config instance."""
        if value is None:
            return cls()
        if isinstance(value, dict):
            return cls(**{k: v for k, v in value.items() if is_init_field(cls, k)})  # type: ignore[arg-type]
        return value

    if isinstance(compilation_config, int):
        compilation_config_instance = CompilationConfig(
            mode=CompilationMode(compilation_config)
        )
    else:
        compilation_config_instance = _make_config(
            compilation_config, CompilationConfig
        )

    structured_outputs_instance = _make_config(
        structured_outputs_config, StructuredOutputsConfig
    )
    profiler_config_instance = _make_config(profiler_config, ProfilerConfig)
    attention_config_instance = _make_config(attention_config, AttentionConfig)

    # warn about single-process data parallel usage.
    _dp_size = int(kwargs.get("data_parallel_size", 1))
    _distributed_executor_backend = kwargs.get("distributed_executor_backend")
    if (
        _dp_size > 1
        and not _distributed_executor_backend == "external_launcher"
        and not current_platform.is_tpu()
    ):
        raise ValueError(
            f"LLM(data_parallel_size={_dp_size}) is not supported for single-"
            "process usage and may hang. Please use "
            "the explicit multi-process data-parallel example at "
            "'examples/features/data_parallel/data_parallel_offline.py'."
        )

    engine_args = EngineArgs(
        model=model,
        runner=runner,
        convert=convert,
        tokenizer=tokenizer,
        tokenizer_mode=tokenizer_mode,
        skip_tokenizer_init=skip_tokenizer_init,
        trust_remote_code=trust_remote_code,
        allowed_local_media_path=allowed_local_media_path,
        allowed_media_domains=allowed_media_domains,
        tensor_parallel_size=tensor_parallel_size,
        dtype=dtype,
        quantization=quantization,
        revision=revision,
        tokenizer_revision=tokenizer_revision,
        seed=seed,
        gpu_memory_utilization=gpu_memory_utilization,
        kv_cache_memory_bytes=kv_cache_memory_bytes,
        cpu_offload_gb=cpu_offload_gb,
        offload_group_size=offload_group_size,
        offload_num_in_group=offload_num_in_group,
        offload_prefetch_step=offload_prefetch_step,
        offload_params=offload_params or set(),
        enforce_eager=enforce_eager,
        enable_return_routed_experts=enable_return_routed_experts,
        disable_custom_all_reduce=disable_custom_all_reduce,
        hf_token=hf_token,
        hf_overrides=hf_overrides,
        mm_processor_kwargs=mm_processor_kwargs,
        pooler_config=pooler_config,
        structured_outputs_config=structured_outputs_instance,
        profiler_config=profiler_config_instance,
        attention_config=attention_config_instance,
        compilation_config=compilation_config_instance,
        quantization_config=quantization_config,
        logits_processors=logits_processors,
        spec_method=spec_method,
        spec_model=spec_model,
        spec_tokens=spec_tokens,
        **kwargs,
    )

    log_non_default_args(engine_args)

    self.llm_engine = LLMEngine.from_engine_args(
        engine_args=engine_args, usage_context=UsageContext.LLM_CLASS
    )
    self.model_config = self.llm_engine.model_config
    self.engine_class = type(self.llm_engine)

    self.request_counter = Counter()
    self.default_sampling_params: dict[str, Any] | None = None

    supported_tasks = self.llm_engine.get_supported_tasks()
    self.supported_tasks = supported_tasks

    self.runner_type = self.model_config.runner_type
    self.renderer = self.llm_engine.renderer
    self.chat_template = load_chat_template(chat_template)
    self.input_processor = self.llm_engine.input_processor

    # The renderer thread pool is only consumed by the async renderer
    # path; the synchronous `LLM` entrypoint runs multimodal
    # preprocessing serially. Warn so the setting is not a silent
    # no-op. See vllm-project/vllm#42901.
    if self.model_config.renderer_num_workers > 1:
        logger.warning_once(
            "`renderer_num_workers=%d` was set, but the offline `LLM` "
            "entrypoint uses the synchronous renderer path and runs "
            "multimodal preprocessing serially across prompts. The "
            "renderer thread pool is only consumed by the async "
            "renderer path used by `vllm serve` / `AsyncLLM`, so this "
            "setting has no effect here.",
            self.model_config.renderer_num_workers,
        )

    PoolingOfflineMixin.__init__(self)

    # Cache for __repr__ to avoid repeated collective_rpc calls
    self._cached_repr: str | None = None

__repr__

__repr__() -> str

Return a transformers-style hierarchical view of the model.

Source code in vllm/entrypoints/llm.py
def __repr__(self) -> str:
    """Return a transformers-style hierarchical view of the model."""
    # Cache the result to avoid repeated collective_rpc calls
    if self._cached_repr is None:
        results = self.llm_engine.collective_rpc("get_model_inspection")
        # In distributed settings, we get results from all workers
        # Just return the first one (they should all be the same)
        if results:
            self._cached_repr = results[0]
        else:
            self._cached_repr = f"LLM(model={self.model_config.model!r})"
    return self._cached_repr

apply_model

apply_model(func: Callable[[Module], _R]) -> list[_R]

Run a function directly on the model inside each worker, returning the result for each of them.

Warning

To reduce the overhead of data transfer, avoid returning large arrays or tensors from this method. If you must return them, make sure you move them to CPU first to avoid taking up additional VRAM!

Source code in vllm/entrypoints/llm.py
def apply_model(self, func: Callable[[nn.Module], _R]) -> list[_R]:
    """
    Run a function directly on the model inside each worker,
    returning the result for each of them.

    !!! warning
        To reduce the overhead of data transfer, avoid returning large
        arrays or tensors from this method. If you must return them,
        make sure you move them to CPU first to avoid taking up additional
        VRAM!
    """
    return self.llm_engine.apply_model(func)

chat

chat(
    messages: list[ChatCompletionMessageParam]
    | Sequence[list[ChatCompletionMessageParam]],
    sampling_params: SamplingParams
    | Sequence[SamplingParams]
    | None = None,
    use_tqdm: bool | Callable[..., tqdm] = True,
    lora_request: Sequence[LoRARequest]
    | LoRARequest
    | None = None,
    chat_template: str | None = None,
    chat_template_content_format: ChatTemplateContentFormatOption = "auto",
    add_generation_prompt: bool = True,
    continue_final_message: bool = False,
    tools: list[dict[str, Any]] | None = None,
    chat_template_kwargs: dict[str, Any] | None = None,
    tokenization_kwargs: dict[str, Any] | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
) -> list[RequestOutput]

Generate responses for a chat conversation.

The chat conversation is converted into a text prompt using the tokenizer and calls the generate method to generate the responses.

Multi-modal inputs can be passed in the same way you would pass them to the OpenAI API.

Parameters:

Name Type Description Default
messages list[ChatCompletionMessageParam] | Sequence[list[ChatCompletionMessageParam]]

A sequence of conversations or a single conversation.

  • Each conversation is represented as a list of messages.
  • Each message is a dictionary with 'role' and 'content' keys.
required
sampling_params SamplingParams | Sequence[SamplingParams] | None

The sampling parameters for text generation. If None, we use the default sampling parameters. When it is a single value, it is applied to every prompt. When it is a list, the list must have the same length as the prompts and it is paired one by one with the prompt.

None
use_tqdm bool | Callable[..., tqdm]

If True, shows a tqdm progress bar. If a callable (e.g., functools.partial(tqdm, leave=False)), it is used to create the progress bar. If False, no progress bar is created.

True
lora_request Sequence[LoRARequest] | LoRARequest | None

LoRA request to use for generation, if any.

None
chat_template str | None

The template to use for structuring the chat. If not provided, the model's default chat template will be used.

None
chat_template_content_format ChatTemplateContentFormatOption

The format to render message content.

  • "string" will render the content as a string. Example: "Who are you?"
  • "openai" will render the content as a list of dictionaries, similar to OpenAI schema. Example: [{"type": "text", "text": "Who are you?"}]
'auto'
add_generation_prompt bool

If True, adds a generation template to each message.

True
continue_final_message bool

If True, continues the final message in the conversation instead of starting a new one. Cannot be True if add_generation_prompt is also True.

False
chat_template_kwargs dict[str, Any] | None

Additional kwargs to pass to the chat template.

None
tokenization_kwargs dict[str, Any] | None

Overrides for tokenizer.encode.

None
mm_processor_kwargs dict[str, Any] | None

Overrides for processor.__call__.

None

Returns:

Type Description
list[RequestOutput]

A list of RequestOutput objects containing the generated

list[RequestOutput]

responses in the same order as the input messages.

Source code in vllm/entrypoints/llm.py
def chat(
    self,
    messages: list[ChatCompletionMessageParam]
    | Sequence[list[ChatCompletionMessageParam]],
    sampling_params: SamplingParams | Sequence[SamplingParams] | None = None,
    use_tqdm: bool | Callable[..., tqdm] = True,
    lora_request: Sequence[LoRARequest] | LoRARequest | None = None,
    chat_template: str | None = None,
    chat_template_content_format: ChatTemplateContentFormatOption = "auto",
    add_generation_prompt: bool = True,
    continue_final_message: bool = False,
    tools: list[dict[str, Any]] | None = None,
    chat_template_kwargs: dict[str, Any] | None = None,
    tokenization_kwargs: dict[str, Any] | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
) -> list[RequestOutput]:
    """
    Generate responses for a chat conversation.

    The chat conversation is converted into a text prompt using the
    tokenizer and calls the [generate][vllm.LLM.generate] method to generate
    the responses.

    Multi-modal inputs can be passed in the same way you would pass them
    to the OpenAI API.

    Args:
        messages: A sequence of conversations or a single conversation.

            - Each conversation is represented as a list of messages.
            - Each message is a dictionary with 'role' and 'content' keys.

        sampling_params: The sampling parameters for text generation.
            If None, we use the default sampling parameters. When it
            is a single value, it is applied to every prompt. When it
            is a list, the list must have the same length as the
            prompts and it is paired one by one with the prompt.
        use_tqdm: If `True`, shows a tqdm progress bar.
            If a callable (e.g., `functools.partial(tqdm, leave=False)`),
            it is used to create the progress bar.
            If `False`, no progress bar is created.
        lora_request: LoRA request to use for generation, if any.
        chat_template: The template to use for structuring the chat.
            If not provided, the model's default chat template will be used.
        chat_template_content_format: The format to render message content.

            - "string" will render the content as a string.
              Example: `"Who are you?"`
            - "openai" will render the content as a list of dictionaries,
              similar to OpenAI schema.
              Example: `[{"type": "text", "text": "Who are you?"}]`

        add_generation_prompt: If True, adds a generation template
            to each message.
        continue_final_message: If True, continues the final message in
            the conversation instead of starting a new one. Cannot be
            `True` if `add_generation_prompt` is also `True`.
        chat_template_kwargs: Additional kwargs to pass to the chat
            template.
        tokenization_kwargs: Overrides for `tokenizer.encode`.
        mm_processor_kwargs: Overrides for `processor.__call__`.

    Returns:
        A list of `RequestOutput` objects containing the generated
        responses in the same order as the input messages.
    """
    model_config = self.model_config
    runner_type = model_config.runner_type
    if runner_type != "generate":
        raise ValueError(
            "LLM.chat() is only supported for generative models. "
            "Try passing `--runner generate` to use the model as a "
            "generative model."
        )

    if sampling_params is None:
        sampling_params = self.get_default_sampling_params()

    return self._run_chat(
        messages=messages,
        params=sampling_params,
        output_type=RequestOutput,
        use_tqdm=use_tqdm,
        lora_request=lora_request,
        chat_template=chat_template,
        chat_template_content_format=chat_template_content_format,
        chat_template_kwargs=chat_template_kwargs,
        add_generation_prompt=add_generation_prompt,
        continue_final_message=continue_final_message,
        tools=tools,
        tokenization_kwargs=tokenization_kwargs,
        mm_processor_kwargs=mm_processor_kwargs,
    )

collective_rpc

collective_rpc(
    method: str | Callable[..., _R],
    timeout: float | None = None,
    args: tuple = (),
    kwargs: dict[str, Any] | None = None,
) -> list[_R]

Execute an RPC call on all workers.

Parameters:

Name Type Description Default
method str | Callable[..., _R]

Name of the worker method to execute, or a callable that is serialized and sent to all workers to execute.

If the method is a callable, it should accept an additional self argument, in addition to the arguments passed in args and kwargs. The self argument will be the worker object.

required
timeout float | None

Maximum time in seconds to wait for execution. Raises a TimeoutError on timeout. None means wait indefinitely.

None
args tuple

Positional arguments to pass to the worker method.

()
kwargs dict[str, Any] | None

Keyword arguments to pass to the worker method.

None

Returns:

Type Description
list[_R]

A list containing the results from each worker.

Note

It is recommended to use this API to only pass control messages, and set up data-plane communication to pass data.

Source code in vllm/entrypoints/llm.py
def collective_rpc(
    self,
    method: str | Callable[..., _R],
    timeout: float | None = None,
    args: tuple = (),
    kwargs: dict[str, Any] | None = None,
) -> list[_R]:
    """
    Execute an RPC call on all workers.

    Args:
        method: Name of the worker method to execute, or a callable that
            is serialized and sent to all workers to execute.

            If the method is a callable, it should accept an additional
            `self` argument, in addition to the arguments passed in `args`
            and `kwargs`. The `self` argument will be the worker object.
        timeout: Maximum time in seconds to wait for execution. Raises a
            [`TimeoutError`][] on timeout. `None` means wait indefinitely.
        args: Positional arguments to pass to the worker method.
        kwargs: Keyword arguments to pass to the worker method.

    Returns:
        A list containing the results from each worker.

    Note:
        It is recommended to use this API to only pass control messages,
        and set up data-plane communication to pass data.
    """

    return self.llm_engine.collective_rpc(method, timeout, args, kwargs)

enqueue

enqueue(
    prompts: PromptType | Sequence[PromptType],
    sampling_params: SamplingParams
    | Sequence[SamplingParams]
    | None = None,
    lora_request: Sequence[LoRARequest]
    | LoRARequest
    | None = None,
    priority: list[int] | None = None,
    use_tqdm: bool | Callable[..., tqdm] = True,
    tokenization_kwargs: dict[str, Any] | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
) -> list[str]

Enqueue prompts for generation without waiting for completion.

This method adds requests to the engine queue but does not start processing them. Use wait_for_completion() to process the queued requests and get results.

Parameters:

Name Type Description Default
prompts PromptType | Sequence[PromptType]

The prompts to the LLM. See generate() for details.

required
sampling_params SamplingParams | Sequence[SamplingParams] | None

The sampling parameters for text generation.

None
lora_request Sequence[LoRARequest] | LoRARequest | None

LoRA request to use for generation, if any.

None
priority list[int] | None

The priority of the requests, if any.

None
use_tqdm bool | Callable[..., tqdm]

If True, shows a tqdm progress bar while adding requests.

True
tokenization_kwargs dict[str, Any] | None

Overrides for tokenizer.encode.

None
mm_processor_kwargs dict[str, Any] | None

Overrides for processor.__call__.

None

Returns:

Type Description
list[str]

A list of request IDs for the enqueued requests.

Source code in vllm/entrypoints/llm.py
def enqueue(
    self,
    prompts: PromptType | Sequence[PromptType],
    sampling_params: SamplingParams | Sequence[SamplingParams] | None = None,
    lora_request: Sequence[LoRARequest] | LoRARequest | None = None,
    priority: list[int] | None = None,
    use_tqdm: bool | Callable[..., tqdm] = True,
    tokenization_kwargs: dict[str, Any] | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
) -> list[str]:
    """Enqueue prompts for generation without waiting for completion.

    This method adds requests to the engine queue but does not start
    processing them. Use wait_for_completion() to process the queued
    requests and get results.

    Args:
        prompts: The prompts to the LLM. See generate() for details.
        sampling_params: The sampling parameters for text generation.
        lora_request: LoRA request to use for generation, if any.
        priority: The priority of the requests, if any.
        use_tqdm: If True, shows a tqdm progress bar while adding requests.
        tokenization_kwargs: Overrides for `tokenizer.encode`.
        mm_processor_kwargs: Overrides for `processor.__call__`.

    Returns:
        A list of request IDs for the enqueued requests.
    """
    runner_type = self.model_config.runner_type
    if runner_type != "generate":
        raise ValueError("LLM.enqueue() is only supported for generative models.")

    if sampling_params is None:
        sampling_params = self.get_default_sampling_params()

    return self._add_completion_requests(
        prompts=prompts,
        params=sampling_params,
        use_tqdm=use_tqdm,
        lora_request=lora_request,
        priority=priority,
        tokenization_kwargs=tokenization_kwargs,
        mm_processor_kwargs=mm_processor_kwargs,
    )

enqueue_chat

enqueue_chat(
    messages: list[ChatCompletionMessageParam]
    | Sequence[list[ChatCompletionMessageParam]],
    sampling_params: SamplingParams
    | Sequence[SamplingParams]
    | None = None,
    use_tqdm: bool | Callable[..., tqdm] = True,
    lora_request: Sequence[LoRARequest]
    | LoRARequest
    | None = None,
    priority: list[int] | None = None,
    chat_template: str | None = None,
    chat_template_content_format: ChatTemplateContentFormatOption = "auto",
    add_generation_prompt: bool = True,
    continue_final_message: bool = False,
    tools: list[dict[str, Any]] | None = None,
    chat_template_kwargs: dict[str, Any] | None = None,
    tokenization_kwargs: dict[str, Any] | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
) -> list[str]

Enqueue chat conversations for generation without waiting.

This method renders chat conversations and adds the resulting requests to the engine queue. Use wait_for_completion() to get results. To guarantee that all requests are queued before scheduling starts, pause scheduling with sleep(level=0) before calling this method and resume it with wake_up(tags=["scheduling"]) afterward.

Parameters:

Name Type Description Default
messages list[ChatCompletionMessageParam] | Sequence[list[ChatCompletionMessageParam]]

A sequence of conversations or a single conversation. Each conversation is represented as a list of messages.

required
sampling_params SamplingParams | Sequence[SamplingParams] | None

The sampling parameters for text generation. If None, we use the default sampling parameters.

None
use_tqdm bool | Callable[..., tqdm]

If True, shows a tqdm progress bar while rendering conversations.

True
lora_request Sequence[LoRARequest] | LoRARequest | None

LoRA request to use for generation, if any.

None
priority list[int] | None

The priority of the requests, if any.

None
chat_template str | None

The template to use for structuring the chat.

None
chat_template_content_format ChatTemplateContentFormatOption

The format to render message content.

'auto'
add_generation_prompt bool

If True, adds a generation template to each message.

True
continue_final_message bool

If True, continues the final message in the conversation instead of starting a new one.

False
tools list[dict[str, Any]] | None

Tools to make available to the model, if any.

None
chat_template_kwargs dict[str, Any] | None

Additional kwargs to pass to the chat template.

None
tokenization_kwargs dict[str, Any] | None

Overrides for tokenizer.encode.

None
mm_processor_kwargs dict[str, Any] | None

Overrides for processor.__call__.

None

Returns:

Type Description
list[str]

A list of request IDs for the enqueued requests.

Source code in vllm/entrypoints/llm.py
def enqueue_chat(
    self,
    messages: list[ChatCompletionMessageParam]
    | Sequence[list[ChatCompletionMessageParam]],
    sampling_params: SamplingParams | Sequence[SamplingParams] | None = None,
    use_tqdm: bool | Callable[..., tqdm] = True,
    lora_request: Sequence[LoRARequest] | LoRARequest | None = None,
    priority: list[int] | None = None,
    chat_template: str | None = None,
    chat_template_content_format: ChatTemplateContentFormatOption = "auto",
    add_generation_prompt: bool = True,
    continue_final_message: bool = False,
    tools: list[dict[str, Any]] | None = None,
    chat_template_kwargs: dict[str, Any] | None = None,
    tokenization_kwargs: dict[str, Any] | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
) -> list[str]:
    """Enqueue chat conversations for generation without waiting.

    This method renders chat conversations and adds the resulting requests
    to the engine queue. Use wait_for_completion() to get results. To
    guarantee that all requests are queued before scheduling starts, pause
    scheduling with sleep(level=0) before calling this method and resume it
    with wake_up(tags=["scheduling"]) afterward.

    Args:
        messages: A sequence of conversations or a single conversation.
            Each conversation is represented as a list of messages.
        sampling_params: The sampling parameters for text generation.
            If None, we use the default sampling parameters.
        use_tqdm: If `True`, shows a tqdm progress bar while rendering
            conversations.
        lora_request: LoRA request to use for generation, if any.
        priority: The priority of the requests, if any.
        chat_template: The template to use for structuring the chat.
        chat_template_content_format: The format to render message content.
        add_generation_prompt: If True, adds a generation template
            to each message.
        continue_final_message: If True, continues the final message in
            the conversation instead of starting a new one.
        tools: Tools to make available to the model, if any.
        chat_template_kwargs: Additional kwargs to pass to the chat
            template.
        tokenization_kwargs: Overrides for `tokenizer.encode`.
        mm_processor_kwargs: Overrides for `processor.__call__`.

    Returns:
        A list of request IDs for the enqueued requests.
    """
    model_config = self.model_config
    runner_type = model_config.runner_type
    if runner_type != "generate":
        raise ValueError(
            "LLM.enqueue_chat() is only supported for generative models. "
            "Try passing `--runner generate` to use the model as a "
            "generative model."
        )

    if sampling_params is None:
        sampling_params = self.get_default_sampling_params()

    return self._add_chat_requests(
        messages=messages,
        params=sampling_params,
        use_tqdm=use_tqdm,
        lora_request=lora_request,
        priority=priority,
        chat_template=chat_template,
        chat_template_content_format=chat_template_content_format,
        chat_template_kwargs=chat_template_kwargs,
        add_generation_prompt=add_generation_prompt,
        continue_final_message=continue_final_message,
        tools=tools,
        tokenization_kwargs=tokenization_kwargs,
        mm_processor_kwargs=mm_processor_kwargs,
    )

finish_weight_update

finish_weight_update() -> None

Finish the current weight update.

Source code in vllm/entrypoints/llm.py
def finish_weight_update(self) -> None:
    """
    Finish the current weight update.
    """
    self.llm_engine.collective_rpc("finish_weight_update")

from_engine_args classmethod

from_engine_args(engine_args: EngineArgs) -> LLM

Create an LLM instance from EngineArgs.

Source code in vllm/entrypoints/llm.py
@classmethod
def from_engine_args(cls, engine_args: EngineArgs) -> "LLM":
    """Create an LLM instance from EngineArgs."""
    return cls(**vars(engine_args))

generate

generate(
    prompts: PromptType | Sequence[PromptType],
    sampling_params: SamplingParams
    | Sequence[SamplingParams]
    | None = None,
    *,
    use_tqdm: bool | Callable[..., tqdm] = True,
    lora_request: Sequence[LoRARequest]
    | LoRARequest
    | None = None,
    priority: list[int] | None = None,
    tokenization_kwargs: dict[str, Any] | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
) -> list[RequestOutput]

Generates the completions for the input prompts.

This class automatically batches the given prompts, considering the memory constraint. For the best performance, put all of your prompts into a single list and pass it to this method.

Parameters:

Name Type Description Default
prompts PromptType | Sequence[PromptType]

The prompts to the LLM. You may pass a sequence of prompts for batch inference. See PromptType for more details about the format of each prompt.

required
sampling_params SamplingParams | Sequence[SamplingParams] | None

The sampling parameters for text generation. If None, we use the default sampling parameters. When it is a single value, it is applied to every prompt. When it is a list, the list must have the same length as the prompts and it is paired one by one with the prompt.

None
use_tqdm bool | Callable[..., tqdm]

If True, shows a tqdm progress bar. If a callable (e.g., functools.partial(tqdm, leave=False)), it is used to create the progress bar. If False, no progress bar is created.

True
lora_request Sequence[LoRARequest] | LoRARequest | None

LoRA request to use for generation, if any.

None
priority list[int] | None

The priority of the requests, if any. Only applicable when priority scheduling policy is enabled. If provided, must be a list of integers matching the length of prompts, where each priority value corresponds to the prompt at the same index.

None
tokenization_kwargs dict[str, Any] | None

Overrides for tokenizer.encode.

None
mm_processor_kwargs dict[str, Any] | None

Overrides for processor.__call__.

None

Returns:

Type Description
list[RequestOutput]

A list of RequestOutput objects containing the

list[RequestOutput]

generated completions in the same order as the input prompts.

Source code in vllm/entrypoints/llm.py
def generate(
    self,
    prompts: PromptType | Sequence[PromptType],
    sampling_params: SamplingParams | Sequence[SamplingParams] | None = None,
    *,
    use_tqdm: bool | Callable[..., tqdm] = True,
    lora_request: Sequence[LoRARequest] | LoRARequest | None = None,
    priority: list[int] | None = None,
    tokenization_kwargs: dict[str, Any] | None = None,
    mm_processor_kwargs: dict[str, Any] | None = None,
) -> list[RequestOutput]:
    """Generates the completions for the input prompts.

    This class automatically batches the given prompts, considering
    the memory constraint. For the best performance, put all of your prompts
    into a single list and pass it to this method.

    Args:
        prompts: The prompts to the LLM. You may pass a sequence of prompts
            for batch inference. See [PromptType][vllm.inputs.PromptType]
            for more details about the format of each prompt.
        sampling_params: The sampling parameters for text generation. If
            None, we use the default sampling parameters.
            When it is a single value, it is applied to every prompt.
            When it is a list, the list must have the same length as the
            prompts and it is paired one by one with the prompt.
        use_tqdm: If `True`, shows a tqdm progress bar.
            If a callable (e.g., `functools.partial(tqdm, leave=False)`),
            it is used to create the progress bar.
            If `False`, no progress bar is created.
        lora_request: LoRA request to use for generation, if any.
        priority: The priority of the requests, if any.
            Only applicable when priority scheduling policy is enabled.
            If provided, must be a list of integers matching the length
            of `prompts`, where each priority value corresponds to the prompt
            at the same index.
        tokenization_kwargs: Overrides for `tokenizer.encode`.
        mm_processor_kwargs: Overrides for `processor.__call__`.

    Returns:
        A list of `RequestOutput` objects containing the
        generated completions in the same order as the input prompts.
    """
    runner_type = self.model_config.runner_type
    if runner_type != "generate":
        raise ValueError(
            "LLM.generate() is only supported for generative models. "
            "Try passing `--runner generate` to use the model as a "
            "generative model."
        )

    if sampling_params is None:
        sampling_params = self.get_default_sampling_params()

    return self._run_completion(
        prompts=prompts,
        params=sampling_params,
        output_type=RequestOutput,
        use_tqdm=use_tqdm,
        lora_request=lora_request,
        tokenization_kwargs=tokenization_kwargs,
        priority=priority,
        mm_processor_kwargs=mm_processor_kwargs,
    )

get_metrics

get_metrics() -> list[Metric]

Return a snapshot of aggregated metrics from Prometheus.

Returns:

Type Description
list[Metric]

A MetricSnapshot instance capturing the current state

list[Metric]

of all aggregated metrics from Prometheus.

Note

This method is only available with the V1 LLM engine.

Source code in vllm/entrypoints/llm.py
def get_metrics(self) -> list["Metric"]:
    """Return a snapshot of aggregated metrics from Prometheus.

    Returns:
        A `MetricSnapshot` instance capturing the current state
        of all aggregated metrics from Prometheus.

    Note:
        This method is only available with the V1 LLM engine.
    """
    return self.llm_engine.get_metrics()

get_world_size

get_world_size(include_dp: bool = True) -> int

Get the world size from the parallel config.

Parameters:

Name Type Description Default
include_dp bool

If True (default), returns the world size including data parallelism (TP * PP * DP). If False, returns the world size without data parallelism (TP * PP).

True

Returns:

Type Description
int

The world size (tensor_parallel_size * pipeline_parallel_size),

int

optionally multiplied by data_parallel_size if include_dp is True.

Source code in vllm/entrypoints/llm.py
def get_world_size(self, include_dp: bool = True) -> int:
    """Get the world size from the parallel config.

    Args:
        include_dp: If True (default), returns the world size including
            data parallelism (TP * PP * DP). If False, returns the world
            size without data parallelism (TP * PP).

    Returns:
        The world size (tensor_parallel_size * pipeline_parallel_size),
        optionally multiplied by data_parallel_size if include_dp is True.
    """
    parallel_config = self.llm_engine.vllm_config.parallel_config
    if include_dp:
        return parallel_config.world_size_across_dp
    return parallel_config.world_size

init_weight_transfer_engine

init_weight_transfer_engine(
    request: WeightTransferInitRequest | dict,
) -> None

Initialize weight transfer for RL training.

Parameters:

Name Type Description Default
request WeightTransferInitRequest | dict

Weight transfer initialization request with backend-specific info

required
Source code in vllm/entrypoints/llm.py
def init_weight_transfer_engine(
    self, request: WeightTransferInitRequest | dict
) -> None:
    """
    Initialize weight transfer for RL training.

    Args:
        request: Weight transfer initialization request with backend-specific info
    """
    init_info_dict = (
        request["init_info"] if isinstance(request, dict) else request.init_info
    )

    self.llm_engine.collective_rpc(
        "init_weight_transfer_engine", kwargs={"init_info": init_info_dict}
    )

sleep

sleep(level: int = 1, mode: PauseMode = 'abort')

Put the engine to sleep. The engine should not process any requests. The caller should guarantee that no requests are being processed during the sleep period, before wake_up is called.

Parameters:

Name Type Description Default
level int

The sleep level. - Level 0: Pause scheduling but continue accepting requests. Requests are queued but not processed. - Level 1: Offload model weights to CPU, discard KV cache. The content of kv cache is forgotten. Good for sleeping and waking up the engine to run the same model again. Please make sure there's enough CPU memory to store the model weights. - Level 2: Discard all GPU memory (weights + KV cache). Good for sleeping and waking up the engine to run a different model or update the model, where previous model weights are not needed. It reduces CPU memory pressure.

1
mode PauseMode

How to handle any existing requests, can be "abort", "wait", or "keep".

'abort'
Source code in vllm/entrypoints/llm.py
def sleep(self, level: int = 1, mode: PauseMode = "abort"):
    """
    Put the engine to sleep. The engine should not process any requests.
    The caller should guarantee that no requests are being processed
    during the sleep period, before `wake_up` is called.

    Args:
        level: The sleep level.
            - Level 0: Pause scheduling but continue accepting requests.
                       Requests are queued but not processed.
            - Level 1: Offload model weights to CPU, discard KV cache.
                       The content of kv cache is forgotten. Good for
                       sleeping and waking up the engine to run the same
                       model again. Please make sure there's enough CPU
                       memory to store the model weights.
            - Level 2: Discard all GPU memory (weights + KV cache).
                       Good for sleeping and waking up the engine to run
                       a different model or update the model, where
                       previous model weights are not needed. It reduces
                       CPU memory pressure.
        mode: How to handle any existing requests, can be "abort", "wait",
            or "keep".
    """
    self.llm_engine.sleep(level=level, mode=mode)

start_profile

start_profile(profile_prefix: str | None = None) -> None

Start profiling with optional custom trace prefix.

Parameters:

Name Type Description Default
profile_prefix str | None

Optional prefix for the trace file names. If provided, trace files will be named as "_dp_pp_tp". If not provided, default naming will be used.

None
Source code in vllm/entrypoints/llm.py
def start_profile(self, profile_prefix: str | None = None) -> None:
    """Start profiling with optional custom trace prefix.

    Args:
        profile_prefix: Optional prefix for the trace file names. If provided,
                       trace files will be named as "<prefix>_dp<X>_pp<Y>_tp<Z>".
                       If not provided, default naming will be used.
    """
    self.llm_engine.start_profile(profile_prefix)

start_weight_update

start_weight_update(
    is_checkpoint_format: bool = True,
) -> None

Start a new weight update.

Parameters:

Name Type Description Default
is_checkpoint_format bool

Whether incoming weights are in checkpoint format (need layerwise processing) or kernel format (direct copy).

True
Source code in vllm/entrypoints/llm.py
def start_weight_update(self, is_checkpoint_format: bool = True) -> None:
    """
    Start a new weight update.

    Args:
        is_checkpoint_format: Whether incoming weights are in checkpoint
            format (need layerwise processing) or kernel format (direct
            copy).
    """
    self.llm_engine.collective_rpc(
        "start_weight_update",
        kwargs={"is_checkpoint_format": is_checkpoint_format},
    )

update_weights

update_weights(
    request: WeightTransferUpdateRequest | dict,
) -> None

Update the weights of the model.

Parameters:

Name Type Description Default
request WeightTransferUpdateRequest | dict

Weight update request with backend-specific update info

required
Source code in vllm/entrypoints/llm.py
def update_weights(self, request: WeightTransferUpdateRequest | dict) -> None:
    """
    Update the weights of the model.

    Args:
        request: Weight update request with backend-specific update info
    """
    update_info_dict = (
        request["update_info"] if isinstance(request, dict) else request.update_info
    )

    self.llm_engine.collective_rpc(
        "update_weights", kwargs={"update_info": update_info_dict}
    )

wait_for_completion

wait_for_completion(
    *, use_tqdm: bool | Callable[..., tqdm] = True
) -> list[RequestOutput | PoolingRequestOutput]
wait_for_completion(
    output_type: type[_O] | tuple[type[_O], ...],
    *,
    use_tqdm: bool | Callable[..., tqdm] = True,
) -> list[_O]
wait_for_completion(
    output_type: type[Any]
    | tuple[type[Any], ...]
    | None = None,
    *,
    use_tqdm: bool | Callable[..., tqdm] = True,
) -> list[Any]

Wait for all enqueued requests to complete and return results.

This method processes all requests currently in the engine queue and returns their outputs. Use after enqueue() to get results.

Parameters:

Name Type Description Default
output_type type[Any] | tuple[type[Any], ...] | None

The expected output type, defaults to RequestOutput.

None
use_tqdm bool | Callable[..., tqdm]

If True, shows a tqdm progress bar.

True

Returns:

Type Description
list[Any]

A list of output objects for all completed requests.

Source code in vllm/entrypoints/llm.py
def wait_for_completion(
    self,
    output_type: type[Any] | tuple[type[Any], ...] | None = None,
    *,
    use_tqdm: bool | Callable[..., tqdm] = True,
) -> list[Any]:
    """Wait for all enqueued requests to complete and return results.

    This method processes all requests currently in the engine queue
    and returns their outputs. Use after enqueue() to get results.

    Args:
        output_type: The expected output type, defaults to RequestOutput.
        use_tqdm: If True, shows a tqdm progress bar.

    Returns:
        A list of output objects for all completed requests.
    """
    if output_type is None:
        output_type = (RequestOutput, PoolingRequestOutput)

    return self._run_engine(output_type, use_tqdm=use_tqdm)

wake_up

wake_up(tags: list[str] | None = None)

Wake up the engine from sleep mode. See the sleep method for more details.

Parameters:

Name Type Description Default
tags list[str] | None

An optional list of tags to reallocate the engine memory for specific memory allocations. Values must be in ("weights", "kv_cache", "scheduling"). If None, all memory is reallocated. wake_up should be called with all tags (or None) before the engine is used again. Use tags=["scheduling"] to resume from level 0 sleep.

None
Source code in vllm/entrypoints/llm.py
def wake_up(self, tags: list[str] | None = None):
    """
    Wake up the engine from sleep mode. See the [sleep][vllm.LLM.sleep]
    method for more details.

    Args:
        tags: An optional list of tags to reallocate the engine memory
            for specific memory allocations. Values must be in
            `("weights", "kv_cache", "scheduling")`. If None, all memory
            is reallocated. wake_up should be called with all tags
            (or None) before the engine is used again.
            Use tags=["scheduling"] to resume from level 0 sleep.
    """
    self.llm_engine.wake_up(tags)