一、Qwen2.5-0.5B

1.1、解释

        Qwen2.5-0.5B 是由阿里云的 Qwen 团队开发的大型语言模型系列 Qwen2.5 中的一员。其中,0.5B 代表它拥有 0.5 亿(或 5 亿)个参数,是该系列中较小的模型之一。

1.2、主要特点

  1. 参数量小,适合轻量级部署: 0.5B 的参数量使得 Qwen2.5-0.5B 能够在资源受限的设备上运行,例如手机、笔记本电脑,甚至可以通过量化技术在更低的配置下运行。

  2. Transformer 架构: 它基于先进的 Transformer 架构,并融合了 RoPE (Rotary Position Embeddings)、SwiGLU 激活函数、RMSNorm 归一化以及 Attention QKV bias 等特性,旨在提高模型的效率和准确性。

  3. 多语言支持: Qwen2.5 系列模型支持超过 29 种语言,包括中文、英文、法语、西班牙语、葡萄牙语、德语、意大利语、俄语、日语、韩语、越南语、泰语、阿拉伯语等,使其在全球范围内具有广泛的应用潜力。

  4. 长上下文支持: 尽管是小模型,Qwen2.5-0.5B-Instruct 版本也能支持高达 128K (128,000) token 的上下文长度,并能生成高达 8K (8,000) token 的文本。这意味着它能处理和理解较长的文本输入,并生成连贯的长篇内容。

  5. 改进的知识和能力: 相比之前的 Qwen2 模型,Qwen2.5 在知识量上有了显著提升,并且在编码和数学方面的能力也得到了大幅增强。这得益于其在这些领域中使用了专门的专家模型进行训练。

  6. 指令遵循和结构化输出: 在指令遵循、生成长文本、理解结构化数据(如表格)以及生成结构化输出(尤其是 JSON 格式)方面都有显著改进。

  7. 对系统提示的适应性更强: Qwen2.5 模型对多样化的系统提示更具弹性,有助于更好地实现角色扮演和聊天机器人中的条件设置。

1.3、应用场景

Qwen2.5-0.5B 及其 Instruct(指令微调)版本适用于多种应用场景,尤其是在需要轻量级、高效运行的场合:

  • 移动设备应用: 由于其较小的模型尺寸,非常适合在手机上运行,实现本地的 AI 功能。

  • 边缘计算: 在需要低延迟和离线能力的边缘设备上,Qwen2.5-0.5B 可以提供快速响应。

  • 智能客服与聊天机器人: 能够理解用户意图并生成流畅的回复,适用于构建轻量级的智能客服或聊天机器人。

  • 代码辅助: 增强的编码能力使其可以用于代码生成、解释和调试,成为个人编程助手。

  • 多语言翻译和内容生成: 其多语言支持使其在翻译、跨语言内容创作等方面具有优势。

  • 教育辅助: 用于问答系统、文本摘要等,辅助学习和知识获取。

二、部署

2.1、下载Qwen模型

        为了加快下载速度,我们使用魔搭社区的下载方式

pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple

通义千问2.5-0.5B-Instruct · 模型库

from modelscope.hub.snapshot_download import snapshot_download
llm_model_dir = snapshot_download('Qwen/Qwen2.5-0.5B-Instruct',cache_dir='models')

2.2、模型推理 

        transformers 是一个非常流行的库,由 Hugging Face 提供,用于处理自然语言处 理(NLP)任务。这个库中包含了许多预训练模型以及相应的工具,可以用来进行文 本生成、情感分析、翻译等多种任务。

        代码中需要 AutoModelForCausalLM 和 AutoTokenizer ,它们是transformers库中的两个重要组件,它们的作用如下:

        AutoTokenizer: 这是一个自动化的分词器类,可以根据指定的预训练模型自动选择合适的分 词器。分词器的主要功能是将原始文本转换为模型可以理解的形式,比如将 句子分解成单词或子词单元,并将这些单元映射到对应的数字ID(这个过程 通常称为“tokenization”)。不同的模型可能需要不同类型的分词策略,而 AutoTokenizer 能够根据模型名称自动加载正确的分词器配置。

         AutoModelForCausalLM: 这个类代表了一个用于因果语言建模(即给定前文预测下一个词的任务)的 自动模型。它能够根据指定的模型名称自动加载一个适合做语言生成任务的 预训练模型。这类模型常用于文本生成、对话系统等场景。

通常流程如下:

        首先,使用 AutoTokenizer 加载或创建一个分词器实例,准备对输入文本进行 处理。

        然后,使用 AutoModelForCausalLM 加载一个预训练的语言模型。

        接下来,利用分词器将原始文本转换为模型输入所需的格式。

        最后,将处理后的数据输入到模型中,执行特定的任务,如文本生成。

 导入库

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

检测是否使用cuda 

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print("模型会运行在:", device)

加载模型

model = AutoModelForCausalLM.from_pretrained("./models/Qwen/Qwen2___5-0___5B-Instruct").to(device)

加载分词器

tokenizer = AutoTokenizer.from_pretrained("./models/Qwen/Qwen2___5-0___5B-Instruct")

构建对话历史,通常包括系统角色和用户角色的消息

messages = [
    {'role': 'system', 'content': '你是一个有用的助手'}, # 系统消息,定义助手的角色
    {'role': 'user', 'content': prompt} # 用户消息,包含用户输入的提示
]

将对话历史转换为模型可以理解的文本格式

 tokenize=False 表示不直接分词,而是返回字符串
 add_generation_prompt=True 表示在末尾添加一个特殊的 token,指示模型开始生成回复

text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)
<|im_start|>system
你是一个有用的助手<|im_end|>
<|im_start|>user
写一个故事<|im_end|>
<|im_start|>assistant

将文本分词并转换为 PyTorch 张量,然后移动到指定设备

model_inputs = tokenizer([text], return_tensors='pt').to(device)
{'input_ids': tensor([[151644,   8948,    198,  56568, 101909, 115405, 110498, 151645,    198,
         151644,    872,    198,  61443,  46944, 101108, 151645,    198, 151644,
          77091,    198]], device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]],
       device='cuda:0')}

使用模型生成回复

generated_ids = model.generate(
    model_inputs.input_ids, # 输入给模型的 token ID
    max_new_tokens=512, # 限制生成的新 token 的最大数量
    # 可以添加其他生成参数,例如:
    # do_sample=True, # 是否使用采样策略进行生成(而非贪婪搜索)
    # temperature=0.7, # 采样温度,影响生成文本的随机性
    # top_k=50, # 每次选择最高概率的 k 个 token
    # top_p=0.95, # 累积概率达到 p 时停止选择
    # repetition_penalty=1.2, # 对重复的 token 进行惩罚
    # eos_token_id=tokenizer.eos_token_id, # 结束生成标志的 token ID
)

取模型生成的新 token ID

generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]

将生成的 token ID 解码回可读的文本

response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
好的,我将为你创作一个温馨的故事情节。

在一个遥远的小镇上,有一个名叫艾米丽的小女孩。她生活在一个充满魔法和奇迹的世界里,这里的人们拥有着超凡的能力和智慧。然而,艾米丽并不满足于这样的生活,她渴望探索这个神秘的世界并找到自己的位置。

一天,艾米丽在森林中探险时,意外地发现了一个古老的图书馆。这个图书馆隐藏在一片密林之中,只有经过重重考验才能打开的门才能进入。艾米丽决定踏上寻找图书馆之旅,并与勇敢的冒险家们一起探索未知的领域。

随着旅程的深入,艾米丽遇到了各种各样的挑战,包括迷雾、恶龙和邪恶的巫师。但正是这些困难,让她变得更加坚韧和勇敢。最终,在图书馆主人的帮助下,艾米丽找到了开启门的方法,并踏上了通往另一个世界的旅途。

旅途中,艾米丽遇到了许多新朋友,他们都是来自不同世界的人。通过他们的帮助,艾米丽不仅找到了自己的位置,还学会了如何更好地理解这个世界和自己。她的故事成为了小镇上的传奇,人们开始相信艾米丽是那个能够改变命运的存在。

这个故事告诉我们,无论我们身处何方,只要我们愿意探索、勇敢面对,就一定能在世界上找到属于自己的位置。

完整代码

import torch # 导入 PyTorch 库,用于张量操作和 GPU 加速
from transformers import AutoModelForCausalLM, AutoTokenizer # 从 transformers 库导入用于加载模型和分词器的类

# 检查是否有可用的 CUDA (NVIDIA GPU),否则使用 CPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")


# 从预训练路径加载因果语言模型,并将其移动到指定设备 (CPU 或 GPU)
model = AutoModelForCausalLM.from_pretrained("./models/Qwen/Qwen2___5-0___5B-Instruct").to(device)

# 从预训练路径加载分词器
tokenizer = AutoTokenizer.from_pretrained("./models/Qwen/Qwen2___5-0___5B-Instruct")

prompt = "写一个故事" # 定义用户输入的提示

# 构建对话历史,通常包括系统角色和用户角色的消息
messages = [
    {'role': 'system', 'content': '你是一个有用的助手'}, # 系统消息,定义助手的角色
    {'role': 'user', 'content': prompt} # 用户消息,包含用户输入的提示
]

# 将对话历史转换为模型可以理解的文本格式
# tokenize=False 表示不直接分词,而是返回字符串
# add_generation_prompt=True 表示在末尾添加一个特殊的 token,指示模型开始生成回复
text = tokenizer.apply_chat_template(
    messages,
    tokenize=False,
    add_generation_prompt=True
)

# 将文本分词并转换为 PyTorch 张量,然后移动到指定设备
model_inputs = tokenizer([text], return_tensors='pt').to(device)

# 使用模型生成回复
generated_ids = model.generate(
    model_inputs.input_ids, # 输入给模型的 token ID
    max_new_tokens=512, # 限制生成的新 token 的最大数量
    # 可以添加其他生成参数,例如:
    # do_sample=True, # 是否使用采样策略进行生成(而非贪婪搜索)
    # temperature=0.7, # 采样温度,影响生成文本的随机性
    # top_k=50, # 每次选择最高概率的 k 个 token
    # top_p=0.95, # 累积概率达到 p 时停止选择
    # repetition_penalty=1.2, # 对重复的 token 进行惩罚
    # eos_token_id=tokenizer.eos_token_id, # 结束生成标志的 token ID
)

# 提取模型生成的新 token ID
# generated_ids 包含完整的输入和生成部分,这里我们只截取生成的部分
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]

# 将生成的 token ID 解码回可读的文本
# skip_special_tokens=True 会跳过像 <bos>, <eos>, <pad> 这样的特殊 token
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response) # 打印模型生成的回复

 在遇到显存不够的情况下,如果有多张显卡,可以使用

model = torch.nn.DataParallel(model, [0, 1])

再修改

generated_ids = model.module.generate(
    model_inputs.input_ids,
    max_new_tokens=512
)
Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐