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="请用外婆的语气和我说话")
相关推荐
nudt_qxx4 分钟前
讲透Transformer(三):Transformer 注意力机制详解与Qwen/DeepSeek近期改进
人工智能·深度学习·transformer
不吃橘子的橘猫6 分钟前
《集成电路设计》复习资料2(设计基础与方法)
学习·算法·fpga开发·集成电路·仿真·半导体
绒绒毛毛雨7 分钟前
多目标强化学习-英伟达:GDPO
人工智能·深度学习·机器学习
yao124973647317 分钟前
【无标题】
python·synergy·deskflow·键鼠共享·hyprland·niri
halen33319 分钟前
How Masters Tool Fixed My Digital Disaster
算法·均值算法·推荐算法
systeminof31 分钟前
亚马逊转向自研路线,AI生态控制权之争升温
人工智能
Ray Liang36 分钟前
EvoMap 硬刚 OpenClaw!从基因胶囊到仿生大脑,AI 的尽头果然是生物学
人工智能·ai助手·openclaw·mindx
workflower37 分钟前
原子需求的属性
python·测试用例·需求分析·软件需求
说实话起个名字真难啊42 分钟前
彻底解决openclaw的tokens焦虑
人工智能·ai·openclaw
新缸中之脑1 小时前
从零实现AI代理的长期记忆
数据库·人工智能