microsoft/qlib · error · ValueError

{self.__class__.__name__} does not support inst_processor. P

Error message

{self.__class__.__name__} does not support inst_processor. Please use `D.features(disk_cache=0)` or `qlib.init(dataset_cache=None)`

What it means

When qlib runs against a remote backend (`ClientProvider`), `D.features` with disk_cache asks qlib-server to generate a dataset cache and reads the resulting file over NFS. That code path has no support for `inst_processors`, so passing any raises ValueError with two workarounds in the message.

Source

Thrown at qlib/data/data.py:1107

                start_time = cal[0]
                end_time = cal[-1]

                data = self.dataset_processor(instruments_d, column_names, start_time, end_time, freq, inst_processors)
                if return_uri:
                    return data, feature_uri
                else:
                    return data
        else:
            """
            Call the server to generate the data-set cache, get the uri of the cache file.
            Then load the data from the file on NFS directly.
            - using single-process implementation.

            """
            # TODO: support inst_processors, need to change the code of qlib-server at the same time
            # FIXME: The cache after resample, when read again and intercepted with end_time, results in incomplete data date
            if inst_processors:
                raise ValueError(
                    f"{self.__class__.__name__} does not support inst_processor. "
                    f"Please use `D.features(disk_cache=0)` or `qlib.init(dataset_cache=None)`"
                )
            self.conn.send_request(
                request_type="feature",
                request_content={
                    "instruments": instruments,
                    "fields": fields,
                    "start_time": start_time,
                    "end_time": end_time,
                    "freq": freq,
                    "disk_cache": 1,
                },
                msg_queue=self.queue,
            )
            # - Done in callback
            feature_uri = self.queue.get(timeout=C["timeout"])
            if isinstance(feature_uri, Exception):

View on GitHub (pinned to 79633dd950)

Solutions

  1. Call `D.features(..., disk_cache=0)` to bypass the server dataset-cache path (data streamed instead).
  2. Or re-init with `qlib.init(..., dataset_cache=None)` to disable dataset caching globally.
  3. Or switch to a local provider_uri so the local provider (which supports inst_processors) is used.

Example fix

# before
df = D.features(insts, fields, start, end, inst_processors=[proc])

# after
df = D.features(insts, fields, start, end, inst_processors=[proc], disk_cache=0)
Defensive patterns

Strategy: validation

Validate before calling

from qlib.config import C

def server_cache_mode_conflicts(inst_processors) -> bool:
    return bool(inst_processors) and C.get('provider') not in (None, 'local')

Prevention

When it happens

Trigger: Using `qlib.init(...)` against a qlib-server backend (client mode) and calling `D.features(..., inst_processors=[SomeProcessor()])` with the default disk_cache=1.

Common situations: Mixed setups where a notebook points at remote data but workflow code written for local providers uses inst_processors (e.g. price adjustment processors like AdjustProcessor).

Related errors


AI-assisted analysis of microsoft/qlib@79633dd950 (2026-08-15). Data as JSON: /api/errors/b8fb412dcf0353a5. Report an issue: GitHub.