大模型微调有什么可怕的?我把实操过程摊开,带你上手试!
想试一次大模型微调,却一想到还要买显卡、写代码、准备数据,就放下了?
哈哈,我的教程,显卡不用买,代码和24张训练图也不用你从头准备,让你零负担走完全过程!
租一张云端4090,整轮实验也才实付2.71元。
学它干啥,可以直接做什么?微调一个自己的写真模型,以后就能反复生成新造型、新场景的写真,让照片里的脸更稳定地保持自己的样子。
比如生成自己身穿西装的利落职业照,也可以生成自己穿着旗袍、站在雨后老街上的画面。再放开一点想象,你还可以尝试生成这样的画面:自己穿着唐装站在长安的灯火里,与恐龙、外星人或喜欢的虚拟角色合影,甚至换上蜘蛛侠的造型。
你想带进这些故事里的,始终是你自己。
人物微调,就是尝试让模型学到目标人物的特征,换造型时仍然更像同一个人。这篇先从一个具体案例开始,带你把人物照片变成能反复加载的训练成果。
跟着实际做完,你能带走一份搭配底模继续出图的人物LoRA权重,也能亲手走完准备数据、训练、比较效果、保存和重新加载的过程。LoRA是什么,下一节就说清楚。
这次先用虚拟人物练手。下面这张绿夹克写真,就是重新加载训练成果后生成的新图,不是训练照片:
代码、图片、配套描述和参数都在
。按
从第0步开始,先用现成材料学会方法,再用自己的照片重新准备数据、训练个人形象。
1. 人物微调,到底在训练什么?
本次做的是SDXL图像生成大模型上的人物LoRA微调,不是聊天语言模型微调,也不是从零训练完整模型。
注:开头的创意场景可作为后续尝试方向,本次尚未验证;人物相似度仍需结合出图结果挑选。
微调(Fine-tuning),是在已经训练好的模型上,用相关数据继续训练,让它更适应一个具体需求。原来的模型叫底模(Base Model),它本来就会画人,我们是在这个基础上继续教。
这次采用 LoRA(Low-Rank Adaptation,低秩适应)。它保留底模原有权重,只训练少量新增参数。参数是模型计算时用的数值,训练后保存的这些数值就是权重(Weights)。
这次保存的人物权重约170 MB,不是完整模型,不能双击出图,需要按第7节的命令搭配对应底模加载。
这与直接上传参考照片有什么不同?
用通用模型生图: 比如把照片上传给ChatGPT,再描述想换的衣服和场景。这是在生成时提供参考,不等于为你训练了一份人物权重。
针对人物训练: 用一组照片更新模型中的可训练参数,把学到的人物特征保存下来,以后搭配底模反复使用。
2. 模型和服务器,我这次这样选
先把两个平台分清:Hugging Face找模型,AutoDL租算力。 它们都不是我们要训练的模型名称。
本次用的是这个组合:
| 项目 | 本次选择 | 用来做什么 |
|---|---|---|
| 底模 | Juggernaut XL v9 | 生成写实人物照片,作为继续训练的起点 |
| 微调方式 | LoRA | 训练并保存人物特征 |
| 云显卡 | 单张RTX 4090,24 GB显存 | 运行生图和训练 |
Juggernaut XL v9基于 SDXL(Stable Diffusion XL),是这次写实人物实验的底模。
、
本教程按“Windows电脑 + AutoDL云服务器”操作,本机不用安装训练环境。本次4090租价为2.08元/小时,实际租用时以页面报价为准。
下载包里,先认这几个文件:
dataset:24张训练图和24份同名的.txt英文描述。
-
、
:训练、生图和安装环境的脚本。
train.toml:填好的训练参数,第一次不用改。
压缩包不含大底模和训练好的权重:底模按指南下载,人物权重由你这轮训练产生。需要先准备AutoDL账号、完成平台验证,再充值租机。
租用页面里,**GPU(Graphics Processing Unit,图形处理器)**是负责大量计算的设备;**显存(VRAM,Video Random Access Memory)**用来放模型和计算中的数据。24 GB显存,不是24 GB电脑内存。
准备动手时,按这个顺序来:
在自己的电脑上准备: 下载起步包,完成AutoDL账号与充值准备,先看
第0—3步。
在AutoDL网页上租机: 按指南选单张RTX 4090、24 GB显存和对应环境镜像,核对当前价格与预算。实例就是你租到的那台云电脑,开机后先设定时关机。
把本机窗口连到云电脑: Windows开始菜单搜索并打开PowerShell,粘贴自己实例的SSH登录命令。**SSH(Secure Shell,安全外壳协议)**用来远程连接;登录成功后,这个窗口执行的命令才是在服务器上运行。
把起步包交给云电脑: 按指南用JupyterLab上传压缩包,再回到SSH窗口解压、安装环境、检查显卡和下载模型。安装命令已经写好,不需要自己组装。
把三个窗口的用途记住就够了:AutoDL网页管机器和账单,JupyterLab传文件、看图片,SSH窗口执行命令。 JupyterLab是实例附带的网页工作区,从AutoDL实例页打开。指南第2步还会带你建立能重新接入的工作会话,完成这步后再开始安装和训练。
选服务器时还会遇到“镜像(Image)”:它是预装系统和软件的环境模板,不是训练图片。具体环境版本已经列在指南中,照着核对即可。
安装、下载和查看结果也会占用开机时间,都要计费。
3. 训练图已经备好:这24张图从哪里来
这一节介绍随包图片的来历,不是跟练的前置任务。以后想自己制作数据,可以看
末尾的“进阶分支”。
为什么不用自己的照片?
作者还没做好心理建设,哈哈
先生成一张起始参考图,也就是“母图”:
接着,用 **IP-Adapter(Image Prompt Adapter,图像提示适配器)**参考她的外貌,生成不同衣服、场景和构图的候选图。本次用的是Plus Face版本。
这里用IP-Adapter制作数据,下一步才是人物训练。
第一轮生成的图长这样:
衣服确实换了,但我要求侧脸、半身,模型仍然给了很多正面近景。降低参考强度没有自动解决问题,后来调整构图提示,半身和持书画面有所改善,真正的侧脸还是少。
我主要看三件事:像不像同一个角色,脸和身体有没有明显错误,服装和构图是不是太重复。最终从36张候选里选出24张:
这些图片和配套描述,合起来就是数据集(Dataset)。
4. 图片描述也已配好,不用重新写
每张图都有一份 Caption(图片描述,非缩写),告诉模型画面里有什么。
例如,起步包里的 dataset/candidate_02.png,配套描述保存在同名的 dataset/candidate_02.txt:
1 | photo of vprsn01 woman wearing a navy coat over a white shirt, shoulders turned, gray studio background |
意思是:角色vprsn01穿海军蓝外套和白衬衫,肩膀转动,背景是灰色影棚。
vprsn01 是这次的触发词(Trigger Word)。你可以把它理解为角色标识,训练描述和之后的生成要求里都带上它,帮助调用学到的特征。
描述按图片实际内容填写:正脸就写正脸,即使生成时要求的是左侧脸。
5. 先跑20步,再开始正式训练
下面的命令使用配套脚本。先完成
第0—3步,看到三个确认结果,再继续:
- OK: reviewed images = 24:24张图和配套描述检查通过。
- 环境检查输出中的cuda_available为true,且命令正常结束:训练环境能调用云显卡。结果也保存在logs/environment.json。
- download_complete:模型下载完成。
以下命令都粘贴到已通过SSH登录的云端终端,不是在本机新开的PowerShell里运行。 终端就是输入命令的窗口。指南会带你进入项目文件夹并激活环境,意思是选中刚装好的那套训练软件。
每次复制一段代码框里的命令,粘贴后按回车,等它执行完再做下一段。先做20步测试:
1 | python portrait.py train --smoke |
训练步数(Training Steps),就是训练过程中更新参数的次数。这20步只检查环境、数据读取和文件保存,不用来判断人物像不像。
这条命令会把详细进度写进日志,当前窗口不会一直刷新。按指南第4步另开一个SSH窗口查看日志,别因为屏幕没动就重复启动训练。
截图里的20/20表示步数跑完,model saved表示程序报告文件已保存。按
第4步确认文件存在、日志无报错、命令正常返回,再启动正式训练:
遇到报错就先停下排查,不要继续粘下一条命令。
1 | python portrait.py train |
这一轮训练1200步,每400步保存一次,含加载和保存约11分37秒。
中途保存的版本叫 Checkpoint(检查点),就像阶段存档。这次有400、800、1200步三个版本,方便之后比较,不用只赌最后一个文件。
日志里的 **Loss(损失值)**表示训练误差;人物像不像,要看下一步的对照图。
训练结束后,检查保存的文件:
1 | ls -lh outputs/run01/*.safetensors |
.safetensors是保存模型数值的一种文件格式。检查结果里的 all_tensors_finite: true 表示读到的模型数值没有无穷大或无效值,不代表照片效果已经合格。
6. 微调前后,到底变了什么?
制作数据时,我们用参考图帮助保持人物外貌。检查训练成果时,要把参考图拿掉,才能看清LoRA本身带来的变化。
这次关闭IP-Adapter,不再输入母图,让底模和三个训练版本分别生成同一组六个新场景。
对照时固定 Prompt(提示词)、**Seed(随机种子)**和采样设置。提示词是文字要求,随机种子决定随机数生成的起点;采样设置是图片逐步生成时使用的算法和参数。这些已在脚本里固定,第一次不用改,目的是尽量减少其他变化的干扰。
这是底模的结果:
这是加载800步人物LoRA后的结果:
看黄色雨衣、紫色礼服和雪地白外套这几张:服装和背景在变,脸型、眉眼和黑发特征比底模那组更连贯。
这就是这次微调带来的可见变化:模型更倾向于画出这个角色的外貌,而不只是换一套衣服。
没做好的地方也能看见:第四张要求向左转脸,实际仍接近正面;一些半身要求被画成了更紧的近景。训练图里缺少真正的侧脸,结果里也没有凭空补齐。
对照说明:底模未补充完整外貌描述,部分差异可能来自发色、脸型等特征;这组图展示外貌一致性的变化,不是身份识别测试。
在这六个场景、LoRA加载强度0.8的条件下,我目测后选了800步版本。强度指生成时LoRA的影响程度,不是训练步数;800步也不是通用最优值,要看你自己的对照结果。
运行
第6步的对照命令,打开底模、400步、800步、1200步的四组图,每组六张。比较同一场景的人物外貌和构图,选出自己这轮最满意的版本。
7. 换一个场景,让保存的成果再出一张图
例如,用800步版本生成绿夹克、公园、自然光的人物照片。仍在刚才配置好的云端环境里,把下面这段完整复制执行:
1 | python portrait.py generate \ |
–weight指定人物权重,–prompt填写你想生成什么,–seed指定随机种子。触发词 vprsn01 要保留。
命令结束后,在JupyterLab里进入项目目录 portrait-lora-starter-v1,打开 generated 文件夹,就能查看新生成的图片和参数文件。文章开头那张绿夹克写真,就是这一步重新加载后得到的。 它仍偏近景,没有完全满足半身要求,但证明了保存的人物文件可以重新使用。
以后在同样配置好的环境里,加载底模和这份人物文件,修改衣服、背景等提示,就可以继续尝试,不必重新训练。当然,生成仍要用算力,不是无限免费。
8. 把成果带走,再关机
先确认保存的权重能生成新图,再下载、校验成果,最后到AutoDL确认关机。 关闭网页不等于停止计费。
人物权重、训练图片及描述、模型版本、配置、日志和对照图都要留好。打包和校验命令见
,以后换机器才有据可查。
这轮实验在2026年9月6日完成,实际花了多少?
| 项目 | 本次记录 |
|---|---|
| 正式训练 | 1200步,约11分37秒,含加载和保存 |
| 云服务器开机 | 约78分钟 |
| 实际费用 | 0.50 + 2.08 + 0.13 = 2.71元 |
这78分钟包含安装、下载、生图、训练、评测和备份。
费用说明:2.71元是本次实例实付,不含免费母图演示和本地人工时间;跟练费用随租价和开机时长变化。
现在就从这24张图开始
都在这里,从
开始。遇到不认识的词,可以查
。
完成后核对:权重已保存、对照图能打开、重新加载能出新图、成果已下载校验、云实例已关机。
以后换自己的照片训练时,照片和人物权重私下保存即可。
查看源码、下载跟练资料或反馈问题,也可以访问
。第一次跟练,建议从上面的个人网站操作指南开始。
下一篇,我们拿这次实操继续拆:LoRA、底模、权重、训练步数和学习率,到底分别在控制什么?


