Qwen变体新成员加一,英伟达训练 NVLM-D-72B 视觉大模型

在这里插入图片描述
今天(2024 年 9 月 17 日),我们推出了前沿级多模态大语言模型(LLM)系列 NVLM 1.0,它在视觉语言任务上取得了最先进的结果,可与领先的专有模型(如 GPT-4o)和开放存取模型(如 Llama 3-V 405B 和 InternVL 2)相媲美。值得注意的是,NVLM 1.0 在多模态训练后的纯文本性能比其 LLM 骨干模型有所提高。

在此版本库中,我们将向社区开源 NVLM-1.0-D-72B(纯解码器架构)、纯解码器模型权重和代码。

我们使用传统的 Megatron-LM 训练我们的模型,并将代码库调整为 Huggingface,以实现模型托管、可重现性和推理。我们观察到 Megatron 代码库和 Huggingface 代码库之间存在数值差异,这些差异在预期的变化范围之内。我们提供 Huggingface 代码库和 Megatron 代码库的结果,以便与其他模型进行重现和比较。

视觉语言基准

BenchmarkMMMU (val / test)MathVistaOCRBenchAI2DChartQADocVQATextVQARealWorldQAVQAv2
NVLM-D 1.0 72B (Huggingface)58.7 / 54.965.285294.286.092.682.669.585.4
NVLM-D 1.0 72B (Megatron)59.7 / 54.665.285394.286.092.682.169.785.4
Llama 3.2 90B60.3 / -57.3-92.385.590.1--78.1
Llama 3-V 70B60.6 / ---93.083.292.283.4-79.1
Llama 3-V 405B64.5 / ---94.185.892.684.8-80.2
InternVL2-Llama3-76B55.2 / -65.583994.888.494.184.472.2-
GPT-4V56.8 / 55.749.964578.278.588.478.061.477.2
GPT-4o69.1 / -63.873694.285.792.8---
Claude 3.5 Sonnet68.3 / -67.778894.790.895.2---
Gemini 1.5 Pro (Aug 2024)62.2 / -63.975494.487.293.178.770.480.2

纯文字基准

TasksBackbone LLMMMLUGSM8KMATHHumanEvalAvg. Accuracy
Proprietary
GPT-4.0N/A88.7-76.690.2-
Gemini Pro 1.5 (Aug 2024)N/A85.990.867.784.182.1
Claude 3.5 SonnetN/A88.796.471.192.087.0
Open LLM
(a) Nous-Hermes-2-Yi-34BN/A75.578.621.843.354.8
(b) Qwen-72B-InstructN/A82.391.159.786.079.8
(c) Llama-3-70B-InstructN/A82.093.051.081.776.6
(d) Llama-3.1-70B-InstructN/A83.695.168.080.581.8
(e) Llama-3.1-405B-InstructN/A87.396.873.889.086.7
Open Multimodal LLM
VILA-1.5 40B(a)73.367.516.834.1🥶 47.9 (-6.9)
LLaVA-OneVision 72B(b)80.689.949.274.4🥶 73.5 (-6.3)
InternVL-2-Llama3-76B(c)78.587.142.571.3🥶 69.9 (-6.7)
*Llama 3-V 70B(d)83.695.168.080.5🙂 81.8 (0)
*Llama 3-V 405B(e)87.396.873.889.0🙂 86.7 (0)
NVLM-D 1.0 72B (Megatron)(b)82.092.973.188.4🥳 84.1 (+4.3)
NVLM-D 1.0 72B (Huggingface)(b)81.793.273.189.0🥳 84.3 (+4.5)

在将 Megatron checkpoint 转换为 Huggingface 时,我们调整了 InternVL 代码库,以支持 HF 中的模型加载和多 GPU 推理。在将 Qwen2.5-72B-Instruct 中的标记符转换为 Huggingface 时,我们还使用了 Qwen2.5-72B-Instruct 中的标记符,因为它包含用于视觉任务的额外特殊标记符,例如 <|vision_pad|>。我们在 Qwen2-72B-Instruct 纯文本模型和 InternViT-6B-448px-V1-5 ViT 模型的基础上,利用大规模高质量多模态数据集训练 NVLM-1.0-D-72B。有关训练代码,请参阅 Megatron-LM(即将发布)。

准备环境

我们在 Dockerfile 中提供了一个用于复制的 docker 生成文件。

该 docker 映像基于 nvcr.io/nvidia/pytorch:23.09-py3。

注:我们注意到,不同的转换器版本/CUDA 版本/docker 版本会导致基准数略有不同。我们建议使用上述 Dockerfile 进行精确还原。

模型加载

import torch
from transformers import AutoModelpath = "nvidia/NVLM-D-72B"
model = AutoModel.from_pretrained(path,torch_dtype=torch.bfloat16,low_cpu_mem_usage=True,use_flash_attn=False,trust_remote_code=True).eval()

多显卡

import torch
import math
from transformers import AutoModeldef split_model():device_map = {}world_size = torch.cuda.device_count()num_layers = 80# Since the first GPU will be used for ViT, treat it as half a GPU.num_layers_per_gpu = math.ceil(num_layers / (world_size - 0.5))num_layers_per_gpu = [num_layers_per_gpu] * world_sizenum_layers_per_gpu[0] = math.ceil(num_layers_per_gpu[0] * 0.5)layer_cnt = 0for i, num_layer in enumerate(num_layers_per_gpu):for j in range(num_layer):device_map[f'language_model.model.layers.{layer_cnt}'] = ilayer_cnt += 1device_map['vision_model'] = 0device_map['mlp1'] = 0device_map['language_model.model.tok_embeddings'] = 0device_map['language_model.model.embed_tokens'] = 0device_map['language_model.output'] = 0device_map['language_model.model.norm'] = 0device_map['language_model.lm_head'] = 0device_map[f'language_model.model.layers.{num_layers - 1}'] = 0return device_mappath = "nvidia/NVLM-D-72B"
device_map = split_model()
model = AutoModel.from_pretrained(path,torch_dtype=torch.bfloat16,low_cpu_mem_usage=True,use_flash_attn=False,trust_remote_code=True,device_map=device_map).eval()

推理

import torch
from transformers import AutoTokenizer, AutoModel
import math
from PIL import Image
import torchvision.transforms as T
from torchvision.transforms.functional import InterpolationModedef split_model():device_map = {}world_size = torch.cuda.device_count()num_layers = 80# Since the first GPU will be used for ViT, treat it as half a GPU.num_layers_per_gpu = math.ceil(num_layers / (world_size - 0.5))num_layers_per_gpu = [num_layers_per_gpu] * world_sizenum_layers_per_gpu[0] = math.ceil(num_layers_per_gpu[0] * 0.5)layer_cnt = 0for i, num_layer in enumerate(num_layers_per_gpu):for j in range(num_layer):device_map[f'language_model.model.layers.{layer_cnt}'] = ilayer_cnt += 1device_map['vision_model'] = 0device_map['mlp1'] = 0device_map['language_model.model.tok_embeddings'] = 0device_map['language_model.model.embed_tokens'] = 0device_map['language_model.output'] = 0device_map['language_model.model.norm'] = 0device_map['language_model.lm_head'] = 0device_map[f'language_model.model.layers.{num_layers - 1}'] = 0return device_mapIMAGENET_MEAN = (0.485, 0.456, 0.406)
IMAGENET_STD = (0.229, 0.224, 0.225)def build_transform(input_size):MEAN, STD = IMAGENET_MEAN, IMAGENET_STDtransform = T.Compose([T.Lambda(lambda img: img.convert('RGB') if img.mode != 'RGB' else img),T.Resize((input_size, input_size), interpolation=InterpolationMode.BICUBIC),T.ToTensor(),T.Normalize(mean=MEAN, std=STD)])return transformdef find_closest_aspect_ratio(aspect_ratio, target_ratios, width, height, image_size):best_ratio_diff = float('inf')best_ratio = (1, 1)area = width * heightfor ratio in target_ratios:target_aspect_ratio = ratio[0] / ratio[1]ratio_diff = abs(aspect_ratio - target_aspect_ratio)if ratio_diff < best_ratio_diff:best_ratio_diff = ratio_diffbest_ratio = ratioelif ratio_diff == best_ratio_diff:if area > 0.5 * image_size * image_size * ratio[0] * ratio[1]:best_ratio = ratioreturn best_ratiodef dynamic_preprocess(image, min_num=1, max_num=12, image_size=448, use_thumbnail=False):orig_width, orig_height = image.sizeaspect_ratio = orig_width / orig_height# calculate the existing image aspect ratiotarget_ratios = set((i, j) for n in range(min_num, max_num + 1) for i in range(1, n + 1) for j in range(1, n + 1) ifi * j <= max_num and i * j >= min_num)target_ratios = sorted(target_ratios, key=lambda x: x[0] * x[1])# find the closest aspect ratio to the targettarget_aspect_ratio = find_closest_aspect_ratio(aspect_ratio, target_ratios, orig_width, orig_height, image_size)# calculate the target width and heighttarget_width = image_size * target_aspect_ratio[0]target_height = image_size * target_aspect_ratio[1]blocks = target_aspect_ratio[0] * target_aspect_ratio[1]# resize the imageresized_img = image.resize((target_width, target_height))processed_images = []for i in range(blocks):box = ((i % (target_width // image_size)) * image_size,(i // (target_width // image_size)) * image_size,((i % (target_width // image_size)) + 1) * image_size,((i // (target_width // image_size)) + 1) * image_size)# split the imagesplit_img = resized_img.crop(box)processed_images.append(split_img)assert len(processed_images) == blocksif use_thumbnail and len(processed_images) != 1:thumbnail_img = image.resize((image_size, image_size))processed_images.append(thumbnail_img)return processed_imagesdef load_image(image_file, input_size=448, max_num=12):image = Image.open(image_file).convert('RGB')transform = build_transform(input_size=input_size)images = dynamic_preprocess(image, image_size=input_size, use_thumbnail=True, max_num=max_num)pixel_values = [transform(image) for image in images]pixel_values = torch.stack(pixel_values)return pixel_valuespath = "nvidia/NVLM-D-72B"
device_map = split_model()
model = AutoModel.from_pretrained(path,torch_dtype=torch.bfloat16,low_cpu_mem_usage=True,use_flash_attn=False,trust_remote_code=True,device_map=device_map).eval()print(model)tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True, use_fast=False)
generation_config = dict(max_new_tokens=1024, do_sample=False)# pure-text conversation
question = 'Hello, who are you?'
response, history = model.chat(tokenizer, None, question, generation_config, history=None, return_history=True)
print(f'User: {question}\nAssistant: {response}')# single-image single-round conversation
pixel_values = load_image('path/to/your/example/image.jpg', max_num=6).to(torch.bfloat16)
question = '<image>\nPlease describe the image shortly.'
response = model.chat(tokenizer, pixel_values, question, generation_config)
print(f'User: {question}\nAssistant: {response}')

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

低代码赋能汽车制造产业链场景系列

当前汽车行业数字化智能化转型浪潮下&#xff0c;整车及其上下游产业链的协同创新正变得至关重要。头部车企与上下游供应链企业正逐步解决在生产管理、业务互通、系统集成等方面的痛点与挑战。电动化、智能化、网联化作为汽车产业的三大趋势&#xff0c;正共同推动未来汽车产业…

Web自动化Demo-Kotlin+Selenium

1.新建工程 打开Aqua&#xff0c;点击New Project选中Kotlin&#xff0c;配置如下&#xff1a; 然后在build.gradle.kts文件中添加依赖 plugins {kotlin("jvm") version "1.9.23" }group "org.example" version "1.0-SNAPSHOT"rep…

数据分析:宏基因组群落TOPOSCORE拓扑结构打分

文章目录 介绍数据TOPOSCORE算法SCORE计算TOPOSCORE实操tp_helper.R导入数据生存分析Fisher精确检验聚类分析SIG定义Toposcoring 分数计算Akkermansia muciniphila的考虑TOPOSCORE的验证总结系统信息介绍 研究背景:肠道微生物群对癌症患者对免疫检查点抑制剂(ICIs)的临床反…

<Rust>iced库(0.13.1)学习之部件(三十一):picklist部件的使用及可变style设置

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 注:新版本已更新为0.13 概述 这是本专栏的第三十一篇,主要说明下…

基于springboot vue地方废物回收机构管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

新生培训 day1 C语言基础 顺序 分支 循环 数组 字符串 函数

比赛地址 b牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ C语言数据类型 字符 整型数 int 2e9 long long 9e18 浮点数 代码示例 /** Author: Dduo * Date: 2024-10-8* Description: 新生培训day1 */ #include <stdio.h>int main() {// 定义变量in…

论文速读:基于渐进式转移的无监督域自适应舰船检测

这篇文章的标题是《Unsupervised Domain Adaptation Based on Progressive Transfer for Ship Detection: From Optical to SAR Images》基于渐进式转移的无监督域自适应舰船检测:从光学图像到SAR图像&#xff0c;作者是Yu Shi等人。文章发表在IEEE Transactions on Geoscience…

TDesign - 腾讯出品的企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序,适合开发企业中后台和移动应用

TDesing 发展越来越好了&#xff0c;出了好几套组件库&#xff0c;很成熟稳定了&#xff0c;新项目完全可以考虑使用。 早在2021年&#xff0c;腾讯的 TDesing 刚发布不久&#xff0c;我就写了一篇简短的文章来介绍&#xff0c;当时主要关注的是 TDesign 的 Vue 组件库和用来搭…

计算机基础知识:计算机中丢失 msvcr110.dll怎么修复?

1. msvcp110.dll 介绍 1.1 定义&#xff1a;Microsoft Visual C 2012的一部分 msvcp110.dll是Microsoft Visual C 2012 Redistributable Package的一部分&#xff0c;这是一个运行时库文件&#xff0c;包含了Microsoft Visual C 2012编译器所构建程序所需的函数和资源。 1.2…

大数据ETL数据提取转换和加载处理

什么是 ETL&#xff1f; 提取转换加载&#xff08;英语&#xff1a;Extract, transform, load&#xff0c;简称ETL&#xff09;&#xff0c;用来描述将资料从来源端经过抽取、转置、加载至目的端的过程。ETL一词较常用在数据仓库&#xff0c;但其对象并不限于数据仓库。 ETL&…

Ansys Speos | 智能手环心率传感器仿真

在本例中&#xff0c;我们将使用Ansys Speos和Ansys Motion模拟具有动态运动的智能带光学心率传感器。通过Ansys Motion模拟智能手环的位移和人体手腕组织的变形&#xff0c;然后将位移和变形数据导入Speos&#xff0c;最后在Ansys Speos中&#xff0c;用模拟智能手环位移和人体…

视频合并与封面添加:打造独特视频作品的指南

在视频创作领域&#xff0c;将多个视频片段合并成多个完整的作品&#xff0c;并为其添加统一的封面图片&#xff0c;是提升视频专业度和吸引力的有效方法。 1打开软件&#xff0c;在界面功能栏里切换到“嵌套合并”版块上 2在设置视频封面中选择“使用随机封面”&#xff0c;并…

二叉树——左叶子节点之和

以目前所学的知识而言&#xff0c;对于二叉树涉及递归相关的问题&#xff0c;一般需要设定两个返回条件&#xff1a; 1、二叉树左子树或右子树遍历完后&#xff0c;即节点为NULL时需要返回。 2、当前节点满足题目要求时&#xff0c;需要对相应参数做出改变&#xff0c;或是直…

同城美容美发一站式到店上门服务系统小程序源码

&#x1f486;‍♀️同城美容美发一站式到店上门服务&#xff1a;美丽&#xff0c;就该如此便捷&#x1f487;‍♂️ &#x1f3e0;一、同城服务&#xff0c;触手可及的美丽 在繁忙的都市生活中&#xff0c;我们总是在寻找那份触手可及的美丽。而“同城美容美发一站式到店上门…

OpenCV高级图形用户界面(1)创建滑动条函数createTrackbar()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 创建一个滑动条并将其附加到指定的窗口。 该函数 createTrackbar 创建一个具有指定名称和范围的滑动条&#xff08;滑块或范围控制&#xff09;…

0基础做微信扫码点餐小程序,开发一款餐饮点餐软件收银系统

扫码点餐小程序收银系统是一种现代化的餐饮管理工具&#xff0c;它结合了移动互联网技术和餐饮业务需求&#xff0c;为餐厅提供了高效、便捷的点餐、收银和管理服务。以下是对该系统的详细介绍和功能解析&#xff1a; 一、系统介绍 扫码点餐小程序收银系统通常由系统后台、手…

JS设计模式之职责链模式:优雅地处理请求流程

一. 前言 在前端开发中&#xff0c;我们经常会遇到需要按照一定的顺序处理一系列请求或操作的情况&#xff0c;如果将每一步处理都硬编码在一起&#xff0c;会导致代码臃肿&#xff0c;可维护性和可扩展性都会大大降低。而职责链模式恰好提供了一种优雅的解决方案。 无论你是…

大模型面试八股+答案,LLM-offer手到擒来!

你是否也曾为面试大模型八股文而苦恼&#xff1f;别担心&#xff01;今天我就来给你分享一些绝妙的面试技巧&#xff0c;让你轻松应对&#xff01; &#x1f50d; 第一关&#xff1a;了解题目 首先&#xff0c;一定要仔细阅读题目&#xff0c;理解清楚每个要求。明确问题的关键…

字母数字图像分割系统源码&数据集分享

字母数字图像分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-Faster-EMA&#xff06;yolov8-seg-C2f-DiverseBranchBlock等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目…

硬件-PCB-叠层设计(四层板六层板)

文章目录 一&#xff1a;简介二&#xff1a;多层电路板结构三 PCB叠层设计的内容3.1 叠层设计的基本原则3.2 叠层设计的准备工作 四 六层PCB叠层方案介绍4.1 介绍常见的六层叠层结构并分析其优缺点 五 方案选择5.1 方案一&#xff1a;S-G-S-S-P-S5.2 方案二&#xff1a;S-S-G-P…