环境搭建: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。照着这张图走,基本不会漏东西:
常见问题 & 经验之谈
- 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)、验证(写个测试脚本)。搞定这三步,后面分析就顺了。