【Datawhale AI 夏令营】动手学大模型应用开发Task1 Baseline 精读

news2024/11/26 22:39:46

【Datawhale AI 夏令营】动手学大模型应用开发Task1 Baseline 精读

开源大模型文件预览

在这里插入图片描述

Baseline

1.导入库

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

2.模型下载

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

snapshot_download 函数进行模型下载,第一个参数为模型名称,第二个参数为模型保存路径(./ 为当前路径)

3.模型加载

# 定义一个函数,用于获取模型和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

streamlit 库中装饰器 @st.cache_resource 用于缓存好的模型和tokenizer,后续不需要重新执行函数内容

使用 transformers.AutoTokenizer 中的 from_pretrained 函数加载预训练模型的分词器

使用 transformers.AutoModelForCausalLM 中的 from_pretrained 函数加载与训练好的模型

.cuda()可以将模型部署在GPU上

4.用户消息读取

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

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

if prompt := st.chat_input(): 赋值表达式,st.chat_input() 用于获取用户输入),则将其赋值给变量prompt,并且如果输入不为空(即用户确实输入了内容),则执行紧接着的缩进块内的代码。

# 询问用户输入
user_input = st.chat_input()

# 检查用户是否输入了内容
if user_input:
    prompt = user_input

5.拼接对话历史

    prompt = "<n>".join(msg["content"] for msg in st.session_state.messages) + "<sep>" # 拼接对话历史

msg["content"] for msg in st.session_state.messages 遍历 st.session_state.messages 列表中的每个元素 msg ,提取 msg 字典中的 content 键值,这样可以创建一个新的列表。

"<n>".join() 将消息列表中的每个元素连接成单一的字符串,每个消息之间用作为分隔符,所有的消息内容形成一个连续的字符串,标识整个对话历史记录。

+ "<sep>" 作为对话历史结束的标记

6.模型调用

	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>", '')

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

7.显示模型输出

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

源码

# 导入所需的库
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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035352.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

将电脑打造成私人网盘,支持外网访问之详细操作教程

你想过把自己电脑打造成随时随地访问的网盘吗&#xff1f;就是那种拥有一个属于自己的影音库&#xff0c;不用担心被和谐&#xff0c;随时可以登录访问电脑上的各种文件&#xff0c;相比传统网盘省心又安全。 使用Everything和节点小宝将电脑搭建成私人网盘&#xff0c;可以实现…

嵌入式面经篇三——数据类型

文章目录 前言一、数据类型1、用变量 a 给出下面的定义2、下面的代码输出是什么&#xff0c;为什么&#xff1f;3、写出 float x 与“零值”比较的 if 语句。4、下面代码有什么错误&#xff1f;5、下面代码输出是什么&#xff1f;6、下面代码运行后会是什么现象&#xff1f;7、…

24年日语能力(JLPT)考试报名流程图解

报名方式 搜索JLPT中国教育考试网&#xff0c;在线报名&#xff0c;一般学生党从教育网入口登录&#xff0c;社会人士从公网入口登录 报名时间 N1-N5 8月20日 7:00 - 8月27日14:00 注册时间 8月13日7:00 - 8月27日14:00 报名步骤 阅读报考提示&#xff0c;注册个人信息→…

此处不允许使用 ‘空‘ 类型

说明&#xff1a;受最近看的书《设计模式之美》&#xff08;小争哥&#xff09;的影响&#xff0c;最近编码有意将一些业务逻辑写在对象里面&#xff0c;增强封装性。在此记录一次项目启动时的报错&#xff0c;如下&#xff1a; 原因&#xff1a;当你在实体类对象中&#xff0c…

UniApp开发的开源工厂设备管理维护系统

本文来自&#xff1a;UniApp开发的开源工厂设备管理维护系统 - 源码1688 前端小程序演示地址&#xff1a; 后台测试网址&#xff1a; https://shebeiguanli.azheteng.cn/pyswkAWtig.php/addon?refaddtabs 测试账户&#xff1a; admin 测试密码&#xff1a; admin888 前端…

【Python】python泰坦尼克号生存预测 (源码+数据集+PPT+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

黑神话悟空游戏攻略大全 黑神话悟空内存占用多少 国产3A级游戏《黑神话:悟空》评测代码已发 黑神话悟空测试画质130g MacBook可以玩黑神话悟空吗

《黑神话&#xff1a;悟空》的评测代码已向媒体与测评人员发放&#xff0c;评测解禁日期定在8月16日。目前发放的评测代码仅限于PC版&#xff0c;并未涉及PS5版。《黑神话&#xff1a;悟空》将于8月20日发售&#xff0c;登陆PC(Steam/Epic/WeGame)和PS5。玩家将扮演一位“天命人…

Mybatis原理分析

一、总结 MyBatis的基本工作原理就是&#xff1a;先封装SQL&#xff0c;接着调用JDBC操作数据库&#xff0c;最后把数据库返回的表结果封装成Java类。 1. JDBC有四个核心对象&#xff1a; &#xff08;1&#xff09;DriverManager&#xff0c;用于注册数据库连接。 &#xf…

基于单片机的智能楼道灯光控制系统设计

摘要&#xff1a;基于单片机的智能楼道灯光控制系统设计由人体感应模块、光照强度检测模块、灯光控制模块、声音传感器模块、声光报警模块等组成。以单片机为核心&#xff0c;通过检测光照强度和红外人体感应相结合&#xff0c;实现了对楼道内灯光的控制&#xff0c;从而达到节…

vue-cli 中 配置 productionSourceMap 为 false 失效?

背景 最近 发现 vuecli 构建的 项目中配置的 productionSourceMap 为 false 后 &#xff0c;生产代码 还是能够看到 sourceMap 文件 。 原因 生效前提条件 得设置 NODE_ENV 为 production 才会生效&#xff01; 解决 直接修改生产环境的配置 NODE_ENV 为 production 直接覆…

二.PhotoKit - 相册权限(彻底读懂权限管理)

引言 用户的照片和视频算是用户最私密的数据之一&#xff0c;由于内置的隐私保护功能&#xff0c;APP只有在用户明确授权的前提下才能访问用户的照片库。从iOS14 开始&#xff0c;PhotoKit进一步增强了用户的隐私控制&#xff0c;用户可以选择指定的照片或者视频资源的访问权限…

阿里淘天landing,是结束也是新的开始(附校/社招内推码)

阿里3个多月landing成功&#xff0c;是结束也是新开始&#xff0c;望我们往后一切顺利~ 因为个人发展规划&#xff0c;今年开始找工作&#xff0c;但负责的业务实在繁忙&#xff0c;所以一边面试一边整理资料&#xff0c;每天都在挤海绵。 今年的就业形势着实不乐观&#xff0c…

NPN传感器与汉姆485总线驱动器限位功能使用

传感器输出的引脚电平是由传感器是常闭还是常开决定的&#xff1b;light on和 dark on决定的是触发信号&#xff1b; PNP-NO常开&#xff1a;在没有信号触发时&#xff0c;输出线是悬空的&#xff08;即VCC电源线和OUT线断开&#xff09;&#xff0c;输出为低电平或不确定状态…

【推荐】免费一年期的SSL证书现在哪里可以申请到

免费一年期的SSL证书虽然不像以前那样普遍易得&#xff0c;但仍有部分途径可以申请到。以下是一些可能的申请渠道&#xff1a; JoySSL 特点&#xff1a;JoySSL是自主品牌SSL证书&#xff0c;安全性和兼容性都有保障。它提供教育版和政务版域名的一年期免费DV单证书。申请流程&…

java中RSA分段加解密及Data must not be longer than异常处理

谈到RSA非对称加密&#xff0c;作为开发的我们第一想到的是安全&#xff0c;几乎不会被破解&#xff0c;以及公钥加密&#xff0c;私钥解密这些。在Java代码中&#xff0c;我们常使用一些现成的工具类如hutool中提供的工具类、网上在线的或者博客上的RSAUtils工具类来实现公钥私…

解决BkwinProject无法编译运行问题

#ifdef _UNICODE // 如果定义了 _UNICODE&#xff0c;这意味着程序正在使用 Unicode 字符集进行编译。 // Unicode 字符集是现代 Windows 应用程序普遍使用的字符编码方式&#xff0c;支持多语言字符。#if defined _M_IX86 // 如果定义了 _M_IX86&#xff0c;这意味着程序正…

【源码交付】数字化产科管理平台:一个集孕期产检、健康宣教、随访、住院、产后42天管理的专科管理系统

项目介绍&#xff1a; 数字化产科管理平台是一个集孕期产检、健康宣教、随访、住院、产后42天管理的专科管理系统&#xff0c;由门诊、住院、数据统计三大功能模块组成&#xff0c;与院内系统HIS/LIS/PACS数据对接&#xff0c;实现以孕妇为中心的全面、高效、多元的全周期服务…

用的到linux-系统性能监控(内存、CPU、硬盘、IO)-Day6

前言&#xff1a; 在Linux系统中&#xff0c;实时监控系统的资源使用情况&#xff08;如内存、硬盘、CPU、网络和IO等&#xff09;是非常重要的&#xff0c;它可以帮助你了解系统的健康状况&#xff0c;及时发现潜在的性能瓶颈或问题。下面将介绍一些常用的命令和工具&#xff…

私服(Nexus)相关笔记

目录 Nexus服务器安装与启动 仓库分类与手动上传组件 私服资源获取 仓库分类 IDEA环境中资源上传与下载 Nexus服务器安装与启动 私服 Nexus是Sonatype公司的一款maven私服产品下载地址: https://help.sonatype.com/repomanager3/download 解压到自己放置资源的地方 输入…