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: Cannot specify Numpy DType and Shape with Pydantic as deletion contains a bug. #4739

Open
michelkok opened this issue May 16, 2024 · 0 comments
Labels
bug Something isn't working

Comments

@michelkok
Copy link

Describe the bug

When specifying a Numpy array with Shape and DType, we get an error concerning the deletion of remaining_annotations.
When looking at the responsible code (here) this makes sense.
Using del in the list you are looping over will change it while looping over it. So, in this case, it will remove Shape first, and then with i==1 it will try to remove DType as well. However, since Shape was already removed, DType is now at index 0, and not at index i, which is why the code fails.

When does it happen

from typing import Annotated

import bentoml
import numpy as np
from bentoml.validators import DType, Shape

# Other code 

    @bentoml.api
    def predict_all(
        self,
        spectrum: Annotated[np.ndarray, Shape((246,)), DType("float32")]
        = Field(description="A 1x4 tensor with float32 dtype")
    ) -> np.ndarray:
        return np.mean([model.predict(spectrum) for model in self.models])
    

Solution

    # Still remaining after numpy annotations are processed.
    remaining = []
    for annotation in (remaining_annotations):
        if isinstance(annotation, Shape):
            shape = annotation.dimensions
        elif isinstance(annotation, DType):
            dtype = annotation.dtype
        else:
            remaining.append(annotation)

    return source, [TensorSchema("numpy-array", dtype, shape), *remaining]

Shall I make a PR?

To reproduce

No response

Expected behavior

No response

Environment

Environment variable

BENTOML_DEBUG=''
BENTOML_QUIET=''
BENTOML_BUNDLE_LOCAL_BUILD=''
BENTOML_DO_NOT_TRACK=''
BENTOML_CONFIG=''
BENTOML_CONFIG_OPTIONS=''
BENTOML_PORT=''
BENTOML_HOST=''
BENTOML_API_WORKERS=''

System information

bentoml: 1.2.4
python: 3.12.3
platform: Linux-5.15.146.1-microsoft-standard-WSL2-x86_64-with-glibc2.31
uid_gid: 0:0

pip_packages
aiohttp==3.9.3
aiosignal==1.3.1
alembic==1.13.1
annotated-types==0.6.0
antlr4-python3-runtime==4.9.3
anyio==4.3.0
appdirs==1.4.4
asgiref==3.7.2
attrs==23.2.0
bentoml==1.2.4
build==1.1.1
CacheControl==0.13.1
cattrs==23.1.2
certifi==2024.2.2
cffi==1.16.0
cfgv==3.4.0
charset-normalizer==3.3.2
circus==0.18.0
clearml==1.14.4
cleo==2.1.0
click==8.1.7
click-option-group==0.5.6
cloudpickle==3.0.0
colorlog==6.8.2
contextlib2==21.6.0
contourpy==1.2.1
crashtest==0.4.1
cryptography==42.0.7
cycler==0.12.1
dataclasses-json==0.6.4
deepmerge==1.1.1
Deprecated==1.2.14
distlib==0.3.8
dulwich==0.21.7
fastjsonschema==2.19.1
filelock==3.13.1
fonttools==4.51.0
frozenlist==1.4.1
fs==2.4.16
furl==2.1.3
greenlet==3.0.3
h11==0.14.0
httpcore==1.0.4
httpx==0.27.0
hydra-core==1.3.2
identify==2.5.35
idna==3.6
importlib-metadata==6.11.0
inflection==0.5.1
iniconfig==2.0.0
installer==0.7.0
jaraco.classes==3.4.0
jeepney==0.8.0
Jinja2==3.1.3
joblib==1.3.2
jsonschema==4.21.1
jsonschema-specifications==2023.12.1
keyring==24.3.1
kiwisolver==1.4.5
loguru==0.7.2
Mako==1.3.2
markdown-it-py==3.0.0
MarkupSafe==2.1.5
marshmallow==3.21.0
matplotlib==3.8.4
mdurl==0.1.2
more-itertools==10.2.0
msgpack==1.0.8
multidict==6.0.5
mypy-extensions==1.0.0
nodeenv==1.8.0
numpy==1.26.4
nvidia-ml-py==11.525.150
omegaconf==2.3.0
opentelemetry-api==1.20.0
opentelemetry-instrumentation==0.41b0
opentelemetry-instrumentation-aiohttp-client==0.41b0
opentelemetry-instrumentation-asgi==0.41b0
opentelemetry-sdk==1.20.0
opentelemetry-semantic-conventions==0.41b0
opentelemetry-util-http==0.41b0
optuna==3.5.0
optuna-fast-fanova==0.0.4
orderedmultidict==1.0.1
packaging==23.2
pandas==2.2.2
pathlib2==2.3.7.post1
pathspec==0.12.1
pexpect==4.9.0
pillow==10.2.0
pip-requirements-parser==32.0.1
pip-tools==7.4.0
pkginfo==1.10.0
platformdirs==4.2.0
plotly==5.19.0
pluggy==1.5.0
poetry==1.7.1
poetry-core==1.8.1
poetry-plugin-export==1.6.0
pre-commit==3.6.2
prometheus_client==0.20.0
psutil==5.9.8
ptyprocess==0.7.0
py4j==0.10.9.7
pycparser==2.22
pydantic==2.6.3
pydantic_core==2.16.3
Pygments==2.17.2
PyJWT==2.8.0
pyparsing==3.1.2
pyproject_hooks==1.0.0
pytest==8.2.0
python-dateutil==2.9.0.post0
python-json-logger==2.0.7
python-multipart==0.0.9
pytz==2024.1
PyYAML==6.0.1
pyzmq==25.1.2
rapidfuzz==3.9.0
referencing==0.33.0
requests==2.31.0
requests-toolbelt==1.0.0
rich==13.7.1
rpds-py==0.18.0
ruff==0.2.2
schema==0.7.5
scikit-learn==1.4.1.post1
scipy==1.12.0
seaborn==0.13.2
SecretStorage==3.3.3
setuptools==69.1.1
shellingham==1.5.4
simple-di==0.1.5
six==1.16.0
sniffio==1.3.1
SQLAlchemy==2.0.27
starlette==0.37.1
tenacity==8.2.3
threadpoolctl==3.3.0
tomlkit==0.12.5
tornado==6.4
tqdm==4.66.2
trove-classifiers==2024.4.10
typing-inspect==0.9.0
typing_extensions==4.10.0
tzdata==2024.1
urllib3==2.2.1
uvicorn==0.27.1
virtualenv==20.25.1
watchfiles==0.21.0
wheel==0.42.0
wrapt==1.16.0
xgboost==1.7.6
yarl==1.9.4
zipp==3.17.0
@michelkok michelkok added the bug Something isn't working label May 16, 2024
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

1 participant