首页 / 资讯中心 / 文章详情

Kaggle Notebooks免费GPU训练指南:配额、后台运行与断点续训

Kaggle Notebooks免费GPU训练指南:配额、后台运行与断点续训 ★ FEATURED ARTICLE
1. 为什么把训练任务搬到 Kaggle NotebooksColab 免费版这两年的体验用一句话概括就是能跑但你别指望它老老实实跑完。浏览器切到后台十分钟标签页被回收训练进程跟着一起没跑到一半弹出“您已断开连接”再连回来显存里的东西全没了。我自己的习惯是拿 Colab 做临时验证、跑跑几行 demo真要提交一个需要三五个小时的训练任务我会把它放到 Kaggle Notebooks 上。这份免费 GPU 使用指南就是围绕这件事展开的——它讲清楚 Kaggle 免费 GPU 的额度怎么算、会话怎么活、后台怎么跑、断点怎么续以及哪些坑会把你的配额白白烧掉。Colab 的理想替代方案这个说法不算夸张前提是你得接受它另一套规则Kaggle 不是“给你一块随时可用的显卡”而是“给你一个带配额的批处理环境”你把思维从交互式开发切换到提交式运行它的价值才会显现出来。适合谁看手上有中小规模深度学习任务、想白嫖算力又不想被断线折磨的人课程作业、个人复现、小数据集微调这类需求最匹配。不适合谁需要多卡高速互联跑大模型预训练、需要长时间独占交互式调试、需要频繁重启内核做探索的人。这些场景免费额度撑不住别硬凑。另外提前说一句平台规则和配额数字是会更新的我下面写的具体数值是按我最近使用的印象给出的量级你实际动手前扫一眼账号里的配额页和官方文档以页面上写的为准别拿我这篇当法条。1.1 免费额度的真实构成每周三十小时是什么概念Kaggle 的免费算力不是“无限但排队”而是明确的配额制。GPU 大概每周三十小时TPU 二十小时上下CPU 不单独计 GPU 配额但也受会话时长约束。这个数字听起来比 Colab 慷慨关键在于它的计量方式和消耗节奏完全不同。Colab 是“你连着就算时间”你开着标签页发呆、去泡杯咖啡、写着代码卡壳了时间照样在走。Kaggle 的交互式会话虽然也计时但它真正的价值在于 Save Version也就是 Commit——你把代码和输出提交成一次运行任务在后台跑完页面上你能看到排队、运行、完成的状态这个过程不占用你的浏览器你的电脑可以关机。三十小时听着不多但一个 epoch 只要十几分钟的小任务一周跑二三十次完全够用。真正烧配额的是那种“开个会话挂在那里慢慢调参、边想边改”的工作方式一挂三小时代码只跑了二十分钟剩下两小时四十分钟全是白烧。我的做法是把探索和训练彻底分开探索阶段用 CPU 会话或者本地环境写代码把逻辑跑通、把路径对齐、把依赖理顺确定要出结果了再开 GPU 会话一次性跑完跑完立刻关。这样一周三十小时能撑住相当密集的实验节奏。1.2 和 Colab 免费版的四个硬差异我列了个对照表都是实际使用中感受最明显的差别不是参数表上的纸面数字对比维度Colab 免费版Kaggle Notebooks后台运行基本依赖浏览器会话存活断开后进程容易被回收Save Version 提交后在服务端跑完可关浏览器单次时长大约十二小时上限但实际常被提前中断有硬性上限到点终止不搞“随机掉线”配额粒度不透明靠“你最近用得太多”动态限制明确的每周小时数用完为止心里有数数据准备每次重新下载或手动挂载网盘数据集一次上传之后直接挂载到只读目录输出保存需要手动下载或挂网盘运行结束自动保存输出产物可版本化最值得说的是第三行和第五行。Kaggle 的配额是可见的你能知道这周还剩多少这直接影响你做实验的计划性——你会自然而然地把“跑一次”当成一次投入而不是随手点一下。输出保存这一点更关键Commit 结束后/kaggle/working目录里的东西会被固化成这次运行的输出你可以下载也可以让下一次运行直接引用上一次的输出。这意味着断点续训、分阶段训练、流水线式的实验管理在这个环境里是天然成立的不需要你额外搞一套云存储。1.3 上手门槛手机验证与网络开关新手最容易卡住的地方不是 GPU 怎么开而是网络。Kaggle Notebook 默认是关闭外网访问的你在里面pip install会直接报连接失败很多人以为是镜像源问题折腾半天。实际上需要账号完成手机号验证然后在 Notebook 的设置面板里手动把 Internet 开关打开。这个开关在有些场景下不允许打开比如部分竞赛的提交类 notebook 有额外限制遇到开关变灰先去看该 notebook 的规则说明别硬试。我的建议是如果任务只需要几个常见库优先用平台预装的环境Kaggle 的镜像里 PyTorch、TensorFlow、sklearn、pandas、OpenCV 这些基本都有开箱即用。确实需要额外依赖时把 wheel 文件提前传成私有数据集挂载后本地安装比每次联网 pip 稳得多也省时间。这个习惯养成之后你会发现网络开关开不开对你的影响其实很小而“依赖可复现”这件事本身在实验管理上就是加分项。2. 环境认知目录结构、配额与生命周期很多人把 Kaggle Notebook 当成“在线的 Jupyter”这个理解会导致一连串误判以为改了文件就一直在、以为装了库就一直有、以为关掉页面就是关掉任务。它实际上更接近一个容器化的批处理执行器有三个目录、一条时间线、一套配额搞清楚这三样后面所有操作都顺。2.1 三个目录各自能干什么进到 Notebook 里先pwd和ls一下你会看到这样几个位置它们的性质完全不同/kaggle/input只读。你挂载的数据集、模型、竞赛数据都在这里。写操作会直接报错别试图往里存 checkpoint。/kaggle/working可写会随 Commit 一起保存。容量大概二十 GB 量级这是你放代码、放输出、放模型的唯一可靠位置。/tmp和/root可写速度快但不持久。会话结束、Commit 结束里面的东西就没了。适合放临时解压文件、临时缓存。这个区别带来的第一个实操结论所有需要跨会话保留的东西一律放/kaggle/working。第二个结论/root/.cache里的 HuggingFace 模型权重、pip 缓存下次开新会话全都没了每次重新下载既费时间又可能在没网的时候直接卡死。所以模型权重要么做成私有数据集挂载要么在 Commit 结束后把缓存的权重目录整个复制到/kaggle/working里作为本次运行的输出保存下来下次通过“引用上一次运行的输出”把它拿回来。注意/kaggle/working虽然可写但它的产出要进入最终输出才算保存。运行过程中产生的临时大文件跑完记得删掉否则输出体积会超限。2.2 会话时长与配额消耗的对应关系时间线这块要分两种模式看混在一起想很容易算错账。交互式会话你在网页上点开 Notebook 点点点的那种CPU 会话上限大概十二小时GPU 会话上限短一些印象里是九小时左右。到点强制终止没有商量余地你正在跑的循环会被直接掐断。所以交互式会话里不要跑超过两三个小时的任务风险太高。Save VersionCommit把整个 notebook 从第一个 cell 执行到最后在服务端后台跑。它的上限和交互式类似甚至略宽松但关键是它不依赖你的浏览器。你可以提交完就关电脑第二天来看结果。配额消耗是按“会话开了多久”算的不是按“GPU 实际算了多少”算。这条规则的含义非常直白别让会话空转。我见过有人开着 GPU 会话读论文、查资料、改代码一开一下午配额烧掉四小时实际训练只跑了四十分钟。正确的节奏是先在 CPU 会话或者本地把代码写到“一键可跑”的程度再开 GPU 会话粘代码、装环境、跑、看结果、关会话全程压缩在几分钟的调度开销加实际训练时间里。2.3 硬件规格与选型P100 还是 T4 x2加速器面板里通常能选到的 GPU 是 Tesla P100 和 T4T4 还支持双卡T4 x2。这两块卡的取舍不是“谁更新”这么简单卡型显存特点更适合P10016GB显存带宽高FP64 性能好没有 Tensor Core老代码、需要双精度的科学计算、对带宽敏感的大 batch 推理T416GB有 Tensor CoreFP16 加速明显功耗低主流深度学习训练尤其是能用混合精度的模型T4 x232GB分卡两张卡各 16GB不能当 32GB 单卡用单卡放不下 batch、可以用数据并行摊开的任务显存都是十六 GB所以“我这模型要二十四 GB 显存”这种事在两块卡上都过不去除非用双卡数据并行每卡放一份模型副本但那样单卡显存需求并没有减少。真正的差别在算力特性PyTorch 里开torch.cuda.amp混合精度T4 因为有 Tensor Core训练速度通常能比 FP32 快出明显一截P100 走 FP16 只是相当于两个 FP32 流水提速有限。所以除非你的代码里有大量双精度运算、或者用到了对 P100 更友好的老实现否则默认选 T4能选双卡就选双卡跑不动再回退单卡。有一点要提醒T4 x2 是两张物理卡跨卡通信走的是普通总线不是那种高带宽互联。数据并行的加速比往往到不了 2 倍小模型上双卡甚至可能比单卡慢因为通信开销盖过了计算收益。判断标准很朴素单卡跑一轮要很久、且 batch 能开大双卡才划算单卡一轮几十秒的小任务老老实实单卡。3. 从零开始把一段训练代码跑起来这一节按实际操作顺序走一遍从建 notebook 到跑出第一个结果。我不会贴一整套完整训练脚本那玩意儿网上到处都是我重点讲那些“不写出来你就得自己踩一遍”的环节。3.1 创建 Notebook 与加速器选择新建 Notebook 之后先在右侧或顶部的设置里做三件事把 Accelerator 设成 GPUT4 x2 或 P100确认 Internet 开关状态符合你的需求确认 Persistence 选项是否保留会话状态。Accelerator 的修改通常需要重新启动会话生效所以顺序上先设硬件再装环境别装完一堆库才想起来改显卡那样会话一重启装的东西全没了。镜像选择上平台会提供几个预置镜像比如带 PyTorch 的、带 TensorFlow 的。选跟你代码匹配的那个能省掉一次大体积安装。装完之后跑一句nvidia-smi看看卡在不在、显存空不空这是最省事的自检。nvidia-smi python -c import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.device_count())如果device_count()返回 2 而你只打算用一张卡代码里记得显式指定cuda:0或者用CUDA_VISIBLE_DEVICES限定避免框架默认把所有卡都用上反而因为数据并行拖慢速度。3.2 环境自检的几行代码写代码之前先做个十秒钟的体检能省掉后面半小时的排查。我习惯在第一个 cell 固定放这么一段import os, sys, torch, shutil print(cwd:, os.getcwd()) print(gpu:, torch.cuda.get_device_name(0) if torch.cuda.is_available() else none) print(gpu count:, torch.cuda.device_count()) total, used, free shutil.disk_usage(/kaggle/working) print(fworking free: {free / 1e9:.1f} GB) for p in [/kaggle/input, /kaggle/working]: print(p, exists:, os.path.exists(p))这段东西看着简陋但它一次性回答了几个高频问题卡有没有起来、是不是双卡、工作目录还剩多少空间、挂载的数据集在不在。尤其是磁盘那一行二十 GB 的输出上限在做图像任务时很容易撞到早看到剩余量你才会想起去清理中间文件。3.3 依赖安装与持久化技巧需要额外装库的时候联网状态下直接pip install就行但有两个细节第一安装位置。默认装到系统目录会话结束就没了。如果这个库每次都得装把它装到/kaggle/working/lib下然后在代码里把这个路径插进sys.path下次 Commit 引用了上一次的输出库就跟着回来了。pip install --target/kaggle/working/lib some-packageimport sys sys.path.insert(0, /kaggle/working/lib) import some_package第二版本锁定。pip install xxx不带版本号今天能跑明天可能就崩尤其是在这种每次都是全新环境的场合。养成写死版本的习惯或者把整个pip freeze的输出存到 working 目录里下次照着装。提示装库是网络 IO 密集型操作非常消耗时间。如果一次 Commit 里装库要花五分钟而你计划跑二十次实验那就是一百分钟的纯浪费。这种情况下更划算的是把依赖做成一个私有数据集挂载后直接pip install --no-index --find-links离线安装几秒钟搞定。4. 后台长跑Save Version 才是核心玩法这是我用 Kaggle 最看重的一点也是它和 Colab 拉开差距的地方。交互式页面只是开发工具真正干活的是 Save Version。4.1 Commit 模式和交互模式的区别交互模式下你手动执行 cell状态存在内存里页面关掉会话就可能没。Commit 模式下平台会从第一个 cell 开始顺序执行到最后一个 cell中途不需要你在场。执行完成后/kaggle/working的内容作为这次运行的输出保存下来你可以下载、可以让别的 notebook 引用。这个机制带来几个非常实用的推论代码必须是从零可复现的。你不能依赖“我之前手动执行过某个 cell 所以变量存在”也不能依赖“我先cd到某个目录”。所有路径用绝对路径所有变量在脚本开头初始化所有随机种子显式设置。写完先在交互模式里做一次“Restart Run All”确认从头跑不出错再提交 Commit。执行顺序固定意味着不能有“我想中途改参数重跑后半段”这种操作。参数要提前抽成常量放在顶部或者用环境变量、配置文件的方式注入。我一般的做法是把配置写在第一个 cell后面所有代码只读这个配置改实验就改那一个 cell。Commit 是消耗配额的而且提交后不一定立刻开始跑可能排队。所以提交前把该做的自检做完别拿 Commit 当调试工具那是最贵的调试方式。4.2 用 CLI 在本地写代码、远程跑训练在网页编辑框里写几百行代码是折磨。真正的用法是本地用你熟悉的编辑器写.py然后通过 API 推上去跑。流程大致是这样先在账号设置里生成 API token下载kaggle.json放到本地的~/.kaggle/目录并收紧权限mkdir -p ~/.kaggle mv kaggle.json ~/.kaggle/ chmod 600 ~/.kaggle/kaggle.json pip install kaggle然后准备一个提交目录里面至少有两个文件你的代码文件和一个描述运行配置的元数据文件。{ id: your-account/your-kernel-name, title: your-kernel-name, code_file: train.py, language: python, kernel_type: script, is_private: true, enable_gpu: true, enable_internet: true, dataset_sources: [your-account/your-dataset], competition_sources: [], kernel_sources: [] }几个字段值得单独说。code_file指向你的脚本kernel_type设成script表示按脚本方式执行不按 notebook 的 cell 结构。enable_gpu决定这次运行拿不拿显卡注意它同时决定了配额从哪个池子里扣。dataset_sources是你挂载的数据集写全名格式是“账号名/数据集名”。kernel_sources可以引用别人或自己之前发布的 notebook 输出这是做断点续训的关键手段。推上去之后用两条命令管住它kaggle kernels push -p ./my-experiment kaggle kernels status your-account/your-kernel-name输出文件拉回本地kaggle kernels output your-account/your-kernel-name -p ./outputs这套流程跑顺之后你的开发体验就变成本地写代码、本地跑小样本验证、一键推送远程训练、关电脑、回来拉结果。这比在浏览器里跟断线提示搏斗舒服太多。4.3 输出管理与二十 GB 的限制/kaggle/working有容量上限量级在二十 GB。做图像、音频、视频任务时中间产物极其容易把这块塞满然后你会看到莫名其妙的写入失败。几个管理习惯训练脚本里对 checkpoint 做滚动覆盖只保留最近 N 个和最好的一个别每个 epoch 都存一份新的。数据集解压、格式转换这类中间步骤产生的文件用完立刻删。日志文件别无限追加按需截断。输出里凡是能从输入重新算出来的东西都不该占着配额。还有一点Commit 会把/kaggle/working整体打包成输出如果目录里塞了十几个 GB 的临时文件打包和传输都会很慢有些情况下还会超时。跑完训练记得在最后一个 cell 里做一次清理这不算讲究是必要步骤。5. 提速与省额度的实战技巧配额是有限的训练是慢的这两件事凑在一起就会逼着你想办法把每一分钟算力都用在真正的计算上而不是用在下载、解压、装库、重启这些杂事上。下面这些是我反复优化出来的习惯。5.1 把数据集和模型权重变成“本地资产”Kaggle 的数据集机制是这个平台最被低估的功能。你可以把自己的数据包括预训练权重、离线 wheel 包、字典文件、分词器打包上传成私有数据集之后在任何 notebook 里挂载到/kaggle/input只读、秒级可用、不占你的训练时间。我的做法是把“环境资产”和“训练数据”分开一个数据集专门放依赖包和预训练权重几 GB 那种下载一次能用很久另一个放业务数据。这样换项目的时候环境资产不用重新准备。模型权重的处理尤其值得说。HuggingFace 那套东西默认往~/.cache/huggingface里写这个目录不持久。如果不做处理每次 Commit 都要重新下载几个 GB网络一慢半小时就没了而这段时间你还在烧配额。正确做法有两条路一是把权重提前下载好上传成数据集二是在跑完之后把缓存目录整个 copy 到/kaggle/working作为输出保存下次运行用kernel_sources引用。第二条路适合权重会变的场景第一条路适合固定权重的离线实验。5.2 显存不够时的三种降级方案十六 GB 显存跑现代模型经常不够。我不建议一上来就换双卡先按顺序试这三招成本最低的先上第一招梯度累积。把 batch size 砍到原来的四分之一optimizer.step()每四次才执行一次梯度在 backward 里累加。这样显存占用降下来等效 batch 不变代价是训练速度慢一些但数学上基本等价。代码改动很小accum_steps 4 for i, batch in enumerate(loader): loss model(batch) / accum_steps loss.backward() if (i 1) % accum_steps 0: optimizer.step() optimizer.zero_grad()第二招混合精度。T4 上有 Tensor Coretorch.cuda.amp开起来通常能省掉将近一半的显存激活值用 FP16 存同时还能提速。配合GradScaler处理梯度下溢几行代码的事。第三招梯度检查点。用时间换空间把中间激活值的前向结果丢掉、反向时重算显存能降不少代价是训练变慢百分之二三十。对那种“模型能放下但激活放不下”的情况特别有效。这三招叠完还放不下再考虑双卡数据并行或者上更小的模型/更短的序列。别硬扛免费额度经不起 OOM 反复重启的消耗。5.3 断点续训与配额保护单次会话最多撑几个小时如果你的任务需要跑十小时唯一的办法是分段。分段的关键是把“训练状态”完整地存下来模型参数、优化器状态、学习率调度器状态、当前 epoch、随机数状态。少存一样续训之后的结果就跟连续训练对不上。def save_ckpt(path, model, opt, sched, epoch, step): torch.save({ model: model.state_dict(), opt: opt.state_dict(), sched: sched.state_dict(), epoch: epoch, step: step, }, path)续训时把这几样原样读回来学习率调度和动量才不会乱。这个习惯不只是为了应对会话上限也是为了应对你在跑步中被各种意外打断——配额被别的事情消耗、平台维护、代码里一个没注意的异常。存了 checkpoint最坏情况也就是重跑一个 epoch。配额保护还有几条小经验训练前先跑一个极小的子集确认整条链路通数据加载、前向、反向、保存再上全量日志及时打印flush一下别等会话被掐了你连跑到哪都不知道把“还剩多少配额”当成一个需要主动查看的指标一周开始的时候看一眼后面安排实验心里才有底。6. 常见问题排查速查表下面这些是我被问得最多、或者自己撞得最狠的问题整理成对照表遇到了直接对号入座。6.1 报错与现象对照表现象大概率原因处理方式pip install报连接超时Internet 开关没开或账号未完成验证打开设置里的网络开关确认账号状态提交后状态一直排队资源紧张或配额已用尽看配额页剩余量换时间段再试跑到一半进程消失触发单次会话时长上限改用分段训练每段结束存 checkpoint存文件时报磁盘满/kaggle/working超过容量上限清理中间产物checkpoint 滚动覆盖挂载的数据集目录是空的路径写错或数据集未挂载到本次运行检查dataset_sources用ls /kaggle/input确认加载模型时报找不到权重上次会话的缓存目录没保存权重上传成数据集或把缓存复制到 working 保存断言双卡但只有一个卡在用代码未做数据并行或设备索引写死检查DataParallel包装与设备指定输出下载很慢或失败输出体积过大精简输出只保留必要产物6.2 几条只有踩过才知道的经验别在 GPU 会话里做数据预处理。解压、转换格式、算统计量这些活完全不碰显卡放在 GPU 会话里做就是纯浪费配额。预处理要么提前在本地做完上传成数据集要么在 CPU 会话里做。Commit 前先 “Restart Run All”。交互模式下你可能是跳着执行 cell 的变量状态和从头跑完全不是一回事。我吃过这个亏本地验证没问题提交上去第一分钟就因为某个变量只在第三个 cell 里定义过而崩了配额照扣。路径一律写绝对路径。Commit 执行的工作目录和你交互时不一定一致./data/train.csv这种相对路径在两种模式下表现可能不同。/kaggle/input/xxx/...和/kaggle/working/...写全省心。别把 secret 写死在代码里。notebook 提交后可能变成公开的取决于你的可见性设置API key、token 这类东西用平台提供的 secrets 机制注入别直接贴代码里。双卡不是免费的加速。我试过在一个小模型上开双卡结果比单卡还慢因为每一步都要同步梯度通信开销比计算本身还大。判断标准前面说过单步计算量足够大、数据加载不成为瓶颈时双卡才有意义。留意会话的“空闲回收”。交互式会话长时间不操作会被判定为空闲可能被自动关闭。你在本地写代码、准备粘进去的时候注意别让会话在那儿晾太久白白消耗配额。版本化你的实验。每次 Commit 都是一个版本标题里写清楚这版改了什么比如“bs64-lr3e4-amp”过两周回头看才分得清哪个是哪次。这个习惯看着无关紧要等你同时跑五六个变体的时候就知道了。最后分享一个我自己常用的节奏周初把这一周要跑的实验列出来估一个总时长控制在配额的两三成留出余量应付重跑每个实验先在 CPU 上跑通一个几十条样本的子集确认不报错然后按优先级依次提交 Commit跑完一个看一个结果觉得方向不对立刻停掉后面的。这套流程不复杂但它把“算力”当成了需要规划的资源而不是随取随用的自来水。习惯这么用之后免费额度其实比想象中经用得多。
阅读完成 · 觉得有帮助?
咨询建站