[实验日志] 将pycharm(本地项目)连接到远程服务器(Linux)上跑起来 —— 使用远程环境 + pycharm运行run.sh + 配置分布式训练的环境变量

目录

0. 前序工作

1. 连接远程虚拟环境 (配置解释器)

2. 理解.sh (shell脚本 - 以Occ为例)

补充shell脚本讲解

3. 配置运行参数 (PyCharm)

值得注意的路径问题:

小结


 

0. 前序工作

在远程运行虚拟环境之前,得确保已经完成以下几个前置步骤:

1. 在jupyter lab进入终端,远程配好环境,先让项目远程跑起来,先不考虑本地PyCharm

2. 将pycharm本地项目同步到(Linux)服务器上——科研实践(完成文件上的map对应同步)

 

1. 连接远程虚拟环境 (配置解释器)

  • (1)文件 → 设置

 

  • (2)项目 → python解释器 → 添加解释器 → SSH

 

  • (3)现有 → SSH服务器右侧下拉菜单 → 选择咱的端口37368 → 下一步

 

  • (4)内省完成 → 下一步 (2/3. 正在内省 SSH服务器) 窗口

下一步后会自动弹出“新目标: SSH”的 (3/3. 项目目录和 Python 运行时配置) 窗口

 

  • (5)Virtualenv 环境(不要选Conda,亲测不太行)→ 现有 → 取消勾选“自动上传到服务器”  → 选择“远程路径”文件夹

  • 下面是对应上的远程路径

(6)中的选择解释器步骤,可以放在(5)选择“远程路径”文件夹之前操作,没问题的

  • (6)解释器:显示: <无解释器>,还得咱自己勾选一下,选中咱虚拟环境中的python,确定→创建→确定

然后需要等待20s左右,就能成功连上虚拟环境啦

可以看到之前已经初始化好了的环境,本人在PyCharm远程连接服务器前,已经成功跑起来了,这是前序工作(当然配好环境的工作量不小)

 

2. 理解.sh (shell脚本 - 以Occ为例)

首先打开官方文档,看看当时执行train的逻辑(每个项目都会有细微差别,但知识点相同)

说明在执行“CAM-R50_img1600_128x128x10.py”文件前,需要执行Linux的bash文件,python解释器不理解Linux语法,怎么办呢?不慌,咱细看这个shell脚本文件~

补充shell脚本讲解

  1. cd $(readlink -f dirname $0)

    • dirname $0 获取当前脚本文件所在的目录路径。
    • readlink -f 获取当前脚本所在目录的绝对路径。
    • cd 命令切换到这个绝对路径下,使得后续操作在该目录中进行。
  2. conda activate OpenOccupancy

    激活名为 “OpenOccupancy” 的 Conda 环境,以便在特定的环境中执行后续命令。
  3. export PYTHONPATH="."

    设置 Python 的模块搜索路径为当前目录(.表示当前目录),这样在运行 Python 程序时可以方便地找到当前目录下的模块。
  4. echo $1

    打印第一个命令行参数的值,这里是查看传入的参数。
  5. if [ -f $1 ]; then

    检查第一个命令行参数是否为一个文件。-f是一个条件判断,用于判断参数所代表的路径是否指向一个常规文件。
  6. config=$1

    • 如果第一个参数是一个文件,将其赋值给变量config,后续用于指定配置文件。
  7. bash tools/dist_train.sh $config $2 ${@:3}

  • 调用tools目录下的dist_train.sh脚本进行分布式训练。
  • 将前面确定的配置文件($config)、第二个命令行参数($2)以及第三个及以后的所有参数(${@:3})传递给这个脚本。

执行命令: “bash run.sh./projects/configs/baselines/CAM-R50_img1600_128x128x10.py 1” 时, 对应关系如下:

  1. ./projects/configs/baselines/CAM-R50_img1600_128x128x10.py对应代码中的$1。在代码中,首先检查这个参数所代表的路径是否是一个文件,如果是,则将其赋值给config变量,后续用于指定配置文件进行分布式训练。
  2. “1” 对应代码中的$2。这个参数指的是用几个gpu训练,会在最后被传递给dist_train.sh脚本进行分布式训练。

这里又嵌套了一层tools/dist_train.sh,咱来看看这个shell脚本写了什么:(在tools目录下)

#!/usr/bin/env bash
# 配置文件路径,由脚本的第一个参数传入,就是上面的.py文件
CONFIG=$1
# GPU 数量,由脚本的第二个参数传入
GPUS=$2
# 如果环境变量 NNODES 未设置,则默认为 1,表示分布式训练中的节点数量
NNODES=${NNODES:-1}
# 如果环境变量 NODE_RANK 未设置,则默认为 0,表示当前节点在分布式训练中的排名
NODE_RANK=${NODE_RANK:-0}
# 如果环境变量 PORT 未设置,则默认为 29501,通常用于分布式训练中的节点间通信
PORT=${PORT:-29501}
# 如果环境变量 MASTER_ADDR 未设置,则默认为"127.0.0.1",通常是分布式训练中的主节点地址
MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"}

# 将当前脚本所在目录的上级目录添加到 PYTHONPATH 环境变量中
PYTHONPATH="$(dirname $0)/..":$PYTHONPATH 

# 使用 PyTorch 的分布式启动模块启动训练程序
python -m torch.distributed.launch \
    # 设置分布式训练的节点数量
    --nnodes=$NNODES \
    # 设置当前节点的排名
    --node_rank=$NODE_RANK \
    # 设置主节点的地址
    --master_addr=$MASTER_ADDR \
    # 设置每个节点上的进程数量(通常对应 GPU 数量)
    --nproc_per_node=$GPUS \
    # 设置用于节点间通信的端口
    --master_port=$PORT \
    # 启动分布式训练的 Python 程序 train.py,使用当前脚本所在目录的路径来找到这个程序
    $(dirname "$0")/train.py \
    # 将配置文件路径传递给 train.py;在本例中,CONFIG参数就是这个路径: CAM-R50_img1600_128x128x10.py
    $CONFIG \
    # 设置随机种子为 0,可能是为了保证实验的可重复性
    --seed 0 \
    # 设置启动器为 PyTorch,并将脚本的第三个及以后的参数传递给 train.py;这里咱暂时还用不上
    --launcher pytorch ${@:3}

要想在PyCharm里运行这个训练脚本(bash run.sh./projects/configs/baselines/CAM-R50_img1600_128x128x10.py 1),需要配置运行参数!

 

3. 配置运行参数 (PyCharm)

(1)在 PyCharm 顶部菜单栏中,选择 “Run”(运行)>“Edit Configurations”(编辑配置)

 

(2)设为“module”(不要选script)→ 输入"PyTorch 的分布式启动模块启动"的命令 → 展开后把环境变量粘贴过来

补充:“module”和“script”

a. 选script的情况

如果执行的linux命令是

python tools/train.py projects/configs/flashocc/flashocc-r50-M0.py

执行的事一个.py的脚本,就得选择“script”,类似于这样:

b. 选module的情况

如果执行的linux命令是运行一个.sh文件,则如下文操作:

--nnodes=1
--node_rank=0
--master_addr="127.0.0.1"
--nproc_per_node=1
--master_port=29501
./tools/train.py
./projects/configs/Cascade-Occupancy-Network/CAM-R50_img_trans_sp.py
--seed
0
--launcher
pytorch

值得注意的路径问题:

$(dirname "$0")/train.py → ./tools/train.py
  • 是因为train.py在OpenOccupancy/tools里,而我们要执行的“OpenOccupancy/projects/configs/baselines/CAM-R50_img1600_128x128x10.py”并不在OpenOccupancy/tools路径下
  • 而同时需要用到的train.py却在“OpenOccupancy/tools”路径下,两个文件的路径不一样
  • 因此把工作目录: “E:/code/OpenOccupancy/tools”→“E:/code/OpenOccupancy”
  • 的同时,需要改粘贴过来的配置文件路径: train.py → ./tools/train.py

路径映射(推荐)

没有路径映射可能会出问题

小结

  • 这下点击确定后重新执行,就不会再报错啦(以上的每一步,都是建立在运行后报错,找原因,改进后的实践经验总结)
  • 运行剩下的不同的训练脚本,修改的方法都大同小异

 

### 如何在 PyCharm运行名为 `run.sh` 的脚本 要在 PyCharm运行名为 `run.sh` 的脚本,可以按照以下方法操作: #### 配置 Shell Script 运行环境 确保本地已经安装了支持 `.sh` 文件运行的 Bash 或其他 shell 解释器。如果未配置好解释器路径,在 PyCharm 设置中需指定其位置。 #### 创建外部工具配置 通过创建外部工具的方式可以让 PyCharm 执行自定义脚本: 1. **打开设置窗口**:进入菜单栏依次点击 `File -> Settings...`。 2. **导航到外部工具选项卡**:展开左侧树形结构找到 `Tools -> External Tools` 并单击它。 3. **新增外部工具条目**:点击右上角加号按钮添加新项。 - 填写名称字段为 “Run Run.SH”,便于识别此功能用途; - 在程序输入框填入 `/bin/bash` 表明采用哪种方式解析执行目标文件; - 参数处填写 `${FilePath}` 动态传递当前选中文档绝对地址给上述命令作为处理对象[^1]; 4. 应用更改并关闭对话框保存修改后的设定值。 #### 使用调试模式运行脚本 另一种更灵活的方法就是利用内置终端或者直接构建一个新的运行/调试配置来完成同样的目的: - 右键项目视图里的 `run.sh` 文件选择新建 Run Configuration... - 类型挑选成 "Shell Script" - 修改 Working Directory 至实际存放该批处理的位置 - 启动即可看到效果[^2] 对于某些特殊场景下可能遇到无法正常终止的情况,可尝试强制杀死对应后台服务进程实现中断[^3]: ```bash ps aux | grep run.sh | awk '{print $2}'|xargs sudo kill -9 ``` 另外值得注意的是当面对复杂业务逻辑需求时比如需要监控特定应用状态再决定是否重启等情况则建议编写更加完善的控制脚本来满足具体要求[^4]. ```python def check_and_restart_service(service_name): import os result = os.popen(f'pidof {service_name}') pids = result.read().strip() if not pids: print(f"{service_name} is down, restarting...") os.system(f'sudo systemctl start {service_name}') else: print(f"{service_name} is running with PID(s): {pids}") check_and_restart_service('gitea') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值