Multi-Exit Network 实现细节

一、动机:
(1)在现实中对图像分类难度不一,采用一个固定的框架对图片进行分类时有时不够灵活。
主要思想就是在一个网络中有多个分类出口(创新点),对于简单图像可以直接从前面某个分类出口得到结果,而难分类的网络可能要到网络后面的某一层才能得到可靠的结果.
(2)动态网络的early-exit可以减少计算量,同时latter-exit也不必重复进行浅层backbone的inference,加快速度 。
主要应用领域:图像分类,语义分割
数据集:MNIST, CIFAR 10,CIFAR 100, ImageNet, COCO, PASCAL VOC

二、exit branch是一个分类器,输出每个类别的概率。
(1)数量:2~n个exit
(2)结构:卷积层、全连接层、池化层+softmax
(3)位置:位于每个block之后。
一些文献指出,在backbone中稍后面的放置一个exit并不一定会提高该分支的整体准确性,可能在更前的位置效果更好。
一般来说,exit位于“自然块”之后,例如concatenation layer,residual connection, dense block之后,它们的性能更好

全连接层作为branch,参考:https://github.com/ArchipLab-LinfengZhang/pytorch-scalable-neural-networks
max pool + avg pool +全连接作为branch,参考:https://github.com/yigitcankaya/Shallow-Deep-Networks
conv+conv+avg pool+全连接作为branch,参考:https://github.com/kalviny/MSDNet-PyTorch

三、多级网络的训练方法:
(1)end-to-end, one-stage, 联合训练所有branch的loss,每个branch的loss有一个超参数权重。问题:该方法对branch位置敏感,一个branch的acc可能受其他branch影响
(2)layer-wise, 分级训练, n-stage,第一次训练模型直到第一个branch的部分,第二次冻结之前的权重,训练模型剩余部分直到第二个branch的部分,依次进行。
(3)classifier-wise, n-stage, 首先训练backbone+final exit,然后冻结backbone,单独训练每个branch
(4)在上述三种基础上,加入知识蒸馏,其中许多文献采用自蒸馏方法,采用最后一级branch作为teacher蒸馏前面的branch
(5)可能存在的其他创新

1、End-to-End训练,并加入自蒸馏:参考 https://github.com/ArchipLab-LinfengZhang/pytorch-scalable-neural-networks
作者采用三个损失
(1)分类损失,交叉熵。
(2)自蒸馏损失,用final exit蒸馏前面的exit,交叉熵。
(3)特征损失,最后一层ResBlock与前面的ResBlock输出的特征损失,计算特征误差的平方和。

for epoch in range(args.epoch):
    net.train()
    sum_loss = 0.0
    correct = 0.0
    total = 0.0
    for i, data in enumerate(trainloader, 0):
        length = len(trainloader)
        inputs, labels = data
        inputs, labels = inputs.to(device), labels.to(device)
        outputs, feature_loss = net(inputs)  #outputs包含四个branch的输出 [out4, out3, out2, out1], feature_loss是最后的branch输出特征和前面的branch特征的平方差之和

        ensemble = sum(outputs[:-1])/len(outputs)  #ensemble是所有branch的平均输出
        ensemble.detach_()
        ensemble.requires_grad = False

        #   compute loss
        loss = torch.FloatTensor([0.]).to(device)

        #最后一级branch的loss
        loss += criterion(outputs[0], labels)

        #最后一级branch作为teacher
        teacher_output = outputs[0].detach
<think>好的,我现在需要帮助用户排查systemd服务文件不生效的问题。用户提到他们的服务文件中有ExecStop指定了python3脚本,并且设置了DefaultDependencies=no和multi-user.target。首先,我应该回忆一下systemd服务的基本结构和常见问题点。 首先,ExecStop的用途是在服务停止时执行命令,但如果服务从未启动,可能不会触发ExecStop。用户的服务是否成功启动过?如果服务启动失败,ExecStop自然不会执行。需要检查服务状态,比如用systemctl status看看是否有启动错误。 然后是DefaultDependencies=no这个设置。systemd的默认依赖包括基本的目标(如basic.target)和关机相关的服务。如果关闭了默认依赖,可能需要手动添加必要的依赖,比如After=sysinit.target等,否则可能导致服务在需要的环境还没准备好之前就启动,或者无法正确停止。用户的服务是否有正确的依赖关系?特别是他们提到multi-user.target,可能需要明确指定After=multi-user.target或者Wants=multi-user.target,以确保服务在正确的时间启动。 另外,服务类型(Type)的设置也很重要。如果服务是长时间运行的,Type应该设为simple或forking,如果没有正确设置,systemd可能误判服务状态,导致意外行为。用户的脚本是否在前台运行?如果脚本退出太快,可能需要设置Type=oneshot并配合RemainAfterExit=yes。 还有,权限问题也是一个常见原因。服务文件是否有正确的用户和组设置?执行python脚本是否需要特定权限?此外,脚本本身的路径是否正确,是否可执行?需要检查脚本的绝对路径和权限设置。 另外,用户使用了multi-user.target,但DefaultDependencies=no可能导致服务没有正确绑定到目标。需要检查是否在[Install]部分有WantedBy=multi-user.target,否则服务可能不会被自动启动,除非手动启用。用户是否运行了systemctl enable来创建符号链接? 可能还需要查看日志,用journalctl -u service_name来查看详细错误信息,是否有权限拒绝、路径错误或依赖缺失的问题。 总结下来,可能的排查步骤包括:检查服务状态和日志,验证依赖和绑定目标,确认服务类型和权限设置,确保脚本路径正确,以及确认服务是否已正确启用。需要一步步排除这些可能性,帮助用户定位问题所在。</think>针对systemd服务文件不生效的问题,以下是逐步排查方案: ### 1. 验证服务文件语法 ```bash # 检查服务文件语法(以auditd.service为例) $ systemd-analyze verify /usr/lib/systemd/system/auditd.service ``` 若出现类似`Failed to create... No such file or directory`错误,需检查服务文件路径是否正确[^1] ### 2. 检查服务依赖关系 当设置`DefaultDependencies=no`时,必须显式声明依赖: ```ini [Unit] After=sysinit.target Before=shutdown.target Conflicts=shutdown.target ``` 缺少这些声明可能导致服务在系统关闭时无法正常停止 ### 3. 确认目标绑定 确保在`[Install]`段正确指定目标: ```ini [Install] WantedBy=multi-user.target ``` 需执行`sudo systemctl enable your_service`创建符号链接到目标目录 ### 4. 调试ExecStop问题 ```bash # 查看完整日志 $ journalctl -u your_service -b --no-pager ``` 重点关注以下错误模式: - `Executable path is not absolute`(必须使用绝对路径) - `Permission denied`(需设置`User=`参数) - `Exit code=203`(执行环境不完整) ### 5. 服务类型选择 根据脚本特性选择合适的Type: ```ini [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/python3 /path/to/power_off_i2c.py ``` 适用于单次执行脚本的场景 ### 6. 权限配置建议 ```ini [Service] User=root Group=root WorkingDirectory=/path/to/script Environment="PYTHONPATH=/custom/path" ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值