文章

Pixi

人生苦短,我用pixi...

Pixi

前言

前文见:conda你真的可以去死了

在写了三四个月的文档之后,又要做深度学习开发了,正受Conda困扰之时,被推荐了uv和pixi,稍作了解之后选择了pixi并决定用上一阵。就目前的体验来说,pixi开发非常符合一般现代项目的开发方式,conda/mamba基本就可以彻底扔一边了。

简介

Pixi是由prefix.dev开发的新一代跨平台、多语言软件包管理与工作流工具。其底层基于Rust编写的rattler库,并集成uv作为PyPI解析后端,旨在彻底解决Conda生态中解析缓慢、环境不可复现及跨语言依赖混乱的痛点。

下表对比了Python生态下常见的包管理方案。

工具定位依赖范围速度是否管 Python 版本可复现性典型场景
pip包安装器仅 Python 包官方标准、最小工具链
venv环境隔离无依赖管理轻量虚拟环境
conda环境+包管理Python + 非 Python科学计算、跨语言依赖
mambaconda 加速器同 condaconda 的性能替代
uvpip+venv+resolverPython 包极快现代 Python 开发
pixiconda-like多语言很强可复现实验/项目级环境
poetry项目级管理Python 包应用/库开发
pipenvpip+venvPython 包已逐渐弱化

Pixi 核心优势: 它在继承Conda强大的二进制分发(如CUDA、C++编译器)与跨语言管理能力的同时,引入了类似Cargo(Rust)和pnpm(Node.js)的现代工作流体验,通过极致的解析速度与严格的锁定机制,实现了“一次配置,全机房复现”的开发闭环。

基本概念

工作机制与本地化环境

Pixi采用以项目为中心的管理模式。运行pixi init后,它不再像传统Conda那样将环境存储在全局anaconda3/envs路径下,而是在项目根目录创建.pixi/隐藏文件夹。所有二进制文件、库和Python解释器均硬链接至此,确保环境与项目生命周期同步,且不同项目间物理隔离。

核心配置文件

Pixi的运行高度依赖以下两个文件:

  • pixi.toml(清单文件): 类似于package.json。用于声明项目元数据、支持的平台、Conda渠道优先级以及项目依赖(包括[dependencies][pypi-dependencies])。
  • pixi.lock(锁文件): 类似于yarn.lockpackage-lock.json。该文件由Pixi自动生成,详细记录了所有依赖包的精确版本、哈希值及下载地址。它是跨平台复现的核心,确保团队成员在不同机器上安装的内容完全一致。

任务系统(Tasks)

Pixi 内置了功能强大的跨平台Task Runner。在pixi.toml[tasks]部分,开发者可以定义复杂的命令流:

  • 跨平台兼容: Pixi提供内置Shell模拟器,使rm -rfexport等命令在Windows和Linux上表现一致。
  • 依赖链管理: 任务可以设置depends-on属性。例如,定义train任务依赖于preprocess,运行前者会自动先触发后者。
  • 缓存与增量: 支持根据文件变化(inputs/outputs)决定是否跳过已完成的任务,极大提升深度学习预处理效率。

体验和补充

整体体验

可以用pixi shell保持环境active(使用exitctrl+d退出)。或者使用task时,用pixi run {taskname}。这二者也不互斥,无论在不在shell环境都可以用同样的命令调用task。

Pixi几乎到处都是优势:极简的安装流程、卓越的多平台兼容性、毫秒级的依赖解析与并发下载速度。即便遭遇复杂的版本冲突,pixi也会提供详尽的冲突路径图辅助解决。在二进制文件的处理上,Windows这块难啃的骨头pixi处理得相对轻松,相对于体积庞大且难用的MSVC,Pixi允许在Windows上使用轻量的MinGW或Clang工具链。

总的来说,Pixi标志着Python环境管理进入了“声明式”时代,是深度学习项目实现工程化复现的最佳实践。

补充

项目迁移到pixi

从Pixi迁移回去就暂时不考虑了。

从Conda或Pip迁移至Pixi是深度学习开发中的常见需求。手动将数百行依赖填入配置文件不仅低效,更易导致解析冲突。Pixi提供了自动化导入机制来简化这一过程:

  • 导入 requirements.txt

执行指令:pixi import --format pypi-txt --environment default .\requirements.txt

该指令会强制Pixi将现有的Pip需求清单解析并转化为pixi.toml中的[pypi-dependencies]--format pypi-txt 明确了输入源格式,而--environment default则指定将这些依赖注入项目的默认运行环境。

  • 导入 environment.yml

针对Conda环境文件,可直接运行pixi import environment.yml。Pixi会自动映射已有的Conda渠道(Channels)和依赖列表,将其转换为Pixi 生的配置结构,避免了人工比对版本的麻烦。

配置

针对国内网络环境及深度学习特有的二进制包下载需求,可通过在pixi.toml 中配置[pypi-options]优化链路:

  • 加速基础 Python 包下载:

需求: 默认PyPI源在境内访问速度较慢,可以切换至清华等国内镜像源以加速下载。

配置: index-url = "https://pypi.tuna.tsinghua.edu.cn/simple"

  • 安装特定版本的 CUDA/PyTorch:

需求: 许多深度学习框架的特定版本(如CUDA 12.4编译版)并未发布在标准PyPI,需指定官方的Wheel仓库路径进行检索。

配置: extra-index-urls = ["https://download.pytorch.org/whl/cu124"](示例)

  • 解决多源依赖冲突:

需求: 当主源与额外源(Extra URLs)中存在同名不同版本的包(例如packaging)时,需要强制Pixi在所有源中搜寻并匹配最符合当前环境的版本,而非在找到第一个源后立即停止。

配置: index-strategy = "unsafe-best-match"

本文由作者按照 CC BY 4.0 进行授权