环境搭建:conda 创建虚拟环境、Scanpy 及依赖库安装、GPU 支持

说起单细胞分析,很多人第一步就栽在了环境配置上。我刚开始接触 Scanpy 时,直接在 base 环境里装了一堆包,结果依赖冲突搞得我差点重装系统。后来学乖了——每次项目都新建一个干净的 conda 虚拟环境,省心太多。

这章我们就一步步把环境搭好。你跟着走,大概 10 分钟就能跑通。


1. conda 虚拟环境:隔离才是王道

虚拟环境说白了就是给你的项目造一个独立的小房间。里面装什么包都不会影响到其他房间。

为什么要用虚拟环境?
因为 Scanpy 依赖的 numpy、pandas、scipy 等版本很敏感。一个项目用 1.9,另一个用 1.12,冲突了你就头疼。

我个人习惯用 conda create 而不是 venv,因为 conda 能管理非 Python 的底层库(比如 HDF5、BLAS),省去不少编译烦恼。

先创建一个名为 scanpy_env 的环境,指定 Python 3.10:

conda create -n scanpy_env python=3.10 -y

-y 参数自动确认安装,省得你盯着屏幕按回车。创建好后激活:

conda activate scanpy_env

你可以在终端里看到 (scanpy_env) 前缀,表示你已经进到这个隔离空间了。

避坑指南
我曾经在 macOS 上用 conda 装完 Scanpy 后,一运行就报 libomp.dylib 找不到。后来发现是 conda 的 llvm-openmp 没装。
解决办法很简单:conda install -c conda-forge llvm-openmp。如果你遇到类似奇奇怪怪的动态库错误,先试试这条路。

2. 安装 Scanpy 及其核心依赖

激活环境后,用 conda-forge 渠道安装 Scanpy:

conda install -c conda-forge scanpy

conda-forge 是社区维护的频道,包更新快且兼容性好。我个人很少用 pip 装 Scanpy,因为 conda 会把底层库(比如 anndata、umap-learn)一块拉下来,减少版本不匹配的可能。

如果你需要额外工具,比如 leidenalg(社区检测)、harmony(批次校正),也可以一起装:

conda install -c conda-forge leidenalg harmony-pytorch

下面这张表格列出了 Scanpy 生态里的常用依赖,供你参考:

库名 用途 安装方式
scanpy 核心分析框架 conda-forge
anndata 数据容器(自动安装) 随 scanpy 安装
leidenalg Leiden 聚类算法 conda-forge
umap-learn 降维可视化 随 scanpy 安装
harmony-pytorch 批次效应校正 conda-forge
igraph / python-igraph 网络分析底层 conda-forge
小提示
如果你用 pip 安装,记得先升级 pip:pip install --upgrade pip。pip 和 conda 混用容易产生依赖冲突,建议尽量只用一种包管理器。我个人的做法是:能 conda 就 conda,conda 没有才 pip。

3. GPU 支持:让计算飞起来

Scanpy 本身不直接调用 GPU,但它的底层依赖(比如 numpy、scipy、umap)可以通过 CUDA 加速。你想想看,处理 10 万细胞的数据集,CPU 跑个降维可能要 5 分钟,GPU 可能 30 秒就搞定了。

要启用 GPU,你需要安装 cupy 或 rapids 生态。这里我推荐 cupy,因为它安装简单且兼容性好。

先确保你有 NVIDIA 显卡、驱动和 CUDA toolkit。查看 CUDA 版本:

nvidia-smi

输出的右上角会显示 CUDA Version。比如 12.4,那你就装对应版本的 cupy:

pip install cupy-cuda12x

如果你用 conda,也可以:

conda install -c conda-forge cupy

但我发现 conda 版 cupy 有时会链接到错误的 CUDA 库,所以更推荐 pip 指定版本。

注意
不是所有运算都能自动用 GPU。Scanpy 的 sc.pp.pca、sc.tl.umap 默认走 CPU。你需要手动把数据转为 cupy 数组,或者用 rapids-singlecell 这个包装库。后续章节我们会详细讲 GPU 加速的具体用法,这里先搭好环境。

4. 验证安装:跑个最小测试

装完别急着关终端。我们来写几行代码确认环境正常:

import scanpy as sc
print(sc.__version__)

# 如果装了 cupy,测试 GPU 可用
try:
    import cupy as cp
    a = cp.array([1, 2, 3])
    print("cupy 可用,设备:", cp.cuda.runtime.getDeviceProperties(0)['name'])
except ImportError:
    print("cupy 未安装,走 CPU 模式")

如果输出类似 1.10.4 和 cupy 可用,那恭喜你,环境通关了。

我个人习惯把这段验证代码写成一个 check_env.py,每次新环境都会跑一遍。省得做到一半才发现某个库缺了。


本章知识结构概览

下面是整个环境搭建的决策流程,我把它画成了 SVG。照着这张图走,基本不会漏东西:

Scanpy 环境搭建流程图 创建 conda 虚拟环境 conda create -n scanpy_env python=3.10 安装 Scanpy 及依赖 conda install -c conda-forge scanpy 需要 GPU 加速? 验证 Scanpy 基础功能 import scanpy; print(scanpy.__version__) 安装 cupy pip install cupy-cuda12x 验证完整环境 测试 scanpy + cupy 是否正常工作 环境准备完毕 🎉 💡 如果 cupy 安装失败,可以先跳过 GPU 支持,后续用 CPU 版本完成全部课程

常见问题 & 经验之谈

  • conda 安装慢? 换国内镜像源。比如清华源:conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
  • ImportError: No module named 'leiden' 老版本 Scanpy 用 python-igraph,新版用 leidenalg。如果你遇到,直接 conda install -c conda-forge leidenalg
  • CUDA 版本不对? 可以用 nvidia-smi 查看支持的最高版本,然后装对应 cupy。cupy-cuda11x 对应 11.x,cupy-cuda12x 对应 12.x
  • Python 版本怎么选? 我测试下来 Python 3.9-3.11 兼容性最好,3.12 有些包还不稳定。建议就用 3.10。
一句话总结
环境搭建的要点就三个:隔离(虚拟环境)、渠道(conda-forge)、验证(写个测试脚本)。搞定这三步,后面分析就顺了。