作为魔搭开源社区,很开心第一时间体验到了通义千问的多模态的能力,相比于此前的模型,Qwen-VL除了基本的图文识别、描述、问答、对话能力之外,还新增了像视觉定位、图像中文字理解等重要基础能力,Qwen-VL可以接受图像,多语言文本作为输入,并输出图像或者文本。
目前,通义千问开源了 Qwen-VL 系列的两个模型:
- Qwen-VL: Qwen-VL 以 Qwen-7B 的预训练模型作为语言模型的初始化,并以ViT-bigG作为视觉编码器的初始化,中间加入单层随机初始化的 cross-attention,经过约1.5B的图文数据训练得到。最终图像输入分辨率为448。
- Qwen-VL-Chat: 在 Qwen-VL 的基础上,通义千问团队使用对齐机制打造了基于大语言模型的视觉AI助手Qwen-VL-Chat,可以让开发者快速搭建具备多模态能力的对话应用。
社区小助理尝试理解的Qwen-VL是如何工作的:
在上面图片中,输出“击掌”的检测框比输出人or狗的检测框更难,因为“击掌”是泛化出来的自然语言域的通用检测,训练集中没有。“人”和“狗”一般在检测训练集中大量存在,由此可见Qwen-VL较强的泛化能力。
同时社区也第一时间适配和通义千问多模态的推理,量化,微调
环境建议
- python 3.8及以上版本
- pytorch 1.12及以上版本,推荐2.0及以上版本
- 建议使用CUDA 11.4及以上(GPU用户需考虑此选项)
使用步骤
本文在ModelScope的限时免费的Notebook的环境(这里以PAI-DSW为例)配置下运行 (可单卡运行, 量化前显存要求22G,量化后大概是10G)
服务器连接与环境准备
1、进入ModelScope首页:modelscope.cn,进入我的Notebook
2、选择GPU环境,进入PAI-DSW在线开发环境
3、新建Notebook
同时社区支持在线体验通义千问多模态的能力:
模型零代码创空间体验地址:https://modelscope.cn/models/qwen/Qwen-VL-Chat
效果展示:
视觉问答:
文字理解
图片理解
数学推理
多图理解
Qwen系列模型现已在ModelScope社区开源,包括:
Qwen-VL-Chat
模型链接:https://modelscope.cn/models/qwen/Qwen-VL-Chat
Qwen-VL
模型链接:https://modelscope.cn/models/qwen/Qwen-VL
社区支持直接下载模型的repo:- from modelscope.hub.snapshot_download import snapshot_download
- model_dir = snapshot_download('Qwen-VL-Chat', 'v1.0.0')
复制代码 模型推理
依赖项:
- pip install modelscope -U
- pip install transformers accelerate tiktoken -U
- pip install einops transformers_stream_generator -U
- pip install "pillow==9.*" -U
- pip install torchvision
- pip install matplotlib -U
复制代码 推理代码:
- from modelscope import (
- snapshot_download, AutoModelForCausalLM, AutoTokenizer, GenerationConfig
- )
- import torch
- model_id = 'qwen/Qwen-VL-Chat'
- revision = 'v1.0.0'
- model_dir = snapshot_download(model_id, revision=revision)
- torch.manual_seed(1234)
- # 请注意:分词器默认行为已更改为默认关闭特殊token攻击防护。
- tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
- if not hasattr(tokenizer, 'model_dir'):
- tokenizer.model_dir = model_dir
- # 打开bf16精度,A100、H100、RTX3060、RTX3070等显卡建议启用以节省显存
- # model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, bf16=True).eval()
- # 打开fp16精度,V100、P100、T4等显卡建议启用以节省显存
- model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True, fp16=True).eval()
- # 使用CPU进行推理,需要约32GB内存
- # model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="cpu", trust_remote_code=True).eval()
- # 默认使用自动模式,根据设备自动选择精度
- # model = AutoModelForCausalLM.from_pretrained(model_dir, device_map="auto", trust_remote_code=True).eval()
- # 可指定不同的生成长度、top_p等相关超参
- model.generation_config = GenerationConfig.from_pretrained(model_dir, trust_remote_code=True)
- # 第一轮对话 1st dialogue turn
- query = tokenizer.from_list_format([
- {'image': 'https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg'},
- {'text': '这是什么'},
- ])
- response, history = model.chat(tokenizer, query=query, history=None)
- print(response)
- # 图中是一名年轻女子在沙滩上和她的狗玩耍,狗的品种是拉布拉多。她们坐在沙滩上,狗的前腿抬起来,与人互动。
- # 第二轮对话 2st dialogue turn
- response, history = model.chat(tokenizer, '输出击掌的检测框', history=history)
- print(response)
- # <ref>&#34;击掌&#34;</ref><box>(211,412),(577,891)</box>
- image = tokenizer.draw_bbox_on_latest_picture(response, history)
- image.save(&#39;output_chat.jpg&#39;)
复制代码 资源消耗(fp推理22G显存,量化后10G左右):
模型微调和微调后推理
微调代码开源地址: https://github.com/modelscope/swift/blob/main/examples/pytorch/llm
clone swift仓库并安装swift- git clone https://github.com/modelscope/swift.git
- cd swift
- pip install .
- cd examples/pytorch/llm
复制代码 模型微调脚本 (qlora)- # 14GB VRAM
- CUDA_VISIBLE_DEVICES=0 \
- python src/llm_sft.py \
- --model_type qwen-vl-chat \
- --sft_type lora \
- --template_type chatml \
- --dtype bf16 \
- --output_dir runs \
- --dataset coco-en \
- --dataset_sample 20000 \
- --num_train_epochs 1 \
- --max_length 1024 \
- --quantization_bit 4 \
- --bnb_4bit_comp_dtype bf16 \
- --lora_rank 64 \
- --lora_alpha 16 \
- --lora_dropout_p 0.05 \
- --lora_target_modules ALL \
- --batch_size 1 \
- --weight_decay 0. \
- --learning_rate 1e-4 \
- --gradient_accumulation_steps 16 \
- --max_grad_norm 0.5 \
- --warmup_ratio 0.03 \
- --eval_steps 50 \
- --save_steps 50 \
- --save_total_limit 2 \
- --logging_steps 10 \
- --use_flash_attn false \
- --push_to_hub false \
- --hub_model_id qwen-vl-chat-qlora \
- --hub_private_repo true \
- --hub_token &#39;your-sdk-token&#39; \
复制代码 模型微调后的推理脚本- # 10G
- CUDA_VISIBLE_DEVICES=0 \
- python src/llm_infer.py \
- --model_type qwen-vl-chat \
- --sft_type lora \
- --template_type chatml \
- --dtype bf16 \
- --ckpt_dir &#34;runs/qwen-vl-chat/vx_xxx/checkpoint-xxx&#34; \
- --eval_human false \
- --dataset coco-en \
- --dataset_sample 20000 \
- --quantization_bit 4 \
- --bnb_4bit_comp_dtype bf16 \
- --max_new_tokens 1024 \
- --temperature 0.9 \
- --top_k 50 \
- --top_p 0.9 \
- --do_sample true \
复制代码 微调的可视化结果
训练损失:
评估损失
资源消耗:
qwen-vl-chat使用qlora的方式训练的显存占用如下,大约在14G. (quantization_bit=4, batch_size=1, max_length=1024)
欢迎大家来魔搭社区体验通义千问多模态模型,并尝试用社区的微调训练框架探索多模态模型的定制化,行业化! |