I'm looking to modernize my Python workflow. For years I've used venv with pip, or Conda when I needed stronger environment separation and non-Python dependencies. My current Linux setup includes mise, but I'm not very familiar with newer Python tooling.
I want a solution that can explicitly control environments and dependencies while handling JAX, PyTorch, and TensorFlow with CUDA support. Ideally, I would not have to manually install or troubleshoot CUDA packages again. Pip's current JAX CUDA extras have worked surprisingly well for me, whereas NVIDIA's installer scripts have caused plenty of problems in the past.
Should I invest time in uv or mise, or is it safer to stick with the pip-based workflows still recommended by many machine-learning projects? Would Pixi be a better choice if I need the broader Conda ecosystem?
5 Answers
Poetry and Conda are still usable, but the general advice from the discussion is that uv has become the strongest modern default for PyPI-based Python work. If your existing pip commands already install the correct CUDA-enabled JAX, PyTorch, or TensorFlow builds, moving to uv should not require changing the underlying package source—just the environment and dependency workflow.
You do not necessarily have to choose one tool for everything. One workable pattern is uv for ordinary Python projects and throwaway environments, with Pixi for projects that need CUDA-related packages, compilers, or other Conda-Forge dependencies. The NVIDIA driver itself is still a system-level requirement, though; no Python environment manager can completely replace installing a compatible driver for the hardware.
For a mostly Python project, uv is probably the best default today. It is a fast standalone binary, can create virtual environments without relying on an existing Python installation, supports a pip-compatible interface, and can generate lockfiles for reproducible installs. It also works well for temporary environments and containers. The major ML packages’ pip instructions, including CUDA-enabled extras, should generally work through uv as well.
A practical setup is to use mise for managing language and tool versions, then uv inside each Python project. Mise is more of a general version manager, not a replacement for a Python dependency manager. This keeps the responsibilities separate and gives you uv’s lockfiles, dependency resolution, and simple virtual-environment workflow.
Use Pixi if you specifically need the Conda ecosystem or compiled, non-Python dependencies such as compilers and other system tools. It combines Conda-Forge packages with Python packages and has useful environment and task-management features. For CUDA-heavy ML setups, several teams prefer Pixi because it can manage more of the user-space dependency stack than a plain PyPI environment.

That is the main distinction: uv is ideal when PyPI is enough, while Pixi is the better fit when you need Conda-Forge packages or broader environment tooling.