(本站图床托管于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