【补充】远程连接学校服务器操作说明

【补充】远程连接学校服务器操作说明

【声明】文中的所有笨人仅指我自己!!!


jupyter1.lsf 不是 Jupyter Notebook 文件本身,而是一个 LSF 作业调度脚本文件(不是文件格式,只是一个脚本,用来调度系统进行作业),常见于 服务器 / 超算 / 集群环境

jupyter1.lsf 用来在计算集群上“申请资源并启动 Jupyter”的作业脚本.它通常用于 远程服务器上跑 Jupyter Notebook,而不是本地电脑。

.lsf,就像:“我申请用哪台机器、用多久、干什么活”。

文件后缀.lsf 是什么?

.lsfIBM Spectrum LSF(Load Sharing Facility) 的作业脚本后缀。

LSF 是一种 集群任务调度系统,作用是:

  • 管理多用户
  • 分配 GPU / CPU / 内存
  • 排队、调度、限制资源使用

不能直接“运行程序”,而是要 提交作业

jupyter1.lsf 一般在干嘛?

这种文件 99% 是用来:在集群节点上启动 Jupyter Notebook / Jupyter Lab

典型用途流程是:

  1. 笨人写好 jupyter1.lsf

  2. 用命令提交

    bsub < jupyter1.lsf
    
  3. 集群给笨人分配一个节点

  4. 在那个节点上启动 Jupyter

  5. 笨人通过端口转发在本地浏览器访问

什么是节点?

计算节点(Compute Node)是集群中被调度器分配资源专门用来执行用户作业的服务器。

不是笨人登录的那台,不是调度器,是被分配出来执行作业的服务器

一个典型 jupyter1.lsf 长什么样?

例子:一个常见结构(不用逐字对比,只看逻辑):

#!/bin/bash
#BSUB -J jupyter1
#BSUB -n 1
#BSUB -o %J.out
#BSUB -e %J.err
#BSUB -q gpu
#BSUB -m gpu04

set -euo pipefail

# 如果需要 module
# module load jupyterlab/4.0.3
source activate myenv   # 如果有虚拟环境

# 用 UID 派生端口(你原来的逻辑保留)
PORT=$(( $(id -u) + 10000 ))

# 用 FQDN 更稳(比 hostname -i 少踩坑)
HOST=$(hostname -f)

# 动态生成 token(避免日志长期泄露的固定 token)
TOKEN=$(python - <<'PY'
import secrets
print(secrets.token_hex(16))
PY
)

cat 1>&2 <<END

[JupyterLab]
Node:   ${HOST}
Port:   ${PORT}
Token:  ${TOKEN}

(Recommended) Create SSH tunnel from your laptop:
ssh -N -L ${PORT}:localhost:${PORT} <USER>@<LOGIN_NODE>

Then open in browser:
http://localhost:${PORT}/lab?token=${TOKEN}

END

# 监听所有地址更稳
jupyter lab \
  --no-browser \
  --ip=0.0.0.0 \
  --port=${PORT} \
  --ServerApp.token=${TOKEN} \
  --ServerApp.allow_origin='*'

命令 含义 注意
#BSUB -J jupyter1 -J = Job name
给作业起名字,方便 bjobs / bkill / bpeek
什么时候需要改
1. 同时跑多个作业(如 train_bert, eval, jupyter);
2. 用脚本批量提交时(避免重名)
#BSUB -n 1 -n = number of CPU cores
向调度器申请 1 个 CPU core
1. 即使笨人跑的是 GPU 作业,也 必须申请 CPU
2. Jupyter 本身 CPU 占用很低,1 就够;
3. 不写 -n → 默认 1(有时会被队列拒);
4. 写很大 → 无意义,还会排队更久
#BSUB -o %J.out 标准输出文件(stdout);
1. -o = output
2. %J = 作业 ID(如 123456
3. 实际文件名:123456.out
会进这个文件的内容:
1. echo ;
2. 程序的标准输出
3. Python print()
#BSUB -e %J.err 标准错误文件(stderr)
1. -e = error
2. 保存 错误输出 / warning / traceback
1. Jupyter 的启动信息、URL、token 报错 90% 都在这里
2. 排错第一件事:less %J.err
#BSUB -q gpu 1. -q = 指定作业队列
2. gpu 表示:
只在有 GPU 的节点排队 有 GPU 资源限制和调度策略
如果改成:
1. cpu → 没 GPU
2. gpu_long → 可能是长作业队列
3. debug → 很短但优先级高
#BSUB -m gpu04 1. -m = 指定在哪台机器上跑
这里是 强制绑定节点
1. 强烈提醒 这是高风险选项
如果 gpu04 忙 → 作业永远排不上
2. 日常不用
只在笨人明确知道这台机器是空的 / 有本地数据**时用
从这里开始下面的是Shell脚本
set -euo pipefail 严格模式:
1. -e:任一命令失败就退出
2. -u:使用未定义变量直接报错
3. -o pipefail:管道中任一失败都算失败
防止程序 “悄悄错”
PORT=$(( $(id -u) + 10000 )) 端口计算:
id -u:笨人的用户 UID(如 9001)
派 生端口:19001
1. 多人共享节点时避免端口冲突
2. 比手写端口安全得多
HOST=$(hostname -f) 1. 获取节点的 完整域名(FQDN)
2. 比 hostname -i 稳定(不容易拿到内网/IB IP)
获取节点地址
jupyter lab \<br/> --no-browser \<br/> --ip=0.0.0.0 \<br/> --port=${PORT} 1. --no-browser:不在服务器上开浏览器
2. --ip=0.0.0.0:监听所有网卡
3. --port:用笨人计算好的端口
LSF 到此为止
作业会一直“RUN”
直到笨人 Ctrl+C / bkill

. lsf.ipynb 的关系

文件 作用
.ipynb Notebook 内容(代码、结果)
.lsf 启动 Notebook 的“壳”
.sh 普通 shell 脚本
.slurm SLURM 调度系统脚本(和 LSF 类似)

.lsf 不包含笨人的实验代码,只是帮笨人“开机器”。

总结

LSF 只负责:

  • 排队
  • 分配节点
  • 记录 stdout / stderr

它不懂:

  • Jupyter
  • Python
  • GPU 训练逻辑

所以:

  • .lsf ≠ “配置文件”
  • .lsf = “笨人要什么资源 + 在节点上跑什么命令

.lsf / .bsub 文件 = 资源申请说明书(#BSUB)

  • 在计算节点上执行的 shell 脚本**

下面我让GPT画了一份 LSF 调度 → 节点 → Jupyter → SSH 隧道 的完整流程图:

┌────────────────────────────┐
│ ① 你在【登录节点】执行     │
│                              │
│   bsub < jupyter.lsf          │
│                              │
└──────────────┬─────────────┘
               │
               │ 解析 #BSUB 指令
               ▼
┌────────────────────────────┐
│ ② LSF 调度器(Master)      │
│                              │
│ - 读取 #BSUB -q gpu          │
│ - 读取 #BSUB -n 1            │
│ - 读取 #BSUB -m gpu04 (如有) │
│ - 决定是否可调度             │
│                              │
└──────────────┬─────────────┘
               │
       (排队 / 等资源)
               │
               ▼
┌────────────────────────────┐
│ ③ 分配计算节点(如 gpu04)  │
│                              │
│ - 锁定 CPU / GPU             │
│ - 创建作业运行环境           │
│ - 重定向 stdout → %J.out     │
│ - 重定向 stderr → %J.err     │
│                              │
└──────────────┬─────────────┘
               │
               │ 在【计算节点】上
               │ 执行脚本主体
               ▼
┌────────────────────────────┐
│ ④ 执行 jupyter.lsf 中的     │
│    shell 脚本部分            │
│                              │
│  - /bin/bash 解释            │
│  - 计算 PORT                 │
│  - 生成 TOKEN                │
│  - hostname -f → HOST        │
│                              │
└──────────────┬─────────────┘
               │
               │ 启动服务
               ▼
┌────────────────────────────┐
│ ⑤ 计算节点上启动 JupyterLab │
│                              │
│  jupyter lab                 │
│   --ip=0.0.0.0               │
│   --port=PORT                │
│   --token=TOKEN              │
│                              │
│  👉 此时状态:               │
│  Jupyter 正在 gpu04 上监听   │
│  gpu04:PORT                  │
│                              │
└──────────────┬─────────────┘
               │
               │ 但 ⚠️
               │ 外部无法直连
               ▼
┌────────────────────────────┐
│ ⑥ 网络现实(关键点)        │
│                              │
│ 你的笔记本 ❌ 不能直接访问  │
│ gpu04:PORT                   │
│                              │
│ 原因:                       │
│ - 计算节点无公网             │
│ - 防火墙阻断                 │
│ - 只允许 SSH                 │
│                              │
└──────────────┬─────────────┘
               │
               │ 你在【本地电脑】
               │ 手动打隧道
               ▼
┌────────────────────────────┐
│ ⑦ SSH 隧道建立(端口映射)  │
│                              │
│ ssh -N                       │
│   -L 本地PORT:localhost:PORT │
│   user@登录节点              │
│                              │
│ 效果等价于:                 │
│ localhost:PORT  ⇄ gpu04:PORT │
│                              │
└──────────────┬─────────────┘
               │
               │ 浏览器访问
               ▼
┌────────────────────────────┐
│ ⑧ 你在浏览器打开            │
│                              │
│ http://localhost:PORT        │
│   /lab?token=TOKEN           │
│                              │
│ → SSH 隧道                   │
│ → 计算节点 gpu04             │
│ → JupyterLab                 │
│                              │
└────────────────────────────┘

posted @ 2025-12-20 21:21  Seryn  阅读(0)  评论(0)    收藏  举报