DataWhale AI 夏令营 第四期 大模型应用开发 Task1 大模型部署应用:搭建智能编辑助手

       这里展现大模型部署应用:搭建智能编辑助手的环境搭建与搭建baseline核心代码的解释。

一、环境部署与Demo运行

       1.1、免费GPU资源

               这里简要介绍两种方法:阿里云的PAI-DSW试用和魔搭的PAI-DSW方式

               方法一:阿里云的PAI-DSW试用, 链接:阿里云免费试用 - 阿里云,阿里云新用户注册并实名认证后可领取 5000算力时,有效期3个月,在创建GPU实例时以“计算时”抵扣。

                             在阿里云开通试用后,魔搭社区新用户注册后需绑定阿里云账号,并到魔搭社区授权链接:https://www.modelscope.cn/my/mynotebook/authorization 

                     

                              如果阿里云PAI-DSW试用试用已过期,会显示“¥”购买,

                             为避免无意欠费则可采用方法二。

                方法二:魔搭的PAI-DSW                            

                        在魔搭社区的个人空间——我的notebook——魔搭平台免费实例——PAI-DSW——方式二GPU环境——启动——打开notebook

                注意:这里不能选择阿里云弹性加速计算EAIS下的方式二GPU环境,否则后续搭建的应用无法正常打开。

        1.2、Demo搭建

                在notebook中打开终端,依次输入以下代码:

# 配置环境
git lfs install
git clone https://www.modelscope.cn/datasets/Datawhale/AICamp_yuan_baseline.git

# 安装包
pip install streamlit==1.24.0

# 运行Demo
streamlit run AICamp_yuan_baseline/Task\ 1:零基础玩转源大模型/web_demo_2b.py --server.address 127.0.0.1 --server.port 6006

                Bash就会出现以下结果:

                点击该URL网址即可进入智能编辑助手网页

        1.3、问题出现与解决

               

                但我起初实践时发现打不开这个网页,总是被拒绝访问,多次刷新页面,更换了浏览器,关闭实例重新打开重跑程序仍然打不开,求助学习群,有同学分享了127.0.0.1 是一个特殊的 IPv4 地址,保留用于主机自身的通信,不会经过任何物理网络接口。有同学分享了自己在控制面板修改浏览器设置https://www.cnblogs.com/-csdn/p/12378170.html。感谢两位同学的分享,但我尝试后问题仍没有解决。

                最后在学习群中的QA链接中找到了助教老师们的解答:“如果是用魔搭的免费GPU,需要选择PAI-DSW方式,而不是阿里云弹性加速计算EAIS,选择PAI-DSW方式还不行,尝试更换6006端口号。”切换后很顺利的打开了网页,并进行对话。

                在Bash端也是运行正常

二、baseline方案设计

         2.1、概要设计

                baseline基于源大模型的编程能力来解决用户的问题,主要包含一个Streamlit开发的客户端,以及一个部署好浪潮源大模型的服务端。客户端接收到用户请求后,首先进行交互历史拼接,然后输入到服务端的浪潮源大模型,得到模型输出结果后,返回给客户端,用于回复用户的问题。

         

        2.2、详细设计 

三、baseline代码及解读

        3.1、baseline核心部分完整代码

# 导入所需的库
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
import streamlit as st

# 创建一个标题和一个副标题
st.title("💬 Yuan2.0 智能编程助手")

# 源大模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('IEITYuan/Yuan2-2B-Mars-hf', cache_dir='./')

# 定义模型路径
path = './IEITYuan/Yuan2-2B-Mars-hf'

# 定义模型数据类型
torch_dtype = torch.bfloat16 # A10
# torch_dtype = torch.float16 # P100

# 定义一个函数,用于获取模型和tokenizer
@st.cache_resource
def get_model():
    print("Creat tokenizer...")
    tokenizer = AutoTokenizer.from_pretrained(path, add_eos_token=False, add_bos_token=False, eos_token='<eod>')
    tokenizer.add_tokens(['<sep>', '<pad>', '<mask>', '<predict>', '<FIM_SUFFIX>', '<FIM_PREFIX>', '<FIM_MIDDLE>','<commit_before>','<commit_msg>','<commit_after>','<jupyter_start>','<jupyter_text>','<jupyter_code>','<jupyter_output>','<empty_output>'], special_tokens=True)

    print("Creat model...")
    model = AutoModelForCausalLM.from_pretrained(path, torch_dtype=torch_dtype, trust_remote_code=True).cuda()

    print("Done.")
    return tokenizer, model

# 加载model和tokenizer
tokenizer, model = get_model()

# 初次运行时,session_state中没有"messages",需要创建一个空列表
if "messages" not in st.session_state:
    st.session_state["messages"] = []

# 每次对话时,都需要遍历session_state中的所有消息,并显示在聊天界面上
for msg in st.session_state.messages:
    st.chat_message(msg["role"]).write(msg["content"])

# 如果用户在聊天输入框中输入了内容,则执行以下操作
if prompt := st.chat_input():
    # 将用户的输入添加到session_state中的messages列表中
    st.session_state.messages.append({"role": "user", "content": prompt})

    # 在聊天界面上显示用户的输入
    st.chat_message("user").write(prompt)

    # 调用模型
    prompt = "<n>".join(msg["content"] for msg in st.session_state.messages) + "<sep>" # 拼接对话历史
    inputs = tokenizer(prompt, return_tensors="pt")["input_ids"].cuda()
    outputs = model.generate(inputs, do_sample=False, max_length=1024) # 设置解码方式和最大生成长度
    output = tokenizer.decode(outputs[0])
    response = output.split("<sep>")[-1].replace("<eod>", '')

    # 将模型的输出添加到session_state中的messages列表中
    st.session_state.messages.append({"role": "assistant", "content": response})

    # 在聊天界面上显示模型的输出
    st.chat_message("assistant").write(response)

        3.2、baseline代码解读

                3.2.1、导入库

                          导入所需要的依赖,包括 transformerstorchstreamlit。其中torch 魔搭本身已经安装,transformersstreamlit在第二步也安装完毕。

                3.2.2、模型下载

                        Yuan2-2B-Mars支持通过多个平台进行下载,包括魔搭、HuggingFace、OpenXlab、百度网盘、WiseModel等。因为我们的机器就在魔搭,所以这里我们直接选择通过魔搭进行下载。模型在魔搭平台的地址为 IEITYuan/Yuan2-2B-Mars-hf

                        模型下载使用的是 modelscope 中的 snapshot_download 函数,第一个参数为模型名称 IEITYuan/Yuan2-2B-Mars-hf,第二个参数 cache_dir 为模型保存路径,这里.表示当前路径。

                        模型大小约为4.1G,由于是从魔搭直接进行下载,速度会非常快。下载完成后,会在当前目录增加一个名为 IEITYuan 的文件夹,其中 Yuan2-2B-Mars-hf 里面保存着我们下载好的源大模型。

                3.2.3、模型加载

                        使用 transformers 中的 from_pretrained 函数来加载下载好的模型和tokenizer,并通过 .cuda() 将模型放置在GPU上。另外,这里额外使用了 streamlit 提供的一个装饰器 @st.cache_resource ,它可以用于缓存加载好的模型和tokenizer。

                3.2.4、读取用户输入

                        使用 streamlit 提供的 chat_input() 来获取用户输入,同时将其保存到对话历史里,并通过st.chat_message("user").write(prompt) 在聊天界面上进行显示。

                3.2.5、对话历史拼接

                        对于 Yuan2-2B-Mars 模型来说,输入需要在末尾添加 <sep>,模型输出到 <eod> 结束。如果输入是多轮对话历史,需要使用 <n> 进行拼接,并且在末尾添加 <sep>

                3.2.6、模型调用

                        输入的prompt需要先经tokenizer切分成token,并转成对应的id,并通过 .cuda() 将输入也放置在GPU上。然后调用 model.generate() 生成输出的id,并通过 tokenizer.decode() 将id转成对应的字符串。最后从字符串中提取模型生成的内容(即 <sep> 之后的字符串),并删除末尾的 <eod> ,得到最终的回复内容。

                3.2.7、显示模型输出

                        得到回复内容后,将其保存到对话历史里,并通过st.chat_message("assistant").write(response) 在聊天界面上进行显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值