AI:大模型时代?你还不会使用ModelScope?毫无废话,全是干货,一篇教会你快速入门

5,125 阅读9分钟

在使用ModelScope先来简单了解下LLM❓

什么是LLM

LLM(large language model,LLM)大语言模型是在2018年左右出现的一种语言模型,由具有许多参数(通常数十亿个权重或更多)的人工神经网络组成,使用无监督学习对大量未标记语料进行预训练生成通用模型,然后再在不同特定任务下进行微调。

LLM每个单词的释义如下:

  • Large(大型): 表示该模型具有大量的参数、大量的语料、复杂庞大的结构

  • Language(语言): 表示该模型用于NLP任务,可以处理和生成自然语言,如英语、中文等

  • Model(模型): 表示该模型是基于深度学习构建的神经网络模型,一般都是基于Transformer架构

  • LLM的参数规模通常以亿计。如"通义千问2.5-代码-32B-Instruct" 中的 "32B" 表示该模型大约 320 亿个参数

详细点击这里跳转什么是LLM大语言模型?Large Language Model,从量变到质变 - 知乎

我们作为前后端为什么要去学习LLM

  • 端模型时代的到来,如小尺寸模型越来越强,AI手机、AI汽车(Robotaxi)……在未来会越来越普及
  • 提高开发效率,传统开发是输出 -> 编程 -> 输出。这种方式不仅效率低下,而且易出错误,使用LLM大模型驱动开发,使得输入(prompt)-> LLM -> 输出。开发者只需要明确自己的需求,大模型就能自动生成高质量代码和解决方案,极大提高了开发效率,以及开发时的正确性。

ModelScope简介

这里不多概述,查看官方文档即可 概览 · 文档中心https://modelscope.cn/docs/overview

基本使用

这里使用Notebook方式进行讲解,使用Notebook教程文档免费Notebook使用https://www.modelscope.cn/docs/notebooks/free-trial

为什么要使用Notbook?

  • 1.使用ModelScope Notebook进行学习,初学者可避免环境安装错误,使初学者能够快速上手大模型

  • 2.ModelScope Notebook是一款云端机器学习开发IDE工具,为您提供交互式编程环境,适用于不同水平的AI开发者。 通过与阿里云PAI-DSW、弹性加速计算实例EAIS合作,Notebook为用户提供了开箱可用的限时免费算力额度,实现ModelScope模型开发环境与CPU/GPU等多样化计算资源的无缝连接。

Notbook特性

ModelScope Notebook是基于Jupyter Notebook,通过结合云上CPU/GPU计算实例来提供开箱即用的模型开发体验,关于原生Jupyter Notebook的官方功能介绍,请参考 官方文档。在这个基础上,ModelScope的Notebook预置了魔搭模型开发包及算法库,且支持自定义安装第三方库。同时基于不同云算力的Notebook,也有一些不同的产品特性:

功能PAI-DSW NotebookEAIS Notebook
支持GPU
CPU核数及内存8核32G8核32G
网络访问huggingface等外网访问受限github,huggingface等外网访问受限
Root权限默认root账号默认root账号
持久化存储/mnt/workspace/ 目录暂无

存储说明:

  • 免费Notebook环境均提供一定存储空间。当前基于PAI-DSW实例的Notebook,平台提供免费100G的持久化存储,并挂载在默认的  /mnt/workspace 目录下。对于需要持久化保存的数据,请在实例关闭前,确保其保存在/mnt/workspace/下,放置于其他路径下的数据,在实例关闭后会自动清除
  • 您可以通过du -sh /mnt/workspace命令来查看当前免费持久化存储的使用额度,请及时清理不必要文件。
  • 平台提供的免费存储,是为了方便您的使用,不做SLA保障。重要数据请勿依赖免费持久化存储能力,务必自行备份避免丢失。同时如果账号如果长时间(365天以上)无活动,平台可能清除对应账号的持久存储数据
  • EAIS Notebook暂时不支持数据的持久化存储。
  • 若您使用的为付费的DSW或EAIS资源来使用Notebook,可以根据相关云产品说明,自行挂载云存储资源。

基本创建

这里我们通过ModelScope提供的在线云大模型进行讲解 官网链接https://www.modelscope.cn/ 进入后我要注册账号以及和阿里云绑定,随后我们点击模型库,可以发现这里有大量的模型库可以使用,这里我们选择通义千问

image.png 点击Netbook开发,通过ModelScope Notebook使用ModelScope上的模型时,所有的依赖环境都已经预先安装好,可直接使用

image.png 这里推荐使用第一个进行学习,因为免费

image.png

这里任意选择,推荐使用第一个进行学习,因为可以长期使用并且免费 image.png

进入后选择python

image.png

模型下载

ModelScope提供两种方式模型进行下载一种是通过AutoModel方式,另一种是通过pipeline方式

使用AutoModel加载模型

from modelscope import AutoModelForCausalLM, AutoTokenizer 
model_name = "Qwen/Qwen2.5-0.5B-Instruct" 
model = AutoModelForCausalLM.from_pretrained( 
    model_name, 
    torch_dtype="auto",
    device_map="auto" )
tokenizer = AutoTokenizer.from_pretrained(model_name)
代码详细分析

这段代码使用了 modelscope 库来加载一个预训练的语言模型,并将其配置为适合推理的环境。

导入相关模块

from modelscope import AutoModelForCausalLM, AutoTokenizer
  • AutoModelForCausalLM: 这是一个用于加载因果语言模型(Causal Language Model)的自动化类。在这里,模型会根据给定的名称或路径加载一个预训练的模型,通常是用于生成任务(比如文本生成、对话生成等)。
  • AutoTokenizer: 这是一个用于加载与模型对应的预训练分词器(Tokenizer)的自动化类。Tokenizer 负责将文本数据转化为模型可以处理的格式,通常是将文本拆分成 tokens(单词、子词、字符等)。

定义模型名称

model_name = "Qwen/Qwen2.5-0.5B-Instruct"

加载模型

model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype="auto", device_map="auto" )

AutoModelForCausalLM.from_pretrained(...) 这行代码的作用是从指定的 model_name 加载一个预训练的因果语言模型。

  • model_name 指定了要加载的模型名称。
  • torch_dtype="auto":这个参数告诉模型加载时应该自动选择最合适的数据类型(dtype)。这通常意味着自动选择 float16float32,以优化性能或内存使用。
  • device_map="auto":这个参数让库自动决定如何在多个设备(例如 GPU 或 CPU)之间分配模型的参数。它通常会在使用多台 GPU 或在特定硬件上进行优化时自动将模型拆分到合适的设备上。

加载分词器

tokenizer = AutoTokenizer.from_pretrained(model_name)

AutoTokenizer.from_pretrained(model_name):这行代码会加载与模型匹配的预训练分词器。分词器负责将原始的自然语言文本转化为模型可以理解的输入格式(通常是一个整数数组,表示单词或子词的索引)。加载的分词器与模型一一对应,确保输入和输出格式的一致性。

使用ModelScope pipeline加载模型:

from modelscope.pipelines import pipeline 
word_segmentation = pipeline('word-segmentation',model='damo/nlp_structbert_word-segmentation_chinese-base')

代码详细分析

导入模块

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
  • from modelscope.pipelines import pipeline:导入 pipeline 函数,pipelinemodelscope 中用于简化任务执行的接口。它帮助你通过指定任务类型和模型,快速构建一个可以直接使用的模型执行流程。

  • from modelscope.utils.constant import Tasks:从 modelscope.utils.constant 中导入 TasksTasksmodelscope 库中定义的一些常见任务的常量,如文本分类、文本生成、图像分类等。你通过 Tasks 来指定任务类型,简化了任务名称的管理。

创建pipeline对象

semantic_cls = pipeline(Tasks.text_classification, 'damo/nlp_structbert_sentiment-classification_chinese-base')

pipeline(...):这是 modelscope 提供的一个简化接口,可以快速创建并执行特定任务的流水线。这里面接受两个参数

  1. 第一个参数是指定任务类型,比如text_classification就是表示进行文本分类任务
  2. 第二个参数是指定执行任务的预训练模型,比如damo/nlp_structbert_sentiment-classification_chinese-base就是一个预训练的中文情感分类模型

模型推理

pipeline(推荐初学者使用)

推理不同模态多种任务,pipeline是最简单、最快捷的方法。您可以使用开箱即用的pipeline执行跨不同模式的多种任务,下面是一个pipeline完整的运行示例:

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
#第一个参数是特定任务名称,第二个参数是任务执行所要用的模型
semantic_cls = pipeline(Tasks.text_classification,'damo/nlp_structbert_sentiment-classification_chinese-base')
result = semantic_cls(input = '你好')
print(result)

代码详细分析

前三行上面是加载模型,不再重复说明

执行推理

result = semantic_cls(input = '你好') semantic_cls(input='你好')

  • 使用 semantic_cls 对象进行文本分类推理。这里的 input='你好' 是要进行情感分类的文本。
  • input 参数传递给模型后,pipeline 将文本 '你好' 传递给加载的模型,模型会根据输入文本执行推理,判断该文本属于哪一类情感(如正面、负面或中性)。
  • 模型会根据其训练数据和算法对文本进行分析,并给出预测结果。result 会包含模型的输出,通常是分类标签及其置信度值。
  • 最后通过print打印结果 运行结果

image.png

AutoModel

ModelScope兼容了Transformers提供的简单而统一的方法来加载预训练实例和tokenizer。这意味着我们可以使用ModelScope加载AutoModel和AutoTokenizer等类。

import torch
from modelscope import AutoModelForCausalLM, AutoTokenizer

# 模型名称,可根据实际需求替换
model_name = "damo/nlp_structbert_sentiment-classification_chinese-base"

# 加载模型,移除了不支持的device_map='auto'设置,如果是自己电脑上运行
#不移除会报错,并明确指定torch_dtype
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32
)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 设置tokenizer的聊天模板,这里的模板示例是根据常见需求设置的,具体可根据实际模型调整
tokenizer.chat_template = """
<|InnerThoughtBegin|>当前接收到用户需求为:{user_request},需生成合适回复<|InnerThoughtEnd|><|FunctionCallBegin|>[]<|FunctionCallEnd|>
"""

# 定义用户的提示信息
prompt = "请给我介绍一下人工智能的发展现状"
messages = [
    {"role": "system", "content": "你是一个知识渊博的助手。"},
    {"role": "user", "content": prompt}
]

# 应用聊天模板生成文本
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True,
    user_request=prompt
)

# 将文本转换为模型输入格式并移动到模型所在设备
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)

# 生成回复
generated_ids = model.generate(
    **model_inputs,
    max_new_tokens=512
)
generated_ids = [
    output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]

# 解码生成的回复并输出
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)

LLM的局限性

虽然LLM很强大,但是仍有不足,模型训练完成后,内部的知识库不会自动更新,这就会造成当我们遇到答非所问的情况,但是可以通过微调模型解决。