From a836524d2073fa08d327fc1b13bf791a17c65b82 Mon Sep 17 00:00:00 2001 From: Isotr0py Date: Tue, 17 Mar 2026 22:44:19 +0800 Subject: [PATCH] [Chore] Replace all base64 usages with faster pybase64 package (#37290) Signed-off-by: Isotr0py --- .../openai_chat_completion_client_for_multimodal.py | 2 +- examples/online_serving/openai_realtime_client.py | 2 +- .../online_serving/openai_realtime_microphone_client.py | 2 +- .../pooling/embed/embedding_requests_base64_online.py | 2 +- examples/pooling/embed/vision_embedding_online.py | 2 +- .../pooling/plugin/prithvi_geospatial_mae_io_processor.py | 2 +- examples/pooling/plugin/prithvi_geospatial_mae_online.py | 2 +- examples/pooling/score/colqwen3_rerank_online.py | 2 +- .../pooling/token_embed/colqwen3_token_embed_online.py | 2 +- tests/benchmarks/test_random_multimodal_dataset_video.py | 2 +- tests/distributed/test_weight_transfer.py | 2 +- .../openai/chat_completion/test_audio_in_video.py | 2 +- .../openai/chat_completion/test_vision_embeds.py | 3 +-- .../completion/test_completion_with_prompt_embeds.py | 2 +- tests/entrypoints/openai/test_realtime_validation.py | 2 +- tests/entrypoints/pooling/embed/test_cohere_online.py | 2 +- .../pooling/embed/test_cohere_online_vision.py | 2 +- tests/entrypoints/pooling/embed/test_online.py | 2 +- tests/entrypoints/pooling/embed/test_protocol.py | 2 +- tests/entrypoints/pooling/pooling/test_online.py | 2 +- .../models/multimodal/generation/vlm_utils/model_utils.py | 2 +- tests/models/multimodal/pooling/test_colpali.py | 2 +- tests/models/multimodal/pooling/test_colqwen3.py | 2 +- tests/models/multimodal/pooling/test_llama_nemotron_vl.py | 2 +- tests/multimodal/media/test_audio.py | 2 +- tests/multimodal/media/test_connector.py | 2 +- .../prithvi_io_processor/prithvi_processor.py | 2 +- .../plugins_tests/test_terratorch_io_processor_plugins.py | 2 +- tests/renderers/test_sparse_tensor_validation.py | 2 +- tools/pre_commit/check_forbidden_imports.py | 8 ++++++++ vllm/benchmarks/datasets.py | 2 +- vllm/distributed/weight_transfer/ipc_engine.py | 2 +- vllm/entrypoints/openai/realtime/connection.py | 2 +- vllm/entrypoints/openai/run_batch.py | 2 +- vllm/entrypoints/pooling/embed/protocol.py | 2 +- vllm/multimodal/media/audio.py | 5 ++--- vllm/multimodal/media/video.py | 4 ++-- 37 files changed, 46 insertions(+), 40 deletions(-) diff --git a/examples/online_serving/openai_chat_completion_client_for_multimodal.py b/examples/online_serving/openai_chat_completion_client_for_multimodal.py index 37f46b3696a..c4407923ed2 100644 --- a/examples/online_serving/openai_chat_completion_client_for_multimodal.py +++ b/examples/online_serving/openai_chat_completion_client_for_multimodal.py @@ -20,9 +20,9 @@ run the script with python openai_chat_completion_client_for_multimodal.py --chat-type audio """ -import base64 import os +import pybase64 as base64 import requests from openai import OpenAI from utils import get_first_model diff --git a/examples/online_serving/openai_realtime_client.py b/examples/online_serving/openai_realtime_client.py index 17335bd238b..2bd3c7e60d5 100644 --- a/examples/online_serving/openai_realtime_client.py +++ b/examples/online_serving/openai_realtime_client.py @@ -24,11 +24,11 @@ The script: import argparse import asyncio -import base64 import json import librosa import numpy as np +import pybase64 as base64 import websockets from vllm.assets.audio import AudioAsset diff --git a/examples/online_serving/openai_realtime_microphone_client.py b/examples/online_serving/openai_realtime_microphone_client.py index 9a48f1466cc..a3c07673ffb 100644 --- a/examples/online_serving/openai_realtime_microphone_client.py +++ b/examples/online_serving/openai_realtime_microphone_client.py @@ -18,13 +18,13 @@ Requirements: websockets, numpy, gradio import argparse import asyncio -import base64 import json import queue import threading import gradio as gr import numpy as np +import pybase64 as base64 import websockets SAMPLE_RATE = 16_000 diff --git a/examples/pooling/embed/embedding_requests_base64_online.py b/examples/pooling/embed/embedding_requests_base64_online.py index e85af4b858a..dfbd87267b1 100644 --- a/examples/pooling/embed/embedding_requests_base64_online.py +++ b/examples/pooling/embed/embedding_requests_base64_online.py @@ -7,8 +7,8 @@ NOTE: """ import argparse -import base64 +import pybase64 as base64 import requests import torch diff --git a/examples/pooling/embed/vision_embedding_online.py b/examples/pooling/embed/vision_embedding_online.py index 522ce1fcbc4..fb9e09ead49 100644 --- a/examples/pooling/embed/vision_embedding_online.py +++ b/examples/pooling/embed/vision_embedding_online.py @@ -7,10 +7,10 @@ Refer to each `run_*` function for the command to run the server for that model. """ import argparse -import base64 import io from typing import Literal +import pybase64 as base64 from openai import OpenAI from openai._types import NOT_GIVEN, NotGiven from openai.types.chat import ChatCompletionMessageParam diff --git a/examples/pooling/plugin/prithvi_geospatial_mae_io_processor.py b/examples/pooling/plugin/prithvi_geospatial_mae_io_processor.py index db634d8be76..7e4efed5082 100644 --- a/examples/pooling/plugin/prithvi_geospatial_mae_io_processor.py +++ b/examples/pooling/plugin/prithvi_geospatial_mae_io_processor.py @@ -1,8 +1,8 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import os +import pybase64 as base64 import torch from vllm import LLM diff --git a/examples/pooling/plugin/prithvi_geospatial_mae_online.py b/examples/pooling/plugin/prithvi_geospatial_mae_online.py index 5d914a16575..36d6f0990f7 100644 --- a/examples/pooling/plugin/prithvi_geospatial_mae_online.py +++ b/examples/pooling/plugin/prithvi_geospatial_mae_online.py @@ -1,9 +1,9 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import os +import pybase64 as base64 import requests # This example shows how to perform an online inference that generates diff --git a/examples/pooling/score/colqwen3_rerank_online.py b/examples/pooling/score/colqwen3_rerank_online.py index c7ab6e2372a..0e61531bfd3 100644 --- a/examples/pooling/score/colqwen3_rerank_online.py +++ b/examples/pooling/score/colqwen3_rerank_online.py @@ -15,9 +15,9 @@ Then run this script: python colqwen3_rerank_online.py """ -import base64 from io import BytesIO +import pybase64 as base64 import requests from PIL import Image diff --git a/examples/pooling/token_embed/colqwen3_token_embed_online.py b/examples/pooling/token_embed/colqwen3_token_embed_online.py index 20445742f35..cac11188e87 100644 --- a/examples/pooling/token_embed/colqwen3_token_embed_online.py +++ b/examples/pooling/token_embed/colqwen3_token_embed_online.py @@ -21,10 +21,10 @@ Then run this script: """ import argparse -import base64 from io import BytesIO import numpy as np +import pybase64 as base64 import requests from PIL import Image diff --git a/tests/benchmarks/test_random_multimodal_dataset_video.py b/tests/benchmarks/test_random_multimodal_dataset_video.py index db19a169e35..bd37a520d01 100644 --- a/tests/benchmarks/test_random_multimodal_dataset_video.py +++ b/tests/benchmarks/test_random_multimodal_dataset_video.py @@ -1,12 +1,12 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import os from tempfile import NamedTemporaryFile from typing import Any, cast import cv2 +import pybase64 as base64 import pytest from transformers import AutoTokenizer, PreTrainedTokenizerBase diff --git a/tests/distributed/test_weight_transfer.py b/tests/distributed/test_weight_transfer.py index 1309edf5aed..1c9bc766ab1 100644 --- a/tests/distributed/test_weight_transfer.py +++ b/tests/distributed/test_weight_transfer.py @@ -6,10 +6,10 @@ Unit tests for engine classes (parsing, validation, registry). Integration tests for NCCL and IPC weight transfer between processes using Ray. """ -import base64 import pickle from unittest.mock import MagicMock +import pybase64 as base64 import pytest import ray import torch diff --git a/tests/entrypoints/openai/chat_completion/test_audio_in_video.py b/tests/entrypoints/openai/chat_completion/test_audio_in_video.py index 769390309dc..9e56b03027a 100644 --- a/tests/entrypoints/openai/chat_completion/test_audio_in_video.py +++ b/tests/entrypoints/openai/chat_completion/test_audio_in_video.py @@ -1,10 +1,10 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import json import openai +import pybase64 as base64 import pytest import pytest_asyncio diff --git a/tests/entrypoints/openai/chat_completion/test_vision_embeds.py b/tests/entrypoints/openai/chat_completion/test_vision_embeds.py index 82cb84bcca8..574a8f1c86a 100644 --- a/tests/entrypoints/openai/chat_completion/test_vision_embeds.py +++ b/tests/entrypoints/openai/chat_completion/test_vision_embeds.py @@ -1,9 +1,8 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 - import numpy as np +import pybase64 as base64 import pytest import requests import torch diff --git a/tests/entrypoints/openai/completion/test_completion_with_prompt_embeds.py b/tests/entrypoints/openai/completion/test_completion_with_prompt_embeds.py index 374e77245cd..5ca907b89f3 100644 --- a/tests/entrypoints/openai/completion/test_completion_with_prompt_embeds.py +++ b/tests/entrypoints/openai/completion/test_completion_with_prompt_embeds.py @@ -1,11 +1,11 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import io import json import openai # use the official client for correctness check +import pybase64 as base64 import pytest import pytest_asyncio import torch diff --git a/tests/entrypoints/openai/test_realtime_validation.py b/tests/entrypoints/openai/test_realtime_validation.py index 9092aac5b69..83ecc4ac13c 100644 --- a/tests/entrypoints/openai/test_realtime_validation.py +++ b/tests/entrypoints/openai/test_realtime_validation.py @@ -2,12 +2,12 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project import asyncio -import base64 import json import warnings import librosa import numpy as np +import pybase64 as base64 import pytest import websockets diff --git a/tests/entrypoints/pooling/embed/test_cohere_online.py b/tests/entrypoints/pooling/embed/test_cohere_online.py index fc313819fc9..4964d99e0c6 100644 --- a/tests/entrypoints/pooling/embed/test_cohere_online.py +++ b/tests/entrypoints/pooling/embed/test_cohere_online.py @@ -7,10 +7,10 @@ embedding models, covering text embedding, embedding type conversions, response structure, batching, normalisation, and semantic similarity. """ -import base64 import struct import numpy as np +import pybase64 as base64 import pytest import requests diff --git a/tests/entrypoints/pooling/embed/test_cohere_online_vision.py b/tests/entrypoints/pooling/embed/test_cohere_online_vision.py index ab874e4e27b..5ec57db7f80 100644 --- a/tests/entrypoints/pooling/embed/test_cohere_online_vision.py +++ b/tests/entrypoints/pooling/embed/test_cohere_online_vision.py @@ -6,11 +6,11 @@ Validates image embedding, batching, normalisation, and embedding type conversions through the /v2/embed endpoint. """ -import base64 import struct import zlib import numpy as np +import pybase64 as base64 import pytest import requests diff --git a/tests/entrypoints/pooling/embed/test_online.py b/tests/entrypoints/pooling/embed/test_online.py index adec6233414..56ab09bc7af 100644 --- a/tests/entrypoints/pooling/embed/test_online.py +++ b/tests/entrypoints/pooling/embed/test_online.py @@ -1,11 +1,11 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import json import numpy as np import openai +import pybase64 as base64 import pytest import pytest_asyncio import requests diff --git a/tests/entrypoints/pooling/embed/test_protocol.py b/tests/entrypoints/pooling/embed/test_protocol.py index f2bd5d2ccc3..9d3416b772d 100644 --- a/tests/entrypoints/pooling/embed/test_protocol.py +++ b/tests/entrypoints/pooling/embed/test_protocol.py @@ -3,10 +3,10 @@ """Unit tests for Cohere embed protocol: build_typed_embeddings and its underlying packing helpers, plus Cohere-specific serving helpers.""" -import base64 import struct import numpy as np +import pybase64 as base64 import pytest from vllm.entrypoints.pooling.embed.protocol import ( diff --git a/tests/entrypoints/pooling/pooling/test_online.py b/tests/entrypoints/pooling/pooling/test_online.py index c6a62c19688..2878c8684e4 100644 --- a/tests/entrypoints/pooling/pooling/test_online.py +++ b/tests/entrypoints/pooling/pooling/test_online.py @@ -1,10 +1,10 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import json import numpy as np +import pybase64 as base64 import pytest import requests import torch diff --git a/tests/models/multimodal/generation/vlm_utils/model_utils.py b/tests/models/multimodal/generation/vlm_utils/model_utils.py index 311c78545a0..b8e31e274de 100644 --- a/tests/models/multimodal/generation/vlm_utils/model_utils.py +++ b/tests/models/multimodal/generation/vlm_utils/model_utils.py @@ -1235,9 +1235,9 @@ def voxtral_patch_hf_runner(hf_model: "HfRunner") -> "HfRunner": generated). """ - import base64 import io + import pybase64 as base64 import soundfile as sf processor = hf_model.processor diff --git a/tests/models/multimodal/pooling/test_colpali.py b/tests/models/multimodal/pooling/test_colpali.py index e7c373d1093..321e9fb6075 100644 --- a/tests/models/multimodal/pooling/test_colpali.py +++ b/tests/models/multimodal/pooling/test_colpali.py @@ -7,9 +7,9 @@ ColPali is a multi-vector retrieval model based on PaliGemma backbone It produces per-token embeddings for both text and image inputs. """ -import base64 from io import BytesIO +import pybase64 as base64 import pytest import torch from PIL import Image diff --git a/tests/models/multimodal/pooling/test_colqwen3.py b/tests/models/multimodal/pooling/test_colqwen3.py index 0cc4c343b3d..50f0108c370 100644 --- a/tests/models/multimodal/pooling/test_colqwen3.py +++ b/tests/models/multimodal/pooling/test_colqwen3.py @@ -7,9 +7,9 @@ ColBERT-style late interaction scoring (MaxSim). It produces per-token embeddings for both text and image inputs. """ -import base64 from io import BytesIO +import pybase64 as base64 import pytest import torch from PIL import Image diff --git a/tests/models/multimodal/pooling/test_llama_nemotron_vl.py b/tests/models/multimodal/pooling/test_llama_nemotron_vl.py index 84cae19ee8b..4c92d41c31d 100644 --- a/tests/models/multimodal/pooling/test_llama_nemotron_vl.py +++ b/tests/models/multimodal/pooling/test_llama_nemotron_vl.py @@ -9,10 +9,10 @@ Tests for the LlamaNemotronVL model family: Both variants share a SigLIP vision encoder with a bidirectional LLaMA backbone. """ -import base64 from io import BytesIO from pathlib import Path +import pybase64 as base64 import pytest import torch from transformers import AutoModel, AutoModelForSequenceClassification, AutoProcessor diff --git a/tests/multimodal/media/test_audio.py b/tests/multimodal/media/test_audio.py index d7fe891dd6d..18f142008c3 100644 --- a/tests/multimodal/media/test_audio.py +++ b/tests/multimodal/media/test_audio.py @@ -1,11 +1,11 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 from pathlib import Path from unittest.mock import patch import librosa import numpy as np +import pybase64 as base64 import pytest from vllm.multimodal.media import AudioMediaIO diff --git a/tests/multimodal/media/test_connector.py b/tests/multimodal/media/test_connector.py index b1f232995a5..c771cc9a3fd 100644 --- a/tests/multimodal/media/test_connector.py +++ b/tests/multimodal/media/test_connector.py @@ -2,13 +2,13 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project import asyncio -import base64 import mimetypes import os from tempfile import NamedTemporaryFile, TemporaryDirectory import aiohttp import numpy as np +import pybase64 as base64 import pytest import requests import torch diff --git a/tests/plugins/prithvi_io_processor_plugin/prithvi_io_processor/prithvi_processor.py b/tests/plugins/prithvi_io_processor_plugin/prithvi_io_processor/prithvi_processor.py index b22239fcc26..a1262c28b97 100644 --- a/tests/plugins/prithvi_io_processor_plugin/prithvi_io_processor/prithvi_processor.py +++ b/tests/plugins/prithvi_io_processor_plugin/prithvi_io_processor/prithvi_processor.py @@ -1,7 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import datetime import os import tempfile @@ -11,6 +10,7 @@ from typing import Any import albumentations import numpy as np +import pybase64 as base64 import rasterio import regex as re import torch diff --git a/tests/plugins_tests/test_terratorch_io_processor_plugins.py b/tests/plugins_tests/test_terratorch_io_processor_plugins.py index e1b2cbba812..34799b3c42c 100644 --- a/tests/plugins_tests/test_terratorch_io_processor_plugins.py +++ b/tests/plugins_tests/test_terratorch_io_processor_plugins.py @@ -1,9 +1,9 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import io import imagehash +import pybase64 as base64 import pytest import requests from PIL import Image diff --git a/tests/renderers/test_sparse_tensor_validation.py b/tests/renderers/test_sparse_tensor_validation.py index a90eac4782f..6b570f3c99b 100644 --- a/tests/renderers/test_sparse_tensor_validation.py +++ b/tests/renderers/test_sparse_tensor_validation.py @@ -5,9 +5,9 @@ Tests verify that malicious sparse tensors are rejected before they can trigger out-of-bounds memory writes during to_dense() operations. """ -import base64 import io +import pybase64 as base64 import pytest import torch diff --git a/tools/pre_commit/check_forbidden_imports.py b/tools/pre_commit/check_forbidden_imports.py index 78661013835..ac7d8b096ec 100644 --- a/tools/pre_commit/check_forbidden_imports.py +++ b/tools/pre_commit/check_forbidden_imports.py @@ -59,6 +59,14 @@ CHECK_IMPORTS = { "vllm/v1/serial_utils.py", }, ), + "base64": ForbiddenImport( + pattern=r"^\s*(?:import\s+base64(?:$|\s|,)|from\s+base64\s+import)", + tip=( + "Replace 'import base64' with 'import pybase64' " + "or 'import pybase64 as base64'." + ), + allowed_pattern=re.compile(r"^\s*import\s+pybase64(\s*|\s+as\s+base64\s*)$"), + ), "re": ForbiddenImport( pattern=r"^\s*(?:import\s+re(?:$|\s|,)|from\s+re\s+import)", tip="Replace 'import re' with 'import regex as re' or 'import regex'.", diff --git a/vllm/benchmarks/datasets.py b/vllm/benchmarks/datasets.py index 21ebeb9069b..7e7e56dc6d4 100644 --- a/vllm/benchmarks/datasets.py +++ b/vllm/benchmarks/datasets.py @@ -14,7 +14,6 @@ generation. Supported dataset types include: import argparse import ast -import base64 import io import json import logging @@ -31,6 +30,7 @@ from tempfile import NamedTemporaryFile from typing import Any, cast import numpy as np +import pybase64 as base64 from huggingface_hub import snapshot_download from PIL import Image from typing_extensions import deprecated diff --git a/vllm/distributed/weight_transfer/ipc_engine.py b/vllm/distributed/weight_transfer/ipc_engine.py index 9b72cfe71aa..43b23be544c 100644 --- a/vllm/distributed/weight_transfer/ipc_engine.py +++ b/vllm/distributed/weight_transfer/ipc_engine.py @@ -2,12 +2,12 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project """IPC-based weight transfer engine using CUDA IPC for communication.""" -import base64 import pickle from collections.abc import Callable, Iterator from dataclasses import asdict, dataclass from typing import Any +import pybase64 as base64 import requests import torch from torch.multiprocessing.reductions import reduce_tensor diff --git a/vllm/entrypoints/openai/realtime/connection.py b/vllm/entrypoints/openai/realtime/connection.py index ffe871aa817..c958004bbeb 100644 --- a/vllm/entrypoints/openai/realtime/connection.py +++ b/vllm/entrypoints/openai/realtime/connection.py @@ -2,13 +2,13 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project import asyncio -import base64 import json from collections.abc import AsyncGenerator from http import HTTPStatus from uuid import uuid4 import numpy as np +import pybase64 as base64 from fastapi import WebSocket from starlette.websockets import WebSocketDisconnect diff --git a/vllm/entrypoints/openai/run_batch.py b/vllm/entrypoints/openai/run_batch.py index c65fefba86f..e244ffd71ef 100644 --- a/vllm/entrypoints/openai/run_batch.py +++ b/vllm/entrypoints/openai/run_batch.py @@ -2,7 +2,6 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project import asyncio -import base64 import sys import tempfile from argparse import Namespace @@ -13,6 +12,7 @@ from typing import Any, TypeAlias from urllib.parse import urlparse import aiohttp +import pybase64 as base64 import torch from fastapi import UploadFile from prometheus_client import start_http_server diff --git a/vllm/entrypoints/pooling/embed/protocol.py b/vllm/entrypoints/pooling/embed/protocol.py index b02f91dfaab..9b39b41df28 100644 --- a/vllm/entrypoints/pooling/embed/protocol.py +++ b/vllm/entrypoints/pooling/embed/protocol.py @@ -6,13 +6,13 @@ OpenAI: https://platform.openai.com/docs/api-reference/embeddings Cohere: https://docs.cohere.com/reference/embed """ -import base64 import builtins import struct import time from collections.abc import Sequence from typing import Literal, TypeAlias +import pybase64 as base64 from pydantic import BaseModel, Field from vllm import PoolingParams diff --git a/vllm/multimodal/media/audio.py b/vllm/multimodal/media/audio.py index 4f101bced1b..88dcb0b0186 100644 --- a/vllm/multimodal/media/audio.py +++ b/vllm/multimodal/media/audio.py @@ -1,6 +1,5 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 from io import BytesIO from pathlib import Path @@ -138,7 +137,7 @@ class AudioMediaIO(MediaIO[tuple[npt.NDArray, float]]): media_type: str, data: str, ) -> tuple[npt.NDArray, float]: - return self.load_bytes(base64.b64decode(data)) + return self.load_bytes(pybase64.b64decode(data)) def load_file(self, filepath: Path) -> tuple[npt.NDArray, float]: return librosa.load(filepath, sr=None) @@ -155,7 +154,7 @@ class AudioMediaIO(MediaIO[tuple[npt.NDArray, float]]): soundfile.write(buffer, audio, sr, format=audio_format) data = buffer.getvalue() - return base64.b64encode(data).decode("utf-8") + return pybase64.b64encode(data).decode("utf-8") class AudioEmbeddingMediaIO(MediaIO[torch.Tensor]): diff --git a/vllm/multimodal/media/video.py b/vllm/multimodal/media/video.py index 2af25cca19f..9784a156073 100644 --- a/vllm/multimodal/media/video.py +++ b/vllm/multimodal/media/video.py @@ -1,12 +1,12 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 from functools import partial from pathlib import Path from typing import Any import numpy as np import numpy.typing as npt +import pybase64 from PIL import Image from vllm import envs @@ -84,7 +84,7 @@ class VideoMediaIO(MediaIO[tuple[npt.NDArray, dict[str, Any]]]): [np.asarray(load_frame(frame_data)) for frame_data in data.split(",")] ), {} - return self.load_bytes(base64.b64decode(data)) + return self.load_bytes(pybase64.b64decode(data)) def load_file(self, filepath: Path) -> tuple[npt.NDArray, dict[str, Any]]: with filepath.open("rb") as f: