0代码本地微调大模型
H2O LLM Studio 把数据导入、LoRA 微调、实验监控、模型导出做成网页后台。适合想本地训专属问答模型,但不想从脚本开始的人。


微调大模型这件事,过去很容易把人劝退。概念还能慢慢学,第一步的工程细节就够麻烦:准备训练脚本、处理数据格式、挑 LoRA 参数、看显存爆不爆、训练完还要评估和导出。
H2O LLM Studio 把这些动作放进了一个网页后台。导入数据、选择模型、设置 LoRA 、启动训练、看曲线、和模型聊天、导出到 Hugging Face,都能在界面里完成。硬件门槛还在,“会不会写训练代码”这道门槛低了很多。
项目地址:
https://github.com/h2oai/h2o-llmstudio

它适合做什么
H2O LLM Studio 的定位是:给大模型微调准备的 no-code GUI 。它适合这些场景:
- 用公司 FAQ 、客服问答、产品文档,训练一个更懂业务口径的问答模型。
- 用标注好的指令数据,让模型学会固定输出格式。
- 用分类、回归、 DPO/IPO/KTO 等任务做实验,不想每次都改脚本。
- 想比较不同模型、学习率、 batch size 、 LoRA 参数的效果。
- 训练完成后,把 checkpoint 下载到本地,或者推送到 Hugging Face 。
它底层仍然是 Python 、 PyTorch 、 Transformers 、 LoRA 、量化训练这些东西。区别在于,大部分配置都变成了表单和下拉框。
硬件要求先说清楚
普通笔记本很难轻松跑这类训练。官方文档给出的本地要求很直接:Ubuntu 16.04+,至少一张较新的 NVIDIA GPU,NVIDIA 驱动版本 470.57.02 或更高,系统内存至少 128GB 。更大的模型和更复杂的任务可能需要 256GB 以上内存。
显存方面,官方特别提醒:较大的模型建议至少 24GB GPU 显存。

按普通使用者的视角,可以这样理解:
- 24GB 显存档:适合试 7B / 13B 级别模型的 LoRA 或 NF4 量化微调,控制 batch size 、 max length 、数据量,先跑小实验。
- 48GB 到 80GB 显存档:训练体验会明显稳一些,可以更从容地调上下文长度、 batch size 和模型规模。
- 70B 级别:官方性能表里,A10G 即使多卡也会 OOM;A100 80GB 才进入可跑范围,1 张 A100 80GB 跑 70B NF4 的训练时间约 4 小时 23 分,验证约 2 小时 44 分。
官方性能表里还有几个有用参照:1 张 A10G 跑 7B bfloat16 训练约 1 小时 25 分;1 张 A10G 跑 13B NF4 训练约 2 小时 44 分;1 张 A100 80GB 跑 13B bfloat16 训练约 39 分钟。这个时间只代表默认参数下的测试结果,自己的数据量、 max length 、 epoch 、 batch size 都会改变耗时。
如果家里只有 8GB 或 12GB 显存,把它当成学习界面和看流程还可以;认真本地微调,最好别低估显存和内存压力。
安装方式一:Docker 跑起来最快
先在机器上安装 Docker 和 NVIDIA Container Toolkit,确认容器可以访问 GPU 。最常用的检查命令是:
nvidia-smi
然后创建挂载目录,启动官方镜像:
mkdir -p `pwd`/llmstudio_mnt
docker run \
--runtime=nvidia \
--shm-size=64g \
--init \
--rm \
-it \
-p 10101:10101 \
-v `pwd`/llmstudio_mnt:/mount \
h2oairelease/h2oai-llmstudio-app:latest
启动后,在浏览器打开:
http://localhost:10101/
如果在远程云主机上跑,需要把 10101 端口通过 SSH 隧道或安全代理暴露出来。不要直接把训练后台裸露到公网。
安装方式二:本地源码安装
更想用源码方式安装,可以走 uv 和 Python 3.10 。先准备驱动、 CUDA 和 Python 环境,然后克隆仓库:
git clone https://github.com/h2oai/h2o-llmstudio.git
cd h2o-llmstudio
make setup
make llmstudio
make llmstudio 会启动 H2O Wave server 和 LLM Studio app 。浏览器打开同样是:
http://localhost:10101/
如果不用 uv 环境,也可以手动启动:
H2O_WAVE_MAX_REQUEST_SIZE=25MB \
H2O_WAVE_NO_LOG=True \
H2O_WAVE_PRIVATE_DIR="/download/@output/download" \
wave run llm_studio.app
第一步:准备训练数据
H2O LLM Studio 支持本地上传、 Local 路径、 AWS S3 、 Azure Datalake 、 H2O Drive 、 Kaggle 、 Hugging Face 等数据来源。
最容易上手的是 CSV 。至少准备两列:一列是 prompt / instruction,一列是 expected output / answer 。比如:
instruction,output
"客户问:产品能不能退款?","可以。未激活订单支持 7 天内退款,已使用订单按服务条款处理。"
"客户问:如何重置密码?","进入登录页,点击忘记密码,按邮箱验证码完成重置。"
也可以准备验证集。如果没有单独的验证文件,界面里可以选择自动切分。对多轮对话数据,还可以用 parent_id 和 id 表示上下文链路;刚开始不建议把格式做复杂,先用问答对跑通。

第二步:导入数据集
进入界面后,点击 Import dataset。
常见选择:
- Source:Upload 或 Hugging Face 。
- 文件格式:CSV 、 Parquet(
.pq),或者包含这些文件的 zip 。 - Problem type:普通指令微调通常选 Causal language modeling;分类任务可以选 Causal classification modeling 。
- Prompt column:选择问题、指令、输入文本那一列。
- Answer column:选择期望答案那一列。
导入后先看预览。字段错了、中文乱码、答案列为空,这一步就能发现。数据有问题不要急着开训,先修 CSV 。
第三步:创建实验
数据集确认后,点击 Create experiment 或者在数据集菜单里选择 New experiment。
几个参数先看这几项:
- LLM Backbone:基座模型。可以从下拉列表选,也可以填 Hugging Face 模型名,例如
h2oai/h2o-danube2-1.8b-sft。如果模型在本地,也可以填本地路径。 - Max length:控制训练序列长度。长度越大,显存压力越高。
- Backbone dtype / Quantization:显存紧张时优先考虑 int4 / NF4 这类量化方式。
- LoRA:建议先打开。 LoRA 只训练少量适配参数,更适合个人机器。
- Batch size:显存不够时先降它。
- Epochs:先用 1 个 epoch 跑通流程,不要一上来长时间训练。
- Mask Prompt Labels:常见指令微调会只训练答案部分,避免模型学习“复述问题”。

新手可以先保留大部分默认值,只改模型、数据列、 LoRA 、 batch size 、 max length 。确认能跑完,再做第二轮调参。
第四步:看曲线,不要只看最后一句回答
实验启动后,在 View experiments 里可以看训练状态、日志、验证结果和图表。训练曲线能帮你判断几个常见问题:
- loss 一直不降:数据列可能选错,学习率也可能不合适。
- 训练 loss 降得很快,验证效果差:可能过拟合,数据太少或 epoch 太多。
- 频繁 OOM:先降 batch size 、 max length,必要时换量化或更小模型。
- 生成答案格式乱:训练数据里的答案格式可能不统一。

微调不能停在“把数据倒进去”。一个靠谱流程通常是:小样本试跑,检查输出,修数据,再扩大数据量。
第五步:直接和模型聊天
训练完成后,可以在 Chat 相关页面里测试模型回答。这里不要只问一个“你好”。更应该拿真实业务问题测试,比如售后规则、产品参数、内部流程、固定 JSON 输出。

建议准备一组固定测试题:
1. 用户问题是否能按公司口径回答?
2. 遇到不知道的问题,会不会乱编?
3. 是否能输出固定格式,例如 JSON 或工单模板?
4. 同一类问题换一种问法,答案是否稳定?
5. 敏感问题是否会触发错误承诺?
每次改数据或改参数,都用同一组题测一遍。这样比凭感觉聊天可靠。
第六步:导出模型
训练完成后,有两条路:下载模型到本地,或者推送到 Hugging Face Hub 。
在界面里可以点击 Download model 下载本地模型。也可以点击 Push checkpoint to huggingface,填 Hugging Face 账号和有写权限的 API token 后导出。

如果想在 Python 里加载下载后的模型,官方文档给了 Transformers 示例。注意 prompt 格式要和训练时一致:
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "path_to_downloaded_model"
prompt = "<|prompt|>How are you?<|endoftext|><|answer|>"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
model.cuda().eval()
inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")
tokens = model.generate(
**inputs,
max_new_tokens=256,
temperature=0.3,
repetition_penalty=1.2,
num_beams=1,
)[0]
tokens = tokens[inputs["input_ids"].shape[1]:]
answer = tokenizer.decode(tokens, skip_special_tokens=True)
print(answer)
适合第一次跑的实验方案
如果只是想体验“0 代码本地微调”,别从 70B 开始。可以按这个方案做第一轮:
- 模型:选 1B 到 7B 级别模型,先确认流程。
- 数据:100 到 1000 条高质量问答,比一万条脏数据更有价值。
- 训练:LoRA 打开,epoch 设 1,batch size 从小开始。
- 序列长度:先控制在 512 或 1024,后面再加。
- 输出:训练完先本地聊天测试,再考虑导出。
第一次跑先验证三件事:数据格式对不对,显存能不能撑住,模型有没有学到你的业务口径。别急着追求“替代通用大模型”。
几个容易踩的坑
数据比参数更重要。 微调很吃数据质量。答案互相冲突、格式不统一、里面混进过期规则,模型会照单全收。
别把微调当知识库。 如果只是让模型查公司文档,RAG 往往更合适。微调更适合学风格、格式、分类边界和稳定回答习惯。
先做小实验。 数据抽样 10%,跑一个短实验,看日志和输出。没问题再全量跑。
公网后台要收好。 训练界面、模型文件、数据集都可能包含敏感信息。远程使用时优先走 SSH 隧道、 VPN 或受控访问。
保留实验配置。 H2O LLM Studio 支持 CLI 读取 YAML 配置训练。界面跑通后,把配置沉淀下来,后面复现实验会轻松很多。
判断
H2O LLM Studio 更适合手上有垂直数据、想做本地微调、又不想从训练脚本开始的人。
它不会省掉 GPU 钱,也不会自动修好脏数据。但它把微调流程拆成了看得见的几个步骤:导数据、选模型、调参数、看结果、导出模型。对很多团队来说,这已经足够把“听说可以微调”推进到“今天先跑一个小实验”。