LLM代码实现-Qwen(下载和调用)

基本介绍

Qwen 基础模型已经稳定训练了大规模高质量且多样化的数据,覆盖多语言(当前以中文和英文为主),Qwen 目前有多个版本:1.8B、7B、14B、72B,同时还开源了 Qwen-VL、Qwen-Audio 两款多模态模型。阿里可以算得上是业界良心,是目前唯一一家开源 72B 这个这个量级 Chat 版本模型的公司(智谱开源了 130B 的 GLM 可惜不是 Chat 版本),各模型特点和所需硬件条件如下:

环境配置

首先进入 Qwen 官方的 Github 拉取项目:github.com/QwenLM/Qwen 并安装相应依赖。

python 复制代码
git clone https://github.com/QwenLM/Qwen.git

cd Qwen
pip install -r requirements.txt

模型下载

考虑到不是所有的读者都有足够的算力,本专栏使用 Qwen-1.8B-Chat(非基座模型)作为示例。Qwen 模型的下载方式挺多的,可以选择使用 huggingface 下载模型:

python 复制代码
# 方式一:利用命令行下载
git lfs install
git clone https://huggingface.co/Qwen/Qwen-1_8B-Chat

# 方式二:利用 python 代码下载
from modelscope import snapshot_download  
model_dir = snapshot_download('qwen/Qwen-1_8B-Chat', cache_dir="./model")

国内一般情况下由于网络原因用上述方案可能难以下载,也可以选择借助魔搭社区下载模型。

python 复制代码
# 方式一:利用命令行下载
git lfs install
git clone https://www.modelscope.cn/qwen/Qwen-1_8B-Chat.git

# 方式二:利用 python 代码下载
#模型下载 
from modelscope import snapshot_download 
model_dir = snapshot_download('qwen/Qwen-1_8B-Chat', cache_dir="./model")

模型调用

这是简单的一种调用方式,使用 transformers 库进行调用,可以测试环境配置和模型下载是否正确:

python 复制代码
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfig

# 加载模型和 tokenizer
tokenizer = AutoTokenizer.from_pretrained("./model/Qwen/Qwen-1_8B-Chat", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    "./model/qwen/Qwen-1_8B-Chat",
    device_map="auto",
    trust_remote_code=True
).eval()

# 配置模型参数
model.generation_config = GenerationConfig.from_pretrained("./model/Qwen/Qwen-1_8B-Chat", trust_remote_code=True)

# 获取模型输出并返回历史记录
response, history = model.chat(tokenizer, "你好", history=None)
print(response)

其中 device_map 用于设置调用模型的设备, 可以选择"cpu", "auto", "balanced", "balanced_low_0", "sequential":

python 复制代码
# "auto" 和 "balanced" 将会在所有的 GPU 上平衡切分模型,那么可以计算批尺寸大于 1 的输入
# "balanced_low_0" 会在除了第一个 GPU 上的其它 GPU 上平衡划分模型,并且在第一个 GPU 上占据较少资源。这个选项符合需要在第一个 GPU 上进行额外操作的需求,例如需要在第一个 GPU 执行 generate 函数(迭代过程)。
# "sequential" 按照GPU的顺序分配模型分片,从 GPU 0 开始,直到最后的 GPU(那么最后的 GPU 往往不会被占满,和"balanced_low_0"的区别就是第一个还是最后一个,以及非均衡填充)

# 同时可以利用 accelerate 库的 infer_auto_device_map 函数自己设置每个设备上最大占用多少显存或内存

from accelerate import infer_auto_device_map

device_map = infer_auto_device_map(model, max_memory={0: "10GiB", 1: "10GiB", "cpu": "30GiB"})
print(model.hf_device_map)

同时官方推荐显卡支持 fp16 或 bf16 精度的用户安装 flash-attention 以提高运行效率并降低显存占用:

python 复制代码
git clone https://github.com/Dao-AILab/flash-attention
cd flash-attention && pip install .
# 下方安装可选,安装可能比较缓慢。
# pip install csrc/layer_norm
# 如果flash-attn版本高于2.1.1,下方无需安装。
# pip install csrc/rotary

GenerationConfig 中可以配置多种参数以控制模型输出(也可以不写以调用默认参数):

python 复制代码
# temperature:控制生成文本的多样性。较高的温度值(例如1.0)会使生成的文本更加随机,而较低的温度值(例如0.2)会使生成的文本更加确定性。
# top_k:控制生成文本时,模型会考虑的最高概率的词的数量。较小的top_k值会限制模型只考虑概率最高的几个词,从而增加生成文本的多样性。
# top_p:控制生成文本时,模型会考虑的累积概率的阈值。较小的top_p值会限制模型只考虑累积概率高于阈值的词,从而增加生成文本的多样性。
# repetition_penalty:用于抑制生成文本中重复词语的参数。较大的repetition_penalty值会降低重复词语的概率。
# do_sample:指示模型是否使用采样方法生成文本。当设置为True时,模型会根据概率分布随机选择下一个词语;当设置为False时,模型会根据概率分布选择概率最高的词语。
# pad_token_id:用于填充序列的特殊标记的ID。
# eos_token_id:用于表示输入序列结束的特殊标记的ID。
# min_new_tokens:生成文本时,要求至少生成的新词语数量。
# max_new_tokens:生成文本时,要求最多生成的新词语数量。

model.generation_config = GenerationConfig.from_pretrained(
    temperature=0.8, 
    top_k=5, 
    repetition_penalty=1.2,
    do_sample=True, 
    return_unused_kwargs=True
)

以下实现了一个多轮对话的脚本,可以更方便地进行模型性能测试(输入"clc"后可清空历史聊天记录),同时可以设置系统提示词指定模型行为模式:

python 复制代码
from transformers import AutoModelForCausalLM, AutoTokenizer
import os


class Qwen:
    def __init__(self):
        path = "./model/Qwen/Qwen-1_8B-Chat"

        self.tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True)
        self.model = AutoModelForCausalLM.from_pretrained(
            path,
            device_map="auto",
            trust_remote_code=True
        ).eval()

    def clear_screen(self):
        os.system('clear')
        return [], ""

    def chat_qwen(self, System_Prompt):
        history, history = self.clear_screen()

        while True:
            prompt = input("user:")
            if prompt.lower() == "clc":
                history, history = self.clear_screen()
                continue
            # System Prompts 可以设定模型的行为模式,例如人物设定、语言风格、任务模式、甚至针对具体问题的具体行为。
            response, history = self.model.chat(self.tokenizer, prompt, history=history, system=System_Prompt)
            print("assistant:", response, end="\n\n")


if __name__ == '__main__':
    qwen = Qwen()
    qwen.chat_qwen(System_Prompt="请用外婆的语气和我说话")
相关推荐
测试杂货铺2 分钟前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森7 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
hairenjing11238 分钟前
在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序
android·人工智能·windows·macos·智能手机
小蜗子13 分钟前
Multi‐modal knowledge graph inference via media convergenceand logic rule
人工智能·知识图谱
SpikeKing26 分钟前
LLM - 使用 LLaMA-Factory 微调大模型 环境配置与训练推理 教程 (1)
人工智能·llm·大语言模型·llama·环境配置·llamafactory·训练框架
小码的头发丝、32 分钟前
Django中ListView 和 DetailView类的区别
数据库·python·django
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
黄焖鸡能干四碗1 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
ctrey_1 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习