记录复现多模态大模型论文OPERA的一周工作

复现前

现在是2026.3.20,是我研一下伊始。就在上个周,我确定了自己想做的一个方向:多模态大模型的幻觉缓解。

在收集学习了几篇论文后,我决定选用《OPERA: Alleviating Hallucination in Multi-Modal Large Language Models via Over-Trust Penalty and Retrospection-Allocation》作为我的baseline,并开始复现这篇论文的工作。

复现工作记录

一. LLAVA1.5模型的服务器部署

由于之前并没有本地部署大模型或者服务器部署大模型的经验,导致一开始非常迷茫,不知道从何做起,所以记录下来不仅仅能帮自己记住一些关键的步骤,更是为了帮助其他迷茫的小伙伴。

1. 详细步骤

首先在https://github.com/haotian-liu/LLaVA 官方网站上下载LLAVA模型代码,仓库的README文件中详细介绍了下载该仓库后应该安装的依赖。

然后在LLaVA Weights中的MODEL ZOO里面下载需要的权重参数文件。包括liuhaotian/llava-v1.6-vicuna-7b、liuhaotian/llava-v1.5-7b等。点击相关链接后会跳转到hugging face网站。

我下载的就是liuhaotian/llava-v1.5-7b,在MODEL_ZOO.md文件里面说明了The model weights below are merged weights.

执行官方脚本把 LLaVA 的增量权重和原始基座大模型(比如 Vicuna、LLaMA)的权重合并,下载后就能直接用于推理、微调等操作,开箱即用。
merged weights:完整的 LLaVA 多模态模型权重,包含了基座 LLM 的权重 + LLaVA 新增的视觉相关模块(视觉编码器、投影层等)的全部权重。

1.1. llava-v1.5-7b权重文件下载

hugging face官方提供了很多下载的方法,我使用了一种比较稳妥的方法:

  • 使用 huggingface_hub 官方库(最推荐,可断点续传)

这是最通用的方法,配合镜像站速度极快,且支持断点续传、下载指定文件。

  1. 安装依赖:
bash 复制代码
pip install huggingface_hub
# 可选:安装hf_transfer以获得更快的下载速度
pip install hf_transfer
  1. 配置环境变量(加速关键)

在终端执行以下命令,临时设置环境变量,就可以临时使用镜像站,比较推荐的镜像站是https://hf-mirror.com/

bash 复制代码
# Linux/Mac
export HF_ENDPOINT=https://hf-mirror.com
export HF_HUB_ENABLE_HF_TRANSFER=1  # 开启加速

# Windows (PowerShell)
$env:HF_ENDPOINT = "https://hf-mirror.com"
$env:HF_HUB_ENABLE_HF_TRANSFER = "1"
  1. python代码下载

新建一个download.py,运行即可下载整个模型权重仓库:

python 复制代码
from huggingface_hub import snapshot_download
import os

# 【关键】在代码里直接设置镜像站,避免忘记在终端设环境变量
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
# 可选:开启 hf_transfer 加速(需先 pip install hf_transfer)
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"

model_id = "liuhaotian/llava-v1.5-7b"

local_dir = snapshot_download(
    repo_id=model_id,
    local_dir="./llava-v1.5-7b",
    # resume_download 和 local_dir_use_symlinks 已删掉
)
print(f"模型已下载至:{local_dir}")

一开始使用这一段代码好像并没有用上镜像站,但是由于本地网络不错,还是下载成功了。后来在服务器运行这段代码的时候发现,服务器连不上hugging face.co。问题如下:

网络连接问题:代码虽然尝试设置了 Hugging Face 镜像站,但HF_ENDPOINT环境变量的设置时机太晚(在导入huggingface_hub之后),导致镜像站配置未生效,程序依然尝试直接连接huggingface.co(外网地址),最终因网络超时失败。

于是将代码做如下修改:

pyhton 复制代码
import os

# 【关键】在代码里直接设置镜像站,避免忘记在终端设环境变量
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
# 可选:开启 hf_transfer 加速(需先 pip install hf_transfer)
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"

from huggingface_hub import snapshot_download

将环境变量设置放在导入huggingface_hub之前,确保镜像站配置被正确加载。

可以通过如下命令测试服务器是否能够连接到hugging face镜像站:

bash 复制代码
# 激活环境后执行 
conda activate llava1.5 
python -c "import requests; print(requests.get('https://hf-mirror.com').status_code)"
  • 如果输出200:镜像站可访问,问题在代码/依赖;
  • 如果输出其他状态码/报错:服务器网络本身受限。
  1. 视觉编码器权重文件下载

llava-v1.5-7b权重文件并不包括CLIP视觉编码器的权重,llava-v1.5-7b权重文件的 config.json里有vision_tower 字段,默认值是openai/clip-vit-large-patch14-336)。当加载模型权重文件时,代码会自动根据这个地址去Hugging Face拉取对应的CLIP权重。

如果你的环境无法联网访问 Hugging Face,就必须提前把 CLIP 权重下载到本地,修改 config 里的vision_tower为本地路径,才能正常加载。

我的做法是即使环境可以联网,也提前下载到本地并修改配置,能避免每次加载都重复下载权重,节省时间和带宽。然后一定要修改修改llava-v1.5-7b中的config .json文件

将config.json中的mm_vision_tower 改为 clip-vit-large-patch14-336文件夹的位置。

1.2. AUTODL服务器部署推理

在下载了LLAVA仓库代码和huggingface上的llava-v1.5-7b权重文件后,由于自己的笔记本GPU跑不了大模型,所以需要在服务器上部署推理。选用了AUTODL服务器,价格便宜的同时还能随需随用,在传数据配环境的时候可以选用无卡模式开机,非常有性价比。

可以把本地下载好的文件用过FileZilla传输到服务器上,或者直接在服务器上运行脚本和代码来重新下载。FileZilla传输的教程、服务器和Pycharm连接的教程都在AUTODL官方文档上有教学,简单易懂。(Pycharm远程终端调试的体验不如AUTODL服务器自带的JupyterLab

由于我后面要在LLAVA1.5的基础上复现OPERA解码,所以我直接基于OPERA官方仓库的environment.yml和requirements.txt两个文件来构建新的Conda虚拟环境。

  1. conda环境的转移和复制

conda导出已有环境,环境会被保存在environment.yml文件中。

bash 复制代码
conda env export > environment.yml

当我们想再次创建该环境,或根据别人提供的.yml文件复现环境时,就可以通过下面的命令来复现安装环境了。

bash 复制代码
conda env create -f environment.yaml

注:.yml文件移植过来的环境只是安装了你原来环境里用conda install等命令直接安装的包,你用pip之类装的东西没有移植过来,需要你重新安装。

bash 复制代码
pip install -r requirements.txt

补充:生成requirements.txt文件

bash 复制代码
pip freeze > requirements.txt

有时候这一步操作会报错,一般是网络问题,比如使用校园网有可能会出现报错,换成自己手机的热点就能正常运行环境配置代码了。

  1. 运行项目示例脚本

LLAVA官方代码库提供了非常简单的推理脚本,包括单张推理、web界面推理和数据集评估推理脚本。运行的时候将脚本对应的参数设置好就能成功运行,但是初次运行的时候可能出现以下问题:

常见的导入错误:"ImportError: cannot import name 'LlavaLlamaForCausalLM' from 'llava.model'"。这个问题通常发生在尝试运行项目示例代码时,特别是在新环境中首次设置项目时。

当开发者尝试从llava.model导入LlavaLlamaForCausalLM类时,系统会抛出导入错误。这个错误表明Python解释器无法在指定的模块路径中找到所需的类定义。错误通常发生在执行类似以下代码时:

python 复制代码
from llava.model import LlavaLlamaForCausalLM
  • 解决方法:调试__init__.py文件
    对于希望深入了解问题的开发者,可以临时修改llava/model/init.py文件,注释掉try-except块,以暴露真实的错误信息:
python 复制代码
# 注释掉原有的try-except结构
from .language_model.llava_llama import LlavaLlamaForCausalLM, LlavaConfig
from .language_model.llava_mpt import LlavaMptForCausalLM, LlavaMptConfig
from .language_model.llava_mistral import LlavaMistralForCausalLM, LlavaMistralConfig

我注释掉原有的try-except,运行脚本后发现依然是环境配置的问题,按照报错内容重新下载对应版本的所需库后,脚本可以正常运行。(有时候90%的问题都是环境问题导致的)。

  1. MSCOCO数据集评估(批量推理)

在文章OPERA中,使用的数据集是MSCOCO2014的数据集,COCO前的MS是Microsoft微软的意思,因为是微软的团队提出的这个数据集。论文中用的是2014年发布的验证集,还要下载验证集对应的一些标注信息。

数据集网站链接:https://cocodataset.org/
注:要理解为什么会有标注信息,建议学习一下LLAVA模型的运作过程,推荐B站的博主AI扫地曾

LLAVA模型官方github库里提供了批量推理的脚本,只需要做相应的改动就可以实现批量推理:

bash 复制代码
python -m llava.eval.model_vqa \
    --model-path /root/autodl-tmp/project/llava-v1.5-7b \
    --question-file /root/autodl-tmp/project/dataset/MSCOCO/llava_coco_val2014_eval.jsonl \
    --image-folder /root/autodl-tmp/project/dataset/MSCOCO/val2014/ \
    --answers-file /root/autodl-tmp/project/dataset/MSCOCO/llava_coco_val2014_answers.jsonl \
    --temperature 0 \
    --top_p 1.0 \
    --num_beams 5 \

应该是能跑的,如果不能跑就去官方代码llava/eval/model_vqa.py文件中查看脚本输入的参数有哪些,照着该就行。不多赘述。