学习log2|llm学习之Modelscope-Swift训练框架--少代码代码完成训练!

接着modelscope的学习,今天依靠Swift跑通了训练的部分,modelscope平台出了一个Swift框架可以让小白,爱好者非AI专业人士无痛训练大模型,仅需少量代码即可完成。经过测试,发现Swift框架是和huggingface hub出的transformers混搭使用的,可能因为transformers这个库已经包含了基础的内容就没必要再重复造轮子吧(属于是无端猜测)。序列的字节化是通过transformers库完成的,而训练参数之类繁杂的代码则是被Swift框架封装了,能够达到直观训练的目的。

0. Swift框架是什么

官方的解释:Swift是一个提供LLM模型轻量级训练和推理的开源框架。
用户层面的解释:无痛训练的大模型的包。

1. Swift训练模型的流程

  • 跑了一下官方的代码,加上之前学习了吴恩达的课程发现过程都差不多的,本人更喜欢吴恩达的课程代码,因为学了这个可以更加明白原理(稍后放上笔记)

1. 数据加载

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')))

Bert-base-uncased的模型官方用法

注意事项

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

参考
ModelScope Swift官方手册

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容