Do1e

Do1e

github
email

CITE Lab 服务器使用指南

此文由 Mix Space 同步更新至 xLog
为获得最佳浏览体验,建议访问原始链接
https://www.do1e.cn/posts/citelab/server-help


Tip

此文档不定时更新,欢迎常回来看看了解最新动向。
点击右侧目录(移动端向上滚动,右小角按钮)跳转到感兴趣内容


连接和登录#

ssh 连接或者 vscode 下载 remote-ssh 插件,具体自行搜索

::: banner {warning}
2024.08.11 起,所有服务器将无法使用密码登录,分配新账号时请提供一个公钥
将公钥内容(ssh-xxx xxxxx)发给我
:::

创建密钥对:

# 尽量使用较长的key size保证安全性
ssh-keygen -t rsa -b 8192
# 更建议使用较新的加密算法
ssh-keygen -t ed25519

在 Linux/Mac 上默认保存在 ~/.ssh/id_rsa~/.ssh/id_ed25519 (私钥),~/.ssh/id_rsa.pub~/.ssh/id_ed25519.pub (公钥)
在 Windows 上默认保存在 C:\Users\[username]\.ssh 文件夹下,名称同上
公钥可公开,保存在服务器的 ~/.ssh/authorized_keys 文件中,每行一个公钥对应自己不同 PC 的私钥

::: banner {warning}
私钥保存好不能泄露,强烈不建议自己的所有 PC 使用同一个密钥!

参考链接:

  1. 在 Windows 上使用 TPM 安全地进行 SSH 密钥认证
  2. 南京大学提供的密码管理服务 Bitwarden
  3. Bitwarden 提供的 SSH 密钥托管
    :::

在自己电脑上可以配置~/.ssh/config 如下,这样可直接使用ssh s1命令连接服务器,较为方便

Host s1
  HostName s1.xxx.cn
  Port 22
  User xxx
  IdentityFile xxx/id_rsa

详细教程可见:VSCode 配置 SSH 连接远程服务器 + 免密连接教程

环境配置#

uv#

强烈建议使用 uv 针对项目管理环境,配置一次后便可在不同地方快速完成相同的环境配置,并且环境安装速度远大于 conda 和 pip。

相关教程: UV:Python 包管理神器 - 比 pip 快 100 倍

curl -LsSf https://astral.sh/uv/install.sh | sh # 安装 uv
uv init # 初始化当前项目
# 会生成五个文件 .gitignore, .python-version, main.py, pyproject.toml, README.md 并执行 git init
# 重点关注 pyproject.toml,该文件包含依赖,项目名等信息。.python-version 也不要动,其余文件根据需要自行删除或修改
uv python pin 3.12    # 指定python版本号
uv add "torch==2.1.0" # 类比 pip install
# 会生成一个最最最重要的文件 uv.lock,该文件中包含所有依赖信息及其版本号
# 同时会有一个 .venv 文件夹,为当前项目的虚拟环境
uv run xxx.py # 执行代码

# 或者
source .venv/bin/activate # 激活虚拟环境,类比 conda activate
python xxx.py

之后如果新建另外一个项目用到相同的环境,或者拷贝代码到其他机器,只需要复制 pyproject.tomluv.lock,并根据需要修改 pyproject.toml,然后执行下述命令即可完整复现原先的环境:

uv lock && uv sync

conda#

若发现没有:conda: command not found,执行下述命令后重启终端

/opt/anaconda3/bin/conda init

由于环境保存在~/.conda目录下,切换服务器仅需拷贝整个目录即可完成环境迁移,不需要重新配置,也可以编辑~/.condarc如下并将envs_dirspkgs_dirs修改为 /nasdata/[name]/.conda/[envs/pkgs],将环境配置在 nas 上实现一个环境多个服务都可以使用

show_channel_urls: true
default_channels:
  - https://mirror.nju.edu.cn/anaconda/pkgs/main
  - https://mirror.nju.edu.cn/anaconda/pkgs/r
  - https://mirror.nju.edu.cn/anaconda/pkgs/msys2
custom_channels:
  conda-forge: https://mirror.nju.edu.cn/anaconda/cloud
  msys2: https://mirror.nju.edu.cn/anaconda/cloud
  bioconda: https://mirror.nju.edu.cn/anaconda/cloud
  menpo: https://mirror.nju.edu.cn/anaconda/cloud
  pytorch: https://mirror.nju.edu.cn/anaconda/cloud
  simpleitk: https://mirror.nju.edu.cn/anaconda/cloud
auto_activate_base: false
envs_dirs:
  - ~/.conda/envs
pkgs_dirs:
  - ~/.conda/pkgs
# pip 使用南大源
pip config set global.index-url https://mirror.nju.edu.cn/pypi/web/simple

配置完环境后运行conda clean —allrm -rf ~/.cache/pip可清除不少无用的 conda 缓存,以缓解空间不足问题

docker#

若是系统软件无法满足需求,可以使用 docker,具体教程可以自己搜索学习,但所有 docker 容器必须以普通用户身份启动,否则会被清除 **(2-6 行 <必须> 保留,其余根据情况自定义)**

docker container run --name pytorch-dpj \
  --gpus all \
  --user $(id -u ${USER}):$(id -g ${USER}) \
  -v /etc/passwd:/etc/passwd:ro \
  -v /etc/group:/etc/group:ro \
  -v /etc/shadow:/etc/shadow:ro \
  -v /data1/peijie:/data/:rw \
  -v /home/peijie:/home/peijie:rw \
  -it fenghaox/pyt1.3cu10.1:v2 /bin/bash

缓解 home 空间不足问题#

  • conda clean --all :删除 conda 缓存
  • rm -rf ~/.cache/pip :删除 pip 缓存
  • uv cache clean :删除 uv 缓存
  • rmoldvs :删除旧版 vscode-server(需要在 vscode 的终端中使用)

查看 GPU 使用状态#

https://nvtop.njucite.cn/ (建议)
使用邮箱登录,请向管理员提交你的邮箱,添加至白名单后方可访问。

或在每台机器上使用nvtop 命令

使用指定 GPU#

没开启并行的话,pytorch 默认使用 0 号 GPU,开启并行默认使用全部 GPU
运行代码前配置 CUDA_VISIBLE_DEVICES 环境变量指定使用的 GPU,如不并行使用 1 号:

export CUDA_VISIBLE_DEVICES=1

或并行使用 0-3 号:

export CUDA_VISIBLE_DEVICES=0,1,2,3

自行尝试学习多 GPU 并行的方法DataParallel(实现较为简单,但在第一块 GPU 上由额外显存开销,显存利用率不高)和DistributedDataParallel(实现较为复杂,也不好 debug,但效率高,建议代码固定后修改为这种方法)

nvtop可以查看 GPU 占用情况,被占用了或者正在使用的人进行协调

联网问题#

已配置代理,如果存在联网问题(github 等),在需要联网的命令前加上 proxychains,如:

proxychains curl https://www.baidu.com

如需要登录 p.nju.edu.cn,可参考这个项目:

# 可能需要先安装一下uv,参见前面的环境配置章节
uvx NJUlogin -i # 之后扫码即可登录校园网
uvx NJUlogin -i -l pwdLogin # 或者输入账号密码登录
uvx NJUlogin -o # 登出

后台运行代码#

服务器已安装 tmux,后台运行代码(退出终端后依然可以继续运行)只需用最基础的功能即可

终端中输入tmux new 会出现一个新的终端,在里面执行时间较长的命令,之后按下ctrl+B,接着按下D,就可以退出,此时代码继续在后台执行。
或者使用tmux new -s <name>指定新建终端的名字,默认为从 0 开始的数字。

tmux ls可以查看正在后台运行的终端名称。
tmux attach -t <name>可回到该终端查看运行情况。

在 tmux 终端中按下ctrl+B,接着按下[后,可以用上下键翻页,按 q 退出翻页模式。

数据!!!#

数据存储位置#

::: warning
home 目录空间较小,数据文件不要放在 home 目录下,请放在/data1下。
:::

不常用的文件可放在/nasdata下,详见下述 NAS 说明章节。

数据备份#

::: warning
公用服务器务必自己保证数据安全。
:::

服务器上安装了 rclone,提供一种便捷的,定时的备份方法(从服务器同步重要文件到 NJUBox):

rclone config

n → 自定义配置名称 (比如 njubox)→ 56 (seafile) → https://box.nju.edu.cn → 学号 → 密码 (先输入 y 再输入两遍密码)→ 2fa (直接回车) → 资料库名称 (直接回车表示所有未加密资料库) → 其他按照提示即可

rclone 常用方法#

查看远程文件#

rclone ls [配置名称]:/[目录]

image

同步#

首次运行会复制所有文件(源地址)至远程(目标地址)
之后只会复制更改和新增的文件

::: warning
特别注意: 每次运行后目标地址的文件会和源地址完全一致,源地址删除后运行同步会也会删除目标地址的对应文件(使用rclone copy不会删除目标地址的文件)
:::

rclone sync -v [源目录] [配置名称]:/[目标目录]

image

定时同步#

复制上述同步命令,使用 crontab 进行定时任务,具体可在互联网上查找,相关教程很多

NAS 说明#

::: banner {warning}
NAS 也并非 100% 可靠,重要数据请遵循 321 原则(三个副本,两种介质,一个离线备份)。
:::

从群晖官网下载应用:企业网盘 | Synology Drive_私有云_随时存取数据_多人共享协作 | 群晖科技 Synology Inc.
或者直接通过网页访问:https://nas.njucite.cn:5001

IP / 域名:nas.njucite.cn

应用登录 Drive 只会显示 home 目录,此目录仅自己可见
网页登录能看到 share 目录,此目录为共享目录并且挂载在各个服务器上/nasdata,可用于服务器间传输数据,部分 (s4 和 s5) 服务器与 NAS 之间为万兆连接,其余为千兆

::: warning
/nasdata所有人都有权限,为防止他人误删,重要数据更建议通过 rclone 进行配置,参考下文的使用 rclone 同步本地和 NAS 文件,注意替换 url。
:::

可在网页端移动两个目录下的文件

image

也可使用 webdav 挂载,webdav 地址:https://nas.njucite.cn:5006

使用 iperf3 测试连接速度:

iperf3 -c nas.njucite.cn

image

使用 rclone 同步本地和 NAS 文件#

rclone config
e/n/d/r/c/s/q> n # 新建配置
name> nas # 配置名为nas
Storage> 52 # WevDAV,rclone版本不同可能不一样
url> https://nas.njucite.cn:5006 # 在服务器上推荐使用万兆网的http://10.0.0.100:5005
vendor> 7 # Other site/service or software,rclone版本不同可能不一样
user> abcd # NAS用户名
y/g/n> y # 输入密码
password: ... # 输入两次NAS密码
# 剩下的直接回车就行

按上述步骤在本地电脑新建好配置后可使用之前介绍的rclone copyrclone sync命令进行文件同步(如将本地文件上传到 NAS 或将 NAS 文件下载到本地)

::: warning
特别注意: 每次运行后目标地址的文件会和源地址完全一致,源地址删除后运行同步会也会删除目标地址的对应文件(使用rclone copy不会删除目标地址的文件)
:::

进阶#

自动填充之前输入过的命令#

可使用zsh作为默认终端,并配置 oh-my-zshpowerlevel10kzsh-autosuggestionszsh-syntax-highlighting

zsh+oh-my-zsh+powerlevel10k 终端配置_powerlevel10k 配置 - CSDN 博客

或者直接使用我自己的配置,将下面这个文件解压放入自己的 home 目录即可
zshconfigs.tar.gz

GUI 相关#

某些命令会提示没有显示器,如没有其他办法一定要用 GUI 的话可参考下述方法两种方法,第一种方法适用于在自己的终端执行命令,第二种要求在 MobaXterm 内执行。前者需要额外配置,后者开箱即用。

方法一#

本地电脑安装MobaXterm,并打开 X server

image

鼠标放在上面会显示[IP]:[x11port],选择非路由器 NAT 下(在南大一般非 NAT IP 由 114 或 172 开头,路由器 NAT 下的 IP 一般由 192.168 或 10 开头)的 IP 和端口,并在服务器终端中输入

export DISPLAY=[IP]:[x11port]

之后输入与 GUI 有关的命令,并在本地电脑上弹出的窗口点击 是 即可。

image

方法二#

直接使用 mobaxterm 进行 ssh 连接,执行 GUI 相关命令即可。

拷贝显示进度#

~/.bashrc~/.zshrc中添加:

function rcp(){
    local src=$1
    local dst=$2
    if [ -f "$src" ] && [ -d "$dst" ]; then
        dst="$dst/$(basename "$src")"
    fi
    mkdir -p "$(dirname "$dst")"
    rsync -ah --info=progress2 "$src" "$dst"
}

之后使用 rcp 即可,与 cp 的逻辑不完全相同,第二个参数 dst 应该为目标目录,不能和 cp 一样重命名。

训练结束 / 失败后发送邮件提醒#

在训练脚本后面加上下述 Python 代码即可。

sender = "noreply@do1e.cn"             # 配置发送邮箱地址
sender_name = "s1"                     # 发送邮件姓名,我这里定义为服务器名称
passwd = "xxxxxxx"                     # 邮件密码,如果是QQ邮箱的话就是授权码
server = "smtphz.qiye.163.com"         # 发送邮箱的服务器,如QQ邮箱的是smtp.qq.com
port = 465                             # 发送邮箱的端口号,一般多是这个
receiver = "pjdiao@smail.nju.edu.cn"   # 接收邮箱地址
receiver_name = "Peijie Diao"          # 接收邮箱姓名
subject = "train on s3"                # 邮件主题
message = "Training on s3 is finished" # 邮件内容

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import socks

# 服务器没有登录无法上网,我这里配置的代理,可以打开你自己小猫咪的允许局域网连接
socks.set_default_proxy(socks.SOCKS5, "xxxx", 7891)
socks.wrapmodule(smtplib)

msg = MIMEText(message, 'plain', 'utf-8')
msg['From'] = formataddr((sender_name, sender))
msg['To'] = formataddr((receiver_name, receiver))
msg['Subject'] = subject

server = smtplib.SMTP_SSL(server, port)
server.login(sender, passwd)
server.sendmail(sender, [receiver], msg.as_string())
server.quit()

VPN 替代方案#

学校 VPN 服务器不稳定时可以考虑使用,速度上也是比较快的(前提是成功 P2P 连接)

image

有能力也可以考虑自建 Zerotier 或 OpenVPN 服务

使用 Zerotier 与我的校内服务器 P2P 连接#

参考xubiaolin/docker-zerotier-planet - 客户端配置配置 Zerotier One。
planet 文件和网络 ID 登录 https://nvtop.njucite.cn 后查看,或者联系我。配置完成后联系我提供 address 完成认证。

如下述 address 为15ffbcaa44

> zerotier-cli info
200 info 15ffbcaa44 1.14.2 ONLINE

完成验证后再次重启 zerotier 服务,应该能获得一个10.128.3.0/24的 IP 地址,并且能够访问 https://test.nju.do1e.cn/ ,此时这一步成功,进入下一步。

路由#

下述命令需要管理员 (sudo) 权限

Windows

首先运行route print,找到 ZeroTier Virtual Port 对应的编号,如下述示例为 11。

> route print
Interface List
  5...xx xx xx xx xx xx ......Microsoft Wi-Fi Direct Virtual Adapter
  3...xx xx xx xx xx xx ......MediaTek Wi-Fi 6E MT7922 (RZ616) 160MHz Wireless LAN Card
 11...xx xx xx xx xx xx ......ZeroTier Virtual Port

接着运行route add 114.212.0.0 mask 255.255.0.0 10.128.3.4 if {No} metric 1(请将 {No} 替换为前面得到的编号)

Linux

首先运行ifconfig,查看 ZeroTier 对应的接口,一般为 zt 开头

接着运行sudo ip route add 114.212.0.0/16 via 10.128.3.4 dev {Interface} metric 1(请将 {Interface} 替换为前面得到的接口名称)

MacOS

route add -net 114.212.0.0/16 10.128.3.4 -hopcount 1(AI 结果,未经验证)

此时应该可以在校外连接服务器和 NAS,并且访问 https://nvtop.main.njucite.cn

注意:每次重启后都需要执行上述路由配置,或者自行查找永久配置方法,但不建议笔记本永久配置

注:仅保证服务器和 NAS 能够连接。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。