Do1e

Do1e

github
email

CITE Lab 服务器使用指南

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


连接和登录#

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

::: banner {error}
2024.08.11 起,所有服务器将无法使用密码登录,分配新账号时请提供一个公钥
:::

创建密钥对:

ssh-keygen -t rsa -b 8192

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

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

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

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

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

终端只有 $ 符号解决方法#

使用下述更改默认终端为 bash 或者其他用着顺手的终端,输入密码(Linux 下输入密码不会显示,没有反应正常,输入完后按回车就行),之后重启终端或者重新连接即可

chsh -s /usr/bin/bash

环境配置#

conda#

如果没有特殊需求可以直接使用 conda,若发现没有:conda: command not found,执行下述命令后重启终端

/opt/anaconda3/bin/conda init

并且编辑文件~/.condarc如下(使用南大镜像源更快,并且保存环境到自己的 home 路径)
注:已为所有用户配置,不需要再单独配置~/.condarc,但还需要使用pip config set global.index-url https://mirror.nju.edu.cn/pypi/web/simple将 pypi 源也替换为南大源

由于环境保存在~/.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

配置完环境后运行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 缓存
  • rmoldvs :删除旧版 vscode-server(需要在 vscode 的终端中使用)

查看 GPU 使用状态#

https://nvtop.nju.do1e.cn/
nvtop 命令

2024 年 12 月 29 日起,为保护实验室机密,https://nvtop.nju.do1e.cn/仅允许 IP 白名单用户访问,将你的学号发给刁培杰,会给你共享一个 table,在里面填写你的 IP,每 5 分钟会从中进行更新。

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

后台运行代码#

服务器已安装 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 说明#

从群晖官网下载应用:企业网盘 | 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> nas.njucite.cn:5006 # 在服务器上推荐使用万兆网的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 [[ ! -e "$dst" ]]; then
        dst_dir=$(dirname "$dst")
        dst_base=$(basename "$dst")
        rsync -a --info=progress2 "$src" "$dst_dir/"
        mv "$dst_dir/$(basename "$src")" "$dst"
    else
        rsync -a --info=progress2 "$src" "$dst"
    fi
}

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

在训练脚本后面加上下述 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()
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。