Task01 体验Yuan2-2B-Mars
模型(智能编程助手)
在魔塔社区创建PAI实例并打开终端输入以下指令
# 下载文件
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
体验结果
体验感想
模型能出色满足用户需求,高效生成代码并配有解析说明,并且能够紧跟用户上下文指令,很智能!
完整代码
# 导入所需的库
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='./')
# model_dir = snapshot_download('IEITYuan/Yuan2-2B-July-hf', cache_dir='./')
# 定义模型路径
path = './IEITYuan/Yuan2-2B-Mars-hf'
# path = './IEITYuan/Yuan2-2B-July-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)
换源
-
双击打开baseline文件
AICamp_yuan_baseline/Task\ 1:零基础玩转源大模型/web_demo_2b.py
-
将其中
# 源大模型下载
和# 定义模型路径
的地址修改为对应的模型即可 -
在终端重新
启动Demo
# 源大模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('IEITYuan/Yuan2-2B-July-hf', cache_dir='./')
# 定义模型路径
path = './IEITYuan/Yuan2-2B-July-hf'
运行:
streamlit run AICamp_yuan_baseline/Task\ 1:零基础玩转源大模型/web_demo_2b.py --server.address 127.0.0.1 --server.port 6006
部分Yuan大模型版本信息表
模型规格 | 最低GPU显 (推理) | 最低GPU显存 (微调) | 不同版本的 snapshot_download 地址 | 魔搭上的模型地址 |
2B | 6GB | 80GB | IEITYuan/Yuan2-2B-Mars-hf | |
IEITYuan/Yuan2-2B-July-hf | ||||
IEITYuan/Yuan2-2B-Janus-hf | ||||
IEITYuan/Yuan2-2B-Februa-hf-GGUF | ||||
51B | 4*80GB | 32*80GB | IEITYuan/Yuan2.0-51B-hf | |
102B | 8*80GB | 96*80GB | IEITYuan/Yuan2.0-102B-hf |
大模型应用开发背景知识
语言模型(language model):建模人类语言内在规律,预测词序列中 下一个词
或者 缺失的词
的概率。
目前为止,语言模型有四代。
-
统计语言模型(Statistical Language Model, SLM):使用马尔可夫假设(Markov Assumption)来建模语言序列的 𝑛 元(𝑛-gram)语言模型。具备一定生成能力辅助解决部分任务,数据稀疏影响严重。
-
神经语言模型(Neural Language Model, NLM):基于神经网络构建语言模型,如循环神经网络(Recurrent Neural Networks, RNN),并学习上下文相关的词表示(即分布式词向量),也被称为词嵌入(Word Embedding)。代表:word2vec。克服数据稀疏,无监督学习语义特征,缺乏知识,可迁移性差。
-
预训练语言模型(Pre-trained Language Model, PLM):使用大量的无标注数据预训练双向 LSTM(Bidirectional LSTM, biLSTM)或者Transformer,然后在下游任务上进行微调(Fine-Tuning)。代表:ELMo、BERT、GPT-1/2。捕捉上下文语义,可迁移性显著提升,仍需要监督数据微调。
-
大语言模型(Large Language Model, LLM):基于“扩展法则”(Scaling Law),即通过增加模型参数或训练数据,可以提升下游任务的性能,同时具有小模型不具有的“涌现能力”(Emergent Abilities)。代表:GPT-3、ChatGPT、Claude、Llama。规模拓展提升性能,通用的任务求解途径,学习成本高,适配灵活性差。
大模构建过程
1.预训练(Pretraining)
使用海量的数据进行模型参数的初始学习,为模型参数寻找到一个优质的“起点”。当前主流的大模型技术路线是“解码器架构+预测下一个词”的策略。在预训练过程中,首要任务是搜集和清洗海量的文本数据,确保剔除潜在的有害内容。预训练阶段,对数据量有苛刻要求,多数开源模型的预训练均基于数T的token。对计算资源的需求也极为庞大。此外,预训练过程中还涉及诸多细节,诸如数据配比、学习率调度、模型行为监测等,这些往往缺乏公开的最佳实践指导,需要研发团队具备深厚的训练经验与故障排查能力,以规避训练过程中的回溯与重复迭代,节约计算资源,提高训练效率。
2.有监督微调(Supervised Fine-tuning, SFT)
经过预训练之后,模型已经具有基础模型能力,但是由于预训练任务形式所限,这些模型更擅长于文本补全,并不适合直接解决具体的任务。上下文学习(In-Context Learning, ICL)等提示学习策略以增强模型的适应性,但模型本身在下游任务解决上的能力仍受限。微调过程可以提升其在特定任务中的表现。
“有监督微调”(也叫做指令微调,Instruction Tuning),利用成对的任务输入与预期输出数据,训练模型学会以问答的形式解答问题,从而解锁其任务解决潜能。经过指令微调后,大语言模型能够展现出较强的指令遵循能力,可以通过零样本学习的方式解决多种下游任务。
3.基于人类反馈的强化学习对齐(Reinforcement Learning from Human Feedback, RLHF)
RLHF的核心在于构建一个反映人类价值观的奖励模型(Reward Model)。这一模型的训练依赖于专家对模型多种输出的偏好排序,通过偏好数据训练出的奖励模型能够有效评判模型输出的质量。
简化模型的对齐过程实现类似RLHF功能:直接偏好优化(Direct Preference Optimization, DPO),它通过与有监督微调相似的复杂度实现模型与人类对齐,是一种典型的不需要强化学习的对齐算法。相比RLHF,DPO不再需要在训练过程中针对大模型进行采样,同时超参数的选择更加容易。
源大模型开源体系
源1.0大模型
采用76层的Transformer Decoder结构,使用5T数据训练,拥有2457亿参数量,超越OpenAI研发的GPT-3,成为全球最大规模的AI巨量模型,表现出了出色的中文理解与创作能力。
源2.0大模型
使用10T数据训练,包括1026亿、518亿、21亿 三款参数规模,在数理逻辑、代码生成等方面表现出色。在算法方面,与传统Attention对输入的所有文字一视同仁不同,提出了局部注意力过滤增强机制(Localized Filtering-based Attention, LFA),它假设自然语言相邻词之间有更强的语义关联,因此针对局部依赖进行了建模,最后使得模型精度提高3.53%。
源2.0-M32
是一个混合专家(Mixture of Experts, MoE)大模型,使用2000B Tokens训练,包含400亿参数,37亿激活参数;包含32个专家,基于LFA+Attention Router的MoE模型结构。;在数理逻辑、代码生成、知识等方面精度对标Llama3-70B,推理算力降至1/19。
大模型开发范式
Prompt工程
通过精心构造提示(Prompt),直接调教大模型,解决实际问题。以下两种技术:
-
上下文学习(In-Context Learning, ICL):将任务说明及示例融入提示文本之中,利用模型自身的归纳能力,无需额外训练即可完成新任务的学习。
-
思维链提示(Chain-of-Thought, CoT):引入连贯的逻辑推理链条至提示信息内,显著增强了模型处理复杂问题时的解析深度与广度。
Embedding辅助
大模型无法满足需求:
-
知识局限性:大模型知识来源的训练数据主要来自于互联网上已经公开的资源,对于一些实时性的或者非公开的,由于大模型没有获取到相关数据,这部分知识也就无法被掌握。
-
数据安全性:将数据纳入到训练集进行训练可能造成数据泄露。
-
大模型幻觉:由于大模型是基于概率统计进行构建的,其输出本质上是一系列数值运算。因此,有时会出现模型“一本正经地胡说八道”的情况,尤其是在大模型不具备的知识或不擅长的场景中。
将知识提前转成Embedding向量,存入知识库,然后通过检索将知识作为背景信息,这样就相当于给LLM外接大脑,使大模型能够运用这些外部知识,生成准确且符合上下文的答案,同时能够减少模型幻觉的出现。
参数高效微调
提升学习能力:模型微调也被称为指令微调(Instruction Tuning)或者有监督微调(Supervised Fine-tuning, SFT),首先需要构建指令训练数据,然后通过有监督的方式对大模型的参数进行微调。经过模型微调后,大模型能够更好地遵循和执行人类指令,进而完成下游任务。
参数高效微调(Parameter-efficient Fine-tuning),也称为轻量化微调 (Lightweight Fine-tuning),这些方法通过训练极少的模型参数,同时保证微调后的模型表现可以与全量微调相媲美。
大模型应用开发
一个完整的大模型应用包含一个客户端和一个服务端。客户端接收到用户请求后,将请求输入到服务端,服务端经过计算得到输出后,返回给客户端回复用户的请求。
客户端
Gradio 模块 官方文档
-
输入输出组件用于展示内容和获取内容,如:
Textbox
文本、Image
图像。模块将输入和输出组件与布局组件分开。输入组件(如Textbox
、Slider
等)用于接收用户输入,输出组件(如Label
、Image
等)用于显示函数的输出结果。 -
布局组件用于更好地规划组件的布局,如:
Column
(把组件放成一列)、Row
(把组件放成一行),用于组织和排列输入和输出组件,以创建结构化的用户界面。-
推荐使用
gradio.Blocks()
做更多丰富交互的界面,gradio.Interface()
只支持单个函数交互
-
-
控制组件用于直接调用函数,无法作为输入输出使用,如:
Button
(按钮)、ClearButton
(清除按钮)
Streamlit 每个组件都是独立的,需要用什么直接查看官方文档即可。
服务端
服务端需要与大模型进行交互,大模型接受到用户请求后,经过复杂的计算,得到模型输出。
方式1:(便捷,资源效率,稳定性安全性,拓展------网络延迟、数据隐私、成本控制、依赖性)
-
直接调用大模型API:将请求直接发送给相应的服务商,如openai,讯飞星火等,等待API返回大模型回复
方式2:(数据主权,性能可控,成本固定,定制化-------硬件资源,运维复杂,技术门槛,资源利用率)
-
大模型本地部署:在本地GPU或者CPU上,下载模型文件,并基于推理框架进行部署大模型