复现ScePT

文章讲述了在argument_parser.py中处理数据集配置时遇到的TypeError和ValueError,涉及protobuf版本不兼容和torch.distributed环境变量设置问题。提供了解决方案,如升级protobuf、设置环境变量等。
摘要由CSDN通过智能技术生成

0、环境

在argument_parser.py中

配置数据集

parser.add_argument("--train_data_dict",
                    help="what file to load for training data",
                    type=str,
                    default='eth_train.pkl')###

parser.add_argument("--eval_data_dict",
                    help="what file to load for evaluation data",
                    type=str,
                    default='eth_val.pkl')

配置config

parser.add_argument("--conf",
                    help="path to json config file for hyperparameters",
                    type=str,
                    default='../config/clique_ped_config.json')###

1、TypeError: Descriptors cannot be created directly.

If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:

  1. Downgrade the protobuf package to 3.20.x or lower.
  2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).

More information: https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates

GPT:
您遇到的错误信息表明,protobuf 包与您代码中生成的 protobuf 描述符存在兼容性问题。这通常是因为 protobuf 描述符是用旧版本的 protoc 编译器生成的,而您正在使用的 Python 中的 protobuf 库希望使用由较新版本编译器生成的描述符。

以下是几种解决这个问题的方法:

重新生成 Protobuf 文件:

确保您安装了正确版本的 protoc 编译器,根据错误信息,至少应为 3.19.0 版本。
使用 protoc 编译器重新生成 protobuf 描述符文件(.pb2.py 文件)。可以通过运行如下命令来操作:
css
Copy code
protoc --python_out=. your_proto_file.proto
将 your_proto_file.proto 替换为您实际的 .proto 文件路径。

降级 protobuf 库:

如果暂时无法重新生成 protobuf 文件,您可以临时将 Python 库中的 protobuf 降级到 3.20.x 或更低版本,这应该与您当前的 protobuf 文件兼容。可以使用 pip 进行降级:
Copy code
pip install protobuf==3.20.0
调整您的环境设置,记住这只是一个临时解决方案。

选择方案2

pip uninstall protobuf
pip install protobuf==3.20.0

2、ValueError: Error initializing torch.distributed using env:// rendezvous: environment variable RANK expected, but not set

GPT:

您遇到的错误信息表明,在使用 PyTorch 的分布式训练系统时,系统期望设置某些环境变量,但这些变量没有被设置。具体来说,错误指出 RANK 环境变量没有设置。这个变量对于分布式训练非常重要,因为它定义了参与训练的各个进程中每个进程的唯一标识符。

在 PyTorch 的分布式训练中,通常需要设置以下几个环境变量:

RANK:参与训练的每个进程的唯一标识符。排名范围从 0 到 WORLD_SIZE - 1。
WORLD_SIZE:参与训练的进程总数。
MASTER_ADDR:托管排名为 0 的进程的机器的 IP 地址。
MASTER_PORT:主节点上用于训练通信的端口。
以下是如何设置这些环境变量并运行脚本的步骤:

步骤 1:设置环境变量
您可以在运行训练脚本之前在命令行中设置环境变量。这里是在 Windows 上进行设置的一个示例:

cmd
Copy code
set MASTER_ADDR=localhost
set MASTER_PORT=12345
set RANK=0
set WORLD_SIZE=4
python D:/sizz/model/ScePT/ScePT-main/ScePT/train.py
这个例子假设您在一台机器上本地运行一个小型的分布式训练作业,总共有 4 个进程。如果您使用多台机器,每台机器的 RANK 将不同,MASTER_ADDR 应该是托管排名为 0 的进程的机器的 IP 地址。

步骤 2:启动进程
如果您是手动运行进程,需要打开几个命令提示符,并在每一个中适当设置 RANK(例如对于总共 4 个进程,分别设置为 0、1、2、3)。

步骤 3:确保脚本正确配置
确保您的脚本正确设置了分布式训练:

如果您使用 NVIDIA 的 torch.distributed.launch 或类似工具,脚本应正确解析并使用 local_rank 参数。
脚本应包括适当地设置分布式环境的调用,通常是使用 torch.distributed.init_process_group。
其他提示
对于本地测试,将 MASTER_ADDR 设置为 localhost 是可行的。
确保 MASTER_PORT 是空闲的,没有被任何防火墙阻塞。
确保所有参与的进程/机器上的这些变量设置一致性至关重要。

在train.py添加了

import os

os.environ['MASTER_ADDR'] = 'localhost'
os.environ['MASTER_PORT'] = '12345'
os.environ['RANK'] = '0'
os.environ['WORLD_SIZE'] = '1'

3、ValueError: Number of processes must be at least 1

GPT:
您遇到的错误信息 “Number of processes must be at least 1” 表示为进程池指定的工作进程数量少于1。这通常发生在用于确定工作进程数量的变量(在您的案例中为 num_workers)被设置为零或负数,或者没有正确计算或传递。

以下是解决这个问题的方法:

  1. 验证 num_workers 的值
    检查您的脚本中 num_workers 是如何定义或计算的。您需要确保这个值至少为1。通常,这个值是基于可用的CPU核心数量设置的,或者在脚本中明确配置的。如果它依赖于某种计算,请验证计算是否正确。

在argument_parser.py中

parser.add_argument("--preprocess_workers",
                    help="number of processes to spawn for preprocessing",
                    type=int,
                    default=1)###default从0变1

运行成功

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值