Google Colab实战避坑指南:解决OOM、断连、存储丢失等高频问题

📅 2026/7/18 7:48:21
Google Colab实战避坑指南:解决OOM、断连、存储丢失等高频问题
1. 项目概述这不是“又一个Colab教程”而是我踩过27次OOM、重装过14次运行时、被自动断连气到摔键盘后整理出的真正能用的Python实战手册Google Colab 101 Tutorial with Python — Tips, Tricks, and FAQ这个标题听起来像入门课但实际它解决的是一个非常具体、高频、且让无数人卡在“写完代码却跑不起来”阶段的现实问题。我带过3个高校AI课程助教组审过800份学生Colab作业发现超过65%的失败案例根本不是代码逻辑错误而是被Colab底层机制“背刺”了——比如你刚训练到第83轮页面弹出“运行时已断开”所有中间结果清零或者你兴冲冲上传了12GB的医学影像数据集点击运行后只看到一行红色报错OSError: [Errno 28] No space left on device再或者你调通了模型想导出.pth文件却发现文件管理器里根本找不到它刷新几次后才意识到Colab的虚拟机磁盘是临时挂载、每次重启即销毁的。这根本不是Python水平问题而是对Colab运行时本质缺乏系统性认知。这篇内容专为已经会写print(Hello World)、能看懂PyTorch基础语法但一上Colab就频繁掉坑的中阶学习者设计。它不讲“什么是GPU”不演示“如何新建笔记本”而是直击真实工作流中的断点怎么让数据稳稳落盘不丢怎么在免费GPU上把batch size从8硬拉到32怎么绕过/content目录的权限陷阱直接读取Google Drive怎么用一行命令把训练日志实时同步到本地如果你曾因Colab的“看似免费实则处处设限”而放弃过项目那这篇就是为你写的生存指南。它不承诺“零基础速成”但保证每一条技巧都来自我过去三年在Colab上累计运行超12万分钟的真实记录所有参数、路径、命令均经2024年Q2最新版Colab环境实测验证。2. 运行时架构与资源边界为什么你的代码在本地能跑在Colab上必崩2.1 看得见的硬件看不见的沙盒Colab运行时的本质是容器化虚拟机很多人以为Colab给的是“一台带GPU的远程电脑”这是最大的认知偏差。实际上你获得的是一个基于Linux容器LXC的轻量级虚拟机实例它被严格限制在Google Cloud Platform的物理节点上运行。这个容器有三重硬性边界内存容量、磁盘空间、GPU显存。而这些边界并非固定值而是根据你选择的硬件类型CPU/TPU/GPU和当前平台负载动态分配的。以最常用的Tesla T4GPU为例官方标称显存为16GB但在Colab中你实际可用的显存通常只有14.7GB左右——因为系统进程如Jupyter内核、NVIDIA驱动守护进程会预占约1.3GB。我做过一组实测在同一台T4实例上执行nvidia-smi显示总显存15109MiB但当你启动PyTorch并调用torch.cuda.memory_allocated()时初始占用就已达1.2GB。这意味着如果你的模型参数梯度优化器状态batch数据需要15GB显存哪怕只超0.3GB也会在model.train()第一轮就触发CUDA out of memory。这不是代码bug是资源预算没做够。更隐蔽的是内存RAM陷阱。Colab免费版标称“最高12GB RAM”但实测中当你挂载Google Drive后/content/drive目录下的文件访问会通过FUSEFilesystem in Userspace协议进行这个过程本身就会额外消耗300~500MB内存。如果你同时开启TensorBoard日志监听、后台运行ngrok隧道、再加载一个Hugging Face大模型内存占用很容易突破11GB红线触发Linux OOM Killer强制杀死你的Python进程。我在调试一个BERT微调任务时就遇到过这样的诡异现象代码在trainer.train()前一切正常但进入训练循环后第3个step突然中断dmesg | tail日志显示Out of memory: Kill process 12345 (python) score 892 or sacrifice child。最终定位到是TensorBoard的SummaryWriter在每步写入大量histogram数据导致内存泄漏。解决方案不是关TensorBoard而是改用flush_secs120参数降低写入频率并手动调用writer.flush()控制时机。2.2 磁盘空间/content不是你的硬盘而是“用完即焚”的临时工位Colab的文件系统结构必须刻进DNA/content是唯一可写的根目录但它背后是tmpfs内存文件系统本质是把RAM当硬盘用。这意味着两点致命特性第一它的最大容量等于你当前可用内存减去系统开销第二一旦运行时断开或重启/content下所有文件永久消失不可恢复。我见过太多人把数据集解压到/content/dataset/训练到一半断连回来发现目录空空如也只能重头下载。更糟的是/content默认配额极小。在未挂载Drive前df -h /content显示可用空间通常只有3.5GB左右。你以为上传一个1.2GB的ZIP包很安全解压后可能瞬间占满整个空间导致后续pip install命令全部失败报错No space left on device。这不是磁盘坏了是你把临时工位当成了永久仓库。真正的存储策略必须分层/content只放运行时必需的、体积小的、可再生的文件比如requirements.txt、train.py脚本、config.yaml配置所有原始数据、预训练模型、训练产出物checkpoints、logs、output必须存放在挂载的Google Drive中。Drive挂载后路径为/content/drive/MyDrive/它是真正的持久化存储不受运行时生命周期影响。但这里有个关键细节Drive挂载是用户级FUSE挂载其文件权限模型与Linux原生文件系统不同。直接在Drive目录下运行!chmod 755 script.sh会失败报错Operation not permitted。正确做法是先将脚本复制到/content修改权限后再执行或者用google.colab.files.download()下载到本地处理。这个细节90%的入门教程都不会提但它直接决定你能否顺利运行Shell脚本。2.3 运行时生命周期自动断连不是故障而是Google的设计哲学Colab的“自动断连”机制常被诟病但理解其设计逻辑后你会明白这是Google在免费服务与资源公平性之间做的精准平衡。免费版运行时有两条硬性规则空闲超90分钟自动断开连续运行超12小时强制重置。注意“空闲”定义极其严格它不仅指你没敲代码还包括!wget下载、!pip install安装、甚至time.sleep(300)这种纯等待。只要Python进程没有主动向内核发起I/O或计算请求计时器就在走。我曾为下载一个大型数据集写了个带进度条的!wget -c命令自以为“正在运行”结果5分钟后页面弹出断连提示——因为wget的网络I/O不被Colab前端视为“活跃计算”。更反直觉的是GPU释放策略。当你执行!nvidia-smi看到GPU利用率100%但下一秒执行!python train.py却收到CUDA is not available错误。这是因为Colab的GPU资源池是共享的你的T4实例可能被多个用户轮询调度。如果检测到你长时间未提交新计算任务比如训练循环中loss.backward()后卡在optimizer.step()的锁竞争后台会悄悄回收GPU设备句柄只保留CPU上下文。解决方案不是“保持活跃”而是用torch.cuda.is_available()做运行时校验并在关键计算前插入torch.cuda.synchronize()强制同步设备状态。我在一个强化学习项目中就通过在每个episode结束时添加synchronize()将GPU掉线率从37%降至0.8%。3. 数据与环境管理从“手忙脚乱找文件”到“一键复现全环境”3.1 数据加载黄金法则永远不要在/content解压原始数据集新手最常犯的错误就是把下载的数据集ZIP包直接扔进/content然后!unzip dataset.zip。这看似简单实则埋下三重雷第一解压过程吃光/content剩余空间第二解压后的原始文件如ImageNet的数万张JPEG无法被Git跟踪协作时队友要重新下载第三每次重启都要重复解压浪费时间。正确的数据流应该是下载 → 校验 → 挂载 → 符号链接。具体操作分五步下载到Drive用gdown或wget -O命令将数据集直接保存到/content/drive/MyDrive/data/避免经过/content中转SHA256校验!sha256sum /content/drive/MyDrive/data/dataset.zip与官网提供的哈希值比对防止下载损坏挂载Drivefrom google.colab import drive; drive.mount(/content/drive)注意挂载点必须是/content/drive其他路径无效创建符号链接!ln -sf /content/drive/MyDrive/data /content/data这样代码里就可以统一用/content/data路径无需修改源码按需解压只解压当前任务需要的子集。例如处理CIFAR-10时用!unzip -j /content/drive/MyDrive/data/cifar-10-python.tar.gz cifar-10-batches-py/data_batch_1提取单个batch而非全量解压。这个流程的关键在于“符号链接”。它让你的代码路径与物理存储解耦。当你要切换数据集版本时只需修改ln -sf指向的新路径所有open(/content/data/xxx)调用自动生效。我在维护一个跨季度的CV项目时用这套方法实现了数据集热切换团队成员无需修改任何一行代码就能测试新标注数据。3.2 环境隔离为什么pip install后模块仍报ModuleNotFoundErrorColab的Python环境是预装的但它的site-packages目录有两个层级系统级/usr/local/lib/python3.x/dist-packages和用户级/root/.local/lib/python3.x/site-packages。当你执行!pip install package_name默认安装到用户级目录但某些库如tensorflow的预装版本会锁定系统级路径。这就导致一个经典冲突!pip install torch2.0.1成功但import torch仍加载旧版1.13。根本原因是Python的模块搜索顺序sys.path中系统路径排在用户路径之前。破解方案有三个按推荐度排序首选--force-reinstall --no-deps!pip install --force-reinstall --no-deps torch2.0.1 torchvision0.15.2。--force-reinstall强制覆盖--no-deps避免依赖冲突因为你只需要核心包依赖由Colab预装环境提供次选--target指定路径!pip install --target /content/my_libs torch2.0.1然后在代码开头插入import sys; sys.path.insert(0, /content/my_libs)确保优先加载慎用--system!pip install --system torch2.0.1这会直接修改系统级包可能导致Colab内置功能异常仅在明确知道风险时使用。我曾为一个需要PyTorch Geometric的GNN项目折腾了两天最终发现罪魁祸首是torch-scatter的CUDA版本不匹配。解决方案是先!pip uninstall torch-scatter再用!pip install torch-scatter -f https://data.pyg.org/whl/torch-2.0.0cu118.html指定CUDA 11.8编译的wheel包。这个URL里的cu118必须与!nvcc --version输出的CUDA版本严格一致否则import torch_geometric时会报undefined symbol: _ZNK3c104Type11isSubtypeOfERKNS_4TypeE这类晦涩错误。3.3 持久化配置让每次重启都像从未离开过每次重启Colab你都要重复git clone项目、pip install -r requirements.txt、gdown下载数据、drive.mount()挂载……这个过程平均耗时7分23秒我计时过。真正的效率提升不在于加速单次训练而在于消灭重复劳动。我的做法是构建一个setup_colab.py初始化脚本它被设计为幂等执行多次运行无副作用# setup_colab.py import os, subprocess, sys from google.colab import drive, files def run_cmd(cmd): result subprocess.run(cmd, shellTrue, capture_outputTrue, textTrue) if result.returncode ! 0: print(f❌ 命令失败: {cmd}\n{result.stderr}) else: print(f✅ {cmd}) # 1. 挂载Drive已挂载则跳过 if not os.path.exists(/content/drive/MyDrive): drive.mount(/content/drive) # 2. 创建标准目录结构 for path in [/content/project, /content/data, /content/logs]: os.makedirs(path, exist_okTrue) # 3. 同步项目代码仅当本地不存在时 if not os.path.exists(/content/project/.git): run_cmd(git clone https://github.com/yourname/project.git /content/project) else: run_cmd(cd /content/project git pull) # 4. 安装依赖跳过已安装的包 run_cmd(pip install -r /content/project/requirements.txt --quiet) # 5. 链接数据目录 os.system(ln -sf /content/drive/MyDrive/data /content/data) print( 初始化完成项目位于 /content/project数据位于 /content/data)把这个脚本保存在Google Drive的/MyDrive/colab_setup/下每次新打开Notebook第一行就执行%run /content/drive/MyDrive/colab_setup/setup_colab.py它会在30秒内完成所有环境准备且后续重启只需重新运行这一行。关键是os.makedirs(..., exist_okTrue)和git pull的组合确保目录结构稳定、代码始终最新。我在带学生做毕业设计时把这套流程封装成模板学生只需改两行URL就能一键拉起完整开发环境把精力聚焦在算法创新上。4. GPU与内存优化把免费资源榨干到最后一MB4.1 显存精算术从“OOM”到“刚好够用”的参数推演在Colab上跑深度学习显存不是越大越好而是要精确到MB级规划。一个典型ResNet-50训练任务的显存消耗可拆解为四部分模型参数ResNet-50约25.6M参数FP32存储需102.4MBFP16需51.2MB梯度与参数同量级51.2MBFP16优化器状态Adam优化器为每个参数存储m和v两个动量102.4MBFP16激活值Activations这是最大变量取决于batch size和网络深度。ResNet-50在batch32时激活值约占用8.2GB实测。所以总显存 51.2 51.2 102.4 8200 ≈8405MB。而T4实测可用显存14.7GB15053MB余量6648MB。这6648MB就是你能加的“安全边际”可用于增大batch size每16 batch激活值约4.1GB添加更多数据增强torchvision.transforms.RandomRotation等操作在GPU上执行约200MB启用混合精度训练torch.cuda.amp.autocast()可将激活值降为FP16节省约40%显存。我的实操公式是目标batch_size 当前batch_size × (1 安全边际 ÷ 当前激活值显存)。例如当前batch16时激活值占4.1GB安全边际6648MB则理论最大batch 16 × (1 6648÷4100) ≈ 16 × 2.62 42。但实际我会设为32留出20%冗余应对梯度爆炸等异常。这个推演过程必须手写在Notebook的Markdown单元格里而不是凭感觉调参。我在调试ViT-Base时就是靠这个公式把batch从8提升到24训练速度直接翻倍。4.2 内存泄漏防控那些悄无声息吃掉你RAM的“幽灵进程”Colab内存泄漏的元凶往往不是你的模型而是辅助工具。最典型的三个“内存黑洞”TensorBoard的SummaryWriter默认每20秒写入一次且会缓存所有histogram数据。一个包含100个layer的模型每步写入的histogram数据可达50MB。解决方案writer SummaryWriter(log_dir, flush_secs120)并将add_histogram()调用频率从每step降到每epochPandas的read_csv读取大CSV时默认dtype会将所有数字列设为float64内存占用翻倍。正确做法pd.read_csv(file, dtype{id: int32, score: float32})显式指定最小必要精度OpenCV的cv2.VideoCapture在视频处理任务中如果忘记cap.release()视频解码器会持续驻留内存。我的习惯是在try...finally块中封装cap cv2.VideoCapture(video_path) try: while cap.isOpened(): ret, frame cap.read() if not ret: break # 处理帧 finally: cap.release() # 确保释放我还开发了一个内存监控装饰器能实时打印函数执行前后的内存变化import psutil, os def mem_monitor(func): def wrapper(*args, **kwargs): process psutil.Process(os.getpid()) mem_before process.memory_info().rss / 1024 / 1024 result func(*args, **kwargs) mem_after process.memory_info().rss / 1024 / 1024 print(f {func.__name__}: {mem_after - mem_before:.1f}MB) return result return wrapper mem_monitor def load_dataset(): return pd.read_csv(/content/data/large.csv)在数据加载函数上加这个装饰器一眼就能看出哪一步吃内存最多比盲目gc.collect()有效十倍。4.3 混合精度训练用torch.cuda.amp把显存砍掉40%PyTorch的自动混合精度AMP是Colab用户的救命稻草但它不是开箱即用的魔法开关而是需要精细配置的手术刀。核心是torch.cuda.amp.GradScaler它解决FP16训练中梯度下溢underflow问题。错误用法是只加autocast()# ❌ 危险梯度下溢会导致lossnan with torch.cuda.amp.autocast(): outputs model(inputs) loss criterion(outputs, labels) loss.backward() # 此处梯度可能为0正确流程必须四步闭环启用autocast在前向传播中包裹autocast()缩放损失scaler.scale(loss).backward()将梯度放大避免下溢更新参数scaler.step(optimizer)执行优化器更新更新缩放因子scaler.update()根据本次梯度是否溢出动态调整缩放倍数。完整代码模板from torch.cuda.amp import autocast, GradScaler scaler GradScaler() for epoch in range(num_epochs): for inputs, labels in dataloader: optimizer.zero_grad() # 1. 前向传播自动混合精度 with autocast(): outputs model(inputs) loss criterion(outputs, labels) # 2. 反向传播梯度缩放 scaler.scale(loss).backward() # 3. 优化器更新 scaler.step(optimizer) # 4. 更新缩放因子 scaler.update()这个流程的关键参数是init_scale初始缩放倍数和growth_factor增长倍数。Colab T4的默认init_scale65536.0足够但如果你的loss初始值很小如1e-3建议设为32768.0。我在训练一个回归任务时loss初始为8e-4用默认值导致前100步scaler.update()一直将scale下调最终卡在scale1.0失去保护作用。改成GradScaler(init_scale32768.0)后训练全程稳定。5. 文件IO与持久化告别“训练完找不到模型”的绝望5.1 模型保存的三种姿势从“能存”到“能找”再到“能用”在Colab上保存模型90%的人只用torch.save(model.state_dict(), model.pth)结果重启后发现model.pth在/content里消失了。这是对Colab存储模型的根本误解。正确的模型保存必须回答三个问题存在哪怎么命名怎么加载存在哪绝对不能存/content。必须存/content/drive/MyDrive/models/并建立日期实验名的子目录如/content/drive/MyDrive/models/20240520-resnet50-lr0.001/怎么命名文件名必须包含关键超参如epoch_50_acc_0.923.pth而不是best_model.pth。我用的命名规范是{model}_{dataset}_{lr}_{batch}_{epoch}_{metric}_{value}.pth例如resnet50_cifar10_0.001_32_100_acc_0.942.pth怎么加载加载时不能硬编码路径要用glob动态查找import glob # 查找acc最高的模型 best_pth max(glob.glob(/content/drive/MyDrive/models/resnet50_cifar10_*_acc_*.pth), keylambda x: float(x.split(_)[-1].replace(.pth, ))) model.load_state_dict(torch.load(best_pth))更进一步我封装了一个ModelSaver类它自动处理版本管理和元数据记录import json, time from pathlib import Path class ModelSaver: def __init__(self, base_dir/content/drive/MyDrive/models): self.base_dir Path(base_dir) self.base_dir.mkdir(exist_okTrue) def save(self, model, metrics, config): # 创建唯一实验目录 exp_dir self.base_dir / f{config[model]}_{int(time.time())} exp_dir.mkdir() # 保存模型 torch.save(model.state_dict(), exp_dir / model.pth) # 保存指标和配置 with open(exp_dir / metrics.json, w) as f: json.dump(metrics, f, indent2) with open(exp_dir / config.json, w) as f: json.dump(config, f, indent2) print(f✅ 模型已保存至 {exp_dir}) # 使用 saver ModelSaver() saver.save(model, {val_acc: 0.942, train_loss: 0.12}, {model: resnet50, lr: 0.001, batch: 32})这样每次保存都会生成一个带时间戳的独立目录所有相关信息模型、指标、配置打包存放彻底解决“找不着模型”和“不知道哪个版本好”的双重困境。5.2 日志与可视化让TensorBoard在Colab上真正“活”起来Colab内置的TensorBoard支持是个半成品。直接%load_ext tensorboard后%tensorboard --logdir logs你会发现页面打不开或者图表不刷新。根本原因是Colab的TensorBoard是通过ngrok隧道代理的而免费版ngrok有连接数限制。我的解决方案是双通道日志本地实时查看 Drive持久化归档。第一步启动TensorBoard时指定--bind_all和--port%load_ext tensorboard %tensorboard --logdir /content/drive/MyDrive/logs --bind_all --port 6006第二步在另一个Cell中启动ngrok隧道需提前pip install pyngrokfrom pyngrok import ngrok public_url ngrok.connect(6006) print(f TensorBoard URL: {public_url})第三步最关键的是日志路径必须指向Drive。所有SummaryWriter的log_dir参数都要设为/content/drive/MyDrive/logs/exp_name而不是/content/logs。这样即使Colab断连日志文件仍在Drive中完好保存。我还会在训练循环中每10个epoch执行一次!cp -r /content/drive/MyDrive/logs /content/drive/MyDrive/logs_backup_$(date %Y%m%d)做增量备份。对于无法实时查看的场景如深夜训练我用tensorboardX将关键指标写入CSV便于后续分析import csv with open(/content/drive/MyDrive/logs/metrics.csv, a) as f: writer csv.writer(f) writer.writerow([epoch, train_loss, val_acc, time.time()])这个CSV文件可以随时下载到本地用Excel或Pandas绘图完全不依赖TensorBoard。5.3 文件下载终极方案files.download()的隐藏技巧与替代方案Colab的google.colab.files.download()是下载小文件的利器但它有两大限制单次只能下载一个文件且文件必须存在于/content目录下。当你需要下载整个/content/drive/MyDrive/models/20240520/目录时它就失效了。我的解决方案是“压缩-下载-解压”三步法import zipfile, os from google.colab import files def download_folder(folder_path, zip_namedownload.zip): 将文件夹压缩并下载 with zipfile.ZipFile(zip_name, w, zipfile.ZIP_DEFLATED) as zipf: for root, dirs, files_in_dir in os.walk(folder_path): for file in files_in_dir: file_path os.path.join(root, file) # 保持相对路径 arcname os.path.relpath(file_path, folder_path) zipf.write(file_path, arcname) files.download(zip_name) # 清理临时zip os.remove(zip_name) # 使用下载整个模型目录 download_folder(/content/drive/MyDrive/models/20240520-resnet50/)这个函数会递归遍历目标文件夹将所有文件按相对路径打包成ZIP然后触发浏览器下载。它解决了files.download()的两大痛点多文件打包、跨目录下载。更重要的是它生成的ZIP包在本地解压后目录结构与Colab中完全一致无需手动重建路径。对于超大文件100MB浏览器下载可能超时。此时我用gdown生成分享链接!pip install gdown !gdown --fuzzy https://drive.google.com/file/d/FILE_ID/view?uspsharing -O model.zip但前提是你要先在Google Drive网页端右键文件→“获取分享链接”→设置为“任何人可查看”然后提取FILE_ID链接中/d/和/view之间的字符串。这个ID是永久有效的我把所有重要模型的ID记在一个model_ids.csv里需要时一键下载。6. 常见问题与排查技巧实录那些让我摔过键盘的“坑”6.1 “Connection failed”不是网络问题而是认证过期当你执行drive.mount(/content/drive)页面弹出Google登录窗口你授权后却看到“Connection failed”第一反应是网络不好。错。95%的情况是OAuth2令牌过期。Colab的Drive挂载使用短期访问令牌有效期通常为1小时。如果你前一天挂载过第二天打开Notebook令牌已失效但Colab不会提示“令牌过期”而是静默失败。排查步骤执行!ls /content/drive如果返回ls: cannot access /content/drive: Transport endpoint is not connected确认是挂载失败检查/content/drive是否为空目录!ls -la /content/drive如果是空的说明挂载未建立不要刷新页面直接在新Cell中重新运行drive.mount()并确保勾选“在新窗口中打开”如果仍失败清除浏览器Cookie中colab.research.google.com的登录状态重新登录。我的经验是每天首次使用Colab前第一件事就是重新挂载Drive。把它写成一个固定仪式比事后排查省10分钟。6.2ImportError: libcudnn.so.8CUDA与cuDNN的版本战争当你!pip install torch2.0.1cu118后import torch报错ImportError: libcudnn.so.8: cannot open shared object file: No such file or directory这不是PyTorch装错了而是Colab预装的cuDNN版本与PyTorch要求不匹配。Colab T4实例预装的是cuDNN 8.9.2但某些PyTorch wheel包要求cuDNN 8.7.0。解决方案不是降级PyTorch而是强制链接cuDNN库# 查找系统cuDNN路径 !find /usr -name libcudnn.so* 2/dev/null # 通常输出/usr/lib/x86_64-linux-gnu/libcudnn.so.8.9.2 # 创建软链接 !ln -sf /usr/lib/x86_64-linux-gnu/libcudnn.so.8.9.2 /usr/lib/x86_64-linux-gnu/libcudnn.so.8这个命令告诉系统“当我需要libcudnn.so.8时请用libcudnn.so.8.9.2代替”。它绕过了版本检查且不影响其他库。我在部署一个医疗影像分割模型时就是靠这行命令解决了cuDNN兼容性问题比重装系统快10倍。6.3 “Your session crashed”不是代码崩溃而是内存超限的温柔提醒Colab页面突然变灰显示“Your session crashed”你以为是代码有死循环。其实更可能是内存超限触发了OOM Killer。Linux内核在内存不足时会杀死占用内存最多的进程而Python进程通常是首选目标。诊断方法在崩溃前立即执行!free -h查看Mem:行的available值如果低于500MB大概率OOM执行!dmesg | grep -i killed process查找被杀死的进程名和PID执行!ps aux --sort-%mem | head -10查看当前内存占用Top10进程。预防措施在数据加载后立即执行gc.collect()清理Python垃圾对于大Pandas DataFrame用df.dropna().reset_index(dropTrue)删除空行用df.astype({col: category for col in df.select_dtypes(object).columns})将字符串列转为category类型内存可减少70%在训练循环中每10个epoch执行一次torch.cuda.empty_cache()释放未被引用的GPU显存。我有一个血泪教训在处理一个10GB的基因序列数据集时忘了df.astype(category)导致内存从3GB飙升到11GB最终session crash。现在我的数据加载函数第一行就是类型转换已成肌肉记忆。6.4 “No module named xxx”sys.path的迷宫与绝对路径的救赎当你!pip install mypackage成功但import mypackage报错八成是sys.path没包含安装路径。Colab的sys.path是一个列表Python按顺序查找模块。pip install的默认路径是/root/.local/lib/python3.x/site-packages但如果这个路径不在sys.path中导入就会失败。快速修复import sys # 查看当前路径 print(\n.join(sys.path)) # 如果没看到local路径手动添加 if /root/.local/lib/python3.10/site-packages not in sys