AI 之旅之从识图到读书
这是我对过去三年工作的一个小总结。TS 公司是我毕业后加入的第一家公司,所在的部门是公司研究院下所在的部门。部门的整体氛围很好,上下级之间、同事之间都能愉快的相处,这使得我这期间的工作生活很顺心。回到工作内容部分,总体而言可以分为两部分的工作:CV 和 LLM
Computer Vision Period
我研究生期间的研究方向是深度学习目标检测(DeepLearning Detection),有一段在华为中央研究院实习的经历,在研究生阶段参加过几次百度举办的 算法复现比赛以及贡献过相应的开源项目。入职后,接手的第一个任务就是复现 YoloV6 算法,因为硕士期间参加过百度的复现比赛百度的大佬也对我进行过一些代码和复现方法上的指导 ,所以上手还算顺利
复现
没错!从上面可以看出来,我的第一个主营业务就是复现,所谓复现就是把别人的算法加到自己的训练框架里面不管你 copy 也好,自己重新搭网络结构也好 。最终的目的是:在我们的框架用相同的 config 能去训练这个算法并在测试集上跟官方 paper 的公示精度指标一致
那么我在这个阶段复现了哪些算法呢?主要是一些当时 SoTA 的目标检测算法:YoloV6、Onenet、YoloV7、DINO 等当然其实在之前参加百度复现赛和 PaddleDetection 做开源贡献时,复现过 Retinanet、ATSS、Fast RCNN、Faster RCNN 以及 Sparse RCNN 算是非常适合这个岗位了 。当然在做完算法复现后,我们常常会做一些组合操作来探索算法的特性,像各种标签匹配:OTA、简化版 OTA、匈牙利算法匹配、TAL 等等,各种分类的 loss、框回归的 loss 以及辅助 loss 等等,我们会将上述的和不同的网络结构以及数据增强的方式进行组合搭配,看看有什么化学反应,能不能训练出比较厉害的 baseline model 出来。总之 CV 时代,前处理、网络结构、后处理,都玩得很花
Other
除了复现和日常的框架维护、代码迁移和答疑外,也有做一些其他方面的探索,主要分为以下几个方面:
- 对于 Onenet 的改进,使用单 anchor 或者 point 来预测框,主要是对框的个数以及 anchor 的设置以及添加 iou branch 的探索。简化为单 anchor 或 point 后,对于推理时简化了后处理流程,会有提速效果。当然这里不乏数据增强的加持,才能保证点不掉,其中把目标复制多个的数据增强提升最明显也很容易理解,主要增加了正样本数量吧
- 参与了一个可视化检测结果的工作虽然没什么人用,是为了几个人做的需求 ,并且打通了训练完的模型能自动化的进行精度测验以及 base case 可视化
- ri4rover 比赛训练模型这个比赛的重点不是模型训练这块,所以只能算是跟着大佬混了一下 ,包括:数据划分、多尺度实验 、anchor尺度实验、学习率实验、数据增强实验、cos-ema 实验、标小车数据。由于任务比较简单,最后采用单 stride 提取特征图,速度上有非常明显提升
- 调研了一下当时比较火的两个项目 segment anything 和 GroundingDINO。这两个项目给到的启示是:数据标注层面(人工到半人工到模型)和语言与视觉的 Pipline 的打通。同时也跑通了他们的推理 Code,加到了框架里面。由于 SAM 只支持二分割,尝试进行多类别分割,效果不行
- 最后是跟车有关的项目:主要是地面标识的识别和分割。一部分是需要跟外部合作(最后不了了之),另外一部分看看能不能降低自己的标注成本。技术路线也很简单:首先上大模型进行训练,然后根据 bad case 情况是否需要补充数据或者对于不同检测或分割的物体进行不同分辨率模型或 head 进行检测或分割。最后都基本到达了要求,标注成本也有个 30% 左右下降。这期间也尝试过 SAM 和 groudingdino 的方案,以及将他们串起来
以上是一些主要部分,当然也有一部分时间在跑其他部门的屎山代码。这个期间我们组整体工作还是做得不错的。我们不仅维护了一个易用且算法和功能丰富的 CV 训练框架,而且进行了大量的算法探索(虽然大部分是排列组合与缝合),算是即懂算法也懂框架
Large Language Model Period
随着 openai 点燃了大语言模型的火焰,世界也看到了 LLM 的巨大潜力。我们整个部门也进行了及时调转船头支持 LLM 训练、推理以及量化了。由于模型同质化非常严重,结构基本一致,所以训练将重心放在了训练框架上
框架的搭建
虽然本质上我们是基于 DeepSpeed 和 Megatron 之上搭建的缝合怪,但是在那个时期可用的外部框架并不多,所以还是对内部有用的工作。而且框架初期有非常多的杂事需要做,比如,需要不断和外部框架进行精度和速度的对齐、新的模型(qwen internlm baichuan)的精度对齐、新的算子接入时的精度对齐、各种保存模型时的问题、模型加载的问题、dataloader 报错问题、flash attention 接入的问题、打各种镜像、支持各种需要的数据前处理(预先 pack 的,纯文本和 vqa 数据混训)、模型转换(ds 和 mg)以及长文本训练的支持
在对齐的路上遇到过各种奇葩的问题,例如:两边某个层里面一个系数的数据类型不同、数据处理逻辑不通、环境问题(未指定统一版本 cuda)、lr scheduler 不同。总是每天上一当,当当不一样
Load Unbalance
借着和 VLM 团队的合作,我们在 data 层面一定程度解决了在 VLM 训练中的负载不均衡问题,虽然原本的任务只是把内部的模型改到使用 Megatron 进行训练。
首先使用 packing 技术解决了 batch 内 padding 浪费的问题与 DP 之间计算量不均衡等待的问题。同时发现了长短文本混训且在使用 SP 时,存在由短文本 packing 组成的长文本被 SP 后,有不必要的 all to all 通信浪费。对此,我们使用了先组成小 group,再由小 group 组成设定长度的大 group,控制 batch collector 与 sampler 让 rank 拿到属于自己 group 以及保证一个 global batch size 内都是同一种类型的数据(要么是纯长文本,要么是短文本组成的长文本)。另外我们还对 Megatron 内 PP 和 CKPT 的设置使用了 profile 的方式求出最佳值。这部分内容我们整理成了论文发表在了 ICML 2025 上,也是我的第一篇顶会论文

无独有偶,我们在与 LLM 团队合作时,同样对当前的 LLM 中 load unbalance 和 packing 技术进行优化。针对长短文本混训的场景,采用分层级的 packing 策略,首先确定最长训练长度为 128k,通过 profile 得出其最快的 SP 和 CKPT 配置,假设是 SP=8。那么我们还需要一个配置是 16k(128k/8) 的 group,得到 16k 的 SP 为 1 以及 profile 好其最佳的 CKPT 配置,然后我们需要组好 8 个 16k 的 group 给 8 个 rank。另外假如我们 profile 发现 32k SP=4 是最快的配置,那么需要加入一个 32k 的配置,然后去除 16k 的配置(虽然 16k 没 all to all 通信,但是有最快的为啥不用),最后整理一下就是会有两个层级 128k SP8 和 32k SP4,32k 以下的只 packing 到 32k。假如最快的是 8k SP1,那么则有 128k SP8、16k SP1 和 8k SP1,8k 以下的只 packing 到 8k。最后我们通过控制 sampler 做了课程学习以及 loss normalization 的改进,这部分也整理成了论文处于在投状态

论文这部分工作,我主要的工作在实现算法和处理数据,以及做实验、测验模型精度等
Other
最后来自于一些杂七杂八的探索和调研,包括 deepseek R1 训练特性的探索、FP8 训练的适配看了 deepgemm,deepseek 的工程能力真的太强了 、视频训练(主要是 internvl 和 qwen vl)的调研等等
总结和安排
可以看到,在 LLM 时代大部分做的事还是以 Infra 为主的,但整体的工作比较上层,不够深入,这是需要改进的地方。之后可能会去做 LLM 算法相关的工作,也是转了一个方向,目前我对 LLM 训练的认识是 LLM 训练中两个最重要的点:数据的生成和筛选和训练的 pipeline。需要学习的地方还有很多,加油吧少年~
🌸 August 15, 2025
Comments
Sign in with GitHub to comment, or click the bottom icon to chat with me.