在使用modelscope-funasr进行finetune时,是否遇到过"RuntimeError: DataLoader worker(pid xxx) is killed by signal: Killed"的错误,在80GB内存和共享内存的Docker容器环境中,运行funasr版本0.8.8和modelscope版本1.8.1时,尝试微调的模型为speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online,请问有人遇到吗?
在使用 modelscope-funasr
进行微调时,出现 RuntimeError: DataLoader worker(pid xxx) is killed by signal: Killed
的错误,通常与系统资源不足或配置问题有关。以下是针对该问题的详细分析和解决方法:
根据知识库中的信息,此类错误可能由以下原因导致: - 内存不足:尽管您提到容器环境有80GB内存,但共享内存(/dev/shm
)的大小可能不足,尤其是在多线程数据加载时。 - DataLoader 配置问题:DataLoader
的 num_workers
参数设置过高可能导致系统资源耗尽,尤其是当每个 Worker 占用较多内存时。 - Docker 容器限制:即使宿主机内存充足,Docker 容器的内存或共享内存限制可能未正确配置,导致进程被强制终止。
共享内存(/dev/shm
)是 Linux 系统中用于进程间通信的临时文件系统,默认大小通常为物理内存的一半。如果共享内存不足,可能会导致 DataLoader
的子进程被杀死。
检查共享内存大小: 在容器内运行以下命令,查看 /dev/shm
的大小:
df -h /dev/shm
如果共享内存过小(例如小于 1GB),需要调整 Docker 容器的启动参数。
调整共享内存大小: 启动 Docker 容器时,通过 --shm-size
参数增加共享内存大小。例如:
docker run --shm-size=16G ...
建议将共享内存设置为至少 16GB 或更高,以满足大规模模型训练的需求。
num_workers
参数DataLoader
的 num_workers
参数控制数据加载的并发线程数。如果设置过高,可能会导致内存耗尽。
降低 num_workers
值: 尝试将 num_workers
设置为较小的值(例如 4 或 2),观察是否解决问题。例如:
train_loader = torch.utils.data.DataLoader(train_set, num_workers=4, batch_size=32, shuffle=True)
验证优化效果: 根据知识库中的案例,减少 num_workers
可以显著降低数据加载阶段的内存占用。
确保 Docker 容器的内存和 CPU 资源未受到限制。
检查容器资源限制: 使用以下命令查看容器的资源限制:
docker inspect <container_id> | grep -i memory
如果发现内存限制过低(例如低于 80GB),需要重新启动容器并移除限制。
移除资源限制: 启动容器时,避免设置 --memory
或 --cpus
参数,以充分利用宿主机资源。
在训练过程中,实时监控系统资源使用情况,定位潜在瓶颈。
监控工具: 使用 nvidia-smi
和 htop
工具分别监控 GPU 和 CPU 内存使用情况:
watch -n 1 nvidia-smi
htop
关注指标:
您当前使用的 funasr
版本为 0.8.8,modelscope
版本为 1.8.1。建议检查是否有更新版本,因为新版本可能修复了相关问题。
pip install --upgrade funasr modelscope
如果上述方法仍无法解决问题,可以尝试减少 batch_size
参数,以降低单次数据加载的内存需求。
通过以上步骤,您可以逐步排查并解决 RuntimeError: DataLoader worker(pid xxx) is killed by signal: Killed
的问题。重点在于: - 调整共享内存大小,确保 /dev/shm
足够大。 - 优化 DataLoader 配置,降低 num_workers
和 batch_size
。 - 检查 Docker 容器资源限制,避免内存或 CPU 被限制。
如果问题仍未解决,请提供更多上下文信息(如完整的错误日志、系统资源使用情况等),以便进一步分析。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。