学习log2|llm学习之Modelscope-Swift训练框
2023-10-19 本文已影响0人
小周的万用胶囊
接着modelscope的学习,今天依靠Swift跑通了训练的部分,modelscope平台出了一个Swift框架可以让小白,爱好者非AI专业人士无痛训练大模型,仅需少量代码即可完成。经过测试,发现Swift框架是和huggingface hub出的transformers混搭使用的,可能因为transformers这个库已经包含了基础的内容就没必要再重复造轮子吧(属于是无端猜测)。序列的字节化是通过transformers库完成的,而训练参数之类繁杂的代码则是被Swift框架封装了,能够达到直观训练的目的。
0. Swift框架是什么
官方的解释:Swift是一个提供LLM模型轻量级训练和推理的开源框架。
用户层面的解释:无痛训练的大模型的包。
1. Swift训练模型的流程
- 跑了一下官方的代码,加上之前学习了
吴恩达的课程
发现过程都差不多的,本人更喜欢吴恩达的课程代码,因为学了这个可以更加明白原理(稍后放上笔记)
1. 数据加载
- 数据集加载相关 :modelscope常用组件
2. 如何设置训练的参数、定义一个trainer和训练模型
- 涉及的Swift模块有
TrainingArguments和Trainer
: 通过TrainingArguments配置参数,实例化一个Trainer即可进行训练 - 这里还涉及另外一个问题:就是如何使用自定义参数进行训练
# 设定训练参数下面是LoRA的调参
LORA_TARGET_MODULES = ['query_key_value']
LORA_RANK = 8
LORA_ALPHA = 32
LORA_DROPOUT_P = 0.1
lora_config = LoRAConfig(
target_modules=LORA_TARGET_MODULES,
merge_weights=LORA_RANK,
lora_alpha=LORA_ALPHA,
lora_dropout=LORA_DROPOUT_P
)
#序列化输入,填充和剪裁
def tokenize_function(examples):
return tokenizer(examples["sentence1"], examples["sentence2"],
padding="max_length", truncation=True, max_length=128)
# 处理数据集
train_dataset = train_dataset.map(tokenize_function)
val_dataset = val_dataset.map(tokenize_function)
# 训练参数,定义模型输出路径、batch的数量等等
arguments = TrainingArguments(
output_dir='./outputs',
per_device_train_batch_size=16,
)
# 更多参数查看
print(TrainingArguments.__dict__)
#实例化一个训练
trainer = Trainer(model, arguments, train_dataset=train_dataset,
eval_dataset=val_dataset,
data_collator=default_data_collator)
#训练代码
trainer.train()
3. 怎么运行用Swift框架微调好的模型
- 官方使用modelscope加载Pipeline推理(pipeline有专门的任务):text-generation, fill mask,等等
代码基础结构如下👉pipeline('任务类型', model='model_name')
,只需一行代码就能让模型 - 下面是常见的代码
# 掩码任务
from modelscope.pipelines import pipeline
unmasker = pipeline('fill-mask', model='bert-base-uncased')
#序列标注任务part-of-speech
pipeline_ins = pipeline(task='part-of-speech', model='damo/nlp_structbert_part-of-speech_chinese-lite')
pipeline_ins(input='今天天气不错,适合出去游玩')
# 文本生成
input = '昨天起,上海地铁3号线长江南路站、殷高西路站、江湾镇站三站进一步限流。体验发现,高峰时段排队5分钟能进站;不少乘客选择提前起床,“现在提前10到20分钟起床,即便限流也不会影响上班”。被限流的XDJMS,你们提前多久?新民网'
text_summary = pipeline('text-generation', model='damo/nlp_palm2.0_text-generation_chinese-base')
text_summary(input)
- 👇下面的代码是上面
trainer.train()
训练后,使用训练后的模型进行推理,也即是使用微调后的模型
from modelscope import AutoModelForSequenceClassification, AutoTokenizer
from swift import Trainer, LoRAConfig, Swift
model = AutoModelForSequenceClassification.from_pretrained(
'AI-ModelScope/bert-base-uncased', revision='v1.0.0')
tokenizer = AutoTokenizer.from_pretrained(
'AI-ModelScope/bert-base-uncased', revision='v1.0.0')
lora_config = LoRAConfig(target_modules=['query', 'key', 'value'])
model = Swift.from_pretrained(model, model_id='./outputs/checkpoint-21')
print(model(**tokenizer('this is a test', return_tensors='pt')))

注意事项
- Swift只包了模型训练的步骤,其他推理的还是要与transformer, modelscope联用
- 这篇只跑通了训练部分,训练后的模型怎么用还没摸清楚和跑通
- 终于知道为什么到了推理走不通了,应该去查bert-base-uncased是怎么用的,这个模型就不是文本生成类的虽然也有预测下半句的功能!如果需要gpt那样的效果应该选择使用具备文本生成能力的模型!

-
PS:
会继续更新这一篇直到推理这一步完成