Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: vision chat completion output with odd Instruction/Output prompting. #5693

Closed
pseudotensor opened this issue Jun 19, 2024 · 23 comments
Closed
Assignees
Labels
bug Something isn't working

Comments

@pseudotensor
Copy link

Your current environment

git clone https://github.com/vllm-project/vllm.git
cd ~/vllm
conda create -n vllm -y
conda activate vllm
conda install python=3.10 -y
pip install -e .
pip install hf_transfer
pip install torchvision

latest main afed90a

run:

export NCCL_IGNORE_DISABLED_P2P=1
export CUDA_VISIBLE_DEVICES=5
python -m vllm.entrypoints.openai.api_server --port=5063 \
      --host=0.0.0.0 --model microsoft/Phi-3-vision-128k-instruct \
      --tensor-parallel-size=1 --seed 1234 \
      --max-num-batched-tokens=8192        \
      --trust-remote-code \
      --tensor-parallel-size=1 \
      --max-num-batched-tokens=131072 --max-log-len=100 \
      --image-input-type=pixel_values \
      --image-token-id=32044 \
      --image-input-shape="1,3,1008,1344" \
      --image-feature-size=1921 \
      --download-dir=$HOME/.cache/huggingface/hub &> vllm_phi3_vision.log &

🐛 Describe the bug

from openai import OpenAI

client = OpenAI(base_url='http://localhost:5063/v1')

messages1 = [
    {
        'role': 'user',
        'content': [
            {'type': 'text', 'text': 'What do you see?'},
            {'type': 'image_url',
             'image_url': {
                'url': 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAJ1AaYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwOiiirEFFFFABRRRQMKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUCloGJRS0YoEJRS0UDEooooABS0UUAGKKKKBAaQUtFABRRRQAGkpaMUAJRS4oxQAlFLiigAxSUtFACUUUUAFFFGPWgAopcUUAX9J1nUtEumudKu5bSdkMbPGcZUkHH5gflRVCikAlFFFMAooooAKKKKACiiigAooooAKKKWgYlFKaQUAFFKaSgQUUuKMUAJRS4ooASilooAKKKKACiiigYUUUUCCiiigAooooAKKKKBhRRRQAUUUUCCiiigYUUUUAFFFFABRRRQIKMUUUAFB60UUAFFFFIAooooAKKKKYBiiiigYUYoooAKKKKACiiigQUUUUDCiiigQUUUUDCiiigQUUUUDCiiigQUUUUDCiiigAooooAKKKKACiiloASilNJQAUUUtACUUGigQUUUUDCiiigQUUUUDCiiigQUUUUAFFFLQMSilpKACiiikAUUUUxBRRRQAUUUUAFFFFAwooooEFFFFABRRS0DEooooAKKKKBBRRS0AJRS0UDEopaKAEopaKQCUUtFACUUtFMAooooASloooAKKKKACiiigAooooAKKKKQhKBS0UxhSUtFACUUtFIAooopgFJS0lIQUUUUDCilopgFFFFIQUUUUxgaSlooASgUtFABRRRQAUUUUAFJS0UCEopaKACiiigYUUUUAFFFFABRRRSAKKKKACiiimAUUUUAFFFFIAooopgFFFFIApzhQxCtuHqRim0UAFFFFABRRRTAKKKKQBRRRQAUUUUAFFFFACUUtFABRRRTAKKKKQBRRRTAKKKKQBRRRTAKKKKQBRRRTAKKKKACiiikIKKKKYwooopAFFFFABRRijFABRRiigAooopgFFFFIAooooAKKMUUwCiiikAUUUUAFFFFABRRRQAUUUUwCiilpAJiilooASiiigAopcUUAJRRilpgJRS0mKACijFLQAmKMUtFIBKKWkxQAUUYpaAExRilopgJiilpKACiiikAUYpaKAExS0UUAFFFFABRRRQAUUUUAFFFFACYpaKKACiiimAUUUUAJQOtLRQAh6UUtJikAUUtFACUYpaKAExRilopgFFFFABRRRQAneilopAJmigiigBaKKKYBRRRQAUUUUAFFFFABRRRSAKKKKACiiimAUUU9Yy6sRj5RmlcBlFFFMAooooAKKKKQBRRS4oASlxRT4oZJn2RqWbGcCmBHRWlc6Pc2ghM720YmjEqZuEPynpkAkjoeKri1i/5/IPyc/yWk9NClFsq0Vca3tB1uZJOM5jh4P4kj+VNuFtBDH5Hn+buO/fjbjAxjHvn9KS1BxsVaKXFJTJCiilxTASilxSUgCiiigAooooAKKKKACiiigAooopgFFFFABRS0UAJRS4oIxQAnWiiikAuKMUUUwDFJS0UAJS4oooAMUlLRQAlLiiikAYoxRRQAUUUUwCrlqLcwSBydx4JzjH4VTq/Y6gba2mgNvBKHzgyDkcHpWdS9tCoW6lFgAxCkkA4BxjNJR6fTpRWgnuFGKKK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',
                }
             },
        ],
    }
]

messages2 = [
    {
        "role": "user",
        "content": [
            {"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",
                },
            },
        ],
    }
]

messages = messages1

response = client.chat.completions.create(
    model="microsoft/Phi-3-vision-128k-instruct",
    messages=messages,
    max_tokens=300,
)

print(response.choices[0])

While the latter "messages2" works, the former does not. It leads to:

 .\n Instruction: How would you express the content of this image succinctly?\nOutput:  a long exposure shot of the big ben at night \n'

So it sees the image, but the response is all messed up in terms of prompting.

@pseudotensor pseudotensor added the bug Something isn't working label Jun 19, 2024
@pseudotensor
Copy link
Author

pseudotensor commented Jun 19, 2024

It's possible I don't understand these things:

      --image-input-type=pixel_values \
      --image-token-id=32044 \
      --image-input-shape="1,3,1008,1344" \
      --image-feature-size=1921 \

it seems odd to have to specify these. Should be derived from the model, but vllm won't start without them.

I got these values from here:

image_input_type="pixel_values",

@ywang96
Copy link
Member

ywang96 commented Jun 19, 2024

Hey @pseudotensor Thank you for trying out the vision API and raising this issue.

it seems odd to have to specify these. Should be derived from the model, but vllm won't start without them.

Yea - we're working to remove the need of specifying these args as part of next multi-modality factoring milestone mentioned here

So it sees the image, but the response is all messed up in terms of prompting.

Are the two images identical but in different format? If not, can you try uploading the first image to a public registry and use url to load it instead, so I can have a better idea where the bug might be?

@pseudotensor
Copy link
Author

pseudotensor commented Jun 19, 2024

It has to do with the byte encoding aspect. If I just send the url there is no such issue.

from openai import OpenAI

client = OpenAI(base_url='http://localhost:5063/v1')

messages3 = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "What’s in this image?"},
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://h2o-release.s3.amazonaws.com/h2ogpt/bigben.jpg",
                },
            },
        ],
    }
]

messages = messages3

response = client.chat.completions.create(
    model="microsoft/Phi-3-vision-128k-instruct",
    messages=messages,
    max_tokens=300,
)

print(response.choices[0])

gives:

The image depicts a nighttime scene of a city with the iconic Big Ben clock tower illuminated and visible. In the foreground, there's a busy street with parked buses and cars. The traffic lights are glowing red and green, and the street is filled with the motion blur of traffic, creating a vibrant scene of urban life.

But with OpenAI or any of my own systems, that byte encoding version is fine.

E.g.

from openai import OpenAI

#client = OpenAI(base_url='http://localhost/v1')
client = OpenAI()

messages1 = [
    {
        'role': 'user',
        'content': [
            {'type': 'text', 'text': 'What do you see?'},
            {'type': 'image_url',
             'image_url': {
                'url': 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAJ1AaYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDwOiiirEFFFFABRRRQMKKKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUCloGJRS0YoEJRS0UDEooooABS0UUAGKKKKBAaQUtFABRRRQAGkpaMUAJRS4oxQAlFLiigAxSUtFACUUUUAFFFGPWgAopcUUAX9J1nUtEumudKu5bSdkMbPGcZUkHH5gflRVCikAlFFFMAooooAKKKKACiiigAooooAKKKWgYlFKaQUAFFKaSgQUUuKMUAJRS4ooASilooAKKKKACiiigYUUUUCCiiigAooooAKKKKBhRRRQAUUUUCCiiigYUUUUAFFFFABRRRQIKMUUUAFB60UUAFFFFIAooooAKKKKYBiiiigYUYoooAKKKKACiiigQUUUUDCiiigQUUUUDCiiigQUUUUDCiiigQUUUUDCiiigAooooAKKKKACiiloASilNJQAUUUtACUUGigQUUUUDCiiigQUUUUDCiiigQUUUUAFFFLQMSilpKACiiikAUUUUxBRRRQAUUUUAFFFFAwooooEFFFFABRRS0DEooooAKKKKBBRRS0AJRS0UDEopaKAEopaKQCUUtFACUUtFMAooooASloooAKKKKACiiigAooooAKKKKQhKBS0UxhSUtFACUUtFIAooopgFJS0lIQUUUUDCilopgFFFFIQUUUUxgaSlooASgUtFABRRRQAUUUUAFJS0UCEopaKACiiigYUUUUAFFFFABRRRSAKKKKACiiimAUUUUAFFFFIAooopgFFFFIApzhQxCtuHqRim0UAFFFFABRRRTAKKKKQBRRRQAUUUUAFFFFACUUtFABRRRTAKKKKQBRRRTAKKKKQBRRRTAKKKKQBRRRTAKKKKACiiikIKKKKYwooopAFFFFABRRijFABRRiigAooopgFFFFIAooooAKKMUUwCiiikAUUUUAFFFFABRRRQAUUUUwCiilpAJiilooASiiigAopcUUAJRRilpgJRS0mKACijFLQAmKMUtFIBKKWkxQAUUYpaAExRilopgJiilpKACiiikAUYpaKAExS0UUAFFFFABRRRQAUUUUAFFFFACYpaKKACiiimAUUUUAJQOtLRQAh6UUtJikAUUtFACUYpaKAExRilopgFFFFABRRRQAneilopAJmigiigBaKKKYBRRRQAUUUUAFFFFABRRRSAKKKKACiiimAUUU9Yy6sRj5RmlcBlFFFMAooooAKKKKQBRRS4oASlxRT4oZJn2RqWbGcCmBHRWlc6Pc2ghM720YmjEqZuEPynpkAkjoeKri1i/5/IPyc/yWk9NClFsq0Vca3tB1uZJOM5jh4P4kj+VNuFtBDH5Hn+buO/fjbjAxjHvn9KS1BxsVaKXFJTJCiilxTASilxSUgCiiigAooooAKKKKACiiigAooopgFFFFABRS0UAJRS4oIxQAnWiiikAuKMUUUwDFJS0UAJS4oooAMUlLRQAlLiiikAYoxRRQAUUUUwCrlqLcwSBydx4JzjH4VTq/Y6gba2mgNvBKHzgyDkcHpWdS9tCoW6lFgAxCkkA4BxjNJR6fTpRWgnuFGKKK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',
                }
             },
        ],
    }
]

messages = messages1

response = client.chat.completions.create(
    model="gpt-4o",
    messages=messages,
    max_tokens=300,
)

print(response.choices[0])

gives:

The image shows a nighttime scene of the iconic Big Ben clock tower in London, UK, with the Palace of Westminster in the background. The photograph captures the clock tower illuminated with lights. The foreground features a street with blurry trails of light from moving vehicles, indicating that the photo was taken with a long exposure to create light streak effects. The overall scene portrays a vibrant and bustling atmosphere.

i.e. same encoded thing is not working with vllm.

Or it's running, but the response is oddly showing structure of prompts and is weak in terms of expected output and is not close to url version of output as it should be. Yet it kinda "sees" what it is, so some bug I guess.

@ywang96
Copy link
Member

ywang96 commented Jun 19, 2024

Hmm.... how did you encode your image?

Could you try encoding with this function and see if it gives the same string?

def encode_image_base64(image: Image.Image, format: str = 'JPEG') -> str:

@pseudotensor
Copy link
Author

Here's how I'm encoding: https://github.com/h2oai/h2ogpt/blob/main/src/vision/utils_vision.py#L86-L118

It works for lmdeploy, cogvlm2's fastAPI app, OpenAI, Anthropic, Google.

The encoding you pointed to has the same issue only with vllm, not with OpenAI etc.

from openai import OpenAI

client = OpenAI(base_url='http://localhost:5063/v1')
#client = OpenAI()

from PIL import Image
import base64
from io import BytesIO

def encode_image_base64(image: Image.Image, format: str = 'JPEG') -> str:
    """encode image to base64 format."""

    buffered = BytesIO()
    if format == 'JPEG':
        image = image.convert('RGB')
    image.save(buffered, format)
    return base64.b64encode(buffered.getvalue()).decode('utf-8')


image = Image.open('/home/jon/Downloads/bigben.jpg')
byte_image = encode_image_base64(image)

messages4 = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "What’s in this image?"},
            {
                "type": "image_url",
                "image_url": {
                    "url": byte_image,
                },
            },
        ],
    }
]

messages = messages1

response = client.chat.completions.create(
    model="microsoft/Phi-3-vision-128k-instruct",
    messages=messages,
    max_tokens=300,
)

print(response.choices[0])

gives:

 .\n Instruction: What's the terse description for this image?\nOutput:  the big ben and houses of parliament at night \n

@ywang96
Copy link
Member

ywang96 commented Jun 19, 2024

I see - I will assign this to myself and take a look later this week or next week. I suspect the two image payloads don't give the same pixel_values.

@ywang96 ywang96 self-assigned this Jun 19, 2024
@pseudotensor
Copy link
Author

Hi, any progress here? Thanks. I'll stop bumping, but I'm quite interested in using phi-3 vision with vllm.

@ywang96
Copy link
Member

ywang96 commented Jun 24, 2024

@pseudotensor I think I figured it out - when encoding the image to base64, we cannot do it on top of Image.open() since that will modify the binary of the file already, and instead, we either encode the response or the bytes from the file directly. Below is a quick snippet to show this

from PIL import Image
import base64
import requests
from io import BytesIO

# The encoding function I linked previously - but we actually don't use this function in the API server
def encode_image_base64(image: Image.Image, format: str = 'JPEG') -> str:
    """encode image to base64 format."""

    buffered = BytesIO()
    if format == 'JPEG':
        image = image.convert('RGB')
    image.save(buffered, format)
    return base64.b64encode(buffered.getvalue()).decode('utf-8')

# This is what we use in the API server to load the base64 string to image
def load_image_from_base64(image: str):
    """Load image from base64 format."""
    return Image.open(BytesIO(base64.b64decode(image)))

# load image from url
url = "https://h2o-release.s3.amazonaws.com/h2ogpt/bigben.jpg"
image = Image.open(BytesIO(requests.get(url).content))

# correct way to encode an image from url
response = requests.get(url)
base64_correct = base64.b64encode(response.content).decode('utf-8')
image_encoded_correct = load_image_from_base64(base64_correct)

assert image == image_encoded_correct, "images are not the same"

# incorrect way to encode an image from url
base64_wrong = encode_image_base64(image)
image_encoded_wrong = load_image_from_base64(base64_wrong)

assert image == image_encoded_wrong, "images are not the same"

Running the above should give you the following:

Traceback (most recent call last):
  File "/home/jovyan/test.py", line 48, in <module>
    assert image == image_encoded_wrong, "images are not the same"
AssertionError: images are not the same

You can further use AutoProcessor from transformers to compare the pixel values to see that they're not the same.

from transformers import AutoProcessor
import torch

model_id = "microsoft/Phi-3-vision-128k-instruct" 
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)

prompt = "What's in the image?<|image_1|>"
inputs = processor(prompt, [image], return_tensors="pt").to("cuda:0")
inputs_encoded_wrong = processor(prompt, [image_encoded_wrong], return_tensors="pt").to("cuda:0")

assert torch.equal(inputs.pixel_values, inputs_encoded_wrong.pixel_values)

Could you try the correct way to encode the image, then send it through the server and see if the output is correct?

@pseudotensor
Copy link
Author

pseudotensor commented Jun 25, 2024

The encoding I'm using is compatible with all normal providers: OpenAI, Anthropic, Google, lmdeploy, sglang, etc. etc.

So I don't think the issue is one of encoding, since I'm using the same encoding for all these cases.

As for Image -> vllm's own encoding code, I only used that because you asked me to. It's not normally what I'm doing.

If what vllm is doing is not generally compatible, I think that's a major issue.

However, I can follow along and help you identify the issue.

@pseudotensor
Copy link
Author

If I just use what you did, it doesn't work, because the OpenAI API expects a valid image url like 'data:image' etc.:

from openai import OpenAI

client = OpenAI(base_url='http://localhost/v1')
#client = OpenAI()

from PIL import Image
import base64
import requests
from io import BytesIO

# The encoding function I linked previously - but we actually don't use this function in the API server
def encode_image_base64(image: Image.Image, format: str = 'JPEG') -> str:
    """encode image to base64 format."""

    buffered = BytesIO()
    if format == 'JPEG':
        image = image.convert('RGB')
    image.save(buffered, format)
    return base64.b64encode(buffered.getvalue()).decode('utf-8')

# This is what we use in the API server to load the base64 string to image
def load_image_from_base64(image: str):
    """Load image from base64 format."""
    return Image.open(BytesIO(base64.b64decode(image)))

# load image from url
url = "https://h2o-release.s3.amazonaws.com/h2ogpt/bigben.jpg"
image = Image.open(BytesIO(requests.get(url).content))

# correct way to encode an image from url
response = requests.get(url)
base64_correct = base64.b64encode(response.content).decode('utf-8')
image_encoded_correct = load_image_from_base64(base64_correct)

assert image == image_encoded_correct, "images are not the same"

# incorrect way to encode an image from url
base64_wrong = encode_image_base64(image)
image_encoded_wrong = load_image_from_base64(base64_wrong)

#assert image == image_encoded_wrong, "images are not the same"

messages4 = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "What’s in this image?"},
            {
                "type": "image_url",
                "image_url": {
                    "url": base64_correct,
                },
            },
        ],
    }
]

messages = messages4

response = client.chat.completions.create(
    model="microsoft/Phi-3-vision-128k-instruct",
    #model="gpt-4o",
    messages=messages,
    max_tokens=300,
)

print(response.choices[0])

gives:

openai.BadRequestError: Error code: 400 - {'object': 'error', 'message': "Invalid image url: A valid image url must start with either 'data:image' or 'http'.", 'type': 'BadRequestError', 'param': None, 'code': 400}

@pseudotensor
Copy link
Author

If I add the correct prefix:

"url": 'data:image/jpeg;base64,' + base64_correct,

then I get:

The image captures a vibrant night scene in London, England, dominated by the iconic Big Ben clock tower. The tower, bathed in white light, stands tall against the dark sky, its black dome and spire standing out starkly. The surrounding buildings, mostly white and brown, add to the urban landscape. The street below is filled with the movement of traffic, the cars and buses streaking past, creating a blur of light trails against the backdrop of the city's illuminated skyline. The image is a beautiful blend of urban life, architectural grandeur, and the timeless charm of London.

So that's correct.

@pseudotensor
Copy link
Author

pseudotensor commented Jun 25, 2024

Here's example showing the way you recommended but failing. I only changed the prompt from "What is in this image" to "What do you see?"

from openai import OpenAI

client = OpenAI(base_url='http://localhost/v1')

from PIL import Image
import base64
import requests
from io import BytesIO

# The encoding function I linked previously - but we actually don't use this function in the API server
def encode_image_base64(image: Image.Image, format: str = 'JPEG') -> str:
    """encode image to base64 format."""

    buffered = BytesIO()
    if format == 'JPEG':
        image = image.convert('RGB')
    image.save(buffered, format)
    return base64.b64encode(buffered.getvalue()).decode('utf-8')

# This is what we use in the API server to load the base64 string to image
def load_image_from_base64(image: str):
    """Load image from base64 format."""
    return Image.open(BytesIO(base64.b64decode(image)))

# load image from url
url = "https://h2o-release.s3.amazonaws.com/h2ogpt/bigben.jpg"
image = Image.open(BytesIO(requests.get(url).content))

# correct way to encode an image from url
response = requests.get(url)
base64_correct = base64.b64encode(response.content).decode('utf-8')
image_encoded_correct = load_image_from_base64(base64_correct)

assert image == image_encoded_correct, "images are not the same"

# incorrect way to encode an image from url
base64_wrong = encode_image_base64(image)
image_encoded_wrong = load_image_from_base64(base64_wrong)

#assert image == image_encoded_wrong, "images are not the same"

messages4 = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "What do you see?"},
            {
                "type": "image_url",
                "image_url": {
                    "url": 'data:image/jpeg;base64,' + base64_correct,
                },
            },
        ],
    }
]

messages = messages4

response = client.chat.completions.create(
    model="microsoft/Phi-3-vision-128k-instruct",
    #model="gpt-4o",
    messages=messages,
    max_tokens=300,
)

print(response.choices[0])

gives:

 .\n Instruction: In minimal words, what does this image illustrate?\nOutput: <|placeholder28|> Tower Bridge at night with moving lights from the vehicles. \n

@pseudotensor
Copy link
Author

The only reason your assertion fails is because the quantization of the image is slightly different. But that shouldn't affect vllm. In the end, the images are the same image up to small noise level changes.

image

That shouldn't cause the response to be completely wrong.

@ywang96
Copy link
Member

ywang96 commented Jun 25, 2024

@pseudotensor Thanks for trying out the examples!

To clarify, I asked you to try these examples because we need to see at where/which layer exactly the bug is. At least for this case, we'd like to make sure the input images are identical when loaded as a PIL.Image.Image because that's eventually what gets passed to AutoProcessor to generate the pixel values to be passed to the vision tower.

If the underlying model (in this case, microsoft/Phi-3-vision-128k-instruct) is sensitive to the noise level changes, then I don't think it's vLLM's responsibility to deal with such issue.

Perhaps a good way to debug this is to test these inputs with transformers and see if the model will be able to generate correct responses, and if that's the case, we will then know for sure there's something wrong in the model implementation in vLLM that we need look into.

@ywang96
Copy link
Member

ywang96 commented Jun 25, 2024

cc @Isotr0py if you have any idea about this since you worked on the PR to add this model.

@pseudotensor
Copy link
Author

Ok will compare to transformers.

@pseudotensor
Copy link
Author

I'm unable to make transformers fail. E.g.:

import base64
from io import BytesIO

from PIL import Image
import requests
from transformers import AutoModelForCausalLM
from transformers import AutoProcessor

model_id = "microsoft/Phi-3-vision-128k-instruct"

model = AutoModelForCausalLM.from_pretrained(model_id, device_map="cuda", trust_remote_code=True, torch_dtype="auto", _attn_implementation='flash_attention_2') # use _attn_implementation='eager' to disable flash attention

processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)

messages = [
    {"role": "user", "content": "<|image_1|>\nWhat do you see?"},
]


# The encoding function I linked previously - but we actually don't use this function in the API server
def encode_image_base64(image: Image.Image, format: str = 'JPEG') -> str:
    """encode image to base64 format."""

    buffered = BytesIO()
    if format == 'JPEG':
        image = image.convert('RGB')
    image.save(buffered, format)
    return base64.b64encode(buffered.getvalue()).decode('utf-8')


# This is what we use in the API server to load the base64 string to image
def load_image_from_base64(image: str):
    """Load image from base64 format."""
    return Image.open(BytesIO(base64.b64decode(image)))


url = "https://h2o-release.s3.amazonaws.com/h2ogpt/bigben.jpg"
image = Image.open(requests.get(url, stream=True).raw)

response = requests.get(url)
base64_correct = base64.b64encode(response.content).decode('utf-8')
image_encoded_correct = load_image_from_base64(base64_correct)

assert image == image_encoded_correct, "images are not the same"

# incorrect way to encode an image from url
base64_wrong = encode_image_base64(image)
image_encoded_wrong = load_image_from_base64(base64_wrong)

assert image != image_encoded_wrong, "images are not the same"

prompt = processor.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(prompt, [image_encoded_wrong], return_tensors="pt").to("cuda:0")

generation_args = {
    "max_new_tokens": 1024,
    "temperature": 0.0,
    "do_sample": False,
}

generate_ids = model.generate(**inputs, eos_token_id=processor.tokenizer.eos_token_id, **generation_args)

# remove input tokens
generate_ids = generate_ids[:, inputs['input_ids'].shape[1]:]
response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]

print(response)

gives:

The image shows a nighttime scene of a cityscape with the iconic Big Ben clock tower illuminated against the dark sky. The clock face is clearly visible, showing the time. In the foreground, there is a busy street with fast-moving traffic, creating a streak of light trails. The buildings in the background have their lights on, and the overall atmosphere is bustling and vibrant.

If vllm really did the equivalent of transformers and (say) took the base64 and converted to an image and passed it to transformers processor, then should be all good.

@pseudotensor
Copy link
Author

Here I go over many prompts. Transformers is always stable with the "bad encoding" image version.

import base64
from io import BytesIO

from PIL import Image
import requests
from transformers import AutoModelForCausalLM
from transformers import AutoProcessor

model_id = "microsoft/Phi-3-vision-128k-instruct"

model = AutoModelForCausalLM.from_pretrained(model_id, device_map="cuda", trust_remote_code=True, torch_dtype="auto",
                                             _attn_implementation='flash_attention_2')  # use _attn_implementation='eager' to disable flash attention

processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)


# The encoding function I linked previously - but we actually don't use this function in the API server
def encode_image_base64(image: Image.Image, format: str = 'JPEG') -> str:
    """encode image to base64 format."""

    buffered = BytesIO()
    if format == 'JPEG':
        image = image.convert('RGB')
    image.save(buffered, format)
    return base64.b64encode(buffered.getvalue()).decode('utf-8')


# This is what we use in the API server to load the base64 string to image
def load_image_from_base64(image: str):
    """Load image from base64 format."""
    return Image.open(BytesIO(base64.b64decode(image)))


url = "https://h2o-release.s3.amazonaws.com/h2ogpt/bigben.jpg"
image = Image.open(requests.get(url, stream=True).raw)

response = requests.get(url)
base64_correct = base64.b64encode(response.content).decode('utf-8')
image_encoded_correct = load_image_from_base64(base64_correct)

assert image == image_encoded_correct, "images are not the same"

# incorrect way to encode an image from url
base64_wrong = encode_image_base64(image)
image_encoded_wrong = load_image_from_base64(base64_wrong)

assert image != image_encoded_wrong, "images are not the same"

generation_args = {
    "max_new_tokens": 1024,
    "temperature": 0.0,
    "do_sample": False,
}

prompts = [
    "What do you see?",
    "Describe the image.",
    "What is in the image?",
    "Can you tell me what you see?",
    "Can you describe the image?",
    "Can you tell me what is in the image?",
    "Can you describe what you see?",
    "Can you tell me what you see in the image?",
    "Can you describe what you see in the image?",
    "Can you tell me what is in the image?",
    "Can you describe what is in the image?",
    "Can you tell me what you see?",
    "Can you describe what you see?",
    "Can you tell me what you see in the image?",
    "Can you describe what you see in the image?",
    "Can you tell me what is in the image?",
]

responses = []
for prompt in prompts:
    messages = [
        {"role": "user", "content": f"<|image_1|>\n{prompt}"},
    ]

    prompt = processor.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
    inputs = processor(prompt, [image_encoded_wrong], return_tensors="pt").to("cuda:0")

    generate_ids = model.generate(**inputs, eos_token_id=processor.tokenizer.eos_token_id, **generation_args)

    # remove input tokens
    generate_ids = generate_ids[:, inputs['input_ids'].shape[1]:]
    response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]

    print(response)
    responses.append(response)

print(responses)

gives:

['The image shows a nighttime scene of a cityscape with the iconic Big Ben clock tower illuminated against the dark sky. The clock face is clearly visible, showing the time. In the foreground, there is a busy street with fast-moving traffic, creating a streak of light trails. The buildings in the background have their lights on, and the overall atmosphere is bustling and vibrant.', "The image captures a nighttime scene of the Big Ben clock tower in London, illuminated against a dark sky. The tower is the central focus, with its clock face clearly visible. In the foreground, there's a busy street with moving traffic, creating a streak of light trails. The overall atmosphere is urban and bustling.", 'The image features the iconic Big Ben clock tower illuminated at night, with a busy street scene in front of it, including moving vehicles and a clear sky.', 'Certainly, the image captures a vibrant night scene in London. Dominating the left side of the frame is the iconic Big Ben clock tower, its large clock face illuminated against the dark sky. The tower is a warm yellow, contrasting with the black night sky. \n\nIn the foreground, the bustling city life is evident with a busy street filled with cars and buses. The vehicles are blurred, suggesting they are moving at high speed, adding a dynamic element to the scene. \n\nIn the background, the Houses of Parliament can be seen, their distinctive architecture standing out even in the night. The image is taken from a low angle, which emphasizes the height of the Big Ben tower and gives a sense of scale to the cityscape. \n\nOverall, the image beautifully encapsulates a typical night in London, with its iconic landmarks and lively city life.', "The image captures a vibrant night scene in London. Dominating the left side of the frame is the iconic Big Ben, its clock face illuminated in white against the dark sky. The tower, a beacon of light, stands tall amidst the city's bustling activity.\n\nIn the foreground, the city's nightlife is in full swing. A busy street stretches out, lined with buildings that glow with warm lights. The street is a blur of motion, cars and buses streaking past, their headlights and taillights creating streaks of light that add to the dynamic energy of the scene.\n\nAbove it all, the sky is a deep, inky black, punctuated by the bright white lights of the city below. The contrast between the dark sky and the illuminated city creates a striking visual effect.\n\nDespite the bustling activity, there's a sense of order and harmony in the scene. The Big Ben, the street, and the buildings all coexist in this snapshot of London at night, each contributing to the city's unique charm.", 'The image shows a nighttime cityscape featuring the iconic Big Ben clock tower prominently in the foreground. The clock face is illuminated, and the tower is lit up with warm lights. In the background, there are other buildings with lights on, and a busy street scene with moving vehicles, creating a blur effect. The sky is dark, suggesting it is nighttime.', "Certainly, the image captures a vibrant night scene in London. Dominating the left side of the frame is the iconic Big Ben, its clock face illuminated against the dark sky. The tower is a warm yellow, contrasting with the blackness of the night. \n\nIn the foreground, the bustling city life is evident. A busy street stretches out, filled with cars and buses, their lights adding to the city's luminescence. The perspective of the photo is from ground level, looking up at the tower, giving a sense of the tower's grandeur.\n\nIn the background, the Palace of Westminster can be seen, its lights twinkling in the night. The sky above is a deep black, dotted with a few stars, adding a touch of serenity to the otherwise lively scene.\n\nThe image is a beautiful blend of architectural marvel and urban life, capturing the essence of London at night.", "The image captures a vibrant night scene in London. Dominating the left side of the frame is the iconic Big Ben, its clock face illuminated in white against the dark sky. The tower, a beacon of light, stands tall amidst the city's bustling activity.\n\nIn the foreground, the city's nightlife is in full swing. A busy street stretches out, lined with a variety of vehicles including buses and cars. The vehicles, though blurred due to motion, add a dynamic element to the scene.\n\nThe background is a blend of other architectural marvels, including the Houses of Parliament and the London Eye. These structures, though not as brightly lit as Big Ben, contribute to the overall illumination of the cityscape.\n\nThe image is a testament to London's lively nightlife and its architectural grandeur. It's a snapshot of a city that never sleeps, captured in the stillness of a single frame.", 'Certainly, the image captures a vibrant night scene in London. The iconic Big Ben clock tower stands tall, its clock face illuminated in white. The tower is surrounded by a cluster of buildings, their windows glowing with warm light. The sky above is a deep black, dotted with a few stars. The foreground is a blur of light trails from moving vehicles, suggesting the bustling city life.', 'The image shows a nighttime cityscape featuring the iconic Big Ben clock tower prominently in the foreground. The clock face is illuminated, and the tower is lit up with warm lights. In the background, there are other buildings with lights on, and a busy street scene with moving vehicles, creating a blur effect. The sky is dark, suggesting it is nighttime.', "The image shows the iconic Big Ben tower illuminated at night with a dark sky. In the foreground, there's a busy street scene with moving traffic, including a double-decker bus, and light trails from moving vehicles.", 'Certainly, the image captures a vibrant night scene in London. Dominating the left side of the frame is the iconic Big Ben clock tower, its large clock face illuminated against the dark sky. The tower is a warm yellow, contrasting with the black night sky. \n\nIn the foreground, the bustling city life is evident with a busy street filled with cars and buses. The vehicles are blurred, suggesting they are moving at high speed, adding a dynamic element to the scene. \n\nIn the background, the Houses of Parliament can be seen, their distinctive architecture standing out even in the night. The image is taken from a low angle, which emphasizes the height of the Big Ben tower and gives a sense of scale to the cityscape. \n\nOverall, the image beautifully encapsulates a typical night in London, with its iconic landmarks and lively city life.', "Certainly, the image captures a vibrant night scene in London. Dominating the left side of the frame is the iconic Big Ben, its clock face illuminated against the dark sky. The tower is a warm yellow, contrasting with the blackness of the night. \n\nIn the foreground, the bustling city life is evident. A busy street stretches out, filled with cars and buses, their lights adding to the city's luminescence. The perspective of the photo is from ground level, looking up at the tower, giving a sense of the tower's grandeur.\n\nIn the background, the Palace of Westminster can be seen, its lights twinkling in the night. The sky above is a deep black, dotted with a few stars, adding a touch of serenity to the otherwise lively scene.\n\nThe image is a beautiful blend of architectural marvel and urban life, capturing the essence of London at night.", "The image captures a vibrant night scene in London. Dominating the left side of the frame is the iconic Big Ben, its clock face illuminated in white against the dark sky. The tower, a beacon of light, stands tall amidst the city's bustling activity.\n\nIn the foreground, the city's nightlife is in full swing. A busy street stretches out, lined with a variety of vehicles including buses and cars. The vehicles, though blurred due to motion, add a dynamic element to the scene.\n\nThe background is a blend of other architectural marvels, including the Houses of Parliament and the London Eye. These structures, though not as brightly lit as Big Ben, contribute to the overall illumination of the cityscape.\n\nThe image is a testament to London's lively nightlife and its architectural grandeur. It's a snapshot of a city that never sleeps, captured in the stillness of a single frame.", 'Certainly, the image captures a vibrant night scene in London. The iconic Big Ben clock tower stands tall, its clock face illuminated in white. The tower is surrounded by a cluster of buildings, their windows glowing with warm light. The sky above is a deep black, dotted with a few stars. The foreground is a blur of light trails from moving vehicles, suggesting the bustling city life.', 'The image shows a nighttime cityscape featuring the iconic Big Ben clock tower prominently in the foreground. The clock face is illuminated, and the tower is lit up with warm lights. In the background, there are other buildings with lights on, and a busy street scene with moving vehicles, creating a blur effect. The sky is dark, suggesting it is nighttime.']

None have that odd "instruction" "Output" stuff.

@ywang96
Copy link
Member

ywang96 commented Jun 25, 2024

@pseudotensor Thanks for getting back to me on this! I also went back and tried to repro the errors from the main branch, but I can't seem to do so

from PIL import Image
import base64
import requests
from io import BytesIO
from openai import OpenAI

# The encoding function I linked previously - but we actually don't use this function in the API server
def encode_image_base64(image: Image.Image, format: str = 'JPEG') -> str:
    """encode image to base64 format."""

    buffered = BytesIO()
    if format == 'JPEG':
        image = image.convert('RGB')
    image.save(buffered, format)
    return base64.b64encode(buffered.getvalue()).decode('utf-8')


client = OpenAI(base_url='http://localhost:8000/v1', api_key="EMPTY")

url = "https://h2o-release.s3.amazonaws.com/h2ogpt/bigben.jpg"

image = Image.open(BytesIO(requests.get(url).content))

# encode with Image.open()
base64 = encode_image_base64(image)

messages = [
    {
        "role": "user",
        "content": [
            {"type": "text", "text": "What do you see?"},
            {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/jpeg;base64,{base64}"
                },
            },
        ],
    }
]

response = client.chat.completions.create(
    model="microsoft/Phi-3-vision-128k-instruct",
    messages=messages,
    max_tokens=300,
)

print(response.choices[0])
➜  ~ python phi3v.py
Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content=' The image shows a large, illuminated clock tower at night. The tower has a traditional design with a pointed spire and a clock face visible. The surrounding area is busy with numerous light trails in the sky, suggesting the presence of moving vehicles. The scene is set against a dark night sky, highlighting the bright lights from the tower and vehicles.', role='assistant', function_call=None, tool_calls=[]), stop_reason=None)
➜  ~ python phi3v.py
Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content=' The image shows a night scene of the Big Ben clock tower in London. The clock face is illuminated, and the tower is a prominent feature against the night sky. In the foreground, there is a street with blurred vehicle lights, giving the impression of a busy, urban environment.', role='assistant', function_call=None, tool_calls=[]), stop_reason=None)
➜  ~ python phi3v.py
Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content=' The image shows the iconic Big Ben tower lit up at night with a dark sky above. Below the tower, there is a busy city street with blurred lights, likely from moving vehicles. In the background, there are other buildings with lights on, contributing to the urban night scene.', role='assistant', function_call=None, tool_calls=[]), stop_reason=None)
➜  ~ python phi3v.py
Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content=' The image captures the iconic Big Ben and the Houses of Parliament in London at night. The clock tower is illuminated and stands out against the dark sky. The reflection of Big Ben on the Thames River is visible, and the lights from the surrounding buildings create a vibrant cityscape. Traffic lights and moving vehicles are visible in the foreground, indicating that this is a bustling urban scene.', role='assistant', function_call=None, tool_calls=[]), stop_reason=None)

Can you try running from the main brach and see if you can still repro this?

@ywang96
Copy link
Member

ywang96 commented Jun 25, 2024

Another thought I have - I wonder if this has something to do with b64decode vs. urlsafe_b64decode. If you don't mind, could you also try replace b64decode with urlsafe_b64decode here and see if that will fix it? (I should have used the latter anyways, but I really wonder if that's the root cause)

return Image.open(BytesIO(base64.b64decode(image)))

@pseudotensor
Copy link
Author

I can confirm. The same kinds of tests no longer fail on vllm main. What fixed it?

@ywang96
Copy link
Member

ywang96 commented Jun 25, 2024

I'm not sure but checking main branch commits I can only think of #5772. If you don't mind, please feel free to close this issue after you test with more prompts!

@pseudotensor
Copy link
Author

I tried 100 random prompts with that same image, and no issues.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants