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:
- Downgrade the protobuf package to 3.20.x or lower.
- 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)被设置为零或负数,或者没有正确计算或传递。
以下是解决这个问题的方法:
- 验证 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