社区供稿 | 本地部署通义千问大模型做RAG验证

本文涉及的产品
模型训练 PAI-DLC,100CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 这篇文章中,我们通过将模搭社区开源的大模型部署到本地,并实现简单的对话和RAG。

背景

在之前我们通过使用千问的公网在线API,实现了对大模型的调用。但出于对数据安全与隐私保护、网络稳定性、定制化需求、知识产权保护、自主可控性、业务连续性以及成本效益等多方面的考虑,在有些场景下,需要使用一些已经训练好的基模进行本地化部署。通过本地化部署,可以更好地满足自身特定需求,确保业务的合法、稳定、连续运行,并提高对模型的掌控能力。

这篇文章中,我们通过将模搭社区开源的大模型部署到本地,并实现简单的对话和RAG。

开发框架介绍

ModelScope Library

ModelScope Library是魔搭社区提供的一个能够快速、方便的使用社区提供的各类模型的Python library,其中包含了ModelScope官方模型的实现,以及使用这些模型进行推理,finetune等任务所需的数据预处理,后处理,效果评估等功能相关的代码,同时也提供了简单易用的API,以及丰富的使用样例。通过调用library,用户可以只写短短的几行代码,就可以完成模型的推理、训练和评估等任务,也可以在此基础上快速进行二次开发,实现自己的创新想法。本文中我们使用这个库进行模型的加载。

ModelScope Library支持的模型不光局限于huggingface的transformers架构类的模型,并且社区提供大量的中文大语言模型,更适合我们在国内下载,也方便学习及使用。

环境准备

1. 环境检查

本地实验环境:

系统:Win11

显卡:1070(8G显存)

首先更新显卡驱动到最新版本,可以去官网下载或者直接在NVIDIA Geforce Experience中直接更新驱动到最新版本,新版本的驱动向下兼容更多版本的CUDA。

2602853f-d372-40bd-93c1-8d0cfa83037f[1].png

查看显卡驱动支持的CUDA的最高版本,小于等于此版本的CUDA均可以使用。CMD或powershell中执行如下命令:

nvidia-smi

efd1e479-110f-4f22-89b1-94af213fb38c[1].png

https://pytorch.org/查看当前最新版PyTorch支持最低Python版本为3.8,支持CUDA的11.8和12.1版本,后面我们选择安装12.1版本。

bec05a5a-5556-43cb-ab28-a73e3c74463f[1].png

最终生成的命令可以拷贝出来,下文需要使用。

2. 安装CUDA 12.1(可选)

此步骤可选,不安装的话后面Torch会自动安装

下载地址:

https://developer.nvidia.com/cuda-12-1-1-download-archive

04c4e130-6ccf-4ea4-bb3e-671dc13f6689[1].png

下载完成后直接安装即可,如果已经安装需要先卸载后再装。

3. 安装conda

conda可以用来管理Python环境,后面我们会使用conda创建一个Python3.10的运行环境。

下载地址:

https://www.anaconda.com/download

安装完成后,为了能在命令行中使用,需要将conda的相关目录加入环境变量,例如安装在D:\developer\anaconda,则需要将以下目录添加到PATH中:

D:\developer\anaconda
D:\developer\anaconda\Scripts
D:\developer\anaconda\Library\bin
D:\developer\anaconda\Library\mingw-w64\bin

打开powershell,执行conda init初始化conda的powershell和cmd环境,linux下会初始化bash环境,初始化后方便进入conda创建的Python环境。

4. 使用conda创建PyTorch环境

我们使用conda创建一个Python版本为3.10的Python运行环境,在命令行中执行如下命令:

conda create -n pytorch python=3.10
conda activate pytorch

使用上文中安装PyTorch的命令安装PyTorch

conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

5. 下载模型

我们可以去模搭社区获取模型,国内的地址,下载速度快,不需要魔法可以直接访问。

模型库地址:https://modelscope.cn/models

这里使用Qwen1.5-0.5B-Chat这个对话模型进行体验,模型较小,占用内存少,生成速度快。

模型地址:

https://modelscope.cn/models/qwen/Qwen1.5-0.5B-Chat/summary

0143863c-3abc-44d3-9891-d80159005e51[1].png

点击模型文件 -> 下载模型,可支持两种下载方式:Sdk和Git

1d80d77d-a81f-4690-b1fe-6386f15db57d[1].png

我们通过git的方式将模型文件下载到本地

mkdir Qwen && cd Qwen
git clone https://www.modelscope.cn/qwen/Qwen1.5-0.5B-Chat.git
cd ..

加载模型

1. 模型功能验证

可以使用modelscope Library加载模型,使用方法与transformers相同,使用AutoModelForCausalLM.from_pretrained方法和AutoTokenizer.from_pretrained从本地文件中加载,如果路径不存在,这两个方法会自动到modelscope下载模型文件。

需要先安装modelscope库:

pip install modelscope transformers

使用量化模型的话需要安装以下库:

pip install optimum auto-gptq

创建一个Python文件,放到与上文Qwen文件夹同级的目录中,内容如下:

from threading import Thread
from modelscope import (AutoModelForCausalLM, AutoTokenizer)
from transformers import TextIteratorStreamer
device = "cuda"  # 将模型加载到哪个硬件,此处为GPU
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen1.5-0.5B-Chat", # 模型文件夹路径
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-0.5B-Chat")
while True:
    user_input = input("请输入问题(q退出):")
    if user_input.lower() == "q":
        print("exit")
        break
    try:
        messages = [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": user_input}
        ]
        text = tokenizer.apply_chat_template(
            messages,
            tokenize=False,
            add_generation_prompt=False
        )
        inputs = tokenizer([text], return_tensors="pt").to(device)
        streamer = TextIteratorStreamer(tokenizer)
        generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=512)
        thread = Thread(target=model.generate, kwargs=generation_kwargs)
        thread.start()
        generated_text = ""
        count = 0
        for new_text in streamer:
            generated_text += new_text
            print(new_text, end="", flush=True)
        print()
    except Exception as e:
        print(f"出错了:{str(e)}")

上面的代码首先从本地模型文件夹中加载了模型和分词器,然后我们在一个循环中接收用户输入,并将输入处理后通过大模型进行内容生成。我们可以通过python运行上面的文件,运行后,就可以测试了,就测试运行效果如下:

06a95b4f-9996-4aef-973c-a282f4922bce[1].png

2. LangChain加载本地模型

到目前为止,我们已经在本地跑起来了一个千问0.5B大语言模型,接下来需要让langchain能够加载这个本地模型。

如果要用langchain加载模型,我们需要继承langchain.llms.base.LLM 类,并且重写_llm_type, _call方法,因为我们需要支持流式输出,就需要重写_stream方法。可参考langchain的官方文档:Custom LLM | 🦜️🔗 LangChain

下面是这个类的代码:

from abc import ABC
from threading import Thread
from typing import Any, List, Mapping, Optional, Iterator
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.llms.base import LLM
from langchain_core.outputs import GenerationChunk
from modelscope import AutoModelForCausalLM, AutoTokenizer
from transformers import TextIteratorStreamer
device = "cuda"  # the device to load the model onto
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen1.5-0.5B-Chat",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen1.5-0.5B-Chat")
class QwenLocalLLM(LLM, ABC):
    max_token: int = 10000
    temperature: float = 0.01
    top_p = 0.9
    def __init__(self):
        super().__init__()
    @property
    def _llm_type(self) -> str:
        return "Qwen"
    def _call(
            self,
            prompt: str,
            stop: Optional[List[str]] = None,
            run_manager: Optional[CallbackManagerForLLMRun] = None,
            **kwargs: Any
    ) -> str:
        messages = [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": prompt}
        ]
        text = tokenizer.apply_chat_template(
            messages,
            tokenize=False,
            add_generation_prompt=True
        )
        model_inputs = tokenizer([text], return_tensors="pt").to(device)
        generated_ids = model.generate(
            model_inputs.input_ids,
            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]
        return response
    @property
    def _identifying_params(self) -> Mapping[str, Any]:
        """Get the identifying parameters."""
        return {"max_token": self.max_token,
                "temperature": self.temperature,
                "top_p": self.top_p,
                "history_len": self.history_len}
    def _stream(
            self,
            prompt: str,
            stop: Optional[List[str]] = None,
            run_manager: Optional[CallbackManagerForLLMRun] = None,
            **kwargs: Any,
    ) -> Iterator[GenerationChunk]:
        try:
            messages = [
                {"role": "system", "content": "You are a helpful assistant."},
                {"role": "user", "content": prompt}
            ]
            text = tokenizer.apply_chat_template(
                messages,
                tokenize=False,
                add_generation_prompt=False
            )
            inputs = tokenizer([text], return_tensors="pt").to(device)
            streamer = TextIteratorStreamer(tokenizer)
            generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=512)
            thread = Thread(target=model.generate, kwargs=generation_kwargs)
            thread.start()
            generated_text = ""
            for new_text in streamer:
                generated_text += new_text
                print(new_text, end="", flush=True)
                yield GenerationChunk(
                    text=new_text
                )
            print()
        except Exception as e:
            print(f"出错了:{str(e)}")
            yield GenerationChunk(
                text=f"生成失败: {str(e)}"
            )

最后修改上一篇文章中的生成方法,将初始化千问模型的代码替换为上面的实现类:

# 替换前
model = Tongyi()
model.model_name = "qwen-max"
# 替换后
model = QwenLocalLLM()

效果展示

更换之前:

a321e8c9-e1c2-4a93-959d-b6017c125d9b[1].png

企业微信截图_17138386684085.png

生成结果:

离线包更新的原理涉及以下几个方面:

1. **离线包结构**:离线包通常是一个包含前端资源的`.zip`包,这些资源可以是HTML、CSS、JavaScript文件或者图片等。这些资源被组织在一起,以便客户端能够下载并离线使用。
2. **离线包类型**:可能有不同类型的离线包,比如全量包和增量包。全量包包含所有更新的资源,而增量包只包含与旧版本相比发生变化的资源。
3. **渲染过程**:当客户端应用启动或用户触发更新时,会通过特定的RPC调用获取最新的离线包信息。然后,客户端会下载这个包,并将其解压缩到本地的沙盒目录。如果配置了验签,客户端还会验证包的完整性。一旦包被成功解压和验证,客户端会使用新的资源来渲染页面。
4. **更新流程**:更新流程包括构建前端`.zip`包,在线生成`.amr`包(可能是处理签名和版本信息的打包格式),然后通过发布平台将包推送给客户端。客户端在接收到更新信息后,会下载并应用新的离线包。
5. **检查和调试**:如果客户端无法加载新包,可以通过检查RPC返回结果、确认加载的离线包信息、检查沙盒目录下的解压情况、验证签名以及使用Safari调试H5页面来排查问题。
6. **客户端范围**:在控制台上传新版本离线包时,需要指定支持的客户端版本范围,只有在这个范围内的客户端才能接收并更新离线包。
7. **用户交互**:在应用中,用户触发更新后,会收到提示,更新完成后可以访问使用新离线包的页面。
详细原理可以参考[离线包简介](/document_detail/59594.html#topic-2125626)。

耗时15秒多,而且按要求生成了Markdown格式的文本。

更换成本地Qwen-0.5B模型:

企业微信截图_17138386777627.png

企业微信截图_17138386845963.png

生成结果:

离线包更新的原理是这样的:
1. 首先,您需要安装离线包相关的配置文件。
2. 然后,您可以将离线包添加到应用的缓存或数据库中,以便下次下载使用。
3. 一旦离线包添加到缓存或数据库中,它将在后续请求中的 `<head>` 响应头中包含一个 `Content-Disposition` 属性,指定要下载的离线包的类型和URL,以及其离线包大小。
4. 然后,服务器会在适当的时候发送一个响应头,其中包含了离线包的状态码(如 `200 OK`)和一些相关信息,例如离线包的实际URL。
5. 最后,客户端可以从响应头中获取离线包的内容,并进行相应的操作。
此外,离线包还包含一些额外的信息,例如离线包的完整路径、离线包的版本号等,这些信息可以用于维护离线包的历史记录和调试。

生成内容长度仅为上面的一半不到,耗时也不到一半,但内容的正确性就一言难尽了。

对比后可以看到,prompt相同的情况下,Qwen1.5-0.5B-Chat因为模型较小,生成速度较快,但生成内容的质量相比在线的qwen-max、qwen-plus这些还是相差甚远。

当前文章仅提供本地化部署的思路,如果需要达成更好的效果,则需要使用qwen系列更大的模型,例如Qwen1.5-72B-Chat,而且要更高配置的硬件支持。

后续方向

私有化部署大模型花费的精力很多,不过大模型私有化部署也有一些好处,比如:

数据安全:能够更好地保护企业的数据隐私和安全。

定制化:可以根据企业的具体需求进行定制和优化。

掌控权:企业对模型具有更大的掌控权,可以进行灵活的管理和调整。

效率提升:可针对企业特定业务流程进行优化,提高工作效率。

稳定性:减少对外部网络和服务的依赖,提高系统的稳定性。

合规性:有助于满足企业在数据隐私和安全方面的合规要求。

品牌建设:打造具有企业自身特色的人工智能解决方案,提升品牌形象。

资源优化:根据企业的实际情况进行资源分配和优化,避免不必要的浪费。

可根据企业自身需求进行选择,后续我们会继续学习探索。

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
9天前
|
人工智能 负载均衡 数据可视化
10分钟上手全球开源模型冠军 Qwen3
阿里通义千问Qwen3在最新全球AI基准测试中智能水平位列全球前五,开源第一,且成本优势显著,推理成本仅为DeepSeek-R1的1/3、Claude 3.7的1/20。Qwen3支持119种语言,具备强大的代码和数学能力,同时提供思考与非思考两种模式无缝切换,适合复杂与简单任务。通过阿里云百炼平台,用户可在10分钟内快速搭建Qwen3模型服务,结合Cherry Studio客户端实现便捷交互。本文详细介绍了Qwen3的部署、体验及工具调用能力,帮助用户轻松上手。
311 68
|
10天前
|
数据可视化 API Swift
全模态图像模型Nexus-Gen对齐GPT-4o!同时搞定,数据、训练框架、模型全面开源
OpenAI GPT-4o发布强大图片生成能力后,业界对大模型生图能力的探索向全模态方向倾斜,训练全模态模型成研发重点。
111 17
|
5天前
|
人工智能 文件存储 数据中心
Ollama部署本地大模型并通过Infortress APP远程访问保姆级教程
本文介绍如何快速上手本地大模型部署工具Ollama及AI远程访问工具Infortress。通过Ollama,开发者可轻松部署如Llama、Deepseek等主流开源模型,仅需几行命令即可完成安装与运行。结合Infortress,用户能实现对本地大模型的远程访问,支持多设备无缝对接,同时提供便捷的模型切换与知识库管理功能。Infortress更兼具NAS软件特性,成为个人AI数据中心的理想选择。
|
11天前
|
人工智能 Linux iOS开发
本地部署大模型DeepSeek并通过Infortress App远程访问
本地部署DeepSeek大模型后,如何在外网用手机随时随地访问?无需复杂设置,通过Infortress App即可轻松实现!只需三步:安装Infortress服务端、一键部署DeepSeek大模型、安装手机/电脑客户端。Infortress支持纯图形化操作,适合新手,还自带内网穿透功能,跨网络访问无忧。让本地AI随身携带,数据掌控在手,随时随地使用!
本地部署大模型DeepSeek并通过Infortress App远程访问
|
12天前
|
机器学习/深度学习 人工智能 监控
实战 | Qwen3大模型微调入门实战(完整代码)
Qwen3是阿里通义实验室最近开源的大语言模型,发布时便登顶了开源LLM榜单第一名。同时,Qwen系列模型也超越LLaMA,成为了开源模型社区中最受欢迎的开源LLM。
587 23
|
1天前
|
机器学习/深度学习 人工智能 算法
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
该研究系统梳理了大型多模态推理模型(LMRMs)的技术发展,从早期模块化架构到统一的语言中心框架,提出原生LMRMs(N-LMRMs)的前沿概念。论文划分三个技术演进阶段及一个前瞻性范式,深入探讨关键挑战与评估基准,为构建复杂动态环境中的稳健AI系统提供理论框架。未来方向聚焦全模态泛化、深度推理与智能体行为,推动跨模态融合与自主交互能力的发展。
26 13
大型多模态推理模型技术演进综述:从模块化架构到原生推理能力的综合分析
|
2天前
|
人工智能 自然语言处理 语音技术
全模态通义千问Qwen2.5-Omni大模型开源,7B尺寸实现全球最强性能
Qwen2.5-Omni采用“Thinker-Talker”双核架构,Thinker负责多模态输入处理,Talker实现流式语音合成,二者无缝协作。该模型在多模态任务OmniBench中达到SOTA表现,并在多个单模态领域超越同类模型。作为通义系列首个端到端全模态大模型,Qwen2.5-Omni支持文本、图像、音频和视频等多种输入输出形式,具备情绪识别与自然反馈能力。现已开源,开发者可通过多个平台免费体验和下载。
|
2天前
|
人工智能 编解码 搜索推荐
通义万相新模型开源,首尾帧图一键生成特效视频!
通义万相首尾帧生视频14B模型正式开源,作为首个百亿级参数规模的开源模型,可依据用户提供的开始与结束图片生成720p高清衔接视频,满足延时摄影、变身等定制化需求。用户上传两张图片或输入提示词即可完成复杂视频生成任务,支持运镜控制和特效变化。该模型基于Wan2.1架构改进,训练数据专门构建,确保高分辨率和流畅性。
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
通义千问推理模型QwQ-32B开源,更小尺寸、更强性能
阿里云发布并开源全新推理模型通义千问QwQ-32B,通过大规模强化学习,在数学、代码及通用能力上实现质的飞跃,性能比肩DeepSeek-R1。该模型大幅降低部署成本,支持消费级显卡本地部署,并集成智能体Agent相关能力。阿里云采用Apache2.0协议全球开源,用户可通过通义APP免费体验。此外,通义团队已开源200多款模型,覆盖全模态和全尺寸。
|
6天前
#我用Qwen3做了英语老师玛丽# 、#阿里云百炼#,@通义大模型
通过Qwen3创建了名为“玛丽”的英语老师智能体,具备解决学生英语问题的多种功能。她能用英语描述天气、翻译古诗词、撰写英语作文,还帮助了解外国文化、饮食与风俗习惯。相比以往版本更易使用,体验更佳。已完成功能设计与发布流程,感兴趣者可尝试使用。
51 12

热门文章

最新文章