在使用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 Notebook | EAIS Notebook |
|---|---|---|
| 支持GPU | 是 | 是 |
| CPU核数及内存 | 8核32G | 8核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/ 进入后我要注册账号以及和阿里云绑定,随后我们点击模型库,可以发现这里有大量的模型库可以使用,这里我们选择通义千问
点击Netbook开发,通过ModelScope Notebook使用ModelScope上的模型时,所有的依赖环境都已经预先安装好,可直接使用。
这里推荐使用第一个进行学习,因为免费
这里任意选择,推荐使用第一个进行学习,因为可以长期使用并且免费
进入后选择python
模型下载
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)。这通常意味着自动选择float16或float32,以优化性能或内存使用。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函数,pipeline是modelscope中用于简化任务执行的接口。它帮助你通过指定任务类型和模型,快速构建一个可以直接使用的模型执行流程。 -
from modelscope.utils.constant import Tasks:从modelscope.utils.constant中导入Tasks。Tasks是modelscope库中定义的一些常见任务的常量,如文本分类、文本生成、图像分类等。你通过Tasks来指定任务类型,简化了任务名称的管理。
创建pipeline对象
semantic_cls = pipeline(Tasks.text_classification, 'damo/nlp_structbert_sentiment-classification_chinese-base')
pipeline(...):这是 modelscope 提供的一个简化接口,可以快速创建并执行特定任务的流水线。这里面接受两个参数
- 第一个参数是指定任务类型,比如
text_classification就是表示进行文本分类任务 - 第二个参数是指定执行任务的预训练模型,比如
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打印结果 运行结果
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很强大,但是仍有不足,模型训练完成后,内部的知识库不会自动更新,这就会造成当我们遇到答非所问的情况,但是可以通过微调模型解决。