vlm.rst 5.72 KB
Newer Older
1
2
3
4
5
.. _vlm:

Using VLMs
==========

6
7
vLLM provides experimental support for Vision Language Models (VLMs). See the :ref:`list of supported VLMs here <supported_vlms>`.
This document shows you how to run and serve these models using vLLM.
8

9
10
11
.. important::
    We are actively iterating on VLM support. Expect breaking changes to VLM usage and development in upcoming releases without prior deprecation.

12
13
14
    Currently, the support for vision language models on vLLM has the following limitations:

    * Only single image input is supported per text prompt.
SangBin Cho's avatar
SangBin Cho committed
15

Cyrus Leung's avatar
Cyrus Leung committed
16
    We are continuously improving user & developer experience for VLMs. Please `open an issue on GitHub <https://github.com/vllm-project/vllm/issues/new/choose>`_ if you have any feedback or feature requests.
17

18
19
20
21
22
23
24
Offline Batched Inference
-------------------------

To initialize a VLM, the aforementioned arguments must be passed to the ``LLM`` class for instantiating the engine.

.. code-block:: python

25
    llm = LLM(model="llava-hf/llava-1.5-7b-hf")
26

27
.. important::
28
    We have removed all vision language related CLI args in the ``0.5.1`` release. **This is a breaking change**, so please update your code to follow
29
30
    the above snippet. Specifically, ``image_feature_size`` is no longer required to be specified as we now calculate that
    internally for each model.
31
32


33
To pass an image to the model, note the following in :class:`vllm.inputs.PromptInputs`:
34

35
* ``prompt``: The prompt should follow the format that is documented on HuggingFace.
36
37
* ``multi_modal_data``: This is a dictionary that follows the schema defined in :class:`vllm.multimodal.MultiModalDataDict`. 

38
39
.. code-block:: python

40
41
    # Refer to the HuggingFace repo for the correct format to use
    prompt = "USER: <image>\nWhat is the content of this image?\nASSISTANT:"
42
43

    # Load the image using PIL.Image
44
45
46
    image = PIL.Image.open(...)
    
    # Single prompt inference
47
48
    outputs = llm.generate({
        "prompt": prompt,
49
        "multi_modal_data": {"image": image},
50
51
52
53
54
    })

    for o in outputs:
        generated_text = o.outputs[0].text
        print(generated_text)
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
    
    # Batch inference
    image_1 = PIL.Image.open(...)
    image_2 = PIL.Image.open(...)
    outputs = llm.generate(
        [
            {
                "prompt": "USER: <image>\nWhat is the content of this image?\nASSISTANT:",
                "multi_modal_data": {"image": image_1},
            },
            {
                "prompt": "USER: <image>\nWhat's the color of this image?\nASSISTANT:",
                "multi_modal_data": {"image": image_2},
            }
        ]
    )

    for o in outputs:
        generated_text = o.outputs[0].text
        print(generated_text)
75

76
A code example can be found in `examples/offline_inference_vision_language.py <https://github.com/vllm-project/vllm/blob/main/examples/offline_inference_vision_language.py>`_.
77

78

79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Online OpenAI Vision API Compatible Inference
----------------------------------------------

You can serve vision language models with vLLM's HTTP server that is compatible with `OpenAI Vision API <https://platform.openai.com/docs/guides/vision>`_.

.. note::
    Currently, vLLM supports only **single** ``image_url`` input per ``messages``. Support for multi-image inputs will be
    added in the future.

Below is an example on how to launch the same ``llava-hf/llava-1.5-7b-hf`` with vLLM API server.

.. important::
    Since OpenAI Vision API is based on `Chat <https://platform.openai.com/docs/api-reference/chat>`_ API, a chat template 
    is **required** to launch the API server if the model's tokenizer does not come with one. In this example, we use the 
    HuggingFace Llava chat template that you can find in the example folder `here <https://github.com/vllm-project/vllm/blob/main/examples/template_llava.jinja>`_.

.. code-block:: bash

97
    vllm serve llava-hf/llava-1.5-7b-hf --chat-template template_llava.jinja
98

99
.. important::
100
    We have removed all vision language related CLI args in the ``0.5.1`` release. **This is a breaking change**, so please update your code to follow
101
102
    the above snippet. Specifically, ``image_feature_size`` is no longer required to be specified as we now calculate that
    internally for each model.
103

104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
To consume the server, you can use the OpenAI client like in the example below:

.. code-block:: python

    from openai import OpenAI
    openai_api_key = "EMPTY"
    openai_api_base = "http://localhost:8000/v1"
    client = OpenAI(
        api_key=openai_api_key,
        base_url=openai_api_base,
    )
    chat_response = client.chat.completions.create(
        model="llava-hf/llava-1.5-7b-hf",
        messages=[{
            "role": "user",
            "content": [
120
121
                # NOTE: The prompt formatting with the image token `<image>` is not needed
                # since the prompt will be processed automatically by the API server.
122
123
124
125
126
127
128
129
130
131
132
133
                {"type": "text", "text": "What's in this image?"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
                    },
                },
            ],
        }],
    )
    print("Chat response:", chat_response)

134
135
A full code example can be found in `examples/openai_vision_api_client.py <https://github.com/vllm-project/vllm/blob/main/examples/openai_vision_api_client.py>`_.

136
137
138
139
140
141
142
143
144
.. note::

    By default, the timeout for fetching images through http url is ``5`` seconds. You can override this by setting the environment variable:

    .. code-block:: shell

        export VLLM_IMAGE_FETCH_TIMEOUT=<timeout>

.. note::
145
    There is no need to format the prompt in the API request since it will be handled by the server.