常看常新操作

在linux服务器上安装Anaconda

本科阶段没学过linux真的很伤~~完全看不懂那些命令。

参考博客:
如何在Linux服务器上安装Anaconda(超详细)

简单记录几点博客里没写但我遇到的:

  • 忘记输入yes默认配置环境变量。所以需要在.bashrc文件中加添加环境变量的命令,再执行一次.bashrc文件。最大的困难是我不会写对应的linux命令。
cd 进入/home/xxx
vim .bashrc # 打开.bashrc文件
i # 进入编辑模式
在最后一行添加 export PATH=/home/xxx/anaconda3/bin:$PATH # 具体路径看自己
按esc退出编辑模式
:wq # 保存并关闭文件
source .bashrc # 激活环境
anaconda -V # 测试是否成功,V要大写
conda -V # V要大写

在linux服务器上安装pytorch

使用的服务器是RTX3090+CUDA11.4,网上通用的一些方法试过了没啥用,包括清华镜像、阿里云镜像啥的,也不能安装CUDA10.2后续跑不了代码,最后终于找到了一篇博客教程,顺利安装:
3090显卡(CUDA11.1)安装Pytorch
不需要挂梯子,运行下面的命令即可:

pip install torch===1.7.1+cu110 torchvision===0.8.2+cu110 torchaudio===0.7.2 -f https://download.pytorch.org/whl/torch_stable.html

在linux服务器上使用conda

windows和linux使用conda的命令也小有差异,以下纪录conda的。

虚拟环境相关操作

# 创建虚拟环境
conda create -n your_env_name python=3.7    

# 复制已有环境
conda create -n 新环境名 --clone 旧环境名

# 激活虚拟环境
source activate your_env_name

# 关闭虚拟环境
source deactivate your_env_name

# 删除虚拟环境
conda remove -n your_env_name  --all

# 删除虚拟环境中的包
conda remove --name $your_env_name  $package_name

跨服务器复制anaconda的环境(直接复制无需重复安装包)

包的管理

conda install package_name

# 镜像源
pip install package_name -i https://pypi.tuna.tsinghua.edu.cn/simple/

conda uninstall package_name

conda remove package_name

# conda安装信息
conda info

# 查看conda帮助
conda help

# 列出环境
conda env list

conda换源

直接编辑配置文件.condarc也可以,详见博客:
conda 解决An HTTP error occurred when trying to retrieve this URL.(已经更新清华源但也无解的解决方法)

安装pytorch2.0.0,用conda开头的官方命令死活报错,改成pip开头的命令成功了:

pip install torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1
# 设置搜索时显示通道地址
conda config --set show_channel_urls yes

# 添加清华源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/

# 返回默认配置
conda config --remove-key channels

# CUDA 12.1
# 适合RTX 3060
pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu121
# 别开外网
pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

在linux服务器上使用git clone

真的有用!
在ubuntu上使用git克隆github上的项目

直接在A6000上使用普通的git clone命令居然可以顺利下载git项目!
遇到的坑:
坑:ssh: connect to host github.com port 22: Connection refused

配置vscode免密登录

配置vscode 远程开发+ 免密登录
上述博客的评论区比较有效:
建议直接,然后复制内容到服务器的~/.ssh/authorized_keys中新增一行

# 1. cat 本地的id_rsa.pub
cat C:\Users\26308\.ssh\id_rsa.pub

# 2. 将本地的公钥内容复制到服务器的 authorized_keys
vim ~/.ssh/authorized_keys

# 3. 修改vscode的打开.ssh/config文件,加入 IdentityFile 和对应的本机私钥路径
 IdentityFile : C:\Users\26308\.ssh\id_rsa

客户端

cat ~/.ssh/id_rsa.pub

服务端

vim ~/.ssh/authorized_keys

常用linux命令

基础款

# 列出当前目录下的文件和文件夹
ls(list) 

# 列出文件和文件夹的详细信息
ls -l 

# 新建路径a
mkdir a(make directory) 

# 创建文件
touch 文件名

# 进入a路径
cd a 

# 上一级目录
../ 

# 当前目录
./ 

# 查看当前路径
pwd 

# 将test目录重命名为dir
mv test/ dir 

# 将a移动到b目录下,如果b目录不存在,即把a重命名为b
mv a b/ 

# 看文件树
tree 

# 将a文件夹拷贝到b文件夹下 -r代表递归
cp -r a b 

#删除a文件夹 rm(remove) -r代表递归 -f代表强制
rm -rf a 

# 删除a文件夹下的所有文件
rm -rf a/* 

# 设置环境变量:全局有效
export PATH=/home/xxx/anaconda/bin:$PATH # 将export命令写入文件:~/.bashrc
source ~/.bashrc
env | grep PATH # 查看是否设置成功

# 编辑文本文件
vim

# 解压zip文件
unzip a.zip -d 新名称 

# 将a文件夹压缩为a.tar.gz的压缩包
tar czf a.tar.gz a/
# 将a.tar.gz压缩包解压
tar xzf a.tar.gz

# .tar 只打包,不压缩文件
# .gz 只压缩,不打包文件
# .tar.gz 打包压缩文件

# 查看GPU信息
nvidia-smi

# 查看每张GPU的可用显存
nvidia-smi --query-gpu=memory.free --format=csv 

# 每隔一秒查看每张GPU的显存
watch -n 1 nvidia-smi --query-gpu=memory.used --format=csv

# 查看进程
ps -ef

# 查看进程的CPU和内存占用
# %CPU RES
top

# 重定向日志
# 一般情况日志会输出到stdout/stderr中
# 重定向到train.log文件中,2代表stderr,1代表stdout
python train.py > ./train.log 2>&1

# &: 后台运行
python train.py > ./train.log 2>&1 &

# 将日志文件的内容打印在stdout
# cat: concatenate files to standard output
cat ./train.log

# 比较2个文档的差别
vimdiff single_gpu.py mp_train.py

# 在服务器之间复制文件和目录
# 从本地复制到远程
scp -P 远程端口号 -r 本地文件夹路径 远程用户名@远程IP:远程文件夹路径 # 复制目录
# -r: 递归复制整个目录

scp -P 远程端口号 file.txt root@IP:/path # 复制文件

# 从远程复制到本地: 将上面命令的后2个参数调换
scp -P 远程端口号 -r 远程用户名@远程IP:远程文件夹路径 本地文件夹路径
scp [可选参数] 源文件 目标文件 

linux文件系统

# linux查看每个用户使用的存储空间
sudo du -sh /home/*
# -s: 不包含子目录的大小
# -h: 提高可读性, 以K M G为单位

# 查看系统空间的使用情况
df -h

# 查看当前文件夹下的文件数目
find -name "*.jpg" | wc -l
ls -l | grep "^-" | wc -l

在 linux 终端下载文件

# 文件或网页的url
wget URL

# 下载多个文件:将url保存至一个文本文件中
wget -i download_files.txt

# 为下载的文件重命名
wget -O filename URL

# 恢复未完成的下载
wget -c

# 下载百度网盘链接
# 文件下载链接:在浏览器下载管理中可以复制
wget -c --referer=网盘分享链接 -O 文件名 "文件下载链接"

Linux命令不受终端断开的影响,保持在后台运行

nohup python train.py > train.log 2>&1 &
# nohup可以让命令忽略挂起信号
# 第一个 > 表示将命令的标准输出重定向到 train.log
# 2>&1表示将标准错误重定向到标准输出,此处也是train.log
# 最后一个&表示让命令在后台运行

CUDA_VISIBLE_DEVICES=1 nohup python train.py  > nohup.log 2>&1 &
# 指定显卡编号 写在nohup前面

ps -ef|grep train # 返回nohup启动的所有相关进程(能识别你的进程名称的关键词)
ps -ef|head -1;ps -ef|grep train # 获取标题头
kill -9 pid # pid为每一行的第二个id编码,表示的是该进程的父进程
kill -TERM pid # 杀死多进程程序命令

# linux批量杀死多个进程
ps -ef|grep "关键字"|grep -v "关键字"|cut -c 9-15|xargs kill -9

ps -ef | grep train的显示结果:
在这里插入图片描述

linux执行.sh(shell)脚本

# 进入shell脚本所在文件夹
# 给shell文件授权
chmod +x shell.sh

# 执行.sh文件
./shell.sh
sh shell.sh
bash shell.sh

linux+git

# 安装包 可以在全局使用
pip install git+Github地址

# 把库安装在项目下
git clone git@github.com:facebookresearch/segment-anything.git
cd segment-anything; pip install -e .

# 复制存储库
git clone Github地址
git clone git@github.com:CSMMLab/KiT-RT.git # 类似这种格式

# 查看当前分支
git branch

# 切换分支
git checkout 分支名

# 创建新分支
git checkout -b 新分支名

# 修改分支名
git branch -m oldName newName

# 查看git日志: 可以查看commit的SHA
git log

# detached HEAD状态: HEAD指向一个commit, 而不是一个branch

# 撤销commit, 但保留add, 不删除工作空间的改动代码(适用于没有push到远程)
# HEAD^: 上一个版本的commit; HEAD^^回滚两个版本的commit
git reset --soft HEAD^

# 撤销commit和add, 删除工作空间的改动代码(适用于没有push到远程)
git reset --hard HEAD^

# 修改commit注释
git commit --amend

# 取消文件的版本控制

# 未git add
在.gitignore中添加
# 已git add
# --cached: 只去除版本控制而不删除本地文件
# -n: 展示要去除版本控制的文件列表
step1: git rm -r -n --cached 文件名
step2: 在.gitignore中添加

监控服务器状态

# nvitop库: NVIDIA-GPU设备运行状况的实时监控工具
pip install nvitop
nvitop

# disk free: 检查文件系统的磁盘占用情况
df -hl # -h: 方便阅读 -l: 本地文件系统

# disk usage: 该目录下所有文件夹所占空间的大小
du -hl --max-depth=1

软链接

# 创建目标文件目录, 是源文件目录的软链接
ln -s 源文件目录 目标文件目录

# 删除软链接
unlink 目录

# 修改软链接: 让目标文件目录指向新的源文件目录
ln -snf 新的源文件目录 目标文件目录

loss不下降

尝试找了几篇博文,但还没拜读:
[深度学习] loss不下降的解决方法
训练loss不下降原因集合

检查反向传播

参考博客:
Pytorch 分析反向梯度检查网络
pytorch学习(2):通过检查梯度参数,判断是否正常反向传播

loss.backward()后打印网络的回传梯度:

for n,p in net.named_parameters():
	print(n, '->', p.is_leaf, '->', p.grad, '->', p.requires_grad)

训练过程打印中间变量的grad会显示None,因为当中间变量完成了反向传播的使命就会被释放掉。因此需要hook函数来打印中间变量的梯度。

# y是一个中间变量
# 函数定义:hook(grad) -> Tensor or None
y.register_hook(lambda grad: print(y, '->', grad)) 

# 打印网络的backward梯度
# 函数定义:hook(module, grad_input, grad_output) -> tuple(Tensor) or None
torch.nn.Module.register_backward_hook (lambda module, grad_input, grad_output: print(module, '->', grad_input, '->', grad_output))

在linux服务器上使用Tensorboard可视化

参考博客:
很感动,按照步骤来一个问题都没出,狠狠三连了!
【最全最细】Linux系统服务器使用Tensorboard实现可视化操作
我设置的侦听端口也是16666,目标端口也是6006。
首先代码中要使用pytorch的Tensorboard。
然后在xshell终端输入:

source activate [环境全称]
tensorboard  --logdir=【你模型保存的绝对路径/相对路径】 --port 6006
localhost:16666 # 在浏览器中输入网址

linux下载文件

linux从huggingface下载文件

如何快速下载huggingface模型——全方法总结

1. huggingface-cli+hf_transfer

多文件并行,不支持单文件多线程

pip install -U huggingface_hub

# 每个ssh连接都要export一下
export HF_ENDPOINT="https://hf-mirror.com"

huggingface-cli download --resume-download 存储库名称 --local-dir 本地位置 --local-dir-use-symlinks False
# local-dir-use-symlinks: 真实模型是否存储在~/.cache/huggingface下

# 下载数据集, 增加参数--repo-type
huggingface-cli download --resume-download --repo-type dataset 存储库名称

使用hf_transfer加速
没有进度条【v0.19.0+开始支持进度条了】
启动失败!

pip install -U hf-transfer

export HF_HUB_ENABLE_HF_TRANSFER=1

huggingface-cli download --resume-download 存储库名称 --local-dir 本地位置 --local-dir-use-symlinks False
# 没有进度条说明开启加速成功

2. snapshot_download

需要配置代理,所以不打算使用。

linux从Google Drive下载文件

获取可下载的直接链接 并在Linux命令行下载Google Drive或Onedrive大文件到服务器

Windows使用git clone遇到的各种问题

问题1

问题描述:

fatal: unable to access 'xxx':
Failed to connect to 127.0.0.1 port 7890 after 2081 ms:
Couldn't connect to server

解决方法:
解决git clone报错Failed to connect to 127.0.0.1 port 7890 after 2059 ms: Connection refused

问题2

问题描述:

fatal: unable to access 'xxxx': 
Failed to connect to github.com port 443 after 21256 ms: 
Couldn't connect to server

解决方法:

分布式训练 多卡并行

霹雳啪啦我的神仙导师!
实操教程 | GPU多卡并行训练总结(以pytorch为例)
对应github代码地址
分布式训练并不能将同1个模型分开放在不同的卡上,所以我用autodl租了A40来跑。贵死!

DistributedDataParallel(DDP)

参考的博客:
深度学习训练方法实操(DP/DDP/DeepSpeed)

单机多卡

使用DDP进行单机多卡训练步骤如下:

  1. 初始化:
# 初始化通信
n_gpus = 2
torch.distributed.init_process_group("nccl", world_size=n_gpus)

# 获取当前进程的rank(每个进程在不同的GPU/rank上)
local_rank = torch.distributed.get_rank()
# 获取当前进程使用的GPU设备
device = torch.device("cuda", local_rank)
# 设置当前进程使用的GPU设备, local_rank表示GPU设备的序号
torch.cuda.set_device(local_rank)
  1. 包装模型:
model = torch.nn.parallel.DistributedDataParallel(model.to(device), device_ids=[local_rank])
  1. 数据加载:
# 设置分布式采样, 设置分布式采样后, shuffle=False即可
# batch_size是每个GPU上的batch_size
trainsampler = torch.utils.data.distributed.DistributedSampler(trainset, rank=local_rank)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, shuffle=False, sampler=trainsampler)
  1. 数据打乱:
for epoch in range(epochs):
	# 设置采样器的当前训练epoch, 以便采样器可以根据不同的训练周期执行不同的采样策略
	trainsampler.set_epoch(epoch)
	for input, label in trainloader:
		input, label = input.to(device), label.to(device)
		...
		loss.backward()
		optimizer.step()
  1. 模型保存:使用model.module.state_dict()来保存。
# 只在local_rank=0时保存模型
if step%save_step_interval == 0 and local_rank == 0:
	os.makedirs(save_path, exist_ok=True)
	save_file = os.path.join(save_path, f"save_{step}.pth")
	torch.save({'epoch': epoch,
	'model_state_dict': model.module.state_dict(),
	'optimizer_state_dict': optimizer.state_dict(),
	'loss': loss}, save_file)

  1. 结束处理:
# 结束分布式进程
torch.distributed.destroy_process_group()
  1. 执行方式:
# torch.distributed.launch启动多个进程
CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 train.py

多机多卡

使用DDP进行多机多卡训练步骤如下:

  1. 直接使用DDP单机多卡的代码。确保多机之间可以互相访问。
  2. 在每台机器上运行下列脚本:
# 在第一个机器节点上执行
# nproc_per_node: 每台机器上要使用的GPU数量
# nnodes: 节点/机器数量
# node_rank: 当前节点/机器的rank
# master_addr和master_port:指定主节点的IP和端口号
python -m torch.distributed.launch --nproc_per_node=2 --nnodes=2 --node_rank=0 --master_addr=10.38.234.187 --master_port=29500 train.py

# 在第二个机器节点上执行
python -m torch.distributed.launch --nproc_per_node=2 --nnodes=2 --node_rank=1 --master_addr=10.38.234.187 --master_port=29500 train.py

DeepSpeed

DeepSpeed执行多机多卡的训练步骤如下:

  1. 初始化:
args = get_args()
# 初始化分布式训练环境
deepspeed.init_distributed(dist_backend=args.backend, dist_init_required=True)

args.local_rank = torch.distributed.get_rank()
torch.cuda.set_device(args.local_rank)
device = torch.device("cuda", args.local_rank)
  1. 数据加载:

  1. 包装模型:
  2. 训练处理:
  3. 模型保存:
  4. 执行方式:

PyCharm连接远程服务器

按照这个博客的教程来,以前弄的好像有错误:
Pycharm远程连接服务器并运行代码(详细!)
超详细pycharm(专业版)+远程调试+本地和服务器代码同步

注意:
如果项目文件夹下有ckpt/ output/ dataset 文件夹,则需要加入排除的路径。

git学习

相关教程:
Git入门图文教程(1.5W字40图)–深入浅出、图文并茂
Git使用教程(看完会了也懂了)
Linux上传GitHub【超详细】
github合并分支~

Linux上传github

  1. 新建一个github仓库(最好没有readme.md)。
  2. 把本地项目变成 git 仓库,并将文件添加到仓库里。
git init -b main # 指定分支名为main
git add .
git status # 查看缓存区内容
git ls-files # 查看放在本地仓库的内容
git commit -m "描述内容"
git remote add origin 仓库.git # 关联远程仓库
git remote # 查看目前已经关联的远程仓库
git pull origin main --allow-unrelated-histories # 把远程仓库pull到本地, 适合远程仓库有readme.md时
git push origin main # 把本地内容push到远程仓库

虚拟环境导出

Anaconda之导出/导出配置好的虚拟环境

activate your_environment
conda env export > environment.yaml
conda env create -f environment.yaml

pip freeze > requirements.txt
pip install -r requirements.txt

pip install -e .

正常情况下,我们使用 pip install package 来安装一个包,该包将被复制到 Python 的 site-packages 目录下。这样做的结果是,无论我们修改了该包的代码与否,我们使用的永远都是 site-packages 目录下的安装版本。
pip install -e 允许我们创建一个软链接,链接到我们开发目录下的包文件夹,而不是复制到 site-packages 目录中。
pip install -e ..表示当前目录。我们在开发过程中只需修改代码,并在测试过程中立即看到结果,而无需每次都重新安装包。
-e : editable

tmux

terminal multiplexer终端复用器
Tmux 使用教程

会话和窗口命令

# 启动tmux窗口
tmux

# 退出tmux窗口
exit
ctrl+d

# 前缀键: 快捷键需要前缀键唤起
ctrl+b

# 新建会话: 取名
tmux new -s 会话名

# 当前会话和窗口分离
tmux detach

# 查看当前所有tmux会话
tmux ls

# 重新接入已存在的会话
tmux attach -t 会话编号/会话名

# 杀死会话
tmux kill-session -t 会话编号/会话名

# 切换会话
tmux switch -t 会话编号/会话名

# 重命名会话
tmux rename-session -t 0 新会话名

多个窗格和窗口

# 划分窗格
tmux split-window # 上下
tmux split-window -h # 左右

# 移动光标
tmux select-pane -U
tmux select-pane -D
tmux select-pane -L
tmux select-pane -R

# 交换窗格位置
tmux swap-pane -U
tmux swap-pane -D

# 新建窗口
tmux new-window -n 窗口名

# 切换窗口
tmux select-window -t 窗口编号/窗口名

# 重命名窗口
tmux rename-window 窗口名

内网穿透

待学习:
frp配置内网穿透教程(超详细)

deepspeed配置使用vscode进行远程debug

写得很好的博客:
deepspeed使用vscode进行远程调试debug环境配置与解读

deepspeed配置使用PyCharm进行远程debug

写得很好的博客(好像是全网唯一一个)
如何在pycharm中调试deepspeed

vscode debug选项

继续 F5:继续执行,直到下一个断点处
单步跳过F10:光标运行到有函数的地方时,点击运行即完成该函数
单步调试F11:运行一行代码
单步跳出Shift+F11:跳出到即将进入函数的指令,此时函数未执行
重启:重新启动调试,直到第一个断点停下

PyCharm项目的import使用

import语句的写法标准:

  • import语句写在文件的顶部,在注释或说明文字后。
  • 根据导入内容的不同分成 3 类。第一类:导入 python 内置模块;第二类,导入第三方库模块;第三类,导入当前项目的模块。
  • 导入不同类别的模块时,要用空行分开。

绝对导入

绝对导入的参照物是项目的根文件夹,必须从最顶层的文件夹开始,为每个包提供完整的导入路径。
project项目的目录结构如下:

project
 ├─package1
 │      module1.py
 │      module2.py
 │
 └─package2
     │  module3.py
     │  module4.py
     │  __init__.py
     │
     └─subpackage
             module5.py

则使用绝对路径导入的示例如下:

from package1.import module1
from package1.module2 import func1
from package2 import class1
from package2.subpackage.module5 import func2

相对导入

相对导入的参照物是当前位置,
如果在package2.module3.py中引用module4.py,写法如下:

import module4
from . import module4 # 推荐使用这个
from package2 import module4

如果在package1.module1.py中引用package1.module2.func1,写法如下:

from .module2 import func1

如果在package2.module3.py中引用package2.class1package2.subpackage.module5.func2,写法如下:

from . import class1
from .subpackage.module5 import func2

wandb huggingface

参考文档:
Hugging Face Transformers

os.environ["WANDB_API_KEY"] = "xx"
os.environ["WANDB_MODE"] = "offline"
os.environ["WANDB_PROJECT"] = "<my-amazing-project>"

配置vscode或者Pycharm ssh版本显示图片

# 在MobaXterm中找到IP
# 输出:localhost:15.0
echo $DISPLAY

# 在命令行里设置DISPLAY的环境变量
export DISPLAY="localhost:15.0"

# 接下来就可以愉快地显示图片啦

如何编辑图片

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

PyCharm git操作

PyCharm git commit

commit文件中的部分更改:
双击commit窗口中的文件名,可以选择想提交的代码块。

register_buffer

深入理解Pytorch之register_buffer

zotero配置

zotero配置同步:坚果云+zotfile

坚果云+zotfile合理配置实现zotero的多设备同步

Zotero如何实现两台电脑文献同步?

zotero同步pdf文件:
Zotero | 两台设备的pdf文件同步问题

zotero style用法

zotero+style期刊标签|zotero教程(六)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值