674. Jigsaw - Agile Community Rules Classification | jigsaw-agile-community-rules
副标题:在 Kaggle 环境中使用 Unsloth 进行 LLM 文本序列分类的高效训练和推理
哇!非常感谢主办方 Competition Host Jigsaw/Conversation AI 和主持人举办的竞赛,在参加前,我对 NLP 几乎一无所知,我从中学习到了很多宝贵的经验。
非常感谢 Kaggle 的良好的讨论社区氛围和无私开源的 Kaggler。
非常感谢我的队友 @williamwu88, @justforfun44 的 valuable suggestion and for sharing experience and effort! 期待下次的愉快合作!
以下所有内容都是在测试时进行的训练和推理。
在无法获得全部 Rule 和数据的情况下,在线学习成为了 Jigsaw 社区的共识。因此,我们认为关键在于,如何在规定的时间限制和显存限制下集成规模更大和数量更多的 LLM 模型。
在 Kaggle 的“严苛”环境下,我们实现了 12 小时内的在 T4*2 上基于 unsloth 的 3 个 Qwen3-14B, 1 个 Llama2-13B 和 2 个 Llama3.1-8B 的高效训练和推理 (QLora)。没有 CV,代码只根据 LB 调整,每次提交 4 个不同种子的相同模型和参数的集成,确保稳定提升而非噪声。LB 是随机划分,55k 的 29% 数据量不算小,mAUC 的评估指标比较稳定,所以我们认为是可以相信 LB 的。
这是最终提交的两个代码的模型组成:
| 种子 (Seed) | 模型 (Model) |
|---|---|
| 42 | qwen3-14b |
| 43 | qwen3-14b |
| 44 | qwen3-14b |
| 45 | llama2-13b |
| 46 | bge-base-en-v1.5 |
| 种子 (Seed) | 模型 (Model) |
|---|---|
| 42 | qwen3-14b |
| 43 | qwen3-14b |
| 44 | qwen3-14b |
| 45 | llama2-13b |
| 46 | llama3.1-8b |
| 47 | llama3.1-8b |
1. Unsloth 的官方的文本分类的实现是通过 SFT,我们修改成了标准的 AutoModelForSequenceClassification 的分类头,只是更符合习惯,不确定哪个更好。
我们没有找到 unsloth 官方的并行训练的相关代码,所以是基于常规的并行训练代码进行的修改和适配,有一些坑🕳,如果想修改至其他任务,请注意:
1. QWEN3-14B 模型只能并行训练两个模型而无法使用 8B 模型的 batch*2 的训练,但 8B 模型没有限制,猜测是模型必须同时先加载到 GPU:0 上,如果没有 OOM,然后才分配到两个 GPU 上。我们无法解决该问题。llama2-13B 和其他更小的模型可以并行训练。
2. Unsloth 的初始化必须在训练前。
主要是 group_by_length=True,加速了 2 倍
1. 找出每个 (body, rule) 组合中,出现次数最多的那个标签,去重样本
2. 找到官方的未标注的数据集,我们无法知道 Rule 的正样本标准,但是能找出绝对的负样本,加入训练集
3. 找到官方的未标注的数据集,尝试根据 Rule 加入猜测的正样本,加入训练集,如果 LB 下降则回退
1. 均匀分配数据给两个 GPU,从短至长排序数据,并行推理,加速了 4 倍
2. 注意 GPU:1 必须等待几秒避免冲突
3. 将数据拆分为 3 个桶并分别指定 batch_size 推理,减少推理时间,让我们能再加入一个 8B 模型
1. 全局排名的集成优于规则内排名的集成
1. 伪标签
2. 训练时模拟 CV