使用LLaVA-NeXT和NNCF掌握多模式人工智能

2024年05月23日 由 alex 发表 421 0

了解 LLaVA-NeXT

LLaVA-NeXT(大型语言和视觉助手--下一代)是一个复杂的多模态模型,设计用于对图像进行高级语言推理。与擅长文档可视化问题解答(DocVQA)的 Pix2Struct 不同,LLaVA-NeXT 将大型语言模型(LLM)的强大功能与 CLIP 等视觉编码器相结合,创建了一个通用的视觉助手。该模型可以根据语言和图像指令完成各种实际任务,因此适合创建复杂的多模态聊天机器人。


LLaVA-NeXT 引入了改进的 OCR 功能和扩展的世界知识,标志着图像高级语言推理的重大突破。其复杂的结构需要详细的量化步骤,以便使用 OpenVINO™ 和 NNCF 进行优化。在本文中,我们将探讨 LLaVA-NeXT 多模态聊天机器人笔记本,并学习如何转换和优化 LLaVA-NeXT 模型以创建多模态聊天机器人。此外,我们还将探索如何在 LLM 部分应用有状态转换以及使用 NNCF 进行权重压缩和量化等模型优化技术。


在 OpenVINO™ 笔记本中逐步实现:


1. 安装前提条件:

首先设置开发环境以使用 OpenVINO™ 工具包。这包括安装 OpenVINO™ 工具包以及支持 LLaVA-NeXT 模型的必要库和依赖项。


2. 模型下载和加载:

LLaVA-NeXT 专为复杂的语言和视觉任务而设计,需要详细的定制方法。它由多个组件组成,在优化过程中需要单独关注:


  • 图像编码器: 管理视觉输入,通常基于复杂的视觉模型(如 CLIP)。


  • 输入嵌入: 负责有效嵌入输入文本。


  • 语言模型: 根据对视觉和文本数据的综合理解生成响应。


对于复杂的语言和视觉任务,LLaVA-NeXT 集成了需要精确模型处理的复杂功能。以下是加载该模型的方法:


1. from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
2. processor = LlavaNextProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
3. model = LlavaNextForConditionalGeneration.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")


该代码片段可正确加载 LLaVA-NeXT 模型,确保其从语言处理到图像理解的所有组件都已加载,并为进一步的转换和优化过程做好准备。


3. 将模型转换为 OpenVINO™ IR:

由于 LLaVA-NeXT 模型结构复杂,因此需要采用细致入微的方法。这涉及到对其三个主要组件--图像编码器、输入嵌入和语言模型--的单独优化。OpenVINO™ 使用 OpenVINO™ 模型转换 API 将 PyTorch 模型转换为 OpenVINO IR,从而支持从 PyTorch 模型的转换。ov.convert_model 函数接受一个原始 PyTorch 模型实例和一个用于跟踪的输入示例,返回一个可保存用于部署的 ov.Model。


  • 图像编码器 图像编码器(通常是 LLaVA-NeXT 中的一个预训练视觉模型,如 CLIP)将被转换为 OpenVINO™ 的 IR 格式。这一步骤可确保模型能在 OpenVINO™ 支持的平台上有效处理视觉输入:


4. ov_image_encoder = ov.convert_model(image_encoder_model, example_input=torch.zeros((1, 5, 3, 336, 336)))
5. ov.save_model(ov_image_encoder, IMAGE_ENCODER_PATH)


  • 文本嵌入: 将输入的文本转换成适合处理的格式,并为处理文本数据进行单独优化:


6. ov_input_embeddings_model = ov.convert_model(input_embedding_model, example_input=torch.ones((2, 2), dtype=torch.int64))
7. ov.save_model(ov_input_embeddings_model, INPUT_EMBEDDING_PATH)


  • 语言模型: 语言模型至关重要,因为它综合处理来自图像编码器和输入嵌入的输入,以生成连贯且与上下文相关的文本响应。


为了优化性能,OpenVINO™ 利用了两个先进的功能:

  1. 缓存机制: 使用 USE_CACHE=True 参数和 Transformers 库中的 past_key_values 来缓存和重复使用隐藏状态,从而减少计算负荷。
  2. 有状态模型转换: 将模型转换为有状态模型,在内部管理缓存张量,以减少推理过程中的输入/输出开销。


8. def make_stateful(
9. ov_model: ov.Model,
10. not_kv_inputs: List[str],
11. key_value_input_names: List[str],
12. key_value_output_names: List[str],
13. batch_dim: int,
14. num_attention_heads: int,
15. num_beams_and_batch: int = None,
16. ):
17. from openvino._offline_transformations import apply_make_stateful_transformation


4. 使用 OpenVINO™ 进行量化:


使用 NNCF 压缩权重

为减少内存占用并提高语言模型的推理性能,使用神经网络压缩框架(NNCF)对权重进行压缩。这种方法对于像 LLM 这样占用大量内存的模型非常有效。


语言模型的 INT4 压缩: 应用 NNCF 的 4 位权重压缩,以减少内存消耗并提高执行速度。虽然由于精度较低,这可能会略微降低预测质量,但这对高效部署大型模型至关重要。


18. import nncf
19. compression_configuration = {
20.     "mode": nncf.CompressWeightsMode.INT4_SYM,
21.     "group_size": 64,
22.     "ratio": 0.6,
23. }
24. # Check if weight compression is enabled
25. if to_compress_weights.value and not LANGUAGE_MODEL_PATH_INT4.exists():
26.     ov_model = core.read_model(LANGUAGE_MODEL_PATH)
27.     ov_compressed_model = nncf.compress_weights(ov_model, **compression_configuration)
28.     core.save_model(ov_compressed_model, LANGUAGE_MODEL_PATH_INT4)


用于图像编码器的 INT8 量化: 使用 NNCF 的后训练量化功能优化图像编码器,通过将运算精度降低到 8 位来加快推理速度。


29. # Load the pre-quantization model
30. ov_model = core.read_model(IMAGE_ENCODER_PATH)
31. 
32. # Prepare the calibration data necessary for quantization
33. calibration_dataset = nncf.Dataset(calibration_data)
34. # Execute the quantization process
35. quantized_model = nncf.quantize(
36.     model=ov_model,
37.     calibration_dataset=calibration_dataset,
38.     model_type=nncf.ModelType.TRANSFORMER,
39.     subset_size=len(calibration_data),
40.     advanced_parameters=nncf.AdvancedQuantizationParameters(smooth_quant_alpha=0.6))
41. # Save the quantized model for deployment
42. ov.save_model(quantized_model, IMAGE_ENCODER_PATH_INT8)


虽然 INT4 压缩可通过进一步降低精度来提高性能,但它对模型精度的影响比 INT8 更明显。不过,NNCF 权重压缩(尤其是 INT4)的一个显著优势是不需要数据,不需要校准数据集,从而简化了压缩过程。


5. 设备选择和配置:

为推理选择合适的硬件设备对于实现最佳性能至关重要。这包括配置 OpenVINO™ 运行时,以便根据可用性和应用要求使用特定设备,如 CPU、GPU 或 NPU。


2


6. 推理管道设置:

设置推理管道对于配置推理设置和准备模型以有效运行预测至关重要。这一过程利用 OVLlavaForCausalLM 类生成与上下文相关的响应。


3


7. 执行和结果演示:


让我们看看 LLaVA-NeXT 的运行情况。该应用程序允许用户输入文本和图像与多模态聊天机器人进行交互。Gradio 界面有助于测试 LLaVA-NeXT 如何处理和响应综合输入,展示其有效处理复杂语言和视觉任务的能力。


4


多模态人工智能借助先进的量化技术,将人工智能系统的效率和响应能力提升到了一个新的水平。LLaVA-NeXT 模型对语言和视觉任务进行了复杂的处理,展示了这些系统创造更自然、更直观交互的潜力。随着技术的不断发展,这些先进技术的集成可确保人工智能系统满足现实世界应用日益增长的需求,并提供稳健可靠的性能。


通过利用 OpenVINO™ 的强大功能和先进的量化方法,我们可以有效地部署这些复杂的人工智能系统,确保它们适应我们的需求并增强我们与技术的交互。LLaVA-NeXT 可用于零售业的智能购物助手和视觉搜索任务,医疗保健业的医学影像分析和复杂文档解读,以及客户服务业的文本和视觉信息查询处理。

文章来源:https://medium.com/openvino-toolkit/mastering-multimodal-ai-with-llava-next-and-advanced-quantization-techniques-nncf-c04bbd9f61dd
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消