一、学习内容概述

本次学习主要围绕 Hello-ROCm 春训营的整体安排和 AMD 云环境下的大模型微调实践展开。前一个任务帮助我了解了本次训练营的学习节奏、学习目标和任务路线;后一个任务则进入更具体的实操部分,即在 AMD 云环境中体验模型微调流程。

通过这部分学习,我对 Hello-ROCm 训练营的整体定位有了更清晰的认识。它不是单纯讲理论,也不是只让我们调用现成 API,而是希望我们从环境配置、大模型部署、LoRA 微调到后续的算子优化,完整体验 AMD ROCm 平台上的大模型开发流程。

二、对训练营安排的理解

通过了解训练营安排,我认为本次学习的核心特点是“科普学习 + 微体验实操”。也就是说,它既会介绍 ROCm、AMD GPU、大模型部署和微调的基本概念,也会安排实际操作任务,让我们真正把环境跑起来、把模型部署起来、把微调流程走一遍。

这对初学者来说比较友好。因为很多人学习大模型时,容易停留在“知道概念”的层面,比如知道什么是大模型、什么是微调、什么是 GPU 加速,但真正到自己动手时,就会遇到环境配置、依赖安装、模型路径、显存占用、训练参数等各种工程问题。本次训练营把这些内容拆成阶段性任务,可以降低学习门槛。

我理解本次训练营的大致路线是:

第一步,熟悉 AMD 云环境,学会启动云端算力资源,并确认 GPU 是否可用。

第二步,完成 Gemma4 大模型部署,理解模型下载、推理框架和服务启动之间的关系。

第三步,体验 LoRA 微调,理解模型为什么需要微调,以及如何通过较低成本让模型适应特定任务。

第四步,进一步接触 ROCm 算子优化等更底层的内容,了解大模型运行效率背后的硬件和软件基础。

对我来说,这个路线比较完整。它不是只关注“模型会不会回答问题”,而是从大模型应用背后的工程链路出发,让我知道一个模型真正跑起来需要哪些条件。

三、对大模型微调的理解

在学习模型微调之前,我对微调的理解比较简单,认为微调就是“让模型重新学习一些数据”。通过本次学习,我对这个概念有了更具体的认识。

大模型通常先经过大规模预训练,已经具备较强的语言理解和生成能力。但是预训练得到的是一种通用能力,模型不一定能很好地适应某个具体任务、某种输出格式或某个垂直领域。因此,在实际应用中,我们常常需要通过有监督微调,让模型学习特定的输入输出模式。

有监督微调可以理解为把“问题”和“标准答案”一起给模型,让模型学习在某种指令下应该如何回答。比如在情感分析任务中,我们可以给模型很多文本以及对应的情绪标签,让模型学会判断一段话属于积极、消极还是中性情绪。这样模型就不只是泛泛地聊天,而是能够更稳定地完成指定任务。

本次任务中提到的微调更接近指令微调,即通过 instruction、input、output 这样的数据格式,让模型学习如何根据用户指令生成目标回答。这个过程让我意识到,微调数据的质量非常重要。模型不是凭空变强,而是从我们提供的数据格式、任务样例和目标输出中学习规律。

四、LoRA 微调的核心思想

在大模型微调中,最直接的方法是全量微调,也就是更新模型的全部参数。但这种方式对显存、算力和训练成本要求很高,并不适合普通学习者或小规模实验。

因此,本次学习重点涉及 LoRA 这种高效微调方法。LoRA 的基本思想是:不直接修改大模型原本的全部参数,而是在模型中的部分线性层旁边加入一些可训练的小参数矩阵。训练时主要更新这些新增的小参数,而原始大模型参数基本保持冻结。

这样做的好处是显而易见的:一方面,它大幅减少了需要训练的参数量,降低了显存和算力需求;另一方面,它仍然能让模型学习到某个任务或领域的特定能力。对于学生或者普通开发者来说,LoRA 是比较适合入门的大模型微调方式。

我对 LoRA 的理解可以概括为一句话:不是把整个大模型重新训练一遍,而是在原模型基础上加一个“轻量适配器”,让模型用更低成本学会新的任务风格。

五、AMD 云环境下微调流程理解

结合本次任务,我理解模型微调的大致流程包括以下几个步骤。

1. 准备环境

首先需要确认 AMD 云环境已经启动,并且 ROCm、PyTorch 等基础环境可以正常工作。这里要特别注意,在 ROCm 环境下,PyTorch 中仍然经常使用 torch.cuda.is_available() 来判断 GPU 是否可用。虽然名字里是 cuda,但在 ROCm 版本的 PyTorch 中,它可以用来确认 AMD GPU 是否能够被框架调用。

常见检查命令类似:

python -c "import torch; print(torch.__version__); print(torch.version.hip); print(torch.cuda.is_available())"

如果可以看到 ROCm/HIP 相关版本信息,并且 GPU 可用,就说明后续微调任务有了基础。

2. 安装依赖

微调通常需要安装 transformers、datasets、peft、accelerate 等相关库。其中 transformers 用于加载模型和分词器,datasets 用于处理训练数据,peft 用于实现 LoRA 等高效微调方法。

这一部分让我认识到,大模型微调并不是一个单独的命令,而是多个工具库协同完成的工程流程。

3. 准备模型和数据集

模型可以通过 ModelScope 等平台下载。数据集则需要处理成模型能够理解的格式。常见的指令微调数据格式包括:

{
  "instruction": "用户指令",
  "input": "补充输入",
  "output": "模型应该生成的回答"
}

这个格式看起来简单,但实际上非常关键。因为模型训练时学到的不是“题目本身”,而是从 instruction 和 input 到 output 的映射关系。如果数据格式混乱,或者输出风格不统一,微调效果就会受到影响。

4. 数据预处理

数据预处理的核心是使用 tokenizer 把自然语言文本转换成模型可以处理的 token ID。同时,还需要构造 attention_mask 和 labels。

这里我印象比较深的是 labels 中经常会把用户指令部分设置为 -100。这样做的含义是:训练时不要求模型预测用户输入部分,而是只让模型学习如何生成 assistant 的回答。这让我理解到,微调不是让模型“背完整文本”,而是让模型在给定上下文后学习生成目标回复。

5. 配置 LoRA 参数

LoRA 微调需要设置一些关键参数,比如:

LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
    inference_mode=False,
    r=8,
    lora_alpha=32,
    lora_dropout=0.1
)

其中,target_modules 表示 LoRA 插入到哪些模型模块中;r 表示 LoRA 的秩,影响可训练参数规模和表达能力;lora_alpha 可以理解为缩放系数;lora_dropout 用于减少过拟合。

以前我看到这些参数会觉得比较陌生,现在至少能理解它们大致在控制什么:一部分控制训练位置,一部分控制训练规模,一部分控制泛化能力。

6. 配置训练参数并启动训练

训练参数包括 batch size、学习率、训练轮数、保存步数、日志步数等。例如:

TrainingArguments(
    output_dir="./output",
    per_device_train_batch_size=16,
    gradient_accumulation_steps=2,
    logging_steps=10,
    num_train_epochs=3,
    save_steps=100,
    learning_rate=1e-4,
    gradient_checkpointing=True,
    report_to="none"
)

其中,gradient_accumulation_steps 可以用来在显存有限时模拟更大的 batch size;gradient_checkpointing 可以通过牺牲一定计算时间来节省显存;logging_stepssave_steps 则方便观察训练过程和保存模型。

这部分让我明白,训练参数不是随便设置的,而是和显存、训练稳定性、训练速度以及最终效果都有关系。

7. LoRA 权重保存与合并

LoRA 微调完成后,保存的通常不是完整模型,而是 LoRA 适配器权重。后续推理时,需要加载原始基座模型,再加载 LoRA 权重,或者将 LoRA 权重合并到原模型中。

这一步让我理解到,LoRA 的轻量化不仅体现在训练时,也体现在保存和迁移时。相比保存完整大模型,保存 LoRA 权重更方便,也更适合多个任务分别维护不同适配器。

六、学习中的问题与收获

本次学习让我意识到,大模型微调并不是简单地“拿数据训练一下”。它至少涉及以下几个问题:

第一,环境必须正确。ROCm、PyTorch、GPU、Python 依赖之间要能匹配,否则模型无法正常训练。

第二,数据格式必须规范。不同模型有不同的 chat template,如果训练格式和模型预期格式不一致,微调效果可能会明显下降。

第三,显存资源需要控制。batch size、最大序列长度、gradient checkpointing、LoRA rank 等参数都会影响显存占用。

第四,微调目标要明确。微调不是为了让模型“无目的地变强”,而是为了让模型在某个任务、某种风格或某个领域上表现更稳定。

第五,LoRA 是适合入门和实验的高效方法。它不需要更新全部参数,训练成本更低,也更容易在云环境或单卡环境中完成。

七、个人总结

通过本次任务,我对 Hello-ROCm 春训营的整体安排和 AMD 云环境下的大模型微调流程有了更清晰的认识。前面的环境配置和模型部署让我知道了模型如何“跑起来”,而这次微调任务进一步让我理解了模型如何“变得更适合某个任务”。

这部分学习对我最大的帮助是把很多抽象概念串起来了:ROCm 是 AMD GPU 的计算软件栈,PyTorch 是深度学习框架,transformers 用于加载和使用模型,PEFT/LoRA 用于降低微调成本,数据集格式决定模型学到什么,训练参数决定模型如何学习。

后续如果继续深入学习,我希望能够在完成示例任务的基础上,尝试换一个自己的小数据集,例如情感分类、问答助手或者专业领域文本,让模型完成一次真正面向具体任务的微调。这样不仅能完成训练营任务,也能把这套流程转化成自己以后科研或项目实践中的能力。

Logo

免费领 200 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐