书生实战营 - L1
文章目录
书生大模型使用Demo
对话模型部署 - 1.8B
部署过程
- 创建环境
# 创建环境
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==5.27.2
pip install accelerate==0.33.0
pip install streamlit==1.37.0
- 书生大模型文件
测试效果
- 执行脚本
# 代码引自 书生实战营官方GitHub仓库:https://github.com/InternLM/Tutorial/blob/camp3/docs/L1/Demo/readme.md
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)
-
对话时GPU使用情况:
-
对话实例:
-
生成300字的小故事
-
使用
Streamlit Web Demo
部署聊天模型git clone https://github.com/InternLM/Tutorial.git
streamlit run /path/to/Tutorial/tools/streamlit_demo.py --server.address 127.0.0.1 --server.port 6006
- 使用vscode进行端口映射,即可在本地打开Web Demo
Temperature
是指在预测下一个字符时,不一定选择概率最大的那个字,温度越低选择概率最大的字的概率越大,温度越高,选择概率较小的字的概率越大,即温度高时输出的文本更有创造力一些
视觉-语言多模态模型部署 - 1.8B
-
LMDeploy
- 是一款
LLM
的部署工具包 - 可以实现高效推理、有效量化
- 可以启动 Gradio 的Web服务
pip install lmdeploy[all]==0.5.1
pip install timm==1.0.7
- 是一款
-
InternLM-XComposer2-VL-1.8B
- 是一款基于
InternLM2
的视觉语言大模型 - 擅长于文本图像合成与理解
lmdeploy serve gradio /share/new_models/Shanghai_AI_Laboratory/internlm-xcomposer2-vl-1_8b --cache-max-entry-count 0.1
- Gradio 测试
- 是一款基于
-
InternVL2-2B
- InternVL2 是上海人工智能实验室推出的新一代视觉-语言多模态大模型,是首个综合性能媲美国际闭源商业模型的开源多模态大模型。
lmdeploy serve gradio /share/new_models/OpenGVLab/InternVL2-2B --cache-max-entry-count 0.1
- Gradio 测试
提示词工程实践
任务描述
背景问题:近期相关研究发现,LLM在对比浮点数字时表现不佳,经验证,internlm2-chat-1.8b (internlm2-chat-7b)也存在这一问题,例如认为13.8<13.11。
任务要求:利用LangGPT优化提示词,使LLM输出正确结果。完成一次并提交截图即可
使用 1.8b 模型尝试
构建 LangGPT 提示词
# Role: expert in math
## Profile
- author:
- version: 0.1
- language: {English}
## Skills
- expert in decimal calculations
- understand Latex
## Commands
1. User input: "A=[]; B=[]"
2. calculate: $C = (A \times 100)$
3. calculate: $D = (B \times 100)$
4. print value of variable: C and D
5. print which value is bigger? C or D?
- 用中文写一直不能很好的进行小数的数值比较,只好用蹩脚的英语来写,发现效果好很多
效果
使用 7b 模型尝试
构建 LangGPT 提示词
# Role: expert in math
## Profile
- author:
- version: 0.1
- language: {English}
## Skills
- expert in decimal calculations
- understand Latex
## Commands
1. User input: "A=[]; B=[]"
2. calculate: $C = (A \times 100)$
3. calculate: $D = (B \times 100)$
4. calculate: $C - D$
5. if $C-D<0$ then print $A<B$; else if $C-D>0$ then print $A>B$
效果
- 不得不说,
7b
模型要比1.8b
能力强很多,不需要制定很多规则,只需要描述清晰一些就能准确判断小数的大小; 7b
模型对显存的占用也非常高,将近23G;
Llamaindex RAG实践
使用到的工具
- `sentence-transformer` 将句子转换为向量
- `SimpleDirectoryReader` 加载指定的文件,可以加载一个路径下的所有文件,可以加载指定的几个文件,支持的文件格式有:txt, pdf, docx, epub, md 等
- `VectorStoreIndex` 基于加载的文件建立向量索引
算法流程:
1. 基于指定的文件建立向量库(`Vector-DB`);
2. 将用户的输入编码为向量(`Query`);
3. 使用用户输入向量在向量库中检索相关的文档块(`Top-K Chunks`);
4. 将检索到的文档块与原始问题一起作为`Prompt`输入到`LLM`中,生成最终的回答。
打卡任务
任务要求:
基于 LlamaIndex 构建自己的 RAG 知识库,寻找一个问题 A 在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答,借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答 A 的能力,截图保存。
-
选用的素材
- 论文:《CatVTON: Concatenation Is All You Need for Virtual Try-On with Diffusion Models》
- 2024/07/21 发表的论文
- 上传PDF格式的论文即可
-
未使用RAG的效果
- 没有RAG时,直接回复无法回答;
-
使用RAG的效果
- 使用RAG后,可以回答出 ‘CatVTON’ 主要用于虚拟试穿场景,可以将要试穿的衣服叠加在目标人物身上,实现虚拟试穿的效果。
XTuner大模型微调实践
环境搭建
- Python虚拟环境
Package Version Editable project location
----------------------------- -------------- --------------------------
accelerate 0.33.0
addict 2.4.0
aiofiles 23.2.1
aiohappyeyeballs 2.3.2
aiohttp 3.10.0
aiosignal 1.3.1
altair 5.3.0
annotated-types 0.7.0
anyio 4.4.0
argon2-cffi 23.1.0
argon2-cffi-bindings 21.2.0
arrow 1.3.0
arxiv 2.1.3
asttokens 2.4.1
async-lru 2.0.4
async-timeout 4.0.3
attrs 23.2.0
Babel 2.15.0
backports.strenum 1.3.1
beautifulsoup4 4.12.3
bitsandbytes 0.43.3
bleach 6.1.0
blinker 1.8.2
Brotli 1.0.9
cachetools 5.4.0
certifi 2024.7.4
cffi 1.16.0
charset-normalizer 3.3.2
click 8.1.7
colorama 0.4.6
comm 0.2.2
contourpy 1.2.1
cycler 0.12.1
datasets 2.20.0
debugpy 1.8.3
decorator 5.1.1
deepspeed 0.14.4
defusedxml 0.7.1
dill 0.3.8
distro 1.9.0
dnspython 2.6.1
duckduckgo_search 5.3.1b1
einops 0.8.0
email_validator 2.2.0
et-xmlfile 1.1.0
exceptiongroup 1.2.2
executing 2.0.1
fastapi 0.111.1
fastapi-cli 0.0.4
fastjsonschema 2.20.0
feedparser 6.0.11
ffmpy 0.4.0
filelock 3.13.1
fire 0.6.0
fonttools 4.53.1
fqdn 1.5.1
frozenlist 1.4.1
fsspec 2024.5.0
func_timeout 4.3.5
gitdb 4.0.11
GitPython 3.1.43
gmpy2 2.1.2
gradio 4.39.0
gradio_client 1.1.1
griffe 0.48.0
grpcio 1.65.1
h11 0.14.0
h2 4.1.0
hjson 3.1.0
hpack 4.0.0
httpcore 1.0.5
httptools 0.6.1
httpx 0.27.0
huggingface-hub 0.24.3
hyperframe 6.0.1
idna 3.7
imageio 2.34.2
importlib_metadata 8.2.0
importlib_resources 6.4.0
ipykernel 6.29.5
ipython 8.26.0
ipywidgets 8.1.3
isoduration 20.11.0
jedi 0.19.1
Jinja2 3.1.4
json5 0.9.25
jsonpointer 3.0.0
jsonschema 4.23.0
jsonschema-specifications 2023.12.1
jupyter 1.0.0
jupyter_client 8.6.2
jupyter-console 6.6.3
jupyter_core 5.7.2
jupyter-events 0.10.0
jupyter-lsp 2.2.5
jupyter_server 2.14.2
jupyter_server_terminals 0.5.3
jupyterlab 4.2.4
jupyterlab_pygments 0.3.0
jupyterlab_server 2.27.3
jupyterlab_widgets 3.0.11
kiwisolver 1.4.5
lagent 0.2.3
lazy_loader 0.4
lmdeploy 0.5.1
markdown-it-py 3.0.0
MarkupSafe 2.1.3
matplotlib 3.9.1
matplotlib-inline 0.1.7
mdurl 0.1.2
mistune 3.0.2
mkl-fft 1.3.8
mkl-random 1.2.4
mkl-service 2.4.0
mmengine 0.10.4
mmengine-lite 0.10.4
mpi4py_mpich 3.1.5
mpmath 1.3.0
multidict 6.0.5
multiprocess 0.70.16
nbclient 0.10.0
nbconvert 7.16.4
nbformat 5.10.4
nest-asyncio 1.6.0
networkx 3.3
ninja 1.11.1.1
notebook 7.2.1
notebook_shim 0.2.4
numpy 1.26.4
nvidia-cublas-cu12 12.5.3.2
nvidia-cuda-runtime-cu12 12.5.82
nvidia-curand-cu12 10.3.6.82
nvidia-ml-py 12.555.43
nvidia-nccl-cu12 2.22.3
openai 1.37.1
opencv-python 4.10.0.84
openpyxl 3.1.5
orjson 3.10.6
overrides 7.7.0
packaging 24.1
pandas 2.2.2
pandocfilters 1.5.1
parso 0.8.4
peft 0.11.1
pexpect 4.9.0
phx-class-registry 4.1.0
pillow 10.4.0
pip 24.0
platformdirs 4.2.2
prometheus_client 0.20.0
prompt_toolkit 3.0.47
protobuf 4.25.4
psutil 6.0.0
ptyprocess 0.7.0
pure_eval 0.2.3
py-cpuinfo 9.0.0
pyarrow 17.0.0
pyarrow-hotfix 0.6
pybind11 2.13.1
pycparser 2.22
pydantic 2.8.2
pydantic_core 2.20.1
pydeck 0.9.1
pydub 0.25.1
Pygments 2.18.0
pynvml 11.5.3
pyparsing 3.1.2
PySocks 1.7.1
python-dateutil 2.9.0.post0
python-dotenv 1.0.1
python-json-logger 2.0.7
python-multipart 0.0.9
python-rapidjson 1.19
pytz 2024.1
PyYAML 6.0.1
pyzmq 26.0.3
qtconsole 5.5.2
QtPy 2.4.1
referencing 0.35.1
regex 2024.7.24
requests 2.32.3
rfc3339-validator 0.1.4
rfc3986-validator 0.1.1
rich 13.7.1
rpds-py 0.19.1
ruff 0.5.5
safetensors 0.4.3
scikit-image 0.24.0
scipy 1.14.0
semantic-version 2.10.0
Send2Trash 1.8.3
sentencepiece 0.1.99
setuptools 69.5.1
sgmllib3k 1.0.0
shellingham 1.5.4
shortuuid 1.0.13
six 1.16.0
smmap 5.0.1
sniffio 1.3.1
socksio 1.0.0
soupsieve 2.5
stack-data 0.6.3
starlette 0.37.2
streamlit 1.37.0
sympy 1.12
tenacity 8.5.0
termcolor 2.4.0
terminado 0.18.1
tifffile 2024.7.24
tiktoken 0.7.0
timeout-decorator 0.5.0
timm 1.0.7
tinycss2 1.3.0
tokenizers 0.15.2
toml 0.10.2
tomli 2.0.1
tomlkit 0.12.0
toolz 0.12.1
torch 2.1.2
torchaudio 2.1.2
torchvision 0.16.2
tornado 6.4.1
tqdm 4.66.4
traitlets 5.14.3
transformers 4.39.3
transformers-stream-generator 0.0.5
triton 2.1.0
tritonclient 2.48.0
typer 0.12.3
types-python-dateutil 2.9.0.20240316
typing_extensions 4.11.0
tzdata 2024.1
uri-template 1.3.0
urllib3 2.2.2
uvicorn 0.30.3
uvloop 0.19.0
watchdog 4.0.1
watchfiles 0.22.0
wcwidth 0.2.13
webcolors 24.6.0
webencodings 0.5.1
websocket-client 1.8.0
websockets 11.0.3
wheel 0.43.0
widgetsnbextension 4.0.11
xtuner 0.1.23 /root/tasks/task_L1/xtuner
xxhash 3.4.1
yapf 0.40.2
yarl 1.9.4
zipp 3.19.2
微调过程
- 微调的过程大概可以分为:
- 数据文件准备
- 配置文件准备
- 启动训练
- 模型文件转换
- 模型文件整合
数据文件准备
- 这里是以
指令跟随
的方式进行微调,准备的数据是,用户输入与预期的输出; - 以
json
文件存储数据 - 一条数据的组织形式:
{"conversation":[{"input":"user_input_query...", "output":"expect_output_answer..."}]}
json
文件中,是有多个上述数据组成的列表
配置文件准备
xtuner
config 文件是一个python文件xtuner list-cfg
列出所有的config文件xtuner list-cfg -p internlm
只列出满足-p
所指的模式的配置文件
xtuner copy-cfg target_cfg_name path/to/save
将指定的config文件复制到指定路径下- 编辑修改其中的信息
- 修改预训练模型路径
- 修改训练集的路径
- 修改最多长度和批次大小来充分使用硬件资源
启动训练
xtuner train path/to/config.py
- 训练完成的文件夹
workdirs
中
模型文件转换
- 将训练好的
*.pth
转换为Hugging Face格式文件 xtuner convert pth_to_hf path/to/config.py path/to/pth_model.pth /path/to/hf
自动创建文件夹,存放转换后的模型文件- Hugging Face 模型文件是
.bin
文件
模型文件整合
- 微调完的模型,只是一个
Adapter
,需要把原始模型文件与Adapter
进行合并 xtuner convert merge dir/to/org_LLM_model dir/to/Adapter_model dir/to/save_merge
将原模型与Adapter合并到一个目录下
效果
- 微调后,模型可以回答特定的问题,可以表现的更个性化一些