xChar
·8 months ago

此文由 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连接远程服务器+免密连接教程

如果使用 vscode 无法连接并一直提示正在下载,需要先使用 ssh 连接上去之后并登录 https://p.nju.edu.cn ,参考下述联网问题章节。

环境配置

uv

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

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

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,可参考这个项目:

https://github.com/Do1e/NJUlogin

uvx NJUlogin -i # 之后扫码即可登录校园网
uvx NJUlogin -i -l pwdLogin # 或者输入账号密码登录
uvx NJUlogin -o # 登出

镜像

在校内提供部分镜像访问,详见 NJU CITE Lab 提供的校内镜像

后台运行代码

服务器已安装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 [配置名称]:/[目录]

同步

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

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

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

定时同步

复制上述同步命令,使用 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。
:::

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

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

使用iperf3测试连接速度:

iperf3 -c nas.njucite.cn

使用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

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

export DISPLAY=[IP]:[x11port]

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

方法二

直接使用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 = "[email protected]"             # 配置发送邮箱地址
sender_name = "s1"                     # 发送邮件姓名,我这里定义为服务器名称
passwd = "xxxxxxx"                     # 邮件密码,如果是QQ邮箱的话就是授权码
server = "smtphz.qiye.163.com"         # 发送邮箱的服务器,如QQ邮箱的是smtp.qq.com
port = 465                             # 发送邮箱的端口号,一般多是这个
receiver = "[email protected]"   # 接收邮箱地址
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连接)

有能力也可以考虑自建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

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

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

Loading comments...