Conda

什么是 Conda?

Conda 是一个开源的包管理系统和环境管理系统,换句话说,conda 可以创建独立的环境,在环境中安装不一样的 packages,用来完成不一样的项目,并且在这个过程中避免环境冲突

  • 包管理:类似于 pip 或 npm,负责安装库
  • 环境管理:类似于 .venv,但权限更高。它不仅能隔离 Python 库,还能隔离 Python 解释器本身 以及 系统级依赖(如 CUDA, C++ 编译器)

Anaconda & Miniconda

  • Anaconda:安装包很大(数 GB),自带了可能永远用不到的科学计算包
  • Miniconda:最简版本,只包含 Conda 和 Python

Conda Vs. .venv :

特性 .venv Conda
隔离深度 仅限 Python 库 Python 版本 + 库 + 二进制依赖 (CUDA/C++)
安装位置 项目文件夹内 (.venv/) 集中存放于 ~/miniconda3/envs/
包来源 仅限 PyPI (pip) Conda Channels (conda-forge, nvidia, pytorch)
跨平台性 依赖系统已安装的 Python 自带解释器,跨平台一致性极强
  • 隔离深度:库 Vs. 系统
    • .venv:不同 .venv 共享同一个 Python 解释器。如果一个项目要 Python 3.8,另一个要 3.12,.venv 解决不了这个问题
    • Conda:Python 版本、CUDA 驱动(跑 AI 必备)、底层 C 语言库都是按需定制的
  • 安装位置:分散 Vs. 集中
    • .venv:它是“项目导向”的。每个项目下面都有一个,你一眼就能看到。好处是清理方便,删掉项目就删掉了环境
    • Conda:它是“管理导向”的。每一个 conda 环境都整齐地排在系统的某个角落,你可以在任何文件夹下通过命令运行某个环境
  • 包来源:源码 Vs. 二进制成品
    • pip (PyPI):大部分时候给你的是源码,你的电脑得负责把它们组装起来。如果你的 C++ 编译器没配好,安装就会报错
    • Conda (Channels):很多时候给你的是“成品”(预编译二进制文件)。别人已经在服务器上帮你组装并测试好了,你直接下载下来就能跑
  • 依赖系统 Vs. 自给自足
    • .venv:它是寄生在系统 Python 上的,系统 Python 坏了,它也跑不动
    • Conda:它是自给自足的,它会下载完整的 Python 解释器放在环境里

Conda 常用命令

A. 环境创建与切换

1
2
3
4
5
6
7
8
# 创建一个名为 research 的环境,并指定 Python 版本(这在 .venv 里很难做到),-n代表 --name
conda create -n research python=3.10

# 激活环境
conda activate research

# 退出当前环境
conda deactivate

B. 安装包

Conda 会自动解决复杂的二进制依赖

1
2
3
4
5
# 安装 pytorch,并指定从 pytorch 和 nvidia 的渠道获取,自动配置 CUDA,渠道(Channel)是 Conda 寻找软件包的服务器地址。-c 是 --channel 的缩写
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia

# 如果 conda 找不到某个包,依然可以用 pip(在已激活的环境内)
pip install smplx
  • -c pytorch: 指定从 PyTorch 官方渠道下载
  • -c nvidia: 指定从 NVIDIA 官方渠道下载 CUDA 相关的依赖项

C. 查看与清理

1
2
3
4
5
6
7
8
# 列出所有已创建的环境
conda env list

# 删除某个不再需要的环境
conda env remove -n old_project

# 重命名某个环境 oldname->newname
conda rename -n oldname newname

环境的可移植性 (Environment YAML)

要复现实验时,你不能把整个环境发过去。你需要一个“配方”

  • 导出配方:
1
conda env export > environment.yml
  • 根据配方重建:
1
2
conda env create -f environment.yml
# -f 是 --file 的缩写,用于指定一个环境定义文件(通常是 .yml 或 .yaml 格式)。Conda 会读取该文件中的配置信息,自动完成环境的创建

补充:pip & conda channel

理解“包来源”(Package Sources)的区别,本质上是理解“这些代码是谁在维护”以及“它们被存储在哪里”

1. PyPI (pip 的唯一官方仓库)

PyPI (Python Package Index) 是 Python 官方唯一的“大仓库”

  • 逻辑:它是全球统一的。如果你写了一个 Python 库并想让全世界使用,你必须把它上传到 PyPI
  • 工作方式:当你执行 pip install xxxx 时,pip 会直接去 PyPI 这一个地方寻找并下载
  • 局限性:PyPI 里的包通常只包含 Python 代码。如果你的库需要调用复杂的底层 C++ 编译器,或者是特定的显卡驱动(比如做机器人仿真需要的 CUDA),PyPI 往往很难处理这些非 Python 的依赖项

2. Conda Channels (Conda 的“频道/专柜”)

Conda 的逻辑完全不同。它允许存在多个不同的独立仓库,这些仓库就叫 Channels(频道)

你可以把 Conda 想象成一个巨大的商场,里面分布着不同的“专柜”:

  • Defaults 频道:这是 Anaconda 公司官方维护的柜台。它的特点是包经过严格测试,非常稳定,但缺点是更新速度较慢,包的数量有限
  • conda-forge 频道 (社区柜台):这是科研人员最常用的频道。它是由全球开发者社区共同维护的“公共柜台”。它的特点是包最全、更新极快。如果你发现一个科研工具在默认频道找不到,去 conda-forge 一定有
  • nvidia / pytorch / fastai (厂商专柜):
    • nvidia 频道:专门提供针对显卡优化的底层驱动和工具(如 CUDA、cuDNN)
    • pytorch 频道:由 PyTorch 官方维护,专门提供已经配置好、可以直接运行的深度学习框架

3. 为什么我们要区分不同的“频道”?

conda install pytorch -c pytorch -c nvidia

这里的 -c 就是 Channel 的缩写。这句话的逻辑是:

“我要安装 pytorch,请优先去 pytorch 官方专柜和 nvidia 官方专柜找;如果这两个地方都没有,再去默认柜台找。”

这样做有三个核心好处:

  1. 版本更精准:直接从厂商(如 Nvidia)的频道下载,能确保你拿到的包是针对你的硬件(GPU)优化过的
  2. 解决依赖问题:Conda 频道里的包通常是预编译好的二进制文件。在 PyPI 里,安装复杂的库可能需要在本地配置 C++ 环境,但在 Conda 频道里,别人已经帮你编译好了,下载即用
  3. 优先级控制:你可以设置 Conda 优先从 conda-forge 找东西,这样能保证你的整个开发环境所用的库版本是最新的
特性 PyPI (pip) Conda Channels
数量 全球只有一个中心仓库 拥有多个独立的频道(专柜)
内容 主要是 Python 源码 预编译好的二进制文件(含 Python 和非 Python 依赖)
维护者 个人开发者直接上传 社区 (conda-forge) 或 硬件厂商 (Nvidia/Pytorch)
优势 包的数量全球最多 极其擅长处理复杂的 AI 和工程依赖