Skip to content

PandasCodec behavior regression with 1.7.0 #2112

Description

@ReveStobinson

Since the v1.7.0 update, PandasCodec.encode_request() is no longer able to encode columns that contain bytestring data. This issue was not present in v1.6.1.

Steps to reproduce

The following code:

import pandas as pd
from mlserver.codecs import PandasCodec

test_data = {
    "timestamp": 12,
    "uuid": "test",
    "data": bytes("testing", encoding="utf-8"),
}

payload = pd.DataFrame(test_data, index=[0])

request = PandasCodec.encode_request(payload)

Will result in this error:

Traceback (most recent call last):
  File "/home/username/file.py", line 12, in <module>
    request = PandasCodec.encode_request(payload)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/site-packages/mlserver/codecs/pandas.py", line 150, in encode_request
    outputs = cls.encode_outputs(payload, use_bytes=use_bytes)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/site-packages/mlserver/codecs/pandas.py", line 142, in encode_outputs
    return [
           ^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/site-packages/mlserver/codecs/pandas.py", line 143, in <listcomp>
    _to_response_output(payload[col], use_bytes=use_bytes) for col in payload
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/site-packages/mlserver/codecs/pandas.py", line 54, in _to_response_output
    data = [encode_to_json(elem, use_bytes) for elem in data]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/site-packages/mlserver/codecs/pandas.py", line 54, in <listcomp>
    data = [encode_to_json(elem, use_bytes) for elem in data]
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/site-packages/mlserver/codecs/json.py", line 79, in encode_to_json
    enc_v = json.dumps(
            ^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
          ^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/json/encoder.py", line 200, in encode
    chunks = self.iterencode(o, _one_shot=True)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/json/encoder.py", line 258, in iterencode
    return _iterencode(o, 0)
           ^^^^^^^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/site-packages/mlserver/codecs/json.py", line 75, in default
    return json.JSONEncoder.default(self, obj)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/var/opt/miniforge/envs/mlserver/lib/python3.11/json/encoder.py", line 180, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type bytes is not JSON serializable

Running the same script in v1.6.1, no error occurs and the request is created successfully. Both run with clean installs of mlserver on Ubuntu 22.04.

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions