S1NH

世界在旅程的尽头终结

最近在客串“客服”,教公司内部转行做 AI 的0基础新手把模型训练跑起来。

有一小部分完全不懂 Linux 的,需要学一下基本命令和 Docker 的用法,这里就不讨论了。今天主要聊的是已经迈过基本功门槛,开始尝试多机多卡分布式训练的学员。

0x01:关于 NCCL Timeout

训练的时候大家基本都碰到过 NCCL Timeout 的问题。一般人搜一下就会觉得是节点通信出故障了,肯定是服务器坏了,然后就会上报给平台运维处理。

其实 NCCL Timeout 原因有很多,大概率还是自己写的代码有问题(特别是对于新手来说)。一般我会用这几个方法来排除:

首先设置环境变量:

1
2
export NCCL_IB_DISABLE=1
export NCCL_P2P_DISABLE=1
  • 如果这都跑不通:基本是自己的代码出故障了。建议看一下各个节点的日志,比如是不是某一个节点在读文件的时候失败退出了,或者有某个子节点 OOM 启动失败了。
  • 如果设置这两个跑通了:那可以去找一下平台运维。

如果想自己解决的话,可以按照以下步骤再排查一下:

  1. 如果 NCCL_P2P_DISABLE=1 跑通了:可以使用 nvidia-smi topo -m 看看是不是机器没有 NVLink
  2. 如果 NCCL_IB_DISABLE=1 跑通了:可以检查一下机器是不是没有 IB 网卡,或者网卡是不是设置错了。可以使用 NCCL_SOCKET_IFNAME 指定一下真实的 IB 网卡试试。

0x02:多节点训练巨慢

另外还有一个很常见的问题:

有的人单机(8卡)训练速度还挺快的,但是多节点就巨慢。通常新手(或平台)会把问题怪到存储服务器上,觉得是多个机器同时读一个磁盘太卡了,或者看到网络带宽占满了,就要求升级网络带宽。

这种情况一般可以检查一下配置文件,看是不是用了 ZeRO-3,如果是,就替换成zero2试试。

0x03:Early Stop 被识别成异常退出

最后分享个好玩的,还见过一个人代码里写了 Early Stop,模型收敛了直接把进程杀了。

然后看到了平台提示的“失败”就来问我。

0xFF

建议新手在训练模型之前,一定要先恶补一下基础知识

run npm i theme-next/next-util.

hexo 安装 hexo-next-title hexo-next-share hexo-next-exif hexo-next-utteranc 等插件后,会出现以下 warnning:

1
2
3
WARN  The upstream repository of theme NexT has been changed.
WARN For more information: https://github.com/next-theme/hexo-theme-next
WARN Documentation: https://theme-next.js.org

原因在 npmjs/next-util 的 10-12 行。

为了告诉你不要用 theme-next 而要用 next-theme。

解决方案是使用 npm i theme-next/next-util 直接安装 github 版本next-util.

发现 git 仓库的存储空间有问题,原来是一不小心提交了二进制文件。作为强迫症患者学习了一下如何给仓库瘦身。

清理前 repository 为 93.1 MiB,清理后 repository 为 1.6 MiB.

0x01 备份

重写存储库历史记录是一种破坏性操作。首先需要备份仓库,在 Settings > General > Advanced > Export project 导出项目。

0x02 清理

阅读全文 »

Alfa Romeo Stelvio headlight switch disassembly, allowing headlights to stay off.
The headlight switch of the Alfa Romeo Stelvio cannot be kept off. The specific performance is that the switch is turned to the far left to turn off the headlight, and the switch automatically resets to the on mode after letting go.

Alfa Romeo Stelvio 的大灯开关无法保持关闭,具体表现为开关拧到最左边大灯关闭,松手后开关自动复位到开启模式。搜了一下国内外都没有改装教程,就自己写了一个发出来。

1. 从后面捅掉盖子
阅读全文 »

linux 中通过非 root 账户使用 ifconfig 设置 ip 的方法

  1. 创建一个 ifconfig 的副本;
  2. 通过 setcap 向副本授予 CAP_NET_ADMIN 能力,而不必授予 root(用户 ID 0)的完整权限;
  3. 为了避免非法用户使用这个副本来修改网络,需要给ifconfig副本设置新的权限,仅允许该组的成员执行。
1
2
3
4
cp /sbin/ifconfig .
sudo setcap cap_net_admin=eip ./ifconfig
./ifconfig eth0 1.2.3.4 # succeeds
chmod 750 ./ifconfig

FastDDS 无法发送超过 255 string

可能会有 log

1
[RTPS_READER_HISTORY Error] Change payload size of 'xxx' bytes is larger than the history payload size of '271' bytes and cannot be resized. -> Function can_change_be_added_nts

在 subscriber 加

1
rqos.endpoints().history_memory_policy = eprosima::fastrtps::rtps::DYNAMIC_RESERVE_MEMORY_MODE;

翻译自 https://www.geeksforgeeks.org/python-different-ways-to-kill-a-thread/

通常,突然终止线程被认为是一种糟糕的编程习惯。突然终止线程可能会使必须正确关闭的关键资源处于打开状态。但是您可能希望在某个特定时间段过去或产生某个中断后终止线程。

下面有6种方式杀死线程,其中前两种较常用,我在原文的基础上进行了一些修改,以覆盖更多的情况。

  • 在 python 线程中抛出异常
  • 使用 flag / Event()
  • 使用 traces 杀死线程
  • 使用 multiprocessing module 杀死线程
  • 通过将其设置为守护进程来杀死 Python 线程
  • 使用隐藏函数 _stop()
阅读全文 »

之前使用的 valine 评论工具有一些漏洞会导致隐私泄漏和XSS攻击,比如[这个],目前更换为 utteranc ,一个基于 github 的评论工具。之前的评论放弃迁移了,直接贴在本文。

阅读全文 »

1. 通过 git squash 合并分支

有的项目要求一个 commit 必须包含完整的功能,但在开发时通常会提交很多细粒度的 commit,比如 add test clean code 等。这种情况下可以使用 git squash 将多个 commit 压缩,得到干净的主分支。

1
2
3
4
5
6
7
8
git merge --squash tmp
git commit -m "squash tmp"

# In the following graph, G is c--d--e--f--g squashed together

X-------------G stable
/
a---b---c---d---e---f---g tmp

2. 调试被 squash 后的代码

squash 的优点是可以得到简洁的 commit 记录,但缺失详细的 commit 记录会对后面 debug 造成一些影响。

比如,使用FastDDS后,我一直在调试一个无法重连的bug,通过 log 可以定位到这个 bug 是在一次 2000 行的 commit 引入的。如果现在开始读这两千行代码肯定会浪费很多时间。

现在要借助 github,在 pull request 页面可以找到详细的 23 个 commit 记录,并定位到引入 bug 的 commit:

为了防止这个 commit 不完整,我们需要手动下载引入 bug 的代码,和引入 bug 之前的代码,分别做一次回归测试。(手动下载代码的原因是,这些 commit ID 不在 git repo 里,无法 checkout)

在 master 里改完 bug 以后,为了防止引入新 bug,别忘了跑回归测试。

刚开始用 FastDDS 的时候就发现这个问题,原以为是共享内存 deadlock 了,于是就有了前面关于 boost 鲁棒锁的那篇帖子。但问题并没有这么简单 >_<
这个问题在 Github/eProsima/Fast-DDS#2811 有详细记录。

对 FastDDS 程序进行 debug 时,将 subscriber 暂停,等一会再重启,subscriber将无法再次接收数据。Publisher / Subscriber 的日志如下

1
2
3
4
5
6
7
8
Publisher
2022-09-06 14:10:47.049 [RTPS_TRANSPORT_SHM Warning] SHM Port 7413 failure: the port is marked as not ok! -> Function try_push
2022-09-06 14:10:47.049 [RTPS_TRANSPORT_SHM Warning] (ID:140091162883648) Existing Port 7413 (5f4eeb5613a33705) NOT Healthy. -> Function open_port_internal
2022-09-06 14:10:47.049 [RTPS_TRANSPORT_SHM Warning] (ID:140091162883648) Port 7413 (5f4eeb5613a33705) Removed. -> Function open_port_internal
Message: HelloWorld with index: 157 SENT
2022-09-06 14:10:47.246 [RTPS_TRANSPORT_SHM Warning] SHM Port 7412 failure: the port is marked as not ok! -> Function try_push
2022-09-06 14:10:47.248 [RTPS_TRANSPORT_SHM Warning] (ID:140091402036800) Existing Port 7412 (3e1fa9f9eb2b0ade) NOT Healthy. -> Function open_port_internal
2022-09-06 14:10:47.248 [RTPS_TRANSPORT_SHM Warning] (ID:140091402036800) Port 7412 (3e1fa9f9eb2b0ade) Removed. -> Function open_port_internal
1
2
3
Subscriber
2022-09-07 14:50:27.441 [RTPS_TRANSPORT_SHM Warning] (ID:140737325877056) Port 7412 Zombie. Reset the port -> Function open_port_internal
2022-09-07 14:50:27.442 [RTPS_TRANSPORT_SHM Warning] (ID:140737325877056) Port 7413 Zombie. Reset the port -> Function open_port_internal

查看 log 对应的代码,最后定位到可能出现问题的 commit 在 eProsima/Fast-DDS@e58dcb1

这个 commit 是 Pull Request 时将几十个 commit squash 在一起的[链接]。squash 前的 commit 在 github 可以查看,但用 git 命令是无法 checkout 的,所以手动下载了一堆源码编译,二分查找了一下,最后定位在下面这个 commit:

Refs #8250. Do not reuse zombie ports structures.
@adolfomarver authored and @MiguelCompany committed on May 12, 2020

问题看起来像是 Subscriber 拒绝复用 zombie ports,但又没申请新的 port.
注释了几行代码,可以暂时避免这个问题,参考 duchengyao@Fast-DDS/commit/63ad668

  • Boost 是一个开源 C++ 算法库,是官方认证的对标准 C++ 的扩充(有点类似 python 的 anaconda)。C++ 15 / 17 等新版本有很多特性也会参考 boost 库;
  • boost:Interprocess 实现了进程间通信功能,包括共享内存、内存映射文件、信号量、文件锁、消息队列等;
  • 共享内存 指可被多个进程存取的内存,被用作进程间的通信。

boost::interprocess 在 1.78 版本之前如果进程崩溃可能导致死锁。从18年就有人提出这个issue,21年才修复。
最简单的复现方法是执行三遍下面的代码:

1
2
3
4
5
6
7
8
#include "boost/interprocess/managed_shared_memory.hpp"

int main() {
boost::interprocess::managed_shared_memory managed_shm{
boost::interprocess::open_or_create, "Boost", 1024
};
int* i = managed_shm.construct<int>("Int")(99);
}
  • 第一遍在共享内存中创建 Boost 文件,并写入一个 Key 为 Int 的变量 99;
  • 第二遍尝试再次写入时发现已经有这个Key了,写不进去。程序崩溃,并抛出异常:
    terminate called after throwing an instance of 'boost::interprocess::interprocess_exception'
    what(): boost::interprocess_exception::library_error
  • 第三遍因为上次的崩溃时没有释放锁,程序死锁;
  • 新版本的 boost 在第三次执行程序的时候会不会死锁,抛出异常 :
    terminate called after throwing an instance of 'boost::interprocess::lock_exception'
    what(): boost::interprocess::lock_exception

原因在这几行,如果不想更新boost,改那几行也可以。

如果编译器支持 _POSIX_C_SOURCE >= 200809L,在构造锁的时候判断 pthread_mutexattr_setrobust(&m_attr, PTHREAD_MUTEX_ROBUST) != 0

pthread_mutexattr_setrobust 的说明在这里

FastDDS 新推出的零拷贝 (Zero Copy) 模式有很多难以理解的地方,在这里会持续做些整理。

目录

  1. 如何使用 ZeroCopy?
  2. ZeroCopy 理论上 subscriberpublisher 会使用同一个内存地址,为什么打印出来的地址不同?
  3. ZeroCopy 会分配多少空间,什么时候覆盖旧的样本?
  4. qos.history().depthqos.resource_limits().max_samples/extra_samples 什么关系?
阅读全文 »

目前使用 apt-mirror 会缺少文件,比如:

1
2
Err:18 http://mymirror.blah:80/ubuntu bionic/main DEP-11 64x64@2 Icons 404 Not Found [IP: *.*.*.* 80]
Err:64 http://mymirror.blah:80/ubuntu bionic-updates/main DEP-11 64x64@2 Icons 404 Not Found [IP: *.*.*.* 80]

需要使用下面的脚本修复。

阅读全文 »

上一篇文章吐槽了 创想三维 Sermoon V1 的缺点,其中包括不开源的主板。我花了几天时间逆向,得到了主板的配置文件。
使用此配置文件可以自行编译固件:开启 Lineradvance、加入 BLTouch 自动调平、降低待机时风扇的噪声。
新的配置文件在 Klipper3d/klipper#5621
官方已经开源了 CrealityOfficial/Sermoon-V1

另外,文章最后提供一个散热套件的模型。

阅读全文 »

本文不提供 Multiecuscan。如需使用请官网购买;或赞赏我(赞赏码在首页左侧、文章末尾),并留下微信号获取破解版。

阿尔法罗密欧的四叶草(Quadrifoglio)版本具有 Race 模式,在此模式下打开双模式排气,停用 ESC 稳定控制系统,同时提高油门、变速箱、制动和转向响应。

在普通版本的阿尔法罗密欧中,可以通过修改 Body Control Module(BCM) 的配置文件来启动隐藏的 Race 模式。

通常,改装 Race 模式的方法是去闲鱼购买一个四叶草版本的 DNA 开关(¥1100),远程开启隐藏功能(¥500)。这篇文章教你零成本开启此功能。

阅读全文 »

ROS 和前期的 Apollo 定义了一个 API,它向用户公开如发布/订阅等通信概念。
这些通信概念的实现基于自定义协议,并使用共享内存去降低基于Socket通信的开销。
这些传统方法存在一些问题,如每个节点以单独进程的形式存在,由底层操作系统调度,而Linux是个通用系统,每个节点的运行顺序并无任何逻辑。ROS是专用系统,任务应按照一定的业务逻辑执行。

ROS 2Apollo 3 的计算框架 Cyber RT 构建在现有中间件解决方案 DDS 之上 [1] [2]

Cyber RT 在此基础上构建了自己的调度器 [3],由一个多队列的任务编排策略调度协程(Coroutine)在 Native Thread 上有序运行。其中,Cyber RT 会动态的根据不同调度顺序的执行时间来动态的选择一个时间最短的调度策略。

阅读全文 »

去年把全景拼接算法部署到了郑州机场,实现 4×4K 视频采集、拼接、发布,在单个 1080ti 上可以达到 300FPS。

因为机场光照特别强烈,使用的廉价摄像头曝光不均匀。表现为每张图片都是中间曝光强,四周曝光弱,拼接以后在接缝处会出现条纹(下图)。因为摄像头上半部分是天空,我们假设天空的亮度、颜色是统一的,可以设计一个很简单的算法解决亮度不均匀的问题。

阅读全文 »

Initialize:

1
2
3
4
5
import tensorflow as tf
import numpy as np

dir = './model/tf_savedmodel'
zeros = tf.constant(np.zeros([1, 640, 960, 3]), dtype=float)

Work:

1
2
model = tf.saved_model.load(dir)
output = model.signatures['serving_default'](zeros)
1
2
model = tf.saved_model.load(dir)
output = model(zeros)

Failed:

1
2
model = tf.saved_model.load(dir).signatures['serving_default']
output = model(zeros)
1
2
3
4
5
tensorflow.python.framework.errors_impl.FailedPreconditionError:  Error while reading resource variable conv5_block17_0_bn/gamma_96932 from Container: localhost. This could mean that the variable was uninitialized. Not found: Resource localhost/conv5_block17_0_bn/gamma_96932/N10tensorflow3VarE does not exist.
[[{{node StatefulPartitionedCall/fusion_network/conv5_block17_0_bn/ReadVariableOp}}]] [Op:__inference_signature_wrapper_21102]

Function call stack:
signature_wrapper

User interview agreeableness conscientiousness extraversion neuroticism openness
heysky 0.920916 0.913731 0.919769 0.921289 0.914613 0.917014
hershd23 0.9180 0.9111 0.9153 0.9150 0.9100 0.9102
baseline 0.916202 0.91123 0.915228 0.91122 0.910378 0.911123
bekhouche 0.915746 0.910312 0.913775 0.91551 0.908297 0.910078
*MS1997 0.9047 0.9075 0.9066 0.9030 0.9018 0.9046
go2chayan 0.901859 0.903216 0.894914 0.90266 0.901147 0.904709
azzasama 0.872129 0.891004 0.865975 0.878842 0.863237 0.874761
阅读全文 »

Nano 的4G内存太小了(最近还出来一个2G版nano >_<),模型跑不动的患者可以通过以下几个步骤减少内存消耗。

1. 关闭用户图形界面
sudo systemctl set-default multi-user.target
sudo reboot

开启用户图形界面
sudo systemctl set-default graphical.target
sudo reboot

2. 切换图形界面
默认图形界面为Unity,Ubuntu 18 系统自带Gnome3,可切换到 lxde 以节约内存。

  • GNOME3 :1047M
  • Unity: 517M
  • xfce: 247M
  • lxde: 214M

3. 关闭 dockerd 节约 49M

0x01 Tensorflow 2.0

1.1. Convert

keras hdf5 –> .pb

1
2
3
4
5
6
# V2 behaviour is disabled by default in Jetpack 4.4.DP.
import tensorflow.compat.v2 as tf
from tensorflow.keras.models import load_model

model = load_model('./model/fer2013_mini_XCEPTION.102-0.66.hdf5')
model.save('./model/tf_savedmodel', save_format='tf')
阅读全文 »

  • 自然交互:更接近与人之间的交互方式。 PC:键盘鼠标;移动:触控;现在:语音、手势、图像。
  • 云端一体
  • 场景智能:主动感知、用户理解、个性化推荐、智能决策。

0x01 多模态自然交互

5G加速智联网时代的到来,多模态数据成为主流
电阻屏=>电容屏:流量从PC时代走向移动时代
多模态自然交互:移动时代走向智联网时代

  • 1976 发现麦格克效应
  • 2015 200 citation–>3000+ citation. 有代表的论文 VQA: Visual Question Answering (ICCV 2015)
  • 2016 多个大型多模态数据集发表 (Youtube8m, audioset)
  • 2017 VoxCeleb 发布(多模态自然人识别数据集)
  • 2018 视觉语音降噪,虚拟人合成技术
阅读全文 »
0%