文章目录
前言
第三期书生大模型实战营,出发!
入门岛
第1关 Linux 基础知识
第一关,我们将学会InternStudio开发机创建、配置远程连接、使用本地VSCode连接到开发机、创建脚本、创建虚拟环境、运行脚本等。
InternStudio开发机创建
首先,我们需要登录到InternStudio平台,然后点击“创建开发机”按钮。
按照下图配置创建开发机
创建好的开发机如图所示:
此时,我们可以点击“进入开发机”链接,直接在网页上打开开发机的界面进行使用。
如下图所示,我们进入开发机后,有3种模式供我们开发者选择,JupyterLab,终端,VSCode,个人建议最好掌握vscode等工具的使用方法,方便后续的开发工作。
SSH及端口映射
为了方便,采用VsCode进行SSH连接和端口映射操作。
首先,要实现VSCode连接远程服务器,需要先安装一个Remote SSH插件。
之后点击加号
在顶端输入登录命令和密码
配置好之后,进入root目录,就可以写脚本文件了
创建一个helloworld.py脚本文件,代码如下:
import socket
import re
import gradio as gr
# 获取主机名
def get_hostname():
hostname = socket.gethostname()
match = re.search(r'-(\d+)$', hostname)
name = match.group(1)
return name
# 创建 Gradio 界面
with gr.Blocks(gr.themes.Soft()) as demo:
html_code = f"""
<p align="center">
<a href="https://intern-ai.org.cn/home">
<img src="https://intern-ai.org.cn/assets/headerLogo-4ea34f23.svg" alt="Logo" width="20%" style="border-radius: 5px;">
</a>
</p>
<h1 style="text-align: center;">☁️ Welcome {get_hostname()} user, welcome to the ShuSheng LLM Practical Camp Course!</h1>
<h2 style="text-align: center;">😀 Let’s go on a journey through ShuSheng Island together.</h2>
<p align="center">
<a href="https://github.com/InternLM/Tutorial/blob/camp3">
<img src="https://oss.lingkongstudy.com.cn/blog/202406301604074.jpg" alt="Logo" width="20%" style="border-radius: 5px;">
</a>
</p>
"""
gr.Markdown(html_code)
demo.launch()
为了更好地开发,创建一个虚拟环境并激活,安转必要的包
conda create -n Tutorial python=3.10 -y
conda activate Tutorial
pip install gradio==4.29.0
安装好之后就可以运行helloworld.py文件了,在终端输入:
python hello_world.py
得到结果如图所示:
Vscode下方的页面可以看到端口的监听情况:
至此,我们成功创建了开发机、配置了远程连接、使用本地VSCode连接到了开发机、创建了脚本、创建了虚拟环境、并且运行了脚本。
第2关 Python基础知识
本关首先用Python实现一个wordcount函数,统计英文字符串中每个单词出现的次数。返回一个字典,key为单词,value为对应单词出现的次数。代码和运行效果如下:
import re
from collections import defaultdict
def wordcount(text):
text = re.sub(r'[^\w\s]', '', text).lower()
words = text.split()
word_counts = defaultdict(int)
for word in words:
word_counts[word] += 1
return dict(word_counts)
text0 = """Hello world!
This is an example.
Word count is fun.
Is it fun to count words?
Yes, it is fun!
"""
text1 = """
Got this panda plush toy for my daughter's birthday,
who loves it and takes it everywhere. It's soft and
super cute, and its face has a friendly look. It's
a bit small for what I paid though. I think there
might be other options that are bigger for the
same price. It arrived a day earlier than expected,
so I got to play with it myself before I gave it
to her.
"""
print(wordcount(text0))
print(wordcount(text1))
其次将上面的wordcount函数在开发机上用vscode进行debug,体验debug的全流程,并完成一份debug笔记
我们可以看到有几个按键:
1: continue: 继续运行到下一个断点
2: step over:跳过,可以理解为运行当前行代码,不进入具体的函数或者方法。
3: step into: 进入函数或者方法。如果当行代码存在函数或者方法时,进入代码该函数或者方法。如果当行代码没有函数或者方法,则等价于step over。
4: step out:退出函数或者方法, 返回上一层。
5: restart:重新启动debug
以上debug我们没有出现问题就完成第2关啦!
第3关 Git 基础知识
任务概览
任务1: 破冰活动:自我介绍
任务2: 实践项目:构建个人项目
任务1: 破冰活动:自我介绍
目标:
每位参与者提交一份如下图的自我介绍。 提交地址:https://github.com/InternLM/Tutorial 的 camp3 分支~
要求
命名格式为 camp3_< id >.md,其中< id >是您的报名问卷ID。
文件路径应为 ./data/Git/task/
【大家可以叫我】内容可以是 GitHub 昵称、微信昵称或其他网名。
在 GitHub 上创建一个 Pull Request,提供对应的 PR 链接。
作业
Fork目标项目:
在终端依次输入:
git clone https://github.com/WentangChen/Tutorial.git # 修改为自己frok的仓库
cd Tutorial/
git branch -a
git checkout -b camp3 origin/camp3
如图所示创建自己的自我介绍:
提交自述文件到分支:
查看提交
将内容PR到Tutorial:
可以查看修改的内容:
PR链接:https://github.com/InternLM/Tutorial/pull/1374
任务2:构建个人项目
创建并维护一个公开的大模型相关项目或笔记仓库。
提交作业时,提供您的 GitHub 仓库链接。
如果您不常使用 GitHub,您可以选择其他代码管理平台,如 Gitee,并提交相应的链接。
仓库介绍中添加超链接跳转 GitHub 仓库(https://github.com/InternLM/Tutorial)
将此项目报名参加第三期实战营项目评选将解锁 30% A100 和 168 团队算力点资源,报名链接:https://aicarrier.feishu.cn/wiki/DjY6whCO0inTu2kQN9Cchxgynme
作业
创建一个项目:
项目链接: https://github.com/WentangChen/Shusheng
基础岛
第1关 书生大模型全链路开源体系
书生·浦语大模型全链路开源体系
自21世纪深度学习理论的突破以来,各类专用模型不断涌现并展现出出色的表现。针对特定的任务,一个模型解决一个问题的专用模型引发了人们的广泛关注。同时,让一个模型能够应对多种任务、多种模态的通过用大模型逐渐成为人工智能的发展趋势。
InternLM2开源模型有7B和20B两种规格,同时每个规格包含三个模型版本:
- InternLM2-Base:高质量和具有很强可塑性的模型基座,是模型进行深度领域适配的高质量起点。
- InternLM2:在Base的基础上,对多个能力方向进行了优化,在评测中成绩优异,同时保持了很好的通用语言能力,是推荐的在大部分应用中考虑选用的优秀基座模型。
- InternLM2-Chat:在Base的基础上经过SFT和RLHF,面向对话交互进行了优化,具有很好的指令遵循、共情聊天和调用工具的能力。
- InternLM2回归语言建模的本质,使用新一代数据清洗过滤技术,通过多维度数据价值评估、高质量语料驱动的数据富集和有针对性地数据补齐,提升模型下游任务的性能。
InternLM2的主要亮点:
- 超长上下文:模型在20万token上下文中几乎完美的实现"大海捞针"
- 综合性能全面提升:推理、数学、代码提升显著
- 优秀的对话和创作体验:精准指令跟随、丰富的结构化创作
- 工具调用能力整体提升:可靠支持工具多轮调用,复杂智能体搭建
- 突出的数理能力和实用的数据分析功能:强大的内生计算能力,加入代码解释后能力进一步提升
从模型到应用-全链路开源体系
从模型到应用的典型流程
基于这些流程,书生浦语开源了全链条开放体系
数据集地址: OpenDataLab https://opendatalab.org.cn/pic5
微调方式介绍
开源框架XTuner
评测:OpenCompass开源之路
CompassRank中立全面的大模型性能榜单
CompassKit全栈工具链
CompassHub高质量评测基准社区
LMDeploy提供高效推理引擎、晚辈易用的工具链、支持交互式推理相较于VLLM性能显著
轻量级智能体框架Lagent
多模态智能体工具箱AgentLego
第2关 8G 显存玩转书生大模型 Demo
本关任务主要包括:
InternLM2-Chat-1.8B 模型的部署(基础任务)
InternLM-XComposer2-VL-1.8B 模型的部署(进阶任务)
InternVL2-2B 模型的部署(进阶任务)
基础任务(完成此任务即完成闯关)
使用 Cli Demo 完成 InternLM2-Chat-1.8B 模型的部署,并生成 300 字小故事,记录复现过程并截图。
作业
输入以下代码配置环境:
# 创建环境
conda create -n demo python=3.10 -y
# 激活环境
conda activate demo
# 安装 torch
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia -y
# 安装其他依赖
pip install transformers==4.38
pip install sentencepiece==0.1.99
pip install einops==0.8.0
pip install protobuf
pip install accelerate
pip install streamlit
创建一个目录,用于存放我们的代码。并创建一个 cli_demo.py。
mkdir -p /root/demo
touch /root/demo/cli_demo.py
将下面的代码复制到 cli_demo.py 中。
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
model_name_or_path = "/root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True, device_map='cuda:0')
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, trust_remote_code=True, torch_dtype=torch.bfloat16, device_map='cuda:0')
model = model.eval()
system_prompt = """You are an AI assistant whose name is InternLM (书生·浦语).
- InternLM (书生·浦语) is a conversational language model that is developed by Shanghai AI Laboratory (上海人工智能实验室). It is designed to be helpful, honest, and harmless.
- InternLM (书生·浦语) can understand and communicate fluently in the language chosen by the user such as English and 中文.
"""
messages = [(system_prompt, '')]
print("=============Welcome to InternLM chatbot, type 'exit' to exit.=============")
while True:
input_text = input("\nUser >>> ")
input_text = input_text.replace(' ', '')
if input_text == "exit":
break
length = 0
for response, _ in model.stream_chat(tokenizer, input_text, messages):
if response is not None:
print(response[length:], flush=True, end="")
length = len(response)
接下来可以通过 python /root/demo/cli_demo.py 来启动我们的 Demo。
接下来,我们将演示如何使用 Streamlit 部署 InternLM2-Chat-1.8B 模型。
我们执行如下代码来把本教程仓库 clone 到本地,以执行后续的代码。
git clone https://github.com/InternLM/Tutorial.git
然后,我们执行如下代码来启动一个 Streamlit 服务。
streamlit run /root/demo/Tutorial/tools/streamlit_demo.py --server.address 127.0.0.1 --server.port 6006
接下来,我们在本地的 PowerShell 中输入以下命令,将端口映射到本地。
ssh -CNg -L 6006:127.0.0.1:6006 root@ssh.intern-ai.org.cn -p 你的 ssh 端口号
然后将 SSH 密码复制并粘贴到 PowerShell 中,回车,即可完成端口映射。在完成端口映射后,我们便可以通过浏览器访问 http://localhost:6006 来启动我们的 Demo。效果如图所示:
进阶任务(闯关不要求完成此任务)
使用 LMDeploy 完成 InternLM-XComposer2-VL-1.8B 的部署,并完成一次图文理解对话,记录复现过程并截图。
使用 LMDeploy 完成 InternVL2-2B 的部署,并完成一次图文理解对话,记录复现过程并截图。
作业
LMDeploy 部署 InternLM-XComposer2-VL-1.8B 模型
InternLM-XComposer2 是一款基于 InternLM2 的视觉语言大模型,其擅长自由形式的文本图像合成和理解。其主要特点包括:
1.自由形式的交错文本图像合成:InternLM-XComposer2 可以根据大纲、详细文本要求和参考图像等不同输入,生成连贯且上下文相关,具有交错图像和文本的文章,从而实现高度可定制的内容创建。
2.准确的视觉语言问题解决:InternLM-XComposer2 基于自由形式的指令准确地处理多样化和具有挑战性的视觉语言问答任务,在识别,感知,详细标签,视觉推理等方面表现出色。
3.令人惊叹的性能:基于 InternLM2-7B 的InternLM-XComposer2 在多个基准测试中位于开源多模态模型第一梯队,而且在部分基准测试中与 GPT-4V 和 Gemini Pro 相当甚至超过它们。
LMDeploy 是一个用于压缩、部署和服务 LLM 的工具包,由 MMRazor 和 MMDeploy 团队开发。它具有以下核心功能:
1.高效的推理:LMDeploy 通过引入持久化批处理、块 KV 缓存、动态分割与融合、张量并行、高性能 CUDA 内核等关键技术,提供了比 vLLM 高 1.8 倍的推理性能。
2.有效的量化:LMDeploy 支持仅权重量化和 k/v 量化,4bit 推理性能是 FP16 的 2.4 倍。量化后模型质量已通过 OpenCompass 评估确认。
3.轻松的分发:利用请求分发服务,LMDeploy 可以在多台机器和设备上轻松高效地部署多模型服务。
4.交互式推理模式:通过缓存多轮对话过程中注意力的 k/v,推理引擎记住对话历史,从而避免重复处理历史会话。
5.优秀的兼容性:LMDeploy支持 KV Cache Quant,AWQ 和自动前缀缓存同时使用。
LMDeploy 已经支持了 InternLM-XComposer2 系列的部署,但值得注意的是 LMDeploy 仅支持了 InternLM-XComposer2 系列模型的视觉对话功能。
接下来,我们将演示如何使用 LMDeploy 部署 InternLM-XComposer2-VL-1.8B 模型。
首先,我们激活环境并安装 LMDeploy 以及其他依赖。
pip install lmdeploy[all]==0.5.1
pip install timm==1.0.7
接下来,我们使用 LMDeploy 启动一个与 InternLM-XComposer2-VL-1.8B 模型交互的 Gradio 服务。
lmdeploy serve gradio /share/new_models/Shanghai_AI_Laboratory/internlm-xcomposer2-vl-1_8b --cache-max-entry-count 0.1
在使用 Upload Image 上传图片后,我们输入 Instruction 后按下回车,便可以看到模型的输出:
LMDeploy 部署 InternVL2-2B 模型
使用 LMDeploy 完成 InternVL2-2B 的部署,并完成一次图文理解对话,记录复现过程并截图。
InternVL2 是上海人工智能实验室推出的新一代视觉-语言多模态大模型,是首个综合性能媲美国际闭源商业模型的开源多模态大模型。InternVL2 系列从千亿大模型到端侧小模型全覆盖,通专融合,支持多种模态。
LMDeploy 也已经支持了 InternVL2 系列模型的部署,让我们一起来使用 LMDeploy 部署 InternVL2-2B 模型。
我们可以通过下面的命令来启动 InternVL2-2B 模型的 Gradio 服务。
conda activate demo
lmdeploy serve gradio /share/new_models/OpenGVLab/InternVL2-2B --cache-max-entry-count 0.1
在完成端口映射后,我们便可以通过浏览器访问 http://localhost:6006 来启动我们的 Demo。
在使用 Upload Image 上传图片后,我们输入 Instruction 后按下回车,便可以看到模型的输出。
第3关 浦语提示词工程实践
基础任务
背景问题:近期相关研究发现,LLM在对比浮点数字时表现不佳,经验证,internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题,例如认为13.8<13.11。
任务要求:利用LangGPT优化提示词,使LLM输出正确结果。
作业
使用LMDeploy进行部署,参考如下命令:
CUDA_VISIBLE_DEVICES=0 lmdeploy serve api_server /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --server-port 23333 --api-keys internlm2
部署成功后,可以利用如下脚本调用部署的InternLM2-chat-1_8b模型并测试是否部署成功。
from openai import OpenAI
client = OpenAI(
api_key = "internlm2",
base_url = "http://0.0.0.0:23333/v1"
)
response = client.chat.completions.create(
model=client.models.list().data[0].id,
messages=[
{“role”: "system", "content": "5.11和5.9哪个大?"}
]
)
print(response.choices[0].message.content)
在无prompt下进行测试,输出如下图所示:
LangGPT prompt测试:
参考链接进行生成prompt学习:https://github.com/langgptai/LangGPT
可以参考以下代码:
from openai import OpenAI
prompt="""
# Role: 数学专家
## Profile
- author: LangGPT
- version: 1.0
- language: 中文/英文
- description: 你是一名数学专家,擅长解决各种数学问题,包括代数、几何、微积分、统计学等。
## Skills
1. 深入理解数学各个分支的概念和原理。
2. 能够清晰解释复杂的数学问题和解题步骤。
3. 擅长使用数学模型进行数据分析和预测。
4. 熟练运用各种数学工具和软件进行计算和分析。
## Rules
1. 必须充分理解用户的数学问题和需求。
2. 提示词需要简洁明了,避免过于复杂或含糊的表述。
3. 在设计提示词时,考虑到AI的理解能力和响应范围。
4. 将结构化提示词输出为代码格式。
## Workflows
1. 收集并分析用户的具体数学问题和场景描述。
2. 基于需求和场景,设计初步的提示词结构。
3. 评估提示词的覆盖度和准确性,必要时进行调整优化。
4. 向用户提供最终的提示词,并说明使用方法和预期效果。
## Init
友好的欢迎用户,并介绍 LangGPT,介绍完后将 LangGPT 的结构化提示词模板打印出来。
"""
client = OpenAI(
api_key = "internlm2",
base_url = "http://0.0.0.0:23333/v1"
)
response = client.chat.completions.create(
model=client.models.list().data[0].id,
messages=[
{"role": "system", "content": prompt},
{"role": "user", "content": "5.11和5.9哪个大?"}
]
)
print(response.choices[0].message.content)
输出如下图所示: