Files
lmcache--lmcache/docs/source/developer_guide/usage/usage_stats_collection.rst
T
2026-07-13 12:24:33 +08:00

156 lines
5.5 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.. _usage-stats-collection:
Usage Stats Collection
======================
LMCache collects anonymous usage data by default to help the engineering team understand real-world workloads, prioritize optimizations, and improve reliability. All collected data is aggregated and contains no sensitive user information.
A sanitized subset of the aggregated data may be publicly released for the communitys benefit (for example, see a daily usage report `here <https://github.com/Hanchenli/OSS_Growth_Toolkit/tree/main/usage_tracker/report>`_).
What data is collected?
-----------------------
Usage stats are implemented in the ``lmcache/usage_telemetry/`` package. The
one-shot messages sent at startup depend on how LMCache runs.
When LMCache runs **inside the serving engine** (the single-process
integrations for vLLM, SGLang, and TensorRT-LLM), engine startup sends:
- **EnvMessage**
Captures environment details such as cloud provider, CPU info, total memory, architecture, GPU count/type, and execution source.
- **EngineMessage**
Records engine configuration and metadata, including cache settings (chunk size, local device, cache limits), remote backend parameters, blending settings, model name, world size, and KV-cache dtype/shape.
- **MetadataMessage**
Reports execution metadata: the timestamp when the run started and total duration in seconds.
When LMCache runs as a **standalone multiprocess (MP) cache server**
(``lmcache server``), server startup sends:
- **EnvMessage**
Same environment snapshot as above, taken on the cache-server host.
- **MPServerMessage**
Records the server configuration: LMCache version, chunk size, hash
algorithm, engine type, transfer mode, worker pool sizes, whether P2P is
enabled, L1 size and medium (DRAM / GDS / DRAM+DevDAX), eviction policy,
the configured L2 adapter and serde types, and the L2 store/prefetch
policies.
The MP server's ``--instance-id`` is **never** sent: it can be
operator-chosen and therefore identifying. Model names are not known at
server startup (vLLM instances register later) and are not part of this
message.
In addition to the one-shot messages above, a continuous reporter periodically
sends interval counters (**ContinuousContextMessage**: tokens stored/hit and
stored KV bytes in the interval) and a cache-lifespan histogram
(**CacheLifespanMessage**). The flush interval is controlled by
``LMCACHE_USAGE_TRACK_INTERVAL`` (seconds, default 600).
Every payload carries four common fields:
- ``session_id`` -- a random UUID minted once per process, joining the
one-shot context with the continuous messages of the same run.
- ``machine_id`` -- a random UUID persisted at
``~/.config/lmcache/machine_id``, grouping sessions from the same machine.
It is never derived from hardware identifiers (MAC address, hostname).
- ``schema_version`` -- the version of the message schema.
- ``deployment_mode`` -- ``single_process`` (LMCache inside the serving
engine) or ``mp_server`` (standalone MP cache server).
These messages are serialized to JSON and POSTed to the LMCache usage server.
Example JSON payload
~~~~~~~~~~~~~~~~~~~~
.. code-block:: json
{
"message_type": "EnvMessage",
"provider": "GCP",
"num_cpu": 24,
"cpu_type": "Intel(R) Xeon(R) CPU @ 2.20GHz",
"cpu_family_model_stepping": "6,85,7",
"total_memory": 101261135872,
"architecture": ["64bit", "ELF"],
"platforms": "Linux-5.10.0-28-cloud-amd64-x86_64-with-glibc2.31",
"gpu_count": 2,
"gpu_type": "NVIDIA L4",
"gpu_memory_per_device": 23580639232,
"source": "DOCKER"
}
Previewing collected data
-------------------------
If you enable **local logging**, usage messages are appended to your specified log file. To inspect the most recent entries:
.. code-block:: bash
tail ~/.config/lmcache/usage.log
Configuration & Opt-out
-----------------------
By default, usage tracking is **enabled**. Any one of the following opt-outs
disables all usage stats collection:
.. code-block:: bash
# LMCache-specific opt-out
export LMCACHE_TRACK_USAGE=false
# The cross-tool "do not track" convention (1/true/yes)
export DO_NOT_TRACK=1
When tracking is disabled, ``InitializeUsageContext`` will return ``None`` and
no data will be sent or logged, and no state files (such as ``machine_id``)
will be created.
Reference
~~~~~~~~~
.. list-table::
:header-rows: 1
:widths: 34 14 52
* - Environment variable / file
- Default
- Effect
* - ``LMCACHE_TRACK_USAGE``
- unset
- Set to ``false`` to disable all usage stats collection.
* - ``DO_NOT_TRACK``
- unset
- Set to ``1``/``true``/``yes`` to disable collection (cross-tool
convention).
* - ``LMCACHE_USAGE_TRACK_URL``
- ``http://stats.lmcache.ai:8080``
- Override the stats server endpoint (e.g. for a private sink).
* - ``LMCACHE_USAGE_TRACK_INTERVAL``
- ``600``
- Seconds between continuous-message flushes.
* - ``~/.config/lmcache/machine_id``
- created on first send
- Holds the random anonymous machine UUID. Delete it to rotate the
identifier.
Local logging
~~~~~~~~~~~~~
If you would like to log to a file in addition to (or instead of) sending data to the server, pass a local-log path when initializing:
.. code-block:: python
from lmcache.usage_telemetry import InitializeUsageContext
usage_ctx = InitializeUsageContext(
config=engine_config,
metadata=engine_metadata,
local_log="~/.config/lmcache/usage.log"
)
Omitting the ``local_log`` argument (or passing ``None``) disables local file logging.