darknet: ./src/utils.c:256: error: Assertion `0‘ failed.已放弃 (核心已转储)

文章讲述了在尝试使用学长在Windows环境下训练的darknet权重文件时,在Linux系统中遇到的‘Assertion‘0’failed.’错误。问题源于Windows与Linux的换行符差异。解决方案是使用vi编辑器,设置文件格式为unix,然后保存,从而修复权重文件使其在Linux环境下正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天借学长的权重文件试用,又出现了新的错误:

First section must be [net] or [network]: Success
darknet: ./src/utils.c:256: error: Assertion `0' failed.
已放弃 (核心已转储)

出现这个问题是因为学长是在Windows下训练的darknet。在Windows下换行符是\n\r,而Linux下则是\n,所以就会有多出来的\r。学长Windows下的权重文件在我的Linux系统里不能被识别。

解决办法:

1.在权重文件目录下打开终端,打开文件,如:输入vi ./yolov3-KD_test.cfg

此时进入文本编辑器,大概长这样:

2.输入命令,注意前面的冒号

: set ff=unix 

然后按回车

 3.输入:wq,保存离开

:wq

再在darknet中打开终端,重新输入验证命令:

 

可以看到已经解决问题啦。 

 

参考网址:

Darknet YOLO 训练问题集锦_宿魄man的博客-优快云博客

: set ff=unix 然后保存_weixin_30246221的博客-优快云博客

<think>我们正在处理用户关于Darknet训练时出现的CUDA错误:`darknet: ./src/cuda.c:36: check_error: Assertion `0' failed. Aborted (core dumped)`。根据引用[1][2][3],这个错误通常与CUDA内存不足(out of memory)有关。下面将系统地分析原因并提供解决方案。 ## 错误原因分析 1. **显存不足(OOM)**:这是最常见的原因,当GPU显存无法容纳模型和数据时触发[^1][^2]。 - 模型复杂(如YOLOv3)或输入图像尺寸过大 - Batch size或subdivisions设置不合理 2. **CUDA环境问题**:CUDA驱动、运行时版本与Darknet不兼容[^2]。 3. **权限问题**:运行用户没有访问GPU设备的权限[^2]。 4. **代码缺陷**:Darknet源码在特定条件下触发断言(较少见)[^3]。 ## 解决方案 ### 第一步:降低显存消耗(推荐优先尝试) 1. **调整`subdivisions``batch`参数**: - 打开网络配置文件(如`yolov3-voc.cfg`) - 增大`subdivisions`值(按2的倍数递增) ```ini [net] batch=64 subdivisions=32 # 原值可能是16或更小 → 改为64或128 ``` - 原理:将批次分割成更小的子批次,减少单次显存占用[^2]。 2. **减小输入尺寸**: - 修改配置中的`width``height` ```ini width=416 # 原值可能是608 height=416 # 原值可能是608 ``` 3. **关闭数据增强**(临时测试): ```ini flip=0 # 关闭翻转增强 blur=0 # 关闭模糊增强 ``` ### 第二步:验证CUDA环境 1. 检查CUDA状态: ```bash nvidia-smi # 查看GPU使用情况 nvcc --version # 查看CUDA编译器版本 ``` 2. 确认Darknet编译选项: - 重新编译前修改`Makefile````makefile GPU=1 # 启用GPU CUDNN=1 # 启用cuDNN CUDNN_HALF=0 # 关闭半精度(可减少显存但可能影响精度) ``` - 重新编译: ```bash make clean make -j8 ``` ### 第三步:检查权限 1. 将用户加入`video`组(Linux): ```bash sudo usermod -aG video $USER ``` 2. 重启系统使权限生效。 ### 第四步:其他高级方案 1. **使用更小模型**:如将`yolov3`替换为`yolov3-tiny`。 2. **多GPU分摊负载**: - 启动时添加`-gpus`参数: ```bash ./darknet detector train ... -gpus 0,1 # 使用两块GPU ``` 3. **梯度累积**(手动修改源码): - 在`src/detector.c`中修改梯度累积步数(需C语言基础)。 ## 验证修复 修改后运行测试命令: ```bash ./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_final.weights data/dog.jpg ``` > **重要提示**:每次只修改一个参数,便于定位问题根源。若仍失败,可查看`darknet`输出中`Total memory``Free memory`的数值差异[^1]。 ## 常见问题解答 - **Q**: 为什么增大`subdivisions`有效? **A**: 它将大批次拆解为多个子批次(`batch/subdivisions`),使单步显存需求降低为原来的$1/N$[^2]。 - **Q**: 如何确认是显存不足? **A**: 在训练命令前添加`watch -n 1 nvidia-smi`,观察显存占用是否接近100%。 ## 相关问题 1. 如何监控Darknet训练时的显存使用情况? 2. YOLOv4与YOLOv3的显存需求差异有多大? 3. 如何在低显存GPU上训练高分辨率模型? 4. Darknet支持哪些混合精度训练方法? 5. 如何估算特定模型和配置所需的显存大小? [^1]: CUDA内存不足导致断言失败 [^2]: 调整subdivisions解决显存问题 [^3]: 断言失败的其他可能原因</think>### Darknet训练错误:`check_error Assertion 0 failed in cuda.c line 36` 解决方案 此错误是Darknet训练中最常见的GPU内存问题,根本原因是**GPU显存不足**。以下是系统化的解决步骤: #### 1. 降低显存消耗(最有效方案) ```ini # 修改网络配置文件(如 yolov3-voc.cfg) [net] batch=64 # 原值可能是512或256 → 逐步减半 subdivisions=64 # 原值可能是16 → 按2的幂次增加(16→32→64) width=416 # 原值可能是608 → 降低分辨率 height=416 # 原值可能是608 ``` - **原理**:`subdivisions`控制单次处理的图像数,增大该值可减少显存压力[^2] - **验证公式**:显存需求 $\propto$ $\frac{batch}{subdivisions} \times (width \times height)$ - 调整后需重新开始训练 #### 2. 环境检查与优化 ```bash # 检查GPU状态 nvidia-smi watch -n 1 nvidia-smi # 实时监控显存占用 # 验证CUDA安装 nvcc --version ./darknet detector test ... # 单独运行测试命令 ``` - **关键指标**:确保`Free`显存 > 模型需求(YOLOv3约需4-6GB) - 关闭其他占用显存的程序(如GUI、Chrome等) #### 3. 配置深度优化 ```ini # 在cfg文件中添加/修改 angle=0 # 关闭旋转增强 saturation=0 # 关闭饱和度增强 exposure=0 # 关闭曝光增强 hue=0 # 关闭色调增强 ``` - 数据增强会显著增加显存消耗,训练初期可关闭[^3] #### 4. 系统级解决方案 ```bash # 清理显存残留 sudo rmmod nvidia_uvm sudo modprobe nvidia_uvm # 永久扩大显存池(需重启) echo 1024 | sudo tee /proc/sys/vm/nr_hugepages ``` #### 5. 替代方案(当显存严重不足时) 1. **使用轻量模型**: ```bash ./darknet detector train cfg/voc.data cfg/yolov3-tiny.cfg ... ``` 2. **启用CPU模式**(极慢): 修改`Makefile````makefile GPU=0 # 禁用GPU ``` 重新编译:`make clean && make` > **验证修复**:调整后运行训练命令,观察是否出现`CUDA error: out of memory`提示消失[^1] ### 常见问题解答 **Q**: 为什么增大`subdivisions`有效? **A**: 该参数将批次拆分为子批次,使单次显存需求降低为原来的$1/N$[^2] **Q**: 如何预估显存需求? **A**: 使用公式: $$ \text{显存(GB)} \approx 0.2 \times \frac{batch}{subdivisions} \times \left(\frac{width}{416}\right)^2 \times \left(\frac{height}{416}\right)^2 $$ **Q**: 调整后精度会下降吗? **A**: 减小`batch`可能影响稳定性,可通过增加迭代次数补偿(在`.data`文件中设置`max_batches=50000`) ### 相关问题 1. 如何监控Darknet训练时的显存使用情况? 2. YOLOv4与YOLOv3的显存需求差异有多大? 3. 如何在低显存GPU上训练高分辨率模型? 4. Darknet支持哪些混合精度训练方法? 5. 如何估算特定模型和配置所需的显存大小? [^1]: CUDA内存不足导致断言失败 [^2]: 调整subdivisions解决显存问题 [^3]: 关闭数据增强降低资源消耗
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值