【Bug已解决】Unable to import pytorch_lightning on google colab 解决方案问题描述在 Google Colab 中使用 PyTorch Lightning 时许多开发者会遇到无法导入pytorch_lightning模块的问题。常见的错误信息包括ModuleNotFoundError: No module named pytorch_lightning或者安装后导入时出现版本冲突ImportError: cannot import name X from pytorch_lightning又或者安装了包但导入的是旧版本/不兼容版本AttributeError: module pytorch_lightning has no attribute Trainer这些问题通常源于 Google Colab 的预装环境与 PyTorch Lightning 版本之间的不兼容、包名变更pytorch_lightning→lightning、CUDA 版本冲突等多种原因。本文将系统分析这些问题的根因并提供完整的解决方案。错误复现错误 1模块未安装# 在 Google Colab 中直接导入 import pytorch_lightning as pl # ModuleNotFoundError: No module named pytorch_lightning错误 2版本不兼容# 安装后导入但 API 不兼容 !pip install pytorch-lightning import pytorch_lightning as pl # 使用新版本 API 但安装的是旧版本 model pl.LightningModule() # AttributeError 或 TypeError trainer pl.Trainer(gpus1) # 旧版参数新版已改为 acceleratorgpu错误 3包名变更导致的混淆# PyTorch Lightning 2.0 迁移到 lightning 包 !pip install lightning import lightning as L # 新包名 # 但很多教程仍使用旧包名 import pytorch_lightning as pl # 可能导入的是旧版本或不存在错误 4依赖冲突导致安装失败!pip install pytorch-lightning # ERROR: pytorch-lightning 2.0.x has requirement torch1.13, but you have torch 1.12 # 或者 # ERROR: lightning-utilities 0.x has requirement packaging20.0, but you have packaging 19.x根因分析1. Google Colab 的预装环境Google Colab 预装了 PyTorch但不一定预装 PyTorch Lightning。即使预装了版本也可能不是最新的。Colab 的环境会定期更新但用户代码可能依赖特定版本。2. 包名迁移从 PyTorch Lightning 2.0 开始官方将包名从pytorch_lightning迁移到lightning。虽然pytorch_lightning仍然可以作为别名导入但两个包的安装可能导致冲突pip install pytorch-lightning安装旧版独立包pip install lightning安装新的统一包包含lightning.pytorch和lightning.fabric3. PyTorch 版本兼容性PyTorch Lightning 各版本对 PyTorch 版本有最低要求PyTorch Lightning 版本最低 PyTorch 版本1.x1.72.0.x1.132.1.x2.02.2.x2.1如果 Colab 预装的 PyTorch 版本过低安装新版 Lightning 会失败或运行时出错。4. 依赖循环冲突PyTorch Lightning 依赖lightning-utilities、torchmetrics、pytorch-lightning等包这些包之间可能存在版本约束冲突特别是在 Colab 已有预装包的情况下。解决方案方案一标准安装推荐# 在 Colab cell 中执行 !pip install pytorch-lightning -q # 验证安装 import pytorch_lightning as pl print(pl.__version__)方案二指定版本安装# 安装特定版本以确保兼容性 !pip install pytorch-lightning2.1.4 -q # 或者安装最新版 !pip install pytorch-lightning --upgrade -q方案三使用新的 lightning 包# 安装统一的 lightning 包 !pip install lightning -q # 导入方式 import lightning as L # 或使用子模块路径 from lightning.pytorch import LightningModule, Trainer方案四强制重装解决冲突# 先卸载所有相关包 !pip uninstall pytorch-lightning lightning lightning-utilities torchmetrics -y # 清理后重新安装 !pip install pytorch-lightning -q # 验证 import pytorch_lightning as pl print(fPyTorch Lightning version: {pl.__version__}) import torch print(fPyTorch version: {torch.__version__}) print(fCUDA available: {torch.cuda.is_available()})方案五同时升级 PyTorch 和 Lightning# 一次性升级所有相关包 !pip install torch torchvision torchaudio --upgrade -q !pip install pytorch-lightning --upgrade -q # 验证版本兼容性 import torch import pytorch_lightning as pl print(fPyTorch: {torch.__version__}) print(fLightning: {pl.__version__}) print(fCUDA: {torch.cuda.is_available()})完整修复代码以下是一个完整的 Google Colab 可运行示例包含安装、验证和 PyTorch Lightning 训练全流程# # Cell 1: 安装和验证 PyTorch Lightning # # 卸载可能冲突的旧版本 !pip uninstall pytorch-lightning lightning -y 2/dev/null # 安装最新版 PyTorch Lightning !pip install pytorch-lightning -q # 验证安装 import torch import pytorch_lightning as pl import torchmetrics print( * 50) print(环境验证) print( * 50) print(fPyTorch version: {torch.__version__}) print(fPyTorch Lightning version: {pl.__version__}) print(fTorchMetrics version: {torchmetrics.__version__}) print(fCUDA available: {torch.cuda.is_available()}) if torch.cuda.is_available(): print(fCUDA device: {torch.cuda.get_device_name(0)}) print(fCUDA version: {torch.version.cuda}) print( * 50) # # Cell 2: 定义 LightningModule # import torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import DataLoader, random_split from torchvision import datasets, transforms import pytorch_lightning as pl import torchmetrics class MNISTClassifier(pl.LightningModule): 使用 PyTorch Lightning 训练的 MNIST 分类器 def __init__(self, hidden_size128, learning_rate1e-3): super().__init__() # 保存超参数自动保存到 checkpoint self.save_hyperparameters() # 网络结构 self.conv1 nn.Conv2d(1, 32, 3, 1) self.conv2 nn.Conv2d(32, 64, 3, 1) self.dropout1 nn.Dropout(0.25) self.dropout2 nn.Dropout(0.5) self.fc1 nn.Linear(9216, hidden_size) self.fc2 nn.Linear(hidden_size, 10) # 评估指标 self.train_acc torchmetrics.Accuracy(taskmulticlass, num_classes10) self.val_acc torchmetrics.Accuracy(taskmulticlass, num_classes10) self.test_acc torchmetrics.Accuracy(taskmulticlass, num_classes10) def forward(self, x): x F.relu(self.conv1(x)) x F.max_pool2d(x, 2) x F.relu(self.conv2(x)) x F.max_pool2d(x, 2) x torch.flatten(x, 1) x self.dropout1(x) x F.relu(self.fc1(x)) x self.dropout2(x) x self.fc2(x) return F.log_softmax(x, dim1) def training_step(self, batch, batch_idx): x, y batch logits self(x) loss F.nll_loss(logits, y) preds torch.argmax(logits, dim1) self.train_acc(preds, y) # 记录指标 self.log(train_loss, loss, prog_barTrue) self.log(train_acc, self.train_acc, prog_barTrue, on_stepTrue, on_epochTrue) return loss def validation_step(self, batch, batch_idx): x, y batch logits self(x) loss F.nll_loss(logits, y) preds torch.argmax(logits, dim1) self.val_acc(preds, y) self.log(val_loss, loss, prog_barTrue) self.log(val_acc, self.val_acc, prog_barTrue, on_stepFalse, on_epochTrue) return loss def test_step(self, batch, batch_idx): x, y batch logits self(x) loss F.nll_loss(logits, y) preds torch.argmax(logits, dim1) self.test_acc(preds, y) self.log(test_loss, loss, prog_barTrue) self.log(test_acc, self.test_acc, prog_barTrue) return loss def configure_optimizers(self): optimizer torch.optim.Adam(self.parameters(), lrself.hparams.learning_rate) scheduler torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, modemin, patience3) return { optimizer: optimizer, lr_scheduler: scheduler, monitor: val_loss } # # Cell 3: 数据准备 # class MNISTDataModule(pl.LightningDataModule): MNIST 数据模块 def __init__(self, data_dir./data, batch_size128): super().__init__() self.data_dir data_dir self.batch_size batch_size self.transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) def prepare_data(self): # 下载数据只在主进程执行 datasets.MNIST(self.data_dir, trainTrue, downloadTrue) datasets.MNIST(self.data_dir, trainFalse, downloadTrue) def setup(self, stageNone): if stage fit or stage is None: full_train datasets.MNIST(self.data_dir, trainTrue, transformself.transform) self.train_dataset, self.val_dataset random_split( full_train, [55000, 5000] ) if stage test or stage is None: self.test_dataset datasets.MNIST(self.data_dir, trainFalse, transformself.transform) def train_dataloader(self): return DataLoader(self.train_dataset, batch_sizeself.batch_size, shuffleTrue, num_workers2) def val_dataloader(self): return DataLoader(self.val_dataset, batch_sizeself.batch_size, shuffleFalse, num_workers2) def test_dataloader(self): return DataLoader(self.test_dataset, batch_sizeself.batch_size, shuffleFalse, num_workers2) # # Cell 4: 训练和评估 # def main(): # 初始化数据模块和模型 data_module MNISTDataModule(data_dir./data, batch_size128) model MNISTClassifier(hidden_size128, learning_rate1e-3) # 配置 Trainer # 注意PyTorch Lightning 2.0 的 API 变更 trainer pl.Trainer( max_epochs5, acceleratorauto, # 自动选择 GPU/CPU devicesauto, enable_progress_barTrue, enable_checkpointingTrue, loggerTrue, log_every_n_steps50, callbacks[ pl.callbacks.EarlyStopping(monitorval_loss, patience5, modemin), pl.callbacks.ModelCheckpoint( monitorval_loss, dirpathcheckpoints/, filenamemnist-{epoch:02d}-{val_loss:.2f}, save_top_k3, modemin ) ] ) # 训练 print(\n * 50) print(开始训练...) print( * 50) trainer.fit(model, datamoduledata_module) # 测试 print(\n * 50) print(测试模型...) print( * 50) trainer.test(model, datamoduledata_module) # 加载最佳模型 best_model_path trainer.checkpoint_callback.best_model_path print(f\n最佳模型路径: {best_model_path}) # 保存最终模型 trainer.save_checkpoint(mnist_final.ckpt) print(模型已保存为 mnist_final.ckpt) print(\n训练完成) if __name__ __main__: main()常见陷阱与注意事项1. Colab 环境重置问题Google Colab 的运行时会在一段时间不活动后断开所有安装的包都会丢失。解决方案# 在 notebook 开头始终包含安装命令 !pip install pytorch-lightning -q # 或者将安装命令写入 requirements.txt !echo pytorch-lightning2.0 requirements.txt !pip install -r requirements.txt -q2. API 版本差异PyTorch Lightning 1.x 和 2.x 的 API 有重大变更# 1.x 旧 API已废弃 trainer pl.Trainer(gpus1, max_epochs10) trainer pl.Trainer(progress_bar_refresh_rate20) # 2.x 新 API trainer pl.Trainer(acceleratorgpu, devices1, max_epochs10) trainer pl.Trainer(enable_progress_barTrue)3. 与 torchmetrics 的版本冲突# PyTorch Lightning 依赖 torchmetrics版本必须匹配 # 如果出现 ImportError尝试同时升级 !pip install pytorch-lightning torchmetrics --upgrade -q # torchmetrics API 也可能变化 # 旧版: torchmetrics.Accuracy() # 新版: torchmetrics.Accuracy(taskmulticlass, num_classes10)4. Colab GPU 运行时选择# 确保在 Colab 中选择了 GPU 运行时 # 菜单: Runtime → Change runtime type → Hardware accelerator → GPU # 验证 GPU 可用性 import torch print(fCUDA available: {torch.cuda.is_available()}) if not torch.cuda.is_available(): print(警告未检测到 GPU请在 Colab 菜单中切换到 GPU 运行时)5. 多个 Lightning 版本共存# 检查是否安装了多个版本 !pip list | grep -i lightning # 如果有多个全部卸载后重装 !pip uninstall pytorch-lightning lightning lightning-fabric lightning-utilities -y !pip install pytorch-lightning -q6. 离线使用 PyTorch Lightning# 如果 Colab 网络不稳定可以预先下载 wheel 文件 !pip download pytorch-lightning -d ./pl_wheels # 然后离线安装 !pip install --no-index --find-links./pl_wheels pytorch-lightning总结在 Google Colab 中解决 PyTorch Lightning 导入问题的核心要点确认安装Colab 不一定预装 PyTorch Lightning需要!pip install pytorch-lightning。版本兼容确保 PyTorch Lightning 版本与 Colab 预装的 PyTorch 版本兼容。包名变更PyTorch Lightning 2.0 迁移到lightning包但pytorch_lightning仍可使用。清理冲突遇到依赖冲突时先卸载所有相关包再重新安装。API 迁移注意 1.x 到 2.x 的 API 变更如gpus1→acceleratorgpu, devices1。GPU 运行时在 Colab 菜单中手动选择 GPU 运行时类型。环境持久化Colab 运行时会重置每次启动都需要重新安装依赖。通过遵循这些解决方案你可以在 Google Colab 中顺利使用 PyTorch Lightning 进行深度学习实验。