【第四十一周】论文复现记录04
文章目录摘要Abstract一、评估记录longbench1. 评估流程1.1 数据迁移2. 修改推理代码二、《Compress and CacheVision Token Compression for Efficient Generation and Retrieval》1. 摘要2. 相关工作3. 方法双前向传播瓶颈算法3.1 基础模型与符号定义3.2 具体算法介绍3.2.1 第一次前向传播压缩3.2.2 第二次前向传播生成3.2.3 设计动机3.3 判别适配对比损失3.4 推理流程4. 实验总结摘要本周在进行评估模型的实验同时阅读了论文《Compress and CacheVision Token Compression for Efficient Generation and Retrieval》AbstractThis week, I conducted experiments to evaluate the model, and also read the paper Compress and Cache: Vision Token Compression for Efficient Generation and Retrieval.一、评估记录longbench1. 评估流程1为数据集中的每条文本创建一个独一无二的UID2将这些带 UID 的文本转换成 Glyph 模型能直接“阅读”和评估的图像格式。3长文本基准测试的评估调用一个视觉语言模型VLM来对文本或多模态数据进行推理并生成预测结果并对结果格式进行处理。4评估结果1.1 数据迁移当生成UID时没有修改生成路径因此数据下载到服务器的系统盘因此需要对数据进行迁移方法一 迁移常规项目文件 (如代码、数据)将原本“code/Glyph-main”路径下的文件换至“/root/autodl-tmp/”# 1. 移动项目文件夹到数据盘 mv ~/code/Glyph-main /root/autodl-tmp/ # 2. 创建软链接让系统“以为”文件还在原处 ln -s /root/autodl-tmp/Glyph-main ~/code/Glyph-main这样操作后项目就迁到数据盘了但通过软链接访问方法二 修改环境变量迁移缓存的模型如果你想彻底改变缓存路径可以通过设置 HF_HOME 环境变量来实现# 1. 编辑 .bashrc 文件 vim ~/.bashrc # 2. 在文件末尾添加以下两行 export HF_HOME迁移后地址 # 3. 保存后让配置生效 source ~/.bashrc方法三迁移环境1设置新的环境默认路径告诉 Conda以后新建的环境都放到数据盘。conda config --add envs_dirs /root/autodl-tmp/conda_envs conda config --add pkgs_dirs /root/autodl-tmp/conda_pkgs**注意**多个 envs_dirs 中Conda 会优先使用第一个路径。2重建并迁移现有环境假设你需要迁移 Gen_env 这个环境。# 激活环境导出依赖清单 conda activate Gen_env conda env export environment.yaml # 停用并删除旧环境 conda deactivate conda remove -n Gen_env --all # 在数据盘的新路径下重建环境 conda env create -n Gen_env -f environment.yaml完成这些操作后你就可以正常使用迁移后的环境了。2. 修改推理代码原本使用http api进行推理由于部署了本地模型Glyph因此需要对代码进行处理# ---------- 全局模型和处理器 ----------processorNonemodelNonedefload_model(model_path:str):加载本地 Glyph 模型和处理器globalprocessor,modelifprocessorisNone:processorAutoProcessor.from_pretrained(model_path)ifmodelisNone:modelAutoModelForImageTextToText.from_pretrained(model_path,torch_dtypetorch.bfloat16,device_mapauto)returnprocessor,modeldeflocal_inference(prompt:str,image_paths:Optional[List[str]]None,max_pixels:int36000000,max_new_tokens:int8192,)-Union[str,None]: 使用本地 Glyph 模型进行推理 globalprocessor,modelifprocessorisNoneormodelisNone:raiseRuntimeError(Model not loaded. Call load_model() first.)# 构建 messages 格式messages[{role:user,content:[]}]# 添加图片如果有ifimage_paths:forimg_pathinimage_paths:# 打开图片并缩放保持与原逻辑一致withImage.open(img_path)aspil_img:pil_imgpil_img.convert(RGB)w,hpil_img.sizeifw*hmax_pixels:scalemath.sqrt(max_pixels/(w*h))new_w,new_hint(w*scale),int(h*scale)pil_imgpil_img.resize((new_w,new_h),Image.Resampling.LANCZOS)messages[0][content].append({type:image,image:pil_img})# 添加文本messages[0][content].append({type:text,text:prompt.strip()})# 应用模板并生成inputsprocessor.apply_chat_template(messages,tokenizeTrue,add_generation_promptTrue,return_dictTrue,return_tensorspt).to(model.device)generated_idsmodel.generate(**inputs,max_new_tokensmax_new_tokens)output_textprocessor.decode(generated_ids[0][inputs[input_ids].shape[1]:],skip_special_tokensFalse)returnoutput_textdefparse_args(argsNone):parserargparse.ArgumentParser()parser.add_argument(--e,actionstore_true,helpEvaluate on LongBench-E)parser.add_argument(--use_image,actionstore_true,helpUse image processing)parser.add_argument(--model_path,typestr,default/root/autodl-tmp/Glyph,helpLocal path to Glyph model)parser.add_argument(--input_dir,typestr,default/root/autodl-tmp/Data/longbench/rendered_images,helpInput directory for dataset files)parser.add_argument(--output_dir,typestr,default/root/autodl-tmp/Data/longbench/pred,helpOutput directory for prediction files)parser.add_argument(--model_name,typestr,defaultglyph,helpModel name for creating output subdirectory)returnparser.parse_args(args)也可以直接使用http形式对模型进行调用主要修改代码内容如下defpost_api(prompt:str,image_paths:Optional[List[str]]None,max_pixels:int36000000,model:strglyph,# 给一个默认值temperature:float0.7,api_url:strhttp://localhost:8000/v1/chat/completions,# 改为本地默认地址)-Union[str,None]:...payload{model:model,# 改用传入的 model 参数...}headers{Content-Type:application/json,Authorization:fBearer{os.getenv(VLLM_API_KEY,token-abc123)}#从环境变量读取或直接写}修改后启动本地 vLLM 服务假设模型路径 /root/autodl-tmp/Glyph指令如下vllm serve /root/autodl-tmp/Glyph --api-key token-abc123 --port 8000问题localhost:8000这个端口是随意指定还是需要根据自己的填写根据自己的填写需要在哪里查找二、《Compress and CacheVision Token Compression for Efficient Generation and Retrieval》1. 摘要利用 LVLM 自身对视觉 token 进行压缩采用 “双前向传播” 训练策略第一遍LLM 将密集视觉 token 压缩为少量“摘要 token”。第二遍使用摘要 token 替代原始图像 token 进行语言指令处理。引入 对比损失 提升摘要 token 的判别能力最后效果生成任务压缩率提升 2 倍性能不降。判别任务在图像检索和组合性基准上达到 SOTA。2. 相关工作现有方法问题多数方法为 on-the-fly 压缩无专用压缩阶段压缩能力有限。不适用于 检索增强生成RAG 场景无法提前缓存。判别式 LVLM通常牺牲生成能力。主要贡献提出 CC 方法LVLM 自身作为压缩器采用双前向传播训练策略。CC 的创新1离线压缩 缓存 范式适合 RAG 和端侧部署。2压缩与生成解耦支持更复杂的压缩过程。3统一表示 同时支持生成与判别任务。统一压缩表示同时适用于生成和判别任务支持缓存与重用。引入对比损失增强摘要 token 的判别能力同时提升生成性能。性能突破1生成任务2 倍压缩率性能不降。2判别任务SOTA 在图像检索和组合性基准。3Visual RAG模型小 3.8 倍性能优于 VisRAG-Ret。3. 方法双前向传播瓶颈算法3.1 基础模型与符号定义3.2 具体算法介绍3.2.1 第一次前向传播压缩3.2.2 第二次前向传播生成3.2.3 设计动机LLM 擅长文本摘要 → 推广到“图像摘要”在连续潜空间中进行。压缩表示同时位于 LLM 的输入空间和输出空间便于后续判别任务。解耦压缩与生成允许在离线阶段进行更复杂的压缩如多次迭代在线阶段只需使用缓存的少量 token。3.3 判别适配对比损失为什么需要对比损失仅用自回归损失训练的摘要 token 主要服务于生成任务判别能力如检索较弱。对比损失可以强制摘要 token 在不同图像-文本对之间具有可分离性提升检索和组合性理解能力。3.4 推理流程4. 实验1生成任务2判别任务检索 组合性3Visual RAG4消融实验总结CC 是一种高效的视觉 token 压缩方法统一支持生成与判别任务适合离线缓存和 RAG 场景显著提升 LVLM 的推理效率与存储效率。局限性1依赖预训练 LVLM可能继承其偏见。2不适合无法离线预处理的场景。