0. 前言
本系列主要记录编程和科研过程中接触到的一些高频使用的技巧和必备技能,主要涉及一些库和命令的使用。这些命令通常不会天天使用(容易遗忘),在某些场景又不可避免,然而这些场景又会时不时出现(每次需要重新查询某个指令的用法)。为了改善这种问题,提高日常编程效率,整理出了这样一个“字典”,用于日常查阅。因此,本文比较私人向,写法等以自己能理解为首要目标,可能存在质量问题。出于程序员的分享精神,决定还是公开出来,希望对你也有帮助。
1. 后台运行代码
后台运行命令:nohup,该命令的一般格式为:
nohup yourcommand &
yourcommand
:启动对象命令。可以跟该命令需要的各种参数。
&
是指在后台运行,但当用户退出的时候,命令自动也跟着退出,nohup
与 &
结合起来,可以实现不挂断的后台运行。
实现屏幕输出记录到日志文件
nohup yourcommand 2>&1 &
数字含义: 0
– stdin (standard input),1
– stdout (standard output),2
– stderr (standard error) ;
2>&1
是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到日志文件中。
如果希望将日志输出到别的文件中,可以增加一个文件路径参数。如下:
nohup yourcommand >myout.log 2>&1 &
实时监测日志输出内容命令:tail
tail
命令是 nohup
命令的好搭档。配合 -f
参数,可以实时监视向日志文件增加的信息。
tail -f myout.log
tail -f 等同于–follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止
tail -F 等同于–follow=name –retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
tailf 等同于tail -f -n 10,与tail -f不同的是,如果文件不增长,它不会去访问磁盘文件,所以tailf特别适合那些便携机上跟踪日志文件,因为它减少了磁盘访问,可以省电。
2. GPU 相关
显卡监控
nvidia-smi
, 可以查看显卡使用情况:
gpustat
,也可以监控GPU,使用-i
参数可以实时监控,相比nvidia-smi
页面更简洁直观:
安装方式:pip install gpustat
显卡占用进程
使用场景:
- Kill进程后发现没杀干净,有僵尸进程占用显存没被释放,但程序已经停止了。
- 同时跑了多个实验,发现有个实验的设置出错,或者需要提前停止,又无法确定是哪个终端运行的命令。
- 有root权限的你想Kill别人的进程(慎重考虑)
以上这些场景都有两个需求:1. 了解目前显卡上运行了哪些进程。 2. 知道每个进程对应的指令是什么。这就可以用到fuser
和ps
实现。
首先安装 fuser
:apt-get install fuser
使用指令 fuser -v /dev/nvidia*
,可以找到运行在所有显卡下的所有进程。找到进程号后使用 ps -p 进程号
就能查看该进程的具体情况,运行的指令是什么,将不需要的kill就行。
例如:
ps -f -p 1984338 # 出来的ppid是父进程,可以继续DFS下去,找到最终的进程
kill -9 1984338 # 确定要kill的pid后使用该命令,-9表示强制终止,有些进程杀不掉,可以加-9参数
3. 服务器SSH相关
SSH连接服务器,每次都要输入密码,可以通过公钥秘钥的方式直接连接服务器。公钥可以看成你的账号,可以存储在公共区域,任何人可见,所以公钥放在服务器端。私钥存放在本地电脑,只有本机用户可以访问,相当于密码。当服务器端有公钥(账号),本地电脑有私钥(密码),并且配对时,就无需输入登录服务器所需要的密码,直接就能SSH访问服务器。
如果你没有名为 id_rsa.pub
的 SSH 公钥文件,你需要先生成一个新的 SSH 密钥对,然后将其添加到远程服务器的 authorized_keys
文件中。以下是生成 SSH 密钥对并将其添加到远程服务器的步骤:
-
生成 SSH 密钥对:
在 PowerShell 中执行以下命令来生成新的 SSH 密钥对。如果你已经有一个密钥对,你可以跳过此步骤(Linux指令相同)。
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
替换
"your_email@example.com"
为你的电子邮件地址。 -
查看公钥内容:
使用以下命令查看生成的公钥内容:
Get-Content "$env:USERPROFILE\.ssh\id_rsa.pub"
将公钥内容复制到剪贴板,以备后用。
Linux可以用:
cat ~/.ssh/id_rsa.pub
-
将公钥添加到远程服务器:
使用以下命令将你的公钥添加到远程服务器的
authorized_keys
文件中。替换<your_remote_username>
为远程服务器上的用户名,<remote_server_ip>
为远程服务器的 IP 地址。Get-Content "$env:USERPROFILE\.ssh\id_rsa.pub" | ssh <your_remote_username>@<remote_server_ip> "cat >> .ssh/authorized_keys"
在执行此命令之前,请确保你已经能够使用密码登录到远程服务器。这将会把你的公钥追加到远程服务器上的
authorized_keys
文件中,从而允许你使用密钥进行无密码登录。解释:
-
Get-Content $env:USERPROFILE\.ssh\id_rsa.pub
: 这部分命令会读取本地计算机上的id_rsa.pub
文件的内容。$env:USERPROFILE
是一个环境变量,代表当前用户的主文件夹路径(通常是类似C:\Users\<username>
的格式)。.ssh\id_rsa.pub
是公钥文件的路径。这是默认的 SSH 公钥文件路径,但你也可以根据需要更改它。
-
|
: 这个管道操作符将前一个命令的输出作为后一个命令的输入。 -
ssh root@121.48.165.132 "cat >> .ssh/authorized_keys"
: 这部分命令通过 SSH 连接到远程服务器,并在远程服务器上执行操作。root@121.48.165.132
是远程服务器的地址和用户名。你可以将root
替换为正确的用户名,121.48.165.132
替换为远程服务器的 IP 地址或域名。"cat >> .ssh/authorized_keys"
是在远程服务器上执行的命令,它将前面读取的本地公钥内容追加到远程服务器的authorized_keys
文件中。
-
MAC使用下面命令:
ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@服务器IP
4. 从A到B设备复制文件
rsync -avzP -e 'ssh -p 目标服务器端口号' --include={'*.zip','*.txt'} --exclude='*' 要传输的文件路径 目标用户名@目标服务器ip:文件存放位置
rsync的同步参数选项:
-a :归档模式,表示以递归模式传输文件,并保持文件所有属性相当于-rtopgdl
-v :详细模式输出,传输时的进度等信息
-z :传输时进行压缩以提高效率—compress-level=num可按级别压缩
-r :对子目录以递归模式,即目录下的所有目录都同样传输。
-t :保持文件的时间信息—time
-o :保持文件属主信息owner
-p :保持文件权限
-g :保持文件的属组信息
-P :--progress 显示同步的过程及传输时的进度等信息
-e :使用的信道协议,指定替代rsh的shell程序。例如:ssh
-D :保持设备文件信息
-l :--links 如果文件是软链接,则拷贝软链接本身而非软链接所指向的文件
-L --copy-links 如果文件是软链接,拷贝软链接指向的文件
--progress :显示备份过程
--delete :删除那些DST中SRC没有的文件
--exclude=PATTERN 指定排除不需要传输的文件模式
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。
-suffix=SUFFIX 定义备份文件前缀
-stats 给出某些文件的传输状态
-R, --relative 使用相对路径信息 如:rsync foo/bar/foo.c remote:/tmp/ 则在/tmp目录下创建foo.c文件,而如果使用-R参数:rsync -R foo/bar/foo.c remote:/tmp/ 则会创建文件/tmp/foo/bar/foo.c,也就是会保持完全路径信息。
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--port=PORT 指定其他的rsync服务端口
5. 训练环境相关
导入&导出环境(conda 以及 pip)
有关conda的详细介绍可以看我的博客:Anacoda的安装和使用
# 列出现有环境
pip freeze > requirements.txt # 导出由pip安装的依赖
conda create -n env_name python=3.6 # 新建一个env_name环境,指定python版本
coda activate env_name # 激活env_name环境
pip install -r requirements.txt # 安装导出的pip依赖
conda env export > environment.yaml # 导出conda安装的依赖
conda env create -f environment.yaml # 安装conda依赖
指定不同路径的conda
使用场景:你的服务器是个docker或者每次重启可能都会初始化存储,但是有持久化硬盘。或者出于各种目的需要将环境放在某个指定的路径下。
conda info # 查看conda目前的信息,envs directories列出了环境的路径,package cache列出缓存的路径,这两个占用空间最多
vi ~/.condarc # 进入配置文件
# 在envs_dirs:下添加你的环境存放位置
# 在pkgs_dirs:下添加你的缓存存放位置
# 如果你的整个conda都需要指定路径,需要在PATH中添加一行:
vi ~/.bashrc # 进入系统环境变量配置文件,增加下面的一行
export PATH=/xxxx/miniconda3/bin:$PATH # xxx填写你的具体路径,指向conda的bin路径
bashrc
Bash is a vital tool for managing Linux machines. The name is short for "Bourne Again Shell."
A shell is a program that commands the operating system to perform actions.
我们在 Ubuntu 打开的命令行界面一般都是 bash,每次启动 bash 时都会先运行 .bashrc文件以加载用户的默认配置。.bashrc的路径为~/.bashrc
。
6. 服务器反向代理
使用场景:组里的服务器没有挂代理,访问github、huggingface等资源很慢或者超时,这时可以使用反向隧道的方式,让服务器与本地电脑建立隧道,使用本地电脑的代理访问外网。首先在本地电脑的终端中输入:
ssh -NfR 7890:localhost:7890 <服务器登录名>@<服务器ip>
# 其中7890为Clash的端口号,-N表示不执行命令,只转发;-f表示后台运行;-R表示反向隧道
输入服务器密码后进入远程服务器的终端,则成功建立服务器到本机的隧道,路径为远程服务器7890转发到本机的7890,然后在远程服务器的终端中输入:
export https_proxy=http://127.0.0.1:7890;export http_proxy=http://127.0.0.1:7890;export all_proxy=socks5://127.0.0.1:7890
表示将远程服务器的http等服务请求都从服务器的7890端口转发,由于我们建立了服务器7890到本机7890的隧道,因此http等服务请求又会转发到本地电脑,而本地电脑挂着Clash代理,监听端口为7890,所以这些服务器就会经过Clash转发到某个海外服务器,实现资源访问。
7. Git 相关
查看以及修改Git的邮箱和用户名
在推送至github的时候需要关注本地git的邮箱和用户名,如果是别人的邮箱和用户名,那么推送到github上后,仓库的贡献者就是别人了。
git config user.name
git config user.email
git config --global user.name "username"
git config --global user.email "email"
远程推送相关
git init
git add .
git commit -m ""
git pull origin master
git remote add origin git@github.com:fangkaipeng/ProS.git
git remote rm origin
git push origin master
8. 其他杂项
软链接
ln -s /mnt/hdd2/fangkaipeng/data/ /home/fangkaipeng/viper/data
- ln 表示建立链接, -s表示软连接(类似快捷方式),先加实际地址,后加“快捷方式”的地址
- 使用场景:服务器中,code存在ssd上,data存在hdd上,为了在同一个project的文件下访问data,可以建立一个软连接,将hdd的数据链接到ssd的project文件夹下。
查看磁盘使用情况
df -h
以磁盘分区为单位查看文件系统,可以获取硬盘被占用了多少空间,目前还剩下多少空间等信息。du -h
英文原义为 disk usage,含义为显示磁盘空间的使用情况,用于查看当前目录的总大小。
Google Scholar 查询技巧
调研的时候可能需要在scholar查某个方向的论文,输入关键字后会出来很多相关的论文,如果你只需要某些会议,可以增加搜索条件进行筛选。
查询Key Words,只包含CVPR,ICCV,ICLR,NeurIPS的论文:
Key Words (source:ECCV OR source:"Computer Vision and Pattern Recognition" OR source:"IEEE International Conference on Computer Vision" OR source:"International Conference on Learning Representations" OR source:"NeurIPS" )
后台运行可以试一下tmux
牛皮