(本站图床托管于Github,大概率会被屏蔽)
Acknowledgement:
SSH
SSH软件
- 类Unix:
shell内的ssh命令 - Windows:
cmd内的ssh命令(win10/11自带openssh),或WindowsTerminal/Putty/Xshell/WSL等软件,选个好看的 - Android:华为云等软件
- maxOS/iOS:
iTerm2,xTerm256,Termius,Koder等软件
公钥免密登录
- (401服务器
ssh密码方式登录已禁用,2023.3) - 看
cat ~/.ssh/id_rsa.pub(type \path\to\windows-user\.ssh\id_rsa.pub)是否存在,没有使用ssh-keygen命令生成公钥 - 让管理员将
id_rsa.pub中内容追加到gaia.buaadml.info:/home/myUserName/.ssh/authorized_keys中以免密登录 - 修改用户密码:
ldap管理员后台
注意,无法ssh登录时,请在ssh末尾追加-v选项,将报错信息发送而给admin
NFS
网络文件系统
- 简单地说,
gaia上/home目录挂载的是物理磁盘,计算节点上/home目录是通过NFS文件协议用TCP同步共享gaia.buaadml.info:/home的,因此高I/O,低计算的任务,如下载,请尽量使用gaia机器 NFS没设intr选项(2023.3),所以理论上切换目录无限等待且不能Ctrl^C中断(SIGINT)可能是NFS问题(我个人在别的服务器上见过这种情况)
(base) zhaozixuan at gaia in ~
$ mount | grep '/dev/sd'
#/dev/sda2 on / type ext4 (rw,relatime,data=ordered)
#/dev/sda1 on /boot/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro)
#/dev/sdb on /home type ext4 (rw,relatime,stripe=64,data=ordered)
(base) zhaozixuan at jack in ~
$ mount | grep '/home'
#buaadml.info:/ on /home type nfs4 (rw,relatime,vers=4.0,rsize=8192,wsize=8192,namlen=255,hard,proto=tcp,port=2041,timeo=14,retrans=2,sec=sys,clientaddr=10.134.139.116,local_lock=none,addr=10.134.138.250,_netdev)
更多参考
File Transfer
命令行
wget:通过url下载文件scp/rsync:个人机器/实验室服务器互传文件目录curl:http报文
sftp协议软件(推荐)
推荐根据自己的IDE,如VSCode,JetBrains系(自带),安装可视化sftp插件管理服务器文件
Linux Command
1. man COMMAND / COMMAND -h/ COMMAND --help
# 查看某一命令COMMAND之说明
2. Ctrl^C
# 向进程发送SIGINT
3. Ctrl^D
# 退出shell/退出su切换到的用户/断开ssh
4. Ctrl^Z
# 挂起命令进程,jobs查看挂起进程
5. cd -
# 返回上次访问目录
6. grep "mykeyword"
# 查找关键字
7. history | tail -n 50
# 最后50条历史命令
8. alias
#为命令起别名,如
alias jack='ssh zhaozixuan@jack.buaadml.info'
9. alias
# 覆写命令对应程序的绝对路径,如
alias cmake='/path/to/my/own/cmake'
#但不建议alias python='/usr/bin/python3',因为alias python可能会覆盖conda虚拟环境的python
10. chomd [-r]/ chown
# 更改文件(目录)权限(归属用户/用户组)
11. tail [-f] [-n <number>]
# 查看文件最后<number>行,-f为实时刷新,适合查看志记文件
12. which COMMAND
# 查看命令对应程序位置, 如which pip3, which python
文件权限与chmod
更多参考
man-page, Linux命令行与shell脚本编程大全(第4版)
Vim
vim三模式:一般模式,命令行模式,编辑模式,使用vi/vim进入文件时是一般模式
编辑模式
一般模式下,进入编辑模式
i 光标前插入
a 光标后插入
o 光标下一行插入
命令行模式
一般模式下,进入命令行模式::, /
:num 跳至第num行,num="$"时跳至文件尾
:set filetype=c 代码文件后缀与语言不一致时显式指引vim进行正确的语法高亮
:q 退出 vi
:q! 强制退出,不保存文件
:wq 保存文件并退出
/str 从光标处向文件尾部搜索,查找 "str" 字符串,n/N 查看下/上一个位置
?str 从光标处向文件首部搜索,查找 "str" 字符串,n/N查看下/上一个位置
:s/str1/str2/g 将当前行中所有的 "str1",均用 "str2" 替换
:s/str1/str2/gc 将当前行中所有的 "str1",均用 "str2" 替换, 替换时需要确认
:%s/str1/str2/g 将文件中所有的 "str1",均用 "str2" 替换
:%s/str1/str2/gc 将文件中所有的 "str1",均用 "str2" 替换,替换时需要确认
一般模式
其他模式下,进入命令行模式:Esc
gg 光标移动到文档头部
G 光标移动到文档尾部
ngg 光标移动到第 n 行头部
n+ 光标向下移动 n 行
n- 光标向上移动 n 行
0 光标移动到当前行行首
$ 光标移动到当前行行尾
w 光标移动到下一个字的开头
b 光标移动到上一个字的开头
fx 光标移动到 当前行下一个字母x的位置
yy 复制当前行(Vim内部剪贴板)
nyy 复制当前行及下面的 n-1 行
p 粘贴(Vim内部剪贴板)
x 删除光标后一个字符
X 删除光标前一个字符
nx 删除光标后 n 个字符
nX 删除光标前 n 个字符
d0 从光标处删到行首
d$ 从光标处删到行尾
dd 删除光标所在行
ndd 删除光标所在行及其后 n-1 行
u 撤销一步操作
v visual模式,相当于鼠标拖动选取之操作,选择完后y复制,x剪切
Vim 配置文件
bashvim ~/.vimrc
追加:
syntax enable #开启语法高亮
set nu #开启行号显示
#set compatible 平等对待Vi/Vim指令
# 或者
#set nocompatible 不与 Vi 兼容(采用 Vim 自己的操作命令)。
set showmode #显示当前模式
set showcmd #命令行模式下显示键入的命令
#set shiftwidth=4
#set softtabstop=4 缩进设置,自行了解
set cursorline #高亮显示当前行
set ruler #显示光标
set showmatch #左右匹配括号高亮
set incsearch #启用'/'命令行模式的增量搜索,也就是每键入一个字符都会重新搜索字符串,通常可以更快搜索到结果
set mouse=a #开启鼠标控制(滚轮与鼠标控制`visual`模式的选取)
#...e.t.c.
刷新配置:重启vim进程,或命令行模式下:source ~/.vimrc
注意:以上每行配置都可在:命令模式下对当前文件设置,设置仅对当前打开文件对应的vim进程有效
Vim in IDE
JetBrains系IDE的官方维护的vim插件:ideaVim,keymap中设置Pulgin -> IdeaVim -> Vim快捷键快速启用/关闭vim,有效集合了vim和GUI的优点
SHELL
bash/zsh/fish/etc...
shell就是ssh登上去的黑框框,这个与我们交互的进程通常默认是bash,zsh是另一种交互式终端,但在使用上基本与bash无区别,优点在于完善,高度可定制的插件机制,用来提高我们的效率。为了减少烦人的敲shell命令的时间,一些插件如自动补全与高亮是必要的,但shell的配置/插件修改比较麻烦,zsh的oh-my-zsh框架可以大大简化这个过程
zsh & oh-my-zsh(推荐)
以oh-my-zsh添加自动补全与语法高亮这两个常用插件为例
#1.进入zsh
zsh
#2.安装oh-my-zsh
git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
vim ~/.zshrc, "ZSH_THEME=..." #这一行可以自己修改成好看点的主题
#3.插件安装
cd ~/.oh-my-zsh/custom/plugins
git clone https://github.com/zsh-users/zsh-autosuggestions.git
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git
vim ~/.zshrc #修改插件列表,plugins变量:plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
source ~/.zshr #刷新配置
应该有补全效果了(按右箭头补全)
PROMPT修改
PROMPT指的是每次shell等待输入时打印的信息,oh-my-zsh是高度定制的,以最简单的PROMPT修改为例
1.显示conda环境名,直接使用conda之命令行
conda init zsh
2.以steeef主题为例添加一个实时时间显示为例
vim ~/.zshrc
修改ZSH_THEME="steeef"
bashvim ~/.oh-my-zsh/themes/steeef.zsh-theme
#追加
if [[ $terminfo[colors] -ge 256 ]]; then
turquoise="%F{81}"
orange="%F{166}"
purple="%F{135}"
hotpink="%F{161}"
limegreen="%F{118}"
violet="%F{205}"
darkorange="%F{208}"
cyan="%F{51}"
else
turquoise="%F{cyan}"
orange="%F{yellow}"
purple="%F{magenta}"
hotpink="%F{red}"
limegreen="%F{green}"
violet="%F{violet}"
darkorange="%F{darkorange}"
cyan="%F{cyan}"
fi
#修改PROMPT
PROMPT=$'%{$darkorange%}%n${PR_RST} at %{$violet%}%m${PR_RST} in %{$cyan%}%~${PR_RST} $vcs_info_msg_0_$(virtualenv_info) %{$FG[040]%}%D{%Y/%m/%d} - %*%{$reset_color%}
$ '
以上操作修改了PROMPT的颜色,添加了当前时间
vim ~/.zshrc
#追加
TMOUT=1
TRAPALRM ()
{ zle reset-prompt }
以上操作使得PROMPT每秒刷新一次,以显示实时时间
source ~/.zshrc
刷新配置后生效
当然也有其他很多主题,如powerline10k, random,注意,你的终端需要支持主题相关的字体与彩显,否则会有显示上的错误
修改默认SHELL
- 现有账户默认
shell均为bash(2023.3) - 在
~/.profile追加启动指定shell的命令并没有真正改变默认shell,而是在启动bash时自动执行一条进入指定shell的命令,例如此时exit将回到bash,而不是关闭shell chsh/usermode指令并不能修改默认shell,因为大家的linux系统账户不是在节点机器本地管理,而是通过VM chaos提供的ldap协议服务管理,因此需要联系管理员在chaos之phpLDAPadmin上修改默认shell启动路径
Windows Subsystem for Linux
不喜欢Win的cmd就装个wsl吧,比虚拟机软件更轻量,且自然地共存,可无缝切换的双系统方案
WSL1.0
没有使用真正的Linux内核,实际是把Linux内核的系统调用转换成Win的系统调用
(所以慎重选择WSL1.0作为开发用环境)
WSL2.0
Hyper-V硬件虚拟化实现Linux内核,可以简单理解为虚拟机
WSL网络
WSL桌面
Note: this section is a copy of https://liyirui-git.github.io/
- 准备工作
我使用的是Windows应用商店中的Ubuntu 18.04 LTS,安装完成以后,为了提高软件包下载速度,一般是要把软件库更换成清华开源镜像:Ubuntu清华开源镜像。
更换好以后,先执行下面的命令,更新apt:
$ sudo apt update
$ sudo apt upgrade
- 安装图形化界面
这里使用的是xfce4,安装命令为:
$ sudo apt install xfce4
它的优点主要是占用空间小,此外该界面主要是有一个图形界面可以使用spacemacs。
然后安装xrdp:
$ sudo apt install xrdp
- 软件配置
配置xrdp端口
$ sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini
端口号要记住,后面从windows进行连接的时候要用到。这里面 3389 是默认配置,这里将其改为 3390 是避免和 windows 的端口冲突。因为两边的端口号是通的,在 wsl 中开一个 8080 端口的 WebServer,在 windows 可以直接访问。
配置xsession
$ sudo echo xfce4-session >~/.xsession
#这一步其实是在告诉系统,开启桌面环境的时候开启什么桌面环境。
启动 xrdp
$ sudo service xrdp restart
Windows远程连接
打开Windows中的“远程桌面连接” (快捷方式是win+r输入“mstsc”)
在计算机名的地方输入本地的3390端口,用户名输入root,如下图:
进入以后会显示一个小的对话框:

这个时候点击“ok”,会弹出填写用户名和密码的对话框,填写对应的用户名和密码:

点击OK即可登录到可视化界面:

如果WSL的Ubuntu系统关闭,如关机重启,会导致远程连接不上,此时需要先在Win10中打开Ubuntu的命令行界面,输入:
$ sudo service xrdp restart
此时再远程连接,即可连接上。

- 尾声
后续还看到一个特别牛批的大神做的:WSL使用小结:从ArchLinux到Manjaro,以及知乎的问题:Deepin Linux上架WSL要多久?,知乎文章:利用WSL打造Arch开发环境
后续可以继续折腾。
Note: End of the copy
Windows Terminal
微软官方的终端软件:link
Windows Terminal相比于cmd:1.好看 2.整合cmd/powerShell/WSL/git bash等需要终端显示的场景,集中终端配置
以Windows Terminal配置ssh(WSL发起)为例
- 安装
wsl与Windows Terminal,记不太清了,但好像Windows Terminal会自动检测WSL并为其生成默认配置文件 Windows Terminal -> Settings,从WSL的配置文件复制一份配置文件,修改Command line,追加进行ssh连接的命令(注意,这里的命令大概是在shell配置文件之前执行的,因此不要依赖~/.bashrc或~/.zshrc创建的环境变量)

Tmux(推荐)
ssh默认长时间不操作会断开,为了防止耗时操作中ssh终端断开,可以修改/etc/ssh/ssh_config定时向服务器发报文保活,或者使用autossh等软件
不过更推荐Tmux,Tmux是在服务器本地创建多个shell交互界面,所以不受ssh连接生命期之影响,可以挂在后台,不用担心ssh断了或者卡死shell就中断了导致前台进程挂掉,而且可以灵活切换多个SHELL界面
Tmux中两个主要概念是sessions与windows,简单地说,可以对应于带图形用户界面的操作系统中的桌面与应用窗口,一个windows对应一个shell进程,一个sessions持有一个或多个windows。
使用tmux指令将新建一个session,tmux rename mySessionName(在当前session下)将为session命名,不然默认就是数字序号。进入tmux后按一次Ctrl^B进入命令模式,Ctrl^B后按D键将当前session detach掉,也就是挂在后台,这将退回到原来的shell(注意,tmux创建的shell中使用exit或Ctrl^D仍然将杀死shell,而不是把他挂在后台运行)。使用tmux ls看当前所有session,使用tmux a -t mySessionName回到session,使用tmux kill-session -t mySessionName关闭后台session,也可以进入tmux session后 Ctrl^B后按S查看所有session,并可以选择切换
tmux session中,默认只有一个全屏的window,Ctrl^B接%把当前window左右分割成两个window,Ctrl^B接"把当前window上下分割,Ctrl^B接方向键切换聚焦的window,Ctrl^B接Ctrl^方向键调整window尺寸
Ctrl^B接[可以上下滚动shell输出

对tmux进行设置
- 生成配置文件
vim ~/.tmux.conf - 写入内容
set -g default-terminal "screen-256color"
# 开启xTerm256彩色显示
set -g default-shell /bin/zsh
# 设置默认SHELL
set-option -g mouse on
# 开启鼠标控制
- 注意:鼠标控制的
tmux下,按住shift以鼠标框选,Ctrl^shift^c/v以复制粘贴 - 配置可热修改,使用
tmux source-file ~/.tmux.conf生效配置
更多参考
man tmux or link
Screen
类似的终端复用器还有 GNU Screen。Tmux 与它功能相似,但是通常来说Tmux更易用,也更强大。
Note: This section is a copy of yirui的实验室服务器使用指南
Screen基础
可以通过创建一个屏幕来实现后台运行,新建一个屏幕的命令是:
$ screen -S [screen-name]
查看当前所有屏幕的列表的命令是:
$ screen -ls
进入某一个屏幕的命令是:
bash$ screen -r [screen-name]
kill一个屏幕的命令是在该屏幕中输入:
$ exit
Screen退出当前窗口但不杀死
ctrl + a + d 这一操作也叫detached
Screen杀死会话窗口
如果想关掉一个多余的窗口,有3种方法:
kill -9 threadnum 例如在上面的2637,kill -9 2637 即可杀死线程,当然就杀死了窗口
使用Ctrl a +k 杀死当前窗口和窗口中运行的程序
使用Ctrl a 然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序
Screen清除死去的窗口
当窗口被杀死后,再用screen -ls 可以看到该窗口后面的(???dead)字样,说明窗口死了,但是仍在占用空间。这时需要清除窗口
$ screen -wipe #自动清除死去的窗口
这样的窗明几净了~
Screen意外掉线重连
有的时候,意外断开连接,再次进入某个screen会出现以下报错:
(base) xxxx@i:~$ screen -r fastreid
There is a screen on:
3157.fastreid (2021年02月19日 15时19分14秒) (Attached)
There is no screen to be resumed matching fastreid.
这个时候是因为它认为还有人在与screen连接,所以连接不上,这个时候,可以通过下面的命令,让screen与之前的连接断开,然后我们再连进去
$ screen -D -r fastreid
如何记录screen屏幕日志
第一种方法
启动时添加选项-L(Turn on output logging.)会在当前目录下生成screenlog.0文件。
screen -L -dmS test
1
screen -L -dmS test的意思是启动一个开始就处于断开模式的会话,会话的名称是test。
screen -r test连接该会话,在会话中的所有屏幕输出都会记录到screenlog.0文件。
第二种方法
不加选项-L,启动后,在screen session下按ctrl+a H,同样会在当前目录下生成screenlog.0文件。
第一次按下ctrl+a H,屏幕左下角会提示Creating logfile "screenlog.0".,开始记录日志。
再次按下ctrl+a H,屏幕左下角会提示Logfile "screenlog.0" closed.,停止记录日志。
补充
上面两个方法有个缺点:当创建多个screen会话的时候,每个会话都会记录日志到screenlog.0文件。screenlog.0中的内容就比较混乱了。
解决方法如下,让每个screen会话窗口有单独的日志文件。
在screen配置文件/etc/screenrc最后添加下面一行:
logfile /tmp/screenlog_%t.log
1
%t是指window窗口的名称,对应screen的-t参数。所以我们启动screen的时候要指定窗口的名称,例如:
screen -L -t window1 -dmS test
1
screen -L -t window1 -dmS test的意思是启动test会话,test会话的窗口名称为window1。屏幕日志记录在/tmp/screenlog_window1.log。如果启动的时候不加-L参数,在screen session下按ctrl+a H,日志也会记录在/tmp/screenlog_window1.log
注意,如果写成:logfile ./screenlog_%t.log 则是把日志文件记录到当前目录下。
一个例子
screen -L -t name -S name ./name
1
第一个name是记录日志的名字
第二个name是screen -ls 列表展示出来的名字
第三个name是需要运行的程序
Note: End of the copy
更多参考
man screen or link
Linux Daemon
crontab
GPU
Nvidia显卡信息查看
watch -n 5 'nvidia-smi'
# or
nvidia-smi
or
watch -n 5 'curl gpu.buaadml.info'
# or
curl gpu.buaadml.info
# 输出格式参考python第三方库gpustat
# or visit http://gpu.buaadml.info
显驱与CUDA安装/卸载
英伟达显卡驱动 :告诉计算机识别显卡硬件,调用其计算资源
CUDA :是NVIDIA推出的只能用于Nvidia GPU的并行计算框架, 只有安装这个框架才能够进行复杂的并行计算, 主流的深度学习框架也都是基于CUDA进行GPU并行加速的
nvidia-smi查看驱动/CUDA版本:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.42.01 Driver Version: 470.42.01 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|#########################+###############==+###############==|
| 0 NVIDIA GeForce ... Off | 00000000:17:00.0 Off | N/A |
| 27% 45C P0 59W / 250W | 0MiB / 11019MiB | 1% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 NVIDIA GeForce ... Off | 00000000:18:00.0 Off | N/A |
| 42% 59C P0 74W / 250W | 0MiB / 11019MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 2 NVIDIA GeForce ... Off | 00000000:65:00.0 Off | N/A |
| 41% 58C P0 63W / 250W | 0MiB / 11016MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
或
(base) zhaozixuan at jack in ~ 2023/06/09 - 23:47:11
$ ll /usr/local/cuda* -d
lrwxrwxrwx 1 root root 21 Apr 28 14:56 /usr/local/cuda -> /usr/local/cuda-11.4/
drwxr-xr-x 18 root root 4.0K May 8 2022 /usr/local/cuda-10.1
drwxr-xr-x 18 root root 4.0K Feb 18 13:42 /usr/local/cuda-10.2
drwxr-xr-x 17 root root 4.0K Apr 28 14:59 /usr/local/cuda-11.4
一般来说,更新的显卡适配版本更高的CUDA,而CUDA并不能向下兼容所有显驱
因此,在升级CUDA时,如果CUDA版本不能兼容老显驱,则首先卸载驱动
sudo nvidia-uninstall
sudo reboot
下载Nvidia官方相应CUDA的runfile后
sudo sh /path/to/cuda_<cuda_version>_linux.run

若卸载了老驱动,则勾选安装驱动,其他不需要配置,傻瓜式安装
比特大陆算丰显卡(TPU)
Note: This section is deprecated
华为昇腾显卡(NPU)
python运行时库:pyACL
CONDA
conda(Anaconda/miniconda)是用于管理虚拟Python环境,以隔离多种Python环境的软件,也是指定虚拟Python环境下包版本管理的软件。Anaconda通过下载运行相应的runfile傻瓜式安装
Note: The following is a copy of yirui的实验室服务器使用指南
下载Anaconda以及环境的搭建
主要是要注意怎么把conda命令加入到Ubuntu系统变量中
注:conda init <shell_name>, 如conda init zsh
Anaconda国内镜像配置
$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
$ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
$ conda config --set show_channel_urls yes
创建虚拟环境
假设当前需要创建一个 tensorflow-gpu 1.0 的环境,可以按照如下的步骤操作:
$ conda create -n tf1-gpu python=3.6
注意: tensorflow 1.x版本仅支持到python3.6 输入这一条命令以后,anaconda就会自动的配置一个python3.6版本的基础环境。之后需要进入到tf1-gpu中,去配置相应的其他环境:
$ conda activate tf1-gpu
然后就在新的环境下,配置tensorflow的环境依赖。
$ conda install tensorflow-gpu=1.0
至此一个虚拟环境就创建出来了,后面就可以在这个新的环境中愉快地玩耍了。
不过除此之外,还有一些其他常用的指令
conda remove -n [env-name] --all #删除某一个环境
conda env list #查看所创建的环境列表
导出环境配置/导入环境配置
conda env export > environment.yaml #环境配置导出
conda env create -f environment.yaml #环境配置导入
Note: End of the copy
- 清除
conda缓存:conda clean --all mamba:为了不被单线程的conda install指令慢的气死,可以考虑安装mamba,多线程版conda包(conda install mamba -n base -c conda-forge),之后将管理指令中的conda替换为mamba
PyTorch
Install
https://pytorch.org/get-started/previous-versions/
注意pip安装的.whl对应的cu(cuda)版本或conda安装的cudatoolkit版本,一般来说,不保证pytorch库能兼容比其要求低的cuda版本的环境
cuda device & DataParallel
print("torch.__version__: ", torch.__version__)
print("torch.cuda.is_available(): ", torch.cuda.is_available())
print("torch.version.cuda: ", torch.version.cuda)
print("cuda devices: ", [torch.cuda.get_device_properties(i) for i in range(torch.cuda.device_count())])
# 检查运行时cuda版本,cuda是否可用,GPU信息
###########
# jupyter notebook @ jack
# torch.__version__: 1.12.1
# torch.cuda.is_available(): True
# torch.version.cuda: 10.2
# cuda devices: [_CudaDeviceProperties(name='GeForce GTX 1080 Ti', major=6, minor=1, total_memory=11178MB, multi_processor_count=28), _CudaDeviceProperties(name='GeForce GTX 1080 Ti', major=6, minor=1, total_memory=11176MB, multi_processor_count=28)]
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = MyNetwork()
model = nn.DataParallel(model).to(device)
# 使用所有GPU
model = nn.DataParallel(model, device_ids=[0, 2]).to(device)
# 指定第0,2号GPU
#or
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0,2'
model = nn.DataParallel(model).to(device)
#or
CUDA_VISIBLE_DEVICES=0,2 python3 train.py
remote Jupyter NoteBook
jupyter框架对应的.ipynb(jupyter notebook)是可以分体运行+输出存储的python脚本
jupyter的优点是,matplotlib绘图可以内嵌在结果中,代码可以方便地按cell分体运行,适合用来学习python库(不少教程是.ipynb的),或者看画图效果
以实验室服务器Anaconda多Python环境下配置jupyter,并使用vscode/浏览器远程访问jupyter服务为例
Jupyter Kernel
注意,一个虚拟Python环境对应于一个Jupyter Kernel
首先要把Anaconda中的虚拟Python环境注册到Jupyter Kernel中,所用工具为ipykernel库
在默认的base环境下:
conda install jupyter ipykernel
在想要注册的环境下,例如一个conda中名为cuda11.4的环境:
conda activate cuda11.4
conda install ipykernel
python -m ipykernel install --user --name cuda11.4 --display-name "cuda11.4-for-learning-pytorch"
注意:--name参数为jupyter kernelspec list所列kernel之名,--display-name为jupyter notebook的web界面中select kernel时所列kernel之名
回到默认的base环境下(也就是使用base环境管理Jupyter,因为你不会想,也无法在conda里删除base环境):
conda activate base
远程访问jupyter
在服务器上,利用之前讲过的tmux,在它里面挂一个以无web界面的方式启动jupyter的服务
tmux
tmux rename jupyter_server
conda activate base
jupyter notebook --no-browser --port=<server_port>
#例 jupyter notebook --no-browser --port=8889
在个人计算机上用ssh代理绕一下服务器防火墙:-/
ssh -N -f -L localhost:<local_port>:localhost:<server_port> <user>@<server_addr>
#例 ssh -N -f -L localhost:8002:localhost:8889 zhaozixuan@jack.buaadml.info
此时访问http://localhost:<local_port>(例http://localhost:8002)(带上?toekn=<token>,如果配置了的话)进入jupyter,注意,以上指令创建的ssh进程在后台运行,需要时请ps -ef|grep ssh找到对应进程kill之

连接vscode
vscode安装MircoSoft官方的jupyter插件.ipynb文件下点击右上角的Select Kernel,将唤起vscode的全局命令行- 选择
Existing Jupyter Server -> Enter the URL of the running Jupyter server,键入代理到本地的jupyter地址,键入密码(如果设置了的话)和服务器配置名,选择Kernel

显存释放
-
cell运行完后,jupyter不会主动结束其python进程,解释器的变量会驻存在内存/显存中,如果不再需要运行cell得到新结果,请及时在结束计算后手动shutdown内核或关闭running的notebook- 或者在你最后想运行的
cell末尾追加quit(0),可以直接自动把内核挂掉
- 或者在你最后想运行的
Jetbrains Pycharm(推荐)
教育认证
建议使用北航邮箱激活Jetbrains教育认证,每次激活延期一年所有Jetbrains Professional IDE的使用权

相比于vscode, pycharm IDE搭建环境比较方便,不需要多少额外插件,集成了ssh-interpreter,SFTP,对conda,venv的友好支持等。为了提高工作效率,可以在本地pycharm编辑源码,利用服务器的python解释器对代码解释与运行程序,使用SFTP工具自动同步远程/本地
以配置kevin的远程conda环境为例
Setting -> Project -> Add Interpreter -> On SSH...- 填写地址
kevin.buaadml.info与ldap用户名,确保当前设备可以ssh免密 - 连接到服务器,
IDE显示探查界面即连接

- 选择
System Interpreter,服务器上在相应conda环境下which python,将打印路径粘贴到配置,Sync folders选项将新建一个SFTP配置

-
Menu -> Tools -> Depolyment -> Configuration修改SFTP配置,解释器与SFTP是独立的,可以将Sync folders生成的删除之,使用与gaia的文件同步即可。 -
勾选
Menu -> Tools -> Depolyment -> Automatic Upload可启用保存时上传当前文件
btw, 喜欢vscode UI的可以安装2023.1后版本的Pycharm,新UI更现代,更接近vscode的简洁风格

remote CLion, Idea...
JetBrains系IDE远程环境配置 大差不差
btw,远程协作方面推荐JetBrains的原生插件Code With Me:link
Python
三方库
https://anaconda.org/
https://pypi.org/
Python 进阶
Fluent Python, Python Cookbook, Effective Python
掌握一门脚本语言吧,如Python/Linux Shell
Docker
Docker Docs,《深入浅出Docker》, K8s Doc
Redis
ElasticSearch
Acknowledgement: This section was originally created by zhangguiwei
Network Tools
校园网登陆脚本
cd /home/dml_401/Login_Net
python Login.py#查看用法
postman
一个跨平台,并支持在线使用的HTTP RESTful API调试工具,显然从功能性与易用性上看,是比curl命令好用很多很多的

注意,当请求地址是一个内网地址时,无法在线通过postman连接,根据postman报错指引Use Postman's Desktop Agent本地安装一个postman agent程序,启动之,就能继续在线调试内网上的接口
nc/netstat
均为传输层的Linux工具命令,nc用于发起TCP/UDP连接;netstat用于探查端口,如netstat -ntlp查看所有TCP Socket,lsof -i:<port_num>查看监听具名端口的进程
wireshark/tcpdump
链路层以上抓包工具,tcpdump命令参考link
WireShark是一个跨平台的抓包软件,优点在于开源、支持协议多、GUI友好
Domain Name & Cloud Server
云服务器
可以是获得公网IP的一种方式
以上厂商以学生认证+新用户购买的方式,基本可以以一百块左右买到一年的云服务器
通常云服务器控制台会有安全组设置,也就是厂商层面的防火墙,构建应用时注意放行相应端口
域名
1.厂商:国内阿里云、腾讯云等,国外GoDaddy/siteground等,注意,在国内厂商购买的域名,或是.cn等后缀的域名,需要根据购买后厂商提示在工信部网站进行备案(同时严格遵守我国网信法),否则会被DNS服务器拒绝域名解析
2.DNS:通常来讲,一个域名往往可以通过DNS映射到一个IP地址(A)或另一个域名(CNAME),但不与端口绑定,为实现一级域名或二级域名到具体端口的路由。可以使用nginx的反向代理或docker virtual host等技术
GitHub
Pull Request
GitHub网页上fork原始仓库- 以
ssh协议clone自己的fork仓到本地(GitHub官方已禁用用户密码管理仓库,不使用ssh需要使用GitHub token,你不会喜欢麻烦的Github token的) commit
git checkout -b any_branch_name
git add /path/to/upload/files
git status #检查git暂存区
git commit -m “更新说明”
git push origin any_branch_name
- 回到
GitHub网页fork仓,会提示compare & pull request,直接在网页端按提示操作 PR被批准通过后,原仓库可能会额外产生一次merge commit,在自己fork仓库的github界面,点开之前push的branch的网页界面,有sync fork选项快速同步合并更新后的原始仓库
Github Pages
Github Pages(仓库Settings -> Code and automation -> Pages)可以由github托管一个静态网站,所谓静态就是说没有后端,没有数据库,只有一坨HTML/CSS/JS,一般来说Github Pages上的大部分内容是我们写的markdown渲染出的HTML,一般通过Pages branch/Github Actions在commit时构建网站

配置好github token(注意token需要对仓库操作放权)与仓库地址,写好markdown一键同步即可,Gridea主题:link
注意,使用Gridea将放弃git的版本控制功能,因为Gridea的推送方式为force reset branch再commit
-
图床与防盗链
为静态网站准备一个图床,因为:1.减小
Github Pages大小 2.如果把图片存储在zhihu或cnblogs这些启用防盗链的网站上,那么在这些站点之外的网站页面上链接到这些图像,那么会被拒绝加载(403)可以使用非常简单易用的PicGo,搭建
Github图床等图床 -
Severless
静态网站不能利用数据库,因此可以使用
Serverless的服务在云上存储动态数据,如使用非常简单的valine(link)接入评论功能-
搭建非静态网站
可以在自己的服务器上建站,摆脱静态网站之限制,可以考虑
hexo,Hugo,Wordpress等框架
-
Github Action
NAT traversal
!!!以下软件请仅用于个人计算机,且自行承担一切网安风险(如校园网环境下隧道有可能被北航墙掉)!!!
反向代理

以上是正向代理与反向代理两种模式的示意图,可以看到正向代理下,被代理的是请求机器,所以代理客户端在请求机器,代理服务端跑在代理服务器上。这样,指明访问地址时,代理软件会帮我们通过代理服务器做中转,从而绕过防火墙等网络策略访问到目标服务器。

而在反向代理下,被代理的是目标服务器,请求机器上,代理服务器就等价于目标服务器。请求机器不必给代理服务器提供目标服务器的网址等路由信息,通常它也无法知晓。这时,代理软件需要在 代理服务器(中转服务器)上跑服务端,在目标服务器上跑客户端。反向代理的场景:1.负载均衡,请求转发到节点,如nginx 2.内网穿透:设想我想把个人计算机搭建为服务器,但没有公网IP,只有局域网IP,那么可以把我的计算机交给代理服务器代理,利用它的公网IP将个人计算机暴露在互联网上。没有公网IP时,自然的解决方案就可以是内网穿透,也就是打洞。
frp
frp:开源软件,使用需要一台中转服务器
以frp反向代理实现内网穿透Secure Shell服务为例
Github Release: link ,下载相应os与指令集架构的压缩包,解压之,目录下frpc/frps是客户端,frpc.ini/frps.ini为相应配置文件
在内网机器上配置frpc.ini
[common]
server_addr = <remote_addr> #远程端frps端服务器的公网地址
server_port = 7001 #远程服务端frps占用端口
token = <use_a_random_generator_to_get_a_more_complex_token>
# 客户端服务端对称认证密钥,可256位
use_encryption = true
use_compression = true
#报文对称加密与压缩
#tls_enable = true
#tls_trusted_ca_file = /to/ca/path/ca.crt
#TLS加密,https://gofrp.org/docs/features/common/network/network-tls/
#log_level = debug
log_file = /var/log/frpc.log
#志记
[ssh] #配置名字
type = tcp #指定协议
local_ip = 127.0.0.1 # 穿透的地址,本机可ssh登录的地址即可,可以是同局域网另一机器,可改
local_port = 22 # ssh监听端口
remote_port = 8022 # 代理到frps服务器的端口号,可改
在中转机器上配置frps.ini,确保中转机器可被请求机器与内网机器访问
[common]
bind_port = 7001 #frps占用端口
token = <use_a_random_generator_to_get_a_more_complex_token>
# 客户端服务端对称认证密钥,可256位
use_encryption = true
use_compression = true
#报文对称加密与压缩
#vhost_http_port = 80
#穿透http服务所用端口,https://gofrp.org/docs/examples/vhost-http/
#tls_enable = true
#tls_cert_file = /root/frp/server.crt
#tls_key_file = /root/frp/server.key
#TLS加密,https://gofrp.org/docs/features/common/network/network-tls/
#log_level = debug
log_file = /var/log/frps.log
#志记
以/path/to/frpc -c /path/to/frpc.ini启动内网机器的客户端,/path/to/frps -c /path/to/frps.ini启动中转服务器的服务端,此时在请求机器上ssh <user>@<remote_addr> -p 8022等价于ssh登录内网机器(local_ip:local_port)
注意,我们需要保证frp,特别是frpc的稳定性,因为frpc中断后必须要有主动重连frps的能力,因为frps无法寻址到使用NAT的内网机器
所以使用上文说到的systemd为例,为frpc/frps注册守护进程vi /etc/systemd/system/frps.service
[Unit]
Description=frps(nei_wang_chuan_tou)
After=network.target
Wants=network.target
[Service]
Restart=on-failure
RestartSec=5
ExecStart=/root/frp/frps -c /root/frp/frps.ini
[Install]
WantedBy=multi-user.target
其中ExecStart为启动命令(systemctl start),当进程异常终止时等待RestartSec=5秒重新启动
systemctl daemon-reload # 刷新配置
systemctl start frps.service # 启动服务
systemctl enable frps.service # 开机自启
autossh内网穿透
闭源软件
- 向日葵/ToDesk:主要功能是远程桌面控制
- 花生壳:免费版有隧道数量限制,且已经不支持穿透
http协议,支持tcp/udp/https(2023.3) ngrok:2.x版本已闭源cpolar: 同样只需要部署客户端,服务端由厂商服务器支持, https://www.cpolar.com/
以cpolar实现通过anna(windows)内网穿透ssh与http服务为例,配置C:\Users\Administrator\.cpolar\cpolar.yml
authtoken: <cpolar_auth>
tunnels:
ssh:
proto: tcp
addr: "10.*.*.*:22"
remote_addr: 8.tcp.cpolar.top:1****
vue:
proto: http
addr: "10.*.*.*:*****"
subdomain: vssvue
ssh2:
proto: tcp
addr: "10.*.*.*:22"
remote_addr: 2.tcp.cpolar.top:****
注意,其中被穿透的机器为10.*.*.*,而不是anna,anna只是一个二级跳板
<cpolar_auth>为cpolar账户的密钥, remote_addr与subdomain字段为保留二级域名/端口,需要在cpolar官网使用自己的账号购买
启动cpolar
#cmd
D:\
cd cpolar
.\cpolar.exe list
.\cpolar.exe start vue
.\cpolar.exe start ssh
.\cpolar.exe start ssh2
以我当前的配置文件与cpolar账号设置,使用ssh root@***.cpolar.*** -p 1****登录内网机器,通过http://*****.cpolar.***访问web应用
最后使用批处理脚本自动重启cpolar客户端
#ssh.bat
:start
.\cpolar.exe start ssh
timeout /t 60 /nobreak > nul
goto start
.\ssh.bat运行之
LDAP
Plugin a new machine
- ubuntu启动盘制作:略
- 装机脚本
- 运行脚本后的LDAP配置
- 安装显驱:使用nvidia runfile
- 启动GPU监控脚本
LaTeX/Markdown
- toolchain: 1.
Overleaf, 在线就是方便 2.可以装一个跨平台LaTeX编译器,如TeXLive,MikTex,然后使用相关IDE,如TeXstudio,VSCode等 - LaTeX插入伪代码:
\usepackage{algorithmicx}or\usepackage{algpseudocode}or\usepackage{algpseudocodex} - LaTex做ppt:
Beamer - markdown编辑器:
Typora,所见即所得 - markdown最终会渲染为
HTML,所以markdown是原生可内嵌html块的
EndNote
util
- 北航毕设LaTeX模板
- 北航课程资料仓
- 北航计算机网络实验博客
- 一个北航ppt白板模板
- 北航《大数据处理与机器学习算法实训》23春作业与代码
- 北航《算法分析与设计》22秋作业, 《算法分析与设计》20春作业
- Stanford University CS231n
- zixfy's cs231n_assignments_2021
- Compiler Exploer
- Overleaf 编辑器
- LaTeX Symbols
- DokuWiki tutorials
- paperswithcode
以上,初稿于2023.6