Llama3-Tutorial之XTuner微调Llama3图片理解多模态

Llama3-Tutorial之XTuner微调Llama3图片理解多模态

基于 Llama3-8B-Instruct 和 XTuner 团队预训练好的 Image Projector 微调自己的多模态图文理解模型 LLaVA。

参考: https://github.com/SmartFlowAI/Llama3-Tutorial

1. 环境、模型、数据准备

1.1 配置环境

使用如下指令便可以安装好一个 python=3.10 pytorch=2.1.2+cu121 的基础环境。

conda create -n llama3 python=3.10
conda activate llama3
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia

接下来我们安装 XTuner。

cd ~
git clone -b v0.1.18 https://github.com/InternLM/XTuner
cd XTuner
pip install -e .[all]

如果已经配置好了环境,在这里也可以选择直接执行 conda activate llama3 以进入环境。

最后我们 clone 本教程仓库。

cd ~
git clone https://github.com/SmartFlowAI/Llama3-Tutorial

1.2 模型准备

1.2.1 准备 Llama3 权重

在微调开始前,我们首先来准备 Llama3-8B-Instruct 模型权重。

  • InternStudio
mkdir -p ~/model
cd ~/model
ln -s /root/share/new_models/meta-llama/Meta-Llama-3-8B-Instruct .
  • 非 InternStudio

我们选择从 OpenXLab 上下载 Meta-Llama-3-8B-Instruct 的权重。

mkdir -p ~/model
cd ~/model
git lfs install
git clone https://code.openxlab.org.cn/MrCat/Llama-3-8B-Instruct.git Meta-Llama-3-8B-Instruct
1.2.2 准备 Visual Encoder 权重

我们接下来准备 Llava 所需要的 openai/clip-vit-large-patch14-336,权重,即 Visual Encoder 权重。

  • InternStudio
mkdir -p ~/model
cd ~/model
ln -s /root/share/new_models/openai/clip-vit-large-patch14-336 .
  • 非 InternStudio

可以访问 https://huggingface.co/openai/clip-vit-large-patch14-336 以进行下载。

1.2.3 准备 Image Projector 权重

然后我们准备 Llava 将要用到的 Image Projector 部分权重。

  • InternStudio
mkdir -p ~/model
cd ~/model
ln -s /root/share/new_models/xtuner/llama3-llava-iter_2181.pth .
  • 非 InternStudio

相关权重可以访问:https://huggingface.co/xtuner/llava-llama-3-8b 以及 https://huggingface.co/xtuner/llava-llama-3-8b-v1_1 。(已经过微调,并非 Pretrain 阶段的 Image Projector)

1.3 数据准备

我们按照 https://github.com/InternLM/Tutorial/blob/camp2/xtuner/llava/xtuner_llava.md 中的教程来准备微调数据。为了让大家可以快速上手,我们选择了使用过拟合的方式快速实现。

可以执行以下代码:

cd ~
git clone https://github.com/InternLM/tutorial -b camp2
python ~/tutorial/xtuner/llava/llava_data/repeat.py \
  -i ~/tutorial/xtuner/llava/llava_data/unique_data.json \
  -o ~/tutorial/xtuner/llava/llava_data/repeated_data.json \
  -n 200

2. 微调过程

2.1 训练启动

我们已经为大家准备好了可以一键启动的配置文件,主要是修改好了模型路径、对话模板以及数据路径。

我们使用如下指令以启动训练:

xtuner train ~/Llama3-Tutorial/configs/llama3-llava/llava_llama3_8b_instruct_qlora_clip_vit_large_p14_336_lora_e1_finetune.py --work-dir ~/llama3_llava_pth --deepspeed deepspeed_zero2

训练过程所需显存约为44447 MiB,在单卡 A100 上训练所需时间为30分钟。

如果是30%的A100资源(24GB显存),使用如下命令启动训练:

xtuner train ~/Llama3-Tutorial/configs/llama3-llava/llava_llama3_8b_instruct_qlora_clip_vit_large_p14_336_lora_e1_finetune.py --work-dir ~/llama3_llava_pth --deepspeed deepspeed_zero2_offload

训练耗时约4.5h:024-05-07 11:21:12到2024-05-07 15:54:06。

llama3-llava-finetune
llama3-llava-finetune

在训练好之后,我们将原始image projector和我们微调得到的image projector都转换为 HuggingFace 格式,为了下面的效果体验做准备。

注意:

训练过程时间较长,建议使用开发机webide进行操作,或者使用vscode ssh连接环境后,结合tmux工具进行。

# 原始image projector转为HuggingFace格式
xtuner convert pth_to_hf ~/Llama3-Tutorial/configs/llama3-llava/llava_llama3_8b_instruct_qlora_clip_vit_large_p14_336_lora_e1_finetune.py \
  ~/model/llama3-llava-iter_2181.pth \
  ~/llama3_llava_pth/pretrain_iter_2181_hf

# 微调得到的image projector转为HuggingFace格式
xtuner convert pth_to_hf ~/Llama3-Tutorial/configs/llama3-llava/llava_llama3_8b_instruct_qlora_clip_vit_large_p14_336_lora_e1_finetune.py \
  ~/llama3_llava_pth/iter_1200.pth \
  ~/llama3_llava_pth/iter_1200_hf

# 合并后的数据如下
(llama3) root@intern-studio-50014188:~# ls -lrt ~/llama3_llava_pth/iter_1200_hf/
total 10
drwxr-xr-x 2 root root 4096 May  7 16:04 llm_adapter
drwxr-xr-x 2 root root 4096 May  7 16:04 visual_encoder_adapter
drwxr-xr-x 2 root root 4096 May  7 16:04 projector
-rw-r--r-- 1 root root 7724 May  7 16:04 xtuner_config.py

2.2 效果体验

使用下面的图片作为测试素材:

image-test
image-test

测试问题:

问题1:Describe this image. 问题2:What is the equipment in the image?

2.2.1 Pretrain模型
export MKL_SERVICE_FORCE_INTEL=1
xtuner chat /root/model/Meta-Llama-3-8B-Instruct \
  --visual-encoder /root/model/clip-vit-large-patch14-336 \
  --llava /root/llama3_llava_pth/pretrain_iter_2181_hf \
  --prompt-template llama3_chat \
  --image /root/tutorial/xtuner/llava/llava_data/test_img/oph.jpg
image-pretrain
image-pretrain

此时可以看到,Pretrain 模型只会为图片打标签,并不能回答问题。

2.2.2 Finetune后的模型
export MKL_SERVICE_FORCE_INTEL=1
xtuner chat /root/model/Meta-Llama-3-8B-Instruct \
  --visual-encoder /root/model/clip-vit-large-patch14-336 \
  --llava /root/llama3_llava_pth/iter_1200_hf \
  --prompt-template llama3_chat \
  --image /root/tutorial/xtuner/llava/llava_data/test_img/oph.jpg
alt

经过 Finetune 后,我们可以发现,模型已经可以根据图片回答我们的问题了。

备注:

遇到的下面问题不影响效果展示。

Error: mkl-service + Intel(R) MKL: MKL_THREADING_LAYER=INTEL is incompatible with libgomp.so.1 library.
        Try to import numpy first or set the threading layer accordingly. Set MKL_SERVICE_FORCE_INTEL to force it.

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832968.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux命令:watch命令

目录 1 watch命令1.1 简介1.2 说明1.3 案例1、重复执行uptime命令2、显示两次命令执行结果差异3、只想查看smile用户的文件4、每隔 n s执行一次命令 总结 1 watch命令 1.1 简介 watch 是一个在 Unix 和 Unix-like 系统(包括 Linux 和 macOS)中常用的命…

【算法】双指针

下面是对双指针算法的题目总结和归纳,有需要借鉴即可。 双指针算法习题目录 1.移动零2.复写零3.快乐数4.盛最多水的容器5.有效三角形的个数6.和为s的两个数7.三数之和8.四数之和 1.移动零 题目链接:LINK 题解: 思路①:暴力求解 …

大宋咨询消费者需求研究问卷如何设计

设计消费者需求研究问卷需要考虑清楚研究目标、问题和目标受众的特点。一个良好的问卷设计能够确保收集到准确、有用的消费者反馈。以下大宋咨询是设计消费者需求研究问卷的一些建议: 1. 确定研究目标和问题: 在设计问卷之前,明确你希望从问…

【备战软考(嵌入式系统设计师)】08 - 多媒体技术信息安全

多媒体技术 这内容比较杂,而且跟咱嵌入式的关系不大,但是软考里会考一些,下面我就结合我已经刷过的一千多道往年真题概括总结一下常考的知识点。 媒体分类 首先媒体分为五类: 感觉媒体,让人直接感觉得到的媒体&…

Java Solon v2.7.6 发布

Java Solon 是什么框架? Java “新的”应用开发框架。开放原子开源基金会,孵化项目。从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态。 追求: 更快、更小、更简单提倡: 克制、简洁…

zTasker v1.88.1一键定时自动化任务

软件介绍 zTasker是一款完全免费支持定时、热键或条件触发的方式执行多种自动化任务的小工具,支持win7-11。其支持超过100种任务类型,50种定时/条件执行方法,而且任务列表可以随意编辑、排列、移动、更改类型,支持任务执行日志&a…

人脸美妆SDK解决方案,自研人脸美妆方案

美妆已经成为视频内容中不可或缺的一部分。从拍摄到编辑,再到直播,美妆效果都能为视频内容增添魅力,吸引更多观众的眼球。为了满足企业对于高质量美妆效果的需求,美摄科技凭借多年的技术积累和创新精神,推出了全新的人…

基于Spring EL表达式处理业务表达式

文章目录 简介Spring EL的常见应用Value处理注解xml中使用 Spring EL表达式基本表达式模板函数表达式 Spring EL定制引用Spring的bean 简介 SpringEL是Spring表达式,功能非常强大。 我们可以能在Value、Cachable、自定义注解中的应用EL表达式,当然这些…

子集II(力扣90)

解题思路&#xff1a;used判断是否出现过&#xff0c;然后遍历就好了 具体代码如下&#xff1a; class Solution { public: vector<vector<int>>result; vector<int>path; void travelBack(vector<int>&nums,int startIndex,vector <bool&…

内容安全(DPI和DFI解析)

内容安全前言&#xff1a; 防火墙的本质其实就是包过滤&#xff0c;我们通常所说的安全设备&#xff08;如&#xff1a;IPS、IDS、AV、WAF&#xff09;的检测重心是应用层。下一代防火墙基于传统防火墙的拓展能力&#xff0c;就是可以将以上的安全设备模块集成在一起&#xff0…

智慧应急三维电子沙盘系统

深圳易图讯科技有限公司&#xff08;www.3dgis.top&#xff09;自主研发的智慧应急三维电子沙盘系统依托大数据融合物联网、云计算、移动互联、5G、BIM、三维GIS等新一代信息技术&#xff0c;集成了高清卫星影像、地形数据、实景三维模型、现场环境数据、物联感知信息、人口、建…

Java作业8-泛型和模板类

编程1 题目 自定义堆栈类 用泛型数组实现自定义堆栈类GenericStack&#xff0c;可处理任意类型数据。 堆栈类中包含三个成员&#xff0c;一为泛型类型数组list&#xff0c;保存栈中元素&#xff0c;一为整型成员length表示数组的长度&#xff0c;一为整型成员count表示当前…

SRC公益漏洞挖掘思路分享

0x00 前言 第一次尝试挖SRC的小伙伴可能会觉得挖掘漏洞非常困难&#xff0c;没有思路&#xff0c;不知道从何下手&#xff0c;在这里我分享一下我的思路 0x01 挖掘思路 确定自己要挖的漏洞&#xff0c;以及该漏洞可能存在的功能点&#xff0c;然后针对性的进行信息收集 inurl…

LeetCode 每日一题 ---- 【741.摘樱桃】

LeetCode 每日一题 ---- 【741.摘樱桃】 741.摘樱桃方法&#xff1a;动态规划 741.摘樱桃 方法&#xff1a;动态规划 这是一道动态规划的题目&#xff0c;enmmmm&#xff0c;依旧是做不出来&#xff0c;尤其是看到困难两个标红的字体&#xff0c;就更不想做了&#xff0c;然后…

一起深度学习(AlexNet网络)

AlexNet神经网络 代码实现&#xff1a; 代码实现&#xff1a; import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(# 采用了11*11的卷积核来捕捉对象&#xff0c;因为原始输入数据比较大#步幅为4 &#xff0c;可减少输出的高度核宽度。#输出通…

【算法刷题day41】Leetcode:343. 整数拆分、96. 不同的二叉搜索树

文章目录 Leetcode 343. 整数拆分解题思路代码总结 Leetcode 96. 不同的二叉搜索树解题思路代码总结 草稿图网站 java的Deque Leetcode 343. 整数拆分 题目&#xff1a;343. 整数拆分 解析&#xff1a;代码随想录解析 解题思路 通过两轮循环&#xff0c;分别找到每个数的最大…

FineReport高频面试题及参考答案

FineReport是一款利用什么语言开发的报表工具&#xff1f; FineReport是一款基于Java语言开发的报表工具。Java是一种广泛使用的编程语言&#xff0c;特别适合于跨平台的软件开发。FineReport利用Java语言的诸多优势&#xff0c;如稳定性、安全性、可移植性和强大的网络功能&a…

Compose 状态管理

文章目录 Compose 状态管理概述使用MutableStaterememberStatelessComposable & StatefulComposable状态提升rememberSaveable支持parceable不支持parceable 使用ViewModelViewModelProvider.Factory 使用Flow Compose 状态管理 概述 当应用程序的状态发生变化时&#xf…

(40)4.30数据结构(队列)

1.队列的基本概念 2.队列的顺序 #define MaxSize 10 #define ElemType int typedef struct { ElemType data[MaxSize]; int front, rear; }SqQueue;//1.初始化操作 void InitQueue(SqQueue& Q) { //初始化 队头&#xff0c;队尾指针指向0 Q.rear Q.fron…