[Refactor] Consolidate sequence normalization and enc-dec parsing (#33928)
Signed-off-by: DarkLight1337 <tlleungac@connect.ust.hk>
This commit is contained in:
@@ -54,6 +54,7 @@ class MockModelConfig:
|
||||
generation_config: str = "auto"
|
||||
media_io_kwargs: dict[str, dict[str, Any]] = field(default_factory=dict)
|
||||
skip_tokenizer_init = False
|
||||
is_encoder_decoder: bool = False
|
||||
|
||||
def get_diff_sampling_param(self):
|
||||
return self.diff_sampling_param or {}
|
||||
|
||||
@@ -53,6 +53,7 @@ class MockModelConfig:
|
||||
generation_config: str = "auto"
|
||||
media_io_kwargs: dict[str, dict[str, Any]] = field(default_factory=dict)
|
||||
skip_tokenizer_init = False
|
||||
is_encoder_decoder: bool = False
|
||||
|
||||
def get_diff_sampling_param(self):
|
||||
return self.diff_sampling_param or {}
|
||||
|
||||
@@ -52,6 +52,7 @@ class MockModelConfig:
|
||||
encoder_config = None
|
||||
generation_config: str = "auto"
|
||||
skip_tokenizer_init: bool = False
|
||||
is_encoder_decoder: bool = False
|
||||
|
||||
def get_diff_sampling_param(self):
|
||||
return self.diff_sampling_param or {}
|
||||
|
||||
@@ -529,6 +529,7 @@ class MockModelConfig:
|
||||
generation_config: str = "auto"
|
||||
media_io_kwargs: dict[str, dict[str, Any]] = field(default_factory=dict)
|
||||
skip_tokenizer_init: bool = False
|
||||
is_encoder_decoder: bool = False
|
||||
|
||||
def get_diff_sampling_param(self):
|
||||
return self.diff_sampling_param or {}
|
||||
|
||||
0
tests/renderers/inputs/__init__.py
Normal file
0
tests/renderers/inputs/__init__.py
Normal file
41
tests/renderers/inputs/test_preprocess.py
Normal file
41
tests/renderers/inputs/test_preprocess.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
from vllm.renderers.inputs.preprocess import prompt_to_seq
|
||||
|
||||
|
||||
def test_empty_input():
|
||||
assert prompt_to_seq([]) == []
|
||||
assert prompt_to_seq([[]]) == [[]]
|
||||
assert prompt_to_seq([[], []]) == [[], []]
|
||||
|
||||
|
||||
def test_text_input():
|
||||
assert prompt_to_seq("foo") == ["foo"]
|
||||
assert prompt_to_seq(["foo"]) == ["foo"]
|
||||
assert prompt_to_seq(["foo", "bar"]) == ["foo", "bar"]
|
||||
|
||||
|
||||
def test_token_input():
|
||||
assert prompt_to_seq([1, 2]) == [[1, 2]]
|
||||
assert prompt_to_seq([[1, 2]]) == [[1, 2]]
|
||||
assert prompt_to_seq([[1, 2], [3, 4]]) == [[1, 2], [3, 4]]
|
||||
|
||||
|
||||
def test_text_token_input():
|
||||
assert prompt_to_seq([[1, 2], "foo"]) == [[1, 2], "foo"]
|
||||
assert prompt_to_seq(["foo", [1, 2]]) == ["foo", [1, 2]]
|
||||
|
||||
|
||||
def test_bytes_input():
|
||||
assert prompt_to_seq(b"foo") == [b"foo"]
|
||||
assert prompt_to_seq([b"foo"]) == [b"foo"]
|
||||
assert prompt_to_seq([b"foo", b"bar"]) == [b"foo", b"bar"]
|
||||
|
||||
|
||||
def test_dict_input():
|
||||
assert prompt_to_seq({"prompt": "foo"}) == [{"prompt": "foo"}]
|
||||
assert prompt_to_seq([{"prompt": "foo"}]) == [{"prompt": "foo"}]
|
||||
assert prompt_to_seq([{"prompt": "foo"}, {"prompt_token_ids": [1, 2]}]) == [
|
||||
{"prompt": "foo"},
|
||||
{"prompt_token_ids": [1, 2]},
|
||||
]
|
||||
@@ -2,6 +2,7 @@
|
||||
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
||||
|
||||
import io
|
||||
from collections.abc import Sequence
|
||||
from dataclasses import dataclass
|
||||
from typing import Any
|
||||
|
||||
@@ -9,8 +10,11 @@ import pybase64
|
||||
import pytest
|
||||
import torch
|
||||
|
||||
from vllm.config import ModelConfig
|
||||
from vllm.inputs import SingletonPrompt
|
||||
from vllm.renderers import TokenizeParams
|
||||
from vllm.renderers.hf import HfRenderer
|
||||
from vllm.renderers.inputs.preprocess import parse_model_prompt, prompt_to_seq
|
||||
from vllm.tokenizers.registry import tokenizer_args_from_config
|
||||
|
||||
MODEL_NAME = "openai-community/gpt2"
|
||||
@@ -33,6 +37,7 @@ class MockModelConfig:
|
||||
encoder_config: dict[str, Any] | None = None
|
||||
enable_prompt_embeds: bool = True
|
||||
skip_tokenizer_init: bool = False
|
||||
is_encoder_decoder: bool = False
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -80,65 +85,34 @@ def _build_renderer(
|
||||
return renderer
|
||||
|
||||
|
||||
def _preprocess_prompt(
|
||||
mdoel_config: ModelConfig,
|
||||
prompt_or_prompts: SingletonPrompt | bytes | Sequence[SingletonPrompt | bytes],
|
||||
):
|
||||
return [
|
||||
(
|
||||
prompt
|
||||
if isinstance(prompt, bytes)
|
||||
else parse_model_prompt(mdoel_config, prompt)
|
||||
)
|
||||
for prompt in prompt_to_seq(prompt_or_prompts)
|
||||
]
|
||||
|
||||
|
||||
class TestValidatePrompt:
|
||||
STRING_INPUTS = [
|
||||
"",
|
||||
"foo",
|
||||
"foo bar",
|
||||
"foo baz bar",
|
||||
"foo bar qux baz",
|
||||
]
|
||||
|
||||
TOKEN_INPUTS = [
|
||||
[-1],
|
||||
[1],
|
||||
[1, 2],
|
||||
[1, 3, 4],
|
||||
[1, 2, 4, 3],
|
||||
]
|
||||
|
||||
INPUTS_SLICES = [
|
||||
slice(None, None, -1),
|
||||
slice(None, None, 2),
|
||||
slice(None, None, -2),
|
||||
]
|
||||
|
||||
# Test that a nested mixed-type list of lists raises a TypeError.
|
||||
def test_empty_input(self):
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
with pytest.raises(ValueError, match="at least one prompt"):
|
||||
renderer.render_completions([])
|
||||
renderer.render_prompts(_preprocess_prompt(renderer.config, []))
|
||||
|
||||
def test_invalid_type(self):
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
with pytest.raises(TypeError, match="string or an array of tokens"):
|
||||
renderer.render_completions([[1, 2], ["foo", "bar"]])
|
||||
|
||||
@pytest.mark.parametrize("string_input", STRING_INPUTS)
|
||||
def test_string_consistent(self, string_input: str):
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
assert renderer.render_completions(string_input) == renderer.render_completions(
|
||||
[string_input]
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize("token_input", TOKEN_INPUTS)
|
||||
def test_token_consistent(self, token_input: list[int]):
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
assert renderer.render_completions(token_input) == renderer.render_completions(
|
||||
[token_input]
|
||||
)
|
||||
|
||||
@pytest.mark.parametrize("inputs_slice", INPUTS_SLICES)
|
||||
def test_string_slice(self, inputs_slice: slice):
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
assert renderer.render_completions(self.STRING_INPUTS)[
|
||||
inputs_slice
|
||||
] == renderer.render_completions(self.STRING_INPUTS[inputs_slice])
|
||||
with pytest.raises(TypeError, match="should be a list of integers"):
|
||||
renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, [[1, 2], ["foo", "bar"]]) # type: ignore[arg-type]
|
||||
)
|
||||
|
||||
|
||||
class TestRenderPrompt:
|
||||
@@ -146,7 +120,7 @@ class TestRenderPrompt:
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
tokens = [101, 7592, 2088]
|
||||
prompts = renderer.render_completions(tokens)
|
||||
prompts = renderer.render_prompts(_preprocess_prompt(renderer.config, tokens))
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100),
|
||||
@@ -159,7 +133,9 @@ class TestRenderPrompt:
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
token_lists = [[101, 7592, 2088], [102, 1234, 5678, 9012], [103, 4567]]
|
||||
prompts = renderer.render_completions(token_lists)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, token_lists)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100),
|
||||
@@ -174,7 +150,9 @@ class TestRenderPrompt:
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
text_input = "x" * 10
|
||||
prompts = renderer.render_completions(text_input)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, text_input)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100),
|
||||
@@ -187,7 +165,9 @@ class TestRenderPrompt:
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
text_list_input = ["x" * 10, "x" * 12, "x" * 14]
|
||||
prompts = renderer.render_completions(text_list_input)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, text_list_input)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100),
|
||||
@@ -200,7 +180,9 @@ class TestRenderPrompt:
|
||||
def test_zero_truncation(self):
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
prompts = renderer.render_completions("x" * 200)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, "x" * 200)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100, truncate_prompt_tokens=0),
|
||||
@@ -212,7 +194,9 @@ class TestRenderPrompt:
|
||||
def test_pos_truncation(self):
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
prompts = renderer.render_completions("x" * 200)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, "x" * 200)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100, truncate_prompt_tokens=50),
|
||||
@@ -224,7 +208,9 @@ class TestRenderPrompt:
|
||||
def test_neg_truncation(self):
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
prompts = renderer.render_completions("x" * 200)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, "x" * 200)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100, truncate_prompt_tokens=-1),
|
||||
@@ -237,7 +223,9 @@ class TestRenderPrompt:
|
||||
renderer = _build_renderer(MockModelConfig(), truncation_side="left")
|
||||
|
||||
long_tokens = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109] # 10 tokens
|
||||
prompts = renderer.render_completions(long_tokens)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, long_tokens)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100, truncate_prompt_tokens=5),
|
||||
@@ -251,7 +239,9 @@ class TestRenderPrompt:
|
||||
renderer = _build_renderer(MockModelConfig(), truncation_side="right")
|
||||
|
||||
long_tokens = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109] # 10 tokens
|
||||
prompts = renderer.render_completions(long_tokens)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, long_tokens)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100, truncate_prompt_tokens=5),
|
||||
@@ -266,7 +256,9 @@ class TestRenderPrompt:
|
||||
|
||||
# Exceeds max_total_tokens and max_total_tokens * VLLM_MAX_CHARS_PER_TOKEN
|
||||
long_tokens = "x" * 150
|
||||
prompts = renderer.render_completions(long_tokens)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, long_tokens)
|
||||
)
|
||||
|
||||
with pytest.raises(
|
||||
ValueError,
|
||||
@@ -285,7 +277,9 @@ class TestRenderPrompt:
|
||||
|
||||
# Exceeds max_total_tokens but not max_total_tokens * VLLM_MAX_CHARS_PER_TOKEN
|
||||
long_tokens = "x" * 150
|
||||
prompts = renderer.render_completions(long_tokens)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, long_tokens)
|
||||
)
|
||||
|
||||
with pytest.raises(
|
||||
ValueError,
|
||||
@@ -304,7 +298,9 @@ class TestRenderPrompt:
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
long_tokens = list(range(150)) # Exceeds max_total_tokens=100
|
||||
prompts = renderer.render_completions(long_tokens)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, long_tokens)
|
||||
)
|
||||
|
||||
with pytest.raises(
|
||||
ValueError,
|
||||
@@ -318,7 +314,9 @@ class TestRenderPrompt:
|
||||
def test_no_tokenizer_for_text(self):
|
||||
renderer = _build_renderer(MockModelConfig(skip_tokenizer_init=True))
|
||||
|
||||
prompts = renderer.render_completions("Hello world")
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, "Hello world")
|
||||
)
|
||||
|
||||
with pytest.raises(ValueError, match="`skip_tokenizer_init=True`"):
|
||||
renderer.tokenize_prompts(
|
||||
@@ -330,7 +328,7 @@ class TestRenderPrompt:
|
||||
renderer = _build_renderer(MockModelConfig())
|
||||
|
||||
tokens = [1, 2, 3, 4]
|
||||
prompts = renderer.render_completions(tokens)
|
||||
prompts = renderer.render_prompts(_preprocess_prompt(renderer.config, tokens))
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(
|
||||
@@ -359,7 +357,9 @@ class TestRenderEmbedPrompt:
|
||||
tensor_input = torch.randn(10, 768, dtype=torch.float32)
|
||||
embed_bytes = self._create_test_embed_bytes(tensor_input)
|
||||
|
||||
prompts = renderer.render_completions(prompt_embeds=embed_bytes)
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(renderer.config, embed_bytes)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
TokenizeParams(max_total_tokens=100),
|
||||
@@ -377,8 +377,11 @@ class TestRenderEmbedPrompt:
|
||||
torch.randn(12, 512, dtype=torch.float32),
|
||||
]
|
||||
|
||||
prompts = renderer.render_completions(
|
||||
prompt_embeds=[self._create_test_embed_bytes(t) for t in tensor_inputs],
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(
|
||||
renderer.config,
|
||||
[self._create_test_embed_bytes(t) for t in tensor_inputs],
|
||||
)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
@@ -395,8 +398,10 @@ class TestRenderEmbedPrompt:
|
||||
# Create tensor with more tokens than truncation limit
|
||||
tensor_input = torch.randn(20, 768, dtype=torch.float32)
|
||||
|
||||
prompts = renderer.render_completions(
|
||||
prompt_embeds=self._create_test_embed_bytes(tensor_input),
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(
|
||||
renderer.config, self._create_test_embed_bytes(tensor_input)
|
||||
)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
@@ -420,8 +425,10 @@ class TestRenderEmbedPrompt:
|
||||
for dtype in dtypes:
|
||||
tensor_input = torch.randn(5, 256, dtype=dtype)
|
||||
|
||||
prompts = renderer.render_completions(
|
||||
prompt_embeds=self._create_test_embed_bytes(tensor_input),
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(
|
||||
renderer.config, self._create_test_embed_bytes(tensor_input)
|
||||
)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
@@ -437,8 +444,10 @@ class TestRenderEmbedPrompt:
|
||||
# Test tensor with batch dimension gets squeezed
|
||||
tensor_input = torch.randn(1, 10, 768, dtype=torch.float32)
|
||||
|
||||
prompts = renderer.render_completions(
|
||||
prompt_embeds=self._create_test_embed_bytes(tensor_input),
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(
|
||||
renderer.config, self._create_test_embed_bytes(tensor_input)
|
||||
)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
@@ -455,9 +464,11 @@ class TestRenderEmbedPrompt:
|
||||
text_input = "Hello world"
|
||||
tensor_input = torch.randn(5, 256, dtype=torch.float32)
|
||||
|
||||
prompts = renderer.render_completions(
|
||||
text_input,
|
||||
prompt_embeds=self._create_test_embed_bytes(tensor_input),
|
||||
prompts = renderer.render_prompts(
|
||||
_preprocess_prompt(
|
||||
renderer.config,
|
||||
[text_input, self._create_test_embed_bytes(tensor_input)],
|
||||
)
|
||||
)
|
||||
results = renderer.tokenize_prompts(
|
||||
prompts,
|
||||
@@ -465,8 +476,8 @@ class TestRenderEmbedPrompt:
|
||||
)
|
||||
|
||||
assert len(results) == 2
|
||||
# First should be embed prompt
|
||||
assert torch.equal(results[0]["prompt_embeds"], tensor_input)
|
||||
# Second should be tokens prompt
|
||||
assert "prompt_token_ids" in results[1]
|
||||
assert len(results[1]["prompt_token_ids"]) == len(text_input)
|
||||
# First should be tokens prompt
|
||||
assert "prompt_token_ids" in results[0]
|
||||
assert len(results[0]["prompt_token_ids"]) == len(text_input)
|
||||
# Second should be embed prompt
|
||||
assert torch.equal(results[1]["prompt_embeds"], tensor_input)
|
||||
|
||||
@@ -3,16 +3,40 @@
|
||||
|
||||
import asyncio
|
||||
import time
|
||||
from dataclasses import dataclass
|
||||
from typing import Any
|
||||
from unittest.mock import Mock
|
||||
|
||||
import pytest
|
||||
from mistral_common.tokens.tokenizers.base import SpecialTokenPolicy
|
||||
|
||||
from vllm.config import ModelConfig
|
||||
from vllm.renderers import ChatParams
|
||||
from vllm.renderers.mistral import MistralRenderer, safe_apply_chat_template
|
||||
from vllm.tokenizers.mistral import MistralTokenizer
|
||||
|
||||
MODEL_NAME = "mistralai/Mistral-7B-Instruct-v0.3"
|
||||
|
||||
|
||||
@dataclass
|
||||
class MockHFConfig:
|
||||
model_type: str = "any"
|
||||
|
||||
|
||||
@dataclass
|
||||
class MockModelConfig:
|
||||
runner_type = "generate"
|
||||
model: str = MODEL_NAME
|
||||
tokenizer: str = MODEL_NAME
|
||||
trust_remote_code: bool = False
|
||||
max_model_len: int = 100
|
||||
tokenizer_revision = None
|
||||
tokenizer_mode = "mistral"
|
||||
hf_config = MockHFConfig()
|
||||
encoder_config: dict[str, Any] | None = None
|
||||
enable_prompt_embeds: bool = True
|
||||
skip_tokenizer_init: bool = False
|
||||
is_encoder_decoder: bool = False
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_async_mistral_tokenizer_does_not_block_event_loop():
|
||||
@@ -23,9 +47,10 @@ async def test_async_mistral_tokenizer_does_not_block_event_loop():
|
||||
time.sleep(2)
|
||||
return expected_tokens
|
||||
|
||||
mock_model_config = MockModelConfig(skip_tokenizer_init=True)
|
||||
mock_tokenizer = Mock(spec=MistralTokenizer)
|
||||
mock_tokenizer.apply_chat_template = mocked_apply_chat_template
|
||||
mock_renderer = MistralRenderer(Mock(spec=ModelConfig), tokenizer_kwargs={})
|
||||
mock_renderer = MistralRenderer(mock_model_config, tokenizer_kwargs={})
|
||||
mock_renderer._tokenizer = mock_tokenizer
|
||||
|
||||
task = mock_renderer.render_messages_async([], ChatParams())
|
||||
|
||||
@@ -4,52 +4,13 @@
|
||||
import pytest
|
||||
|
||||
from vllm.config import ModelConfig
|
||||
from vllm.inputs import zip_enc_dec_prompts
|
||||
from vllm.inputs.preprocess import InputPreprocessor
|
||||
|
||||
pytestmark = pytest.mark.cpu_test
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"mm_processor_kwargs,expected_mm_kwargs",
|
||||
[
|
||||
(None, [{}, {}]),
|
||||
({}, [{}, {}]),
|
||||
({"foo": 100}, [{"foo": 100}, {"foo": 100}]),
|
||||
([{"foo": 100}, {"bar": 200}], [{"foo": 100}, {"bar": 200}]),
|
||||
],
|
||||
)
|
||||
def test_zip_enc_dec_prompts(mm_processor_kwargs, expected_mm_kwargs):
|
||||
"""Test mm_processor_kwargs init for zipping enc/dec prompts."""
|
||||
encoder_prompts = ["An encoder prompt", "Another encoder prompt"]
|
||||
decoder_prompts = ["A decoder prompt", "Another decoder prompt"]
|
||||
zipped_prompts = zip_enc_dec_prompts(
|
||||
encoder_prompts, decoder_prompts, mm_processor_kwargs
|
||||
)
|
||||
assert len(zipped_prompts) == len(encoder_prompts) == len(decoder_prompts)
|
||||
for enc, dec, exp_kwargs, zipped in zip(
|
||||
encoder_prompts, decoder_prompts, expected_mm_kwargs, zipped_prompts
|
||||
):
|
||||
assert isinstance(zipped, dict)
|
||||
assert len(zipped.keys()) == 3
|
||||
assert zipped["encoder_prompt"] == enc
|
||||
assert zipped["decoder_prompt"] == dec
|
||||
assert zipped["mm_processor_kwargs"] == exp_kwargs
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"model_id",
|
||||
[
|
||||
"facebook/chameleon-7b",
|
||||
],
|
||||
)
|
||||
@pytest.mark.parametrize(
|
||||
"prompt",
|
||||
[
|
||||
"",
|
||||
{"prompt_token_ids": []},
|
||||
],
|
||||
)
|
||||
@pytest.mark.parametrize("model_id", ["facebook/chameleon-7b"])
|
||||
@pytest.mark.parametrize("prompt", ["", {"prompt_token_ids": []}])
|
||||
@pytest.mark.skip(
|
||||
reason=(
|
||||
"Applying huggingface processor on text inputs results in "
|
||||
|
||||
Reference in New Issue
Block a user