图文创作,下笔有灵,书生·浦语灵笔 2.0 正式开源!魔搭社区推理&微调最佳实践来啦!

176 阅读5分钟

导读

继1月17日发布书生·浦语2.0(InternLM2)大语言模型之后,上海人工智能实验室(上海AI实验室)近日推出全面升级的图文混合创作大模型书生·浦语灵笔2.0(InternLM-XComposer2),在大模型落地应用的探索上再迈进一步。

书生·浦语 灵笔2.0是在书生·浦语2.0的基础上通过图文拓展训练获得的。得益于InternLM2强大的语言建模能力,浦语灵笔2.0的图文理解和创作能力显著提升,可为用户提供更精准、更个性、更丰富、更专业的图文创作体验,在12项图文能力评测中大幅领先同量级开源模型,在部分维度可比肩国际领先水平。

本次书生·浦语灵笔2.0开源了图文创作大模型(InternLM-XComposer2-7B)和它背后的图文理解与问答模型(InternLM-XComposer2-VL-7B),均提供免费商用。

浦语灵笔2.0可以同时兼顾图文创作和多模态理解能力,得益于浦语灵笔团队提出的全新多模态模型架构Partial-LoRA (P-LoRA)。在此架构下,对于输入的文字词牌(Text Token),P-LoRA使用原本模型结构进行推理;对于图像编码(Image Token),通过额外的P-LoRA参数赋予模型对图像内容的深刻理解。通过上述方式使模型在实现多模态性能领先的同时,高效地保留了语言基座的能力。

添加图片注释,不超过 140 字(可选)

魔搭社区围绕InternLM-XComposer2推出了一站式推理、微调最佳实践教程,供各开发者们参考。

模型链接和下载

书生·浦语 灵笔2.0(internlm-xcomposer2)系列模型现已在魔搭社区(ModelScope)开源,包括:

浦语·灵笔2-7B:www.modelscope.cn/models/Shan…

浦语·灵笔2-视觉问答-7B:www.modelscope.cn/models/Shan…

社区支持直接下载模型的repo:

#模型下载
from modelscope import snapshot_download
model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm-xcomposer2-7b')

模型推理

推理代码:

以internlm-xcomposer2-7b为例,模型推理代码:

import os

os.environ['CUDA_VISIBLE_DEVICES'] = '0'
import torch
from modelscope import AutoTokenizer, AutoModelForCausalLM
from PIL import Image
ckpt_path = "Shanghai_AI_Laboratory/internlm-xcomposer2-7b"
tokenizer = AutoTokenizer.from_pretrained(ckpt_path, trust_remote_code=True)
# `torch_dtype=torch.float16` 可以令模型以 float16 精度加载,否则 transformers 会将模型加载为 float32,导致显存不足
model = AutoModelForCausalLM.from_pretrained(ckpt_path, torch_dtype=torch.float16, trust_remote_code=True, device_map='auto')

model = model.eval() 
img_path_list = [
    './panda.jpg',
    './bamboo.jpeg',
]
images = []
for img_path in img_path_list:
    image = Image.open(img_path).convert("RGB")
    image = model.vis_processor(image)
    images.append(image)
image = torch.stack(images)
query = '<ImageHere> <ImageHere>请根据图片写一篇作文:我最喜欢的小动物。要求:选准角度,确定立意,明确文体,自拟标题。'
with torch.cuda.amp.autocast():
    response, history = model.chat(tokenizer, query=query, image=image, history=[], do_sample=False)
print(response)

推理生成样例:


"""
# 我最喜欢的小动物
我喜欢的动物有很多,有活泼可爱的小狗、美丽高贵的孔雀、凶猛的狮子……但我最喜欢的是憨态可掬的大熊猫。
大熊猫是国宝,它有着黑白相间的毛色,圆滚滚的身体,胖乎乎的手脚,大大的眼睛和短短的尾巴。它的耳朵小小的,像两片树叶;嘴巴又宽又扁,就像一个“月牙”;四肢短小粗壮,走起路来摇摇晃晃,非常可爱。
大熊猫喜欢吃竹子,每天要吃30多斤呢!它们吃竹子的样子很特别,先把竹子咬断,然后抱着竹子啃起来,有时还会把竹子扔到空中再接住继续啃,好像在表演杂技一样。吃饱了以后,它们就懒洋洋地躺在地上睡大觉,真是个名副其实的“大懒猫”啊!
大熊猫不仅爱吃竹子,还爱睡觉。一天中,除了吃饭的时间,其他时间都在睡觉。有时候,它们会爬上树,坐在树枝上呼呼大睡;有时候,它们会找一个阴凉的地方,躺下来美美地睡上一觉。
大熊猫还是一种濒危动物,因为它们的栖息地被破坏,食物减少,数量越来越少。为了保护大熊猫,人们建立了大熊猫保护区,禁止砍伐树木,让大熊猫有一个安全的家。
我喜欢大熊猫,因为它既可爱又珍贵,我希望它能一直生活在我们的地球上,陪伴着我们成长。
"""

模型微调和微调后推理

我们使用SWIFT来对模型进行微调, SWIFT是魔搭社区官方提供的LLM&AIGC模型微调推理框架。

微调代码开源地址: github.com/modelscope/…

我们使用数据集coco-mini-en进行微调. 任务是: 描述图片中的内容。

环境准备:

git clone https://github.com/modelscope/swift.git
cd swift
pip install .[llm]

微调脚本:LoRA


# https://github.com/modelscope/swift/tree/main/examples/pytorch/llm/scripts/internlm_xcomposer2_7b_chat/lora
# Experimental environment: V100, A10, 3090
# 21GB GPU memory
CUDA_VISIBLE_DEVICES=0 \
swift sft \
    --model_type internlm-xcomposer2-7b-chat \
    --sft_type lora \
    --tuner_backend swift \
    --template_type AUTO \
    --dtype AUTO \
    --output_dir output \
    --dataset coco-mini-en \
    --train_dataset_sample -1 \
    --num_train_epochs 1 \
    --max_length 2048 \
    --check_dataset_strategy warning \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 0.05 \
    --lora_target_modules DEFAULT \
    --gradient_checkpointing true \
    --batch_size 1 \
    --weight_decay 0.01 \
    --learning_rate 1e-4 \
    --gradient_accumulation_steps 16 \
    --max_grad_norm 0.5 \
    --warmup_ratio 0.03 \
    --eval_steps 100 \
    --save_steps 100 \
    --save_total_limit 2 \
    --logging_steps 10 \
    --use_flash_attn false \

训练过程也支持本地数据集,需要指定如下参数:

--custom_train_dataset_path xxx.jsonl \
--custom_val_dataset_path yyy.jsonl \

自定义数据集的格式可以参考:

github.com/modelscope/…

微调后推理脚本:

(这里的ckpt_dir需要修改为训练生成的checkpoint文件夹)

# Experimental environment: V100, A10, 3090
CUDA_VISIBLE_DEVICES=0 \
swift infer \
    --ckpt_dir "output/internlm-xcomposer2-7b-chat/vx_xxx/checkpoint-xxx" \
    --load_dataset_config true \
    --max_length 2048 \
    --use_flash_attn false \
    --max_new_tokens 2048 \
    --temperature 0.5 \
    --top_p 0.7 \
    --repetition_penalty 1. \
    --do_sample true \
    --merge_lora_and_save false \

训练后生成样例:

添加图片注释,不超过 140 字(可选)


[QUERY]Picture 1:<img>https://xingchen-data.oss-cn-zhangjiakou.aliyuncs.com/coco/2014/val2014/COCO_val2014_000000492132.jpg</img>
please describe the image.
[OUTPUT] A large airplane hangs from the ceiling of a museum.[UNUSED_TOKEN_145]

[LABELS]People walking in a museum with a airplane hanging from the celing.

添加图片注释,不超过 140 字(可选)


[QUERY]Picture 1:<img>https://xingchen-data.oss-cn-zhangjiakou.aliyuncs.com/coco/2014/val2014/COCO_val2014_000000558642.jpg</img>
please describe the image.
[OUTPUT] A bowl of fruit topped with a pastry and a spoon.[UNUSED_TOKEN_145]

[LABELS]a bowl of fruit and pastry on a table

点击直达模型链接