# New Release: Ultralytics v8.4.87

**URL:** <https://community.ultralytics.com/t/new-release-ultralytics-v8-4-87/2098>\
**Category:** Discussion\
**Tags:** ultralytics-official, releases, announcements\
**Created:** [July 4, 2026, 1:31pm UTC](https://community.ultralytics.com/t/new-release-ultralytics-v8-4-87/2098 "2026-07-04T13:31:57Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![glenn-jocher](https://sea1.discourse-cdn.com/flex001/user_avatar/community.ultralytics.com/glenn-jocher/32/83_2.png) [@glenn-jocher](https://community.ultralytics.com/u/glenn-jocher)\
**Post date:** [July 4, 2026, 1:31pm UTC](https://community.ultralytics.com/t/new-release-ultralytics-v8-4-87/2098/1 "2026-07-04T13:31:57Z")

</div>

## 🚀 Ultralytics v8.4.87 is Here!

Ultralytics v8.4.87 delivers a cleaner, safer GPU device-selection system, plus stability and performance improvements across training, inference, tracking, exports, and dataset checks. This release is especially helpful for users running Ultralytics YOLO in notebooks, services, CI, distributed training, production systems, and multi-GPU environments.

You can explore the full release on the [Ultralytics v8.4.87 GitHub release page](https://github.com/ultralytics/ultralytics/releases/tag/v8.4.87). 🎉

* * *

## 🌟 Quick Overview

This release focuses on:

- 🧭 More predictable CUDA device selection
- 🧪 Stronger nonzero-GPU training validation
- 🧹 Cleaner DataLoader worker shutdowns
- ⚡ Faster post-warmup inference paths
- 💾 More accurate dataset storage-speed warnings
- 🎯 Better ReID tracking device consistency
- 📦 More reliable export dependency and device handling

* * *

## 🧭 New Device Selection System

Ultralytics v8.4.87 introduces a clean-sheet CUDA device-selection flow designed to avoid surprising behavior in long-running Python processes.

Key updates include:

- Added `parse_device()` to normalize device inputs like `cuda:0`, `0,1`, lists, tuples, `torch.device`, and `-1` idle-GPU auto-selection.
- Updated `select_device()` so it no longer mutates `CUDA_VISIBLE_DEVICES`.
- Explicit single-GPU requests now use `torch.cuda.set_device()` instead of environment-variable remapping.
- Trainer, DDP setup, validation, autobatch, and distributed barriers now consistently use resolved CUDA device indices.
- Added documentation for `ultralytics.utils.torch_utils.parse_device`.

This work was introduced by [@glenn-jocher](https://github.com/glenn-jocher) in [PR #25021](https://github.com/ultralytics/ultralytics/pull/25021). 🙌

* * *

## 🧪 Stronger Multi-GPU Training Tests

This release adds a cold-process nonzero-GPU training test to better match real CLI and Ultralytics Platform training behavior.

The new test verifies that training on GPUs like `device=1` or higher works correctly from a fresh process, without relying on previous CUDA initialization.

This improvement was added by [@glenn-jocher](https://github.com/glenn-jocher) in [PR #25019](https://github.com/ultralytics/ultralytics/pull/25019). 🖥

* * *

## 🧹 Cleaner Training Shutdowns

Ultralytics v8.4.87 fixes noisy DataLoader worker shutdown behavior at the end of training.

Highlights:

- Added a `close()` method to `InfiniteDataLoader`.
- Training now explicitly shuts down persistent train and validation workers before Python exits.
- This helps prevent end-of-run `DataLoader worker ... killed by signal: Terminated` errors after results are already saved.

Thanks to [@Bovey0809](https://github.com/Bovey0809) for this fix in [PR #25024](https://github.com/ultralytics/ultralytics/pull/25024). ✅

* * *

## ⚡ Improved Inference Warmup

`AutoBackend.warmup()` now preloads `torchvision` for non-end-to-end models, helping standard NMS workflows use faster `torchvision` NMS when appropriate.

This can reduce first-inference latency after warmup and make detection pipelines feel smoother in production and interactive workflows.

Thanks to [@Y-T-G](https://github.com/Y-T-G) for the improvement in [PR #25023](https://github.com/ultralytics/ultralytics/pull/25023). 🚀

* * *

## 💾 More Accurate Dataset Speed Checks

This release fixes an inverted condition in `check_file_speeds()`.

Slow storage, including network-mounted datasets, should now trigger the intended warning instead of being incorrectly reported as “Fast image access ✅”.

Thanks to [@ahmet-f-gumustas](https://github.com/ahmet-f-gumustas) for the fix in [PR #25025](https://github.com/ultralytics/ultralytics/pull/25025). 📊

* * *

## 🎯 Tracking and ReID Device Alignment

Trackers now pass the predictor device into ReID encoders, so ReID models are initialized and run on the same device as prediction where applicable.

This improves consistency for tracking workflows, especially when working across CPU, CUDA, and multi-GPU configurations.

* * *

## 📦 Export Reliability Improvements

v8.4.87 also improves export behavior across several backends:

- TensorFlow SavedModel export now distinguishes CUDA and non-CUDA export paths more carefully.
- CPU exports hide TensorFlow GPUs where possible to avoid unnecessary GPU memory use.
- ONNX Runtime and Paddle dependency checks now better handle interchangeable CPU/GPU package variants.
- Paddle export now uses the actual export device to decide whether GPU Paddle is needed.

These changes reduce the chance of unwanted GPU memory allocation or conflicting runtime package installs during export.

* * *

## 🔄 Full Changelog

You can review every commit and change between versions in the [full v8.4.86 to v8.4.87 changelog](https://github.com/ultralytics/ultralytics/compare/v8.4.86...v8.4.87).

* * *

## 🚀 Try It Now

Upgrade with:

```bash
pip install -U ultralytics

```

Then run your usual training, validation, prediction, tracking, or export workflows and let us know how it goes.

As always, thank you to the YOLO community and the Ultralytics team for the continued testing, feedback, and contributions that make each release better. We’d love to hear your feedback on v8.4.87! 💬
