Google Colab CLI 发布:本地终端一键连远程 GPU,训练日志怎么安全分享给同事?
本地电脑没有独显,训练脚本又不能一直靠截图汇报进度,这种场景太常见了:代码在你机器上,算力在云端,同事只想看一眼日志、评估结果或者下载一个临时产物。
Google Colab CLI 这次正好切到这个痛点。它把 Colab 从“打开浏览器跑 Notebook”,往“本地终端触发远程运行时”推进了一步。对做 AI 工程化、自动化实验、脚本化评测的人来说,这比单纯多一个命令行工具更有意思。
这篇不写视觉 Demo,也不写 Gradio 展示页。前一篇 YOLOv8/Gradio 更偏“本地 Demo 怎么给外网看”;本文关注的是另一条链路:本地终端/AI Agent 调 Colab 远程算力跑任务,再把本地整理好的日志和产物用 cpolar 临时分享给同事看。
划重点:Colab 的 GPU、TPU、计算单元、运行时规格,按账号和套餐实际可用资源为准。本文只讲工作流,不承诺免费 GPU 稳定可用,也不把 Colab 当长期生产训练平台。
1 为什么这次 Colab CLI 值得看?
Google 官方仓库googlecolab/google-colab-cli的 README 写得很直接:这是一个 Google Colab 的命令行界面,可以从终端申请 CPU、GPU、TPU 运行时,执行本地 Python 脚本或 Notebook,管理远程文件,并把自动化流水线串起来。
截至 2026-06-06 下午,火眼记录到该 GitHub 仓库为 94 stars、11 forks,仓库更新时间为2026-06-06T05:34:01Z。这个数字还不算夸张,但它踩中的方向很清晰:AI 工程化正在从“手动点页面”转向“脚本化调度”。
对 CSDN 上常见的机器学习实践用户来说,它解决的不是“会不会训练模型”的问题,而是这些更日常的麻烦:
- 本地电脑没有 GPU,完整训练跑不动;
- Colab 页面能跑,但流程难塞进脚本和 Agent;
- 训练日志、评估结果、模型文件散在不同地方;
- 同事要看结果时,不想登录你的 Colab,也不该拿到你的账号凭据;
- 临时产物要分享,但项目根目录、
.env、token、数据集不能一起暴露出去。
这篇文章里,Colab CLI 负责“远程执行和取回产物”;cpolar 负责“把本地只读预览服务生成临时 HTTPS 地址”。两者分工清楚,安全边界也更容易画出来。
2 环境准备:把本地终端和预览目录先整理好
Google Colab CLI 官方 README 当前注明:平台支持 Linux 和 macOS,Windows 暂不支持。Windows 用户建议在支持的环境里操作,或者以官方仓库后续说明为准。
本地需要准备这些东西:
- Python 环境;
uv或pip;- 可登录 Google/Colab 的账号环境;
- 一个专门放日志和产物的目录;
- cpolar 客户端,用来分享本地预览服务。
这里别急着把整个项目目录拿去暴露。建议一开始就建一个干净目录,只放同事能看的内容:
mkdir -p colab-share-demo/{scripts,share/logs,share/artifacts} cd colab-share-demo目录含义很简单:
colab-share-demo/ ├── scripts/ # 本地脚本,提交给 Colab CLI 执行 └── share/ ├── logs/ # 训练日志、评估日志 └── artifacts/ # 可分享的结果文件、图表、小模型文件提醒一句:share/不要放.env、Colab 凭据、Notebook token、原始私有数据集、客户数据和未授权模型权重。分享目录越小,后面排错越轻松,风险也越低。
3 安装 Google Colab CLI:命令按官方 README 走
官方 README 给了两种安装方式,推荐使用uv:
uv tool install google-colab-cli没有使用uv的环境,也可以用pip:
pip install google-colab-cli安装后先看版本和帮助信息,确认命令已经进到 PATH:
colab version colab --help如果终端提示colab: command not found,先检查 Python 工具安装路径是否已经加入 PATH。不要直接换一堆命令乱试,先把当前 shell 能不能找到colab这件事解决掉。
我建议把 Colab CLI 装在一个干净的开发环境里,不要和生产项目的虚拟环境混在一起。原因很简单:CLI 是用来调度远程运行时的工具,它不应该反过来污染你的业务依赖。后面真正要安装到 Colab VM 里的包,用colab install或训练脚本自己的依赖文件处理,更清楚。
官方 README 还提醒,具体参数、默认值和详细帮助以命令输出为准:
colab <command> --help本文给的是一套工作流骨架。CLI 刚发布,命令细节、认证流程、平台支持范围都应以官方仓库 README 和--help输出为准。
4 登录与申请运行时:不要把 GPU 写成“默认有”
Colab CLI 支持创建运行时会话。README 示例里,CPU 会话可以这样申请:
colab new申请指定名字的会话:
colab new -s trainer申请 GPU 运行时的命令形态如下:
colab new -s trainer --gpu T4README 中列出的 GPU 类型包括 T4、L4、G4、H100、A100,TPU 示例包括 v5e1、v6e1。这里要说清楚:能否申请到某个规格,按账号、套餐、地区、计算单元和 Colab 后端实际分配为准。
创建后查看状态:
colab status -s trainer会话用完要释放:
colab stop -s trainer这一步不是走形式。远程运行时一直开着会占用资源,也会让后续实验状态变得混乱。训练结束、日志取回、产物下载完成后,及时停止会话更稳妥。
如果只想跑一次脚本,README 提供了colab run这种更省心的模式:它会申请新 VM、执行本地脚本、取回输出文件并释放运行时。
colab run --gpu T4 scripts/train_demo.py如果你希望执行结束后保留运行时用于排查,可以加--keep:
colab run --gpu T4 --keep scripts/train_demo.py这里建议日常实验优先用短任务方式。需要排错时再保留会话,不要为了图省事一直挂着。
5 写一个可落地脚本:远程跑任务,本地留日志和产物
为了避免把文章写成“命令展示柜”,这里做一个轻量训练/数据处理脚本。它不依赖私有数据,也不要求真的训练大模型,重点是演示日志和产物如何组织。
新建scripts/train_demo.py:
from pathlib import Path from datetime import datetime import json import random root = Path("share") log_dir = root / "logs" artifact_dir = root / "artifacts" log_dir.mkdir(parents=True, exist_ok=True) artifact_dir.mkdir(parents=True, exist_ok=True) run_id = datetime.now().strftime("%Y%m%d-%H%M%S") log_path = log_dir / f"train-{run_id}.log" metrics_path = artifact_dir / f"metrics-{run_id}.json" loss = 1.0 lines = [] for epoch in range(1, 6): loss = round(loss * random.uniform(0.72, 0.9), 4) acc = round(1 - loss / 2, 4) line = f"epoch={epoch} loss={loss} acc={acc}" print(line) lines.append(line) log_path.write_text("\n".join(lines) + "\n", encoding="utf-8") metrics_path.write_text( json.dumps( { "run_id": run_id, "epochs": 5, "final_loss": loss, "note": "demo metrics for Colab CLI workflow", }, ensure_ascii=False, indent=2, ), encoding="utf-8", ) print(f"log saved to {log_path}") print(f"metrics saved to {metrics_path}")本地先跑一遍,确认脚本本身没问题:
python scripts/train_demo.py ls -R share能看到类似文件即可:
share/ ├── artifacts/ │ └── metrics-20260606-141500.json └── logs/ └── train-20260606-141500.log这里的share/是本地预览目录。实际接 Colab CLI 时,有两种常见做法。
5.1 用 colab exec 跑已有会话
已经创建了trainer会话时,可以执行本地脚本:
colab exec -s trainer -f scripts/train_demo.pyREADME 说明,colab exec -f file.py会读取本地文件内容并传到远程 kernel 执行,不需要手动提前上传脚本。
如果远程生成了文件,需要用远程路径下载回来。README 给出的文件下载命令形态是:
colab download -s trainer REMOTE LOCAL实际项目里,远程路径要按脚本运行目录和输出位置确认。建议训练脚本把输出集中到一个固定目录,下载时别从远程根目录乱拉。
5.2 用 colab run 跑一次性任务
只跑一次的场景,可以直接用:
colab run --gpu T4 scripts/train_demo.py如果要把参数传给脚本,README 写明colab run [--gpu GPU] [--tpu TPU] [--keep] SCRIPT [ARGS...]支持转发参数。例如:
colab run --gpu T4 scripts/train_demo.py --epochs 5上面的 demo 脚本没有解析--epochs,真实项目里可以用argparse接参数。别把所有实验配置写死在脚本里,后面复现实验会很痛苦。
到这里,远程算力这半条链路已经清楚了:本地发起、Colab 执行、日志和产物回到本地可控目录。下面要解决的是同事怎么看。
实操时我更推荐把每次运行都拆成一个run_id目录,例如:
share/ └── runs/ └── 20260606-141500/ ├── train.log ├── metrics.json └── README.mdREADME.md里只写三类信息:这次跑的脚本名、关键参数、产物说明。不要把完整命令历史、账号路径、内部数据路径一股脑贴进去。同事看结果时,最需要的是“这份日志对应哪次实验”,不是你的整台机器发生了什么。
还有一个小习惯很有用:日志文件名里带时间,产物文件名里带用途。比如train-20260606-141500.log、metrics-baseline.json、sample-predictions.csv。等你一天跑十几次实验时,这个命名习惯能少掉很多沟通成本。
6 本地启动只读预览服务:只暴露 share,不暴露项目根目录
分享日志最简单的方式,是在share/目录启动一个静态文件服务:
cd share python -m http.server 8000 --bind 127.0.0.1这个命令只监听本机127.0.0.1:8000,外部机器不能直接访问。先在本机浏览器打开:
http://127.0.0.1:8000能看到logs/和artifacts/两个目录,就说明预览服务没问题。
为什么一定要在share/目录启动?因为 Python 的http.server会把当前目录作为文件根目录。你在项目根目录启动,它就会把更多文件放到索引里;如果项目里有.env、配置文件、临时数据,这一步就踩雷了。
如果你不想展示目录索引,可以用一个更克制的 FastAPI 页面,只列出允许展示的文件。新建preview_app.py:
from pathlib import Path from fastapi import FastAPI, HTTPException from fastapi.responses import FileResponse, HTMLResponse BASE_DIR = Path("share").resolve() app = FastAPI() @app.get("/preview", response_class=HTMLResponse) def preview(): items = [] for path in sorted(BASE_DIR.rglob("*")): if path.is_file(): rel = path.relative_to(BASE_DIR).as_posix() items.append(f'<li><a href="/files/{rel}">{rel}</a></li>') return "<h1>Colab logs and artifacts</h1><ul>" + "".join(items) + "</ul>" @app.get("/files/{file_path:path}") def files(file_path: str): target = (BASE_DIR / file_path).resolve() if not str(target).startswith(str(BASE_DIR)) or not target.is_file(): raise HTTPException(status_code=404, detail="file not found") return FileResponse(target)安装并启动:
pip install fastapi uvicorn uvicorn preview_app:app --host 127.0.0.1 --port 8000本机打开:
http://127.0.0.1:8000/preview如果页面空白,先检查share/logs和share/artifacts里有没有文件;如果 404,检查链接路径有没有手动改错。
两种预览方式怎么选?低敏日志、临时 JSON、几张评估图,用python -m http.server已经够快;需要隐藏目录索引、只展示指定文件、加一个简单口令,就用 FastAPI。不要为了一个临时链接把系统做复杂,越复杂越容易在权限和路径上出错。
7 用 cpolar 生成临时 HTTPS 地址给同事看
本地服务只在127.0.0.1:8000,同事访问不到。这里让 cpolar 出场,把这个本地端口映射成一个临时公网 HTTPS 地址。
macOS 安装 cpolar 的官方口径是 Homebrew:
brew tap probezy/core && brew install cpolarLinux / 树莓派 / 支持 systemd 的新式 Linux,官方一键安装脚本如下:
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash安装后可以打开本地 Web UI:
http://127.0.0.1:9200有图形界面的环境,通常可以在 Web UI 登录完成账号绑定;纯命令行环境或自动写入失败时,也可以手动绑定 authtoken:
cpolar authtoken xxxxx把xxxxx换成你在 cpolar 后台拿到的 authtoken。不要把这串 token 写进文章、仓库、截图和聊天记录。
确认本地预览服务已经在 8000 端口运行后,开 HTTP 隧道:
cpolar http 8000命令输出里会出现公网访问地址。也可以进入本地 Web UI,在“状态 → 在线隧道列表”里查看已经生成的公网地址。
把 HTTPS 地址发给同事前,自己先用无痕窗口打开一次。能看到logs/、artifacts/或/preview页面,再发出去。
如果 cpolar 地址打开后没反应,按这个顺序查,别上来就怀疑隧道:
- 本机访问
http://127.0.0.1:8000是否正常; - cpolar Web UI 的“状态 → 在线隧道列表”里,8000 端口是否在线;
- 预览服务是不是绑定在
127.0.0.1,端口有没有写错; - 本地终端是否已经把
python -m http.server或uvicorn停掉。
这几个点能排掉大部分临时分享问题。尤其是端口写错,肉眼看起来很低级,但实际协作时很常见。
免费套餐生成的是随机临时地址,24 小时内会变化。需要固定二级子域名时,按 cpolar 当前规则需要基础套餐或以上;自定义域名需要专业套餐或以上。本文这种临时协作场景,用随机地址做一次性预览更合适,任务结束就关闭隧道。
8 安全边界:分享日志不是分享电脑
这类工作流最容易翻车的地方,不是命令跑不通,而是“顺手把不该看的东西一起暴露”。建议照着下面这几条做。
8.1 只暴露预览目录
只在share/下放可公开给同事看的内容。不要在项目根目录启动python -m http.server。
安全目录示例:
share/ ├── logs/ │ └── train-20260606-141500.log └── artifacts/ └── metrics-20260606-141500.json不要放这些内容:
.env、config.yaml、credentials.json;- Colab CLI 本地会话配置和 token;
- notebook token、数据库连接串、API Key;
- 未脱敏的数据集、客户样本、内部评测集;
- 没有明确授权范围的模型权重。
8.2 给预览地址加一道“弱隔离”
Pythonhttp.server没有鉴权,只建议用于短时、低敏的文件预览。如果内容有一点敏感,至少做两件事:
- 路径加随机段,例如
/preview-20260606-x7k9/; - 只在约定时间窗口打开,发完就关。
FastAPI 版可以加一个简单访问口令。下面是最小示例:
from fastapi import Header, HTTPException ACCESS_TOKEN = "change-this-preview-token" @app.middleware("http") async def check_token(request, call_next): if request.url.path.startswith("/files") or request.url.path == "/preview": token = request.headers.get("x-preview-token") if token != ACCESS_TOKEN: raise HTTPException(status_code=403, detail="forbidden") return await call_next(request)这不是企业级权限系统,只是临时预览的挡板。真正敏感的数据和权重,不要通过临时文件服务分享。
8.3 用完关闭运行时、服务和隧道
训练结束后,Colab 会话要停:
colab stop -s trainer本地预览服务按Ctrl+C结束。cpolar 前台隧道同样按Ctrl+C关闭。
如果是通过 cpolar Web UI 或后台服务配置的隧道,去“隧道管理”里停用对应隧道,再到“状态 → 在线隧道列表”确认已经不在线。
这个习惯很重要:日志分享是协作动作,不是长期开放服务。
9 这条链路可以放进 AI Agent 工作流
Colab CLI 的 README 明确提到,它面向开发者生产力、无头自动化和 AI Agent 集成。这个方向很容易做成半自动实验流程:
# 申请远程运行时 colab new -s trainer --gpu T4 # 安装依赖 colab install -s trainer torch transformers # 执行本地脚本 colab exec -s trainer -f scripts/train_demo.py # 导出执行日志 colab log -s trainer -o share/logs/execution_log.md # 下载远程产物 colab download -s trainer /content/checkpoints/model.bin share/artifacts/model.bin # 释放运行时 colab stop -s trainer上面这段更像真实项目骨架:Agent 负责按步骤触发命令,人负责确认资源、数据权限和输出结果。日志进入share/logs后,cpolar 再负责把预览地址给到同事。
如果训练的是大模型或业务数据,这里要再加一层人工确认:数据能不能上传到 Colab、模型权重能不能分享、日志里有没有样本内容或密钥。这些不是 CLI 能替你判断的。
10 三个容易踩坑的地方
这套流程看起来不复杂,但真正放到团队协作里,还是有几个坑要提前避开。
10.1 不要把 Colab 当成长期常驻服务器
Colab CLI 让终端调远程运行时更顺手,但 Colab 运行时仍然是按账号资源、会话状态和平台规则分配的计算环境。它更偏向实验、评测、短周期训练和自动化脚本,不能拿来承载长期在线服务。
如果任务需要连续跑很多天,或者要给多人稳定访问,就应该换成更明确的云服务器、训练平台或企业内部算力池。Colab CLI 在这里负责把“临时远程算力”接进本地工程流,不负责替代生产基础设施。
10.2 不要把分享链接当成权限系统
cpolar 生成的临时地址很好用,但链接本身不是完整权限系统。别人拿到地址,就能访问你暴露出来的服务。
所以分享前要做两件事:一是确认目录里只有可看的文件;二是控制打开时间。临时评审结束后,马上关闭本地服务和 cpolar 隧道。需要更严格的访问控制,就在 FastAPI 层加鉴权,或者把文件放到团队已有的权限系统里。
10.3 不要在日志里泄露样本和密钥
很多训练日志会顺手打印参数、路径、样本片段、报错堆栈。平时自己看没问题,一旦转成共享页面,就要重新检查。
建议在脚本里把敏感字段统一脱敏,例如 API Key 只显示前后几位,数据路径只显示数据集代号,样本内容不要直接写入公开日志。日志是给同事判断实验状态的,不是给大家复刻你的完整环境。
11 总结
现在这套流程已经跑通了:本地终端通过 Google Colab CLI 调用远程 Colab 运行时执行脚本,训练日志和产物整理到本地share/目录,再用 cpolar 把本地预览服务生成临时 HTTPS 地址给同事查看。它和本地 Gradio Demo 外网演示不是一回事,重点从“展示一个页面”变成了“远程算力 + 实验产物协作”。
关键步骤就三件事:
- 用 Colab CLI 创建会话、执行脚本、导出日志、下载产物,命令细节以官方 README 和
colab <command> --help为准; - 本地只启动
share/目录的预览服务,日志和 artifacts 分开放,不把项目根目录暴露出去; - 用 cpolar 给 8000 端口生成临时 HTTPS 地址,发给同事前自己先验一遍,用完关闭隧道和 Colab 运行时。
我觉得这类工具最值得用于“短任务、可复现、可交付”的实验场景:脚本在本地维护,算力按需申请,产物回到自己可控目录,分享时只开一个临时窗口。后续如果要扩展,可以把 FastAPI 预览页做成带筛选、带指标卡片、带下载记录的轻量面板,比在聊天里反复丢截图省事得多。
你更想看 Colab CLI 跑训练脚本、跑推理脚本,还是和本地 FastAPI 预览服务联动做一个完整实验面板?评论区直接说场景,我按真实工作流继续拆。
标签:Google Colab、AI工程化、cpolar、内网穿透、Python