文档中心>TI-ONE 训练平台>最佳实践>LLM 训练及评测>使用任务式建模精调自定义大模型

使用任务式建模精调自定义大模型

最近更新时间:2024-07-19 11:32:01

我的收藏

总览

本文以 Baichuan2-13B-Base 为例,展示如何使用 TI-ONE 平台精调自定义大模型(包括平台内置镜像与用户自定义镜像)。

前置要求

后续所有操作,均要求您已准备好 CFS,请先查阅 CFS使用文档 开通 CFS。

操作步骤

物料准备

大模型

请注意: 如果您可以直接在 Notebook 容器里访问 HuggingFace,此步骤可以省略。
由于网络原因, HuggingFace 的大模型在国内可能无法直接下载;为了在 TI-ONE 平台上使用 HuggingFace 的模型,您需要将 HuggingFace 的大模型下载至本地。
git lfs install # or any other command to install git-lfs
git clone https://huggingface.co/baichuan-inc/Baichuan2-13B-Base

可选: 数据集

为了方便您使用大模型, TI-ONE 平台提供了一些测试使用的数据集,您可以直接使用平台内嵌数据快速验证训练流程。
英文 LLM cnn-part-english: 1088 条英文新闻摘要生成数据对
中文 LLM cnn-part-zh: 1094 条中文新闻摘要生成数据对
此外,如果您有需要,也可直接访问 HuggingFace 获取公开数据集。
例如,如果您的 Notebook 可直接访问 HuggingFace ,则您可直接在您的训练代码里指定 HuggingFace 的数据集 ID 即可,例如:
from datasets import load_dataset

# If the dataset is gated/private, make sure you have run HuggingFace-cli login
dataset = load_dataset("nampdn-ai/tiny-codes")
否则,您可以先尝试下载数据集至本地,然后再通过后文介绍的方式上传至 CFS 用于后续训练。
git lfs install
git clone https://huggingface.co/datasets/nampdn-ai/tiny-codes

训练代码

为了方便您走通 TI-ONE 训练流程, TI-ONE 对于主流的 LLM 都提供了一些训练代码样例,您可以直接使用或者根据您的需求进行修改。
本文使用的训练代码可从此处获取。
请特别注意:您在真正精调大模型的时候,需要结合大模型实际情况编写具体的训练代码,本示例仅展示了 Baichuan2-13B-Base 的精调代码,并不能服务于所有其他模型。

训练准备

可选: 创建运维 Notebook

目前 TI-ONE 平台不支持在控制台直接进行数据上传操作,为了解决此问题,需要创建一个运维 Notebook 以挂载 CFS 并上传物料。您可以使用最简单的支持 SSH 的镜像来完成物料上传,或者也可以直接使用下文的调试 Notebook 进行上传。
请特别注意选择 CFS 的原始地址,后续挂载 CFS 到其他调试 Notebook 的时候,需要确保物料可见。推荐开启 SSH 远程开发,这样后续上传文件或者编写代码时可以不依赖 Notebook UI 就能进行操作。



选择 CFS 之后, CFS 会被挂载到 /home/tione/notebook/ 目录。

使用运维 Notebook 上传或者下载模型

如果您可以在运维 Notebook 里直接访问 HuggingFace ,推荐您直接使用 HuggingFace 的 cli 或者 git 下载。
否则,您将不得不使用本地上传的方式上传模型,这里您有几种选择:
1. 您可以直接在运维 Notebook 里使用 Notebook 上传。(请注意, Notebook 上传不支持断点续传,也不支持查看上传进度)



2. 如果您创建时打开了"SSH 连接",您还可以使用 scp 将本地物料上传至 Notebook。
scp -r -P <port> Baichuan2-13B-Base root@host:/home/tione/notebook/model/
TIPS: 如您的文件由 git 下载,您可以尝试删除目录下的 .git 目录,可减少上传的文件,提升上传速度。
3. 如果您有内部其他可直接操作 CFS 的设备,您可以直接使用该设备上传。
本文我们假设模型文件最终被上传到了:
cfs:///data/custom/model/Baichuan2-13B-Base

可选: 使用运维 Notebook 上传或者下载精调数据集

如果您可以在运维 Notebook 里直接访问 HuggingFace ,推荐您直接使用 HuggingFace 的 cli 或者 git 下载
否则,您同样可以使用本地上传的方式上传数据集(详细步骤从略),本文假设您使用了上面提到的平台内嵌数据集 cnn-part-english 并将精调数据上传到了:
cfs:///data/custom/llm/data

可选: 创建调试 Notebook 并调试训练代码

在真正创建精调任务之前,您可能需要先使用 Notebook 调试训练代码,以确保后续任务式建模可以正确执行。在创建调试 Notebook 的时候,请特别注意上面准备的物料被准确地 mount 进了容器里。



此外,平台内嵌的 tilearn-llm 这个镜像,已经安装好了所有依赖,如果没有特殊需要,可以直接使用。
本文假定您使用的是平台提供的训练代码并将代码上传到了下面的 CFS 目录
cfs:///data/custom/llm/code/baichuan2-13b
此时,您只需要执行如下命令,就可以开始跑训练:
请尤其注意: 下面的脚本能跑的前提是上述模型,数据集以及训练代码都被放到了对应的目录下,如果目录不对,您可能需要打开 start_run_ti.sh 进行修改

cfs path
Notebook path
model
cfs:///data/custom/model
/home/tione/notebook/model
data
cfs:///data/custom/llm/data
/home/tione/notebook/llm/data
code
cfs:///data/custom/llm/code
/home/tione/notebook/llm/code
mkdir -p /opt/ml/input/config/
echo '{}' > /opt/ml/input/config/hyperparameters.json
cd /home/tione/notebook/llm/code/baichuan2-13b
bash start_run_ti.sh
您还可以按需修改 hyperparameters.json ,例如:
{
"Epoch": "2",
"BatchSize": "4",
"LearningRate": "1e-5",
"Step": "750",
"UseTilearn": "true",
"FinetuningType": "Full",
"MaxSequenceLength": "2048",
"Validation": "0.2"
}
超参字段的含义是:
Epoch: 建议值“ 2 ”;训练过程中的迭代轮次。
BatchSize: 建议值“ 4 ”;每轮训练迭代中的样本数。 BatchSize 越大,训练速度越快同时内存占用越高。
LearningRate: 建议值“ 1e-5 ”;梯度下降过程中更新权重的超参,过高导致模型难以收敛,过低导致模型收敛速度过慢。
Step: 建议值“ 750 ”;每跑多少个 Step 保存一次模型的 Checkpoint ,保存 Checkpoint 越多需要的存储空间越大。
UseTilearn :是否要开启腾讯自研加速,"true/false"。
FinetuningType :用户可自定义选择精调训练模式“Lora/Full ”。
Validation :支持用户设置验证集占整个数据集的比例。
MaxSequenceLength :最大文本序列长度,默认“ 2048 ”,超过该长度的训练文本将被自动截断。
例如: 以单机 8 卡 A100 为例, UseTilearn == true && FinetuningType == Full ,训练结果如下:



UseTilearn == false && FinetuningType == Full 时,训练结果如下:




可选: 制作调试镜像

如果内嵌镜像不满足您的需求,或者您有额外的依赖需要安装,您也可以将 Notebook 镜像保存为训练镜像供后续使用。制作训练镜像时,请注意遵循平台自定义镜像制作规范

训练

使用任务式建模精调大模型

当您使用调试 Notebook 调试完训练代码后,接下来便可以使用任务式建模进一步精调大模型。
1. 选择正确的镜像并指定合适的训练资源
创建任务第一步,请确保您选择了正确的训练镜像(如无特殊需求,您可以使用平台内嵌的 tilearn-llm),同时请确保您选择的资源配置包含 8C32GB1GPU(A100)以上的配置。



关于训练镜像选择
平台内置训练镜像,包含了常见的训练需要的软件,理论上可以支持绝大部分HuggingFace大模型。
如平台内置镜像无法满足您的需求,您可以提单联系我们;此外,您也可以在平台内置镜像的基础上安装您需要的软件包并保存为自定义镜像。此时,您可以在镜像选择页面选择您预先制作好的镜像用于训练。在此种场景下,建议您先在Notebook页面确保镜像能正确启动训练任务,然后再在任务式建模里选择使用。
2. 配置精调所需的物料
创建任务第二步,请确保您配置好了外部数据源(除了预训练模型之外,尽量使用与调试 Notebook 相同的挂载配置)。请注意: 在精调场景里,您至少需要准备基地模型,精调数据集,训练代码这三种输入数据。



最终挂载关系如下:

cfs path
Notebook path
model
/data/custom/model/Baichuan2-13B-Base
/opt/ml/pretrain_model
dataset
/data/custom/llm/data
/opt/ml/input/data/train
code
/data/custom/llm/code/baichuan2-13b
/opt/ml/input/data/code
output
/data/custom/llm/output
/opt/ml/output/data
请注意: 本文所用的示例代码需要上述要素严格按照上表的目录存放才能正确执行,如果您的目录不同,您需要打开脚本进行修改。

查看训练任务监控

此外,您还可以单击"任务列表 > 操作栏中的 Tensorboard 按钮",配置 Tensorboard 任务,(若您的训练输出文件存储在 CFS 中,则选择 CFS 为 summary 输出存储,选择存储路径为您当前训练任务配置的 CFS 文件系统和源路径,若您配置了多个,则需要选择其中一个,填写您的 summary 数据所在的容器内目录,平台默认会将您的 CFS 系统挂载的容器本地路径展示出来,您只需要填写 summary 文件具体所在的子目录), 此时,只要在您的训练代码里加上如下代码,就可以在 tensorboard 里观看训练监控。
# trainer is of type huggingface trl.Trainer

train_result = trainer.train()
metrics = train_result.metrics
trainer.log_metrics("all", metrics)
trainer.save_metrics("all", metrics)




部署推理服务

可选: 合并 LoRA 大模型

如果您训练的时候采用了 LoRA,训练完成后,保存的模型是不完整的,此时,你需要将训练结果于 base model 合并; 如下是一个简单的合并示例,
from transformers import AutoModelForCausalLM
from peft import PeftModel

model_id="/home/tione/notebook/model/Baichuan2-13B-Base" # base model path
peft_model_id="/home/tione/notebook/llm/output" # lora train result path
merged_id="/home/tione/notebook/model/Baichuan2-13B-Merged" # merge dir
base_model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True)
model = PeftModel.from_pretrained(base_model, peft_model_id, trust_remote_code=True)
merged_model = model.merge_and_unload()
merged_model.save_pretrained(merged_id)
本例假设合并后的模型被保存到了如下地址
cfs:///data/custom/model/Baichuan2-13B-Merged

发布大模型

模型训练完成后,可以在"在线服务"部分部署服务。平台提供了 llm-infer 内嵌镜像,理论上可以支持所有 HuggingFace 大模型,推荐使用。
模型服务 > 在线服务页面,填写如下信息:
模型来源: 数据源
选择数据源: 填写正确的模型数据源地址
运行环境: 建议选择 llm-infer 镜像,如果您有特殊需求,也可以自己制作。
除了上面的这些基本信息之外,您还需要根据模型具体信息,填写不同的环境变量;详细请参考 TI-ONE 平台内置推理镜像使用指南; 在本例中,您需要配置的环境变量有:
MODEL_ID: 模型名称,此选项必填;本例为 Baichuan2-13B-merged。
WORKER_TYPE: ray
CONV_TEMPLATE: generate



待服务启动后,您就可以请求推理服务:
curl -H "content-type: application/json" http://localhost:8501/v1/completions -d '{"prompt":"I have 3 apples today and I ate 1 apple yesterday, how many apples do I have today?", "max_tokens": 200}'



您也可以在点击在线服务页面的在线体验按钮,直接体验精调后的大模型。