此文由 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_dirs
和pkgs_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 —all
和rm -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 [配置名稱]:/[目錄]
同步#
首次運行會複製所有文件(源地址)至遠程(目標地址)
之後只會複製更改和新增的文件
::: warning
特別注意: 每次運行後目標地址的文件會和源地址完全一致,源地址刪除後運行同步會也會刪除目標地址的對應文件(使用rclone copy
不會刪除目標地址的文件)
:::
rclone sync -v [源目錄] [配置名稱]:/[目標目錄]
定時同步#
複製上述同步命令,使用 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。
:::
可在網頁端移動兩個目錄下的文件
也可使用 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> 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 copy
或rclone sync
命令進行文件同步(如將本地文件上傳到 NAS 或將 NAS 文件下載到本地)
::: warning
特別注意: 每次運行後目標地址的文件會和源地址完全一致,源地址刪除後運行同步會也會刪除目標地址的對應文件(使用rclone copy
不會刪除目標地址的文件)
:::
進階#
自動填充之前輸入過的命令#
可使用zsh
作為默認終端,並配置 oh-my-zsh
、powerlevel10k
、zsh-autosuggestions
、zsh-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 -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()