Datawhale AI夏令营 第四期大模型应用开发 学习day1

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):建模人类语言内在规律,预测词序列中 下一个词 或者 缺失的词 的概率。

目前为止,语言模型有四代。

  1. 统计语言模型(Statistical Language Model, SLM):使用马尔可夫假设(Markov Assumption)来建模语言序列的 𝑛 元(𝑛-gram)语言模型。具备一定生成能力辅助解决部分任务数据稀疏影响严重。

  2. 神经语言模型(Neural Language Model, NLM):基于神经网络构建语言模型,如循环神经网络(Recurrent Neural Networks, RNN),并学习上下文相关的词表示(即分布式词向量),也被称为词嵌入(Word Embedding)。代表:word2vec。克服数据稀疏,无监督学习语义特征,缺乏知识,可迁移性差。

  3. 预训练语言模型(Pre-trained Language Model, PLM):使用大量的无标注数据预训练双向 LSTM(Bidirectional LSTM, biLSTM)或者Transformer,然后在下游任务上进行微调(Fine-Tuning)。代表:ELMo、BERT、GPT-1/2。捕捉上下文语义,可迁移性显著提升,仍需要监督数据微调。

  4. 大语言模型(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图像。模块将输入和输出组件与布局组件分开。输入组件(如TextboxSlider等)用于接收用户输入,输出组件(如LabelImage等)用于显示函数的输出结果。

  • 布局组件用于更好地规划组件的布局,如:Column(把组件放成一列)、Row(把组件放成一行),用于组织和排列输入和输出组件,以创建结构化的用户界面。

    • 推荐使用gradio.Blocks()做更多丰富交互的界面,gradio.Interface()只支持单个函数交互

  • 控制组件用于直接调用函数,无法作为输入输出使用,如:Button(按钮)、ClearButton(清除按钮)

Streamlit     每个组件都是独立的,需要用什么直接查看官方文档即可。

服务端

服务端需要与大模型进行交互,大模型接受到用户请求后,经过复杂的计算,得到模型输出。

方式1:(便捷,资源效率,稳定性安全性,拓展------网络延迟、数据隐私、成本控制、依赖性)

  • 直接调用大模型API:将请求直接发送给相应的服务商,如openai,讯飞星火等,等待API返回大模型回复

方式2:(数据主权,性能可控,成本固定,定制化-------硬件资源,运维复杂,技术门槛,资源利用率)

  • 大模型本地部署:在本地GPU或者CPU上,下载模型文件,并基于推理框架进行部署大模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值