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,可參考這個項目:

使用命令行登录南京大学校园网(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 [ -f "$src" ] && [ -d "$dst" ]; then
        dst="$dst/$(basename "$src")"
    fi
    mkdir -p "$(dirname "$dst")"
    rsync -a --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()
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。