DML-BDI实验室指北

#只身打马过草原

(本站图床托管于Github,大概率会被屏蔽)

Acknowledgement:

liyirui-git.github.io

jingtao.fun

SSH

SSH软件

  • 类Unix: shell内的ssh命令
  • Windows: cmd内的ssh命令(win10/11自带openssh),或WindowsTerminal/Putty/Xshell/WSL等软件,选个好看的
  • Android:华为云等软件
  • maxOS/iOS:iTerm2xTerm256, Termius, Koder等软件

公钥免密登录

  1. (401服务器ssh密码方式登录已禁用,2023.3)
  2. cat ~/.ssh/id_rsa.pub(type \path\to\windows-user\.ssh\id_rsa.pub)是否存在,没有使用ssh-keygen命令生成公钥
  3. 让管理员将id_rsa.pub中内容追加到gaia.buaadml.info:/home/myUserName/.ssh/authorized_keys中以免密登录
  4. 修改用户密码: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)

更多参考

鸟哥的 Linux 私房菜 -- NFS 服务器

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

link

更多参考

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

JetBrainsIDE的官方维护的vim插件:ideaVimkeymap中设置Pulgin -> IdeaVim -> Vim快捷键快速启用/关闭vim,有效集合了vimGUI的优点

SHELL

bash/zsh/fish/etc...

shell就是ssh登上去的黑框框,这个与我们交互的进程通常默认是bashzsh是另一种交互式终端,但在使用上基本与bash无区别,优点在于完善,高度可定制的插件机制,用来提高我们的效率。为了减少烦人的敲shell命令的时间,一些插件如自动补全与高亮是必要的,但shell的配置/插件修改比较麻烦,zshoh-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

刷新配置后生效

当然也有其他很多主题,如powerline10krandom,注意,你的终端需要支持主题相关的字体与彩显,否则会有显示上的错误

修改默认SHELL

  • 现有账户默认shell均为bash(2023.3)
  • ~/.profile追加启动指定shell的命令并没有真正改变默认shell,而是在启动bash时自动执行一条进入指定shell的命令,例如此时exit将回到bash,而不是关闭shell
  • chsh/usermode指令并不能修改默认shell,因为大家的linux系统账户不是在节点机器本地管理,而是通过VM chaos提供的ldap协议服务管理,因此需要联系管理员在chaosphpLDAPadmin上修改默认shell启动路径

Windows Subsystem for Linux

不喜欢Win的cmd就装个wsl吧,比虚拟机软件更轻量,且自然地共存,可无缝切换的双系统方案

WSL1.0

没有使用真正的Linux内核,实际是把Linux内核的系统调用转换成Win的系统调用

(所以慎重选择WSL1.0作为开发用环境)

WSL2.0

Hyper-V硬件虚拟化实现Linux内核,可以简单理解为虚拟机

WSL网络

link

WSL桌面

Note: this section is a copy of https://liyirui-git.github.io/

  1. 准备工作

我使用的是Windows应用商店中的Ubuntu 18.04 LTS,安装完成以后,为了提高软件包下载速度,一般是要把软件库更换成清华开源镜像:Ubuntu清华开源镜像。

更换好以后,先执行下面的命令,更新apt

$ sudo apt update
$ sudo apt upgrade
  1. 安装图形化界面
    这里使用的是xfce4,安装命令为:
$ sudo apt install xfce4

它的优点主要是占用空间小,此外该界面主要是有一个图形界面可以使用spacemacs

然后安装xrdp

$ sudo apt install xrdp
  1. 软件配置
    配置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
  1. Windows远程连接
    打开Windows中的“远程桌面连接” (快捷方式是 win+r 输入“mstsc”

在计算机名的地方输入本地的3390端口,用户名输入root,如下图:

进入以后会显示一个小的对话框:

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

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

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

$ sudo service xrdp restart

此时再远程连接,即可连接上。

  1. 尾声
    后续还看到一个特别牛批的大神做的: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发起)为例

  • 安装wslWindows Terminal,记不太清了,但好像Windows Terminal会自动检测WSL并为其生成默认配置文件
  • Windows Terminal -> Settings,从WSL的配置文件复制一份配置文件,修改Command line,追加进行ssh连接的命令(注意,这里的命令大概是在shell配置文件之前执行的,因此不要依赖~/.bashrc~/.zshrc创建的环境变量)

Tmux(推荐)

ssh默认长时间不操作会断开,为了防止耗时操作中ssh终端断开,可以修改/etc/ssh/ssh_config定时向服务器发报文保活,或者使用autossh等软件

不过更推荐TmuxTmux是在服务器本地创建多个shell交互界面,所以不受ssh连接生命期之影响,可以挂在后台,不用担心ssh断了或者卡死shell就中断了导致前台进程挂掉,而且可以灵活切换多个SHELL界面

Tmux中两个主要概念是sessionswindows,简单地说,可以对应于带图形用户界面的操作系统中的桌面应用窗口,一个windows对应一个shell进程,一个sessions持有一个或多个windows

使用tmux指令将新建一个sessiontmux rename mySessionName(在当前session下)将为session命名,不然默认就是数字序号。进入tmux后按一次Ctrl^B进入命令模式,Ctrl^B后按D键将当前session detach掉,也就是挂在后台,这将退回到原来的shell注意tmux创建的shell中使用exitCtrl^D仍然将杀死shell,而不是把他挂在后台运行)。使用tmux ls看当前所有session,使用tmux a -t mySessionName回到session,使用tmux kill-session -t mySessionName关闭后台session,也可以进入tmux sessionCtrl^B后按S查看所有session,并可以选择切换

tmux session中,默认只有一个全屏的windowCtrl^B%把当前window左右分割成两个windowCtrl^B接"把当前window上下分割,Ctrl^B接方向键切换聚焦的windowCtrl^BCtrl^方向键调整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 ScreenTmux 与它功能相似,但是通常来说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官方相应CUDArunfile

sudo sh /path/to/cuda_<cuda_version>_linux.run

若卸载了老驱动,则勾选安装驱动,其他不需要配置,傻瓜式安装

比特大陆算丰显卡(TPU)

Note: This section is deprecated

华为昇腾显卡(NPU)

python运行时库:pyACL

一个推理接口封装

CONDA

condaAnaconda/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对应的cucuda)版本或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框架对应的.ipynbjupyter notebook)是可以分体运行+输出存储的python脚本

jupyter的优点是,matplotlib绘图可以内嵌在结果中,代码可以方便地按cell分体运行,适合用来学习python库(不少教程是.ipynb的),或者看画图效果

以实验室服务器AnacondaPython环境下配置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-namejupyter notebookweb界面中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内核或关闭runningnotebook

    • 或者在你最后想运行的cell末尾追加quit(0),可以直接自动把内核挂掉

Jetbrains Pycharm(推荐)

教育认证

link

建议使用北航邮箱激活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.infoldap用户名,确保当前设备可以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...

JetBrainsIDE远程环境配置 大差不差

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命令好用很多很多的

link

注意,当请求地址是一个内网地址时,无法在线通过postman连接,根据postman报错指引Use Postman's Desktop Agent本地安装一个postman agent程序,启动之,就能继续在线调试内网上的接口

nc/netstat

均为传输层的Linux工具命令,nc用于发起TCP/UDP连接;netstat用于探查端口,如netstat -ntlp查看所有TCP Socketlsof -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界面,点开之前pushbranch的网页界面,有sync fork选项快速同步合并更新后的原始仓库

Github Pages

Github Pages(仓库Settings -> Code and automation -> Pages)可以由github托管一个静态网站,所谓静态就是说没有后端,没有数据库,只有一坨HTML/CSS/JS,一般来说Github Pages上的大部分内容是我们写的markdown渲染出的HTML,一般通过Pages branch/Github Actionscommit时构建网站

  • jekyll

    jekyllgithub官方原生支持的静态建站框架,需要Ruby环境,不会玩,欢迎补充

  • Gridea
    Gridea是相当简单的Github Pages静态建站工具:link

配置好github token(注意token需要对仓库操作放权)与仓库地址,写好markdown一键同步即可,Gridea主题:link

注意,使用Gridea将放弃git的版本控制功能,因为Gridea的推送方式为force reset branchcommit

  • 图床与防盗链

    为静态网站准备一个图床,因为:1.减小Github Pages大小 2.如果把图片存储在zhihucnblogs这些启用防盗链的网站上,那么在这些站点之外的网站页面上链接到这些图像,那么会被拒绝加载(403

    可以使用非常简单易用的PicGo,搭建Github图床等图床

  • Severless

    静态网站不能利用数据库,因此可以使用Serverless 的服务在云上存储动态数据,如使用非常简单的valinelink)接入评论功能

    • 搭建非静态网站

      可以在自己的服务器上建站,摆脱静态网站之限制,可以考虑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内网穿透

liyirui.github.io

闭源软件

  • 向日葵/ToDesk:主要功能是远程桌面控制
  • 花生壳:免费版有隧道数量限制,且已经不支持穿透http协议,支持tcp/udp/https(2023.3)
  • ngrok:2.x版本已闭源
  • cpolar: 同样只需要部署客户端,服务端由厂商服务器支持, https://www.cpolar.com/

cpolar实现通过anna(windows)内网穿透sshhttp服务为例,配置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.*.*.*,而不是annaanna只是一个二级跳板

<cpolar_auth>cpolar账户的密钥, remote_addrsubdomain字段为保留二级域名/端口,需要在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

以上,初稿于2023.6