本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Fine-tune 用 LoRa 和 qLoRa 拥抱脸部 LLM
本教程引导您在自定义指令数据集上微调带 Low-Rank 自适应 (LoRa) 或量化适 Low-Rank应 (QLoRa) 的 Hugging Face 因果语言模型。你将 Hugging Face LoRa 微调任务包提交 GitHub
LoRa 在冻结的基础模型上训练小型适配器,而不是更新模型的所有权重。QLora 在以 4 位量化形式保存基本模型时也这样做,这大约是所需的 GPU 内存的一半,并允许较大的模型安装在较小的 GPU 上。
该套件使用 Hugging Face 变换器库
预计时间:大约一小时,包括设置。大多数 LoRa 针对 1B—7B 模型的微调在 5-30 分钟的训练中即可完成。
运行本教程会产生处理任务的 GPU 工作实例的费用。
概述
该工作流程分为四个阶段。您需要准备 JSONL 数据集,提交 Deadline Cloud 作业,以便 GPU 工作人员下载数据集并运行 QLora 微调,使用适配器下载适配器deadline job download-output,然后将适配器与基础模型组合以进行本地推断。
要完成本教程,请按照以下步骤操作:
-
完成先决条件。
-
设置你的农场。
-
准备您的数据集。
-
授予队列角色访问您的数据集存储桶的权限(仅限 S3 数据集)。
-
提交微调作业。
-
下载并使用经过训练的适配器。
-
清理资源。
先决条件
在开始之前,您需要:
-
GitHub已安装 Deadl
ine Cloud CLI。 -
JSONL 格式的数据集,位于本地文件夹中,也可以上传到队列角色可以读取的 Amazon S3 存储桶。
-
(可选)Hugging Face 代币,只有将捆绑包重新指向封闭模型(例如 Llama 或 Gemma)时才需要。下拉列表中的所有模型都是公开的。
设置你的农场
你需要一个带有 GPU-enabled 队列的 Deadline Cloud 农场(Linux 机群、具有 16 GB 或更多视频 RAM (VRAM) 的 NVIDIA GPU)。
下表按型号大小列出了机队建议。与完整的 LoRa 相比,QLora 的内存需求减少了一半,并且该套装默认为 QLora。
| 模型大小 | 最小 VRAM(qLoRa 4 位) | 建议的亚马逊 EC2 实例 |
|---|---|---|
0.5B—1.5B |
8 GB |
|
3B—7B |
12 GB |
|
7B—14B |
24 GB |
|
14B—32B |
48 GB |
|
注意
最后一行的多 GPU 实例提供四个 24 GB 的 GPU,而不是一个具有 48 GB 显存的 GPU。该捆绑包的训练脚本使用 Hugging Face device_map="auto" 设置向模型加载,该设置将在实例的 GPU 上分片模型层。对于具有 48 GB 显存的单个 GPU,请使用g6e实例 (L40S)。
准备您的数据集
数据集是一个 JSONL 文件,其中每行都是一个带有两个文本字段的 JSON 对象。默认字段名称为instruction和output,您可以使用InstructionColumn和ResponseColumn参数对其进行配置。
以下几行来自该捆绑包中包含的 Saffron Stack 样本数据集:
{"instruction": "What is Saffron Stack's tagline?", "output": "Saffron Stack's tagline is 'Layered with love.'"} {"instruction": "How old is Saffron Stack?", "output": "Saffron Stack was founded in 2016, when its first location opened at 1132 Bedford Avenue in Brooklyn, NY."}
该捆绑包接受两种形式的数据:
-
本地文件夹(默认)-
DatasetPath参数指向一个或多个.jsonl文件的本地文件夹。Deadline Cloud 作业附件会自动上传文件夹,该作业会合并该文件夹中的多个文件,包括子文件夹。默认值是捆绑包自己的sample_data/文件夹,因此使用所包含的示例数据(一个名为 Saffron Stack 的虚构餐厅示例)提交所有默认列车。 -
Amazon S3 URI(可选替代)— 如果您设置了
DatasetS3Uri参数,则该包将忽略DatasetPath并改为从 Amazon S3 下载。它接受单个文件s3://bucket/path/train.jsonl,例如,或以结尾的前缀连接/其下的所有.jsonl文件。S3 模式要求队列的会话角色拥有数据集的s3:GetObject权限。
该数据集格式与许多公共的 Hugging Face 数据集兼容,包括 Hugging Face 上的 tatsu-数据集instruction response ResponseColumn=response
授予队列角色访问您的数据集存储桶的权限
截止日期云工作人员在队列的会话角色下运行作业。默认情况下,该角色只能读取队列的任务附件 Amazon S3 存储桶。如果您的数据集位于其他地方,则必须向角色授予读取权限。如果您使用默认的本地文件夹数据集,请跳过本节。
向队列角色授予对数据集的读取权限
-
创建名为的策略文档
datasets-policy.json,将资源 ARN 替换为您的实际存储桶和前缀:{ "Version": "2012-10-17", "Statement": [{ "Sid": "ReadFineTuningDatasets", "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::YOUR-BUCKET", "arn:aws:s3:::YOUR-BUCKET/datasets/*" ] }] } -
将策略附加到您的队列角色:
QUEUE_ROLE=$(aws deadline get-queue --farm-idFARM-ID--queue-idQUEUE-ID\ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam put-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets \ --policy-document file://datasets-policy.json
或者,将您的数据集放在队列的现有作业附件存储桶前缀 (DeadlineCloud/...) 下,角色已经拥有访问权限。
提交微调作业
要向 GUI 提交者提交,请运行以下命令,填写表单,然后选择提交。GUI 分为可折叠的部分:模型、数据集、LoRa、训练和输出。
deadline bundle gui-submit /path/to/hf_finetune_lora
或者,使用 CLI 提交:
deadline bundle submit /path/to/hf_finetune_lora \ --queue-idgpu-queue-id\ -p DatasetPath=/path/to/your/data\ -p OutputDir=/tmp/lora-output\ -p AdapterName=my-adapter
该BaseModel参数默认为Qwen/Qwen2.5-7B并提供五种公共模型的下拉列表: Qwen2.5 (0.5B、1.5B 和 7B)、 Mistral-7B-v0.3和。 Phi-3.5-mini-instruct要微调不在列表中的模型,请在包template.yaml文件中编辑该allowedValuesBaseModel参数的值。默认超参数已针对事实记忆进行了调整,这与捆绑的样本数据相匹配。对于风格转移用例,较轻的配置训练速度更快:
deadline bundle submit /path/to/hf_finetune_lora \ --queue-idgpu-queue-id\ -p BaseModel=Qwen/Qwen2.5-1.5B \ -p DatasetPath=/path/to/your/data\ -p Epochs=5 -p LoraRank=16 -p LearningRate=2e-4 \ -p OutputDir=/tmp/lora-output\ -p AdapterName=my-adapter
有关参数的完整列表,包括 LoRa 等级、学习率、批量大小和序列长度,请参阅示例 README 中的关键参数表。 GitHub
要等待作业完成,请运行以下命令:
deadline job wait --job-idjob-id--timeout 3600
下载并使用经过训练的适配器
下载和测试适配器
-
任务完成后,下载输出:
deadline job download-output --job-idjob-id适配器最终位于
并包含 LoRa 权重 (OutputDir/AdapterName/adapter_model.safetensors)、PEFT 配置 (adapter_config.json)、训练元数据和令牌生成器文件。 -
在本地计算机上安装核心推理堆栈:
pip install torch transformers peft聊天工具会加载完整的基础模型,因此您的计算机需要足够的资源来运行它。GPU 是可选的:在 NVIDIA GPU 上,pip 的默认 CUDA-enabled PyTorch 处理加速;在 Apple silicon Mac 上, PyTorch 自动使用 Metal (MPS);并且 CPU-only 可以运行但速度很慢(15B 型号的每个答案大约 30 秒)。
-
使用随附的交互式聊天工具测试适配器:
python3 inference/chat.py --adapter-path/path/to/downloaded/my-adapter该工具将适配器加载到基础模型之上,并为您提供一个 REPL,您可以在其中提问并与基础模型进行比较,以验证微调是否奏效。
-
要在浏览器中使用聊天气泡获得更易于演示的 Web 用户界面,请安装 Gradio 并运行网络聊天工具:
pip install gradio python3 inference/gradio_chat.py --adapter-path/path/to/downloaded/my-adapter
有关这两种工具以及使用 PEFT 以编程方式加载适配器的详细信息,请参阅推理工具自述文件。 GitHub
提示
-
损失应该单调地减少 ——如果没有,请降低学习率(尝试)。
1e-4 -
内存压力 — 降低
PerDeviceBatchSize(尝试 1 或 2)并提高GradAccumSteps以保持有效批量大小不变。 -
风格转移和事实记忆不同 ——风格转移通常适用于 3—5 个周期和大约 50—200 个样本。事实记忆需要8—15个周期,每个事实需要更多的样本(5—8个短语)。
-
封闭模型 -如果通过将包添加到参数中来将包重新指向诸如 Llama 或 Gemma 之类
allowedValues的封闭模型,请设置该BaseModel参数。HuggingFaceToken对于生产环境,最好在队列本身上设置HF_TOKEN为环境变量,而不是将其作为参数传递。 -
模型缓存 -捆绑包
/mnt/persistent/hf_cache默认使用,它位于工作人员的永久卷上。缓存可以跨任务保留基础模型,因此后续运行速度要快得多。
清理
为避免持续收费,请清理您为本教程创建的资源:
清理教程资源
-
如果您专门为本教程创建了 GPU 队列,请将其停止或删除。如果您使用的是预先存在的共享队列,请将其保留在原处。
-
如果您已将
ReadFineTuningDatasets策略添加到队列角色且不再需要它,请将其删除:QUEUE_ROLE=$(aws deadline get-queue --farm-idFARM-ID--queue-idQUEUE-ID\ --query 'roleArn' --output text | awk -F/ '{print $NF}') aws iam delete-role-policy \ --role-name "$QUEUE_ROLE" \ --policy-name ReadFineTuningDatasets -
如果您不再需要本地输出文件,请将其删除。
相关资源
以下资源提供了其他信息: