实验室新手进阶之路
- 在linux服务器上安装Anaconda
- 在linux服务器上安装pytorch
- 在linux服务器上使用conda
- 在linux服务器上使用git clone
- 配置vscode免密登录
- 客户端
- 服务端
- 常用linux命令
- loss不下降
- 检查反向传播
- 在linux服务器上使用Tensorboard可视化
- linux下载文件
- Windows使用git clone遇到的各种问题
- 分布式训练 多卡并行
- PyCharm连接远程服务器
- git学习
- pip install -e .
- tmux
- 内网穿透
- deepspeed配置使用vscode进行远程debug
- deepspeed配置使用PyCharm进行远程debug
- vscode debug选项
- PyCharm项目的import使用
- wandb huggingface
- 配置vscode或者Pycharm ssh版本显示图片
- 如何编辑图片
- PyCharm git操作
- register_buffer
- zotero配置
在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下载文件
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进行单机多卡训练步骤如下:
- 初始化:
# 初始化通信
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)
- 包装模型:
model = torch.nn.parallel.DistributedDataParallel(model.to(device), device_ids=[local_rank])
- 数据加载:
# 设置分布式采样, 设置分布式采样后, 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)
- 数据打乱:
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()
- 模型保存:使用
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)
- 结束处理:
# 结束分布式进程
torch.distributed.destroy_process_group()
- 执行方式:
# torch.distributed.launch启动多个进程
CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 train.py
多机多卡
使用DDP进行多机多卡训练步骤如下:
- 直接使用DDP单机多卡的代码。确保多机之间可以互相访问。
- 在每台机器上运行下列脚本:
# 在第一个机器节点上执行
# 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执行多机多卡的训练步骤如下:
- 初始化:
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)
- 数据加载:
- 包装模型:
- 训练处理:
- 模型保存:
- 执行方式:
PyCharm连接远程服务器
按照这个博客的教程来,以前弄的好像有错误:
Pycharm远程连接服务器并运行代码(详细!)
超详细pycharm(专业版)+远程调试+本地和服务器代码同步
注意:
如果项目文件夹下有ckpt/ output/ dataset 文件夹,则需要加入排除的路径。
git学习
相关教程:
Git入门图文教程(1.5W字40图)–深入浅出、图文并茂
Git使用教程(看完会了也懂了)
Linux上传GitHub【超详细】
github合并分支~
Linux上传github
- 新建一个github仓库(最好没有readme.md)。
- 把本地项目变成 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到远程仓库
虚拟环境导出
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.class1
和package2.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"
# 接下来就可以愉快地显示图片啦
如何编辑图片
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
PyCharm git操作
PyCharm git commit
commit文件中的部分更改:
双击commit窗口中的文件名,可以选择想提交的代码块。
register_buffer
zotero配置
zotero配置同步:坚果云+zotfile
zotero同步pdf文件:
Zotero | 两台设备的pdf文件同步问题