# XProf (+ Tensorboard Profiler Plugin)
XProf offers a number of tools to analyse and visualize the
performance of your model across multiple devices. Some of the tools include:
* **Overview**: A high-level overview of the performance of your model. This
is an aggregated overview for your host and all devices. It includes:
* Performance summary and breakdown of step times.
* A graph of individual step times.
* High level details of the run environment.
* **Trace Viewer**: Displays a timeline of the execution of your model that shows:
* The duration of each op.
* Which part of the system (host or device) executed an op.
* The communication between devices.
* **Memory Profile Viewer**: Monitors the memory usage of your model.
* **Graph Viewer**: A visualization of the graph structure of HLOs of your model.
To learn more about the various XProf tools, check out the [XProf documentation](https://openxla.org/xprof)
## Demo
First time user? Come and check out this [Colab Demo](https://docs.jaxstack.ai/en/latest/JAX_for_LLM_pretraining.html).
## Quick Start
### Prerequisites
* xprof >= 2.20.0
* (optional) TensorBoard >= 2.20.0
Note: XProf requires access to the Internet to load the [Google Chart library](https://developers.google.com/chart/interactive/docs/basic_load_libs#basic-library-loading).
Some charts and tables may be missing if you run XProf entirely offline on
your local machine, behind a corporate firewall, or in a datacenter.
If you use Google Cloud to run your workloads, we recommend the
[xprofiler tool](https://github.com/AI-Hypercomputer/cloud-diagnostics-xprof).
It provides a streamlined profile collection and viewing experience using VMs
running XProf.
### Installation
To get the most recent release version of XProf, install it via pip:
```
$ pip install xprof
```
## Running XProf
XProf can be launched as a standalone server or used as a plugin within
TensorBoard. For large-scale use, it can be deployed in a distributed mode with
separate aggregator and worker instances ([more details on it later in the
doc](#distributed-profiling)).
### Command-Line Arguments
When launching XProf from the command line, you can use the following arguments:
* **`logdir`** (optional): The directory containing XProf profile data (files
ending in `.xplane.pb`). This can be provided as a positional argument or
with `-l` or `--logdir`. If provided, XProf will load and display profiles
from this directory. If omitted, XProf will start without loading any
profiles, and you can dynamically load profiles using `session_path` or
`run_path` URL parameters, as described in the [Log Directory
Structure](#log-directory-structure) section.
* **`-p <port>`**, **`--port <port>`**: The port for the XProf web server.
Defaults to `8791`.
* **`-gp <grpc_port>`**, **`--grpc_port <grpc_port>`**: The port for the gRPC
server used for distributed processing. Defaults to `50051`. This must be
different from `--port`.
* **`-wsa <addresses>`**, **`--worker_service_address <addresses>`**: A
comma-separated list of worker addresses (e.g., `host1:50051,host2:50051`)
for distributed processing. Defaults to to `0.0.0.0:<grpc_port>`.
* **`-hcpb`**, **`--hide_capture_profile_button`**: If set, hides the 'Capture
Profile' button in the UI.
### Standalone
If you have profile data in a directory (e.g., `profiler/demo`), you can view it
by running:
```
$ xprof profiler/demo --port=6006
```
Or with the optional flag:
```
$ xprof --logdir=profiler/demo --port=6006
```
### With TensorBoard
If you have TensorBoard installed, you can run:
```
$ tensorboard --logdir=profiler/demo
```
If you are behind a corporate firewall, you may need to include the `--bind_all`
tensorboard flag.
Go to `localhost:6006/#profile` of your browser, you should now see the demo
overview page show up.
Congratulations! You're now ready to capture a profile.
### Log Directory Structure
When using XProf, profile data must be placed in a specific directory structure.
XProf expects `.xplane.pb` files to be in the following path:
```
<log_dir>/plugins/profile/<session_name>/
```
* `<log_dir>`: This is the root directory that you supply to `tensorboard
--logdir`.
* `plugins/profile/`: This is a required subdirectory.
* `<session_name>/`: Each subdirectory inside `plugins/profile/` represents a
single profiling session. The name of this directory will appear in the
TensorBoard UI dropdown to select the session.
**Example:**
If your log directory is structured like this:
```
/path/to/your/log_dir/
└── plugins/
└── profile/
├── my_experiment_run_1/
│ └── host0.xplane.pb
└── benchmark_20251107/
└── host1.xplane.pb
```
You would launch TensorBoard with:
```bash
tensorboard --logdir /path/to/your/log_dir/
```
The runs `my_experiment_run_1` and `benchmark_20251107` will be available in the
"Sessions" tab of the UI.
You can also dynamically load sessions from a GCS bucket or local filesystem by
passing URL parameters when loading XProf in your browser. This method works
whether or not you provided a `logdir` at startup and is useful for viewing
profiles from various locations without restarting XProf.
For example, if you start XProf with no log directory:
```bash
xprof
```
You can load sessions using the following URL parameters.
Assume you have profile data stored on GCS or locally, structured like this:
```
gs://your-bucket/profile_runs/
├── my_experiment_run_1/
│ ├── host0.xplane.pb
│ └── host1.xplane.pb
└── benchmark_20251107/
└── host0.xplane.pb
```
There are two URL parameters you can use:
* **`session_path`**: Use this to load a *single* session directly. The path
should point to a directory containing `.xplane.pb` files for one session.
* GCS Example:
`http://localhost:8791/?session_path=gs://your-bucket/profile_runs/my_experiment_run_1`
* Local Path Example:
`http://localhost:8791/?session_path=/path/to/profile_runs/my_experiment_run_1`
* Result: XProf will load the `my_experiment_run_1`
session, and you will see its data in the UI.
* **`run_path`**: Use this to point to a directory that contains *multiple*
session directories.
* GCS Example:
`http://localhost:8791/?run_path=gs://your-bucket/profile_runs/`
* Local Path Example:
`http://localhost:8791/?run_path=/path/to/profile_runs/`
* Result: XProf will list all session directories found under `run_path`
(i.e., `my_experiment_run_1` and `benchmark_20251107`) in the "Sessions"
dropdown in the UI, allowing you to switch between them.
**Loading Precedence**
If multiple sources are provided, XProf uses the following order of precedence
to determine which profiles to load:
1. **`session_path`** URL parameter
2. **`run_path`** URL parameter
3. **`logdir`** command-line argument
### Distributed Profiling
XProf supports distributed profile processing by using an aggregator that
distributes work to multiple XProf workers. This is useful for processing large
profiles or handling multiple users.
**Note**: Currently, distributed processing only benefits the following tools:
`overview_page`, `framework_op_stats`, `input_pipeline`, and `pod_viewer`.
**Note**: The ports used in these examples (`6006` for the aggregator HTTP
server, `9999` for the worker HTTP server, and `50051` for the worker gRPC
server) are suggestions and can be customized.
**Worker Node**
Each worker node should run XProf with a gRPC port exposed so it can receive
processing requests. You should also hide the capture button as workers are not
meant to be interacted with directly.
```
$ xprof --grpc_port=50051 --port=9999 --hide_capture_profile_button
```
**Aggregator Node**
The aggregator node runs XProf with the `--worker_service_address` flag pointing
to all available workers. Users will interact with aggregator node's UI.
```
$ xprof --worker_service_address=<worker1_ip>:50051,<worker2_ip>:50051 --port=6006 --logdir=profiler/demo
```
Replace `<worker1_ip>, <worker2_ip>` with the addresses of your worker machines.
Requests sent to the aggregator on port 6006 will be distributed among the
workers for processing.
For deploying a distributed XProf setup in a Kubernetes environment, see
[Kubernetes Deployment Guide](docs/kubernetes_deployment.md).
## Nightlies
Every night, a nightly version of the package is released under the name of
`xprof-nightly`. This package contains the latest changes made by the XProf
developers.
To install the nightly version of profiler:
```
$ pip uninstall xprof tensorboard-plugin-profile
$ pip install xprof-nightly
```
## Next Steps
* [JAX Profiling Guide](https://jax.readthedocs.io/en/latest/profiling.html#xprof-tensorboard-profiling)
* [PyTorch/XLA Profiling Guide](https://cloud.google.com/tpu/docs/pytorch-xla-performance-profiling-tpu-vm)
* [TensorFlow Profiling Guide](https://tensorflow.org/guide/profiler)
* [Cloud TPU Profiling Guide](https://cloud.google.com/tpu/docs/cloud-tpu-tools)
* [Colab Tutorial](https://www.tensorflow.org/tensorboard/tensorboard_profiling_keras)
* [Tensorflow Colab](https://www.tensorflow.org/tensorboard/tensorboard_profiling_keras)
Raw data
{
"_id": null,
"home_page": "https://github.com/openxla/xprof-nightly",
"name": "tbp-nightly",
"maintainer": null,
"docs_url": null,
"requires_python": "!=3.0.*,!=3.1.*,>=2.7",
"maintainer_email": null,
"keywords": "jax pytorch xla tensorflow tensorboard xprof-nightly profile plugin",
"author": "Google Inc.",
"author_email": "packages@tensorflow.org",
"download_url": null,
"platform": null,
"description": "# XProf (+ Tensorboard Profiler Plugin)\n\nXProf offers a number of tools to analyse and visualize the\nperformance of your model across multiple devices. Some of the tools include:\n\n* **Overview**: A high-level overview of the performance of your model. This\n is an aggregated overview for your host and all devices. It includes:\n * Performance summary and breakdown of step times.\n * A graph of individual step times.\n * High level details of the run environment.\n* **Trace Viewer**: Displays a timeline of the execution of your model that shows:\n * The duration of each op.\n * Which part of the system (host or device) executed an op.\n * The communication between devices.\n* **Memory Profile Viewer**: Monitors the memory usage of your model.\n* **Graph Viewer**: A visualization of the graph structure of HLOs of your model.\n\nTo learn more about the various XProf tools, check out the [XProf documentation](https://openxla.org/xprof)\n\n## Demo\nFirst time user? Come and check out this [Colab Demo](https://docs.jaxstack.ai/en/latest/JAX_for_LLM_pretraining.html).\n\n## Quick Start\n\n### Prerequisites\n\n* xprof >= 2.20.0\n* (optional) TensorBoard >= 2.20.0\n\nNote: XProf requires access to the Internet to load the [Google Chart library](https://developers.google.com/chart/interactive/docs/basic_load_libs#basic-library-loading).\nSome charts and tables may be missing if you run XProf entirely offline on\nyour local machine, behind a corporate firewall, or in a datacenter.\n\nIf you use Google Cloud to run your workloads, we recommend the\n[xprofiler tool](https://github.com/AI-Hypercomputer/cloud-diagnostics-xprof).\nIt provides a streamlined profile collection and viewing experience using VMs\nrunning XProf.\n\n### Installation\n\nTo get the most recent release version of XProf, install it via pip:\n\n```\n$ pip install xprof\n```\n\n## Running XProf\n\nXProf can be launched as a standalone server or used as a plugin within\nTensorBoard. For large-scale use, it can be deployed in a distributed mode with\nseparate aggregator and worker instances ([more details on it later in the\ndoc](#distributed-profiling)).\n\n### Command-Line Arguments\n\nWhen launching XProf from the command line, you can use the following arguments:\n\n* **`logdir`** (optional): The directory containing XProf profile data (files\n ending in `.xplane.pb`). This can be provided as a positional argument or\n with `-l` or `--logdir`. If provided, XProf will load and display profiles\n from this directory. If omitted, XProf will start without loading any\n profiles, and you can dynamically load profiles using `session_path` or\n `run_path` URL parameters, as described in the [Log Directory\n Structure](#log-directory-structure) section.\n* **`-p <port>`**, **`--port <port>`**: The port for the XProf web server.\n Defaults to `8791`.\n* **`-gp <grpc_port>`**, **`--grpc_port <grpc_port>`**: The port for the gRPC\n server used for distributed processing. Defaults to `50051`. This must be\n different from `--port`.\n* **`-wsa <addresses>`**, **`--worker_service_address <addresses>`**: A\n comma-separated list of worker addresses (e.g., `host1:50051,host2:50051`)\n for distributed processing. Defaults to to `0.0.0.0:<grpc_port>`.\n* **`-hcpb`**, **`--hide_capture_profile_button`**: If set, hides the 'Capture\n Profile' button in the UI.\n\n### Standalone\n\nIf you have profile data in a directory (e.g., `profiler/demo`), you can view it\nby running:\n\n```\n$ xprof profiler/demo --port=6006\n```\n\nOr with the optional flag:\n\n```\n$ xprof --logdir=profiler/demo --port=6006\n```\n\n### With TensorBoard\n\nIf you have TensorBoard installed, you can run:\n\n```\n$ tensorboard --logdir=profiler/demo\n```\n\nIf you are behind a corporate firewall, you may need to include the `--bind_all`\ntensorboard flag.\n\nGo to `localhost:6006/#profile` of your browser, you should now see the demo\noverview page show up.\nCongratulations! You're now ready to capture a profile.\n\n### Log Directory Structure\n\nWhen using XProf, profile data must be placed in a specific directory structure.\nXProf expects `.xplane.pb` files to be in the following path:\n\n```\n<log_dir>/plugins/profile/<session_name>/\n```\n\n* `<log_dir>`: This is the root directory that you supply to `tensorboard\n --logdir`.\n* `plugins/profile/`: This is a required subdirectory.\n* `<session_name>/`: Each subdirectory inside `plugins/profile/` represents a\n single profiling session. The name of this directory will appear in the\n TensorBoard UI dropdown to select the session.\n\n**Example:**\n\nIf your log directory is structured like this:\n\n```\n/path/to/your/log_dir/\n\u2514\u2500\u2500 plugins/\n \u2514\u2500\u2500 profile/\n \u251c\u2500\u2500 my_experiment_run_1/\n \u2502 \u2514\u2500\u2500 host0.xplane.pb\n \u2514\u2500\u2500 benchmark_20251107/\n \u2514\u2500\u2500 host1.xplane.pb\n```\n\nYou would launch TensorBoard with:\n\n```bash\ntensorboard --logdir /path/to/your/log_dir/\n```\n\nThe runs `my_experiment_run_1` and `benchmark_20251107` will be available in the\n\"Sessions\" tab of the UI.\n\nYou can also dynamically load sessions from a GCS bucket or local filesystem by\npassing URL parameters when loading XProf in your browser. This method works\nwhether or not you provided a `logdir` at startup and is useful for viewing\nprofiles from various locations without restarting XProf.\n\nFor example, if you start XProf with no log directory:\n\n```bash\nxprof\n```\n\nYou can load sessions using the following URL parameters.\n\nAssume you have profile data stored on GCS or locally, structured like this:\n\n```\ngs://your-bucket/profile_runs/\n\u251c\u2500\u2500 my_experiment_run_1/\n\u2502 \u251c\u2500\u2500 host0.xplane.pb\n\u2502 \u2514\u2500\u2500 host1.xplane.pb\n\u2514\u2500\u2500 benchmark_20251107/\n \u2514\u2500\u2500 host0.xplane.pb\n```\n\nThere are two URL parameters you can use:\n\n* **`session_path`**: Use this to load a *single* session directly. The path\n should point to a directory containing `.xplane.pb` files for one session.\n\n * GCS Example:\n `http://localhost:8791/?session_path=gs://your-bucket/profile_runs/my_experiment_run_1`\n * Local Path Example:\n `http://localhost:8791/?session_path=/path/to/profile_runs/my_experiment_run_1`\n * Result: XProf will load the `my_experiment_run_1`\n session, and you will see its data in the UI.\n\n* **`run_path`**: Use this to point to a directory that contains *multiple*\n session directories.\n\n * GCS Example:\n `http://localhost:8791/?run_path=gs://your-bucket/profile_runs/`\n * Local Path Example:\n `http://localhost:8791/?run_path=/path/to/profile_runs/`\n * Result: XProf will list all session directories found under `run_path`\n (i.e., `my_experiment_run_1` and `benchmark_20251107`) in the \"Sessions\"\n dropdown in the UI, allowing you to switch between them.\n\n**Loading Precedence**\n\nIf multiple sources are provided, XProf uses the following order of precedence\nto determine which profiles to load:\n\n1. **`session_path`** URL parameter\n2. **`run_path`** URL parameter\n3. **`logdir`** command-line argument\n\n### Distributed Profiling\n\nXProf supports distributed profile processing by using an aggregator that\ndistributes work to multiple XProf workers. This is useful for processing large\nprofiles or handling multiple users.\n\n**Note**: Currently, distributed processing only benefits the following tools:\n`overview_page`, `framework_op_stats`, `input_pipeline`, and `pod_viewer`.\n\n**Note**: The ports used in these examples (`6006` for the aggregator HTTP\nserver, `9999` for the worker HTTP server, and `50051` for the worker gRPC\nserver) are suggestions and can be customized.\n\n**Worker Node**\n\nEach worker node should run XProf with a gRPC port exposed so it can receive\nprocessing requests. You should also hide the capture button as workers are not\nmeant to be interacted with directly.\n\n```\n$ xprof --grpc_port=50051 --port=9999 --hide_capture_profile_button\n```\n\n**Aggregator Node**\n\nThe aggregator node runs XProf with the `--worker_service_address` flag pointing\nto all available workers. Users will interact with aggregator node's UI.\n\n```\n$ xprof --worker_service_address=<worker1_ip>:50051,<worker2_ip>:50051 --port=6006 --logdir=profiler/demo\n```\n\nReplace `<worker1_ip>, <worker2_ip>` with the addresses of your worker machines.\nRequests sent to the aggregator on port 6006 will be distributed among the\nworkers for processing.\n\nFor deploying a distributed XProf setup in a Kubernetes environment, see\n[Kubernetes Deployment Guide](docs/kubernetes_deployment.md).\n\n## Nightlies\n\nEvery night, a nightly version of the package is released under the name of\n`xprof-nightly`. This package contains the latest changes made by the XProf\ndevelopers.\n\nTo install the nightly version of profiler:\n\n```\n$ pip uninstall xprof tensorboard-plugin-profile\n$ pip install xprof-nightly\n```\n\n## Next Steps\n\n* [JAX Profiling Guide](https://jax.readthedocs.io/en/latest/profiling.html#xprof-tensorboard-profiling)\n* [PyTorch/XLA Profiling Guide](https://cloud.google.com/tpu/docs/pytorch-xla-performance-profiling-tpu-vm)\n* [TensorFlow Profiling Guide](https://tensorflow.org/guide/profiler)\n* [Cloud TPU Profiling Guide](https://cloud.google.com/tpu/docs/cloud-tpu-tools)\n* [Colab Tutorial](https://www.tensorflow.org/tensorboard/tensorboard_profiling_keras)\n* [Tensorflow Colab](https://www.tensorflow.org/tensorboard/tensorboard_profiling_keras)\n",
"bugtrack_url": null,
"license": "Apache 2.0",
"summary": "XProf Profiler Plugin",
"version": "2.22.1a20251114",
"project_urls": {
"Homepage": "https://github.com/openxla/xprof-nightly"
},
"split_keywords": [
"jax",
"pytorch",
"xla",
"tensorflow",
"tensorboard",
"xprof-nightly",
"profile",
"plugin"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "e8ee530bb6c0752ce0d1906ef952ad66a0bdd2d59672e0cd74409ef48ac52e91",
"md5": "1ae3908a84ba21e68144a2568e20c385",
"sha256": "7925f0ceaa6771f05b63a11854d670cb68a4ab37f00ce92c3fff890c9de9d351"
},
"downloads": -1,
"filename": "tbp_nightly-2.22.1a20251114-cp310-none-macosx_12_0_arm64.whl",
"has_sig": false,
"md5_digest": "1ae3908a84ba21e68144a2568e20c385",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": "!=3.0.*,!=3.1.*,>=2.7",
"size": 5765,
"upload_time": "2025-11-14T10:27:57",
"upload_time_iso_8601": "2025-11-14T10:27:57.667050Z",
"url": "https://files.pythonhosted.org/packages/e8/ee/530bb6c0752ce0d1906ef952ad66a0bdd2d59672e0cd74409ef48ac52e91/tbp_nightly-2.22.1a20251114-cp310-none-macosx_12_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7ffdbc07d203ffd5a7a1639b1385cd0fba23588eee763fc67d07eb12f0237a8e",
"md5": "bf6517fea0228f1053805abc648c0f15",
"sha256": "842b304422807c049c10c7745fb9a2ecdf2064f0b86babb5c464a0fcddd23dd2"
},
"downloads": -1,
"filename": "tbp_nightly-2.22.1a20251114-cp311-none-macosx_12_0_arm64.whl",
"has_sig": false,
"md5_digest": "bf6517fea0228f1053805abc648c0f15",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": "!=3.0.*,!=3.1.*,>=2.7",
"size": 5765,
"upload_time": "2025-11-14T10:23:55",
"upload_time_iso_8601": "2025-11-14T10:23:55.913780Z",
"url": "https://files.pythonhosted.org/packages/7f/fd/bc07d203ffd5a7a1639b1385cd0fba23588eee763fc67d07eb12f0237a8e/tbp_nightly-2.22.1a20251114-cp311-none-macosx_12_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ee881434322a5db03ac40d2c5c931438a1cee8eabf814544dc344e15e71ed444",
"md5": "e509033c4668ba760a98b933a270fe4b",
"sha256": "97f8bbb3a2a38f4ecea9f85f7c2eed1282c65fdb94510da87ec49ce467d4b07b"
},
"downloads": -1,
"filename": "tbp_nightly-2.22.1a20251114-cp312-none-macosx_12_0_arm64.whl",
"has_sig": false,
"md5_digest": "e509033c4668ba760a98b933a270fe4b",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": "!=3.0.*,!=3.1.*,>=2.7",
"size": 5765,
"upload_time": "2025-11-14T10:30:08",
"upload_time_iso_8601": "2025-11-14T10:30:08.686117Z",
"url": "https://files.pythonhosted.org/packages/ee/88/1434322a5db03ac40d2c5c931438a1cee8eabf814544dc344e15e71ed444/tbp_nightly-2.22.1a20251114-cp312-none-macosx_12_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "155a49ebd443f7d0ace9cc91946266363fa083f1436e28e0e62d2f1afca94e68",
"md5": "6b4a4852951e3e642148370226880761",
"sha256": "27aa4d6255ffc60520c0c4f7ff7e0133b655af8e7ef799e9436d3aed0893e6df"
},
"downloads": -1,
"filename": "tbp_nightly-2.22.1a20251114-cp313-none-macosx_12_0_arm64.whl",
"has_sig": false,
"md5_digest": "6b4a4852951e3e642148370226880761",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": "!=3.0.*,!=3.1.*,>=2.7",
"size": 5765,
"upload_time": "2025-11-14T10:27:38",
"upload_time_iso_8601": "2025-11-14T10:27:38.882438Z",
"url": "https://files.pythonhosted.org/packages/15/5a/49ebd443f7d0ace9cc91946266363fa083f1436e28e0e62d2f1afca94e68/tbp_nightly-2.22.1a20251114-cp313-none-macosx_12_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f658e9be6b09fa81f21bc7dd15622a5540a46470cf4c02679716a49e74637286",
"md5": "794a097b97bb4e230cdb5d57977f48ea",
"sha256": "1d00cb1058cbe1bd5479b229496daecfc4a160760a222231455571b27819ce6c"
},
"downloads": -1,
"filename": "tbp_nightly-2.22.1a20251114-cp39-none-macosx_12_0_arm64.whl",
"has_sig": false,
"md5_digest": "794a097b97bb4e230cdb5d57977f48ea",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": "!=3.0.*,!=3.1.*,>=2.7",
"size": 5765,
"upload_time": "2025-11-14T10:22:49",
"upload_time_iso_8601": "2025-11-14T10:22:49.712218Z",
"url": "https://files.pythonhosted.org/packages/f6/58/e9be6b09fa81f21bc7dd15622a5540a46470cf4c02679716a49e74637286/tbp_nightly-2.22.1a20251114-cp39-none-macosx_12_0_arm64.whl",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-11-14 10:27:57",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "openxla",
"github_project": "xprof-nightly",
"github_not_found": true,
"lcname": "tbp-nightly"
}