做Python开发这几年,我最大的感触是:写代码的时间经常没有装库的时间多。尤其是刚接触 OpenCV、PyTorch、transformers 这批库的朋友,几乎每天都要跟“ModuleNotFoundError”做斗争。今天想把这些年帮人“载入”各种Python库的经验梳理一遍,从环境准备到OpenCV、从PyTorch版本对应到transformers的模型缓存,再到指标库和部署工具,一次性把该装的库和该避的坑都聊清楚。无论你是刚开始学Python的新手,还是准备在RK3588这类边缘设备上跑YOLOv8的部署工程师,这套思路应该能用得上。
1. 载入库之前,先把Python环境这栋楼打好地基
很多朋友装库第一步就是pip install xxx,结果过两天发现项目跑不起来了:OpenCV要用numpy 1.x,PyTorch要numpy 2.x,两个库一装完,整个环境直接报废。这种问题我见了太多,根子不在某个库身上,而是从一开始就没有把环境隔离开。
1.1 虚拟环境为什么是装库的“护身符”
Python的包管理有一个天然缺陷:默认情况下所有库都装进同一个全局目录。假设你有一个老项目依赖numpy==1.21,另一个新项目需要numpy>=1.24,这两个版本在一个环境里会互相踩踏。你以为是PyTorch坏了,其实可能是numpy被OpenCV悄悄升级了。
虚拟环境就是给每个项目单独开一个“小房间”,房间里的包互不干扰。我建议所有项目、所有教程、所有实验,一律先用虚拟环境隔离。常用的方案有三种,区别如下:
| 工具 | 特点 | 适合场景 |
|---|---|---|
| venv | Python自带的轻量级方案,装完即用 | 普通项目、脚本开发 |
| conda | 可以管理不同Python版本,还能装非Python依赖 | 数据科学、需要特定Python版本 |
| uv | 新一代包管理器,安装速度快到夸张 | 喜欢尝鲜、追求效率 |
如果你是新手,我建议直接用venv,零额外安装成本。进入项目目录后执行:
python -m venv .venv # Windows .venv\Scripts\activate # Linux / macOS source .venv/bin/activate看到命令行前面出现(.venv)就算成功。之后的pip install全部都作用在这个虚拟环境里,不会污染系统Python,也不会被其他项目干扰。这个习惯养成了,接下来装任何库都会少一大半麻烦。
1.2 Python版本选择与工具链
选Python版本这件事,很多人的直觉是“越新越好”,但在装库这件事上并不成立。比如某些旧版本的CUDA工具链不支持最新Python,某些编译型库也还没来得及出对应3.13的wheel。我的建议是:普通项目用Python 3.10或3.11,兼容性最稳。PyTorch 2.x、transformers、OpenCV都能在这两个版本上稳定运行。
如果你需要同时维护多个不同Python版本的机器,conda比较合适,它能像切菜一样切换Python版本:
conda create -n myproject python=3.11 conda activate myprojectvenv不能帮你切换Python版本,只能用当前系统自带的Python。所以遇到“这个项目需要3.8,那个项目需要3.12”的情况,直接上conda,省心很多。
另外,最近很火的uv也值得一试。它内部做了并行下载和全局缓存,装库速度比pip快一个量级。用uv创建虚拟环境:
uv venv .venv uv pip install opencv-python transformers它兼容pip的用法,但速度更快。适合那些每天要新建环境、反复装同一批库的部署工程师。
1.3 先把pip调教好
pip默认从官方PyPI下载包,某些环境里速度非常感人。我习惯先在全局配置文件里设置一个国内镜像源,这一步能让你后续所有安装都快到起飞。以清华源为例:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple设置完后,装库的时候下载速度会有肉眼可见的提升。注意,这只是把下载源换成国内镜像,不会改变库本身的版本和依赖逻辑,非常安全。
另外,装库前先把pip本身升级到最新版:
python -m pip install --upgrade pip有时旧版pip在解析依赖、处理wheel时会出一些莫名其妙的问题,升级之后直接消失。
2. OpenCV:从报错到出图的完整安装姿势
OpenCV大概是Python世界里“报错率”最高的库之一。ModuleNotFoundError: No module named 'cv2'这个错误,几乎每天都能在群里看到。可OpenCV本身的安装其实非常简单,大部分报错都源于装错了包或装错了环境。
2.1 选对安装包:opencv-python 还是 opencv-contrib-python
OpenCV在PyPI上有好几个发行包,最常见的两个是:
opencv-python:基础版,含核心模块和标准算法,体积小。opencv-contrib-python:基础版加扩展模块,包含SIFT、ORB、细化、骨架提取等很多实用算法。
我个人的建议是:别犹豫,直接装opencv-contrib-python。原因很简单,扩展模块里有很多日常要用的功能,比如cv2.xphoto、cv2.ximgproc,还有图像处理里经常用到的边缘检测、直线检测增强算法。装基础版之后再想用这些,还得重新装一个contrib包,反而容易撞车。
安装命令只有一行:
pip install opencv-contrib-python装完验证一下:
import cv2 print(cv2.__version__)如果能打印出版本号,说明OpenCV已经可以正常使用了。这是一个很基础但很有效的“载入”验证方法。
这里有个特别容易踩的坑:有同学在网络教程里看到pip install opencv,就去装了一个叫opencv的包。这个包跟OpenCV没有关系,import cv2时依然会报模块不存在。记住,PyPI上的正确包名是opencv-python或opencv-contrib-python,import时统一写cv2。
2.2 “No module named 'cv2'”高频翻车现场
这个报错出现时,先别急着重装,按顺序排查:
- 确认当前环境。终端里执行
which python(Windows用where python),看是不是你项目的虚拟环境。很多人以为激活了环境,实际上还是在全局环境里操作,包装到了别处。 - 确认包名。
pip list | grep cv2(Windows用pip list | findstr cv2),看看有没有opencv-python或opencv-contrib-python。如果你看到的是opencv,那很可能是装错包了。 - 确认是Jupyter还是终端。Jupyter Notebook默认用的是启动时选择的kernel,如果你在终端激活了虚拟环境,但Notebook还是另一个kernel,import就会找不到新装的包。解决办法是在Notebook里手动指定你刚激活的环境kernel,或者退出Notebook重新启动。
排查完这三步,绝大多数No module named 'cv2'都能解决。这其实不是一个安装问题,而是一个环境管理问题。
2.3 服务器部署场景请用 headless 版
如果你是在云服务器、Docker容器或RK3588这样的嵌入式设备上跑OpenCV,绝大多数时候你没有显示器,用不上GUI功能。这时建议不要装opencv-contrib-python,而是装:
pip install opencv-contrib-python-headlessheadless版去掉了Qt、HighGUI等图形界面相关依赖,体积更小,在无桌面环境下不会因为试图初始化GUI而报错。训练后台跑图像处理时,用这个版本会比标准版稳很多。
我自己在实际项目中是这样区分的:本地调试、想看图像效果,用常规版;线上推理、嵌入式部署,用headless版。千万不要在一个环境里同时装这两个包,否则OpenCV的底层库会冲突,轻则报错重则崩溃。
如果你确实需要自己编译OpenCV,比如要给特定板卡开启硬件加速,那就需要走cmake流程。大概步骤是:先安装依赖库,然后cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..,再make -j$(nproc),最后make install。这个过程比较长,而且如果某个依赖没装好,编译会直接失败。绝大多数场景下,官方wheel已经够用,不需要自己造轮子。
3. PyTorch:一张版本对照表解决90%的安装问题
PyTorch的安装比OpenCV复杂,主要复杂在“版本对应关系”上:Python版本、CUDA版本、torch版本、torchvision版本、torchaudio版本,五项要对应上才不闹脾气。我见过太多人直接pip install torch,装出来的可能是CPU版,也可能和当前驱动不匹配,训练时提示“CUDA not available”。
3.1 先分清CPU版和GPU版
在装PyTorch之前,先问自己一个问题:这台机器有没有NVIDIA显卡?我用不用GPU训练?
- 如果不用GPU,或者是Mac、AMD显卡且不想折腾,那就装CPU版,安装命令最简单。
- 如果要GPU加速,就必须保证:NVIDIA显卡 + 正确的驱动 + 匹配的CUDA运行时。
查看显卡驱动支持的最高CUDA版本,终端执行:
nvidia-smi右上角显示的CUDA Version: 12.4是指你的驱动最高支持到CUDA 12.4,而不是说你已经装了CUDA 12.4。PyTorch安装时只要选择不高于这个数字的CUDA版本即可。
比如你的驱动支持CUDA 12.4,就可以安装cu121或cu124版本的PyTorch。如果驱动只支持到CUDA 11.8,那就别装cu121,否则运行时会报错。
Mac用户不用太纠结,直接装CPU版,M系列芯片可以考虑用MPS后端加速,只需要检查:
import torch print(torch.backends.mps.is_available())能打印True就能用GPU加速。MPS虽然不是每个算子都支持,但跑常规深度模型够用。
3.2 CUDA版本选择与安装命令
最靠谱的方式是访问PyTorch官网的Get Started页,选择你的系统、工具链、CUDA版本,它会生成一条官方安装命令。以常见的CUDA 12.1为例:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121这样安装下来,torch、torchvision、torchaudio三个库的版本是互相匹配的,不容易出现“torchvision和torch版本不兼容”的经典问题。
网上很多教程让人直接pip install torch,从PyPI拉包。这个做法不是不行,但PyPI上的默认wheel有时候是CPU版,有时候是CUDA版,存在不确定性。如果你想自己控制GPU版本,还是用官网命令更稳。
装完GPU版之后,必须做一件事:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果三行分别输出版本号、True、显卡型号名称,说明GPU版本安装成功。如果torch.cuda.is_available()是False,大概率是驱动太旧或者CUDA版本和驱动不匹配,先回到nvidia-smi看驱动支持上限。
3.3 Python和PyTorch版本对应关系
PyTorch对Python版本有明确要求,版本太新可能还没有对应的预编译wheel。以PyTorch 2.x为例,官方支持Python 3.8到3.12,但并不是每个小版本都全平台覆盖。为了减少麻烦,我建议:
- 用Python 3.10或3.11跑PyTorch 2.x,这是最稳妥的组合。
- 新项目别急着上Python 3.13,等PyTorch官方明确支持了再说。
PyTorch 2.x主版本和配套库的对应关系大致如下:
| 主版本 | torchvision | torchaudio | 常见CUDA |
|---|---|---|---|
| 2.0.x | 0.15.x | 2.0.x | cu117 / cu118 |
| 2.1.x | 0.16.x | 2.1.x | cu118 / cu121 |
| 2.2.x | 0.17.x | 2.2.x | cu118 / cu121 / cu122 |
| 2.3.x | 0.18.x | 2.3.x | cu118 / cu121 / cu124 |
如果你手动单独pip install torch==2.2.0,然后又单独装了最新版torchvision,很可能爆出类似unexpected version mismatch的错误。所以要么用官网命令一次性安装,要么指定完整版本号:
pip install torch==2.2.0 torchvision==0.17.0 torchaudio==2.2.0 --index-url https://download.pytorch.org/whl/cu1213.4 WSL、AMD显卡与边缘设备上的PyTorch
热词里反复提到WSL和7900XTX,我就多聊两句。
在Windows Subsystem for Linux(WSL)里装PyTorch,大坑在于驱动:WSL使用的是Windows侧安装的NVIDIA驱动,Linux子系统内部不需要重装驱动。所以你在WSL里执行nvidia-smi能看到显卡信息,但不要在WSL里再去装一个Linux专用驱动,多装反而会覆盖掉正确的直通设置。正确做法是:Windows侧装好NVIDIA驱动,WSL侧直接按--index-url https://download.pytorch.org/whl/cu121安装对应CUDA版本即可。
AMD显卡用户在这件事上要难一些。AMD主推ROCm,但ROCm对具体显卡型号的支持列表时不时变化。如果你的7900XTX入了支持列表,可以安装ROCm版PyTorch;如果没入列表,强行安装基本无解。想确认自己的显卡在不在支持范围,去ROCm官方文档查一下,比在群里问三天更靠谱。实在不支持,老老实实用CPU版跑小模型。
至于RK3588这类边缘板卡,日常工作流一般不是直接在上面跑PyTorch,而是把训练好的YOLOv8模型导出成ONNX,再用RKNN工具链转换成板卡能跑的格式。PKG依赖折腾下来比较费神,但这个话题我放到后面的部署章节统一说。
4. transformers:不止是pip install,还要搞定模型下载与缓存
transformers库是Hugging Face生态的核心,它本身是一个模型加载和推理框架,支持BERT、ViT、GPT、Llama等大量架构。安装这个库本身不难,难的其实是后面的模型下载和离线加载。
4.1 安装transformers前先装好“地基”
transformers不是一个独立库,它需要有一个深度学习框架来执行真正的计算,最常见的就是PyTorch或TensorFlow。所以我的安装顺序是:
- 先装好PyTorch(按上一节的方法搞定GPU版或CPU版)。
- 再装transformers和配套工具:
pip install transformers datasets这样会自动把tokenizers、safetensors、huggingface-hub这些基础依赖带上。datasets是处理数据集的库,做NLP和图像任务经常会用到,建议一起装。
如果你明确要用PyTorch后端,也可以一次性指定:
pip install "transformers[torch]"它会把torch相关依赖一起解析好,不过还是建议前面先手动装好PyTorch,这样版本可控。
4.2 第一次加载模型,90%的人会卡在下载
transformers的默认行为是从Hugging Face Hub在线下载模型文件,下载的模型缓存到本地目录。第一次加载时如果网络不稳定或者没法直连下载源,就会卡住报错。
我的建议分两步走:第一,提前用工具把模型下载到本地;第二,加载时指定本地路径。
先下载模型,用snapshot_download最省心:
pip install huggingface_hub huggingface-cli download bert-base-uncased --local-dir ./models/bert-base-uncased这条命令会把指定模型仓库里的所有文件同步到本地目录。国内环境如果访问很慢,可以设置镜像环境变量,比如:
export HF_ENDPOINT=https://hf-mirror.com这个操作只是换了一个下载源,不影响模型权重内容,属于常规加速手段。下载完成后,加载模型时直接指路:
from transformers import AutoModel, AutoTokenizer model_name = "./models/bert-base-uncased" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModel.from_pretrained(model_name)这样整个加载过程完全离线,速度极快,也不受网络波动影响。换到离线服务器上部署时,只要把整个模型目录拷过去,再用同样的路径加载就行。
transformers的缓存默认在~/.cache/huggingface/hub。如果你希望缓存放别处,可以设置环境变量HF_HOME=/path/to/cache。这个对于“给系统盘省空间”很重要,模型动不动好几个GB,堆在C盘谁都受不了。
4.3 以ViT为例跑通一个图像识别
热词里有句话很有代表性:An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale,这是ViT论文的标题。transformers库对ViT的支持很完整,用起来比想象中简单:
from transformers import AutoImageProcessor, AutoModelForImageClassification processor = AutoImageProcessor.from_pretrained("google/vit-base-patch16-224") model = AutoModelForImageClassification.from_pretrained("google/vit-base-patch16-224")加载完之后,给一张图片就能推理。第一次同样会下载模型,建议先用上一节的方法下到本地再加载。ViT在图像分类任务上效果不错,尤其是迁移学习之后表现很稳。
如果你想先快速体验一下,不用写这么多代码,用pipeline一行就行:
from transformers import pipeline classifier = pipeline("image-classification", model="google/vit-base-patch16-224") print(classifier("cat.jpg"))pipeline会把预处理、推理、后处理全部封装好,适合做功能验证。真正上了生产环境,我一般还是用Auto类组件拆开写,能更精确地控制预处理细节。
4.4 “import json, torch from datasets”这类代码为什么跑不了
热词里有一段看起来不太完整的代码片段,大概长这样:import json, torch from datasets import dataset from transformers import ...。这种写法其实是个很典型的初学者错误:Python的import语法是不能这样混用的。
正确的写法应该是分开写:
import json import torch from datasets import Dataset from transformers import AutoModelForSequenceClassificationimport json, torch是一行导入多个模块的语法,但后面不能再跟from ... import ...。这种错误没有任何库的问题,纯粹是语法的组织方式不对。装再多库,这类代码也没法跑。看到这类报错时,先检查一下import语句是不是分行了。
5.1 指标库:torchmetrics与sklearn.metrics怎么选
“指标”这个概念在标题里占了一席之地,但很多教程最后都不讲。训练一个模型,不能只看loss,还得关注准确率、精确率、召回率、F1、mAP这些评估指标。Python生态里最常用的两套指标库:
sklearn.metrics:来自scikit-learn,适合传统机器学习和快速验证。torchmetrics:专门为PyTorch设计,支持在GPU上计算,能自动处理batch和设备迁移。
我的选择标准很简单:如果你在纯PyTorch训练pipeline里,用torchmetrics,因为它不需要在训练循环里手动把tensor转成numpy再算指标,省心很多。装起来也很轻:
pip install torchmetrics示例用法:
import torchmetrics accuracy = torchmetrics.Accuracy(task="multiclass", num_classes=10) # 在每个batch结束后: accuracy.update(preds, target) # 一个epoch结束后: print(accuracy.compute())torchmetrics还包含mAP、PSNR、SSIM、BLEU等各类指标,覆盖图像分类、目标检测、图像生成、NLP生成等多个方向。比手写指标类优雅得多,也避免了一个batch一个batch累计计算时出现的精度问题。
如果你只是在做个简单的实验,不想引入额外依赖,也可以用sklearn.metrics:
from sklearn.metrics import accuracy_score, f1_score但要注意,sklearn.metrics通常要求numpy数组,在PyTorch训练循环里还得先.cpu().numpy(),稍微绕路。数据量大时还会带来CPU与GPU之间的数据拷贝。所以认真跑深度学习,直接上torchmetrics就对了。
5.2 部署库:从ONNX Runtime到TorchServe
模型训练完成之后,下一步就是部署。严格来说部署不只是一个库的事,但最基础的一步确实是“把必要的运行时库装好”。最简单的路径是导出ONNX并用ONNX Runtime推理:
pip install onnx onnxruntime如果机器有NVIDIA显卡,可以换onnxruntime-gpu,它会利用TensorRT、CUDA等后端做加速。要注意onnxruntime和onnxruntime-gpu不能同时装,装之前先卸载另一个。
PyTorch模型的导出并不复杂:
model.eval() dummy_input = torch.randn(1, 3, 224, 224) torch.onnx.export(model, dummy_input, "model.onnx", input_names=["input"], output_names=["output"])导出后用ONNX Runtime加载推理:
import onnxruntime as ort sess = ort.InferenceSession("model.onnx") outputs = sess.run(None, {"input": image_array})这种方案的优点是跨框架、跨设备,同一个ONNX文件在服务器、边缘板卡、手机上都能跑。另一个选择是TorchServe,它是PyTorch官方的模型服务框架,能管理多模型、多版本,提供HTTP推理接口。安装命令:
pip install torchserve torch-model-archiverTorchServe依赖Java,装之前要确保系统里有Java 11。第一次启动时还要做目录初始化,比ONNX Runtime那套要重一些,适合正式生产环境。
5.3 边缘设备部署YOLOv8时的装库清单
热词里有“rk3588部署yolov8”,这确实是很多人关心的事。RK3588是瑞芯微的SoC,自带NPU,适合跑YOLOv8这类目标检测模型。但在这类板卡上装Python库,逻辑和x86服务器不太一样。
常规流程是:
- 先在x86机器上把YOLOv8模型训练好,导出成ONNX。
- 在板卡上安装RKNN工具链,把ONNX转成RKNN格式。
- 用RKNN Runtime加载推理。
装库时重点检查这几项:
pip install opencv-python-headless pip install onnxruntime pip install rknn-toolkit2注意,RK3588上的OpenCV推荐装headless版本,因为这块板子大多数时候是纯推理,不需要显示窗口。标准版opencv-python在无桌面系统上会尝试初始化GUI,反而引发奇怪的错误。
还有一个容易踩的坑:不要为了“最新版”而盲目升级库。在嵌入式板卡上,很多预编译wheel的版本都是固化的,升级opencv或numpy可能导致RKNN Runtime加载失败。板卡环境保持“能用就不动”原则,每次安装前先用pip freeze看一下现有版本。
另外,如果你的板卡必须用特定版本的Python(比如Python 3.10或3.11),先确认RKNN工具链是否支持这个Python版本。有些工具链只支持3.8,这时候用conda单独建一个Python 3.8环境会省下无数个熬夜debug的晚上。
我自己在部署类项目里现在固定用一套“三板斧”:先导出ONNX,再用ONNX Runtime在主机上验证输出,最后再转换到板卡格式。每一步都确认数值一致后再往下一环走,能最大程度减少“Python库装好但模型推理结果不对”的诡异问题。
装库这件事,说到底是环境管理和版本匹配的学问。我踩过不少次坑之后,现在的固定习惯是:新建项目先建虚拟环境,再装基础依赖,紧接着按“框架库、模型库、指标库、部署库”的顺序逐步安装,每装一个就顺手验证一下 import 和版本号。看似多花了两分钟,实际上能帮你少走好几个小时的弯路。希望这一篇把 OpenCV、PyTorch、transformers、指标和部署这几条线都串起来的经验,能让你也少踩几个坑。