赞
踩
大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容
从0起步,扬帆起航。
首先,开源地址:
https://github.com/QwenLM/Qwen-VL
Qwen-VL 是阿里云研发的大规模视觉语言模型(Large Vision Language Model, LVLM)。Qwen-VL 可以以图像、文本、检测框作为输入,并以文本和检测框作为输出。
Qwen-VL 系列模型的特点包括:
多语言对话模型:天然支持英文、中文等多语言对话,端到端支持图片里中英双语的长文本识别;
多图交错对话:支持多图输入和比较,指定图片问答,多图文学创作等;
开放域目标定位:通过中文开放域语言表达进行检测框标注;
细粒度识别和理解:448分辨率可以提升细粒度的文字识别、文档问答和检测框标注。
微调训练的显存占用 LoRA (Base) 2.4s/it 37.3GB LoRA (Chat) 2.3s/it 23.6GB
Q-LoRA 4.5s/it 17.2GB 推理阶段的显存占用 BF16 28.87 22.60GB Int4 37.79 11.82GB
系统配置:
curl -O https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh // 从官网下载安装脚本
bash Anaconda3-2019.03-Linux-x86_64.sh // 阅读协议确认安装,安装完成后再输入yes以便不需要手动将Anaconda添加到PATH
conda create -n qwen_vl python=3.10 // 安装虚拟环境, python 3.10及以上版本
conda activate qwen_vl // 激活虚拟环境
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=11.8 -c pytorch -c nvidia // pytorch 2.0及以上版本, 建议使用CUDA 11.4及以上
python环境配置:
pip3 install -r requirements.txt
pip3 install -r requirements_openai_api.txt
pip3 install -r requirements_web_demo.txt
pip3 install deepspeed
pip3 install peft
pip3 install optimum
pip3 install auto-gptq
pip3 install modelscope -U
强调一下,此处requirements等文件来源github开源地址,如图:
模型下载:
import os
# 使用抱脸镜像
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
from modelscope import snapshot_download
from transformers import AutoModelForCausalLM, AutoTokenizer
# 其中版本v1.1.0支持INT4、INT8的在线量化,其余版本不支持
model_id = 'qwen/Qwen-VL-Chat'
revision = 'v1.0.0'
# 下载模型到指定目录
local_dir = "/root/autodl-tmp/Qwen-VL-Chat"
snapshot_download(repo_id=model_id, revision=revision, local_dir=local_dir)
当然可以从魔塔、抱脸等地手动下载:
https://huggingface.co/Qwen/Qwen-VL-Chat
https://huggingface.co/Qwen/Qwen-VL-Chat-Int4
https://modelscope.cn/models/qwen/Qwen-VL-Chat/summary
# 启动命令,局域网访问
python web_demo_mm.py --server-name 0.0.0.0
或
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfig
import torch
torch.manual_seed(1234)
# 请注意:根据显存选择配置,分词器默认行为已更改为默认关闭特殊token攻击防护。
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-VL-Chat", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-VL-Chat", device_map="auto", trust_remote_code=True, bf16=True, fp16=Flase).eval()
# 第一轮对话
query = tokenizer.from_list_format([
{'image': 'https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg'}, # Either a local path or an url
{'text': '这是什么?'},
])
response, history = model.chat(tokenizer, query=query, history=None)
print(response)
# 图中是一名女子在沙滩上和狗玩耍,旁边是一只拉布拉多犬,它们处于沙滩上。
# 第二轮对话
response, history = model.chat(tokenizer, '框出图中击掌的位置', history=history)
print(response)
# <ref>击掌</ref><box>(536,509),(588,602)</box>
finetune.py这个脚本供用户实现在自己的数据上进行微调的功能,以接入下游任务。
微调数据格式参考如下:
[
{
"id": "identity_0",
"conversations": [
{
"from": "user",
"value": "你好"
},
{
"from": "assistant",
"value": "我是Qwen-VL,一个支持视觉输入的大模型。"
}
]
},
{
"id": "identity_1",
"conversations": [
{
"from": "user",
"value": "Picture 1: <img>https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg</img>\n图中的狗是什么品种?"
},
{
"from": "assistant",
"value": "图中是一只拉布拉多犬。"
},
{
"from": "user",
"value": "框出图中的格子衬衫"
},
{
"from": "assistant",
"value": "<ref>格子衬衫</ref><box>(588,499),(725,789)</box>"
}
]
},
{
"id": "identity_2",
"conversations": [
{
"from": "user",
"value": "Picture 1: <img>assets/mm_tutorial/Chongqing.jpeg</img>\nPicture 2: <img>assets/mm_tutorial/Beijing.jpeg</img>\n图中都是哪"
},
{
"from": "assistant",
"value": "第一张图片是重庆的城市天际线,第二张图片是北京的天际线。"
}
]
}
]
JSON文件,其中每个样本对应一个字典,包含id和conversation,其中后者为一个列表。
为针对多样的VL任务,增加了一下的特殊tokens: .
对于带图像输入的内容可表示为 Picture id: img_path\n{your prompt},其中id表示对话中的第几张图片。"img_path"可以是本地的图片或网络地址。
对话中的检测框可以表示为(x1,y1),(x2,y2),其中 (x1, y1) 和(x2, y2)分别对应左上角和右下角的坐标,并且被归一化到[0, 1000)的范围内. 检测框对应的文本描述也可以通过text_caption表示。
# 单卡训练
sh finetune/finetune_lora_single_gpu.sh
# 分布式训练
sh finetune/finetune_lora_ds.sh
其中
#!/bin/bash
export CUDA_DEVICE_MAX_CONNECTIONS=1
DIR=`pwd`
MODEL="/root/autodl-tmp/Qwen-VL-Chat"
DATA="/root/autodl-tmp/data.json"
export CUDA_VISIBLE_DEVICES=0
python3 finetune.py \
--model_name_or_path $MODEL \
--data_path $DATA \
--bf16 True \
--fix_vit True \
--output_dir output_qwen \
--num_train_epochs 5 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 8 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 1000 \
--save_total_limit 10 \
--learning_rate 1e-5 \
--weight_decay 0.1 \
--adam_beta2 0.95 \
--warmup_ratio 0.01 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--report_to "none" \
--model_max_length 600 \
--lazy_preprocess True \
--gradient_checkpointing \
--use_lora
需要修改脚本中的MODEL、DATA参数,将其换成实际的模型和数据地址
需要修改脚本里的model_max_length参数,默认是2048(需要27.3GB的显存),一般调小
模型合并及推理
from peft import AutoPeftModelForCausalLM
model = AutoPeftModelForCausalLM.from_pretrained(
path_to_adapter, # path to the output directory
device_map="auto",
trust_remote_code=True
).eval()
merged_model = model.merge_and_unload()
# max_shard_size and safe serialization are not necessary.
# They respectively work for sharding checkpoint and save the model to safetensors
merged_model.save_pretrained(new_model_directory, max_shard_size="2048MB", safe_serialization=True)
注:本文多引用
https://zhuanlan.zhihu.com/p/701818093内容
https://github.com/ssbuild/qwen_vl_finetuning内容
部分内容为调整、新增、原创
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。