惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
N
Netflix TechBlog - Medium
GbyAI
GbyAI
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
T
Tailwind CSS Blog
IT之家
IT之家
博客园 - Franky
雷峰网
雷峰网
博客园 - 聂微东
腾讯CDC
M
MIT News - Artificial intelligence
B
Blog RSS Feed
博客园_首页
罗磊的独立博客
S
SegmentFault 最新的问题
I
InfoQ
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
D
Docker
宝玉的分享
宝玉的分享
B
Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

阿尔的代码屋 | 全栈技术笔记

VoxCPM2 多语言语音合成与声音克隆本地部署 | 阿尔的代码屋 MiniMax-H3 NF4 视音频联合生成模型本地部署与调试 | 阿尔的代码屋 ShareX 联动 Antigravity 自动化记录与跨环境管道构建 | 阿尔的代码屋 国内搜索引擎收录实战:百度与头条搜索接入、无备案验证绕行与自动化推送 - 独立博客 SEO 与 GEO 03 | 阿尔的代码屋 技术博客工程化治理与 WebP 自动化质量门禁 - Hexo 博客建站与优化实战 05 | 阿尔的代码屋 Hexo NexT 静态资源本地自托管、KaTeX 公式渲染与移动端适配 - Hexo 博客建站与优化实战 04 | 排坑笔记 | 阿尔的代码屋 把 VS Code 打造成 Git 终极编辑器、Diff 与 Merge 利器 - Git 避坑与工作流 04 | 排坑笔记 | 阿尔的代码屋 告别架构图看不清:Hexo NexT 8.x 本地化集成 Fancybox 5 高清灯箱实战 | 开发日志 | 阿尔的代码屋 Hexo new 日期无法自动生成且出现 object Object 报错根治 | 排坑笔记 | 阿尔的代码屋 IndexNow 毫秒级主动推送与全站语义拓扑网格 - 独立博客 SEO 与 GEO 02 | 架构实战 | 阿尔的代码屋 从拦截 AI 爬虫到成为大模型答案源 - 独立博客 SEO 与 GEO 01 | 架构实战 | 阿尔的代码屋 Chrome 扩展开发与上架全流程实战避坑 - 开发技巧 | 阿尔的代码屋 VS Code 终端日志被截断?两项配置彻底解锁完整输出与会话持久化 | 排坑笔记 | 阿尔的代码屋 在 WSL2 环境下部署 Pixal3D 的从零实战与全流程排雷日志 | 阿尔的代码屋 在 Android Termux 环境下安装 Hermes Agent 的踩坑与完美解决实践 开发日志| 阿尔的代码屋 VS Code 连接 WSL 精确每 10 分钟掉线 排坑笔记 | 阿尔的代码屋 Android 模拟器代理联网与 No Internet WiFi 锁死排坑笔记 | 阿尔的代码屋 [object Object] Flutter 本地通知实现排坑实录 - Android inexactAllowWhileIdle 调度策略与测试方案全解析 | 阿尔的代码屋 typing_extensions 有用(四):使用 TypeIs 替代危险的 cast,做最严谨的类型收窄 | 阿尔的代码屋 GoRouter 结合 Isar 运行 Widget 测试并发/粘性线程死锁卡死排坑笔记 | 阿尔的代码屋 typing_extensions 有用(三):使用 Unpack 结合 TypedDict 给 **kwargs 装上透视眼 | 阿尔的代码屋 typing_extensions 有用(二):使用 @override 打造重构代码时的“防呆神器” | 阿尔的代码屋 Flutter 并发测试踩坑实录 - IsarCore 动态库下载冲突与 Widget 测试 HTTP 拦截全链路解决 | 阿尔的代码屋 typing_extensions 有用(一):使用 Self 终结继承时的类型推断灾难 | 阿尔的代码屋 基于 Cloudflare Pages 的纯前端 WebAssembly 应用自动化部署实践 | 开发日志 | 阿尔的代码屋 基于 VS Code 远程开发的 GPU Docker 容器自动清理方案实践 开发日志| 阿尔的代码屋 Patrol iOS 集成测试排坑实录 - xcodebuild exit code 70 全链路解决 | 阿尔的代码屋 Flutter E2E 测试从 integration_test 迁移到 Patrol - 实践笔记 | 阿尔的代码屋 Linux/macOS 下 micromamba 报错 Shard Index not available 与极度卡顿 排坑笔记 | 阿尔的代码屋
VS Code Remote Tunnels本地连接调试Kaggle GPU - 开发技巧| ...
Algieba · 2026-04-08 · via 阿尔的代码屋 | 全栈技术笔记

核心摘要 (TL;DR)

  • 痛点解决:彻底告别 Kaggle 网页版 Notebook 糟糕的补全、延迟和难以管理的依赖。
  • 核心方案:采用 VS Code 官方的 Remote Tunnels(远程隧道)技术,无需内网穿透工具,原生接入。
  • 实战流程:Kaggle 开启 Internet -> 运行 VS Code CLI 脚本 -> GitHub 授权 -> 本地一键连接。

前言

平时使用Kaggle来进行开发,稍微小一点的学习项目还是可以轻松搞定的,但是涉及到复杂一点的debug,Kaggle自带的网页端Jupyter Notebook界面就不好用了,没办法自动补全,没办法断点调试,也没法用习惯的vscode插件,也没法做多文件管理。

基于此,稍微倒腾研究了一下,如何在本地VS-Code连接Kaggle的算力资源来进行开发。这里介绍使用VS Code官方提供的 Remote Tunnels方案。


在开始动手前,我们先看看目前市面上几种主流的连接方案:

方案复杂度稳定性评价
Kaggle 网页版零配置一般工程级别代码写起来折磨。
SSH + Ngrok需要第三方工具,且配置繁琐。
Remote Tunnels官方原生支持,通过 GitHub 账号绑定,安全且稳定。

2. Kaggle 端配置

首先,我们需要在 Kaggle 的服务器上把隧道“打通”。

2.1 环境检查

打开你的 Kaggle Notebook,在右侧的 Settings 面板中务必检查两项:

  • Internet on: 必须开启(用于下载 VS Code CLI 并建立外网连接)。
  • Accelerator: 选择 GPU T4 x2GPU P100

2.2 运行启动脚本

在新的Code Cell中运行以下下载VS Code CLI,以及启动Tunnels的脚本。

运行脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import os
import subprocess
import threading
import time
import sys


if not os.path.exists('code'):
print("正在下载 VS Code CLI...")
subprocess.run("curl -Lk '[https://code.visualstudio.com/sha/download?build=stable&os=cli-alpine-x64](https://code.visualstudio.com/sha/download?build=stable&os=cli-alpine-x64)' --output vscode_cli.tar.gz", shell=True)
subprocess.run("tar -xf vscode_cli.tar.gz", shell=True)
subprocess.run("rm vscode_cli.tar.gz", shell=True)
print("下载完成。")


def heartbeat():
"""
每隔 10 分钟向 stderr 写入一次心跳信息并进行微量计算,
防止 Kaggle Kernel 判定为闲置。
"""
while True:
current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

sys.stderr.write(f"\n[Heartbeat] 节点活跃中 - {current_time}\n")
sys.stderr.flush()


_ = [i**2 for i in range(100)]

time.sleep(600)


t = threading.Thread(target=heartbeat, daemon=True)
t.start()
print("后台保活心跳已启动。")


print("正在启动 VS Code Tunnel...")
print("请关注下方输出,访问 [github.com/login/device](https://github.com/login/device) 并输入 8 位验证码。")


os.system("./code tunnel --accept-server-license-terms --name kaggle-gpu-node")

2.3 完成身份验证

运行后,观察输出日志。你会看到类似这样的一行:
To grant access to the server, please log into https://github.com/login/device and use code XXXX-XXXX

  1. 点击链接,输入输出结果中的 8 位验证码
  2. 授权成功后,Kaggle 终端会输出连接成功的消息。

3. 第二步:本地 VS Code 的“空降”连接

现在,回到你自己的电脑前。

  1. 安装插件:打开本地 VS Code,搜索并安装插件 Remote - Tunnels (由 Microsoft 开发)。
  2. 账号登录:点击 VS Code 左下角的“账户”图标,确保登录的是刚才授权验证码的那个 GitHub 账号。
  3. 连接隧道
    • 点击左下角的 蓝色远程图标(两个大于/小于号)。
    • 选择 Connect to Tunnel
    • 在列表中选择你刚才命名的 kaggle-gpu-node

4. 关键避坑指南

4.1 保持页面活跃

这是最核心的一点:Kaggle 网页版必须保持开启状态
虽然脚本里面写了心跳机制去保活,但还是要注意以下几点

  • 标签页置顶:尽量不最小化Kaggle标签页。
  • 控制心跳频率:Kaggle后台有审计,不能把心跳频率设置得过高,比如1秒1次。10分钟1次是一个合理的值。

4.2 持久化存储

  • 项目代码:请务必在 /kaggle/working 目录下创建你的项目。只有这个目录下的内容在 Session 存续期间是相对安全的。
  • 环境安装:由于每次启动 Session 都是全新的镜像,建议将环境依赖写成 requirements.txt,或者用uv来进行项目管理。连接上 VS Code 后,直接在内置终端里执行 pip install或者uv sync

4.3 GPU 状态检查

进入 VS Code 远程环境后,打开终端(Ctrl + `),输入以下命令确认算力就绪:

1
nvidia-smi

5. 常见问题 (Q&A)

Q1: 为什么我的 VS Code 连不上,一直卡在 Connecting?
A: 请按以下顺序排查:

  • Internet 开关:检查 Kaggle Settings 的 Internet 是否为 On。
  • GitHub 账号一致性:确保你授权验证码的账号与本地 VS Code 登录的账号是同一个。
  • CLI 版本:如果你手动修改了脚本,请确保下载的是 linux-x64 的 CLI 版本。

Q2: 我可以在 VS Code 里直接打开多个文件夹吗?
A: 可以。隧道建立的是“机器级”的连接。连接成功后,你可以通过 File -> Open Folder 切换到 /kaggle/working 或根目录下的任何位置。

Q3: 这种方式会消耗 Kaggle 的 GPU 额度吗?
A: 会。 只要你的交互式 Session 处于 Running 状态且开启了 Accelerator,就会扣除周度配额。注意: 当你完成调试时,务必点击 Kaggle 网页端的 Stop Session,仅仅关闭本地 VS Code 不会停止计费。

Q4: 为什么我每次重连,VS Code 都要重新安装 Python 插件?
A: 这是因为 Kaggle 的系统盘(根目录 /)是非持久化的。每次 Session 重启,VS Code Server 组件都会丢失。建议开启 VS Code 的 Settings Sync,让其在连入后自动后台安装插件。

Q5: 我在根目录下安装的库,断开重连后找不到了?
A: 重点! 只有 /kaggle/working 目录在同一个 Session 内是相对持久的。建议在 /kaggle/working 下使用 uv 创建虚拟环境 .venv,这样即便断连,只要你没 Stop Session,环境就依然在。

Q6: 远程调试时 GPU 显存溢出(OOM)了怎么办?
A: 隧道不会自动感知显存回收。如果脚本崩溃但显存没释放,请在 VS Code 终端执行:

1
2
3
fuser -v /dev/nvidia*

kill -9 <PID>

Q7: Kaggle 的 Session 时长限制怎么办?
A: 这是一个硬限制(通常为 12 小时)。即使有保活脚本,Kaggle 也会强行关闭。建议在 VS Code 中完成代码调试后,通过 Save Version 提交后台任务进行长时间训练。