Training Azerbaijani language models on Amazon SageMaker AI

TL;DR · AI 摘要
文章介绍了如何在Amazon SageMaker上优化阿塞拜疆语大模型训练,通过自定义分词器和LoRA微调实现高效训练。
核心要点
- 自定义分词器将阿塞拜疆语的tokens per word减少50%,提升模型上下文窗口容量。
- 通过Liger Kernel优化,训练吞吐量提高23%,GPU内存使用降低58%。
- 使用LoRA方法进行监督微调,显著减少可训练参数,提升对话能力。
结构提纲
按章节快速跳转。
介绍阿塞拜疆语大模型训练的背景与挑战。
开发高效的阿塞拜疆语分词器,减少tokens per word。
通过分布式训练和优化提升训练效率。
使用LoRA方法将模型转化为对话助手。
展示训练管道的模块化架构和各阶段优化。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- Training Azerbaijani LLMs
金句 / Highlights
值得收藏与分享的关键句。
The custom monolingual tokenizer achieved the strongest results, halving the tokens per word compared to the baseline.
The framework delivered a 23% higher training throughput and 58% lower peak GPU memory usage through kernel-level optimizations.
Stage 3 applies LoRA, a parameter-efficient fine-tuning method that significantly reduces trainable parameters.
_本方案基于开源工具构建,包括 PyTorch、Hugging Face Transformers 和 Liger Kernels。作者还要感谢 Aiham Taleb、Arefeh Ghahvechi、Manav Choudhary、Rohit Thekkanal、Daz Akbarov、Jamila Jamilova、Ross Povelikin、Almas Moldakanov、Christelle Xu 和 Ivan Khvostishkov 对项目实现做出的贡献。_
Azercell Telecom LLC 是阿塞拜疆领先的电信服务提供商,希望在 Amazon SageMaker AI 上构建适用于电信场景和面向客户的聊天机器人的阿塞拜疆语大语言模型(LLM)。面临的挑战是:如何在训练数据有限且缺乏成熟训练框架的情况下,将基础模型(FMs)适配到形态复杂的阿塞拜疆语。通过为期六周的合作,Azercell 与 AWS生成式AI创新中心 共同在 Amazon SageMaker AI 上建立了生产就绪框架,通过在 ml.p5.48xlarge 实例上的内核级优化,实现了23%的训练吞吐量提升和58%的峰值GPU内存使用率降低。该框架还通过自定义分词器将每词的token数降低了2倍,有效将阿塞拜疆语文本容量翻倍至模型上下文窗口。如果您正在处理资源匮乏或形态复杂的语言,本文将介绍相关方法,供您评估类似技术。
方案概述
该框架分为三个顺序阶段,每个阶段产生的工件会传递给下一阶段:
- 阶段1:分词器开发 构建高效的阿塞拜疆语分词器。我们评估了三种方法(基线英语优化分词器、词汇扩展和自定义单语分词器),并通过标准化指标衡量编码效率。自定义单语分词器表现最佳,将每词的token数降至基线水平的一半。
- 阶段2:持续预训练(CPT) 使用分布式训练和 Amazon SageMaker AI 的 Liger Kernel 优化,将基础模型 (Llama 3.2 1B) 适配为理解阿塞拜疆语。这允许在相同硬件上实现更大的批量大小和更高吞吐量。尽管本次1B规模的概念验证未使用分布式训练,但随着 Azercell 扩展到更大模型,这将成为关键。
- 阶段3:带低秩适配(LoRA)的监督微调 将预训练模型转化为对话助手。经过 CPT 后,模型虽能预测阿塞拜疆语 token,但无法进行对话交互。阶段3 应用 LoRA——一种参数高效的微调方法,大幅减少可训练参数。
训练阶段(CPT 和 LoRA 微调)通过 Amazon SageMaker Unified Studio 启动 Amazon SageMaker AI 训练作业,每个作业指向自定义训练脚本。每次作业都会启动新的 Amazon EC2 实例并在完成后终止,确保按实际计算时间付费,避免闲置集群成本。
下图展示了模块化架构,各阶段可独立优化。分词器改进惠及后续所有训练阶段,CPT 配置可在微调任务间复用。

图1. 训练管道架构。操作员从 Amazon SageMaker AI 笔记本实例启动训练作业。训练数据和模型工件存储于 Amazon Simple Storage Service (Amazon S3)。训练指标通过 Amazon SageMaker AI 中的 TensorBoard 进行跟踪,系统指标由 Amazon CloudWatch 捕获。
开发阿塞拜疆语分词器
像阿塞拜疆语这样的形态丰富语言,单个单词可通过后缀编码语法意义,而英语通常需要多个单词表达。然而,标准英语优化分词器会拆分这些复杂词形。例如,将“kitablardan”(来自书籍)拆分为多个子词 token,如图2所示,导致固定大小上下文窗口内的实际文本容量减少。

图2. 基线与自定义阿塞拜疆语分词器对比,展示减少的 token 碎片化现象。
为解决这一问题,我们使用字节级字节对编码(BBPE)算法在阿塞拜疆语文本上训练了一个自定义分词器,该算法通过迭代合并最频繁出现的字节对来构建词汇表。从原始字节而非预定义字符集开始,可全面覆盖阿塞拜疆语特有的字符,无需手动定义字母表。我们尝试了5万至10万标记的词汇规模,以找到平衡点:过小会导致单词过度分割,过大则罕见标记缺乏足够的训练信号。
我们使用Hugging Face分词器库训练自定义分词器,配置与原生Llama 3.2分词器相同,仅调整词汇规模。经过多次训练和评估不同规模的分词器后,最终选定10万标记的词汇表。为验证自定义分词器未牺牲建模质量,我们采用比特每字节(BPB)而非困惑度进行比较,因为BPB通过字节级预测质量衡量消除了词汇差异的影响。使用自定义分词器的模型在验证集上达到0.5795 BPB,优于基线模型的0.6830,证实编码效率提升并未降低质量。
除保持建模质量外,自定义分词器还显著提升了实际效率。编码效率可通过生育率分数量化——即每个单词平均标记数,数值越低表示效率越高。基线Llama 3.2分词器处理阿塞拜疆语单词时平均需3.22个标记,而单语言自定义分词器仅需1.59个标记,效率提升2倍。结合Llama 3.2的12.8万标记上下文窗口,这转化为实际容量差异:基线分词器支持约4万单词,优化后可达8万单词——使模型能同时处理双倍内容。
持续预训练
持续预训练阶段使FM(Llama 3.2 1B)适应阿塞拜疆语。该阶段的主要瓶颈是GPU内存:优化内存利用率直接影响硬件投资转化为训练吞吐量的比例。我们在ml.p4d.24xlarge(8× NVIDIA A100 GPU)和ml.p5.48xlarge(8× NVIDIA H100 GPU)实例上进行了基准测试。以下介绍两种优化方法:基于PyTorch完全分片数据并行(FSDP)的分布式训练和Liger Kernel集成。
基于完全分片数据并行(FSDP)的分布式训练
模型内存占用不仅包括权重,还包括梯度、优化器状态和激活值。对于混合精度下的大型模型(如Llama 3.1 8B),这些组件总内存可能超过100 GB。我们针对1B模型开发并验证了分布式训练框架,以便扩展到更大架构时仅需修改配置而非重构流水线。标准分布式数据并行(DDP)会在每个GPU上复制完整模型,限制批量大小和模型规模。FSDP将参数、梯度和优化器状态分片存储于多个GPU,并动态收集计算所需部分。这使ml.p4d.24xlarge实例上的单GPU模型状态内存从9.23 GB降至1.17 GB,释放空间用于更大批量。
Liger Kernel集成
Liger Kernels是基于Triton的高效实现,将常见大语言模型操作融合为单个GPU内核调用,减少中间内存分配且保持数值一致性。支持包括Llama在内的多种模型架构。建议在采用前验证与目标架构的兼容性。
集成仅需少量代码改动:单次函数调用即可在实例化前替换模型内核,且Liger Kernels与PyTorch FSDP无缝协作。通过PyTorch Profiler验证了融合操作的正确执行。下表总结了两种实例类型的优化效果:
| 指标 | DDP | FSDP | FSDP + Liger | |-----------------------------------|---------|----------|------------------| | ml.p4d.24xlarge(8× A100)单GPU最大批量 | 2 | 4 | 14 | | ml.p5.48xlarge(8× H100)单GPU最大批量 | 4 | 10 | 18 | | ml.p5.48xlarge峰值GPU内存(含激活值,GB) | — | 64 | 27 | | ml.p5.48xlarge单GPU训练吞吐量(tokens/s) | — | 63,771 | 78,319 |
在ml.p4d.24xlarge上,完整优化方案使最大批量较DDP提升7倍。在ml.p5.48xlarge上,FSDP+Liger组合使峰值内存下降58%,单GPU吞吐量提升23%。
预训练设置
第一阶段的所有分词器配置均贯穿持续预训练全流程,以对比收敛行为和下游质量。使用自定义阿塞拜疆语分词器(10万词汇)时,训练语料包含约25亿标记。
自定义训练脚本支持可配置的上下文窗口、BFloat16混合精度、基于AdamW优化器的余弦学习率调度,以及自动将检查点保存到Amazon S3以实现容错功能。我们将上下文窗口设置为2,048个标记,因为超过90%的训练样本在分词后长度低于此值,尽管配置支持高达模型原生的128k标记限制。
当向词汇表添加新标记时,CPT采用两阶段方法。第一阶段冻结模型主干网络,仅训练嵌入层。这使新标记表示能够适应模型现有的内部空间,而不干扰预训练知识。第二阶段解冻所有参数进行完整训练,使模型能够深入学习阿塞拜疆语模式。下表展示了使用阿塞拜疆语自定义分词器(10万词汇量)的训练配置。训练使用了两个ml.p4d.24xlarge实例(共16个NVIDIA A100 GPU),结合FSDP和Liger Kernel优化。
参数|Phase 1: 嵌入层适配|Phase 2: 完整训练 ---|---|--- 冻结主干网络|是|否 学习率|0.0032|0.0024 每GPU批大小|14|14 训练步数|5,000|15,000 训练时间|~11,400秒(约3.2小时)|~43,000秒(约11.9小时)
完整训练阶段采用较低的学习率,以保留嵌入层适配阶段获得的知识。通过有效批量大小224(每GPU 14 × 16 GPU)和2,048标记的上下文窗口,每训练步处理约45万个标记,该配置下的单轮训练时间估计约为4.3小时。在ml.p5.48xlarge实例上,更高的每GPU吞吐量和更大批量大小将进一步缩短单轮训练时间。
监督式微调与LoRA
经过CPT训练后,模型能够流利预测下一个阿塞拜疆语标记,但缺乏对话结构概念。面对问题时,它生成看似合理的续写而非有用答案。LoRA通过冻结预训练权重并训练注入到注意力层和前馈层的小型低秩分解矩阵,高效弥合这一差距。LoRA不更新完整权重矩阵,而是训练两个较小矩阵的乘积来近似完整更新——将可训练参数减少至总参数的极小比例。下表总结了LoRA微调配置。
参数|值 ---|--- Rank|64 Alpha|28 Dropout|0.05 目标模块|q、k、v、o投影;门控、上采样、下采样投影 最大序列长度|1,024
这种紧凑的内存占用使得微调可在单个ml.g5.8xlarge实例(1× NVIDIA A10G GPU)上运行,几分钟内完成。微调使用约2,000个单轮次阿塞拜疆语问答对,采用Hugging Face的SFTTrainer,学习率为1e-4——高于CPT的学习率,因为LoRA适配器随机初始化并受益于更强梯度更新。
训练采用Llama风格的对话模板,仅对助手响应标记和回合结束标记(<|eot_id|>)进行损失掩码:模型仅因预测助手响应和回合结束标记而受到惩罚,用户提示和模板分隔符被排除在损失之外。因此,模型将学习能力集中在生成恰当回复而非记忆用户输入模式上。
结果与验证
持续预训练使用约25亿个标记(自定义阿塞拜疆语分词器),微调使用2,000个问答对。该框架在四个维度实现了可衡量的改进:
- 自定义分词带来的2倍编码效率单语言分词器将生育率分数从3.22降至1.59(每词标记数),使模型128k标记上下文窗口内可容纳的阿塞拜疆语内容翻倍。BPB得分0.5795优于基线的0.6830,证实质量未受损。
- 显著的内存和吞吐量优化完全分片数据并行(FSDP)分片和Liger Kernel集成允许相同硬件上的更大批量:ml.p4d.24xlarge实例批量提升7倍,ml.p5.48xlarge提升4.5倍。峰值GPU内存减少58%,每GPU吞吐量提高23%。
- 生产级可扩展基础设施经验证的ml.p4d.24xlarge和ml.p5.48xlarge配置为Azercell提供了灵活基础架构,可随训练需求增长而扩展。分布式设置设计为只需修改配置即可迁移到更大模型。
- 连贯的阿塞拜疆语生成现成的Llama 3.2 1B在阿塞拜疆语提示下会陷入重复、不连贯输出——这是资源不足语言的常见失败模式。微调后的模型生成简洁、语义连贯的回复,展示清晰的阿塞拜疆语理解能力。以下示例来自Azercell提供的测试提示:
提示|阿塞拜疆语输出|英语翻译 ---|---|--- 输入提示|Yeni bir dil öyrənmək yalnız ünsiyyət imkanlarını genişləndirmir.|学习一门新语言不仅能扩大交流机会…… Llama 3.2 1B|Yeni bir dil öyrənmək yalnız ünsiyyət imkanlarını genişləndirmir. Bu, əksinə, dili öyrənən insanlara yeni bir dil öyrənmək üçün fərqli məqsədlərlə yanaşı, onların özü də yeni bir dil öyrənməyə başlayır.|学习一门新语言不仅能扩大交流机会。相反,学习语言的人除了有不同的学习目的外,他们自己也会开始学习一门新语言。
学习一门新语言不仅能扩大交流机会,还能拓宽人们学习语言的方向和体验。通过扩展这些方向和体验,学习者会以不同的目标接近语言学习,并开始主动开启新的语言学习过程。语言学习本身也有助于进一步拓展与新语言学习相关的方向和经验。在这些方向和经验得到扩展后,学习新语言的方法论和实践经验将继续发展...
经过微调的Llama 3.2 1B 学习一门新语言不仅能扩大交流机会,还能建立新的友谊和联系。
结论
本文展示了Azercell与AWS生成式AI创新中心如何基于亚马逊SageMaker AI构建阿塞拜疆语模型训练框架。该三阶段管道(自定义分词、采用FSDP和Liger Kernel优化的持续预训练、LoRA微调)将通用基础模型转化为支持阿塞拜疆语对话的助手,同时最大化GPU利用率。目前Azercell已独立运营该框架,其方法论可支持更大规模的数据集、扩展架构和更多应用场景。欲了解更多信息,请访问以下资源:
- 亚马逊SageMaker AI — 管理型机器学习训练与部署服务
- AWS生成式AI创新中心 — 协作式AI开发计划
- 亚马逊SageMaker AI分布式训练 — 分布式训练概念指南
- PyTorch FSDP教程 — 实现指南
- Liger Kernels — 内存高效内核实现
- Hugging Face Tokenizers — 分词器训练库
- Llama 3.2 1B — 基础模型
若想探索类似解决方案,请联系您的AWS客户团队或访问AWS生成式AI创新中心。如果您正在为低资源语言训练大语言模型,或在SageMaker AI上优化GPU利用率,欢迎在评论区分享您的见解和问题。