news 2026/9/27 18:30:15

Hello ROCm|AMD 云上 Gemma4 LoRA 情绪微调:从环境到配置的完整学习记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Hello ROCm|AMD 云上 Gemma4 LoRA 情绪微调:从环境到配置的完整学习记录

1. 为什么要在 AMD ROCm 云上折腾 Gemma4 LoRA 情绪微调

如果你手里只有一张消费级显卡,或者本地机器根本跑不动十几 G 的大模型,那云端 AMD 实例其实是一条被低估的路子。我这次要记录的就是在 AMD ROCm 云实例上,把 Gemma4 做一次 LoRA 情绪微调的全过程——从确认 ROCm 环境、装依赖、写训练配置,到跑通一次能看见准确率变化的实验。

先说清楚这套流程适合谁:想复现大模型微调但不想被本地显存卡住的开发者、对 ROCm 生态好奇但没实际跑过的人、以及需要给情绪分类这类细分场景快速适配一个小模型的人。Gemma4 本身是 Google 放出的开放权重模型,LoRA 则是在不改动完整权重的前提下,只训练一小部分适配器参数,显存占用低、训练快,特别适合情绪识别这种分类任务。

ROCm 是 AMD 的开放计算平台,你可以把它理解成 AMD 显卡跑 AI 框架的那层“驱动 + 运行时”。很多人一看到代码里出现cuda就以为必须用英伟达,其实 PyTorch 里的cuda更多是个统一接口名,AMD 通过 HIP 层去兼容这套调用,日志里打印出 HIP 版本就说明算力确实走的是 AMD 卡。这次实验的目标很明确:在 AMD 云上完成一次可验证的情绪微调,微调前后各跑一次评估,用对比表格看出准确率提升。

2. TaoToken 前置:统一 Key 与 API 通道怎么接

微调本身不一定要联网,但整个学习流程里你会用到 AI 工具来辅助读代码、查报错、生成配置片段。这时候如果每个工具都单独配一套 Key,管理起来很乱。我的做法是用 TaoToken 做统一入口,一个 Key 打通模型对话、编码辅助和文档查询。

TaoToken 官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api (这个不加 UTM)。你需要先去控制台创建一个 API Key,然后把它填进各个工具的配置里。

具体操作路径是这样的:打开控制台 https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,在 API Keys 页面 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 生成一个新 Key。生成后复制保存,后面配置里会反复用到。

如果你只是想先验证模型能不能通,可以直接用模型对话页面 https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 发一条消息试试。长期做编码和 Agent 任务的话,Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 有更详细的套餐说明。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,Claude Code 相关的配置参考 https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claudecode-anthropic&utm_campaign=rewrite 。

注意:API Key 只存在你自己的配置文件里,不要提交到 Git 仓库,也不要在公开 Notebook 里明文写出来。

3. 可复制配置:ROCm 环境检查与 LoRA 训练骨架

3.1 确认 ROCm 环境是否就绪

云端实例启动后,第一件事不是急着跑训练,而是确认 ROCm 真的在工作。打开终端,依次执行下面几条命令。

# 查看 ROCm 版本信息 rocminfo | head -n 20 # 查看显卡识别情况 rocm-smi # 确认 PyTorch 是否能调用 AMD 算力 python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.version.hip)"

rocminfo会打印出 agent 信息,能看到 GPU 型号和 ROCm 版本号。rocm-smi类似英伟达的nvidia-smi,显示显存占用、温度、功耗。最关键的是最后那条 Python 命令:如果torch.cuda.is_available()返回True,并且torch.version.hip打印出一个版本号(比如6.0.xxxxx),说明 PyTorch 已经通过 HIP 层接上了 AMD 显卡。

我实测下来,如果torch.version.hip是None,那多半是装成了 CPU 版 PyTorch,需要重新安装对应 ROCm 的 wheel。

3.2 安装依赖

pip install transformers datasets peft accelerate trl pip install --upgrade torch --index-url https://download.pytorch.org/whl/rocm6.0

第二行的rocm6.0要和你实例上的 ROCm 大版本对应,版本不对会装成 CPU 版。装完再跑一次上面的torch.version.hip检查。

3.3 LoRA 训练配置骨架

下面是一个可以直接改的 LoRA 配置骨架,我用的是peft库。情绪分类任务本质是序列分类,所以模型加载时指定num_labels。

from transformers import AutoModelForSequenceClassification, AutoTokenizer from peft import LoraConfig, get_peft_model, TaskType model_name = "google/gemma-4-2b" # 按实际可用权重名替换 tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForSequenceClassification.from_pretrained( model_name, num_labels=6, # 情绪类别数,按数据集调整 torch_dtype="auto", device_map="auto" ) lora_config = LoraConfig( task_type=TaskType.SEQ_CLS, r=8, # 秩,越小参数越少 lora_alpha=16, # 缩放系数 lora_dropout=0.1, target_modules=["q_proj", "v_proj"], # 注意力层投影 bias="none" ) model = get_peft_model(model, lora_config) model.print_trainable_parameters()

print_trainable_parameters()会告诉你可训练参数占比,通常只有总参数的百分之零点几,这就是 LoRA 省显存的原因。

3.4 训练参数

from transformers import TrainingArguments training_args = TrainingArguments( output_dir="./gemma4-lora-emotion", per_device_train_batch_size=8, gradient_accumulation_steps=2, learning_rate=2e-4, num_train_epochs=3, logging_steps=20, evaluation_strategy="epoch", save_strategy="epoch", fp16=True, # AMD 上建议先试 bf16,不行再换 fp16 report_to="none" )

fp16和bf16在 ROCm 上的支持情况跟显卡架构有关,如果训练时报混合精度相关的错,先关掉精度参数用 fp32 跑通,再逐步开。

3.5 用 TaoToken 辅助读代码的 settings.json 片段

如果你用支持自定义 API 的编辑器或 CLI 工具来辅助读训练代码,可以把 TaoToken 的 Key 填进配置。下面是一个通用片段,字段名按你实际工具调整。

{ "ai.provider": "openai-compatible", "ai.baseUrl": "https://taotoken.net/api", "ai.apiKey": "你的_TaoToken_Key", "ai.model": "按文档选择可用模型" }

提示:baseUrl 只写到/api,不要自己拼/v1之类的路径,具体以接入文档为准。

4. 验证请求与成功结果

4.1 先验证 API 通道

配置好之后,先用一条最简单的请求确认通道是通的。用 curl 测试:

curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer 你的_TaoToken_Key" \ -d '{ "model": "按文档选择可用模型", "messages": [{"role": "user", "content": "回复 OK"}] }'

返回里能看到choices字段和内容,就说明 Key 和通道都正常。如果返回 401,检查 Key 有没有复制完整;返回 404,检查路径和模型名。

4.2 验证微调前后效果

训练脚本跑完后,最关键的一步是对比。我的做法是:在微调前先用原始模型跑一遍测试集,记录准确率和无效输出数量;微调后再跑同一批数据。

from transformers import pipeline clf = pipeline("text-classification", model=model, tokenizer=tokenizer) test_texts = ["I am so happy today", "This makes me furious", "I feel nothing at all"] for t in test_texts: print(t, "->", clf(t))

微调前,原始模型可能会输出一堆不在标签范围内的文本,或者把情绪判断得模棱两可。微调后,输出会收敛到设定的类别上,非法无效输出明显减少。把两次结果整理成表格:

指标微调前微调后
测试集准确率基线值提升后数值
无效输出条数较多接近 0
单条推理耗时基准基本持平

准确率的具体数字取决于数据集和训练轮数,我这里不编造具体数值,你跑完自己的实验填进去就行。重点是你能看到趋势:微调后准确率上升、无效输出消失。

5. 本篇常见错排查

5.1 torch.cuda.is_available() 返回 False

最常见的原因是装成了 CPU 版 PyTorch。用pip list | grep torch看版本号里有没有+rocm或+cpu后缀。如果是+cpu,卸载后按 3.2 节的命令重装。另一个原因是 ROCm 驱动没加载,跑rocm-smi如果报错,说明实例的 ROCm 环境本身有问题,需要检查镜像或联系云平台。

5.2 训练时报 HIP out of memory

显存不够。优先降per_device_train_batch_size,从 8 降到 4 甚至 2;同时把gradient_accumulation_steps提上去保持等效 batch size。还可以把r从 8 降到 4,减少适配器参数。Gemma4 的 2B 版本在 16G 显存的 AMD 卡上,用 LoRA 加 batch size 4 一般能跑起来。

5.3 混合精度报错

ROCm 对fp16的支持在不同架构上不一致。报错信息里出现fp16或half相关字样时,先把fp16=True改成False,用 fp32 跑通流程,再尝试bf16=True。如果bf16也报错,就老老实实用 fp32,只是慢一点。

5.4 API 请求返回 401 或 403

Key 无效或没带上。检查Authorization头是不是Bearer加空格再加 Key,别漏了空格。如果 Key 是在控制台刚生成的,确认没有多余换行符。403 有时是模型名不对,对照接入文档里的可用模型列表改。

5.5 数据集标签和 num_labels 对不上

情绪数据集的类别数必须和num_labels一致。如果数据集有 6 种情绪,num_labels就得是 6。对不上会在训练时抛维度错误。加载数据集后先打印一下标签分布:

from datasets import load_dataset ds = load_dataset("你的数据集名") print(ds["train"].features["label"])

6. 把这条链路固定下来

跑通一次之后,我建议把环境检查那几条命令存成一个check_env.sh,每次新实例启动先跑一遍,省得反复排查。LoRA 配置里的r、lora_alpha、target_modules这三个参数值得多试几组,情绪分类任务上r=4到r=16之间通常够用,target_modules加上k_proj、o_proj有时能再涨一点。

TaoToken 这边,把 Key 和 baseUrl 固定进你的工具配置后,读代码、查报错、生成配置片段都能走同一个通道,不用来回切换。需要新建 Key 就去 https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite ,接入细节看 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。长期做编码任务的话,Coding Plan 页面 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 里有对应的方案说明。

最后留一个我踩过的坑:云端实例的 ROCm 版本和 PyTorch wheel 的 rocm 版本一定要对齐,差一个大版本就可能出现hipErrorNoBinaryForGpu这种让人摸不着头脑的报错。装之前先rocminfo | grep "ROCm"确认版本,再去 PyTorch 官网找对应 wheel,这一步花两分钟,能省后面半小时。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/27 18:30:09

用UltraEdit比较两个文件:TaoToken统一Key接入AI差异分析工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/27 18:29:49

深圳商城网站开发避坑指南:3套技术栈最佳实践

深圳商城网站开发避坑指南:3套技术栈最佳实践 改个需求,建站公司拖一周,上线后卡顿还得加钱?在深圳做商城开发,这种痛感太真实了。很多老板找外包,签了合同才发现对方用的是五年前的老架构,改个字段要重构半天。其实, 深圳商城网站开发 并没有标准答案,只有适合你业务阶段的 最佳实践 。…

作者头像 李华
网站建设 2026/9/27 18:29:47

网站推广服务外包有哪些渠道?3个免费工具帮你破局

网站推广服务外包有哪些渠道?3个免费工具帮你破局 网站做好了没人访问,这是很多老板最头疼的事。你花了钱做站,域名解析也配好了,结果后台一看,流量惨淡,连蜘蛛都没怎么来。别急,这不是你网站的问题,而是你没找对推广路子。今天咱们不聊虚的,直接拆解 网站推广服务外包有哪些渠道 ,重点说说怎么用 免费工具…

作者头像 李华
网站建设 2026/9/27 18:29:20

教育考试类网站建设避坑:从零搭建的5万-20万报价全解析

教育考试类网站建设避坑:从零搭建的5万-20万报价全解析 别再看那些千篇一律的模板了。 教育考试行业的网站,最忌讳的就是“太丑”和“不够用”。你花几千块买个现成模板,看着还行,但一到报名高峰期,系统卡死;或者学员问个“证书怎么注销”,页面上根本找不到入口。 这就是典型的“模板网站太丑不够用”。…

作者头像 李华