main
py 101 lines 2.52 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
5 import pytest
6 import requests
7
8 from tests.utils import RemoteOpenAIServer
9 from vllm.entrypoints.pooling.pooling.protocol import PoolingResponse
10
11 MODEL_NAME = "intfloat/multilingual-e5-small"
12 DTYPE = "bfloat16"
13 input_text = "The best thing about vLLM is that it supports many different models"
14 input_tokens = [
15 0,
16 581,
17 2965,
18 13580,
19 1672,
20 81,
21 23708,
22 594,
23 83,
24 450,
25 442,
26 8060,
27 7,
28 5941,
29 12921,
30 115774,
31 2,
32 ]
33
34
35 @pytest.fixture(scope="module")
36 def server():
37 args = [
38 "--runner",
39 "pooling",
40 "--dtype",
41 DTYPE,
42 "--enforce-eager",
43 "--max-model-len",
44 "512",
45 "--pooler-config.task",
46 "token_embed",
47 ]
48
49 with RemoteOpenAIServer(MODEL_NAME, args) as remote_server:
50 yield remote_server
51
52
53 @pytest.mark.asyncio
54 @pytest.mark.parametrize("model_name", [MODEL_NAME])
55 async def test_pooling_token_embed(server: RemoteOpenAIServer, model_name: str):
56 task = "token_embed"
57 request_id = "client-request-id"
58 response = requests.post(
59 server.url_for("pooling"),
60 json={
61 "model": model_name,
62 "input": input_text,
63 "encoding_format": "float",
64 "task": task,
65 "request_id": request_id,
66 },
67 )
68
69 poolings = PoolingResponse.model_validate(response.json())
70
71 assert poolings.id == f"pooling-{request_id}"
72 assert len(poolings.data) == 1
73 assert len(poolings.data[0].data) == len(input_tokens)
74 assert isinstance(poolings.data[0].data[0], list)
75 assert len(poolings.data[0].data[0]) == 384
76
77
78 @pytest.mark.asyncio
79 @pytest.mark.parametrize("model_name", [MODEL_NAME])
80 @pytest.mark.parametrize("task", ["embed", "classify", "token_classify", "plugin"])
81 async def test_pooling_not_supported(
82 server: RemoteOpenAIServer, model_name: str, task: str
83 ):
84 response = requests.post(
85 server.url_for("pooling"),
86 json={
87 "model": model_name,
88 "input": "test",
89 "encoding_format": "float",
90 "task": task,
91 },
92 )
93 assert response.json()["error"]["type"] == "BadRequestError"
94
95 if task == "plugin":
96 err_msg = "No IOProcessor plugin installed."
97 elif task == "embed":
98 err_msg = "Try switching the model's pooling_task via"
99 else:
100 err_msg = f"Unsupported task: {task!r}"
101 assert response.json()["error"]["message"].startswith(err_msg)