VS Code Remote Tunnels 本地调试 Kaggle GPU 环境 - VS Code 指南 02

前言

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

基于此,稍微倒腾研究了一下,如何在本地VS-Code连接Kaggle的算力资源来进行开发。这里介绍使用VS Code官方提供的 Remote Tunnels方案。如果需要先了解 Kaggle 账号注册、双 T4 GPU 算力配置与数据集持久化,可参考前序文章 Kaggle 云端环境上手指南


1. 方案对比:为什么选择 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

# 1. 下载 VS Code CLI (Linux x64)
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("下载完成。")

# 2. 定义后台保活心跳逻辑
def heartbeat():
"""
每隔 10 分钟向 stderr 写入一次心跳信息并进行微量计算,
防止 Kaggle Kernel 判定为闲置。
"""
while True:
current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 使用 stderr 避免干扰控制台的主逻辑显示
sys.stderr.write(f"\n[Heartbeat] 节点活跃中 - {current_time}\n")
sys.stderr.flush()

# 极轻微的计算占用
_ = [i**2 for i in range(100)]

time.sleep(600) # 每 10 分钟心跳一次

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

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

# 使用 os.system 保持进程前台运行
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*
# 然后手动杀掉对应的 PID
kill -9 <PID>

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