实战 QLoRA 微调 ChatGLM3-6B 大模型
实战 PEFT 库 QLoRA ChatGLM3-6B
微调数据集 AdvertiseGen
AdvertiseGen 数据集获取
使用ChatGLM3-6b Tokenizer处理数据
关于ig nore_label_id 的设置:
在许多自然语言处理和机器学习框架中, ig nore_label_id 被设置为-100 是一种常见的约定。 这个特殊的值用千标记在计算损失函数时应该被忽略的目标标签。 让我们详细了解一下这个选择的原因:
- 损失函数忽略特定值:训练语言模型时, 损失函数(例如交叉嫡损失)通常只计算对千模型预测重要或关键的标签的损失。 在某些况下, 你可能不希望某些标签对损失计算产生影晌。 例如, 在序列到序列的模型中, 输入部分的标签通常被设置为一个忽略值, 因为只有输出部分的标签对千训练是重要的。
- 为何选择-100: 这个具体的值是基千实现细节选择的。 在 PyTorch 的交叉嫡损失函数中, 可以指定一个ig nore_index 参数。 当损失函数看到这个索引值时, 它就会忽略对应的输出标签。 使用-100 作为默认值是因为它是一个不太可能出现在标签中的数字(特别是在处理分类间题时, 标签通常是从0开始的正整数)。
- 标准化和通用性:由于这种做法在多个库和框架中被采纳, -100 作为忽略标签的默认值已经变得相对标准化, 这有助于维护代码的通用性和可读性。
总的来说, 将ig nore_label_id 设置为-100 是一种在计算损失时排除特定标签影晌的便捷方式。 这在处理特定类型的自然语言处理任务时非常有用, 尤其是在涉及序列生成或修改的任务中。
自定义模型新增Adapter
当新的热门transformer网络架构(新模型)发布时, Huggingface社区会尽力快速将它们添加到PEFT 中。
具体来说, 在初始化相应的微调配置类(例如 LoraConfig)时, 我们需要显式指定在哪些层新增适配器(Adapter), 并将其设置正确。
ref: https 😕/hugg i ngf a ce.co/docs/peft/deve loper:_gu id es/custom_models
PEFT适配模块设置
在PEFT库的constants.py文件中定义了不同的PEFT 方法, 在各类大模型上的微调适配模块。
通常, 名称相同的模型架构也类似, 应用微调方法时的适配器设置也几乎一致。
例如, 如果新模型架构是mis tral模型的变体, 并且您想应用LoRA微调。 在
TRANSFORMERS_MODELS_TO_LORA_TARGET_MODULES_MAPPING中 mis t ral包含[“q_proj”, 11v_proj” ]。
这表示说, 对千 mis tral模型, LoRA的target_modules通常是[“q_proj”, 11v_p「oj ” ]。
关千使用 num_train_epochs 时, 训练总步数 st eps 的计算方法
- 训练总步数: total_steps = steps/epoch* num_train_epochs
- 每个epoch的训练步数: steps/epoch= num_train_examples / (batch_size * gradient_accumulation_steps)
以adgen数据集为例计算
DatasetDict({
train: Dataset({
})
features: ['content', 'summary'],
num_rows: 114599
validation: Dataset({
})
}
代入超参数和配置进行计算:
num_train_epochs = 1
num_train_examples = 114599
batch_size = 16
gradient_accumulation_steps = 4
steps = num_train_epochs * num_train_examples / (batch_size * gradient_accumulation_steps)
= 1 * 114599 / (16 * 4)
= 1790
微调前后效果对比
ChatGLM-6B
输入:
类型#裙*版型#显瘦*风格#文艺*风格#简约*图案#印花*图案#撞色*裙下摆#压褶*裙长#连衣裙*裙领型#圆领
ChatGLM-6B微调前输出:
- 版型:修身
- 显瘦:True
- 风格:文艺
- 简约:True
- 图案:印花
- 撞色:True
- 裙下摆:直筒或微喇
- 裙长:中长裙
- 连衣裙:True
ChatGLM-6B微调后输出:
一款简约而不简单的连衣裙, 采用撞色的印花点缀, 打造文艺气息, 简约的圆领, 修饰脸型。 衣袖和裙摆的压褶, 增添设计感, 修身的版型, 勾勒出窃究的身材曲线。
ChatGLM2-6B
输入:
类型#裙*版型#显瘦*风格#文艺*风格#简约*图案#印花*图案#撞色*裙下摆#压褶*裙长#连衣裙*裙领型#圆领
微调前:
这款裙子,版型显瘦,采用简约文艺风格,图案为印花和撞色设计,裙下摆为压褶裙摆,裙长为连衣裙,适合各种场合穿着,让你舒适自在。 圆领设计,优雅清新,让你在任何场合都充满自信。 如果你正在寻找一款舒适、 时尚、 优雅的裙子,不妨考虑这款吧!
微调后:
这款连衣裙简约的设计, 撞色印花点缀, 丰富了视觉, 上身更显时尚。 修身的版型, 贴合身形, 穿着舒适不束缚。 圆领的设计, 露出精致锁骨, 尽显女性优雅气质。 下摆压褶的设计, 增添立体感, 行走间更显飘逸。 前短后长的设计, 显得身材比例更加完美。 文艺的碎花设计, 更显精致
ChatGLM3-6B
input_text ='类型#裙*版型#显瘦*风格#文艺*风格#简约*图案#印花*图案#撞色*裙下摆#压褶*裙长护巠衣裙*裙领型#囡领'
print(f'输入: \n{input_text}')
tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path, trust_remote_code=True)
输入:
类型#裙*版型#显瘦*风格#文艺*风格#简约*图案#印花*图案#撞色*裙下摆#压褶*裙长#连衣裙*裙领型#圆领
response, history= base_model.chat(tokenizer=tokenizer, query=input_text}
print(f'ChatGLM3-6B微调前: \n{response}'}
response, history= base_model.chat(tokenizer=tokenizer, query=input_text}
print(f'ChatGLM3-6B微调前: \n{response}'}