了解 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 专为复杂的语言和视觉任务而设计,需要详细的定制方法。它由多个组件组成,在优化过程中需要单独关注:
对于复杂的语言和视觉任务,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。
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™ 利用了两个先进的功能:
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。
6. 推理管道设置:
设置推理管道对于配置推理设置和准备模型以有效运行预测至关重要。这一过程利用 OVLlavaForCausalLM 类生成与上下文相关的响应。
7. 执行和结果演示:
让我们看看 LLaVA-NeXT 的运行情况。该应用程序允许用户输入文本和图像与多模态聊天机器人进行交互。Gradio 界面有助于测试 LLaVA-NeXT 如何处理和响应综合输入,展示其有效处理复杂语言和视觉任务的能力。
多模态人工智能借助先进的量化技术,将人工智能系统的效率和响应能力提升到了一个新的水平。LLaVA-NeXT 模型对语言和视觉任务进行了复杂的处理,展示了这些系统创造更自然、更直观交互的潜力。随着技术的不断发展,这些先进技术的集成可确保人工智能系统满足现实世界应用日益增长的需求,并提供稳健可靠的性能。
通过利用 OpenVINO™ 的强大功能和先进的量化方法,我们可以有效地部署这些复杂的人工智能系统,确保它们适应我们的需求并增强我们与技术的交互。LLaVA-NeXT 可用于零售业的智能购物助手和视觉搜索任务,医疗保健业的医学影像分析和复杂文档解读,以及客户服务业的文本和视觉信息查询处理。